Repository: microsoft/agent-lightning Branch: main Commit: c746af2f76be Files: 546 Total size: 8.5 MB Directory structure: gitextract_mrw4kizu/ ├── .dockerignore ├── .github/ │ └── workflows/ │ ├── backport.yml │ ├── badge-apo.yml │ ├── badge-azure.yml │ ├── badge-calc-x.yml │ ├── badge-chartqa.yml │ ├── badge-claude-code.yml │ ├── badge-compat.yml │ ├── badge-examples.yml │ ├── badge-latest.yml │ ├── badge-rag.yml │ ├── badge-spider.yml │ ├── badge-tinker.yml │ ├── badge-unit.yml │ ├── badge-unsloth.yml │ ├── benchmark.yml │ ├── dashboard.yml │ ├── docs.yml │ ├── examples-apo.yml │ ├── examples-azure.yml │ ├── examples-calc-x.yml │ ├── examples-chartqa.yml │ ├── examples-claude-code.yml │ ├── examples-compat.yml │ ├── examples-rag.yml │ ├── examples-spider.yml │ ├── examples-tinker.yml │ ├── examples-unsloth.yml │ ├── issue-comment.yml │ ├── playground.yml │ ├── pypi-nightly.yml │ ├── pypi-release.yml │ ├── tests-full.yml │ └── tests.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .python-version ├── AGENTS.md ├── LICENSE ├── RAI_README.md ├── README.md ├── SECURITY.md ├── agentlightning/ │ ├── __init__.py │ ├── adapter/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── messages.py │ │ └── triplet.py │ ├── algorithm/ │ │ ├── __init__.py │ │ ├── apo/ │ │ │ ├── __init__.py │ │ │ ├── apo.py │ │ │ └── prompts/ │ │ │ ├── apply_edit_variant01.poml │ │ │ ├── apply_edit_variant02.poml │ │ │ ├── text_gradient_variant01.poml │ │ │ ├── text_gradient_variant02.poml │ │ │ └── text_gradient_variant03.poml │ │ ├── base.py │ │ ├── decorator.py │ │ ├── fast.py │ │ ├── utils.py │ │ └── verl/ │ │ ├── __init__.py │ │ └── interface.py │ ├── cli/ │ │ ├── __init__.py │ │ ├── prometheus.py │ │ ├── store.py │ │ └── vllm.py │ ├── client.py │ ├── config.py │ ├── emitter/ │ │ ├── __init__.py │ │ ├── annotation.py │ │ ├── exception.py │ │ ├── message.py │ │ ├── object.py │ │ └── reward.py │ ├── env_var.py │ ├── execution/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── client_server.py │ │ ├── events.py │ │ ├── inter_process.py │ │ └── shared_memory.py │ ├── instrumentation/ │ │ ├── __init__.py │ │ ├── agentops.py │ │ ├── agentops_langchain.py │ │ ├── litellm.py │ │ ├── vllm.py │ │ └── weave.py │ ├── litagent/ │ │ ├── __init__.py │ │ ├── decorator.py │ │ └── litagent.py │ ├── llm_proxy.py │ ├── logging.py │ ├── reward.py │ ├── runner/ │ │ ├── __init__.py │ │ ├── agent.py │ │ ├── base.py │ │ └── legacy.py │ ├── semconv.py │ ├── server.py │ ├── store/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── client_server.py │ │ ├── collection/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── memory.py │ │ │ └── mongo.py │ │ ├── collection_based.py │ │ ├── memory.py │ │ ├── mongo.py │ │ ├── sqlite.py │ │ ├── threading.py │ │ └── utils.py │ ├── tracer/ │ │ ├── __init__.py │ │ ├── agentops.py │ │ ├── base.py │ │ ├── dummy.py │ │ ├── otel.py │ │ └── weave.py │ ├── trainer/ │ │ ├── __init__.py │ │ ├── init_utils.py │ │ ├── legacy.py │ │ ├── registry.py │ │ └── trainer.py │ ├── types/ │ │ ├── __init__.py │ │ ├── core.py │ │ ├── resources.py │ │ └── tracer.py │ ├── utils/ │ │ ├── __init__.py │ │ ├── id.py │ │ ├── metrics.py │ │ ├── otel.py │ │ ├── otlp.py │ │ ├── server_launcher.py │ │ └── system_snapshot.py │ └── verl/ │ ├── __init__.py │ ├── __main__.py │ ├── async_server.py │ ├── config.yaml │ ├── daemon.py │ ├── dataset.py │ ├── entrypoint.py │ └── trainer.py ├── contrib/ │ ├── .gitignore │ ├── CODEOWNERS │ ├── README.md │ ├── agentlightning/ │ │ └── contrib/ │ │ ├── __init__.py │ │ ├── adapter/ │ │ │ ├── __init__.py │ │ │ ├── agentos.py │ │ │ └── triplet_group.py │ │ ├── agent/ │ │ │ └── env_agent.py │ │ ├── algorithm/ │ │ │ └── env_verl/ │ │ │ ├── daemon.py │ │ │ └── trainer.py │ │ ├── reward/ │ │ │ ├── __init__.py │ │ │ └── agentos.py │ │ └── runner/ │ │ ├── __init__.py │ │ └── agentos.py │ └── recipes/ │ ├── agentos/ │ │ ├── README.md │ │ └── demo_governed_training.py │ ├── envs/ │ │ ├── README.md │ │ ├── add_instruction.py │ │ ├── config_env/ │ │ │ ├── alfworld.yaml │ │ │ └── scienceworld.yaml │ │ ├── config_verl/ │ │ │ ├── alfworld/ │ │ │ │ └── grpo.yaml │ │ │ └── scienceworld/ │ │ │ └── grpo.yaml │ │ ├── install_agl.sh │ │ ├── prompt_builder.py │ │ └── train_env_agent.py │ ├── search_r1/ │ │ ├── README.md │ │ ├── data_process.sh │ │ ├── qa_em.py │ │ ├── retrieval_launch.sh │ │ ├── retrieval_server.py │ │ ├── search_r1_agent.py │ │ └── train_search_r1_agent.py │ └── webshop/ │ ├── .gitignore │ ├── Dockerfile │ ├── Makefile │ ├── README.md │ ├── agl/ │ │ ├── __init__.py │ │ ├── config.py │ │ ├── generate_tasks.py │ │ ├── requirements.txt │ │ ├── run_training.py │ │ ├── sample_tasks.json │ │ ├── tasks.py │ │ └── webshop_tasks.json │ ├── aml/ │ │ ├── compute.yml │ │ ├── jobs/ │ │ │ └── webshop-qwen.yml │ │ └── run_webshop_aml.sh │ ├── package.json │ ├── scripts/ │ │ ├── headless-runner.ts │ │ └── run_stack.sh │ ├── server/ │ │ ├── .dockerignore │ │ ├── requirements.txt │ │ └── webshop_server.py │ ├── src/ │ │ ├── agent/ │ │ │ ├── prompts.ts │ │ │ └── webshop-agent.ts │ │ ├── data/ │ │ │ └── sample-tasks.ts │ │ ├── environment/ │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── webshop-server.ts │ │ └── utils/ │ │ └── agentlightning/ │ │ ├── index.ts │ │ ├── otel.ts │ │ ├── proxy-llm.ts │ │ ├── store-client.ts │ │ └── types.ts │ ├── tests/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_span_adapter.py │ │ └── test_store_integration.py │ ├── tsconfig.json │ └── tsup.config.ts ├── dashboard/ │ ├── .gitignore │ ├── .prettierrc.mjs │ ├── .storybook/ │ │ ├── constants.ts │ │ ├── main.ts │ │ ├── modes.ts │ │ ├── preview.tsx │ │ └── vitest.setup.ts │ ├── .stylelintignore │ ├── .stylelintrc.json │ ├── README.md │ ├── eslint.config.js │ ├── package.json │ ├── postcss.config.cjs │ ├── public/ │ │ ├── index.html │ │ └── main.tsx │ ├── src/ │ │ ├── App.tsx │ │ ├── Router.tsx │ │ ├── components/ │ │ │ ├── AppAlertBanner.story.tsx │ │ │ ├── AppAlertBanner.tsx │ │ │ ├── AppDrawer.component.tsx │ │ │ ├── AppDrawer.story.tsx │ │ │ ├── ResourcesTable.component.tsx │ │ │ ├── ResourcesTable.story.tsx │ │ │ ├── ResourcesTree.component.tsx │ │ │ ├── ResourcesTree.story.tsx │ │ │ ├── RolloutTable.component.tsx │ │ │ ├── RolloutTable.story.tsx │ │ │ ├── TracesTable.component.tsx │ │ │ ├── TracesTable.story.tsx │ │ │ ├── WorkersTable.component.tsx │ │ │ └── WorkersTable.story.tsx │ │ ├── cssVariableResolver.ts │ │ ├── features/ │ │ │ ├── config/ │ │ │ │ ├── index.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── slice.ts │ │ │ ├── resources/ │ │ │ │ ├── index.ts │ │ │ │ ├── resources.test.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── slice.ts │ │ │ ├── rollouts/ │ │ │ │ ├── api.ts │ │ │ │ ├── index.ts │ │ │ │ ├── rollouts.test.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── slice.ts │ │ │ ├── traces/ │ │ │ │ ├── index.ts │ │ │ │ ├── selectors.ts │ │ │ │ ├── slice.ts │ │ │ │ └── traces.test.ts │ │ │ ├── ui/ │ │ │ │ ├── alert/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── selectors.ts │ │ │ │ │ └── slice.ts │ │ │ │ └── drawer/ │ │ │ │ ├── index.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── slice.ts │ │ │ └── workers/ │ │ │ ├── index.ts │ │ │ ├── selectors.ts │ │ │ ├── slice.ts │ │ │ └── workers.test.ts │ │ ├── layouts/ │ │ │ ├── AppLayout.story.tsx │ │ │ ├── AppLayout.tsx │ │ │ └── helper.ts │ │ ├── main.tsx │ │ ├── pages/ │ │ │ ├── Resources.page.story.tsx │ │ │ ├── Resources.page.tsx │ │ │ ├── Rollouts.page.story.tsx │ │ │ ├── Rollouts.page.tsx │ │ │ ├── Settings.page.story.tsx │ │ │ ├── Settings.page.tsx │ │ │ ├── Traces.page.story.tsx │ │ │ ├── Traces.page.tsx │ │ │ ├── Workers.page.story.tsx │ │ │ └── Workers.page.tsx │ │ ├── store/ │ │ │ ├── hooks.ts │ │ │ └── index.ts │ │ ├── styles/ │ │ │ ├── app.css │ │ │ └── theme.css │ │ ├── theme.ts │ │ ├── types.ts │ │ ├── utils/ │ │ │ ├── error.ts │ │ │ ├── format.ts │ │ │ ├── mock.test.ts │ │ │ ├── mock.ts │ │ │ └── table.ts │ │ └── vite-env.d.ts │ ├── static/ │ │ └── mockServiceWorker.js │ ├── test-utils/ │ │ ├── index.ts │ │ ├── python-server.py │ │ ├── render.tsx │ │ └── server.ts │ ├── tsconfig.json │ ├── vite.config.mjs │ ├── vitest.global-setup.mjs │ ├── vitest.setup.mjs │ └── vitest.shims.d.ts ├── docker/ │ ├── Dockerfile.dev │ ├── compose.grafana.yml │ ├── compose.mongo.yml │ ├── compose.prometheus-memory-store.yml │ ├── compose.prometheus-mongo-store.yml │ ├── compose.store.yml │ ├── grafana/ │ │ ├── dashboard-provider.yml │ │ ├── dashboards/ │ │ │ ├── 1860_rev42.json │ │ │ ├── 20192_rev1.json │ │ │ └── agentlightning.json │ │ └── datasource.yml │ ├── prometheus/ │ │ ├── prometheus.base.yml │ │ └── prometheus.mongo.yml │ └── setup.sh ├── docs/ │ ├── algorithm-zoo/ │ │ ├── apo.md │ │ ├── index.md │ │ └── verl.md │ ├── assets/ │ │ └── store-openapi.json │ ├── changelog.md │ ├── community/ │ │ ├── contributing.md │ │ └── maintainers.md │ ├── deep-dive/ │ │ ├── birds-eye-view.md │ │ ├── serving-llm.md │ │ └── store.md │ ├── how-to/ │ │ ├── examples-catalog.md │ │ ├── train-first-agent.md │ │ ├── train-sql-agent.md │ │ ├── unsloth-sft.md │ │ └── write-first-algorithm.md │ ├── index.md │ ├── javascripts/ │ │ ├── charts.js │ │ ├── katex.js │ │ └── move-source-file.js │ ├── macros/ │ │ └── source_links.py │ ├── overrides/ │ │ ├── main.html │ │ └── partials/ │ │ └── content.html │ ├── reference/ │ │ ├── agent.md │ │ ├── algorithm.md │ │ ├── cli.md │ │ ├── instrumentation.md │ │ ├── internal.md │ │ ├── restful.md │ │ ├── runner.md │ │ ├── semconv.md │ │ ├── store.md │ │ ├── trainer.md │ │ ├── types.md │ │ └── utilities.md │ ├── stylesheets/ │ │ └── extra.css │ └── tutorials/ │ ├── debug.md │ ├── emitter.md │ ├── installation.md │ ├── parallelize.md │ ├── traces.md │ └── write-agents.md ├── examples/ │ ├── .gitignore │ ├── README.md │ ├── apo/ │ │ ├── README.md │ │ ├── apo_custom_algorithm.py │ │ ├── apo_custom_algorithm_trainer.py │ │ ├── apo_debug.py │ │ ├── legacy_apo_client.py │ │ ├── legacy_apo_server.py │ │ ├── room_selector.py │ │ ├── room_selector_apo.py │ │ └── room_tasks.jsonl │ ├── azure/ │ │ ├── README.md │ │ ├── aoai_finetune.py │ │ ├── capital_agent.py │ │ ├── capital_samples.csv │ │ ├── tests/ │ │ │ └── test_deployment.py │ │ └── train_capital_agent.py │ ├── calc_x/ │ │ ├── README.md │ │ ├── calc_agent.py │ │ ├── eval_utils.py │ │ ├── legacy_calc_agent.py │ │ ├── legacy_calc_agent_debug.py │ │ ├── legacy_train.sh │ │ ├── tests/ │ │ │ ├── test_agentops.py │ │ │ └── test_mcp_calculator.py │ │ └── train_calc_agent.py │ ├── chartqa/ │ │ ├── README.md │ │ ├── chartqa_agent.py │ │ ├── debug_chartqa_agent.py │ │ ├── env_var.py │ │ ├── multimodal_utils.py │ │ ├── prepare_data.py │ │ ├── prompts.py │ │ └── train_chartqa_agent.py │ ├── claude_code/ │ │ ├── README.md │ │ ├── claude_code_agent.py │ │ ├── claude_code_controller.py │ │ ├── extended_adapter.py │ │ ├── swebench_samples.jsonl │ │ ├── swebench_utils/ │ │ │ ├── __init__.py │ │ │ ├── docker_runtime.py │ │ │ ├── evaluation.py │ │ │ └── logging.py │ │ └── templates/ │ │ ├── handle_hook.template.sh │ │ └── settings.template.json │ ├── minimal/ │ │ ├── README.md │ │ ├── llm_proxy.py │ │ ├── vllm_server.py │ │ ├── write_metrics.py │ │ └── write_traces.py │ ├── rag/ │ │ ├── README.md │ │ ├── metric_utils.py │ │ ├── rag_agent.py │ │ ├── train_rag.py │ │ └── wiki_retriever_mcp.py │ ├── spider/ │ │ ├── README.md │ │ ├── spider_eval/ │ │ │ ├── __init__.py │ │ │ ├── async_utils.py │ │ │ ├── convert_dataset.py │ │ │ ├── evaluation.py │ │ │ ├── exec_eval.py │ │ │ ├── parse.py │ │ │ └── process_sql.py │ │ ├── sql_agent.py │ │ └── train_sql_agent.py │ ├── tinker/ │ │ ├── README.md │ │ ├── agl_tinker/ │ │ │ ├── __init__.py │ │ │ ├── algo.py │ │ │ ├── env.py │ │ │ ├── llm.py │ │ │ ├── rollout.py │ │ │ └── train.py │ │ ├── hello.py │ │ ├── q20_agent.py │ │ ├── q20_evaluate.py │ │ ├── q20_nouns.csv │ │ ├── q20_train.py │ │ └── tests/ │ │ ├── __init__.py │ │ └── test_tinker_llm.py │ └── unsloth/ │ ├── README.md │ ├── data_gsmhard.jsonl │ ├── math_agent.py │ ├── sft_algorithm.py │ ├── sft_allinone.py │ ├── sft_rollout_runners.py │ └── unsloth_helper.py ├── mkdocs.yml ├── pyproject.toml ├── pyrightconfig.fast.json ├── pyrightconfig.json ├── scripts/ │ ├── badge_aggregation.js │ ├── base.Dockerfile │ ├── build_vm_image.sh │ ├── bump_version.sh │ ├── check_headers.py │ ├── cleanup.sh │ ├── cleanup_aoai.py │ ├── export_openapi.py │ ├── litellm_ci.yaml │ ├── litellm_run.sh │ ├── litellm_sanity_check.py │ ├── mongodb_docker_run.sh │ ├── mongodb_init_rs_host.js │ ├── mongodb_init_rs_profiling.js │ ├── restart_ray.sh │ ├── setup_latest.sh │ ├── setup_latest_gpu.sh │ ├── setup_stable.sh │ ├── setup_stable_gpu.sh │ ├── setup_type_checking.sh │ ├── validate_example_wandb.py │ └── wandb_download_result.py └── tests/ ├── __init__.py ├── adapter/ │ ├── __init__.py │ ├── test_llm_proxy.py │ ├── test_messages_adapter.py │ └── test_triplet_trace_tree.py ├── algorithm/ │ ├── __init__.py │ ├── test_apo.py │ ├── test_baseline.py │ ├── test_decorator.py │ └── test_utils.py ├── assets/ │ └── prompt_caches.jsonl ├── benchmark/ │ ├── analysis.py │ ├── benchmark_store.py │ ├── collection_benchmark.py │ ├── micro_benchmark.py │ └── utils.py ├── common/ │ ├── __init__.py │ ├── network.py │ ├── prometheus_stub.py │ ├── tracer.py │ └── vllm.py ├── emitter/ │ ├── __init__.py │ ├── test_annotation.py │ ├── test_exception.py │ ├── test_message.py │ ├── test_object.py │ ├── test_operation.py │ └── test_reward.py ├── execution/ │ ├── __init__.py │ ├── test_client_server.py │ └── test_shared_memory.py ├── instrumentation/ │ └── test_agentops.py ├── litagent/ │ ├── __init__.py │ ├── test_decorator.py │ └── test_resources.py ├── llm_proxy/ │ ├── __init__.py │ ├── test_llm_proxy_cpu.py │ ├── test_llm_proxy_gpu.py │ └── test_stream.py ├── runner/ │ ├── __init__.py │ ├── test_agent_integration.py │ ├── test_agent_runner.py │ └── test_runner_context.py ├── store/ │ ├── __init__.py │ ├── conftest.py │ ├── dummy_store.py │ ├── test_client_server.py │ ├── test_collection.py │ ├── test_core.py │ ├── test_restful.py │ ├── test_threading.py │ └── test_utils.py ├── test_client.py ├── test_config.py ├── test_env_var.py ├── test_logging.py ├── tracer/ │ ├── __init__.py │ ├── test_agentops.py │ ├── test_dummy.py │ ├── test_integration.py │ ├── test_otel.py │ └── test_weave.py ├── trainer/ │ ├── __init__.py │ ├── sample_components.py │ ├── test_init_utils.py │ ├── test_trainer_dev.py │ └── test_trainer_init.py ├── types/ │ └── __init__.py └── utils/ ├── __init__.py ├── test_metrics.py ├── test_otel.py ├── test_otlp.py ├── test_server_launcher.py └── test_system_snapshot.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ .venv **/.venv __pycache__ .git .gitignore **/node_modules dist build .env docker .pytest_cache .vscode **/*.log examples/**/data ================================================ FILE: .github/workflows/backport.yml ================================================ name: Backport Merged Pull Request on: pull_request_target: types: [closed] permissions: contents: write issues: write pull-requests: write # NOTE: # Microsoft requires rotating BOT_PAT every 3 months. # Log onto agent-lightning-bot account and rotate the PAT if needed. jobs: backport: name: Backport pull request runs-on: ubuntu-latest # Don't run on closed unmerged pull requests if: github.event.pull_request.merged steps: - uses: actions/checkout@v6 - name: Create backport pull requests uses: korthout/backport-action@v3 with: branch_name: 'backport/${pull_number}/${target_branch}' label_pattern: ^(stable/[^ ]+)$ github_token: ${{ secrets.BOT_PAT }} add_labels: backport add_author_as_assignee: true git_committer_name: agent-lightning-bot # This email address is not monitored. git_committer_email: agl.msft@outlook.com ================================================ FILE: .github/workflows/badge-apo.yml ================================================ name: Badge - APO on: workflow_run: workflows: - Examples - APO types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-apo.yml', label: 'apo', variants: ['legacy', 'stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-azure.yml ================================================ name: Badge - Azure on: workflow_run: workflows: - Examples - Azure types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-azure.yml', label: 'azure', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-calc-x.yml ================================================ name: Badge - Calc-X on: workflow_run: workflows: - Examples - Calc-X types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-calc-x.yml', label: 'calc-x', variants: ['legacy', 'stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-chartqa.yml ================================================ name: Badge - ChartQA on: workflow_run: workflows: - Examples - ChartQA types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-chartqa.yml', label: 'chartqa', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-claude-code.yml ================================================ name: Badge - Claude Code on: workflow_run: workflows: - Examples - Claude Code types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-claude-code.yml', label: 'claude-code', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-compat.yml ================================================ name: Badge - Compatibility on: workflow_run: workflows: - Examples - Backward Compatibility types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-compat.yml', label: 'examples-compat', variants: ['legacy', 'stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-examples.yml ================================================ name: Badge - Examples on: workflow_run: workflows: - Examples - Calc-X - Examples - Spider - Examples - APO - Examples - Unsloth - Examples - Tinker - Examples - Azure - Examples - Claude Code - Examples - RAG - Examples - ChartQA types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-calc-x.yml', label: 'examples-calc-x.stable', variants: ['stable'] }, { workflow: 'examples-spider.yml', label: 'examples-spider.stable', variants: ['stable'] }, { workflow: 'examples-apo.yml', label: 'examples-apo.stable', variants: ['stable'] }, { workflow: 'examples-unsloth.yml', label: 'examples-unsloth.stable', variants: ['stable'] }, { workflow: 'examples-tinker.yml', label: 'examples-tinker.stable', variants: ['stable'] }, { workflow: 'examples-azure.yml', label: 'examples-azure.stable', variants: ['stable'] }, { workflow: 'examples-claude-code.yml', label: 'examples-claude-code.stable', variants: ['stable'] }, { workflow: 'examples-rag.yml', label: 'examples-rag.stable', variants: ['stable'] }, { workflow: 'examples-chartqa.yml', label: 'examples-chartqa.stable', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-latest.yml ================================================ name: Badge - Latest on: workflow_run: workflows: - Examples - Calc-X - Examples - Spider - Examples - APO - Examples - Unsloth - Examples - RAG - Examples - Claude Code - GPU Test types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-calc-x.yml', label: 'calc-x.latest', variants: ['latest'] }, { workflow: 'examples-spider.yml', label: 'spider.latest', variants: ['latest'] }, { workflow: 'examples-apo.yml', label: 'apo.latest', variants: ['latest'] }, { workflow: 'examples-unsloth.yml', label: 'unsloth.latest', variants: ['latest'] }, { workflow: 'examples-claude-code.yml', label: 'claude-code.latest', variants: ['latest'] }, { workflow: 'examples-rag.yml', label: 'rag.latest', variants: ['latest'] }, { workflow: 'tests-full.yml', label: 'tests-full.latest', variants: ['latest'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-rag.yml ================================================ name: Badge - RAG on: workflow_run: workflows: - Examples - RAG types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-rag.yml', label: 'rag', variants: ['legacy', 'stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-spider.yml ================================================ name: Badge - Spider on: workflow_run: workflows: - Examples - Spider types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-spider.yml', label: 'spider', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-tinker.yml ================================================ name: Badge - Tinker on: workflow_run: workflows: - Examples - Tinker types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-tinker.yml', label: 'tinker', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-unit.yml ================================================ name: Badge - Unit Test on: workflow_run: workflows: - CPU Test - GPU Test types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'tests-full.yml', label: 'tests-full', variants: ['legacy', 'stable'] }, { workflow: 'tests.yml', label: 'tests', variants: ['legacy', 'stable', 'Lint', 'documentation', 'JavaScript'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/badge-unsloth.yml ================================================ name: Badge - Unsloth on: workflow_run: workflows: - Examples - Unsloth types: [completed] workflow_dispatch: permissions: actions: read contents: read jobs: badge: if: ${{ github.event_name == 'workflow_dispatch' || (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'main') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const badgeAggregation = require('./scripts/badge_aggregation.js'); const dependencies = [ { workflow: 'examples-unsloth.yml', label: 'examples-unsloth.stable', variants: ['stable'] }, ]; await badgeAggregation({ github, context, core, dependencies }); ================================================ FILE: .github/workflows/benchmark.yml ================================================ name: Benchmark permissions: contents: read on: workflow_dispatch: schedule: # Every Monday and Thursday at 3 AM UTC+8 - cron: '0 19 * * 0,3' jobs: benchmark: name: ${{ matrix.workload.kind }} (${{ matrix.backend.id }}, ${{ matrix.workload.display }}) runs-on: ${{ matrix.workload.runner }} timeout-minutes: ${{ matrix.workload.timeout }} strategy: fail-fast: false matrix: backend: - id: memory compose_file: compose.prometheus-memory-store.yml - id: mongo compose_file: compose.prometheus-mongo-store.yml workload: - id: scenario-minimal-scale display: Minimal production scale kind: scenario store_workers: 4 runner: - self-hosted - 1ES.Pool=agl-runner-cpu timeout: 45 args: >- --mode batch --total-tasks 4096 --batch-size 256 --n-runners 32 --max-rounds 6 --sleep-seconds 0.5 - id: scenario-medium-scale display: Medium production scale kind: scenario store_workers: 16 runner: - self-hosted - 1ES.Pool=agl-runner-cpu timeout: 45 args: >- --mode batch --total-tasks 10000 --batch-size 1000 --n-runners 100 --max-rounds 10 --sleep-seconds 0.1 - id: scenario-midhigh-scale display: Mid-high production scale kind: scenario store_workers: 24 runner: - self-hosted - 1ES.Pool=agl-runner-cpu timeout: 60 args: >- --mode batch --total-tasks 20000 --batch-size 2048 --n-runners 300 --max-rounds 6 --sleep-seconds 0.1 - id: scenario-large-batch display: Large batch waves kind: scenario store_workers: 96 runner: - self-hosted - 1ES.Pool=agl-runner-cpu-high timeout: 120 args: >- --mode batch --total-tasks 50000 --batch-size 8192 --n-runners 1000 --max-rounds 3 --sleep-seconds 0.1 - id: scenario-long-queues display: Long rollout queues kind: scenario store_workers: 48 runner: - self-hosted - 1ES.Pool=agl-runner-cpu timeout: 120 args: >- --mode batch_partial --total-tasks 50000 --batch-size 1024 --n-runners 256 --remaining-tasks 4096 --max-rounds 4 --sleep-seconds 0.1 - id: scenario-high-concurrency display: High-throughput concurrent requests kind: scenario store_workers: 96 runner: - self-hosted - 1ES.Pool=agl-runner-cpu-high timeout: 120 args: >- --mode single --total-tasks 50000 --concurrency 2048 --n-runners 256 --max-rounds 2 --sleep-seconds 0.1 - id: scenario-heavy-traces display: Heavy rollouts with deep traces kind: scenario store_workers: 96 runner: - self-hosted - 1ES.Pool=agl-runner-cpu-high timeout: 60 args: >- --mode batch_partial --total-tasks 10000 --batch-size 1024 --remaining-tasks 256 --n-runners 512 --max-rounds 20 --sleep-seconds 1.0 - id: micro-worker display: Update worker kind: micro store_workers: 8 runner: ubuntu-latest timeout: 30 cli: worker - id: micro-dequeue-empty display: Dequeue empty kind: micro store_workers: 8 runner: ubuntu-latest timeout: 30 cli: dequeue-empty - id: micro-rollout display: Rollout + span kind: micro store_workers: 8 runner: ubuntu-latest timeout: 30 cli: rollout - id: micro-dequeue-update-attempt display: Dequeue + update attempt kind: micro store_workers: 8 runner: ubuntu-latest timeout: 30 cli: dequeue-update-attempt - id: micro-dequeue-only display: Dequeue only kind: micro store_workers: 8 runner: ubuntu-latest timeout: 30 cli: dequeue-only - id: micro-metrics display: Multi-metric fan-out kind: micro store_workers: 8 runner: ubuntu-latest timeout: 15 cli: metrics env: PYTHONUNBUFFERED: "1" STORE_URL: http://localhost:4747 STORE_API_URL: http://localhost:4747/v1/agl PROM_URL: http://localhost:9090 GITHUB_ACTIONS_TIMEOUT_MINUTES: ${{ matrix.workload.timeout }} WORKLOAD_KIND: ${{ matrix.workload.kind }} WORKLOAD_ID: ${{ matrix.workload.id }} BACKEND_ID: ${{ matrix.backend.id }} ARTIFACT_DIR: ${{ format('artifacts/{0}-{1}', matrix.workload.id, matrix.backend.id) }} COMPOSE_FILE: ${{ matrix.backend.compose_file }} AGL_STORE_N_WORKERS: ${{ matrix.workload.store_workers }} ANALYSIS_FILE: ${{ format('analysis-{0}.log', matrix.workload.id) }} SUMMARY_FILE: ${{ format('summary-{0}.log', matrix.workload.id) }} PROM_ARCHIVE_BASENAME: ${{ format('prometheus-{0}-{1}', matrix.workload.id, matrix.backend.id) }} ARTIFACT_NAME: ${{ format('{0}-{1}', matrix.workload.id, matrix.backend.id) }} steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: '3.12' - name: Sync dependencies run: uv sync --frozen --extra mongo --group core-stable --group dev - name: Check disk space run: df -h - name: Reset benchmark data directories run: | set -euo pipefail cd docker rm -rf data bash setup.sh - name: Launch ${{ matrix.backend.id }} Prometheus stack run: | set -euo pipefail cd docker docker compose -f "$COMPOSE_FILE" down -v || true docker compose -f "$COMPOSE_FILE" up -d --quiet-pull - name: Wait for store readiness run: | set -euo pipefail for attempt in {1..60}; do if curl -fsS "$STORE_API_URL/health" >/dev/null 2>&1; then sleep 1 curl -fsS "$STORE_API_URL/rollouts" # Warm up the scraper sleep 15 # Allow some time for the baseline metrics to be established exit 0 fi sleep 1 done echo "Store did not become ready in time" >&2 # show logs for debugging cd docker && docker compose -f "$COMPOSE_FILE" logs app exit 1 - name: Prepare artifact directory run: mkdir -p "$ARTIFACT_DIR" - name: Record workload start run: echo "BENCHMARK_START=$(date -u +%FT%TZ)" >> "$GITHUB_ENV" - name: (Scenario) Run ${{ matrix.workload.display }} workload if: ${{ matrix.workload.kind == 'scenario' }} run: | set -euo pipefail uv run --locked --no-sync python -m tests.benchmark.benchmark_store \ --store-url "$STORE_URL" \ ${{ matrix.workload.args }} - name: (Micro) Run ${{ matrix.workload.display }} if: ${{ matrix.workload.kind == 'micro' }} run: | set -euo pipefail mkdir -p "$ARTIFACT_DIR" uv run --locked --no-sync python -m tests.benchmark.micro_benchmark \ --store-url "$STORE_URL" \ --summary-file "$ARTIFACT_DIR/$SUMMARY_FILE" \ "${{ matrix.workload.cli }}" | tee "$ARTIFACT_DIR/${{ matrix.workload.id }}.txt" - name: Record workload end if: ${{ always() }} run: echo "BENCHMARK_END=$(date -u +%FT%TZ)" >> "$GITHUB_ENV" - name: Show micro benchmark summary if: ${{ always() && matrix.workload.kind == 'micro' }} run: | set -euo pipefail summary_file="$ARTIFACT_DIR/$SUMMARY_FILE" if [ -f "$summary_file" ]; then echo "Micro benchmark summary ($WORKLOAD_ID/$BACKEND_ID):" cat "$summary_file" else echo "Summary file not found: $summary_file" fi - name: Run workload analysis if: ${{ always() }} run: | set -euo pipefail mkdir -p "$ARTIFACT_DIR" if [ -z "${BENCHMARK_START:-}" ] || [ -z "${BENCHMARK_END:-}" ]; then echo "Analysis skipped: benchmark window not recorded." > "$ARTIFACT_DIR/$ANALYSIS_FILE" exit 1 fi uv run --locked --no-sync python -m tests.benchmark.analysis \ --prom-url "$PROM_URL" \ --store-url "$STORE_API_URL" \ --start "$BENCHMARK_START" \ --end "$BENCHMARK_END" \ | tee "$ARTIFACT_DIR/$ANALYSIS_FILE" - name: Collect docker logs if: ${{ always() }} run: | set -euo pipefail mkdir -p "$ARTIFACT_DIR" cd docker readarray -t services < <(docker compose -f "$COMPOSE_FILE" config --services) if [ "${#services[@]}" -eq 0 ]; then echo "No services defined in compose file." exit 0 fi for service in "${services[@]}"; do docker compose -f "$COMPOSE_FILE" logs "$service" > "../$ARTIFACT_DIR/docker-${service}-${WORKLOAD_ID}-${BACKEND_ID}.log" || true done - name: Stop ${{ matrix.backend.id }} Prometheus stack if: ${{ always() }} run: | set -euo pipefail cd docker docker compose -f "$COMPOSE_FILE" down -v || true - name: Archive Prometheus metrics if: ${{ always() }} run: | set -euo pipefail mkdir -p "$ARTIFACT_DIR" if [ -d docker/data/prometheus ]; then tar -C docker/data -czf "$ARTIFACT_DIR/${PROM_ARCHIVE_BASENAME}.tar.gz" prometheus fi - name: Upload workload artifacts if: ${{ always() }} uses: actions/upload-artifact@v6 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ env.ARTIFACT_DIR }} if-no-files-found: error collection-benchmarks: name: collection (${{ matrix.backend.id }}, ${{ matrix.workload.id }}) runs-on: ${{ matrix.backend.runner }} timeout-minutes: 15 strategy: fail-fast: false matrix: backend: - id: memory needs_mongo: false runner: ubuntu-latest - id: mongo needs_mongo: true runner: ubuntu-latest workload: - id: high-insert total_tasks: 50000 concurrency: 2048 type: insert - id: medium-insert total_tasks: 50000 concurrency: 128 type: insert - id: low-insert total_tasks: 50000 concurrency: 4 type: insert - id: high-dequeue total_tasks: 50000 concurrency: 2048 type: dequeue - id: medium-dequeue total_tasks: 50000 concurrency: 128 type: dequeue - id: low-dequeue total_tasks: 50000 concurrency: 4 type: dequeue env: ARTIFACT_DIR: ${{ format('artifacts/{0}-{1}', matrix.backend.id, matrix.workload.id) }} SUMMARY_FILE: ${{ format('artifacts/{0}-{1}/summary-{0}-{1}.jsonl', matrix.backend.id, matrix.workload.id) }} ARTIFACT_NAME: ${{ format('collections-{0}-{1}', matrix.backend.id, matrix.workload.id) }} MONGO_URI: mongodb://localhost:27017/?replicaSet=rs0 steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: '3.12' - name: Sync dependencies run: uv sync --frozen --extra mongo --group core-stable --group dev - name: Launch MongoDB if: ${{ matrix.backend.needs_mongo }} run: | set -euo pipefail cd docker docker compose -f compose.mongo.yml down -v || true docker compose -f compose.mongo.yml up -d --quiet-pull for attempt in {1..60}; do if docker compose -f compose.mongo.yml exec -T mongo mongosh --quiet --eval 'db.runCommand({ping:1})' >/dev/null 2>&1; then exit 0 fi sleep 2 done echo "MongoDB did not become ready in time" >&2 docker compose -f compose.mongo.yml logs mongo exit 1 - name: Run collection benchmark run: | set -euo pipefail mkdir -p "$ARTIFACT_DIR" echo "Running collection benchmark (backend=${{ matrix.backend.id }}, workload=${{ matrix.workload.id }})" uv run --locked --no-sync python -m tests.benchmark.collection_benchmark \ "${{ matrix.workload.type }}" \ --backend "${{ matrix.backend.id }}" \ --total-tasks "${{ matrix.workload.total_tasks }}" \ --concurrency "${{ matrix.workload.concurrency }}" \ --task-prefix "${{ matrix.backend.id }}-${{ matrix.workload.id }}" \ --summary-file "$SUMMARY_FILE" \ --mongo-uri "$MONGO_URI" \ --mongo-database agentlightning_collection_bench - name: Show collection benchmark summary if: ${{ always() }} run: | set -euo pipefail if [ -f "$SUMMARY_FILE" ]; then echo "Collection benchmark summary (${{ matrix.backend.id }}):" cat "$SUMMARY_FILE" else echo "Summary file not found: $SUMMARY_FILE" fi - name: Stop MongoDB if: ${{ always() && matrix.backend.needs_mongo }} run: | set -euo pipefail cd docker docker compose -f compose.mongo.yml down -v || true - name: Upload collection artifacts if: ${{ always() }} uses: actions/upload-artifact@v6 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ env.ARTIFACT_DIR }} if-no-files-found: error ================================================ FILE: .github/workflows/dashboard.yml ================================================ name: Dashboard permissions: contents: read on: schedule: # Every day at 5 AM UTC+8 - cron: '0 21 * * *' workflow_dispatch: push: branches: [ main, stable/**/* ] jobs: dashboard: name: Chromatic runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '22' - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Run Chromatic uses: chromaui/action@v13 with: projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} workingDir: dashboard exitZeroOnChanges: false ================================================ FILE: .github/workflows/docs.yml ================================================ name: Deploy Documentation on: push: branches: - main tags: - 'v*' workflow_dispatch: concurrency: group: docs-deploy cancel-in-progress: false permissions: contents: write pages: write id-token: write jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: astral-sh/setup-uv@v7 with: enable-cache: true - name: Sync dependencies run: uv sync --frozen --no-default-groups --group dev - name: Configure Git run: | git config --global user.name "GitHub Actions" git config --global user.email "actions@github.com" - name: Get version and commit id: version run: | if [[ $GITHUB_REF == refs/tags/* ]]; then VERSION=${GITHUB_REF#refs/tags/v} SOURCE_COMMIT=${GITHUB_SHA} else VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])") SOURCE_COMMIT=${GITHUB_SHA} fi echo "version=$VERSION" >> $GITHUB_OUTPUT echo "SOURCE_COMMIT=$SOURCE_COMMIT" >> $GITHUB_ENV - name: Deploy versioned docs if: startsWith(github.ref, 'refs/tags/') run: | uv run --locked --no-sync mike deploy --push --update-aliases ${{ steps.version.outputs.version }} stable - name: Deploy dev docs if: github.ref == 'refs/heads/main' run: | uv run --locked --no-sync mike deploy --push latest # Always set stable to default uv run --locked --no-sync mike set-default --push stable ================================================ FILE: .github/workflows/examples-apo.yml ================================================ name: Examples - APO permissions: contents: read on: schedule: # Every day at 3 AM UTC+8 - cron: '0 19 * * *' workflow_dispatch: repository_dispatch: types: [ci-apo, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'APO - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('APO - {0}', github.event_name) }} jobs: apo: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-apo' || github.event.action == 'ci-all' name: APO (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) # This job is run on GitHub hosted runners rather than self-hosted runners because it needs no GPU. runs-on: ubuntu-latest timeout-minutes: 30 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: | uv sync --frozen --no-default-groups --extra apo \ --group dev --group experiment --group agents --group core-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable & legacy) run: | uv sync --frozen --no-default-groups --extra apo \ --group dev --group experiment --group agents --group core-${{ matrix.setup-script }} if: matrix.setup-script != 'latest' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-apo-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: APO custom algorithm run: | set -ex cd examples/apo uv run apo_custom_algorithm_trainer.py | tee _ci_apo.log # Check whether the log contains "Best prompt found:" grep "Best prompt found:" _ci_apo.log env: # New versions follow OPENAI_BASE_URL instead of OPENAI_API_BASE OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy - name: APO custom algorithm debugger run: | set -ex cd examples/apo uv run apo_debug.py --mode runner uv run apo_debug.py --mode hook uv run apo_debug.py --mode trainer env: # New versions follow OPENAI_BASE_URL instead of OPENAI_API_BASE OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy - name: APO built-in algorithm run: | set -ex cd examples/apo uv run room_selector_apo.py env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy if: matrix.setup-script != 'legacy' ================================================ FILE: .github/workflows/examples-azure.yml ================================================ name: Examples - Azure permissions: contents: read on: schedule: # Every day at 4 AM UTC+8 - cron: '0 20 * * *' workflow_dispatch: repository_dispatch: types: [ci-azure, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Azure - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Azure - {0}', github.event_name) }} jobs: azure: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-azure' || github.event.action == 'ci-all' name: Azure (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-cpu] timeout-minutes: 400 strategy: matrix: include: - python-version: '3.12' setup-script: 'stable' fail-fast: false steps: - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies run: | uv sync --frozen --no-default-groups \ --group dev --group experiment --group agents --group core-stable - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-azure-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Azure Login run: | az login --identity shell: bash - name: Azure OpenAI Sanity Check run: | source .venv/bin/activate cd examples/azure python capital_agent.py shell: bash env: AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} id: azure_openai_sanity_check - name: Azure OpenAI Supervised Fine-tuning run: | source .venv/bin/activate cd examples/azure python train_capital_agent.py --n-iterations 2 --cleanup shell: bash env: AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} AZURE_OPENAI_API_VERSION: 2025-04-01-preview AZURE_RESOURCE_GROUP: ${{ secrets.AZURE_RESOURCE_GROUP }} AZURE_RESOURCE_NAME: ${{ secrets.AZURE_RESOURCE_NAME }} id: azure_openai_finetune ================================================ FILE: .github/workflows/examples-calc-x.yml ================================================ name: Examples - Calc-X permissions: contents: read on: schedule: # Every day at 3 AM UTC+8 - cron: '0 19 * * *' workflow_dispatch: repository_dispatch: types: [ci-calc-x, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Calc-X - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Calc-X - {0}', github.event_name) }} jobs: calc-x-perf: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-calc-x' || github.event.action == 'ci-all' name: Calc-X Performance (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 90 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group torch-gpu-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable & legacy) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group torch-gpu-${{ matrix.setup-script }} if: matrix.setup-script != 'latest' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-calc-x-performance-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare Calc-X dataset run: | set -ex cd examples/calc_x uv run gdown --fuzzy https://drive.google.com/file/d/1FQMyKLLd6hP9dw9rfZn1EZOWNvKaDsqw/view unzip calc-x-data.zip -d data rm calc-x-data.zip - name: Calc-X MCP sanity check run: | set -ex cd examples/calc_x uv run tests/test_mcp_calculator.py env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Calc-X sanity check run: | set -ex cd examples/calc_x uv run legacy_calc_agent_debug.py env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy # Calc-X training suddenly works after running the sanity check. # And it has to be run before Spider training. # The client side used to hang in many of my attempts. # Don't ask why. Don't touch this. - name: Calc-X training run: | source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 python train_calc_agent.py --val-file data/test_mini.parquet --ci shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train - name: Validate Calc-X training run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train.outputs.project_name }} ${{ steps.calc_x_train.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} calc-x-variants: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-calc-x' || github.event.action == 'ci-all' name: Calc-X Variants (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 90 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --extra weave --extra mongo --group torch-gpu-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable & legacy) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --extra weave --extra mongo --group torch-gpu-${{ matrix.setup-script }} if: matrix.setup-script != 'latest' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-calc-x-variants-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare Calc-X dataset run: | set -ex cd examples/calc_x uv run gdown --fuzzy https://drive.google.com/file/d/1FQMyKLLd6hP9dw9rfZn1EZOWNvKaDsqw/view unzip calc-x-data.zip -d data rm calc-x-data.zip - name: Calc-X MCP sanity check run: | set -ex cd examples/calc_x uv run tests/test_mcp_calculator.py env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Calc-X sanity check run: | set -ex cd examples/calc_x uv run legacy_calc_agent_debug.py env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Training with local model run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 hf download Qwen/Qwen2.5-0.5B-Instruct --local-dir data/qwen_model PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --model $(realpath data/qwen_model) sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_local_model - name: Validate training with local model run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_local_model.outputs.project_name }} ${{ steps.calc_x_train_local_model.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Training with LLM Proxy run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --llm-proxy sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_llm_proxy - name: Validate training with LLM Proxy run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_llm_proxy.outputs.project_name }} ${{ steps.calc_x_train_llm_proxy.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Setup Docker environments run: ./scripts/mongodb_docker_run.sh shell: bash - name: Training with MongoDB run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --mongo-uri mongodb://localhost:27017/?replicaSet=rs0 sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_mongo - name: Validate training with MongoDB run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_mongo.outputs.project_name }} ${{ steps.calc_x_train_mongo.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Training with LoRA run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --lora sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_lora if: matrix.setup-script != 'legacy' - name: Validate training with LoRA run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_lora.outputs.project_name }} ${{ steps.calc_x_train_lora.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} if: matrix.setup-script != 'legacy' - name: Training with trajectory level aggregation run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --trajectory-level sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_trajectory_level - name: Validate training with trajectory level aggregation run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_trajectory_level.outputs.project_name }} ${{ steps.calc_x_train_trajectory_level.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Training with Weave run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast --weave sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_weave - name: Validate training with Weave run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_weave.outputs.project_name }} ${{ steps.calc_x_train_weave.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Training with external store run: | set -euo pipefail source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh agl store --port 4747 & sleep 5 AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=runner python train_calc_agent.py --external-store-address http://localhost:4747 --val-file data/test_mini.parquet --ci-fast & sleep 5 AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=algorithm python train_calc_agent.py --external-store-address http://localhost:4747 --val-file data/test_mini.parquet --ci-fast pkill -f agl && echo "SIGTERM sent to agl" || echo "No agl process found" while pgrep -f agl; do echo "Waiting for agl to finish..." sleep 5 done pkill -f train_calc_agent.py && echo "SIGTERM sent to train_calc_agent.py" || echo "No train_calc_agent.py process found" while pgrep -f train_calc_agent.py; do echo "Waiting for train_calc_agent.py to finish..." sleep 5 done echo "train_calc_agent.py has finished." shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_external_store - name: Validate training with external store run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_external_store.outputs.project_name }} ${{ steps.calc_x_train_external_store.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Training with role-based environment variables run: | set -euo pipefail source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh PYTHONUNBUFFERED=1 AGL_SERVER_HOST=127.0.0.1 AGL_SERVER_PORT=5858 AGL_CURRENT_ROLE=runner python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast & sleep 5 PYTHONUNBUFFERED=1 AGL_SERVER_HOST=0.0.0.0 AGL_SERVER_PORT=5858 AGL_CURRENT_ROLE=algorithm python train_calc_agent.py --val-file data/test_mini.parquet --ci-fast pkill -f train_calc_agent.py && echo "SIGTERM sent to train_calc_agent.py" || echo "No train_calc_agent.py process found" while pgrep -f train_calc_agent.py; do echo "Waiting for train_calc_agent.py to finish..." sleep 5 done echo "train_calc_agent.py has finished." shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train_role_based_env_var - name: Validate training with role-based environment variables run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train_role_based_env_var.outputs.project_name }} ${{ steps.calc_x_train_role_based_env_var.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/examples-chartqa.yml ================================================ name: Examples - ChartQA permissions: contents: read on: schedule: # Every day at 6 AM UTC+8 - cron: "0 22 * * *" workflow_dispatch: repository_dispatch: types: [ci-chartqa, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'ChartQA - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('ChartQA - {0}', github.event_name) }} jobs: chartqa: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-chartqa' || github.event.action == 'ci-all' name: ChartQA (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 60 strategy: matrix: include: - python-version: '3.12' setup-script: 'stable' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group image --group langchain --group vllm-0-10-2 --group torch-gpu-stable - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-chartqa-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare ChartQA dataset run: | set -euo pipefail cd examples/chartqa uv run gdown --fuzzy "https://drive.google.com/file/d/1fWRt9hehg8_uV7BDWSCwKTycM60JcmGN/view?usp=sharing" -O chartqa-data.zip unzip chartqa-data.zip rm chartqa-data.zip shell: bash - name: ChartQA sanity check with GPT run: | set -euo pipefail cd examples/chartqa uv run python debug_chartqa_agent.py shell: bash env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Run vLLM Server run: | set -euo pipefail source .venv/bin/activate cd examples/chartqa uv run --no-sync vllm serve Qwen/Qwen2-VL-2B-Instruct \ --gpu-memory-utilization 0.9 \ --max-model-len 4096 \ --allowed-local-media-path "$(pwd)/data" \ --enable-prefix-caching \ --port 8088 & VLLM_READY=0 for i in {1..100}; do if curl -sSf http://localhost:8088/v1/models > /dev/null 2>&1; then echo "vLLM server is ready!" VLLM_READY=1 break fi echo "Waiting for vLLM server to be ready... (${i})" sleep 5 done if [[ "$VLLM_READY" != "1" ]]; then echo "vLLM server failed to start!" exit 1 fi - name: ChartQA sanity check with vLLM run: | set -euo pipefail source .venv/bin/activate cd examples/chartqa uv run python debug_chartqa_agent.py shell: bash env: USE_LLM_PROXY: "1" OPENAI_API_BASE: http://localhost:8088/v1 OPENAI_MODEL: Qwen/Qwen2-VL-2B-Instruct - name: Stop vLLM Server run: | set -euo pipefail pkill -f vllm for i in {1..60}; do if ! pgrep -f vllm; then break fi sleep 5 done - name: ChartQA training run: | set -euo pipefail source .venv/bin/activate cd examples/chartqa ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_chartqa_agent.py ci sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: chartqa_train - name: Validate ChartQA training run: | set -euo pipefail uv run scripts/validate_example_wandb.py ${{ steps.chartqa_train.outputs.project_name }} ${{ steps.chartqa_train.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/examples-claude-code.yml ================================================ name: Examples - Claude Code permissions: contents: read on: schedule: # Every day at 4 AM UTC+8 - cron: "0 20 * * *" workflow_dispatch: repository_dispatch: types: [ci-claude-code, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Claude Code - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Claude Code - {0}', github.event_name) }} jobs: claude-code: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-claude-code' || github.event.action == 'ci-all' name: Claude Code (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 60 strategy: matrix: include: - python-version: "3.12" setup-script: "stable" - python-version: "3.13" setup-script: "latest" fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies run: | uv sync --frozen --no-default-groups \ --group dev --group experiment --group agents --group torch-gpu-stable - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-claude-code-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Download model run: | source .venv/bin/activate python -c "from transformers import AutoModelForCausalLM; AutoModelForCausalLM.from_pretrained('Qwen/Qwen3-Coder-30B-A3B-Instruct')" - name: Launch vLLM server run: | set -euo pipefail source .venv/bin/activate vllm serve Qwen/Qwen3-Coder-30B-A3B-Instruct \ --max-model-len 131072 \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --port 45993 & VLLM_READY=0 for i in {1..100}; do if curl -sSf http://localhost:45993/v1/models > /dev/null 2>&1; then echo "vLLM server is ready!" VLLM_READY=1 break fi echo "Waiting for vLLM server to be ready... (${i})" sleep 5 done if [[ "$VLLM_READY" != "1" ]]; then echo "vLLM server failed to start!" exit 1 fi - name: Claude Code sanity check with vLLM models run: | source .venv/bin/activate cd examples/claude_code python claude_code_agent.py vllm --backend-model-high Qwen/Qwen3-Coder-30B-A3B-Instruct --backend-model-low Qwen/Qwen3-Coder-30B-A3B-Instruct --base-url http://localhost:45993/v1 --debug shell: bash - name: Upload sanity check artifacts for vLLM if: ${{ always() }} uses: actions/upload-artifact@v6 with: name: claude-code-sanity-check-vllm-${{ matrix.setup-script }} path: | examples/claude_code/data/ examples/claude_code/logs/ if-no-files-found: error - name: Cleanup vLLM run: | set -euo pipefail pkill -f vllm for i in {1..60}; do if ! pgrep -f vllm; then break fi sleep 5 done rm -rf examples/claude_code/data/ rm -rf examples/claude_code/logs/ - name: Claude Code sanity check with OpenAI models run: | source .venv/bin/activate cd examples/claude_code python claude_code_agent.py openai --backend-model-high gpt-5.1-codex-mini --backend-model-low gpt-4.1-mini --debug shell: bash env: OPENAI_BASE_URL: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} - name: Upload sanity check artifacts for OpenAI if: ${{ always() }} uses: actions/upload-artifact@v6 with: name: claude-code-sanity-check-openai-${{ matrix.setup-script }} path: | examples/claude_code/data/ examples/claude_code/logs/ if-no-files-found: error ================================================ FILE: .github/workflows/examples-compat.yml ================================================ name: Examples - Backward Compatibility permissions: contents: read on: schedule: # Every day at 6 AM UTC+8 - cron: '0 22 * * *' workflow_dispatch: repository_dispatch: types: [ci-compat, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Backward Compatibility - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Backward Compatibility - {0}', github.event_name) }} jobs: backward-compatibility: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-compat' || github.event.action == 'ci-all' name: Backward Compatibility (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 30 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Sync dependencies run: | uv sync --frozen --no-default-groups --extra apo --extra verl \ --group dev --group experiment --group agents --group torch-gpu-${{ matrix.setup-script }} - name: Override VERL (stable) run: | uv pip install verl==0.5.0 vllm==0.10.2 if: matrix.setup-script == 'stable' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-backward-compatibility-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare Calc-X dataset run: | set -ex cd examples/calc_x uv run gdown --fuzzy https://drive.google.com/file/d/1FQMyKLLd6hP9dw9rfZn1EZOWNvKaDsqw/view unzip calc-x-data.zip -d data rm calc-x-data.zip - name: APO example (legacy client-server style) run: | set -ex cd examples/apo uv run legacy_apo_client.py & sleep 3 # Wait for the client to be up uv run legacy_apo_server.py pkill -f legacy_apo_client.py && echo "SIGTERM sent to legacy_apo_client.py" || echo "No legacy_apo_client.py process found" while pgrep -f legacy_apo_client.py; do echo "Waiting for legacy_apo_client.py to finish..." sleep 5 done echo "legacy_apo_client.py has finished." sleep 10 env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Calc-X MCP sanity check run: | set -ex cd examples/calc_x uv run tests/test_mcp_calculator.py env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Calc-X sanity check run: | set -ex cd examples/calc_x uv run legacy_calc_agent_debug.py env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy - name: Calc-X training (legacy client-server style) run: | set -ex source .venv/bin/activate cd examples/calc_x ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python legacy_calc_agent.py & bash legacy_train.sh pkill -f legacy_calc_agent.py && echo "SIGTERM sent to legacy_calc_agent.py" || echo "No legacy_calc_agent.py process found" while pgrep -f legacy_calc_agent.py; do echo "Waiting for legacy_calc_agent.py to finish..." sleep 5 done echo "legacy_calc_agent.py has finished." sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: calc_x_train - name: Validate Calc-X training run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.calc_x_train.outputs.project_name }} ${{ steps.calc_x_train.outputs.run_name }} env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/examples-rag.yml ================================================ name: Examples - RAG permissions: contents: read on: schedule: # Every day at 6 AM UTC+8 - cron: '0 22 * * *' workflow_dispatch: repository_dispatch: types: [ci-rag, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'RAG - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('RAG - {0}', github.event_name) }} jobs: rag: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-rag' || github.event.action == 'ci-all' name: RAG (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 60 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group rag --group torch-gpu-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable & legacy) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group rag --group torch-gpu-${{ matrix.setup-script }} if: matrix.setup-script != 'latest' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-rag-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare RAG dataset run: | set -euo pipefail cd examples/rag mkdir -p data uv run gdown --fuzzy "https://drive.google.com/file/d/1Pq4Ag8zVoN8gUtLu0LcBfY35Dm5zL0hq/view?usp=drive_link" -O data/dataset_tiny.parquet uv run gdown --fuzzy "https://drive.google.com/file/d/1REXCpRLbeZu1KfWWKhIGEQe_WNHUOBkS/view?usp=drive_link" -O data/chunks_candidate_tiny.pkl uv run gdown --fuzzy "https://drive.google.com/file/d/1f6P-h_8KSRhe5pqDHWbRQWvUhTygfZ-c/view?usp=drive_link" -O data/index_hnsw_faiss_n32e40_tiny.index - name: Run WIKI Retriever MCP Server run: | set -euo pipefail cd examples/rag uv run python wiki_retriever_mcp.py & for i in {1..20}; do sleep 5 if nc -z localhost 8099; then echo "MCP server is up!" exit 0 else echo "Waiting for MCP server to start..." fi done echo "MCP server failed to start within expected time." exit 1 - name: Run vLLM Server run: | set -euo pipefail source .venv/bin/activate vllm serve Qwen/Qwen2.5-1.5B-Instruct \ --enable-auto-tool-choice \ --tool-call-parser hermes \ --port 8000 & VLLM_READY=0 for i in {1..100}; do if curl -sSf http://localhost:8000/v1/models > /dev/null 2>&1; then echo "vLLM server is ready!" VLLM_READY=1 break fi echo "Waiting for vLLM server to be ready... (${i})" sleep 5 done if [[ "$VLLM_READY" != "1" ]]; then echo "vLLM server failed to start!" exit 1 fi - name: Run RAG Sanity check run: | set -ex source .venv/bin/activate cd examples/rag uv run python rag_agent.py shell: bash - name: Stop vLLM Server run: | set -euo pipefail pkill -f vllm for i in {1..60}; do if ! pgrep -f vllm; then break fi sleep 5 done - name: RAG training run: | set -ex source .venv/bin/activate cd examples/rag ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_rag.py fast sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: rag_train - name: Validate RAG training run: | set -ex # Allow up to 5 rollouts to fail to produce rewards uv run scripts/validate_example_wandb.py ${{ steps.rag_train.outputs.project_name }} ${{ steps.rag_train.outputs.run_name }} --reward-tolerance 5 env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/examples-spider.yml ================================================ name: Examples - Spider permissions: contents: read on: schedule: # Every day at 4 AM UTC+8 - cron: '0 20 * * *' workflow_dispatch: repository_dispatch: types: [ci-spider, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Spider - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Spider - {0}', github.event_name) }} jobs: spider: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-spider' || github.event.action == 'ci-all' name: Spider (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 60 strategy: matrix: include: # legacy is omitted because langchain doesn't work with legacy vllm versions - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group langchain --group torch-gpu-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable) run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group langchain --group torch-gpu-${{ matrix.setup-script }} if: matrix.setup-script == 'stable' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-spider-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Prepare Spider dataset run: | set -ex cd examples/spider uv run gdown --fuzzy https://drive.google.com/file/d/1oi9J1jZP9TyM35L85CL3qeGWl2jqlnL6/view unzip -q spider-data.zip -d data rm spider-data.zip - name: Spider sanity check run: | set -ex cd examples/spider uv run sql_agent.py env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy if: success() || failure() - name: Spider training run: | set -ex source .venv/bin/activate cd examples/spider ../../scripts/restart_ray.sh sleep 5 PYTHONUNBUFFERED=1 python train_sql_agent.py fast sleep 10 shell: bash env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} id: spider_train - name: Validate Spider training run: | set -ex uv run scripts/validate_example_wandb.py ${{ steps.spider_train.outputs.project_name }} ${{ steps.spider_train.outputs.run_name }} --reward-tolerance 5 env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/examples-tinker.yml ================================================ name: Examples - Tinker permissions: contents: read on: schedule: # Every day at 3 AM UTC+8 - cron: '0 19 * * *' workflow_dispatch: repository_dispatch: types: [ci-tinker, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Tinker - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Tinker - {0}', github.event_name) }} jobs: tinker: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-tinker' || github.event.action == 'ci-all' name: Tinker (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-cpu] timeout-minutes: 150 strategy: matrix: include: - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies run: | uv sync --frozen --no-default-groups \ --group dev --group experiment --group agents --group torch-cpu --group core-stable --group tinker - name: Freeze dependencies run: | set -euo pipefail uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-tinker-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 # TODO: Currently only test the client tracer implementation. - name: Tinker LLM sanity check (tracer text) run: | set -euo pipefail source .venv/bin/activate cd examples/tinker python -m tests.test_tinker_llm tracer-text shell: bash env: TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker LLM sanity check (tracer tool) run: | set -euo pipefail source .venv/bin/activate cd examples/tinker python -m tests.test_tinker_llm tracer-tool shell: bash env: TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker Hello run: | set -euo pipefail source .venv/bin/activate cd examples/tinker python hello.py oneclick --ci shell: bash env: TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker Q20 Evaluate (GPT-4.1) run: | set -euo pipefail source .venv/bin/activate cd examples/tinker mkdir -p logs python q20_evaluate.py --ci --model gpt-4.1 --output-file logs/q20_evaluate_gpt-4.1.jsonl shell: bash env: OPENAI_BASE_URL: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} CREWAI_DISABLE_TELEMETRY: true TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker Q20 Evaluate (Qwen3-30B-A3B-Instruct-2507) run: | set -euo pipefail source .venv/bin/activate cd examples/tinker python q20_evaluate.py --ci --model Qwen/Qwen3-30B-A3B-Instruct-2507 --output-file logs/q20_evaluate_qwen3-30b-a3b.jsonl shell: bash env: OPENAI_BASE_URL: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} CREWAI_DISABLE_TELEMETRY: true TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker Q20 Training Dry Run run: | set -euo pipefail source .venv/bin/activate cd examples/tinker python q20_train.py dryrun --model qwen4b shell: bash env: OPENAI_BASE_URL: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} CREWAI_DISABLE_TELEMETRY: true TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} - name: Tinker Q20 Training run: | set -euo pipefail source .venv/bin/activate cd examples/tinker agl store --port 4747 & sleep 5 python q20_train.py runner --n-runners 4 & sleep 5 python q20_train.py algo --model qwen4b --ci sleep 5 pkill -f agl && echo "SIGTERM sent to agl" || echo "No agl process found" while pgrep -f agl; do echo "Waiting for agl to finish..." sleep 5 done pkill -f q20_train.py && echo "SIGTERM sent to q20_train.py" || echo "No q20_train.py process found" while pgrep -f q20_train.py; do echo "Waiting for q20_train.py to finish..." sleep 5 done echo "q20_train.py has finished." shell: bash env: OPENAI_BASE_URL: ${{ secrets.AZURE_OPENAI_ENDPOINT_SWEDEN }} OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY_SWEDEN }} CREWAI_DISABLE_TELEMETRY: true TINKER_API_KEY: ${{ secrets.TINKER_API_KEY }} ================================================ FILE: .github/workflows/examples-unsloth.yml ================================================ name: Examples - Unsloth permissions: contents: read on: schedule: # Every day at 5 AM UTC+8 - cron: '0 21 * * *' workflow_dispatch: repository_dispatch: types: [ci-unsloth, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'Unsloth - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('Unsloth - {0}', github.event_name) }} jobs: unsloth: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-unsloth' || github.event.action == 'ci-all' name: Unsloth (Python ${{ matrix.python-version }}, ${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 60 strategy: matrix: # Legacy versions are not supported for Unsloth examples. include: - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - name: Check disk space run: df -h - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies run: | uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group trl --group agents --group torch-gpu-stable - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-unsloth-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Prepare Unsloth model run: | set -ex cd examples/unsloth rm -rf models uv run hf download unsloth/Qwen3-4B-Instruct-2507 --local-dir models/version_0 - name: Unsloth SFT example run: | set -ex source .venv/bin/activate cd examples/unsloth agl store --port 4747 & sleep 5 python sft_rollout_runners.py & sleep 5 python sft_algorithm.py pkill -f agl && echo "SIGTERM sent to agl" || echo "No agl process found" while pgrep -f agl; do echo "Waiting for agl to finish..." sleep 5 done pkill -f sft_rollout_runners.py && echo "SIGTERM sent to sft_rollout_runners.py" || echo "No sft_rollout_runners.py process found" while pgrep -f sft_rollout_runners.py; do echo "Waiting for sft_rollout_runners.py to finish..." sleep 5 done echo "sft_rollout_runners.py has finished." sleep 10 # Check models/version_2 must exist if [ ! -d "models/version_2" ]; then echo "models/version_2 does not exist" exit 1 fi env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} - name: Unsloth SFT example all-in-one run: | set -ex source .venv/bin/activate cd examples/unsloth rm -rf models/version_1 models/version_2 python sft_allinone.py if [ ! -d "models/version_2" ]; then echo "models/version_2 does not exist" exit 1 fi env: WANDB_BASE_URL: ${{ secrets.MSR_WANDB_BASE_URL }} WANDB_API_KEY: ${{ secrets.MSR_WANDB_API_KEY }} ================================================ FILE: .github/workflows/issue-comment.yml ================================================ name: Issue Comment on: issue_comment: types: [created] permissions: pull-requests: write issues: write contents: write actions: read jobs: dispatch: # Only run for comments on pull requests AND when the comment starts with "/ci" if: > github.event.issue.pull_request != null && startsWith(github.event.comment.body, '/ci') runs-on: ubuntu-latest outputs: dispatched: ${{ steps.dispatch.outputs.dispatched }} event_types: ${{ steps.dispatch.outputs.event_types }} correlation_id: ${{ steps.dispatch.outputs.correlation_id }} trigger_comment_id: ${{ steps.dispatch.outputs.trigger_comment_id }} ack_comment_id: ${{ steps.ack.outputs.comment_id }} steps: - name: Guardrail — allow only members/collaborators id: guard uses: actions/github-script@v8 with: script: | const allowed = ['MEMBER','OWNER','COLLABORATOR']; const assoc = context.payload.comment.author_association; if (!allowed.includes(assoc)) { core.notice(`Ignoring /ci from ${context.payload.comment.user.login} (author_association=${assoc}).`); core.setOutput('skip', 'true'); } - name: Trigger repository dispatch id: dispatch if: steps.guard.outputs.skip != 'true' uses: actions/github-script@v8 with: script: | const owner = context.repo.owner; const repo = context.repo.repo; const pull_number = context.payload.issue.number; const comment = context.payload.comment; // Fetch current PR state const { data: pr } = await github.rest.pulls.get({ owner, repo, pull_number }); // Add reaction so folks know we saw it try { await github.rest.reactions.createForIssueComment({ owner, repo, comment_id: comment.id, content: 'rocket' }); } catch (e) { core.info('Could not add reaction (likely due to permissions). Continuing.'); } const labels = (pr.labels ?? []).map(label => label.name); const directCiLabels = labels.filter(label => label.startsWith('ci-')); const hasCiAll = directCiLabels.includes('ci-all'); const dedupe = new Set( directCiLabels.filter(label => label !== 'ci-all') ); if (!hasCiAll && dedupe.size === 0) { core.notice('No ci-* labels found on the pull request; nothing to dispatch.'); core.setOutput('dispatched', 'false'); core.setOutput('event_types', ''); return; } const correlation_id = `id-${comment.id}-${Date.now().toString(36)}`; const clientPayload = { correlation_id, pull_number, pr_ref: `refs/pull/${pull_number}/merge`, pr_head_ref: pr.head.ref, pr_head_sha: pr.head.sha, pr_base_ref: pr.base.ref, pr_base_sha: pr.base.sha, trigger_comment_id: comment.id, trigger_comment_user: comment.user.login, }; const eventTypes = hasCiAll ? ['ci-all'] : Array.from(dedupe); for (const eventType of eventTypes) { await github.rest.repos.createDispatchEvent({ owner, repo, event_type: eventType, client_payload: { ...clientPayload, ci_label: eventType } }); core.notice(`Dispatched '${eventType}' event for PR #${pull_number}.`); } core.setOutput('dispatched', 'true'); core.setOutput('event_types', eventTypes.join(',')); core.setOutput('correlation_id', correlation_id); core.setOutput('trigger_comment_id', String(comment.id)); - name: Acknowledge in thread (optional) if: steps.guard.outputs.skip != 'true' && steps.dispatch.outputs.dispatched == 'true' id: ack uses: actions/github-script@v8 env: EVENT_TYPES: ${{ steps.dispatch.outputs.event_types }} CORRELATION_ID: ${{ steps.dispatch.outputs.correlation_id }} with: script: | const eventTypes = (process.env.EVENT_TYPES || '') .split(',') .map(label => label.trim()) .filter(Boolean); const formatted = eventTypes.map(label => `\`repository_dispatch:${label}\``).join(', '); const { owner, repo } = context.repo; const issue_number = context.payload.issue.number; const body = [ `✅ CI trigger requested by @${context.payload.comment.user.login}.`, `Fired ${formatted}.`, '', `_Collecting run links for correlation \`${process.env.CORRELATION_ID}\`…_` ].join('\n'); const { data: comment } = await github.rest.issues.createComment({ owner, repo, issue_number, body }); core.setOutput('comment_id', String(comment.id)); - name: Notify missing ci label if: steps.guard.outputs.skip != 'true' && steps.dispatch.outputs.dispatched != 'true' uses: actions/github-script@v8 with: script: | const { owner, repo } = context.repo; const issue_number = context.payload.issue.number; await github.rest.issues.createComment({ owner, repo, issue_number, body: `⚠️ CI trigger ignored because the pull request has no \`ci-*\` labels (e.g. \`ci-apo\`, \`ci-calc-x\`). Add the desired labels and try \`/ci\` again.` }); watch: needs: dispatch if: needs.dispatch.outputs.dispatched == 'true' runs-on: ubuntu-latest timeout-minutes: 180 steps: - name: Track dispatched runs and update comment uses: actions/github-script@v8 env: CORRELATION_ID: ${{ needs.dispatch.outputs.correlation_id }} ACK_COMMENT_ID: ${{ needs.dispatch.outputs.ack_comment_id }} TRIGGER_COMMENT_ID: ${{ needs.dispatch.outputs.trigger_comment_id }} with: script: | const owner = context.repo.owner; const repo = context.repo.repo; const correlationId = process.env.CORRELATION_ID; if (!correlationId) { core.warning('No correlation id supplied; nothing to watch.'); return; } const ackCommentId = Number(process.env.ACK_COMMENT_ID || 0); if (!ackCommentId) { core.warning('No comment id available for updates; skipping watch.'); return; } const triggerCommentId = Number(process.env.TRIGGER_COMMENT_ID || 0); if (!triggerCommentId) { core.warning('No trigger comment id available; skipping watch.'); return; } const prefix = `🚀 CI Watcher for correlation ${correlationId} triggered by comment ${triggerCommentId}`; core.notice(`Watching workflow runs for correlation '${correlationId}' using comment ${ackCommentId}.`); function fmt(run) { const status = run.status; const conclusion = run.conclusion; const badge = status === 'completed' ? (conclusion === 'success' ? '🟢' : conclusion === 'failure' ? '🔴' : '🟡') : (status === 'in_progress' ? '🟣' : '⚪️'); const title = run.display_title || run.name || `run ${run.id}`; const statusText = status === 'completed' ? `${status}/${conclusion}` : status; return `- ${badge} [${title}](${run.html_url}) — \`${statusText}\``; } const signatureOf = runs => runs .map(run => `${run.id}:${run.status}/${run.conclusion || ''}`) .sort() .join('|'); const deadlineMs = Date.now() + 175 * 60 * 1000; // 175 minutes let found = []; async function searchOnce() { const runs = await github.paginate( github.rest.actions.listWorkflowRunsForRepo, { owner, repo, event: 'repository_dispatch', per_page: 100 } ); const cutoff = new Date(Date.now() - 60 * 60 * 1000); // last hour return runs.filter(run => { const createdAt = new Date(run.created_at); const title = String(run.display_title || run.name || ''); return createdAt >= cutoff && title.includes(correlationId); }); } while (Date.now() < deadlineMs) { found = await searchOnce(); if (found.length > 0) { core.notice(`Discovered ${found.length} workflow run(s) for correlation '${correlationId}'.`); break; } core.notice(`No runs found yet for correlation '${correlationId}'; retrying shortly.`); await new Promise(res => setTimeout(res, 10000)); } if (found.length === 0) { core.notice(`Watcher timed out with no runs for correlation '${correlationId}'; notifying thread.`); await github.rest.issues.updateComment({ owner, repo, comment_id: ackCommentId, body: [ prefix, `⚠️ I couldn't find any workflow runs for correlation \`${correlationId}\`.`, `They may be delayed or misconfigured.` ].join('\n') }); return; } const runIds = new Set(found.map(run => run.id)); let lastSignature = ''; async function refreshRuns() { const ids = Array.from(runIds); const refreshed = []; for (const id of ids) { const { data } = await github.rest.actions.getWorkflowRun({ owner, repo, run_id: id }); refreshed.push(data); } return refreshed; } async function updateCommentIfChanged(runs, allDone) { const signature = signatureOf(runs); if (signature === lastSignature) { // Run statuses unchanged; skipping comment update. return; } lastSignature = signature; core.notice(`Updating comment ${ackCommentId} with ${runs.length} run status entries (allDone=${allDone}).`); await github.rest.issues.updateComment({ owner, repo, comment_id: ackCommentId, body: [ prefix, `🏃‍♀️ Tracking ${runs.length} workflow run(s):`, '', ...runs.map(fmt), '', allDone ? '✅ All runs completed.' : '_Still running…_' ].join('\n') }); } await updateCommentIfChanged(found, found.every(run => run.status === 'completed')); while (Date.now() < deadlineMs) { const latest = await searchOnce(); for (const run of latest) { if (!runIds.has(run.id)) { runIds.add(run.id); core.notice(`Detected additional run ${run.id} (${run.name || run.display_title || 'unnamed'}) for correlation '${correlationId}'.`); } } const current = await refreshRuns(); const allDone = current.every(run => run.status === 'completed'); await updateCommentIfChanged(current, allDone); if (allDone) { core.notice(`All runs for correlation '${correlationId}' completed; stopping watcher.`); break; } await new Promise(res => setTimeout(res, 60000)); } if (Date.now() >= deadlineMs) { core.warning(`Watcher hit the deadline while monitoring correlation '${correlationId}'.`); } ================================================ FILE: .github/workflows/playground.yml ================================================ # Pre-defined workflow with workflow_dispatch trigger, # convenient for testing and debugging. name: Playground permissions: contents: read on: workflow_dispatch: jobs: playground: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v6 - name: Run script run: | echo "Hello, world!" ================================================ FILE: .github/workflows/pypi-nightly.yml ================================================ name: PyPI Nightly Build on: schedule: # Run daily at 6:00 AM UTC+8 - cron: '0 22 * * *' workflow_dispatch: # Allow manual trigger jobs: publish-test-pypi: runs-on: ubuntu-latest permissions: id-token: write # IMPORTANT: this permission is mandatory for trusted publishing contents: read steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: astral-sh/setup-uv@v7 with: enable-cache: true - name: Sync dependencies run: uv sync --frozen --no-default-groups --group dev - uses: actions/setup-node@v6 with: node-version: '22' - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Build dashboard run: cd dashboard && npm run build - name: Get current version id: get_version run: | VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/') echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Current version: $VERSION" - name: Create development version run: | # Create a dev version with timestamp TIMESTAMP=$(date +%Y%m%d%H%M%S) DEV_VERSION="${{ steps.get_version.outputs.version }}.dev$TIMESTAMP" echo "Creating dev version: $DEV_VERSION" ./scripts/bump_version.sh "$DEV_VERSION" - name: Build package run: | uv build - name: Publish to Test PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ ================================================ FILE: .github/workflows/pypi-release.yml ================================================ name: PyPI Release on: push: tags: - 'v*' # Trigger on version tags like v1.0.0, v1.2.3, etc. workflow_dispatch: # Allow manual trigger jobs: check-version: runs-on: ubuntu-latest permissions: contents: read outputs: version: ${{ steps.get_version.outputs.version }} tag_version: ${{ steps.get_tag.outputs.tag_version }} steps: - name: Checkout code uses: actions/checkout@v6 - name: Get version from pyproject.toml id: get_version run: | VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/') echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Package version: $VERSION" - name: Get tag version id: get_tag run: | TAG_VERSION=${GITHUB_REF#refs/tags/v} echo "tag_version=$TAG_VERSION" >> $GITHUB_OUTPUT echo "Tag version: $TAG_VERSION" - name: Verify version matches tag run: | if [ "${{ steps.get_version.outputs.version }}" != "${{ steps.get_tag.outputs.tag_version }}" ]; then echo "Error: Version in pyproject.toml (${{ steps.get_version.outputs.version }}) does not match tag (${{ steps.get_tag.outputs.tag_version }})" exit 1 fi echo "Version check passed!" publish-pypi: needs: check-version runs-on: ubuntu-latest permissions: id-token: write # IMPORTANT: this permission is mandatory for trusted publishing contents: read steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: astral-sh/setup-uv@v7 with: enable-cache: true - name: Sync dependencies run: uv sync --frozen --no-default-groups --group dev - uses: actions/setup-node@v6 with: node-version: '22' - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Build dashboard run: cd dashboard && npm run build - name: Build package run: | uv build - name: Verify package contents run: | uv run --locked --no-sync python -m tarfile -l dist/*.tar.gz uv run --locked --no-sync python -m zipfile -l dist/*.whl - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 ================================================ FILE: .github/workflows/tests-full.yml ================================================ name: GPU Test permissions: contents: read on: schedule: # Every day at 5 AM UTC+8 - cron: '0 21 * * *' workflow_dispatch: repository_dispatch: types: [ci-gpu, ci-all] run-name: >- ${{ github.event_name == 'repository_dispatch' && format( 'GPU Test - PR #{0} - {1} - {2}', github.event.client_payload.pull_number, github.event.client_payload.ci_label, github.event.client_payload.correlation_id ) || format('GPU Test - {0}', github.event_name) }} jobs: tests-full: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-gpu' || github.event.action == 'ci-all' name: Full Test (${{ matrix.mark.display-name }}, ${{ matrix.env.setup-script }}, Python ${{ matrix.env.python-version }}) runs-on: ${{ matrix.mark.runs-on }} timeout-minutes: 30 strategy: matrix: mark: - id: store display-name: Store pytest-mark: 'store' # store tests should not require gpu runs-on: ubuntu-latest has-gpu: false # AgentOps needs to be separated because it injects tricky global state. - id: agentops display-name: AgentOps pytest-mark: 'agentops' # including agentops+litellm tests here runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] has-gpu: true # Similar for Weave. - id: weave display-name: Weave pytest-mark: 'weave' runs-on: ubuntu-latest # No GPU tests for Weave. has-gpu: false # Other tests that require GPU - id: gpu display-name: GPU required pytest-mark: '(gpu or llmproxy) and not agentops' runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] has-gpu: true # Other uncovered tests - id: others display-name: Others pytest-mark: 'not store and not agentops and not weave and not gpu and not llmproxy' runs-on: ubuntu-latest has-gpu: false env: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status if: matrix.mark.has-gpu run: nvidia-smi - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.env.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.env.setup-script == 'latest' - name: Sync dependencies (latest, gpu) if: matrix.env.setup-script == 'latest' && matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group langchain --group torch-gpu-stable # Don't install vllm/pytorch on CPU counterparts - name: Sync dependencies (latest, cpu) if: matrix.env.setup-script == 'latest' && !matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group langchain --group core-stable - name: Sync dependencies (stable, gpu) if: matrix.env.setup-script == 'stable' && matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group langchain --group torch-gpu-${{ matrix.env.setup-script }} - name: Sync dependencies (stable, cpu) if: matrix.env.setup-script == 'stable' && !matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group langchain --group core-stable # Don't install langchain for legacy dependency because it has conflicts with torch. - name: Sync dependencies (legacy, gpu) if: matrix.env.setup-script == 'legacy' && matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group torch-gpu-legacy - name: Sync dependencies (legacy, cpu) if: matrix.env.setup-script == 'legacy' && !matrix.mark.has-gpu run: uv sync --frozen --no-default-groups --extra apo --extra weave --extra mongo --group dev --group agents --group core-legacy - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-tests-full-${{ matrix.mark.id }}-${{ matrix.env.python-version }}-${{ matrix.env.setup-script }} path: requirements-freeze.txt compression-level: 0 - uses: actions/setup-node@v6 with: node-version: '22' cache: 'npm' cache-dependency-path: dashboard/package-lock.json - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Build dashboard run: cd dashboard && npm run build - name: Setup Docker environments run: ./scripts/mongodb_docker_run.sh shell: bash - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} # mongo, openai, gpu, all enabled by default - name: Run tests run: | uv run pytest -v --durations=0 tests -m "${{ matrix.mark.pytest-mark }}${{ matrix.env.setup-script == 'legacy' && ' and not langchain' || '' }}" env: PYTEST_ADDOPTS: "--color=yes" OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy AGL_TEST_MONGO_URI: mongodb://localhost:27017/?replicaSet=rs0 minimal-examples: if: > github.event_name != 'repository_dispatch' || github.event.action == 'ci-gpu' || github.event.action == 'ci-all' name: Minimal Examples with Python ${{ matrix.python-version }} (${{ matrix.setup-script }}) runs-on: [self-hosted, 1ES.Pool=agl-runner-gpu] timeout-minutes: 30 strategy: matrix: include: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false steps: - name: Check GPU status run: nvidia-smi - uses: actions/checkout@v6 with: ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.pr_ref || (github.event.pull_request.number && format('refs/pull/{0}/merge', github.event.pull_request.number)) || github.ref }} - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.setup-script == 'latest' - name: Sync dependencies (latest) run: uv sync --frozen --no-default-groups --extra apo --group dev --group agents --group langchain --group torch-gpu-stable if: matrix.setup-script == 'latest' - name: Sync dependencies (stable) run: uv sync --frozen --no-default-groups --extra apo --extra mongo --group dev --group agents --group langchain --group torch-gpu-${{ matrix.setup-script }} if: matrix.setup-script == 'stable' # Don't install langchain for legacy dependency because it has conflicts with torch. - name: Sync dependencies (legacy) run: uv sync --frozen --no-default-groups --extra apo --extra mongo --group dev --group agents --group torch-gpu-legacy if: matrix.setup-script == 'legacy' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-minimal-examples-${{ matrix.python-version }}-${{ matrix.setup-script }} path: requirements-freeze.txt compression-level: 0 - name: Launch LiteLLM Proxy run: | ./scripts/litellm_run.sh env: AZURE_API_BASE: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_BASE }} AZURE_API_KEY: ${{ secrets.AZURE_GROUP_SUBSCRIPTION_API_KEY }} - name: Write Traces via Otel Tracer run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python write_traces.py otel sleep 5 - name: Write Traces via AgentOps Tracer env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python write_traces.py agentops sleep 5 - name: Write Traces with Operations run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python write_traces.py operation sleep 5 - name: Write Traces via Otel Tracer with Client run: | set -euo pipefail source .venv/bin/activate cd examples/minimal agl store --port 45993 --log-level DEBUG & sleep 5 python write_traces.py otel --use-client pkill -f agl && echo "SIGTERM sent to agl" || echo "No agl process found" while pgrep -f agl; do echo "Waiting for agl to finish..." sleep 5 done - name: Write Traces via AgentOps Tracer with Client env: OPENAI_BASE_URL: http://localhost:12306/ OPENAI_API_KEY: dummy run: | set -euo pipefail source .venv/bin/activate cd examples/minimal agl store --port 45993 --log-level DEBUG & sleep 5 python write_traces.py agentops --use-client pkill -f agl && echo "SIGTERM sent to agl" || echo "No agl process found" while pgrep -f agl; do echo "Waiting for agl to finish..." sleep 5 done - name: vLLM Server run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python vllm_server.py Qwen/Qwen2.5-0.5B-Instruct - name: LLM Proxy (OpenAI backend) env: OPENAI_API_BASE: http://localhost:12306/ OPENAI_API_KEY: dummy run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python llm_proxy.py openai gpt-4.1-mini & LLM_PROXY_READY=0 for attempt in $(seq 1 30); do if curl -sSf http://localhost:43886/health > /dev/null 2>&1; then LLM_PROXY_READY=1 break fi sleep 2 done if [[ "$LLM_PROXY_READY" != "1" ]]; then echo "LLM proxy failed to become healthy" >&2 exit 1 fi python llm_proxy.py test gpt-4.1-mini pkill -f llm_proxy.py && echo "SIGTERM sent to llm_proxy.py" || echo "No llm_proxy.py process found" while pgrep -f llm_proxy.py; do echo "Waiting for llm_proxy.py to finish..." sleep 5 done - name: LLM Proxy (vLLM backend) if: matrix.setup-script != 'legacy' # Skip if return_token_ids is not supported run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python llm_proxy.py vllm Qwen/Qwen2.5-0.5B-Instruct & LLM_PROXY_READY=0 for attempt in $(seq 1 30); do if curl -sSf http://localhost:43886/health > /dev/null 2>&1; then LLM_PROXY_READY=1 break fi sleep 2 done if [[ "$LLM_PROXY_READY" != "1" ]]; then echo "LLM proxy failed to become healthy" >&2 exit 1 fi python llm_proxy.py test Qwen/Qwen2.5-0.5B-Instruct pkill -f llm_proxy.py && echo "SIGTERM sent to llm_proxy.py" || echo "No llm_proxy.py process found" while pgrep -f llm_proxy.py; do echo "Waiting for llm_proxy.py to finish..." sleep 5 done - name: MultiMetrics backend example run: | set -euo pipefail source .venv/bin/activate cd examples/minimal python write_metrics.py --duration 8 --prom-port 9105 --prom-host 0.0.0.0 2>&1 | tee metrics.log & pid=$! for attempt in $(seq 1 20); do if curl -sSf http://localhost:9105/metrics | grep -q minimal_requests_total; then echo "Metrics endpoint responding" wait $pid cat metrics.log exit 0 fi sleep 1 done echo "Metrics endpoint did not respond" exit 1 ================================================ FILE: .github/workflows/tests.yml ================================================ name: CPU Test permissions: contents: read on: push: branches: [ main, stable/**/* ] pull_request: branches: [ main, stable/**/* ] workflow_dispatch: schedule: # Every day at noon and midnight - cron: '0 0,12 * * *' jobs: lint: strategy: matrix: setup: [fast, slow, next] fail-fast: false name: Lint - ${{ matrix.setup }} runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: '3.12' - name: Sync dependencies (fast) run: uv sync --frozen --group dev --no-default-groups if: matrix.setup == 'fast' - name: Upgrade dependencies (next) run: uv lock --upgrade if: matrix.setup == 'next' - name: Sync dependencies (slow) run: | uv sync --frozen \ --extra apo \ --extra weave \ --extra verl \ --extra mongo \ --group dev \ --group torch-cpu \ --group torch-stable \ --group trl \ --group tinker \ --group agents \ --group langchain \ --no-default-groups if: matrix.setup != 'fast' # This pre-commit skips JavaScript on purpose. - name: Run pre-commit uses: pre-commit/action@v3.0.1 - name: Check Python headers run: uv run --locked --no-sync scripts/check_headers.py if: matrix.setup == 'fast' - name: Run Black run: uv run --locked --no-sync black --check . if: matrix.setup != 'next' - name: Run isort run: uv run --locked --no-sync isort --check-only . if: matrix.setup != 'next' - name: Run pyright (fast) run: uv run --locked --no-sync pyright -p pyrightconfig.fast.json if: matrix.setup == 'fast' - name: Run pyright (slow) run: uv run --locked --no-sync pyright -p pyrightconfig.json if: matrix.setup != 'fast' lint-js: name: Lint - JavaScript runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: node-version: '22' cache: 'npm' cache-dependency-path: dashboard/package-lock.json - name: Install dependencies run: cd dashboard && npm ci - name: Run ESLint run: cd dashboard && npm run eslint - name: Run Prettier run: cd dashboard && npm run prettier - name: Run Stylelint run: cd dashboard && npm run stylelint - name: Run Typecheck run: cd dashboard && npm run typecheck - name: Verify build run: cd dashboard && npm run build docs: name: Build documentation runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: astral-sh/setup-uv@v7 with: enable-cache: true - name: Sync dependencies run: uv sync --frozen --no-default-groups --group dev - name: Set source commit for docs run: | echo "SOURCE_COMMIT=${{ github.sha }}" >> $GITHUB_ENV - name: Verify OpenAPI specification is up-to-date run: | uv run --locked --no-sync python scripts/export_openapi.py git diff --exit-code docs/assets/store-openapi.json - name: Build documentation run: uv run --locked --no-sync mkdocs build --strict - name: Upload docs artifact uses: actions/upload-artifact@v6 with: name: documentation-site path: site/ compression-level: 6 test: strategy: matrix: mark: # store has many tests and is a good isolated group. - id: store display-name: Store pytest-mark: 'store' # AgentOps needs to be separated because it injects tricky global state. - id: agentops display-name: AgentOps pytest-mark: 'agentops' # Similar for Weave. - id: weave display-name: Weave pytest-mark: 'weave' # litellm proxy tests are slow - id: llmproxy display-name: LLM proxy pytest-mark: 'llmproxy' # Robustness of utilities is important. There are many tests. - id: utils display-name: Utilities pytest-mark: 'utils' # unmarked tests: adapter, execution engine, etc. - id: others display-name: Others pytest-mark: 'not store and not agentops and not weave and not llmproxy and not utils' env: - python-version: '3.10' setup-script: 'legacy' - python-version: '3.11' setup-script: 'stable' - python-version: '3.12' setup-script: 'stable' - python-version: '3.13' setup-script: 'latest' fail-fast: false name: Test (${{ matrix.mark.display-name }}, ${{ matrix.env.setup-script }}, Python ${{ matrix.env.python-version }}) runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@v6 - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: ${{ matrix.env.python-version }} - name: Upgrade dependencies (latest) run: uv lock --upgrade if: matrix.env.setup-script == 'latest' - name: Sync dependencies (latest) run: uv sync --frozen --no-default-groups --extra apo --extra weave --group dev --group agents --group langchain --group core-stable if: matrix.env.setup-script == 'latest' - name: Sync dependencies (stable & legacy) run: uv sync --frozen --no-default-groups --extra apo --extra weave --group dev --group agents --group langchain --group core-${{ matrix.env.setup-script }} if: matrix.env.setup-script != 'latest' - name: Freeze dependencies run: | set -ex uv pip freeze | tee requirements-freeze.txt echo "UV_LOCKED=1" >> $GITHUB_ENV echo "UV_NO_SYNC=1" >> $GITHUB_ENV - name: Upload dependencies artifact uses: actions/upload-artifact@v6 with: name: dependencies-${{ matrix.mark.id }}-${{ matrix.env.python-version }}-${{ matrix.env.setup-script }} path: requirements-freeze.txt compression-level: 0 - uses: actions/setup-node@v6 with: node-version: '22' cache: 'npm' cache-dependency-path: dashboard/package-lock.json - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Build dashboard run: cd dashboard && npm run build - name: Run tests run: | uv run pytest -v --durations=0 tests -m "not mongo and not openai and not gpu and (${{ matrix.mark.pytest-mark }})" env: PYTEST_ADDOPTS: "--color=yes" test-js: name: Test (JavaScript) runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '22' cache: 'npm' cache-dependency-path: dashboard/package-lock.json - uses: astral-sh/setup-uv@v7 with: enable-cache: true python-version: '3.12' - name: Sync Python dependencies run: uv sync --frozen --no-default-groups --extra apo --group dev --group agents --group core-stable - name: Install JavaScript dependencies run: cd dashboard && npm ci - name: Run vitest run: cd dashboard && npm run vitest ================================================ FILE: .gitignore ================================================ # Agentlightning specific files verl_old meta-llama/** **/debug/**/*.png **/debug/**/*.json requirements-freeze*.txt /playground # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # UV # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. #uv.lock # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. #pdm.lock # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it # in version control. # https://pdm.fming.dev/latest/usage/project/#working-with-version-control .pdm.toml .pdm-python .pdm-build/ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # MacOS .DS_Store # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ # Abstra # Abstra is an AI-powered process automation framework. # Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs .abstra/ # Visual Studio Code # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore # and can be added to the global gitignore or merged into this file. However, if you prefer, # you could uncomment the following to ignore the enitre vscode folder .vscode/ # Emacs backup files *~ # Ruff stuff: .ruff_cache/ # PyPI configuration file .pypirc # Cursor # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data # refer to https://docs.cursor.com/context/ignore-files .cursorignore .cursorindexingignore # Claude .claude/*.local.json # Dashboard generated files agentlightning/dashboard/**/*.css agentlightning/dashboard/**/*.js agentlightning/dashboard/**/*.html agentlightning/dashboard/**/*.svg # Docker data docker/data/ ================================================ FILE: .pre-commit-config.yaml ================================================ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: end-of-file-fixer exclude: (.*store-openapi\.json$) - id: trailing-whitespace - id: check-yaml exclude: ^mkdocs\.yml$ - id: check-toml - id: check-added-large-files args: ["--maxkb=1024"] exclude: (^uv\.lock$)|(^docs/assets/.*\.svg$)|(.*store-openapi\.json$) - id: check-shebang-scripts-are-executable - id: detect-private-key - repo: https://github.com/pycqa/isort rev: 6.0.1 hooks: - id: isort args: ["."] - repo: https://github.com/psf/black rev: 25.1.0 hooks: - id: black pass_filenames: false always_run: true args: ["."] - repo: local hooks: - id: prettier name: prettier (dashboard) language: system pass_filenames: false always_run: true entry: > bash -c ' cd dashboard || exit 1 if [ -d node_modules ]; then echo "✅ node_modules already exists" npx prettier --cache --write "**/*.{ts,tsx,mjs,cjs}" else echo "⚠️ node_modules not found — npx is not reliable. Skipping." fi ' - id: eslint name: eslint (dashboard) language: system pass_filenames: false always_run: true entry: > bash -c ' cd dashboard || exit 1 if [ -d node_modules ]; then echo "✅ node_modules already exists" npx eslint --cache --fix . else echo "⚠️ node_modules not found — npx is not reliable. Skipping." fi ' - id: stylelint name: stylelint (dashboard) language: system pass_filenames: false always_run: true entry: > bash -c ' cd dashboard || exit 1 if [ -d node_modules ]; then echo "✅ node_modules already exists" npx stylelint --cache --fix "**/*.css" else echo "⚠️ node_modules not found — npx is not reliable. Skipping." fi ' ================================================ FILE: .python-version ================================================ 3.12 ================================================ FILE: AGENTS.md ================================================ # Repository Guidelines ## Architecture Overview Agent Lightning runs through a continuous loop: runners and tracers emit spans, `LightningStore` (`agentlightning/store/`) keeps them synchronized, and algorithms in `agentlightning/algorithm/` consume those traces to improve behavior. ## Project Structure & Module Organization - `agentlightning/`: adapters, execution stack, training loop, tracer, reward logic, and the `agl` CLI. - `docs/` & `examples/`: narrative and procedural docs (assets in `docs/assets/`, navigation in `mkdocs.yml`) plus runnable workflows whose READMEs point to their companion how-to guides. `docs/how-to` covers task-focused instructions, while `docs/tutorials` explains concepts and subsystems. - `dashboard/`, `scripts/`, `tests/`: UI bundles, release/dataset/CI automation, and mirrored coverage of the runtime tree. Record download steps rather than committing binaries. ## Build, Test, and Development Commands - `uv sync --group dev` — provision tooling once per environment. - `uv run --no-sync pytest -v` — execute the full suite; add a path or `-k expr` to narrow the run. - `uv run --no-sync pyright` — enforce static typing parity with CI. - `uv run --no-sync pre-commit run --all-files --show-diff-on-failure` and `uv run --no-sync mkdocs build --strict` — keep formatting tidy and documentation valid. Always commit the refreshed `uv.lock` when dependencies shift, and mention optional groups (VERL, APO, GPU) in PR notes. ## Common Issues & Fixes - When `uv run` errors with `Permission denied` under `~/.cache`, override both cache locations inline: ``UV_CACHE="$(pwd)/.cache_uv" XDG_CACHE_HOME="$(pwd)/.cache_xdg" uv run --no-sync ``. ## Coding Style & Naming Conventions - Target `requires-python >= 3.10`, four-space indentation, 120-character lines (though docstrings may run longer), and formatter-owned diffs (Black + isort, `black` profile). Use `snake_case` for modules, functions, and variables; `PascalCase` for classes and React components; lowercase hyphenation for CLI flags, branch names, and TypeScript filenames. - Maintain exhaustive type hints (pyright enforces them) and prefer shared dataclasses or Pydantic models from `agentlightning.types`. - Author Google-style docstrings for new modules or public methods—succinct descriptions, no redundant type info, no redundant `Key features/components` bullet points. Use mkdocs styles: `[][]` syntax for cross-references and single backticks for inline code blocks. - Writing logs is encouraged, especially for long functions with multiple steps and try-except blocks that catch all exceptions. Use `logging.getLogger(__name__)` to get loggers. Distinguish between DEBUG, INFO, WARNING, and ERROR logs. ## Testing Guidelines - Mirror runtime directories under `tests/` and match filenames for quick traceability. - Parametrize pytest cases and apply markers (`openai`, `gpu`, `agentops`, `mongo`, `llmproxy`) so optional suites can be skipped via selectors like `-m "not mongo"` yet still exercised in CI. - Lean on fixtures, favor real stores/spans/agents over mocks, and drive coverage across the majority of branches. - If an imported module is missing from the environment, check whether `uv sync` has been run with the right groups. Do not make stubs for external dependencies unless necessary. ## Example Contributions - Ship each example with a README that includes smoke-test instructions so maintainers can validate quickly. The README must contain an "Included Files" section summarizing every file and its role. - Keep runnable example modules self-contained with a module-level docstring describing CLI usage. Document important or educational classes/functions with targeted docstrings and inline comments where clarity matters. - Add a CI workflow per example named `examples-.yml` in `.github/workflows/`. Register it in `badge-.yml`, `badge-examples.yml`, and `badge-latest.yml` when applicable so badges stay accurate. ## Commit & Pull Request Guidelines - Branch from a fresh `main` using `feature/`, `fix/`, `docs/`, or `chore/`. - Write imperative, scoped commits, reference issues with `Fixes #123`, and rerun pre-commit plus the relevant pytest/doc builds before pushing. - Use PR descriptions to summarize intent, list verification commands, call out dependency or docs-navigation updates, and link new docs/examples via `mkdocs.yml` or `examples/README.md`. Include logs for dashboard changes. ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: RAI_README.md ================================================ # Responsible AI Transparency Documentation - Agent Lightning ## OVERVIEW Agent Lightning is a flexible and extensible framework that enables seamless agent optimization for any existing agent framework. Agent optimization includes various data-driven techniques to customize the agent for better performance, including but not limited to model fine-tuning, prompt tuning, and model selection. And the agent frameworks refer to popular and easy-to-use agent developing frameworks such as OpenAI Agents SDK, Microsoft AutoGen, and LangChain. ### WHAT CAN AGENT LIGHTNING DO Agent lightning was developed to bridge the gap between agent workflow development and agent optimization, empowering developers to go beyond static, pre-trained models and unlock the full potential of adaptive, learning-based agents. Agent Lightning is a training framework which can be used for any LLMs. ### INTENDED USES Agent Lightning is best suited for agent researchers and developers. They can easily fine-tune models in existing agent frameworks with Agent Lightning. This can improve model performance on the targeted scenarios. ### OUT-OF-SCOPE USES Agent Lightning is not well-suited for users who are not familiar with agent development and machine learning concepts. We do not recommend using Agent Lightning in commercial or real-world applications without further testing and development. It is being released for research purposes. Agent Lightning was not designed or evaluated for all possible downstream purposes. Developers should consider its inherent limitations as they select use cases, and evaluate and mitigate for accuracy, safety, and fairness concerns specific to each intended downstream use. Agent Lightning should not be used in highly regulated domains where inaccurate outputs could suggest actions that lead to injury or negatively impact an individual's legal, financial, or life opportunities. We do not recommend using Agent Lightning in the context of high-risk decision making (e.g. in law enforcement, legal, finance, or healthcare). ## HOW TO GET STARTED To begin using Agent Lightning, here are some instructions. 1. Install dependencies, including Python, uv, PyTorch, FlashAttention, vLLM, verl. 2. Clone and install Agent Lightning. 3. Convert the dataset (provided by the user) into parquet file, which contains multiple columns. Each column contains a data id, an input and an expected output. 4. Run agent, which is developed by the user. 5. Run the training process via “bash train.sh” ## EVALUATION Agent Lightning was evaluated on its ability to correctly complete 3 example tasks: (1) Math. The model needs to answer some math questions, and when answering one question, the model can use the calculator as its tool to help answer. (2) Text2SQL. The model is given a question related to the database, and it is required to generate a SQL which can query the database, find the information to answer the question. (3) Retrieval-Augmented Generation (RAG). The model is given a question which needs some information from Wikipedia to answer. The model is required to generate some queries to find the related information in Wikipedia, and answer the question according to retrieved documents. ### EVALUATION METHODS AND RESULTS For detailed evaluation methods and results, please refer to the latest version of our [technical report](https://arxiv.org/abs/2508.03680). ## LIMITATIONS Agent Lightning was developed for research and experimental purposes. Further testing and validation are needed before considering its application in commercial or real-world scenarios. Agent Lightning was designed and tested using the English language. Performance in other languages may vary and should be assessed by someone who is both an expert in the expected outputs and a native speaker of that language. Outputs generated by AI may include factual errors, fabrication, or speculation. Users are responsible for assessing the accuracy of generated content. All decisions leveraging outputs of the system should be made with human oversight and not be based solely on system outputs. Agent Lightning inherits any biases, errors, or omissions produced by its base model. Developers are advised to choose an appropriate base LLM/MLLM carefully, depending on the intended use case. We use some demo cases to show the effectiveness of our training framework. See their links to understand the capabilities and limitations of this model. ## BEST PRACTICES Better performance can be achieved by following the instructions in how to get started section. We strongly encourage users to use LLMs/MLLMs that support robust Responsible AI mitigations, such as Azure Open AI (AOAI) services. Such services continually update their safety and RAI mitigations with the latest industry standards for responsible use. For more on AOAI’s best practices when employing foundations models for scripts and applications: - [Blog post on responsible AI features in AOAI that were presented at Ignite 2023](https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/announcing-new-ai-safety-amp-responsible-ai-features-in-azure/ba-p/3983686) - [Overview of Responsible AI practices for Azure OpenAI models](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/overview) - [Azure OpenAI Transparency Note](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/transparency-note) - [OpenAI’s Usage policies](https://openai.com/policies/usage-policies) - [Azure OpenAI’s Code of Conduct](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/code-of-conduct) Users are responsible for sourcing their datasets legally and ethically. This could include securing appropriate rights, ensuring consent for use of audio/images, and/or the anonymization of data prior to use in research. Users are reminded to be mindful of data privacy concerns and are encouraged to review the privacy policies associated with any models and data storage solutions interfacing with Agent Lightning. It is the user’s responsibility to ensure that the use of Agent Lightning complies with relevant data protection regulations and organizational guidelines. ## LICENSE We use the MIT license. ## CONTACT We welcome feedback and collaboration from our audience. If you have suggestions, questions, or observe unexpected/offensive behavior in our technology, please contact us at agent-lightning@microsoft.com. If the team receives reports of undesired behavior or identifies issues independently, we will update this repository with appropriate mitigations. --- *Last updated: September 6, 2025* *Document version: 1.0* ================================================ FILE: README.md ================================================

Agent-lightning-banner

# Agent Lightning⚡ [![Unit Tests](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml) [![Documentation](https://img.shields.io/badge/GitHub%20Pages-Documentation-blue)](https://microsoft.github.io/agent-lightning/) [![PyPI version](https://badge.fury.io/py/agentlightning.svg)](https://badge.fury.io/py/agentlightning) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/microsoft/agent-lightning) [![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/RYk7CdvDR7) **The absolute trainer to light up AI agents.** Join our [Discord community](https://discord.gg/RYk7CdvDR7) to connect with other users and contributors. ## ⚡ Core Features - Turn your agent into an optimizable beast with **ZERO CODE CHANGE** (almost)! 💤 - Build with **ANY** agent framework (LangChain, OpenAI Agent SDK, AutoGen, CrewAI, Microsoft Agent Framework...); or even WITHOUT agent framework (Python OpenAI). You name it! 🤖 - **Selectively** optimize one or more agents in a multi-agent system. 🎯 - Embraces **Algorithms** like Reinforcement Learning, Automatic Prompt Optimization, Supervised Fine-tuning and more. 🤗 Read more on our [documentation website](https://microsoft.github.io/agent-lightning/).

Agent-Lightning Core Quickstart

## ⚡ Installation ```bash pip install agentlightning ``` For the latest nightly build (cutting-edge features), you can install from Test PyPI: ```bash pip install --upgrade --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ --pre agentlightning ``` Please refer to our [installation guide](https://microsoft.github.io/agent-lightning/stable/tutorials/installation/) for more details. To start using Agent-lightning, check out our [documentation](https://microsoft.github.io/agent-lightning/) and [examples](./examples). ## ⚡ Articles - 12/17/2025 [Adopting the Trajectory Level Aggregation for Faster Training](https://agent-lightning.github.io/posts/trajectory_level_aggregation/) Agent-lightning blog. - 11/4/2025 [Tuning ANY AI agent with Tinker ✕ Agent-lightning](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-1-1d8c9a397f0e) Medium. See also [Part 2](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-2-332c5437f0dc). - 10/22/2025 [No More Retokenization Drift: Returning Token IDs via the OpenAI Compatible API Matters in Agent RL](https://blog.vllm.ai/2025/10/22/agent-lightning.html) vLLM blog. See also [Zhihu writeup](https://zhuanlan.zhihu.com/p/1965067274642785725). - 8/11/2025 [Training AI Agents to Write and Self-correct SQL with Reinforcement Learning](https://medium.com/@yugez/training-ai-agents-to-write-and-self-correct-sql-with-reinforcement-learning-571ed31281ad) Medium. - 8/5/2025 [Agent Lightning: Train ANY AI Agents with Reinforcement Learning](https://arxiv.org/abs/2508.03680) arXiv paper. - 7/26/2025 [We discovered an approach to train any AI agent with RL, with (almost) zero code changes.](https://www.reddit.com/r/LocalLLaMA/comments/1m9m670/we_discovered_an_approach_to_train_any_ai_agent/) Reddit. - 6/6/2025 [Agent Lightning - Microsoft Research](https://www.microsoft.com/en-us/research/project/agent-lightning/) Project page. ## ⚡ Community Projects - [DeepWerewolf](https://github.com/af-74413592/DeepWerewolf) — A case study of agent RL training for the Chinese Werewolf game built with AgentScope and Agent Lightning. - [AgentFlow](https://agentflow.stanford.edu/) — A modular multi-agent framework that combines planner, executor, verifier, and generator agents with the Flow-GRPO algorithm to tackle long-horizon, sparse-reward tasks. - [Youtu-Agent](https://github.com/TencentCloudADP/Youtu-agent) — Youtu-Agent lets you build and train your agent with ease. Built with [a modified branch](https://github.com/microsoft/agent-lightning/tree/contrib/youtu-agent-lightning) of Agent Lightning, Youtu-Agent has verified up to 128 GPUs RL training on maths/code and search capabilities with steady convergence. Also check [the recipe](https://github.com/TencentCloudADP/youtu-agent/tree/rl/agl) and their blog [*Stop Wrestling with Your Agent RL: How Youtu-Agent Achieved Stable, 128-GPU Scaling Without Breaking a Sweat*](https://spotted-coconut-df8.notion.site/Stop-Wrestling-with-Your-Agent-RL-How-Youtu-Agent-Achieved-Stable-128-GPU-Scaling-Without-Breaking-2ca5e8f089ba80539a98c582b65e0233). ## ⚡ Architecture Agent Lightning keeps the moving parts to a minimum so you can focus on your idea, not the plumbing. Your agent continues to run as usual; you can still use any agent framework you like; you drop in the lightweight `agl.emit_xxx()` helper, or let the tracer collect every prompt, tool call, and reward. Those events become structured spans that flow into the LightningStore, a central hub that keeps tasks, resources, and traces in sync. On the other side of the store sits the algorithm you choose, or write yourself. The algorithm reads spans, learns from them, and posts updated resources such as refined prompt templates or new policy weights. The Trainer ties it all together: it streams datasets to runners, ferries resources between the store and the algorithm, and updates the inference engine when improvements land. You can either stop there, or simply let the same loop keep turning. No rewrites, no lock-in, just a clear path from first rollout to steady improvement.

Agent-lightning Architecture

## ⚡ CI Status | Workflow | Status | |----------|--------| | CPU Tests | [![tests workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/tests.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/tests.yml) | | Full Tests | [![tests summary workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml) | | UI Tests | [![UI Tests](https://github.com/microsoft/agent-lightning/actions/workflows/dashboard.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/dashboard.yml) | | Examples Integration | [![examples summary workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-examples.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-examples.yml) | | Latest Dependency Compatibility | [![latest summary workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-latest.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-latest.yml) | | Legacy Examples Compatibility | [![compat summary workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-compat.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-compat.yml) | ## ⚡ Citation If you find Agent Lightning useful in your research or projects, please cite our paper: ```bibtex @misc{luo2025agentlightningtrainai, title={Agent Lightning: Train ANY AI Agents with Reinforcement Learning}, author={Xufang Luo and Yuge Zhang and Zhiyuan He and Zilong Wang and Siyun Zhao and Dongsheng Li and Luna K. Qiu and Yuqing Yang}, year={2025}, eprint={2508.03680}, archivePrefix={arXiv}, primaryClass={cs.AI}, url={https://arxiv.org/abs/2508.03680}, } ``` ## ⚡ Contributing This project welcomes contributions and suggestions. Start by reading the [Contributing Guide](docs/community/contributing.md) for recommended contribution points, environment setup, branching conventions, and pull request expectations. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. ## ⚡ Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies. ## ⚡ Responsible AI This project has been evaluated and certified to comply with the Microsoft Responsible AI Standard. The team will continue to monitor and maintain the repository, addressing any severe issues, including potential harms, if they arise. ## ⚡ License This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. ================================================ FILE: SECURITY.md ================================================ ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories in our GitHub organizations. **Please do not report security vulnerabilities through public GitHub issues.** For security reporting information, locations, contact information, and policies, please review the latest guidance for Microsoft repositories at [https://aka.ms/SECURITY.md](https://aka.ms/SECURITY.md). ================================================ FILE: agentlightning/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. __version__ = "0.3.1" from .adapter import * from .algorithm import * from .client import AgentLightningClient, DevTaskLoader # deprecated # type: ignore from .config import * from .emitter import * from .env_var import * from .execution import * from .litagent import * from .llm_proxy import * from .logging import configure_logger # deprecated # type: ignore from .logging import setup as setup_logging # type: ignore from .logging import setup_module as setup_module_logging # type: ignore from .runner import * from .server import AgentLightningServer # deprecated # type: ignore from .store import * from .tracer import * from .trainer import * from .types import * ================================================ FILE: agentlightning/adapter/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .base import Adapter, OtelTraceAdapter, TraceAdapter from .messages import TraceToMessages from .triplet import LlmProxyTraceToTriplet, TracerTraceToTriplet, TraceToTripletBase __all__ = [ "TraceAdapter", "OtelTraceAdapter", "Adapter", "TraceToTripletBase", "TracerTraceToTriplet", "LlmProxyTraceToTriplet", "TraceToMessages", ] ================================================ FILE: agentlightning/adapter/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from typing import Generic, Sequence, TypeVar from opentelemetry.sdk.trace import ReadableSpan from agentlightning.types import Span T_from = TypeVar("T_from") T_to = TypeVar("T_to") class Adapter(Generic[T_from, T_to]): """Base class for synchronous adapters that convert data from one format to another. The class defines a minimal protocol so that adapters can be treated like callables while still allowing subclasses to supply the concrete transformation logic. !!! note Subclasses must override [`adapt()`][agentlightning.Adapter.adapt] to provide the actual conversion. Type Variables: T_from: Source data type supplied to the adapter. T_to: Target data type produced by the adapter. Examples: >>> class IntToStrAdapter(Adapter[int, str]): ... def adapt(self, source: int) -> str: ... return str(source) ... >>> adapter = IntToStrAdapter() >>> adapter(42) '42' """ def __call__(self, source: T_from, /) -> T_to: """Convert the data to the target format. This method delegates to [`adapt()`][agentlightning.Adapter.adapt] so that an instance of [`Adapter`][agentlightning.Adapter] can be used like a standard function. Args: source: Input data in the source format. Returns: Data converted to the target format. """ return self.adapt(source) def adapt(self, source: T_from, /) -> T_to: """Convert the data to the target format. Subclasses must override this method with the concrete transformation logic. The base implementation raises `NotImplementedError` to make the requirement explicit. Args: source: Input data in the source format. Returns: Data converted to the target format. """ raise NotImplementedError("Adapter.adapt() is not implemented") class OtelTraceAdapter(Adapter[Sequence[ReadableSpan], T_to], Generic[T_to]): """Base class for adapters that convert OpenTelemetry trace spans into other formats. This specialization of [`Adapter`][agentlightning.Adapter] expects a list of `opentelemetry.sdk.trace.ReadableSpan` instances and produces any target format, such as reinforcement learning trajectories, structured logs, or analytics-ready payloads. Examples: >>> class TraceToDictAdapter(OtelTraceAdapter[dict]): ... def adapt(self, spans: List[ReadableSpan]) -> dict: ... return {"count": len(spans)} ... >>> adapter = TraceToDictAdapter() >>> adapter([span1, span2]) {'count': 2} """ class TraceAdapter(Adapter[Sequence[Span], T_to], Generic[T_to]): """Base class for adapters that convert trace spans into other formats. This class specializes [`Adapter`][agentlightning.Adapter] for working with [`Span`][agentlightning.Span] instances emitted by Agent Lightning instrumentation. Subclasses receive entire trace slices and return a format suited for the downstream consumer, for example reinforcement learning training data or observability metrics. """ ================================================ FILE: agentlightning/adapter/messages.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import json from collections import defaultdict from typing import TYPE_CHECKING, Any, Dict, Generator, Iterable, List, Optional, Sequence, TypedDict, Union, cast from pydantic import TypeAdapter from agentlightning.types import Span from .base import TraceAdapter if TYPE_CHECKING: from openai.types.chat import ( ChatCompletionFunctionToolParam, ChatCompletionMessageFunctionToolCallParam, ChatCompletionMessageParam, ) class OpenAIMessages(TypedDict): """OpenAI-style chat messages with optional tool definitions. Attributes: messages: Ordered chat messages that describe the conversation. tools: Tool specifications available to the assistant, if any. """ messages: List[ChatCompletionMessageParam] tools: Optional[List[ChatCompletionFunctionToolParam]] class _RawSpanInfo(TypedDict): """Intermediate representation parsed from a span. Attributes: prompt: Prompt messages reconstructed from span attributes. completion: Assistant completions following tool invocations. request: Request payload recorded in the trace. response: Response payload recorded in the trace. tools: Tool call metadata extracted from child spans. """ prompt: List[Dict[str, Any]] completion: List[Dict[str, Any]] request: Dict[str, Any] response: Dict[str, Any] tools: List[Dict[str, Any]] def group_genai_dict(data: Dict[str, Any], prefix: str) -> Union[Dict[str, Any], List[Any]]: """Convert flattened trace attributes into nested structures. Attributes emitted by the tracing pipeline often arrive as dotted paths (for example `gen_ai.prompt.0.role`). This helper groups those keys into nested dictionaries or lists so that downstream processing can operate on structured data. Args: data: Flat dictionary whose keys are dotted paths. prefix: Top-level key (for example `gen_ai.prompt`) that determines which attributes are grouped. Returns: A nested dictionary (no numeric index detected) or list (numeric indices detected) containing the grouped values. """ result: Union[Dict[str, Any], List[Any]] = {} # Collect keys that match the prefix relevant = {k[len(prefix) + 1 :]: v for k, v in data.items() if k.startswith(prefix + ".")} # Detect if we have numeric indices (-> list) or not (-> dict) indexed = any(part.split(".")[0].isdigit() for part in relevant.keys()) if indexed: # Group by index grouped: Dict[int, Dict[str, Any]] = defaultdict(dict) for k, v in relevant.items(): parts = k.split(".") if not parts[0].isdigit(): continue idx, rest = int(parts[0]), ".".join(parts[1:]) grouped[idx][rest] = v # Recursively build result = [] for i in sorted(grouped.keys()): result.append(group_genai_dict({f"{prefix}.{rest}": val for rest, val in grouped[i].items()}, prefix)) else: # No indices: build dict nested: Dict[str, Any] = defaultdict(dict) for k, v in relevant.items(): if "." in k: head, _tail = k.split(".", 1) nested[head][f"{prefix}.{k}"] = v else: result[k] = v # Recurse into nested dicts for head, subdict in nested.items(): result[head] = group_genai_dict(subdict, prefix + "." + head) return result def convert_to_openai_messages(prompt_completion_list: List[_RawSpanInfo]) -> Generator[OpenAIMessages, None, None]: """Convert raw trace payloads into OpenAI-style chat messages. The function consumes an iterable produced by [`TraceToMessages.adapt()`][agentlightning.TraceToMessages.adapt] and yields structures that match the OpenAI fine-tuning JSONL schema, including tool definitions. Args: prompt_completion_list: Raw prompt/completion/tool payloads extracted from a trace. Returns: A generator that yields [`OpenAIMessages`][agentlightning.adapter.messages.OpenAIMessages] entries compatible with the OpenAI Functions fine-tuning format. """ # Import locally to avoid legacy OpenAI version type import errors from openai.types.chat import ( ChatCompletionAssistantMessageParam, ChatCompletionFunctionToolParam, ChatCompletionMessageFunctionToolCallParam, ChatCompletionMessageParam, ) for pc_entry in prompt_completion_list: messages: List[ChatCompletionMessageParam] = [] # Extract messages for msg in pc_entry["prompt"]: role = msg["role"] if role == "assistant" and "tool_calls" in msg: # Use the tool_calls directly # This branch is usually not used in the wild. tool_calls: List[ChatCompletionMessageFunctionToolCallParam] = [ ChatCompletionMessageFunctionToolCallParam( id=call["id"], type="function", function={"name": call["name"], "arguments": call["arguments"]}, ) for call in msg["tool_calls"] ] messages.append( ChatCompletionAssistantMessageParam(role="assistant", content=None, tool_calls=tool_calls) ) else: # Normal user/system/tool content message = cast( ChatCompletionMessageParam, TypeAdapter(ChatCompletionMessageParam).validate_python( dict(role=role, content=msg.get("content", ""), tool_call_id=msg.get("tool_call_id", None)) ), ) messages.append(message) # Extract completions (assistant outputs after tool responses) for comp in pc_entry["completion"]: if comp.get("role") == "assistant": content = comp.get("content") if pc_entry["tools"]: tool_calls = [ ChatCompletionMessageFunctionToolCallParam( id=tool["call"]["id"], type=tool["call"]["type"], function={"name": tool["name"], "arguments": tool["parameters"]}, ) for tool in pc_entry["tools"] ] messages.append( ChatCompletionAssistantMessageParam(role="assistant", content=content, tool_calls=tool_calls) ) else: messages.append(ChatCompletionAssistantMessageParam(role="assistant", content=content)) # Build tools definitions (if available) if "functions" in pc_entry["request"]: tools = [ ChatCompletionFunctionToolParam( type="function", function={ "name": fn["name"], "description": fn.get("description", ""), "parameters": ( json.loads(fn["parameters"]) if isinstance(fn["parameters"], str) else fn["parameters"] ), }, ) for fn in pc_entry["request"]["functions"] ] yield OpenAIMessages(messages=messages, tools=tools) else: yield OpenAIMessages(messages=messages, tools=None) class TraceToMessages(TraceAdapter[List[OpenAIMessages]]): """Convert trace spans into OpenAI-compatible conversation messages. The adapter reconstructs prompts, completions, tool calls, and function definitions from `gen_ai.*` span attributes. The resulting objects match the JSONL structure expected by the OpenAI fine-tuning pipeline. !!! warning The adapter assumes all spans share a common trace and that tool call spans are direct children of the associated completion span. """ def get_tool_calls(self, completion: Span, all_spans: Sequence[Span], /) -> Iterable[Dict[str, Any]]: """Yield tool call payloads for a completion span. Args: completion: The completion span whose descendants should be inspected. all_spans: The complete span list belonging to the trace. Yields: Dictionaries describing tool calls with identifiers, names, and arguments. Raises: ValueError: If a candidate tool span cannot be converted into a dictionary. """ # Get all the spans that are children of the completion span children = [span for span in all_spans if span.parent_id == completion.span_id] # Get the tool calls from the children for maybe_tool_call in children: tool_call = group_genai_dict(maybe_tool_call.attributes, "tool") if not isinstance(tool_call, dict): raise ValueError(f"Extracted tool call from trace is not a dict: {tool_call}") if tool_call: yield tool_call def adapt(self, source: Sequence[Span], /) -> List[OpenAIMessages]: """Transform trace spans into OpenAI chat payloads. Args: source: Spans containing `gen_ai.*` attributes emitted by the tracing pipeline. Returns: A list of [`OpenAIMessages`][agentlightning.adapter.messages.OpenAIMessages] entries that capture prompts, completions, tools, and metadata. """ raw_prompt_completions: List[_RawSpanInfo] = [] for span in source: attributes = {k: v for k, v in span.attributes.items()} # Get all related information from the trace span prompt = group_genai_dict(attributes, "gen_ai.prompt") or [] completion = group_genai_dict(attributes, "gen_ai.completion") or [] request = group_genai_dict(attributes, "gen_ai.request") or {} response = group_genai_dict(attributes, "gen_ai.response") or {} if not isinstance(prompt, list): raise ValueError(f"Extracted prompt from trace is not a list: {prompt}") if not isinstance(completion, list): raise ValueError(f"Extracted completion from trace is not a list: {completion}") if not isinstance(request, dict): raise ValueError(f"Extracted request from trace is not a dict: {request}") if not isinstance(response, dict): raise ValueError(f"Extracted response from trace is not a dict: {response}") if prompt or completion or request or response: tools = list(self.get_tool_calls(span, source)) or [] raw_prompt_completions.append( _RawSpanInfo( prompt=prompt or [], completion=completion, request=request, response=response, tools=tools ) ) return list(convert_to_openai_messages(raw_prompt_completions)) ================================================ FILE: agentlightning/adapter/triplet.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import json import logging import re from enum import Enum from typing import Any, Dict, List, Optional, Sequence, Tuple, Union, cast from opentelemetry.sdk.trace import ReadableSpan from pydantic import BaseModel from agentlightning.emitter.reward import get_reward_value from agentlightning.semconv import AGL_OPERATION, AGL_REWARD, LightningSpanAttributes from agentlightning.types import Span, Triplet from agentlightning.utils.otel import filter_and_unflatten_attributes from .base import TraceAdapter logger = logging.getLogger(__name__) def _attributes_get_multiple(attributes: Dict[str, Any], keys: List[str]) -> Optional[str]: """Get a string from the attributes, if present. If there are multiple matches, the first one is returned. """ for key in keys: if key in attributes: if isinstance(attributes[key], str): return attributes[key] else: logger.warning(f"Attribute {key} is found but is not a string: {attributes[key]}") return None def _attributes_get_ids_multiple(attributes: Dict[str, Any], keys: List[str]) -> Optional[List[int]]: """Get a list of integers from the attributes, if present. If there are multiple matches, the first one is returned. """ for key in keys: if key in attributes: if (isinstance(attributes[key], list) or isinstance(attributes[key], tuple)) and all( isinstance(x, int) for x in attributes[key] ): return list(attributes[key]) else: logger.warning(f"Attribute {key} is found but is not a list of integers: {attributes[key]}") return None def _attributes_unflatten_multiple( attributes: Dict[str, Any], keys: List[str] ) -> Union[Dict[str, Any], List[Any], None]: """Unflatten the attributes, if present. If there are multiple matches, the first one is returned. """ for key in keys: result = filter_and_unflatten_attributes(attributes, key) if result: return result return None class Transition(BaseModel): """A single transition within a reinforcement learning trajectory. Attributes: state: Token identifiers describing the model input state. action: Token identifiers representing the model output. response_id: Identifier of the LLM response used to deduplicate spans. agent_name: Human-readable agent name captured from the trace. reward: Scalar reward associated with the transition, if available. """ state: List[int] action: List[int] response_id: Optional[str] # action_logprobs: List[float] agent_name: str reward: Optional[float] class RewardMatchPolicy(str, Enum): """Strategies for matching rewards to LLM call spans. !!! note Each reward span must expose a payload shaped like `{"type": "reward", "value": |None}` as described in `reward.py`. """ FIRST_SIBLING = "first_sibling" """Use the first sibling in the current trace subtree as the reward unless another LLM call match is found.""" FIRST_OCCURRENCE = "first_occurrence" """Use the first reward encountered in chronological order after the current LLM call match.""" class TraceTree: """Tree representation of a trace span and its descendants. Attributes: id: Unique identifier for the span node. span: [`Span`][agentlightning.Span] backing this node. children: Child nodes connected to the current span. """ def __init__( self, id: str, span: Span, children: Optional[List["TraceTree"]] = None, ): self.id = id self.span = span self.children = children or [] @property def start_time(self): return self.span.start_time @property def end_time(self): return self.span.end_time def find_id(self, id: str) -> "TraceTree | None": if self.id == id: return self for child in self.children: found = child.find_id(id) if found: return found return None def add_child(self, child: "TraceTree") -> None: self.children.append(child) def visualize(self, filename: str, interested_span_match: str | None = None) -> None: """Render the trace tree with Graphviz for debugging purposes. Args: filename: Base filename for the generated `.png` diagram. interested_span_match: Optional regular expression used to keep only matching spans (and their ancestors) in the output. !!! note The method requires the optional `graphviz` dependency to be available in the runtime environment. """ import graphviz dot = graphviz.Digraph(comment="Trace Tree") should_visit_cache: Dict[str, bool] = {} def should_visit(node: "TraceTree") -> bool: if node.id in should_visit_cache: return should_visit_cache[node.id] if interested_span_match is not None: if re.search(interested_span_match, node.span.name): should_visit_cache[node.id] = True return True else: should_visit_cache[node.id] = False for child in node.children: if should_visit(child): should_visit_cache[node.id] = True return should_visit_cache[node.id] else: return True def visit(node: "TraceTree") -> bool: if not should_visit(node): return False agent_name = node.agent_name() vis_name = node.id[-8:] + " (" + node.span.name + ")" if agent_name is not None: vis_name += " [" + agent_name + "]" dot.node(node.id, vis_name) # type: ignore for child in node.children: if visit(child): dot.edge(node.id, child.id) # type: ignore return True visit(self) dot.render(filename, format="png", cleanup=True) # type: ignore def names_tuple(self) -> Tuple[str, List[Any]]: """Return the span name alongside nested child names. Returns: A tuple of the current span name and a list of tuples for each child containing the child name and its descendants. """ name = self.span.name agent_name = self.agent_name() if agent_name is not None: name += " [" + agent_name + "]" children_names: List[Tuple[str, List[Any]]] = [] for child in self.children: child_name, child_children = child.names_tuple() children_names.append((child_name, child_children)) return name, children_names def traverse(self) -> List["TraceTree"]: """Traverse the tree depth first and return every node.""" spans: List["TraceTree"] = [self] for child in self.children: spans.extend(child.traverse()) return spans def to_json(self) -> dict[str, Any]: """Convert the tree node into a JSON-serialisable structure.""" if isinstance(self.span, ReadableSpan): span_data = json.loads(self.span.to_json()) else: span_data = self.span.model_dump() return { "id": self.id, "span": span_data, "children": [child.to_json() for child in self.children], } @classmethod def from_spans(cls, spans: List[Span]) -> "TraceTree": """Construct a tree from a flat list of spans. Args: spans: Spans that collectively form a single trace segment. Returns: A [`TraceTree`][agentlightning.adapter.triplet.TraceTree] rooted at either the discovered root span or a synthetic root when multiple roots are present. Raises: ValueError: If the span list is empty or no root span can be inferred. """ if not spans: raise ValueError("No spans provided to create TraceTree.") # Process trace items in topological order id_to_span = {span.span_id: span for span in spans} forward_graph: dict[str, list[str]] = {} root_ids: list[str] = [] for span in spans: span_id = span.span_id if span.parent_id is None: root_ids.append(span.span_id) else: if span.parent_id not in forward_graph: forward_graph[span.parent_id] = [] forward_graph[span.parent_id].append(span_id) # Diff between span with data and forward_graph keys # Sometimes the top-level session span is lost. unfound_roots = set(forward_graph.keys()) - set(id_to_span.keys()) for unfound_root in unfound_roots: root_ids.append(unfound_root) def visit(node_id: str) -> "TraceTree": children: list[TraceTree] = [] if node_id in forward_graph: for child_id in forward_graph[node_id]: children.append(visit(child_id)) if node_id not in id_to_span: assert len(children) > 0 virtual_span = Span.from_attributes( rollout_id=children[0].span.rollout_id, attempt_id=children[0].span.attempt_id, sequence_id=children[0].span.sequence_id, trace_id=children[0].span.trace_id, span_id=node_id, parent_id=None, attributes={}, start_time=min(child.start_time for child in children if child.start_time is not None), end_time=max(child.end_time for child in children if child.end_time is not None), ) return cls(node_id, virtual_span, children=children) else: return cls( node_id, id_to_span[node_id], children=children, ) # Create a virtual root span if multiple root spans are found if len(root_ids) > 1: root_spans = [visit(root_id) for root_id in root_ids] virtual_root = TraceTree( id="virtual-root", span=Span.from_attributes( rollout_id=root_spans[0].span.rollout_id, attempt_id=root_spans[0].span.attempt_id, sequence_id=root_spans[0].span.sequence_id, trace_id=root_spans[0].span.trace_id, span_id=None, # Generate one parent_id=None, name="virtual-root", attributes={}, start_time=root_spans[0].start_time, end_time=root_spans[-1].end_time, ), children=root_spans, ) return virtual_root elif len(root_ids) == 0: # No root spans found raise ValueError("No root spans found in the trace.") else: root_span = visit(root_ids[0]) return root_span def agent_name(self) -> Optional[str]: """Return the agent name associated with the span, if any. Returns: Agent name extracted from known attributes, otherwise `None`. """ attributes = self.span.attributes if attributes is None: # type: ignore return None # Case 1: OpenAI Agent SDK agent_name = cast(Optional[str], attributes.get("agent.name")) if agent_name is not None: return agent_name # Case 2: Agentops decorator @agent is_agent = attributes.get("agentops.span.kind") == "agent" if is_agent: agent_name = cast(Optional[str], attributes.get("operation.name")) if agent_name is not None: return agent_name # Case 3: Autogen team agent_name = cast(Optional[str], attributes.get("recipient_agent_type")) if agent_name is not None: return agent_name # Case 4: LangGraph agent_name = cast(Optional[str], attributes.get("langchain.chain.type")) if agent_name is not None: return agent_name # Case 5: agent-framework agent_name = cast(Optional[str], attributes.get("executor.id")) if agent_name is not None: return agent_name # Case 6: Weave is_agent_type = attributes.get("type") == "agent" if is_agent_type: agent_name = cast(Optional[str], attributes.get("agentlightning.operation.input.name")) if agent_name is not None: return agent_name # Case 7: Weave + LangChain if self.span.name.startswith("langchain.Chain."): attributes_lc_name = cast(Optional[str], attributes.get("lc_name")) if attributes_lc_name is not None: return attributes_lc_name def maybe_reward_dict(self) -> dict[str, Any]: """Return a reward payload if the span encodes one. Returns: Dictionary containing reward metadata, or an empty dictionary when no reward is found. """ reward_value = get_reward_value(self.span) if reward_value is not None: return {"type": "reward", "value": reward_value} else: return {} def is_reward_span(self) -> bool: """Return whether the span explicitly encodes a reward. Returns: `True` when the span payload describes a reward, otherwise `False`. """ maybe_reward = self.maybe_reward_dict() if maybe_reward and maybe_reward.get("type") == "reward": # type: ignore return True # Agent-lightning 0.3+ if ( self.span.name == AGL_OPERATION and self.span.attributes.get(LightningSpanAttributes.OPERATION_NAME.value) == AGL_REWARD ): return True return False def find_llm_calls( self, *, llm_call_match: str, agent_match: Optional[str], within_matching_subtree: str | None = None, within_reward: Optional[bool] = None, within_llm_call: Optional[bool] = None, existing_llm_call_response_ids: Optional[set[str]] = None, ) -> List[Tuple["TraceTree", str]]: """Find LLM call spans matching the supplied filters. Args: llm_call_match: Regular expression used to match span names that qualify as LLM calls. agent_match: Optional regular expression that must match the enclosing agent span name. within_matching_subtree: Marker propagated through recursive calls to record matching agents. within_reward: When `True`, suppresses LLM matches under reward spans. within_llm_call: When `True`, prevents duplicate matches for nested LLM calls. existing_llm_call_response_ids: Known response identifiers used to deduplicate spans. Returns: A list of tuples pairing the matching node with the agent subtree label that triggered the match. """ llm_calls: List[Tuple[TraceTree, str]] = [] is_llm_call = True if within_matching_subtree is None or within_reward is True: # We must be in an interesting agent subtree, and not in a reward span. is_llm_call = False if re.search(llm_call_match, self.span.name) is None: # The span name does not match the LLM call match. is_llm_call = False if is_llm_call: # Check the response id response_id = _attributes_get_multiple( self.span.attributes, ["gen_ai.response.id", "agentlightning.operation.output.id"] ) if response_id is None and within_llm_call is True: is_llm_call = False if ( response_id is not None and existing_llm_call_response_ids is not None and response_id in existing_llm_call_response_ids ): is_llm_call = False if is_llm_call: llm_calls.append((self, within_matching_subtree)) # type: ignore if existing_llm_call_response_ids is None: existing_llm_call_response_ids = set() if response_id is not None: existing_llm_call_response_ids.add(response_id) if within_llm_call is not None: within_llm_call = True agent_name = self.agent_name() if agent_name is not None: if agent_match is None or re.search(agent_match, agent_name): within_matching_subtree = agent_name else: within_matching_subtree = None if within_reward is not None and self.is_reward_span(): within_reward = True for child in self.children: llm_calls.extend( child.find_llm_calls( llm_call_match=llm_call_match, agent_match=agent_match, within_matching_subtree=within_matching_subtree, within_reward=within_reward, within_llm_call=within_llm_call, existing_llm_call_response_ids=existing_llm_call_response_ids, ) ) return llm_calls def repair_hierarchy(self) -> None: """Repair missing parent-child relationships introduced by mixed tracing systems. Some agent frameworks emit spans via multiple subsystems, which can cause LLM completion spans to float directly under the root span instead of being nested under the correct agent. The method re-parents those spans to the closest ancestor that fully envelopes the child in time. If we don't, when we want to select the LLM completion span with agent as filter. We will never get the correct span underneath. """ # If the current node has only one child, recursively repair its hierarchy directly. # This special-case handling is needed because when a trace is manually ended # (via agentops.end_trace), the AgentOps provider automatically wraps all spans # under an extra synthetic root node (e.g., "run_one.session"). if len(self.children) == 1: self.children[0].repair_hierarchy() return nodes_to_repair = list(self.children) for repair_node in nodes_to_repair: if len(self.children) == 1: # If there is only one child, we don't need to repair the hierarchy. break # Find the closest parent span (but not the root itself) closest_parent = None closest_duration = float("inf") for node in self.traverse(): if node.id == repair_node.id: continue if node is self: continue if node.start_time <= repair_node.start_time and node.end_time >= repair_node.end_time: # type: ignore duration_delta = node.end_time - repair_node.end_time + repair_node.start_time - node.start_time # type: ignore if duration_delta > 0 and duration_delta < closest_duration: closest_duration = duration_delta # type: ignore closest_parent = node # Repair the hierarchy if closest_parent is not None: self.children.remove(repair_node) closest_parent.children.append(repair_node) def match_rewards(self, reward_match: str, llm_calls: List["TraceTree"]) -> dict[str, Optional[float]]: """Assign rewards to previously matched LLM calls. Args: reward_match: Strategy identifier from [`RewardMatchPolicy`][agentlightning.adapter.triplet.RewardMatchPolicy]. llm_calls: Trace nodes representing LLM call spans. Returns: Mapping from span identifier to reward value or `None` when no reward is available. """ llm_call_ids = set([llm_call.id for llm_call in llm_calls]) rewards: dict[str, Optional[float]] = {} if reward_match == RewardMatchPolicy.FIRST_OCCURRENCE: time_sorted: List[TraceTree] = cast(List[TraceTree], sorted(self.traverse(), key=lambda x: x.start_time)) # type: ignore assign_to: List[Tuple[str, int]] = [] # type: ignore for item in time_sorted: if item.id in llm_call_ids: assign_to.append((item.id, item.end_time)) # type: ignore # get reward agentops_output = item.maybe_reward_dict() if agentops_output and agentops_output.get("type") == "reward": for assign_to_id, assign_to_end_time in reversed(assign_to): # This reward happens before the end of the LLM call. if assign_to_end_time > item.start_time: # type: ignore continue # Ok, we found someone to assign to if assign_to_id in rewards: # If the reward is already set, skip continue rewards[assign_to_id] = agentops_output.get("value", None) break elif reward_match == RewardMatchPolicy.FIRST_SIBLING: for item in self.traverse(): assign_to: List[Tuple[str, int]] = [] for child in item.children: if child.id in llm_call_ids: assign_to.append((child.id, child.end_time)) # type: ignore agentops_output = child.maybe_reward_dict() if agentops_output and agentops_output.get("type") == "reward": for assign_to_id, assign_to_end_time in reversed(assign_to): if assign_to_end_time > child.start_time: # type: ignore # This reward happens before the end of the LLM call. continue if assign_to_id in rewards: continue rewards[assign_to_id] = agentops_output.get("value", None) break return rewards def extract_prompt_image_urls(self, prompt_raw_content: Any) -> List[str]: """Extract image URLs from the span attributes, in order of appearance. Args: prompt_raw_content: The raw content of the prompt, which can be in one of several formats: - List[dict]: A list of message entries, each being a dict with at least a "content" key. - Dict[str, Any]: A dictionary, often with numeric string keys (e.g., `{"0": {...}, "1": {...}}`), where each value is a message entry. If the dict does not have numeric keys, it is treated as a single message entry. """ message_entries: List[Any] = [] if isinstance(prompt_raw_content, list): message_entries = cast(List[Any], prompt_raw_content) elif isinstance(prompt_raw_content, dict): # Common when the attributes expand to {"0": {...}, "prompt_filter_results": ...} numeric_keys = [ key for key in cast(Dict[str, Any], prompt_raw_content).keys() if isinstance(key, str) and key.isdigit() # pyright: ignore[reportUnnecessaryIsInstance] ] if numeric_keys: for key in sorted(numeric_keys, key=int): message_entries.append(prompt_raw_content[key]) else: message_entries = [prompt_raw_content] else: return [] image_urls: List[str] = [] for message in cast(List[Dict[str, Any]], message_entries): if ( not isinstance(message, dict) # pyright: ignore[reportUnnecessaryIsInstance] or "content" not in message ): continue content = message["content"] if isinstance(content, str): try: content = json.loads(content) # This content should now be a list except json.JSONDecodeError: logger.debug(f"Failed to parse message content as JSON: {content}") continue if isinstance(content, list): for content_part in cast(List[Dict[str, Any]], content): if not isinstance(content_part, dict): # pyright: ignore[reportUnnecessaryIsInstance] continue if content_part.get("type") == "image_url": image_url_dict = cast(Dict[str, Any], content_part.get("image_url")) if not isinstance(image_url_dict, dict): # pyright: ignore[reportUnnecessaryIsInstance] continue if "url" in image_url_dict: image_urls.append(image_url_dict["url"]) return image_urls def span_to_triplet(self, span: Span, agent_name: str) -> Triplet: """Convert a span to a triplet. Subclass can override this method to add more fields to the triplet, such as chat messages and tool calls. """ prompt_token_ids = ( _attributes_get_ids_multiple( span.attributes, [ "prompt_token_ids", "agentlightning.operation.output.prompt_token_ids", # Weave tracer ], ) or [] ) response_token_ids = ( _attributes_get_ids_multiple( span.attributes, [ "response_token_ids", "agentlightning.operation.output.response_token_ids.0", # Weave tracer "agentlightning.operation.output.choices.0.token_ids", # Weave tracer with newer vLLM "agentlightning.operation.output.choices.0.provider_specific_fields.token_ids", # new vLLM + new OpenAI client SDK ], ) or [] ) response_id = _attributes_get_multiple( span.attributes, ["gen_ai.response.id", "agentlightning.operation.output.id"] ) request_metadata = _attributes_unflatten_multiple( span.attributes, ["gen_ai.request", "agentlightning.operation.input"] ) response_metadata = _attributes_unflatten_multiple( span.attributes, ["gen_ai.response", "agentlightning.operation.output"] ) # Special handling for Weave tracer: messages are handled separately if isinstance(request_metadata, dict): request_metadata.pop("messages", None) if isinstance(response_metadata, dict): response_metadata.pop("choices", None) response_metadata.pop("prompt_token_ids", None) response_metadata.pop("response_token_ids", None) prompt_raw_content = _attributes_unflatten_multiple( span.attributes, ["gen_ai.prompt", "agentlightning.operation.input.messages"] ) completion_raw_content = _attributes_unflatten_multiple( span.attributes, ["gen_ai.completion", "agentlightning.operation.output.choices"] ) image_urls = self.extract_prompt_image_urls(prompt_raw_content) prompt_payload = {"token_ids": prompt_token_ids, "raw_content": prompt_raw_content, "image_urls": image_urls} response_payload = {"token_ids": response_token_ids, "raw_content": completion_raw_content} # FIXME: logprob doesn't support Weave tracer yet. logprobs_content = span.attributes.get("logprobs.content", None) # type: ignore if isinstance(logprobs_content, str): logprobs_content = json.loads(logprobs_content) response_payload["logprobs"] = logprobs_content return Triplet( prompt=prompt_payload, response=response_payload, reward=None, metadata=dict( request=request_metadata, response=response_metadata, response_id=response_id, agent_name=agent_name ), ) def to_trajectory( self, llm_call_match: str = r"openai\.chat\.completion", agent_match: Optional[str] = None, exclude_llm_call_in_reward: bool = True, dedup_llm_call: bool = True, reward_match: RewardMatchPolicy = RewardMatchPolicy.FIRST_OCCURRENCE, final_reward: Optional[float] = None, _skip_empty_token_spans: bool = False, ) -> List[Triplet]: """Convert the trace tree into a trajectory of [`Triplet`][agentlightning.Triplet] items. Args: llm_call_match: Regular expression for LLM call span names. agent_match: Optional regular expression for agent span names. exclude_llm_call_in_reward: When `True`, prevents searching for rewards under the LLM call subtree. dedup_llm_call: When `True`, deduplicates spans using the LLM response identifier. reward_match: Reward matching policy used to associate reward spans with LLM calls. final_reward: Optional reward appended to the final transition when provided. Returns: A list of [`Triplet`][agentlightning.Triplet] objects ordered by call sequence. """ # Find all LLM calls llm_calls = self.find_llm_calls( llm_call_match=llm_call_match, agent_match=agent_match, within_matching_subtree="*" if agent_match is None else None, within_reward=False if exclude_llm_call_in_reward else None, within_llm_call=False if dedup_llm_call else None, existing_llm_call_response_ids=set(), ) id_transitions: List[Tuple[str, Triplet]] = [] # We need to filter out the LLM calls with unrecorded token IDs filtered_llm_calls: List[Tuple[TraceTree, str]] = [] for llm_call, agent_name in llm_calls: triplet = self.span_to_triplet(llm_call.span, agent_name) # This is a hot-fix for Tinker+CrewAI, which has some anonymous requests outside the trained agent. # TODO: We might need to reconsider this. if _skip_empty_token_spans and ( not triplet.prompt.get("token_ids") or not triplet.response.get("token_ids") ): logger.warning(f"Skipping LLM call with unrecorded token IDs: {triplet}") continue filtered_llm_calls.append((llm_call, agent_name)) id_transitions.append((llm_call.id, triplet)) rewards = self.match_rewards(reward_match, [call for call, _ in filtered_llm_calls]) transitions = [ transition.model_copy(update={"reward": rewards.get(id, None)}) for id, transition in id_transitions ] if final_reward is not None and len(transitions) > 0: # Add the final reward to the last transition transitions[-1] = transitions[-1].model_copy(update={"reward": final_reward}) return transitions def __repr__(self): return ( f"TraceTree(id={self.id}, span={self.span}, start_time={self.start_time}, " + f"end_time={self.end_time}, children={self.children})" ) class TraceToTripletBase(TraceAdapter[List[Triplet]]): """Base class for adapters that emit [`Triplet`][agentlightning.Triplet] trajectories.""" class TracerTraceToTriplet(TraceToTripletBase): """Convert tracer-emitted spans into triplet trajectories. Attributes: repair_hierarchy: When `True`, repair the span tree using [`TraceTree.repair_hierarchy()`][agentlightning.adapter.triplet.TraceTree.repair_hierarchy] before matching calls and rewards. llm_call_match: Regular expression pattern that selects LLM call span names. agent_match: Optional regular expression pattern for agent span names. When omitted, spans from any agent are considered. exclude_llm_call_in_reward: When `True`, ignore matches under reward spans while searching for rewards. reward_match: Strategy used to associate rewards with LLM calls. """ def __init__( self, repair_hierarchy: bool = True, llm_call_match: str = r"openai\.chat\.completion", agent_match: Optional[str] = None, exclude_llm_call_in_reward: bool = True, reward_match: RewardMatchPolicy = RewardMatchPolicy.FIRST_OCCURRENCE, _skip_empty_token_spans: bool = False, ): self.repair_hierarchy = repair_hierarchy self.llm_call_match = llm_call_match self.agent_match = agent_match self.exclude_llm_call_in_reward = exclude_llm_call_in_reward self.reward_match = reward_match self._skip_empty_token_spans = _skip_empty_token_spans def visualize( self, source: Union[List[Span], List[ReadableSpan]], /, filename: str = "trace_tree", interested_span_match: str | None = None, ) -> TraceTree: """Visualize the trace tree built from the supplied spans. Args: source: Collection of Agent Lightning [`Span`][agentlightning.Span] objects or raw `opentelemetry.sdk.trace.ReadableSpan` instances. filename: Base filename for the generated image; `.png` is appended automatically. interested_span_match: Optional regular expression used to highlight a subset of spans. Returns: The [`TraceTree`][agentlightning.adapter.triplet.TraceTree] built from the provided spans. """ source_normalized = [ Span.from_opentelemetry(span, "dummy", "dummy", 0) if isinstance(span, ReadableSpan) else span for span in source ] trace_tree = TraceTree.from_spans(source_normalized) if self.repair_hierarchy: trace_tree.repair_hierarchy() trace_tree.visualize(filename, interested_span_match=interested_span_match) return trace_tree def adapt(self, source: Union[Sequence[Span], Sequence[ReadableSpan]], /) -> List[Triplet]: # type: ignore """Convert tracer spans into [`Triplet`][agentlightning.Triplet] trajectories. Args: source: Agent Lightning spans or raw OpenTelemetry spans that form a trace. Returns: Ordered list of trajectory transitions with prompt, response, and reward information. """ source_normalized = [ Span.from_opentelemetry(span, "dummy", "dummy", 0) if isinstance(span, ReadableSpan) else span for span in source ] trace_tree = TraceTree.from_spans(source_normalized) if self.repair_hierarchy: trace_tree.repair_hierarchy() trajectory = trace_tree.to_trajectory( llm_call_match=self.llm_call_match, agent_match=self.agent_match, exclude_llm_call_in_reward=self.exclude_llm_call_in_reward, reward_match=self.reward_match, _skip_empty_token_spans=self._skip_empty_token_spans, ) return trajectory class LlmProxyTraceToTriplet(TraceToTripletBase): """Convert telemetry emitted by the LLM Proxy into triplet trajectories. !!! warning This adapter is experimental and might be merged with [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] in the future. !!! danger Do not rely on timestamps when using this adapter. Proxy spans can originate on different machines with unsynchronised clocks, so `sequence_id` is treated as the sole source of ordering. Strategy: 1. Sort spans by `(sequence_id, start_time)` for deterministic processing. 2. Extract token identifiers from `litellm_request` or `raw_gen_ai_request` spans. 3. Extract rewards from spans exposing AgentOps-style payloads or explicit reward spans. 4. Match each reward to the most recent unmatched LLM call whose sequence is smaller. """ def _literal_eval_maybe(self, v: Any) -> Any: import ast if isinstance(v, str): try: return ast.literal_eval(v) except Exception: return v return v def _extract_tokens_from_raw(self, attrs: Dict[str, Any]) -> Tuple[List[int], List[int]]: """Extract token ids from raw_gen_ai_request attributes. - llm.hosted_vllm.prompt_token_ids: string -> List[int] - llm.hosted_vllm.response_token_ids: string -> List[List[int]] -> take first - llm.hosted_vllm.choices: string -> [{'token_ids': [...]}] -> take first """ prompt_ids: List[int] = [] resp_ids: List[int] = [] # prompt p = attrs.get("llm.hosted_vllm.prompt_token_ids") p = self._literal_eval_maybe(p) if isinstance(p, list) and all(isinstance(x, int) for x in p): # type: ignore prompt_ids = cast(List[int], p) # response preferred path r = attrs.get("llm.hosted_vllm.response_token_ids") r = self._literal_eval_maybe(r) if isinstance(r, list) and len(r) > 0 and isinstance(r[0], list): # type: ignore first = cast(List[Any], r[0]) if all(isinstance(x, int) for x in first): resp_ids = cast(List[int], first) # fallback via choices if not resp_ids: choices = attrs.get("llm.hosted_vllm.choices") choices = self._literal_eval_maybe(choices) if isinstance(choices, list) and choices: cand = cast(Any, choices[0]) if isinstance(cand, dict): tids = cast(Dict[str, Any], cand).get("token_ids") if isinstance(tids, list) and all(isinstance(x, int) for x in tids): # type: ignore resp_ids = cast(List[int], tids) return prompt_ids, resp_ids def _extract_tokens_from_openai(self, attrs: Dict[str, Any]) -> Tuple[List[int], List[int]]: prompt_ids = cast(Any, attrs.get("prompt_token_ids") or []) resp_ids = cast(Any, attrs.get("response_token_ids") or []) prompt_ids = self._literal_eval_maybe(prompt_ids) resp_ids = self._literal_eval_maybe(resp_ids) if not (isinstance(prompt_ids, list) and all(isinstance(x, int) for x in prompt_ids)): # type: ignore prompt_ids = [] if not (isinstance(resp_ids, list) and all(isinstance(x, int) for x in resp_ids)): # type: ignore resp_ids = [] return cast(List[int], prompt_ids), cast(List[int], resp_ids) def _maybe_reward_value(self, span: Span) -> Optional[float]: """Parse reward from typical AgentOps payloads or explicit reward spans.""" return get_reward_value(span) def _request_id_from_attrs(self, attrs: Dict[str, Any]) -> Optional[str]: # Prefer OpenAI-like id if present, else proxy raw id. rid = attrs.get("gen_ai.response.id") or attrs.get("llm.hosted_vllm.id") return str(rid) if isinstance(rid, str) and rid else None def adapt(self, source: Sequence[Span], /) -> List[Triplet]: # type: ignore """Convert LLM Proxy spans into [`Triplet`][agentlightning.Triplet] trajectories. Args: source: Spans emitted by the LLM Proxy containing prompt, response, and reward data. Returns: Ordered trajectory transitions matched purely by `sequence_id`. """ # 1) Sort deterministically by (sequence_id, start_time). spans = sorted( source, key=lambda s: (s.sequence_id, s.start_time), ) # 2) Collect LLM calls with token IDs. llm_items: List[Dict[str, Any]] = [] seen_request_ids: set[str] = set() for s in spans: attrs = s.attributes or {} prompt_ids: List[int] = [] resp_ids: List[int] = [] if s.name == "raw_gen_ai_request": prompt_ids, resp_ids = self._extract_tokens_from_raw(attrs) elif s.name == "litellm_request": # Some proxies never include token ids here. Ignore unless present. prompt_ids, resp_ids = self._extract_tokens_from_openai(attrs) if prompt_ids and resp_ids: rid = self._request_id_from_attrs(attrs) if rid: # Duplicated request ID. This request is already handled. if rid in seen_request_ids: continue seen_request_ids.add(rid) llm_items.append( dict( span=s, seq=s.sequence_id, response_ids=resp_ids, prompt_ids=prompt_ids, request_id=rid, ) ) # Order LLM items by sequence only. llm_items.sort(key=lambda x: x["seq"]) # Collect rewards by sequence only. rewards: List[Tuple[int, Optional[float]]] = [] for s in spans: val = self._maybe_reward_value(s) if val is not None: rewards.append((s.sequence_id, val)) # First-occurrence matching by sequence_id only: # For reward at sequence R, assign to the most recent unmatched LLM with seq < R. assigned: Dict[str, Optional[float]] = {} for r_seq, r_val in sorted(rewards, key=lambda x: x[0]): for item in reversed(llm_items): sid = item["span"].span_id if sid in assigned: continue if item["seq"] < r_seq: assigned[sid] = r_val break # Build triplets in LLM sequence order. triplets: List[Triplet] = [] for item in llm_items: s = item["span"] triplets.append( Triplet( prompt={"token_ids": item["prompt_ids"]}, response={"token_ids": item["response_ids"]}, reward=assigned.get(s.span_id, None), metadata=dict( # This is called response_id to align with the other adapters. response_id=item["request_id"], ), ) ) return triplets ================================================ FILE: agentlightning/algorithm/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations from typing import TYPE_CHECKING, Any from .base import Algorithm from .decorator import algo from .fast import Baseline, FastAlgorithm if TYPE_CHECKING: from .apo import APO as APOType from .verl import VERL as VERLType __all__ = ["Algorithm", "algo", "FastAlgorithm", "Baseline", "APO", "VERL"] # Shortcuts for usages like algo.APO(...) def APO(*args: Any, **kwargs: Any) -> APOType[Any]: from .apo import APO as APOImplementation return APOImplementation(*args, **kwargs) def VERL(*args: Any, **kwargs: Any) -> VERLType: from .verl import VERL as VERLImplementation return VERLImplementation(*args, **kwargs) ================================================ FILE: agentlightning/algorithm/apo/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .apo import APO __all__ = ["APO"] ================================================ FILE: agentlightning/algorithm/apo/apo.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ APO with textual gradients that read rollout spans and outputs to modify the prompt. - algo: beam search with span-aware textual gradients -> apply_edit via LLM - rollout: same pattern as your example, but task is a dict (T_task) """ from __future__ import annotations import asyncio import logging import random import time from dataclasses import dataclass from pathlib import Path from typing import ( TYPE_CHECKING, Any, Counter, Dict, Generic, Iterator, List, Optional, Sequence, Set, Tuple, TypedDict, TypeVar, cast, ) import poml from openai import AsyncOpenAI from agentlightning.adapter.messages import TraceToMessages from agentlightning.algorithm.base import Algorithm from agentlightning.algorithm.utils import batch_iter_over_dataset, with_llm_proxy, with_store from agentlightning.reward import find_final_reward from agentlightning.types import Dataset, NamedResources, PromptTemplate, Rollout, RolloutMode, RolloutStatus if TYPE_CHECKING: from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore logger = logging.getLogger(__name__) T_task = TypeVar("T_task") class RolloutResultForAPO(TypedDict): """This must be all JSON serializable to be processable by POML.""" status: RolloutStatus final_reward: Optional[float] spans: List[Dict[str, Any]] messages: List[Any] @dataclass class VersionedPromptTemplate: version: str prompt_template: PromptTemplate score: Optional[float] = None GRADIENT_PROMPT_FILES = [ Path(__file__).parent / "prompts" / "text_gradient_variant01.poml", Path(__file__).parent / "prompts" / "text_gradient_variant02.poml", Path(__file__).parent / "prompts" / "text_gradient_variant03.poml", ] APPLY_EDIT_PROMPT_FILES = [ Path(__file__).parent / "prompts" / "apply_edit_variant01.poml", Path(__file__).parent / "prompts" / "apply_edit_variant02.poml", ] class APO(Algorithm, Generic[T_task]): """Automatic Prompt Optimization (APO) algorithm using textual gradients and beam search. APO is an iterative prompt optimization algorithm that uses LLM-generated textual gradients to improve prompts through a beam search process. It evaluates prompts on rollouts, computes critiques based on the results, and applies edits to generate improved prompts. The algorithm operates in rounds, where each round: 1. Samples parent prompts from the current beam 2. Generates new prompts by computing textual gradients and applying edits 3. Evaluates all candidates on a validation set 4. Selects the top-k prompts for the next round Based on the ideas from: - [ProTeGi](https://aclanthology.org/2023.emnlp-main.494.pdf) - [TextGrad](https://github.com/zou-group/textgrad) """ def __init__( self, async_openai_client: AsyncOpenAI, *, gradient_model: str = "gpt-5-mini", apply_edit_model: str = "gpt-4.1-mini", diversity_temperature: float = 1.0, gradient_batch_size: int = 4, val_batch_size: int = 16, beam_width: int = 4, branch_factor: int = 4, beam_rounds: int = 3, rollout_batch_timeout: float = 3600.0, run_initial_validation: bool = True, gradient_prompt_files: Optional[List[Path]] = None, apply_edit_prompt_files: Optional[List[Path]] = None, # Internal flags for debugging _poml_trace: bool = False, ): """ Initialize the APO algorithm with configuration parameters. Args: async_openai_client: AsyncOpenAI client for making LLM API calls. gradient_model: Model name for computing textual gradients (critiques). apply_edit_model: Model name for applying edits based on critiques. diversity_temperature: Temperature parameter for LLM calls to control diversity. gradient_batch_size: Number of rollout results to sample for gradient computation. val_batch_size: Number of validation examples to use for evaluation. beam_width: Number of top-scoring prompts to keep in the beam at each round. branch_factor: Number of new prompt candidates to generate from each parent prompt by applying textual gradient edits. This controls the expansion of the search tree. beam_rounds: Number of beam search rounds to perform. rollout_batch_timeout: Maximum time in seconds to wait for rollout batch completion. run_initial_validation: If True, runs validation on the seed prompt before starting optimization to establish a baseline score. Defaults to True. gradient_prompt_files: Prompt templates used to compute textual gradients (critiques). apply_edit_prompt_files: Prompt templates used to apply edits based on critiques. """ self.async_openai_client = async_openai_client self.gradient_model = gradient_model self.apply_edit_model = apply_edit_model self.diversity_temperature = diversity_temperature self.gradient_batch_size = gradient_batch_size self.val_batch_size = val_batch_size self.beam_width = beam_width self.branch_factor = branch_factor self.beam_rounds = beam_rounds self.rollout_batch_timeout = rollout_batch_timeout self.run_initial_validation = run_initial_validation self.gradient_prompt_files = gradient_prompt_files or GRADIENT_PROMPT_FILES self.apply_edit_prompt_files = apply_edit_prompt_files or APPLY_EDIT_PROMPT_FILES self._history_best_prompt: Optional[PromptTemplate] = None self._history_best_score: float = float("-inf") self._history_best_version: Optional[str] = None self._version_counter: int = 0 self._poml_trace = _poml_trace def _create_versioned_prompt( self, prompt_template: PromptTemplate, *, score: Optional[float] = None, ) -> VersionedPromptTemplate: """ Wrap a prompt template with a new monotonically increasing version identifier. """ version = f"v{self._version_counter}" self._version_counter += 1 return VersionedPromptTemplate(version=version, prompt_template=prompt_template, score=score) def _format_log_prefix( self, *, round_num: Optional[int] = None, beam_idx: Optional[int] = None, branch_idx: Optional[int] = None, prompt_version: Optional[str] = None, ) -> str: """ Construct the standardized log prefix. """ parts: List[str] = [] if round_num is not None: parts.append(f"Round {round_num:02d}") if beam_idx is not None: parts.append(f"Beam {beam_idx:02d}") if branch_idx is not None: parts.append(f"Branch {branch_idx:02d}") if prompt_version is not None: parts.append(f"Prompt {prompt_version}") if not parts: return "" return f"[{' | '.join(parts)}]" def _log(self, level: int, message: str, *, prefix: Optional[str] = None) -> None: """ Log a message with an optional standardized prefix. """ effective_prefix = prefix if effective_prefix: logger.log(level, f"{effective_prefix} {message}") else: logger.log(level, message) def get_seed_prompt_template(self) -> Tuple[str, PromptTemplate]: """ Extract the initial prompt template from the algorithm's resources. Returns: A tuple of (resource_name, prompt_template) representing the seed prompt. Raises: ValueError: If initial_resources is not set or no PromptTemplate is found. """ initial_resources = self.get_initial_resources() if initial_resources is None: raise ValueError( "initial_resources are not set for APO algorithm. " "Use algorithm.set_initial_resources() to set initial resources or set it in Trainer()" ) for name, resource in initial_resources.items(): if isinstance(resource, PromptTemplate): return name, resource raise ValueError("No prompt template resource found in initial_resources") def get_adapter(self) -> TraceToMessages: """ Get the adapter for converting spans to messages. Returns: The TraceToMessages instance for this algorithm. Raises: ValueError: If the adapter is not a TraceToMessages. """ adapter = super().get_adapter() if not isinstance(adapter, TraceToMessages): raise ValueError("Adapter must be a TraceToMessages for APO algorithm") return adapter def get_best_prompt(self) -> PromptTemplate: """ Retrieve the best prompt discovered during optimization. Returns: The prompt template with the highest validation score found so far. Raises: ValueError: If no best prompt has been found yet (run() not called). """ if self._history_best_prompt is None: raise ValueError("No best prompt found") return self._history_best_prompt async def compute_textual_gradient( self, current_prompt: VersionedPromptTemplate, rollout_results: List[RolloutResultForAPO], *, prefix: Optional[str] = None, ) -> Optional[str]: """ Compute a textual gradient (critique) for the current prompt based on rollout results. This method samples rollout results, sends them to an LLM along with the current prompt, and generates a critique describing how the prompt could be improved. Args: current_prompt: The prompt template to critique. rollout_results: List of rollout results containing spans, messages, and rewards. Returns: A textual critique generated by the LLM, or None if generation fails. """ tg_template = random.choice(self.gradient_prompt_files) if len(rollout_results) < self.gradient_batch_size: self._log( logging.WARNING, f"Only {len(rollout_results)} rollouts available, but {self.gradient_batch_size} are needed. Using all rollouts.", prefix=prefix, ) sampled_rollout_results = rollout_results else: sampled_rollout_results = random.sample(rollout_results, self.gradient_batch_size) self._log( logging.INFO, f"Gradient will be computed with {self.gradient_model} for {len(sampled_rollout_results)} rollouts with template: {tg_template.name}", prefix=prefix, ) tg_msg = poml.poml( # type: ignore tg_template, context={ "experiments": sampled_rollout_results, "prompt_template": current_prompt.prompt_template.template, }, format="openai_chat", ) self._log( logging.DEBUG, f"Gradient computed with {self.gradient_model} prompt: {tg_msg}", prefix=prefix, ) critique_response = await self.async_openai_client.chat.completions.create( model=self.gradient_model, messages=tg_msg["messages"], # type: ignore temperature=self.diversity_temperature, ) critique_text = critique_response.choices[0].message.content self._log( logging.INFO, f"Gradient computed with {self.gradient_model} has result: {critique_text}", prefix=prefix, ) return critique_text async def textual_gradient_and_apply_edit( self, current_prompt: VersionedPromptTemplate, rollout: List[RolloutResultForAPO], *, prefix: Optional[str] = None, ) -> Optional[str]: """ Generate an improved prompt by computing a textual gradient and applying an edit. This is the main optimization step that: 1. Computes a critique (textual gradient) based on rollout performance 2. Uses another LLM to apply the critique and generate an improved prompt Args: current_prompt: The current prompt template to improve. rollout: List of rollout results to base the critique on. Returns: The improved prompt text, or the original prompt if gradient computation fails. """ # 1) Critique critique_text = await self.compute_textual_gradient( current_prompt, rollout, prefix=prefix, ) if not critique_text: self._log( logging.ERROR, "Failed to compute critique for prompt.", prefix=prefix, ) return current_prompt.prompt_template.template # 2) Apply edit ae_template = random.choice(self.apply_edit_prompt_files) self._log( logging.INFO, f"Edit will be generated by {self.apply_edit_model} with template: {ae_template.name}", prefix=prefix, ) ae_msg = poml.poml( # type: ignore ae_template, context={ "prompt_template": current_prompt.prompt_template.template, "critique": critique_text, }, format="openai_chat", ) ae_response = await self.async_openai_client.chat.completions.create( model=self.apply_edit_model, messages=ae_msg["messages"], # type: ignore temperature=self.diversity_temperature, ) new_prompt = ae_response.choices[0].message.content if new_prompt: self._log( logging.INFO, f"Edit generated by {self.apply_edit_model}: {new_prompt[:50]}...", prefix=prefix, ) return new_prompt @with_store async def get_rollout_results( self, store: LightningStore, rollout: List[Rollout], *, prefix: Optional[str] = None, ) -> List[RolloutResultForAPO]: """ Convert completed rollouts to APO-compatible result format. Fetches spans for each rollout, adapts them to messages, and packages them with rewards and status information for gradient computation. Args: rollout: List of completed rollout metadata. Returns: List of rollout results formatted for APO processing. """ rollout_results: List[RolloutResultForAPO] = [] adapter = self.get_adapter() for r in rollout: spans = await store.query_spans(r.rollout_id) messages = adapter.adapt(spans) rollout_result = RolloutResultForAPO( status=r.status, final_reward=find_final_reward(spans), spans=[span.model_dump() for span in spans], messages=messages, ) self._log( logging.DEBUG, f"Rollout result for {r.rollout_id}: status {rollout_result['status']} with final reward {rollout_result['final_reward']}. " f"{len(rollout_result['spans'])} spans and {len(rollout_result['messages'])} messages.", prefix=prefix, ) rollout_results.append(rollout_result) return rollout_results async def evaluate_prompt_on_batch( self, prompt: VersionedPromptTemplate, resource_name: str, dataset: Sequence[T_task], mode: RolloutMode, *, prefix: Optional[str] = None, ) -> Tuple[List[RolloutResultForAPO], float]: """ Evaluate a prompt on a batch of tasks by running rollouts and computing average reward. This method: 1. Adds the prompt as a named resource to the store 2. Enqueues rollouts for each task in the dataset 3. Waits for rollouts to complete (with timeout) 4. Computes and returns the average reward Args: prompt: The prompt template string to evaluate. resource_name: The name to register the prompt under in the store. dataset: Sequence of tasks to evaluate the prompt on. mode: Rollout mode ("train" or "val") for logging/tracking. Returns: A tuple of (rollout_results, average_reward) where rollout_results contains detailed information for each rollout and average_reward is the mean final reward. """ store = self.get_store() preview = prompt.prompt_template.template[:50] self._log( logging.INFO, f'Evaluating prompt "{preview}..." on {len(dataset)} tasks in {mode} mode', prefix=prefix, ) # Install prompt as named resource resources: NamedResources = {resource_name: prompt.prompt_template} resource_update = await store.update_resources(prompt.version, resources) rollout_ids: List[str] = [] for t in dataset: r = await store.enqueue_rollout(input=t, mode=mode, resources_id=resource_update.resources_id) rollout_ids.append(r.rollout_id) deadline = time.time() + self.rollout_batch_timeout finished: List[Rollout] = [] while time.time() < deadline: finished = await store.wait_for_rollouts(rollout_ids=rollout_ids, timeout=0.0) if len(finished) >= len(rollout_ids): self._log( logging.INFO, f"All {len(rollout_ids)} rollouts finished within timeout.", prefix=prefix, ) break else: self._log( logging.DEBUG, f"Only {len(finished)} rollouts finished within timeout. Waiting for remaining {len(rollout_ids) - len(finished)} rollouts.", prefix=prefix, ) # Sleep to avoid busy-waiting await asyncio.sleep(2.0) rollout_results = await self.get_rollout_results( finished, prefix=prefix, ) final_rewards = [rr["final_reward"] for rr in rollout_results] avg = float(sum([r or 0.0 for r in final_rewards]) / max(1, len(final_rewards))) status_counter = Counter([rr["status"] for rr in rollout_results]) self._log( logging.INFO, f"Evaluated {len(rollout_results)} rollouts. Statuses: {status_counter}. Rewards: {final_rewards}, average is {avg}", prefix=prefix, ) return rollout_results, avg def _initialize_beam( self, train_dataset: Optional[Dataset[T_task]], val_dataset: Optional[Dataset[T_task]], ) -> Tuple[str, PromptTemplate, Iterator[Sequence[T_task]], Iterator[Sequence[T_task]]]: """ Initialize the beam search with seed prompt and dataset iterators. Args: train_dataset: Dataset for computing gradients. val_dataset: Dataset for evaluating prompts. Returns: Tuple of (resource_name, seed_prompt, grad_iterator, val_iterator). Raises: ValueError: If either dataset is None. """ resource_name, seed_prompt = self.get_seed_prompt_template() if train_dataset is None: raise ValueError("train_dataset is required for APO algorithm") if val_dataset is None: raise ValueError("val_dataset is required for APO algorithm") grad_dataset_iterator = batch_iter_over_dataset(train_dataset, self.gradient_batch_size) val_dataset_iterator = batch_iter_over_dataset(val_dataset, self.val_batch_size) # Initialize history tracking self._history_best_prompt = seed_prompt self._history_best_score = float("-inf") return resource_name, seed_prompt, grad_dataset_iterator, val_dataset_iterator def _sample_parent_prompts( self, beam: List[VersionedPromptTemplate], round_num: int, ) -> List[Tuple[int, VersionedPromptTemplate]]: """ Sample parent prompts from the current beam for generating new candidates. If the beam has fewer prompts than beam_width, replicates existing prompts. Otherwise, randomly samples beam_width prompts. Args: beam: Current list of prompt templates in the beam. round_num: Current round number (for logging, 0-indexed). Returns: List of parent prompts to generate children from. """ display_round = round_num + 1 if len(beam) < self.beam_width: prefix = self._format_log_prefix(round_num=display_round) self._log( logging.WARNING, f"Beam width is currently {self.beam_width}, but only {len(beam)} prompts in beam. Replicating all prompts.", prefix=prefix, ) return [(i % len(beam), beam[i % len(beam)]) for i in range(self.beam_width)] selected_indices = random.sample(range(len(beam)), self.beam_width) return [(idx, beam[idx]) for idx in selected_indices] async def _generate_candidate_prompts( self, parent_prompts: List[Tuple[int, VersionedPromptTemplate]], resource_name: str, grad_dataset_iterator: Iterator[Sequence[T_task]], round_num: int, ) -> List[VersionedPromptTemplate]: """ Generate new candidate prompts from parents using textual gradients. For each parent prompt, generates branch_factor new candidates by: 1. Evaluating the parent on a training batch 2. Computing textual gradient 3. Applying edit to generate improved prompt Args: parent_prompts: List of parent prompts to generate children from. resource_name: Name to register prompts under in the store. grad_dataset_iterator: Iterator over training data batches. round_num: Current round number (for logging, 0-indexed). Returns: List of newly generated prompt templates. """ display_round = round_num + 1 round_prefix = self._format_log_prefix(round_num=display_round) self._log( logging.INFO, f"Applying {self.branch_factor} edits to each of the {len(parent_prompts)} parents based on " "gradients computed on training dataset", prefix=round_prefix, ) parent_prompts_str = [ f"{p.version}:{p.score:.3f}" if p.score is not None else p.version for _, p in parent_prompts ] self._log( logging.INFO, f"Parent prompts: {', '.join(parent_prompts_str)}", prefix=round_prefix, ) candidates: List[VersionedPromptTemplate] = [] used_beam_indices: Set[int] = set() for real_beam_idx, (beam_idx, prompt) in enumerate(parent_prompts): if beam_idx in used_beam_indices: beam_prefix = self._format_log_prefix( round_num=display_round, beam_idx=beam_idx + 1, prompt_version=prompt.version, ) self._log( logging.WARNING, "Duplicated beam index found. Might be caused by beam_width too high. " + f"The real index of this beam is {real_beam_idx + 1}.", prefix=beam_prefix, ) else: used_beam_indices.add(beam_idx) for branch_idx in range(self.branch_factor): parent_prefix = self._format_log_prefix( round_num=display_round, beam_idx=beam_idx + 1, branch_idx=branch_idx + 1, prompt_version=prompt.version, ) baseline_score = f"{prompt.score:.3f}" if prompt.score is not None else "N/A" self._log( logging.INFO, f"Use parent prompt {prompt.version} as a baseline to generate a new prompt. Baseline score: {baseline_score}", prefix=parent_prefix, ) grad_samples = next(grad_dataset_iterator) rollout_results, _ = await self.evaluate_prompt_on_batch( prompt, resource_name, grad_samples, mode="train", prefix=parent_prefix, ) new_prompt = await self.textual_gradient_and_apply_edit( prompt, rollout_results, prefix=parent_prefix, ) if not new_prompt: self._log( logging.ERROR, f"Failed to compute edit for prompt: {prompt.prompt_template.template}", prefix=parent_prefix, ) continue new_prompt_template = PromptTemplate(template=new_prompt, engine="f-string") versioned_candidate = self._create_versioned_prompt(new_prompt_template) self._log( logging.INFO, f"New prompt template created from parent {prompt.version}: {versioned_candidate.version}", prefix=parent_prefix, ) candidate_prefix = self._format_log_prefix( round_num=display_round, prompt_version=versioned_candidate.version ) self._log( logging.INFO, f"New prompt template created from parent {prompt.version}:\n```\n{new_prompt}\n```", prefix=candidate_prefix, ) candidates.append(versioned_candidate) return candidates async def _evaluate_and_select_beam( self, candidates: List[VersionedPromptTemplate], resource_name: str, val_dataset_iterator: Iterator[Sequence[T_task]], round_num: int, ) -> List[VersionedPromptTemplate]: """ Evaluate all candidate prompts on validation data and select top-k for the beam. Args: candidates: List of candidate prompts to evaluate. resource_name: Name to register prompts under in the store. val_dataset_iterator: Iterator over validation data batches. round_num: Current round number (for logging, 0-indexed). Returns: List of top beam_width prompts sorted by validation score (best first). Raises: ValueError: If no candidates remain after evaluation. """ display_round = round_num + 1 round_prefix = self._format_log_prefix(round_num=display_round) self._log( logging.INFO, f"Evaluating {len(candidates)} candidates on validation dataset", prefix=round_prefix, ) val_batch = next(val_dataset_iterator) for prompt in candidates: candidate_prefix = self._format_log_prefix( round_num=display_round, prompt_version=prompt.version, ) _, score = await self.evaluate_prompt_on_batch( prompt, resource_name, val_batch, mode="val", prefix=candidate_prefix, ) prompt.score = score self._log( logging.INFO, f"Candidate score: {score:.3f}", prefix=candidate_prefix, ) # Sort by score (descending) and select top beam_width sorted_prompts = [p for p in sorted(candidates, key=lambda x: cast(float, x.score), reverse=True)] selected_prompts = sorted_prompts[: self.beam_width] selected_versions = [ f"{prompt.version}:{prompt.score:.3f}" if prompt.score is not None else prompt.version for prompt in selected_prompts ] self._log( logging.INFO, f"Top {len(selected_prompts)} candidates on validation dataset: {selected_versions}", prefix=round_prefix, ) if len(selected_prompts) == 0: raise ValueError("No beam candidates any more") return selected_prompts async def _update_best_prompt( self, beam: List[VersionedPromptTemplate], resource_name: str, val_dataset: Dataset[T_task], round_num: int, ) -> None: """ Evaluate the best prompt in the beam on the full validation set and update history. Args: beam: Current beam of prompts (sorted, best first). resource_name: Name to register prompts under in the store. val_dataset: Full validation dataset. round_num: Current round number (for logging, 0-indexed). """ display_round = round_num + 1 best_prompt = beam[0] prefix = self._format_log_prefix(round_num=display_round, prompt_version=best_prompt.version) _, best_score = await self.evaluate_prompt_on_batch( best_prompt, resource_name, cast(Sequence[T_task], val_dataset), mode="val", prefix=prefix, ) self._log( logging.INFO, f"Beam leader score: {best_score:.3f}", prefix=prefix, ) if best_score > self._history_best_score: prev = self._history_best_score self._log( logging.INFO, f"Best prompt updated. New best score: {best_score:.3f} (prev: {prev:.3f})", prefix=prefix, ) self._history_best_prompt = best_prompt.prompt_template self._history_best_score = best_score self._history_best_version = best_prompt.version else: self._log( logging.WARNING, f"Best prompt not updated. Current score: {best_score:.3f} vs. history best: {self._history_best_score:.3f})", prefix=prefix, ) @with_llm_proxy() @with_store async def run( self, store: LightningStore, # Injected by decorator - callers should not provide this parameter llm_proxy: Optional[LLMProxy], # Injected by decorator - callers should not provide this parameter train_dataset: Optional[Dataset[T_task]] = None, val_dataset: Optional[Dataset[T_task]] = None, ) -> None: """ Execute the APO algorithm to optimize prompts through beam search with textual gradients. The algorithm performs iterative prompt optimization over multiple rounds: - Each round: samples parent prompts, generates new candidates via textual gradients, evaluates all candidates on validation data, and keeps the top performers - Tracks the historically best prompt across all rounds - Uses different training data samples for each gradient computation to ensure diversity Args: train_dataset: Dataset of tasks for computing textual gradients. Required. val_dataset: Dataset of tasks for evaluating and selecting prompts. Required. Raises: ValueError: If train_dataset or val_dataset is None, or if resources are not set. """ # Initialize beam search resource_name, seed_prompt, grad_iterator, val_iterator = self._initialize_beam(train_dataset, val_dataset) if self._poml_trace: poml.set_trace(trace_dir="pomltrace") # Validation datasets are guaranteed to be non-None after initialization assert val_dataset is not None # Start with seed prompt in the beam seed_versioned = self._create_versioned_prompt(seed_prompt) beam: List[VersionedPromptTemplate] = [seed_versioned] self._history_best_prompt = seed_prompt self._history_best_version = seed_versioned.version # Optionally evaluate seed prompt on validation set to establish baseline if self.run_initial_validation: seed_prefix = self._format_log_prefix(round_num=0, prompt_version=seed_versioned.version) self._log( logging.INFO, "Evaluating seed prompt on validation dataset before optimization...", prefix=seed_prefix, ) _, seed_score = await self.evaluate_prompt_on_batch( seed_versioned, resource_name, cast(Sequence[T_task], val_dataset), mode="val", prefix=seed_prefix, ) self._log( logging.INFO, f"Seed prompt baseline score: {seed_score:.3f}", prefix=seed_prefix, ) self._history_best_prompt = seed_prompt self._history_best_score = seed_score self._history_best_version = seed_versioned.version # Run beam search for specified number of rounds for rnd in range(self.beam_rounds): display_round = rnd + 1 round_prefix = self._format_log_prefix(round_num=display_round) self._log( logging.INFO, f"Round {display_round}/{self.beam_rounds}...", prefix=round_prefix, ) # Sample parent prompts from current beam parent_prompts = self._sample_parent_prompts(beam, rnd) # Generate new candidate prompts from parents new_candidates = await self._generate_candidate_prompts(parent_prompts, resource_name, grad_iterator, rnd) # Combine existing beam with new candidates all_candidates = [*beam, *new_candidates] # Evaluate and select top-k prompts for next beam beam = await self._evaluate_and_select_beam(all_candidates, resource_name, val_iterator, rnd) # Update historically best prompt if improved await self._update_best_prompt(beam, resource_name, val_dataset, rnd) ================================================ FILE: agentlightning/algorithm/apo/prompts/apply_edit_variant01.poml ================================================

Revise the given prompt template using the critique as constraints and improvement guide.

Rewrite or restructure the prompt if critique implies it. Explicitly include any requested output format, structure, or word limit, if requested by the critique. Prioritize mechanism-first phrasing: define what to do, then how to do it. Preserve placeholder variables inside curly brackets. Return only the improved prompt template with placeholders intact. Do not include other explanations on how you did it, or headers and introductory texts. {{ prompt_template }} {{ critique }}
================================================ FILE: agentlightning/algorithm/apo/prompts/apply_edit_variant02.poml ================================================

Revise the prompt to address ONE critique point clearly and effectively. Preserve all variable names in curly-brackets.

Do not address more than one critique point. Focus on the single most critical issue.

Keep the new prompt close in tone, length, and structure to the original.

Return only the revised full prompt. Do not include explanations, comparisons, or other text. {{ prompt_template }} {{ critique }}
================================================ FILE: agentlightning/algorithm/apo/prompts/text_gradient_variant01.poml ================================================

You optimize a prompt template.

{{ prompt_template }}

This experiment has {{ experiment.status }}. It gets a final reward: {{ experiment.final_reward }}

Produce a brief critique listing specific causes for the error or ways to raise reward next time. Return a bullet list with concrete, testable changes (format, constraints, ordering, definitions). ================================================ FILE: agentlightning/algorithm/apo/prompts/text_gradient_variant02.poml ================================================ You are a prompt engineer. Analyze where the current prompt failed to elicit the right mechanism. {{ prompt_template }}

The following are the OpenTelemetry spans collected from the sample runs with the current prompt template. They should contain both prompt, responses and rewards.

Write 3-5 short bullets titled 'Critique:' focusing on missing constraints, ordering, or formatting. ================================================ FILE: agentlightning/algorithm/apo/prompts/text_gradient_variant03.poml ================================================ You are an expert prompt engineer. Your task is to analyze the prompt and provide a critique of the prompt. Follow the steps below to create the critique.

These flaws block clarity and logic. Always check them first.

Missing goal: The prompt never defines what success looks like. Ask: Can I summarize its output goal in one line? Contradictions: Two or more instructions conflict. Search for words like *never*, *always*, *except*, *but also*. Circular dependencies: The model is told to do A before B and B before A. No stop condition: The prompt doesn’t say when the task is done. Flag any open-ended verbs: explore, analyze further, continue indefinitely.

Examine how the instructions are stated and ordered to ensure clarity and enforceability.

Vague verbs: Avoid terms like optimize, improve, and ensure. Use precise, measurable instructions. Lack of hierarchy: All rules appear equally important, making conflict resolution impossible. Clarify rule precedence. Mixed abstraction: High-level policies are interleaved with implementation details. Keep principles separate from step-by-step actions. Overlapping scope: Similar instructions appear in several sections with minor changes. Identify and consolidate duplicates.

Review boundaries on model autonomy, tool use, and communication style.

No tool limits: Limits on tool calls, retries, or time not specified. Define boundaries for operations. Unclear uncertainty handling: Conflicting instructions regarding clarifying uncertainties vs. never asking users. Select one behavior. Verbosity confusion: Some parts demand detailed answers, others specify brevity. Highlight and resolve inconsistency. Feedback omission: No plan for progress reporting or preamble during multi-step operations.

Assess if required data and expected output formats are clearly defined.

No input defaults: What should happen if a needed value is absent or invalid isn’t explained. Output schema missing: Expected response format or sections are not spelled out. Format inconsistency: Output style (Markdown, JSON, XML, etc.) shifts mid-prompt. Ensure format requirements are stable. No validation: Lacks steps like verify results before submitting or summarize at end.

Ensure prompt actions remain within safe, authorized boundaries.

Scope creep: Open-ended statements such as feel free to enhance can justify unrelated changes. Unsafe actions: Allows deletions or modifications without explicit user approval. No error handling: What happens if a tool call fails or data is missing is not addressed. User authority ambiguity: Model may act for multiple users or perform irreversible actions without checks.

Consider the prompt’s length, redundancy, and future comprehensibility.

Overexplained: Verbose explanations where concise, numbered steps suffice. Redundancy: Similar rules scattered in multiple aliases; centralize and summarize them. Hidden assumptions: Implicit defaults (like timezone, language) are not stated. Poor auditability: Lacks section markers (e.g., <policy>, <procedure>). Structure prompt for easy review.

Methodical approach for reviewing a prompt:

Read the prompt fully; highlight all unclear or contradictory instructions. For each main area, answer: What is the intended outcome? What is the stop or completion condition? How are conflicts between rules resolved? What are the explicit limits (tools, run time, tokens)? What should the output format be? Rate each section: clear, incomplete, contradictory, or redundant. Summarize findings under categories: structure, control, scope, format, safety.

This method surfaces issues such as ambiguity, contradiction, missing boundaries, and output uncertainty—core failure modes in prompting identified by the GPT-5 prompting guide.

Respond with a complete analysis and critique of the prompt. Be concise and direct. Less than 350 words. {{ prompt_template }} This run has {{ experiment.status }}. The final score is {{ experiment.final_reward }}. ================================================ FILE: agentlightning/algorithm/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import inspect import weakref from typing import ( TYPE_CHECKING, Any, Awaitable, Optional, Union, ) from agentlightning.adapter import TraceAdapter from agentlightning.client import AgentLightningClient from agentlightning.store.base import LightningStore from agentlightning.types import Dataset, NamedResources if TYPE_CHECKING: from agentlightning.llm_proxy import LLMProxy from agentlightning.trainer import Trainer class Algorithm: """Algorithm is the strategy, or tuner to train the agent.""" _trainer_ref: weakref.ReferenceType[Trainer] | None = None _llm_proxy_ref: weakref.ReferenceType["LLMProxy"] | None = None _store: LightningStore | None = None _initial_resources: NamedResources | None = None _adapter_ref: weakref.ReferenceType[TraceAdapter[Any]] | None = None def is_async(self) -> bool: """Return True if the algorithm is asynchronous.""" return inspect.iscoroutinefunction(self.run) def set_trainer(self, trainer: Trainer) -> None: """ Set the trainer for this algorithm. Args: trainer: The Trainer instance that will handle training and validation. """ self._trainer_ref = weakref.ref(trainer) def get_trainer(self) -> Trainer: """ Get the trainer for this algorithm. Returns: The Trainer instance associated with this agent. """ if self._trainer_ref is None: raise ValueError("Trainer has not been set for this agent.") trainer = self._trainer_ref() if trainer is None: raise ValueError("Trainer reference is no longer valid (object has been garbage collected).") return trainer def set_llm_proxy(self, llm_proxy: LLMProxy | None) -> None: """ Set the LLM proxy for this algorithm to reuse when available. Args: llm_proxy: The LLMProxy instance configured by the trainer, if any. """ self._llm_proxy_ref = weakref.ref(llm_proxy) if llm_proxy is not None else None def get_llm_proxy(self) -> Optional[LLMProxy]: """ Retrieve the configured LLM proxy instance, if one has been set. Returns: The active LLMProxy instance or None when not configured. """ if self._llm_proxy_ref is None: return None llm_proxy = self._llm_proxy_ref() if llm_proxy is None: raise ValueError("LLM proxy reference is no longer valid (object has been garbage collected).") return llm_proxy def set_adapter(self, adapter: TraceAdapter[Any]) -> None: """ Set the adapter for this algorithm to collect and convert traces. """ self._adapter_ref = weakref.ref(adapter) def get_adapter(self) -> TraceAdapter[Any]: """ Retrieve the adapter for this algorithm to communicate with the runners. """ if self._adapter_ref is None: raise ValueError("Adapter has not been set for this algorithm.") adapter = self._adapter_ref() if adapter is None: raise ValueError("Adapter reference is no longer valid (object has been garbage collected).") return adapter def set_store(self, store: LightningStore) -> None: """ Set the store for this algorithm to communicate with the runners. Store is set directly instead of using weakref because its copy is meant to be maintained throughout the algorithm's lifecycle. """ self._store = store def get_store(self) -> LightningStore: """ Retrieve the store for this algorithm to communicate with the runners. """ if self._store is None: raise ValueError("Store has not been set for this algorithm.") return self._store def get_initial_resources(self) -> Optional[NamedResources]: """ Get the initial resources for this algorithm. """ return self._initial_resources def set_initial_resources(self, resources: NamedResources) -> None: """ Set the initial resources for this algorithm. """ self._initial_resources = resources def __call__(self, *args: Any, **kwargs: Any) -> Any: return self.run(*args, **kwargs) def run( self, train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> Union[None, Awaitable[None]]: """Subclasses should implement this method to implement the algorithm. Args: train_dataset: The dataset to train on. Not all algorithms require a training dataset. val_dataset: The dataset to validate on. Not all algorithms require a validation dataset. Returns: Algorithm should refrain from returning anything. It should just run the algorithm. """ raise NotImplementedError("Subclasses must implement run().") def get_client(self) -> AgentLightningClient: """Get the client to communicate with the algorithm. If the algorithm does not require a server-client communication, it can also create a mock client that never communicates with itself. Deprecated and will be removed in a future version. Returns: The AgentLightningClient instance associated with this algorithm. """ raise NotImplementedError("Subclasses must implement get_client().") ================================================ FILE: agentlightning/algorithm/decorator.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import functools import inspect from typing import ( TYPE_CHECKING, Any, Awaitable, Dict, Generic, Literal, Optional, Protocol, TypeVar, Union, cast, overload, ) from agentlightning.adapter import TraceAdapter from agentlightning.store.base import LightningStore from agentlightning.types import Dataset, NamedResources if TYPE_CHECKING: from agentlightning.llm_proxy import LLMProxy from .base import Algorithm # Algorithm function signature types # We've missed a lot of combinations here. # Let's add them in future. class AlgorithmFuncSyncFull(Protocol): def __call__( self, *, store: LightningStore, train_dataset: Optional[Dataset[Any]], val_dataset: Optional[Dataset[Any]], llm_proxy: Optional[LLMProxy], adapter: Optional[TraceAdapter[Any]], initial_resources: Optional[NamedResources], ) -> None: ... class AlgorithmFuncSyncOnlyStore(Protocol): def __call__(self, *, store: LightningStore) -> None: ... class AlgorithmFuncSyncOnlyDataset(Protocol): def __call__(self, *, train_dataset: Optional[Dataset[Any]], val_dataset: Optional[Dataset[Any]]) -> None: ... class AlgorithmFuncAsyncFull(Protocol): def __call__( self, *, store: LightningStore, train_dataset: Optional[Dataset[Any]], val_dataset: Optional[Dataset[Any]], llm_proxy: Optional[LLMProxy], adapter: Optional[TraceAdapter[Any]], initial_resources: Optional[NamedResources], ) -> Awaitable[None]: ... class AlgorithmFuncAsyncOnlyStore(Protocol): def __call__(self, *, store: LightningStore) -> Awaitable[None]: ... class AlgorithmFuncAsyncOnlyDataset(Protocol): def __call__( self, *, train_dataset: Optional[Dataset[Any]], val_dataset: Optional[Dataset[Any]] ) -> Awaitable[None]: ... AlgorithmFuncAsync = Union[AlgorithmFuncAsyncOnlyStore, AlgorithmFuncAsyncOnlyDataset, AlgorithmFuncAsyncFull] AlgorithmFuncSync = Union[AlgorithmFuncSyncOnlyStore, AlgorithmFuncSyncOnlyDataset, AlgorithmFuncSyncFull] class AlgorithmFuncSyncFallback(Protocol): def __call__(self, *args: Any, **kwargs: Any) -> Any: ... class AlgorithmFuncAsyncFallback(Protocol): def __call__(self, *args: Any, **kwargs: Any) -> Awaitable[Any]: ... AlgorithmFuncSyncLike = Union[AlgorithmFuncSync, AlgorithmFuncSyncFallback] AlgorithmFuncAsyncLike = Union[AlgorithmFuncAsync, AlgorithmFuncAsyncFallback] AlgorithmFunc = Union[AlgorithmFuncSyncLike, AlgorithmFuncAsyncLike] AsyncFlag = Literal[True, False] AF = TypeVar("AF", bound=AsyncFlag) class FunctionalAlgorithm(Algorithm, Generic[AF]): """An algorithm wrapper built from a callable implementation. Functional algorithms let you provide an ordinary function instead of subclassing [`Algorithm`][agentlightning.Algorithm]. The wrapper inspects the callable signature to supply optional dependencies such as the store, adapter, and LLM proxy. """ @overload def __init__(self: "FunctionalAlgorithm[Literal[False]]", algorithm_func: AlgorithmFuncSyncLike) -> None: ... @overload def __init__(self: "FunctionalAlgorithm[Literal[True]]", algorithm_func: AlgorithmFuncAsyncLike) -> None: ... def __init__(self, algorithm_func: Union[AlgorithmFuncSyncLike, AlgorithmFuncAsyncLike]) -> None: """Wrap a function that implements algorithm behaviour. Args: algorithm_func: Sync or async callable implementing the algorithm contract. Arguments are detected automatically based on the function signature. """ super().__init__() self._algorithm_func = algorithm_func self._sig = inspect.signature(algorithm_func) self._is_async = inspect.iscoroutinefunction(algorithm_func) # Copy function metadata to preserve type hints and other attributes functools.update_wrapper(self, algorithm_func) # type: ignore def is_async(self) -> bool: return self._is_async @overload def run( self: "FunctionalAlgorithm[Literal[False]]", train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> None: ... @overload def run( self: "FunctionalAlgorithm[Literal[True]]", train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> Awaitable[None]: ... def __call__(self, *args: Any, **kwargs: Any) -> Any: return self._algorithm_func(*args, **kwargs) # type: ignore def run( self, train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> Union[None, Awaitable[None]]: """Execute the wrapped function with injected dependencies. Args: train_dataset: Optional training dataset passed through when the callable declares a `train_dataset` parameter. val_dataset: Optional validation dataset passed through when the callable declares a `val_dataset` parameter. Returns: None for sync callables or an awaitable when the callable is async. Raises: TypeError: If a dataset is provided but the function signature does not accept the corresponding argument. """ kwargs: Dict[str, Any] = {} if "store" in self._sig.parameters: kwargs["store"] = self.get_store() if "adapter" in self._sig.parameters: kwargs["adapter"] = self.get_adapter() if "llm_proxy" in self._sig.parameters: kwargs["llm_proxy"] = self.get_llm_proxy() if "initial_resources" in self._sig.parameters: kwargs["initial_resources"] = self.get_initial_resources() if "train_dataset" in self._sig.parameters: kwargs["train_dataset"] = train_dataset elif train_dataset is not None: raise TypeError( f"train_dataset is provided but not supported by the algorithm function: {self._algorithm_func}" ) if "val_dataset" in self._sig.parameters: kwargs["val_dataset"] = val_dataset elif val_dataset is not None: raise TypeError( f"val_dataset is provided but not supported by the algorithm function: {self._algorithm_func}" ) # both sync and async functions can be called with the same signature result = self._algorithm_func(**kwargs) # type: ignore[misc] if self._is_async: return cast(Awaitable[None], result) return None @overload def algo(func: AlgorithmFuncAsync) -> FunctionalAlgorithm[Literal[True]]: ... @overload def algo(func: AlgorithmFuncAsyncFallback) -> FunctionalAlgorithm[Any]: ... @overload def algo(func: AlgorithmFuncSync) -> FunctionalAlgorithm[Literal[False]]: ... @overload def algo(func: AlgorithmFuncSyncFallback) -> FunctionalAlgorithm[Any]: ... def algo( func: Union[ AlgorithmFuncSync, AlgorithmFuncAsync, AlgorithmFuncSyncFallback, AlgorithmFuncAsyncFallback, ], ) -> Union[FunctionalAlgorithm[Literal[False]], FunctionalAlgorithm[Literal[True]]]: """Convert a callable into a [`FunctionalAlgorithm`][agentlightning.algorithm.decorator.FunctionalAlgorithm]. The decorator inspects the callable signature to decide which dependencies to inject at runtime, enabling concise algorithm definitions that still leverage the full training runtime. Args: func: Function implementing the algorithm logic. May be synchronous or asynchronous. The function can expect all of, or a subset of the following parameters: - `store`: [`LightningStore`][agentlightning.store.base.LightningStore], - `train_dataset`: [`Dataset`][agentlightning.Dataset], - `val_dataset`: [`Dataset`][agentlightning.Dataset], - `llm_proxy`: [`LLMProxy`][agentlightning.LLMProxy], - `adapter`: [`TraceAdapter`][agentlightning.TraceAdapter], - `initial_resources`: [`NamedResources`][agentlightning.NamedResources], If the function does not expect a parameter, the wrapper will not inject it into the call. Using `*args` and `**kwargs` will not work and no parameters will be injected. Returns: FunctionalAlgorithm that proxies the callable while exposing the `Algorithm` interface. Examples: ```python from agentlightning.algorithm.decorator import algo @algo def batching_algorithm(*, store, train_dataset, val_dataset): for sample in train_dataset: store.enqueue_rollout(input=sample, mode="train") @algo async def async_algorithm(*, store, train_dataset=None, val_dataset=None): await store.enqueue_rollout(input={"prompt": "hello"}, mode="train") ``` """ return FunctionalAlgorithm(func) ================================================ FILE: agentlightning/algorithm/fast.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging from datetime import datetime from typing import TYPE_CHECKING, Any, List, Literal, Optional from agentlightning.types import Attempt, Dataset, Rollout, RolloutStatus, Span from .base import Algorithm from .utils import with_llm_proxy, with_store if TYPE_CHECKING: from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore logger = logging.getLogger(__name__) __all__ = ["FastAlgorithm", "Baseline"] class FastAlgorithm(Algorithm): """Base class for lightweight algorithms optimised for developer workflows. Fast algorithms prioritise short feedback loops so an agent developer can run small-scale experiments without waiting for long-running training jobs to finish. """ def _timestamp_to_iso_str(timestamp: float) -> str: return datetime.fromtimestamp(timestamp).isoformat() class Baseline(FastAlgorithm): """Reference implementation that streams the full dataset through the rollout queue. The baseline algorithm batches task submissions, waits for each rollout to finish, and logs every collected span and reward. It is primarily useful as a smoke test for the platform plumbing rather than a performant trainer. The baseline algorithm will auto-start a LLM proxy if one is provided and not yet started. Args: n_epochs: Number of dataset passes to execute for both the train and val splits during developer experiments. train_split: Fraction of the concatenated dataset to treat as training data. Must be strictly between 0 and 1. polling_interval: Interval, in seconds, to poll the store for queue depth and rollout completion. max_queue_length: Number of rollouts allowed to wait in the queue before throttling additional submissions. span_verbosity: Level of detail to include when logging span metadata. Raises: ValueError: If `train_split` falls outside the `(0, 1)` interval. Examples: ```python from agentlightning.algorithm.fast import Baseline algorithm = Baseline(n_epochs=2, train_split=0.8, span_verbosity="key_values") trainer.fit(algorithm, train_dataset=my_train, val_dataset=my_val) ``` """ def __init__( self, *, n_epochs: int = 1, train_split: float = 0.5, polling_interval: float = 5.0, max_queue_length: int = 4, span_verbosity: Literal["keys", "key_values", "none"] = "keys", ) -> None: super().__init__() self.n_epochs = n_epochs self.train_split = train_split self.polling_interval = polling_interval self.max_queue_length = max_queue_length self.span_verbosity = span_verbosity if not (0.0 < self.train_split < 1.0): raise ValueError("train_split must be between 0 and 1.") self._finished_rollout_count = 0 def _span_to_string(self, rollout_id: str, attempt: Attempt, span: Span) -> str: """Format a span for logging based on the configured verbosity.""" if self.span_verbosity == "none": return "" prefix_msg = f"[Rollout {rollout_id} | Attempt {attempt.attempt_id} | Span {span.span_id}] #{span.sequence_id} ({span.name}) " elapsed = f"{span.end_time - span.start_time:.2f}" if span.start_time and span.end_time else "unknown" msg = ( prefix_msg + f"From {_timestamp_to_iso_str(span.start_time) if span.start_time else 'unknown'}, " + f"to {_timestamp_to_iso_str(span.end_time) if span.end_time else 'unknown'}, " + f"{elapsed} seconds. " ) if self.span_verbosity == "key_values": msg += f"Attributes: {span.attributes}" else: msg += f"Attribute keys: {list(span.attributes.keys())}" return msg async def _handle_rollout_finish(self, rollout: Rollout) -> None: """Log attempt metadata and emit adapted traces when a rollout ends.""" store = self.get_store() rollout_id = rollout.rollout_id rollout_end_time = rollout.end_time or asyncio.get_event_loop().time() logger.info( f"[Rollout {rollout_id}] Finished with status {rollout.status} in {rollout_end_time - rollout.start_time:.2f} seconds." ) # Logs all the attempts and their corresponding spans attempts = await store.query_attempts(rollout_id) for attempt in attempts: logger.info( "[Rollout %s | Attempt %s] ID: %s. Status: %s. Worker: %s", rollout_id, attempt.sequence_id, attempt.attempt_id, attempt.status, attempt.worker_id, ) spans = await store.query_spans(rollout_id=rollout_id) for span in spans: if self.span_verbosity != "none": logger.info(self._span_to_string(rollout.rollout_id, attempt, span)) # Attempts to adapt the spans using the adapter if provided try: adapter = self.get_adapter() except ValueError: logger.warning("No adapter set for MockAlgorithm. Skipping trace adaptation.") adapter = None if adapter is not None: spans = await store.query_spans(rollout_id=rollout_id, attempt_id="latest") transformed_data = adapter.adapt(spans) logger.info(f"[Rollout {rollout_id}] Adapted data: {transformed_data}") async def _enqueue_rollouts( self, dataset: Dataset[Any], train_indices: List[int], val_indices: List[int], resources_id: str ) -> None: """Submit rollouts while respecting the maximum queue length.""" store = self.get_store() for index in train_indices + val_indices: queuing_rollouts = await store.query_rollouts(status_in=["queuing", "requeuing"]) if len(queuing_rollouts) <= 1: # Only enqueue a new rollout when there is at most 1 rollout in the queue. sample = dataset[index] mode = "train" if index in train_indices else "val" rollout = await store.enqueue_rollout(input=sample, mode=mode, resources_id=resources_id) logger.info(f"[Rollout {rollout.rollout_id}] Enqueued in {mode} mode with sample: {sample}") await asyncio.sleep(self.polling_interval) async def _harvest_rollout_spans(self, rollout_id: str): """Poll rollout status updates until completion and log transitions.""" store = self.get_store() last_status: Optional[RolloutStatus] = None while True: rollout = await store.get_rollout_by_id(rollout_id) if rollout is not None: if rollout.status in ["succeeded", "failed", "cancelled"]: # Rollout is finished, log all the data. await self._handle_rollout_finish(rollout) # We are done here. self._finished_rollout_count += 1 logger.info(f"Finished {self._finished_rollout_count} rollouts.") break if last_status != rollout.status: if last_status is not None: logger.info(f"[Rollout {rollout_id}] Status changed to {rollout.status}.") else: logger.info(f"[Rollout {rollout_id}] Status is initialized to {rollout.status}.") last_status = rollout.status else: logger.debug(f"[Rollout {rollout_id}] Status is still {rollout.status}.") await asyncio.sleep(self.polling_interval) @with_llm_proxy() @with_store async def run( self, store: LightningStore, # Injected by decorator - callers should not provide this parameter llm_proxy: Optional[LLMProxy], # Injected by decorator - callers should not provide this parameter train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> None: """Execute the baseline loop across the provided datasets.""" train_dataset_length = len(train_dataset) if train_dataset is not None else 0 val_dataset_length = len(val_dataset) if val_dataset is not None else 0 if train_dataset_length == 0 and val_dataset_length == 0: logger.error( "MockAlgorithm requires at least one dataset. Provide train_dataset or val_dataset before running." ) return concatenated_dataset = [train_dataset[i] for i in range(train_dataset_length) if train_dataset is not None] + [ val_dataset[i] for i in range(val_dataset_length) if val_dataset is not None ] train_indices = list(range(0, train_dataset_length)) val_indices = list(range(train_dataset_length, train_dataset_length + val_dataset_length)) logger.debug(f"Train indices: {train_indices}") logger.debug(f"Val indices: {val_indices}") # Currently we only supports a single resource update at the start. initial_resources = self.get_initial_resources() if initial_resources is not None: resource_update = await store.update_resources("default", initial_resources) resources_id = resource_update.resources_id logger.info(f"Initial resources set: {initial_resources}") else: logger.warning("No initial resources provided. Skip initializing resources.") resources_id = None for epoch in range(self.n_epochs): harvest_tasks: List[asyncio.Task[None]] = [] logger.info(f"Proceeding epoch {epoch + 1}/{self.n_epochs}.") for index in train_indices + val_indices: logger.info( f"Processing index {index}. {len(train_indices)} train indices and {len(val_indices)} val indices in total." ) while True: queuing_rollouts = await store.query_rollouts(status_in=["queuing", "requeuing"]) if len(queuing_rollouts) <= self.max_queue_length: # Only enqueue a new rollout when there is at most "max_queue_length" rollout in the queue. sample = concatenated_dataset[index] mode = "train" if index in train_indices else "val" rollout = await store.enqueue_rollout(input=sample, mode=mode, resources_id=resources_id) harvest_tasks.append(asyncio.create_task(self._harvest_rollout_spans(rollout.rollout_id))) logger.info(f"Enqueued rollout {rollout.rollout_id} in {mode} mode with sample: {sample}") break else: # Sleep a bit and try again later. await asyncio.sleep(self.polling_interval) # Wait for all harvest tasks to complete logger.info(f"Waiting for {len(harvest_tasks)} harvest tasks to complete...") if len(harvest_tasks) > 0: await asyncio.gather(*harvest_tasks) ================================================ FILE: agentlightning/algorithm/utils.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import functools import logging import random from collections.abc import Coroutine from typing import ( TYPE_CHECKING, Any, Callable, Concatenate, Iterator, List, Literal, Optional, ParamSpec, Sequence, TypeVar, overload, ) from agentlightning.types import Dataset if TYPE_CHECKING: from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore from .base import Algorithm T_task = TypeVar("T_task") T_algo = TypeVar("T_algo", bound="Algorithm") P = ParamSpec("P") R = TypeVar("R") logger = logging.getLogger(__name__) def batch_iter_over_dataset(dataset: Dataset[T_task], batch_size: int) -> Iterator[Sequence[T_task]]: """ Create an infinite iterator that yields batches from the dataset. When batch_size >= dataset size, yields the entire shuffled dataset repeatedly. When batch_size < dataset size, yields batches of the specified size, reshuffling after each complete pass through the dataset. Args: dataset: The dataset to iterate over. batch_size: The desired batch size. Yields: Sequences of tasks from the dataset. Each task appears at most once per epoch. """ if batch_size >= len(dataset): while True: dataset_copy = [dataset[i] for i in range(len(dataset))] random.shuffle(dataset_copy) yield dataset_copy else: current_batch: List[int] = [] while True: indices = list(range(len(dataset))) random.shuffle(indices) for index in indices: if index in current_batch: continue current_batch.append(index) if len(current_batch) == batch_size: yield [dataset[index] for index in current_batch] current_batch = [] def with_store( func: Callable[Concatenate[T_algo, LightningStore, P], Coroutine[Any, Any, R]], ) -> Callable[Concatenate[T_algo, P], Coroutine[Any, Any, R]]: """Inject the algorithm's `LightningStore` into coroutine methods. The decorator calls `Algorithm.get_store()` once per invocation and passes the resulting store as an explicit argument to the wrapped coroutine. Decorated methods therefore receive the resolved store even when invoked by helper utilities rather than directly by the algorithm. Args: func: The coroutine that expects `(self, store, *args, **kwargs)`. Returns: A coroutine wrapper that automatically retrieves the store and forwards it to `func`. """ @functools.wraps(func) async def wrapper(self: T_algo, *args: P.args, **kwargs: P.kwargs) -> R: store = self.get_store() return await func(self, store, *args, **kwargs) return wrapper @overload def with_llm_proxy( required: Literal[False] = False, auto_start: bool = True, ) -> Callable[ [Callable[Concatenate[T_algo, Optional[LLMProxy], P], Coroutine[Any, Any, R]]], Callable[Concatenate[T_algo, P], Coroutine[Any, Any, R]], ]: ... @overload def with_llm_proxy( required: Literal[True], auto_start: bool = True, ) -> Callable[ [Callable[Concatenate[T_algo, LLMProxy, P], Coroutine[Any, Any, R]]], Callable[Concatenate[T_algo, P], Coroutine[Any, Any, R]], ]: ... def with_llm_proxy( required: bool = False, auto_start: bool = True, ) -> Callable[ [Callable[..., Coroutine[Any, Any, Any]]], Callable[..., Coroutine[Any, Any, Any]], ]: """Resolve and optionally lifecycle-manage the configured LLM proxy. Args: required: When True, raises `ValueError` if the algorithm does not have an [`LLMProxy`][agentlightning.LLMProxy] set. When False, the wrapped coroutine receives `None` if no proxy is available. auto_start: When True, [`LLMProxy.start()`][agentlightning.LLMProxy.start] is invoked if the proxy is not already running before calling `func` and [`LLMProxy.stop()`][agentlightning.LLMProxy.stop] is called afterwards. Returns: A decorator that injects the [`LLMProxy`][agentlightning.LLMProxy] (or `None`) as the first argument after `self` and manages automatic startup/shutdown when requested. """ def decorator( func: Callable[..., Coroutine[Any, Any, Any]], ) -> Callable[..., Coroutine[Any, Any, Any]]: @functools.wraps(func) async def wrapper(self: Algorithm, *args: Any, **kwargs: Any) -> Any: llm_proxy = self.get_llm_proxy() if required and llm_proxy is None: raise ValueError( "LLM proxy is required but not configured. Call set_llm_proxy() before using this method." ) auto_started = False if auto_start and llm_proxy is not None: if llm_proxy.is_running(): logger.info("Proxy is already running, skipping start") else: logger.info("Starting proxy, managed by the algorithm") await llm_proxy.start() auto_started = True try: # At type level, overloads guarantee that if `required=True` # then `func` expects a non-optional LLMProxy. return await func(self, llm_proxy, *args, **kwargs) finally: if auto_started and llm_proxy is not None: logger.info("Stopping proxy, managed by the algorithm") await llm_proxy.stop() return wrapper return decorator ================================================ FILE: agentlightning/algorithm/verl/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .interface import VERL __all__ = ["VERL"] ================================================ FILE: agentlightning/algorithm/verl/interface.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations from typing import TYPE_CHECKING, Any, Optional, Type from hydra import compose, initialize from omegaconf import OmegaConf from agentlightning.algorithm.base import Algorithm from agentlightning.client import AgentLightningClient from agentlightning.types import Dataset from agentlightning.verl.entrypoint import run_ppo # type: ignore if TYPE_CHECKING: from agentlightning.verl.daemon import AgentModeDaemon from agentlightning.verl.trainer import AgentLightningTrainer class VERL(Algorithm): """VERL-powered algorithm that delegates training to the VERL PPO runner. !!! warning Advanced customisation currently requires copying the VERL source and modifying it directly. Native hooks for overriding training behaviour will land in a future release. Args: config: Dictionary mirroring the overrides passed to the VERL CLI. The overrides are merged with VERL's packaged defaults via Hydra before launching training. trainer_cls: Optional override for the trainer class. Experimental. daemon_cls: Optional override for the daemon class. Experimental. !!! note "Trajectory aggregation (experimental)" Trajectory-level aggregation merges an entire multi-turn rollout into a single, masked training sample so GPU time is spent once per trajectory rather than N times per turn. Enable it via: ```python config["agentlightning"]["trace_aggregator"] = { "level": "trajectory", "trajectory_max_prompt_length": 4096, "trajectory_max_response_length": 34384, } ``` Keep conversations structured (message lists rather than manual string concatenation) so prefix matching can stitch traces. `trajectory_max_prompt_length` should be set to the maximum length of the prompt for the first turn, and `trajectory_max_response_length` should be set to the maximum cumulative length of agent responses in the full trajectory. Toggle `debug=True` plus `mismatch_log_dir` when you need to inspect retokenization or chat-template mismatches. See [this blog post](https://agent-lightning.github.io/posts/trajectory_level_aggregation/) for more details. Examples: ```python from agentlightning.algorithm.verl import VERL algorithm = VERL( config={ "algorithm": { "adv_estimator": "grpo", "use_kl_in_reward": False, }, "data": { "train_batch_size": 32, "max_prompt_length": 4096, "max_response_length": 2048, }, "actor_rollout_ref": { "rollout": { "tensor_model_parallel_size": 1, "n": 4, "log_prob_micro_batch_size_per_gpu": 4, "multi_turn": {"format": "hermes"}, "name": "vllm", "gpu_memory_utilization": 0.6, }, "actor": { "ppo_mini_batch_size": 32, "ppo_micro_batch_size_per_gpu": 4, "optim": {"lr": 1e-6}, "use_kl_loss": False, "kl_loss_coef": 0.0, "entropy_coeff": 0, "clip_ratio_low": 0.2, "clip_ratio_high": 0.3, "fsdp_config": { "param_offload": True, "optimizer_offload": True, }, }, "ref": { "log_prob_micro_batch_size_per_gpu": 8, "fsdp_config": {"param_offload": True}, }, "model": { "path": "Qwen/Qwen2.5-1.5B-Instruct", "use_remove_padding": True, "enable_gradient_checkpointing": True, }, }, "trainer": { "n_gpus_per_node": 1, "val_before_train": True, "critic_warmup": 0, "logger": ["console", "wandb"], "project_name": "AgentLightning", "experiment_name": "calc_x", "nnodes": 1, "save_freq": 64, "test_freq": 32, "total_epochs": 2, }, } ) trainer.fit(algorithm, train_dataset=my_train_dataset) ``` """ def __init__( self, config: dict[str, Any], trainer_cls: Optional[Type[AgentLightningTrainer]] = None, daemon_cls: Optional[Type[AgentModeDaemon]] = None, ): super().__init__() # Compose the base config exactly like your decorator: with initialize(version_base=None, config_path="pkg://agentlightning/verl"): base_cfg = compose(config_name="config") # Merge your dict overrides override_conf = OmegaConf.create(config) # Allow adding new fields OmegaConf.set_struct(base_cfg, False) self.config = OmegaConf.merge(base_cfg, override_conf) self.trainer_cls = trainer_cls self.daemon_cls = daemon_cls def run( self, train_dataset: Optional[Dataset[Any]] = None, val_dataset: Optional[Dataset[Any]] = None, ) -> None: """Launch the VERL PPO entrypoint with the configured runtime context. Args: train_dataset: Optional dataset forwarded to VERL for training. val_dataset: Optional dataset forwarded to VERL for evaluation. Raises: ValueError: If required dependencies such as the store, LLM proxy, or adapter have been garbage-collected when using the V1 execution mode. """ from agentlightning.verl.daemon import AgentModeDaemon from agentlightning.verl.trainer import AgentLightningTrainer trainer_cls = self.trainer_cls or AgentLightningTrainer daemon_cls = self.daemon_cls or AgentModeDaemon try: store = self.get_store() except Exception: print("Store is not set. Assuming v0 execution mode.") run_ppo( self.config, train_dataset=train_dataset, val_dataset=val_dataset, store=None, llm_proxy=None, adapter=None, trainer_cls=trainer_cls, daemon_cls=daemon_cls, ) else: print("Store is set. Assuming v1 execution mode.") llm_proxy = self.get_llm_proxy() adapter = self.get_adapter() run_ppo( self.config, train_dataset=train_dataset, val_dataset=val_dataset, store=store, llm_proxy=llm_proxy, adapter=adapter, trainer_cls=trainer_cls, daemon_cls=daemon_cls, ) def get_client(self) -> AgentLightningClient: """Create a client bound to the VERL-managed Agent Lightning server. Deprecated: Since v0.2. """ port = self.config.agentlightning.port return AgentLightningClient(endpoint=f"http://localhost:{port}") ================================================ FILE: agentlightning/cli/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Agent Lightning command line interface entry point.""" from __future__ import annotations import argparse import importlib import sys from typing import Dict, Iterable, Tuple _SUBCOMMANDS: Dict[str, Tuple[str, str]] = { "vllm": ("agentlightning.cli.vllm", "Run the vLLM CLI with Agent Lightning instrumentation."), "store": ("agentlightning.cli.store", "Run a LightningStore server."), "prometheus": ("agentlightning.cli.prometheus", "Serve Prometheus metrics from the multiprocess registry."), "agentops": ("agentlightning.cli.agentops_server", "Start the AgentOps server manager."), } _DESCRIPTION = "Agent Lightning CLI entry point.\n\nAvailable subcommands:\n" + "\n".join( f" {name:<10}{desc}" for name, (_, desc) in _SUBCOMMANDS.items() ) def main(argv: Iterable[str] | None = None) -> int: """Dispatch to the requested Agent Lightning subcommand.""" parser = argparse.ArgumentParser( prog="agl", description=_DESCRIPTION, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument("subcommand", choices=_SUBCOMMANDS.keys(), help="Subcommand to run.") parser.add_argument("args", nargs=argparse.REMAINDER, help=argparse.SUPPRESS) parsed = parser.parse_args(list(argv) if argv is not None else None) module_name, _ = _SUBCOMMANDS[parsed.subcommand] module = importlib.import_module(module_name) entry_point = getattr(module, "main", None) if entry_point is None: parser.error(f"Subcommand '{parsed.subcommand}' does not define a callable 'main'") dispatch_args = parsed.args original_argv = sys.argv sys.argv = [f"{parser.prog} {parsed.subcommand}", *dispatch_args] try: result = entry_point(dispatch_args or None) finally: sys.argv = original_argv if isinstance(result, int): return result return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: agentlightning/cli/prometheus.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Serve Prometheus metrics from the Agent Lightning multiprocess registry.""" from __future__ import annotations import argparse import asyncio import logging import os from pathlib import Path from typing import Iterable from fastapi import FastAPI from prometheus_client import make_asgi_app # pyright: ignore[reportUnknownVariableType] from agentlightning.logging import setup as setup_logging from agentlightning.utils.metrics import get_prometheus_registry from agentlightning.utils.server_launcher import PythonServerLauncher, PythonServerLauncherArgs logger = logging.getLogger(__name__) def ensure_prometheus_dir() -> str: """Ensure PROMETHEUS_MULTIPROC_DIR is set and the directory exists.""" directory = os.getenv("PROMETHEUS_MULTIPROC_DIR") if directory is None: raise ValueError("PROMETHEUS_MULTIPROC_DIR is not set.") Path(directory).mkdir(parents=True, exist_ok=True) logger.info("Serving Prometheus multiprocess metrics from %s", directory) return directory def create_prometheus_app(metrics_path: str = "/v1/prometheus") -> FastAPI: """Create a FastAPI app that exposes Prometheus metrics and a health endpoint. Args: metrics_path: URL path to expose the Prometheus metrics endpoint on. Returns: A FastAPI application ready to serve metrics. """ if not metrics_path.startswith("/"): raise ValueError("metrics_path must start with '/'.") normalized_path = metrics_path.rstrip("/") if normalized_path in ("", "/"): raise ValueError("metrics_path must not be '/'. Choose a sub-path such as /v1/prometheus.") app = FastAPI(title="Agent Lightning Prometheus exporter", docs_url=None, redoc_url=None) metrics_app = make_asgi_app(registry=get_prometheus_registry()) # pyright: ignore[reportUnknownVariableType] app.mount(normalized_path, metrics_app) # pyright: ignore[reportUnknownArgumentType] @app.get("/health") async def healthcheck() -> dict[str, str]: # pyright: ignore[reportUnusedFunction] return {"status": "ok"} return app def main(argv: Iterable[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Serve Prometheus metrics outside the LightningStore server.") parser.add_argument("--host", default="0.0.0.0", help="Host to bind the metrics server to.") parser.add_argument("--port", type=int, default=4748, help="Port to expose the Prometheus metrics on.") parser.add_argument( "--metrics-path", default="/v1/prometheus", help="HTTP path used to expose metrics. Must start with '/' and not be the root path.", ) parser.add_argument( "--log-level", default="INFO", choices=["DEBUG", "INFO", "WARNING", "ERROR"], help="Configure the logging level for the metrics server.", ) parser.add_argument( "--access-log", action="store_true", help="Enable uvicorn access logs. Disabled by default to reduce noise.", ) args = parser.parse_args(list(argv) if argv is not None else None) setup_logging(args.log_level) ensure_prometheus_dir() try: app = create_prometheus_app(args.metrics_path) except ValueError as exc: logger.error("Failed to configure prometheus app: %s", exc) return 1 launcher_args = PythonServerLauncherArgs( host=args.host, port=args.port, log_level=getattr(logging, args.log_level), access_log=args.access_log, healthcheck_url="/health", ) launcher = PythonServerLauncher(app, launcher_args) try: asyncio.run(launcher.run_forever()) except KeyboardInterrupt: logger.info("Received shutdown signal. Stopping Prometheus server.") except RuntimeError as exc: logger.error("Prometheus server failed to start: %s", exc, exc_info=True) return 1 return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: agentlightning/cli/store.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Run a LightningStore server for persistent access from multiple processes.""" from __future__ import annotations import argparse import asyncio import logging from typing import Iterable, List from agentlightning import setup_logging from agentlightning.store.client_server import LightningStoreServer from agentlightning.store.memory import InMemoryLightningStore from agentlightning.utils.metrics import ( ConsoleMetricsBackend, MetricsBackend, MultiMetricsBackend, PrometheusMetricsBackend, setup_multiprocess_prometheus, ) logger = logging.getLogger(__name__) def main(argv: Iterable[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Run a LightningStore server") parser.add_argument("--host", default="0.0.0.0", help="Host to bind the server to") parser.add_argument("--port", type=int, default=4747, help="Port to run the server on") parser.add_argument( "--cors-origin", dest="cors_origins", action="append", help="Allowed CORS origin. Repeat for multiple origins. Use '*' to allow all origins.", ) parser.add_argument( "--log-level", default="INFO", choices=["DEBUG", "INFO", "WARNING", "ERROR"], help="Configure the logging level for the store.", ) parser.add_argument( "--tracker", nargs="+", choices=["prometheus", "console"], help="Enable metrics tracking. Repeat for multiple trackers.", ) parser.add_argument( "--n-workers", default=1, type=int, help=( "Number of workers to run in the server. When it's greater than 1, the server will be run using `mp` launch mode. " "Only applicable for zero-copy stores such as MongoDB backend." ), ) parser.add_argument( "--backend", choices=["memory", "mongo"], default="memory", help="Backend to use for the store.", ) parser.add_argument( "--mongo-uri", default="mongodb://localhost:27017/?replicaSet=rs0", help="MongoDB URI to use for the store. Applicable only if --backend is 'mongo'.", ) args = parser.parse_args(list(argv) if argv is not None else None) setup_logging(args.log_level) trackers: List[MetricsBackend] = [] if args.tracker: if "prometheus" in args.tracker: logger.info("Enabling Prometheus metrics tracking.") if args.n_workers > 1: # This has to be done before prometheus_client is imported setup_multiprocess_prometheus() logger.info("Setting up Prometheus multiprocess directory for metrics tracking.") trackers.append(PrometheusMetricsBackend()) if "console" in args.tracker: logger.info("Enabling console metrics tracking.") trackers.append(ConsoleMetricsBackend()) if len(trackers) == 0: tracker: MetricsBackend | None = None elif len(trackers) == 1: tracker = trackers[0] else: tracker = MultiMetricsBackend(trackers) if args.backend == "memory": store = InMemoryLightningStore( thread_safe=True, # Using thread_safe store for server tracker=tracker, ) elif args.backend == "mongo": from agentlightning.store.mongo import MongoLightningStore store = MongoLightningStore(mongo_uri=args.mongo_uri, tracker=tracker) else: raise ValueError(f"Invalid backend: {args.backend}") if args.n_workers > 1: logger.info(f"Running the server using `mp` launch mode with {args.n_workers} workers.") launch_mode = "mp" else: logger.info("Running the server using `asyncio` launch mode.") launch_mode = "asyncio" server = LightningStoreServer( store, host=args.host, port=args.port, cors_allow_origins=args.cors_origins, launch_mode=launch_mode, tracker=tracker, n_workers=args.n_workers, ) try: asyncio.run(server.run_forever()) except RuntimeError as exc: logger.error("LightningStore server failed to start: %s", exc, exc_info=True) return 1 return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: agentlightning/cli/vllm.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations from typing import Iterable def main(argv: Iterable[str] | None = None) -> int: import sys from vllm.entrypoints.cli.main import main as vllm_main from agentlightning.instrumentation.vllm import instrument_vllm instrument_vllm() if argv is not None: original_argv = sys.argv sys.argv = [original_argv[0], *list(argv)] try: vllm_main() finally: sys.argv = original_argv else: vllm_main() return 0 if __name__ == "__main__": raise SystemExit(main()) ================================================ FILE: agentlightning/client.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Utilities for interacting with legacy Agent Lightning servers. This module contains compatibility shims that speak the deprecated HTTP interface used by older Agent Lightning deployments. Modern code should prefer the store-based APIs exposed by `agentlightning.store`, but keeping these clients available makes it easier to migrate existing workflows incrementally. """ import asyncio import logging import time import urllib.parse import warnings from typing import Any, Dict, List, Optional, Union import aiohttp import requests from .types import NamedResources, ResourcesUpdate, RolloutLegacy, Task, TaskIfAny, TaskInput logger = logging.getLogger(__name__) class AgentLightningClient: """Client wrapper for the legacy version-aware Agent Lightning server. The client exposes synchronous and asynchronous helpers for polling tasks, retrieving resource bundles, and submitting rollouts. It also maintains a simple in-memory cache keyed by the server-provided resource identifier to avoid redundant network requests. !!! warning "Deprecated" [`AgentLightningClient`][agentlightning.client.AgentLightningClient] is part of the legacy client/server stack. New code should rely on the store-based APIs implemented in `agentlightning.store`. Attributes: endpoint: Base URL of the Agent Lightning server. poll_interval: Delay in seconds between polling attempts when no task is available. timeout: Timeout in seconds applied to HTTP requests. task_count: Number of tasks claimed during the lifetime of this client. """ _next_task_uri = "/task" _resources_uri = "/resources" _latest_resources_uri = "/resources/latest" _report_rollout_uri = "/rollout" def __init__(self, endpoint: str, poll_interval: float = 5.0, timeout: float = 10.0): """Initialize the client. Args: endpoint: Root URL of the Agent Lightning server. poll_interval: Seconds to wait between polling attempts. timeout: Seconds before a request to the server is considered timed out. """ warnings.warn( "AgentLightningClient is deprecated. Please use LightningStoreClient instead.", DeprecationWarning ) self.endpoint = endpoint self.task_count = 0 self.poll_interval = poll_interval self.timeout = timeout self._resource_cache: Dict[str, ResourcesUpdate] = {} # TODO: mechanism to evict cache self._default_headers = {"X-AgentLightning-Client": "true"} async def _request_json_async(self, url: str) -> Optional[Dict[str, Any]]: """Perform an asynchronous ``GET`` request and parse the JSON payload. Args: url: Fully qualified URL to query. Returns: Parsed JSON body as a dictionary if the request succeeds; otherwise ``None``. """ timeout = aiohttp.ClientTimeout(total=self.timeout) async with aiohttp.ClientSession(timeout=timeout) as session: try: async with session.get(url, headers=self._default_headers) as resp: resp.raise_for_status() return await resp.json() except Exception as e: logger.debug(f"Async GET request failed for {url}: {e}") return None async def _post_json_async(self, url: str, payload: Dict[str, Any]) -> Optional[Dict[str, Any]]: """Perform an asynchronous ``POST`` request with a JSON body. Args: url: Fully qualified URL that accepts the payload. payload: Dictionary that will be serialized and sent as JSON. Returns: Parsed JSON body as a dictionary if the request succeeds; otherwise ``None``. """ timeout = aiohttp.ClientTimeout(total=self.timeout) async with aiohttp.ClientSession(timeout=timeout) as session: try: async with session.post(url, json=payload, headers=self._default_headers) as resp: resp.raise_for_status() return await resp.json() except Exception as e: logger.debug(f"Async POST request failed for {url}: {e}") return None async def poll_next_task_async(self) -> Optional[Task]: """Poll the server asynchronously until a task becomes available. Returns: The next [`Task`][agentlightning.Task] exposed by the server, or ``None`` if polling fails. """ url = urllib.parse.urljoin(self.endpoint, self._next_task_uri) while True: response = await self._request_json_async(url) if response: task_if_any = TaskIfAny.model_validate(response) if task_if_any.is_available and task_if_any.task: self.task_count += 1 logger.info(f"[Task {self.task_count} Received] ID: {task_if_any.task.rollout_id}") return task_if_any.task logger.debug(f"No task available yet. Retrying in {self.poll_interval} seconds...") await asyncio.sleep(self.poll_interval) async def get_resources_by_id_async(self, resource_id: str) -> Optional[ResourcesUpdate]: """Fetch a specific resource bundle by identifier. Args: resource_id: Identifier sourced from the task metadata. Returns: Cached or freshly downloaded [`ResourcesUpdate`][agentlightning.ResourcesUpdate], or ``None`` when the server returns an error. """ if resource_id in self._resource_cache: logger.debug(f"Found resources '{resource_id}' in cache.") return self._resource_cache[resource_id] url = urllib.parse.urljoin(self.endpoint, f"{self._resources_uri}/{resource_id}") response = await self._request_json_async(url) if response: resources_update = ResourcesUpdate.model_validate(response) self._resource_cache[resource_id] = resources_update logger.info(f"Fetched and cached resources for ID: {resource_id}") return resources_update return None async def get_latest_resources_async(self) -> Optional[ResourcesUpdate]: """Fetch the most recent resource bundle advertised by the server. Returns: [`ResourcesUpdate`][agentlightning.ResourcesUpdate] for the newest version, or ``None`` when unavailable. """ url = urllib.parse.urljoin(self.endpoint, self._latest_resources_uri) response = await self._request_json_async(url) if response: resources_update = ResourcesUpdate.model_validate(response) # Cache this result as well self._resource_cache[resources_update.resources_id] = resources_update return resources_update return None async def post_rollout_async(self, rollout: RolloutLegacy) -> Optional[Dict[str, Any]]: """Submit a completed rollout back to the server. Args: rollout: Legacy rollout payload produced by the executor. Returns: Parsed JSON response returned by the server, or ``None`` when the request fails. """ url = urllib.parse.urljoin(self.endpoint, self._report_rollout_uri) payload = rollout.model_dump(mode="json") return await self._post_json_async(url, payload) def _request_json(self, url: str) -> Optional[Dict[str, Any]]: """Perform a blocking ``GET`` request and parse the JSON payload. Args: url: Fully qualified URL to query. Returns: Parsed JSON body as a dictionary if the request succeeds; otherwise ``None``. """ try: response = requests.get(url, timeout=self.timeout, headers=self._default_headers) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: logger.debug(f"Sync GET request failed for {url}: {e}") return None def _post_json(self, url: str, payload: Dict[str, Any]) -> Optional[Dict[str, Any]]: """Perform a blocking ``POST`` request with a JSON payload. Args: url: Fully qualified URL that accepts the payload. payload: Dictionary that will be serialized and sent as JSON. Returns: Parsed JSON body as a dictionary if the request succeeds; otherwise ``None``. """ try: response = requests.post(url, json=payload, timeout=self.timeout, headers=self._default_headers) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: logger.debug(f"Sync POST request failed for {url}: {e}") return None def poll_next_task(self) -> Optional[Task]: """Poll the server synchronously until a task becomes available. Returns: The next [`Task`][agentlightning.Task] available for execution, or ``None`` if polling fails. """ url = urllib.parse.urljoin(self.endpoint, self._next_task_uri) while True: response = self._request_json(url) if response: task_if_any = TaskIfAny.model_validate(response) if task_if_any.is_available and task_if_any.task: self.task_count += 1 logger.info(f"[Task {self.task_count} Received] ID: {task_if_any.task.rollout_id}") return task_if_any.task logger.debug(f"No task available yet. Retrying in {self.poll_interval} seconds...") time.sleep(self.poll_interval) def get_resources_by_id(self, resource_id: str) -> Optional[ResourcesUpdate]: """Fetch a specific resource bundle by identifier. Args: resource_id: Identifier sourced from the task metadata. Returns: Cached or freshly downloaded [`ResourcesUpdate`][agentlightning.ResourcesUpdate], or ``None`` when the server returns an error. """ if resource_id in self._resource_cache: logger.debug(f"Found resources '{resource_id}' in cache.") return self._resource_cache[resource_id] url = urllib.parse.urljoin(self.endpoint, f"{self._resources_uri}/{resource_id}") response = self._request_json(url) if response: resources_update = ResourcesUpdate.model_validate(response) self._resource_cache[resource_id] = resources_update logger.info(f"Fetched and cached resources for ID: {resource_id}") return resources_update return None def get_latest_resources(self) -> Optional[ResourcesUpdate]: """Fetch the most recent resource bundle advertised by the server. Returns: [`ResourcesUpdate`][agentlightning.ResourcesUpdate] for the newest version, or ``None`` when unavailable. """ url = urllib.parse.urljoin(self.endpoint, self._latest_resources_uri) response = self._request_json(url) if response: resources_update = ResourcesUpdate.model_validate(response) self._resource_cache[resources_update.resources_id] = resources_update return resources_update return None def post_rollout(self, rollout: RolloutLegacy) -> Optional[Dict[str, Any]]: """Submit a completed rollout back to the server. Args: rollout: Legacy rollout payload produced by the executor. Returns: Parsed JSON response returned by the server, or ``None`` when the request fails. """ url = urllib.parse.urljoin(self.endpoint, self._report_rollout_uri) payload = rollout.model_dump(mode="json") return self._post_json(url, payload) class DevTaskLoader(AgentLightningClient): """In-memory task loader used for development and integration tests. The loader mimics the behavior of the legacy HTTP server by storing tasks and resources locally. Polling methods simply iterate over the provided collection, allowing rapid iteration without provisioning any external infrastructure. !!! warning "Deprecated" [`DevTaskLoader`][agentlightning.client.DevTaskLoader] is a compatibility shim. Prefer [`Trainer.dev`][agentlightning.Trainer.dev] for new code. """ def __init__( self, tasks: Union[List[TaskInput], List[Task]], resources: Union[NamedResources, ResourcesUpdate], **kwargs: Any, ): """Initialize the loader with predefined tasks and resources. Args: tasks: Sequence of task inputs or preconstructed tasks that will be served in order. resources: Static resources returned for any `resources_id` query. **kwargs: Additional keyword arguments forwarded to the parent client. Raises: ValueError: If no tasks are provided or both [`Task`][agentlightning.Task] and [`TaskInput`][agentlightning.TaskInput] instances are mixed. """ warnings.warn("DevTaskLoader is deprecated. Please use Trainer.dev instead.", DeprecationWarning) super().__init__(endpoint="local://", **kwargs) self._tasks = tasks.copy() if len(self._tasks) == 0: raise ValueError("DevTaskLoader requires at least one task to be provided.") # Check if tasks are mixture of TaskInput and Task if any(isinstance(task, Task) for task in self._tasks): if not all(isinstance(task, Task) for task in self._tasks): raise ValueError("All tasks must be either Task or TaskInput objects.") self._task_index = 0 if isinstance(resources, ResourcesUpdate): self._resources_update = resources else: self._resources_update = ResourcesUpdate( resources_id="local", resources=resources, create_time=time.time(), update_time=time.time(), version=1 ) # Store rollouts posted back to the loader for easy debugging of local runs self._rollouts: List[RolloutLegacy] = [] @property def rollouts(self) -> List[RolloutLegacy]: """Return the rollouts posted back to the loader during development runs.""" return self._rollouts def poll_next_task(self) -> Optional[Task]: """Return the next task from the local queue. If [`TaskInput`][agentlightning.TaskInput] instances were provided, they are converted into [`Task`][agentlightning.Task] objects on the fly. Otherwise, the preconstructed tasks are returned in sequence. Returns: Next task to execute. """ if self._task_index >= len(self._tasks): self._task_index = 0 task_or_input = self._tasks[self._task_index] if isinstance(task_or_input, Task): task = task_or_input else: rollout_id = f"local_task_{self._task_index + 1:03d}" task = Task( rollout_id=rollout_id, input=task_or_input, resources_id=self._resources_update.resources_id, create_time=time.time(), ) self._task_index += 1 self.task_count += 1 logger.info(f"[Task {self.task_count} Received] Task ID: {task.rollout_id}") return task def get_resources_by_id(self, resource_id: str) -> Optional[ResourcesUpdate]: logger.debug(f"DevTaskLoader checking resources for ID: {resource_id}") if resource_id != self._resources_update.resources_id: raise ValueError( f"Resource ID '{resource_id}' not found. Only '{self._resources_update.resources_id}' is available." ) return self._resources_update def get_latest_resources(self) -> Optional[ResourcesUpdate]: logger.debug("DevTaskLoader returning latest resources.") return self._resources_update def post_rollout(self, rollout: RolloutLegacy) -> Optional[Dict[str, Any]]: logger.debug(f"DevTaskLoader received rollout for task: {rollout.rollout_id}") self._rollouts.append(rollout) return {"status": "received", "rollout_id": rollout.rollout_id} async def poll_next_task_async(self) -> Optional[Task]: return self.poll_next_task() async def get_resources_by_id_async(self, resource_id: str) -> Optional[ResourcesUpdate]: return self.get_resources_by_id(resource_id) async def get_latest_resources_async(self) -> Optional[ResourcesUpdate]: return self.get_latest_resources() async def post_rollout_async(self, rollout: RolloutLegacy) -> Optional[Dict[str, Any]]: return self.post_rollout(rollout) def __repr__(self): return f"DevTaskLoader(num_tasks={len(self._tasks)}, resources={self._resources_update.resources})" ================================================ FILE: agentlightning/config.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ This file is not carefully reviewed. It might contain unintentional bugs and issues. Please always review the parsed construction arguments before using them. """ from __future__ import annotations import argparse import inspect import logging from typing import _GenericAlias # type: ignore from typing import ( Any, Callable, Dict, List, Tuple, Type, TypeVar, Union, get_args, get_origin, get_type_hints, overload, ) CliConfigurable = Any logger = logging.getLogger(__name__) __all__ = ["lightning_cli"] # TypeVars for precise return type hinting with overloads _C = TypeVar("_C", bound=CliConfigurable) _C1 = TypeVar("_C1", bound=CliConfigurable) _C2 = TypeVar("_C2", bound=CliConfigurable) _C3 = TypeVar("_C3", bound=CliConfigurable) _C4 = TypeVar("_C4", bound=CliConfigurable) # Custom type for CLI arguments that can be string or None def nullable_str(value: str) -> str | None: """Converts specific string values (case-insensitive) to None, otherwise returns the string.""" if value.lower() in ["none", "null", "~", "nil"]: # Define keywords for None return None return value def nullable_int(value: str) -> int | None: """Converts specific string values (case-insensitive) to None, otherwise returns the integer.""" if value.lower() in ["none", "null", "~", "nil"]: # Define keywords for None return None try: return int(value) except ValueError: raise argparse.ArgumentTypeError(f"Invalid integer value: '{value}'") def nullable_float(value: str) -> float | None: """Converts specific string values (case-insensitive) to None, otherwise returns the float.""" if value.lower() in ["none", "null", "~", "nil"]: # Define keywords for None return None try: return float(value) except ValueError: raise argparse.ArgumentTypeError(f"Invalid float value: '{value}'") def _str_to_bool(v: str) -> bool: """Converts common string representations of bool to Python bool (case-insensitive).""" if isinstance(v, bool): # type: ignore return v # Allow passing bools directly if used programmatically lowered_v = v.lower() if lowered_v in ("yes", "true", "t", "y", "1"): return True elif lowered_v in ("no", "false", "f", "n", "0"): return False else: raise argparse.ArgumentTypeError(f"Boolean value expected (e.g., 'true', 'false', 'yes', 'no'), got '{v}'") def _get_param_type_details(param_annotation: Any) -> Tuple[Any, bool, bool]: """Normalize an annotation into its core type, optionality, and list status. Args: param_annotation: The annotation to inspect. Returns: A tuple ``(core_type, is_optional, is_list)`` describing the normalized type. - For ``Optional[T]`` → ``(T, True, is_list_status_of_T)`` - For ``List[T]`` → ``(List[T], is_optional_status_of_List, True)`` - For ``Optional[List[T]]`` → ``(List[T], True, True)`` """ is_optional = False is_list = False current_type = param_annotation # Check for outer Optional origin = get_origin(current_type) if origin is Union: union_args = get_args(current_type) if len(union_args) == 2 and type(None) in union_args: is_optional = True current_type = next(arg for arg in union_args if arg is not type(None)) # Unwrap Optional # Check if the (potentially unwrapped) type is a List origin = get_origin(current_type) # Re-check origin after potential unwrap if origin is list or (isinstance(current_type, _GenericAlias) and current_type.__origin__ is list): is_list = True return current_type, is_optional, is_list def _determine_argparse_type(param_type: Any) -> Callable[[str], Any]: """Determines the type for argparse based on parameter type details.""" core_type, is_optional, _ = _get_param_type_details(param_type) if core_type is str and is_optional: return nullable_str # Special handling for Optional[str] elif core_type is int and is_optional: return nullable_int elif core_type is float and is_optional: return nullable_float elif core_type is bool: return _str_to_bool # Special handling for bool elif core_type in (int, float, str): return core_type return str # Default to str if no specific type is provided (including empty) def _determine_argparse_type_and_nargs( core_param_type: Any, is_param_list: bool # The type after unwrapping an outer Optional ) -> Dict[str, Any]: """Determines the 'type' and 'nargs' for argparse based on parameter type details.""" kwargs: Dict[str, Any] = {} if is_param_list: kwargs["nargs"] = "*" # Allows zero or more arguments for lists list_item_annotations = get_args(core_param_type) # For List[T], core_param_type is List[T] if list_item_annotations and list_item_annotations[0] is not Any: item_ann = list_item_annotations[0] # Check if the list item itself is, e.g., Optional[str] or bool kwargs["type"] = _determine_argparse_type(item_ann) else: kwargs["type"] = str else: # Not a list kwargs["type"] = _determine_argparse_type(core_param_type) return kwargs def _build_help_string(cls_name: str, param_name: str, core_type: Any, is_optional: bool, is_list: bool) -> str: """Constructs a descriptive help string for a CLI argument.""" type_display_name = "Any" if core_type is not inspect.Parameter.empty: type_display_name = getattr(core_type, "__name__", str(core_type)) if is_list: list_item_args = get_args(core_type) # core_type is List[T] here item_name = "Any" if list_item_args and list_item_args[0] is not Any: inner_item_core_type, inner_item_optional, _ = _get_param_type_details(list_item_args[0]) item_name = getattr(inner_item_core_type, "__name__", str(inner_item_core_type)) if inner_item_optional: # e.g. List[Optional[str]] item_name = f"Optional[{item_name}]" type_display_name = f"List[{item_name}]" full_type_display = f"Optional[{type_display_name}]" if is_optional and not is_list else type_display_name if is_optional and is_list: # e.g. Optional[List[str]] full_type_display = f"Optional[{type_display_name}]" help_str = f"For {cls_name}: '{param_name}'. Inferred type: {full_type_display}." return help_str def _add_argument_for_parameter( parser: argparse.ArgumentParser, cls: Type[CliConfigurable], param_name: str, param_obj: inspect.Parameter, dest_name: str, resolved_param_annotation: Any = None, ) -> None: """Configures and adds a single CLI argument for an __init__ parameter.""" if resolved_param_annotation is None: param_type_annotation = param_obj.annotation else: param_type_annotation = resolved_param_annotation # core_type is the main type (e.g., int, str, List[str]), after unwrapping the outermost Optional. # is_overall_optional indicates if the parameter itself can be None (e.g. param: Optional[T] = None) # is_list indicates if core_type is a List. core_type, is_overall_optional, is_list = _get_param_type_details(param_type_annotation) has_init_default = param_obj.default is not inspect.Parameter.empty init_default_value = param_obj.default if has_init_default else None argparse_kwargs = _determine_argparse_type_and_nargs(core_type if is_list else param_type_annotation, is_list) if has_init_default: argparse_kwargs["default"] = init_default_value elif is_overall_optional: # Parameter is Optional (e.g. Optional[int]) and no explicit default in __init__ argparse_kwargs["default"] = None # So, if not provided on CLI, it becomes None. argparse_kwargs["help"] = _build_help_string(cls.__name__, param_name, core_type, is_overall_optional, is_list) if not has_init_default and not is_overall_optional: # Required if no __init__ default AND not Optional argparse_kwargs["required"] = True if "default" in argparse_kwargs: # Should not happen if logic is correct del argparse_kwargs["default"] cli_arg_name = f"--{cls.__name__.lower()}.{param_name.replace('_', '-')}" parser.add_argument(cli_arg_name, dest=dest_name, **argparse_kwargs) def _add_arguments_for_class( parser: argparse.ArgumentParser, cls: Type[CliConfigurable], class_arg_configs_maps: Dict[Type[CliConfigurable], Dict[str, str]], # Maps cls to {param_name: dest_name} ) -> None: """Adds all relevant CLI arguments for a given class by processing its __init__ parameters.""" cls_name_lower = cls.__name__.lower() sig = inspect.signature(cls.__init__) try: # Resolve string annotations to actual types using get_type_hints. # For methods, get_type_hints automatically uses obj.__globals__ for globalns. resolved_hints = get_type_hints(cls.__init__) except Exception as e: logger.warning( f"Could not resolve type hints for {cls.__name__}.__init__ using get_type_hints: {e}. " f"CLI argument parsing for this class might be based on string annotations, " "which could be unreliable for complex types." ) resolved_hints = {} # Fallback to an empty dict if resolution fails if cls not in class_arg_configs_maps: # Ensure the class entry exists class_arg_configs_maps[cls] = {} for param_name, param_obj in sig.parameters.items(): if param_name == "self": # Skip 'self' continue dest_name = f"{cls_name_lower}_{param_name}" # Unique destination for argparse class_arg_configs_maps[cls][param_name] = dest_name # Store mapping for later instantiation # Use the resolved hint if available, otherwise fallback to param_obj.annotation (which might be a string) actual_param_annotation = resolved_hints.get(param_name, param_obj.annotation) _add_argument_for_parameter(parser, cls, param_name, param_obj, dest_name, actual_param_annotation) def _create_argument_parser() -> argparse.ArgumentParser: """Creates and returns the main ArgumentParser with default settings.""" return argparse.ArgumentParser( description="CLI configurator for application components.", formatter_class=argparse.ArgumentDefaultsHelpFormatter, # Automatically shows default values in help ) def _instantiate_classes( parsed_args: argparse.Namespace, classes: Tuple[Type[CliConfigurable], ...], class_arg_configs_maps: Dict[Type[CliConfigurable], Dict[str, str]], ) -> Tuple[CliConfigurable, ...]: """Instantiates classes using the parsed CLI arguments and the stored mappings.""" instances_list: List[CliConfigurable] = [] for cls in classes: constructor_args: Dict[str, Any] = {} # Get the {__init__ param_name: argparse_dest_name} map for the current class param_to_dest_map = class_arg_configs_maps.get(cls, {}) sig = inspect.signature(cls.__init__) for param_name_in_sig, _ in sig.parameters.items(): if param_name_in_sig == "self": continue dest_name_for_arg = param_to_dest_map.get(param_name_in_sig) if dest_name_for_arg and hasattr(parsed_args, dest_name_for_arg): value = getattr(parsed_args, dest_name_for_arg) constructor_args[param_name_in_sig] = value # If an argument was required by argparse, parse_args() would have exited if missing. # If not required and not provided, its default value (set by argparse) is used. try: logger.info("Instantiating %s with args: %s", cls.__name__, constructor_args) instances_list.append(cls(**constructor_args)) except Exception as e: parsed_args_for_cls = { k: getattr(parsed_args, v) for k, v in param_to_dest_map.items() if hasattr(parsed_args, v) } logger.error( f"Error instantiating {cls.__name__} with resolved args {constructor_args}. " f"Parsed args for class: " f"{parsed_args_for_cls}. " f"Error: {e}" ) raise return tuple(instances_list) @overload def lightning_cli(cls1: Type[_C1]) -> _C1: ... @overload def lightning_cli(cls1: Type[_C1], cls2: Type[_C2]) -> Tuple[_C1, _C2]: ... @overload def lightning_cli(cls1: Type[_C1], cls2: Type[_C2], cls3: Type[_C3]) -> Tuple[_C1, _C2, _C3]: ... @overload def lightning_cli(cls1: Type[_C1], cls2: Type[_C2], cls3: Type[_C3], cls4: Type[_C4]) -> Tuple[_C1, _C2, _C3, _C4]: ... @overload # Fallback for more than 4 or a dynamic number of classes def lightning_cli(*classes: Type[CliConfigurable]) -> Tuple[CliConfigurable, ...]: ... # FIXME: lightning_cli needs to be fixed to comply with the latest trainer implementation. def lightning_cli(*classes: Type[CliConfigurable]) -> CliConfigurable | Tuple[CliConfigurable, ...]: # type: ignore """ Parses command-line arguments to configure and instantiate provided CliConfigurable classes. Args: *classes: One or more classes that inherit from CliConfigurable. Each class's __init__ parameters will be exposed as command-line arguments. Returns: A tuple of instantiated objects, corresponding to the input classes in order. """ if not classes: return tuple() # Return an empty tuple if no classes are provided parser = _create_argument_parser() # This map will store {cls: {init_param_name: argparse_dest_name}} class_arg_configs_maps: Dict[Type[CliConfigurable], Dict[str, str]] = {} for cls in classes: _add_arguments_for_class(parser, cls, class_arg_configs_maps) parsed_args = parser.parse_args() # Uses sys.argv[1:] by default # Correctly handle single class case for return type matching overloads instances = _instantiate_classes(parsed_args, classes, class_arg_configs_maps) if len(classes) == 1: return instances[0] return instances ================================================ FILE: agentlightning/emitter/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Convenient helpers for creating spans / traces. All emitters operate in two modes, switchable via the `propagate` parameter. The emitters first [`SpanCreationRequest`][agentlightning.SpanCreationRequest] object, then: 1. When `propagate` is True, this creation request will be propagated to the active tracer and a [`Span`][agentlightning.Span] instance will be created (possibly deferred). 2. When `propagate` is False, the creation request will be returned directly. Useful for cases when you don't have a tracer but you want to create a creation request for later use. """ from .annotation import emit_annotation, operation from .exception import emit_exception from .message import emit_message, get_message_value from .object import emit_object, get_object_value from .reward import ( emit_reward, find_final_reward, find_reward_spans, get_reward_value, get_rewards_from_span, is_reward_span, reward, ) __all__ = [ "reward", "operation", "emit_reward", "get_reward_value", "get_rewards_from_span", "is_reward_span", "find_reward_spans", "find_final_reward", "emit_message", "emit_object", "emit_exception", "emit_annotation", "get_message_value", "get_object_value", ] ================================================ FILE: agentlightning/emitter/annotation.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Helpers for emitting annotation/operation spans.""" import asyncio import functools import inspect import logging from types import TracebackType from typing import ( Any, Callable, ContextManager, Dict, Optional, Tuple, Type, TypeVar, Union, cast, overload, ) from agentlightning.semconv import AGL_ANNOTATION, AGL_OPERATION, LightningSpanAttributes from agentlightning.tracer.base import get_active_tracer from agentlightning.tracer.dummy import DummyTracer from agentlightning.types import SpanCoreFields, SpanRecordingContext, TraceStatus from agentlightning.utils.otel import check_attributes_sanity, flatten_attributes, sanitize_attributes _FnType = TypeVar("_FnType", bound=Callable[..., Any]) logger = logging.getLogger(__name__) def emit_annotation(annotation: Dict[str, Any], propagate: bool = True) -> SpanCoreFields: """Emit a new annotation span. This is the underlying implementation of [`emit_reward`][agentlightning.emit_reward]. Annotation spans are used to annotate a specific event or a part of rollout. See [semconv][agentlightning.semconv] for conventional annotation keys in Agent-lightning. If annotations contain nested dicts, they will be flattened before emitting. Complex objects will lead to emitting failures. Args: annotation: Dictionary containing annotation key-value pairs. Representatives are rewards, tags, and metadata. propagate: Whether to propagate the span to tracers automatically. """ annotation_attributes = flatten_attributes(annotation, expand_leaf_lists=False) check_attributes_sanity(annotation_attributes) sanitized_attributes = sanitize_attributes(annotation_attributes) logger.debug("Emitting annotation span with keys %s", sanitized_attributes.keys()) if propagate: tracer = get_active_tracer() if tracer is None: raise RuntimeError("No active tracer found. Cannot emit annotation span.") else: tracer = DummyTracer() return tracer.create_span( name=AGL_ANNOTATION, attributes=sanitized_attributes, status=TraceStatus(status_code="OK"), ) class OperationContext: """Context manager and decorator for tracing operations. This class manages a tracer-backed span for a logical unit of work. It can be used either: * As a decorator, in which case inputs and outputs are inferred automatically from the wrapped function's signature. * As a context manager, in which case inputs and outputs can be recorded explicitly via [`set_input`][agentlightning.emitter.annotation.OperationContext.set_input] and [`set_output`][agentlightning.emitter.annotation.OperationContext.set_output]. Attributes: name: Human-readable span name. initial_attributes: Attributes applied when the span is created. tracer: Tracer implementation used to create spans. """ def __init__(self, name: str, attributes: Dict[str, Any], propagate: bool = True) -> None: """Initialize a new operation context. Args: name: Human-readable name of the span. attributes: Initial attributes attached to the span. Values are JSON-serialized where necessary. propagate: Whether the span should be sent to active exporters. """ self.name = name self.initial_attributes = flatten_attributes(attributes, expand_leaf_lists=False) self.propagate = propagate if propagate: tracer = get_active_tracer() if tracer is None: raise RuntimeError("No active tracer found. Cannot trace operation spans.") self.tracer = tracer else: self.tracer = DummyTracer() self._ctx_manager: Optional[ContextManager[SpanRecordingContext]] = None self._recording_context: Optional[SpanRecordingContext] = None self._span: Optional[SpanCoreFields] = None def __enter__(self) -> "OperationContext": """Enter the context manager and start a new span. Returns: The current :class:`OperationContext` instance with an active span. """ sanitized_attrs = sanitize_attributes(self.initial_attributes) self._ctx_manager = self.tracer.operation_context(self.name, attributes=sanitized_attrs) recording_context = self._ctx_manager.__enter__() self._recording_context = recording_context return self def __exit__( self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType], ) -> None: """Exit the context manager and finish the span.""" if self._ctx_manager: self._ctx_manager.__exit__(exc_type, exc_val, exc_tb) if self._recording_context: self._span = self._recording_context.get_recorded_span() self._ctx_manager = None self._recording_context = None def span(self) -> SpanCoreFields: """Get the span that was created by this context manager.""" if self._span is None: raise RuntimeError("Span is not ready yet.") return self._span def set_input(self, *args: Any, **kwargs: Any) -> None: """Record input arguments on the current span. Positional arguments are stored under the `input.args.` attributes, and keyword arguments are stored under `input.` attributes. This is intended for use inside a `with operation(...) as op` block. Args: *args: Positional arguments to record. **kwargs: Keyword arguments to record. """ if not self._recording_context: raise RuntimeError("No recording context found. Cannot set input.") prefix = LightningSpanAttributes.OPERATION_INPUT.value attributes: Dict[str, Any] = {} if args: for idx, value in enumerate(args): flattened = flatten_attributes({str(idx): value}) for nested_key, nested_value in flattened.items(): attributes[f"{prefix}.args.{nested_key}"] = nested_value if kwargs: for key, value in kwargs.items(): flattened = flatten_attributes({key: value}) for nested_key, nested_value in flattened.items(): attributes[f"{prefix}.{nested_key}"] = nested_value if attributes: self._recording_context.record_attributes(sanitize_attributes(attributes)) def set_output(self, output: Any) -> None: """Record the output value on the current span. This is intended for use inside a `with operation(...) as op` block. Args: output: The output value to record. """ if not self._recording_context: raise RuntimeError("No recording context found. Cannot set output.") flattened = flatten_attributes({LightningSpanAttributes.OPERATION_OUTPUT.value: output}) self._recording_context.record_attributes(sanitize_attributes(flattened)) def __call__(self, fn: _FnType) -> _FnType: """Wrap a callable so its execution is traced in a span. When used as a decorator, a new span is created for each call to the wrapped function. The bound arguments are recorded as input attributes, the return value is recorded as an output attribute, and any exception is recorded and marks the span as an error. Args: fn: The function or coroutine function to wrap. Returns: The wrapped callable. """ function_name = fn.__name__ sig = inspect.signature(fn) sanitized_init_attrs = sanitize_attributes( {LightningSpanAttributes.OPERATION_NAME.value: function_name, **self.initial_attributes} ) def _record_auto_inputs( recording_ctx: SpanRecordingContext, args: Tuple[Any, ...], kwargs: Dict[str, Any] ) -> None: """Bind arguments to signature and log them on the span.""" attributes: Dict[str, Any] = {} try: bound = sig.bind(*args, **kwargs) bound.apply_defaults() for name, value in bound.arguments.items(): parameter = sig.parameters.get(name) if parameter and parameter.kind is inspect.Parameter.VAR_POSITIONAL: attr_prefix = f"{LightningSpanAttributes.OPERATION_INPUT.value}.{name}" for idx, item in enumerate(value): flattened = flatten_attributes({str(idx): item}) for nested_key, nested_value in flattened.items(): attributes[f"{attr_prefix}.{nested_key}"] = nested_value else: flattened = flatten_attributes({name: value}) for nested_key, nested_value in flattened.items(): attributes[f"{LightningSpanAttributes.OPERATION_INPUT.value}.{nested_key}"] = nested_value except Exception: if args: for idx, value in enumerate(args): flattened = flatten_attributes({str(idx): value}) for nested_key, nested_value in flattened.items(): attributes[f"{LightningSpanAttributes.OPERATION_INPUT.value}.args.{nested_key}"] = ( nested_value ) if kwargs: flattened = flatten_attributes({"kwargs": kwargs}) for nested_key, nested_value in flattened.items(): attributes[f"{LightningSpanAttributes.OPERATION_INPUT.value}.{nested_key}"] = nested_value if attributes: recording_ctx.record_attributes(sanitize_attributes(attributes)) def _record_auto_outputs(recording_ctx: SpanRecordingContext, result: Any) -> None: """Record the output value on the span.""" flattened = flatten_attributes({LightningSpanAttributes.OPERATION_OUTPUT.value: result}) recording_ctx.record_attributes(sanitize_attributes(flattened)) if inspect.iscoroutinefunction(fn) or ( # For backwards compatibility. hasattr(asyncio, "iscoroutinefunction") and asyncio.iscoroutinefunction(fn) # type: ignore ): @functools.wraps(fn) async def async_wrapper(*args: Any, **kwargs: Any) -> Any: """Async wrapper that traces the wrapped coroutine.""" with self.tracer.operation_context(self.name, attributes=sanitized_init_attrs) as recording_ctx: _record_auto_inputs(recording_ctx, args, kwargs) result = await fn(*args, **kwargs) _record_auto_outputs(recording_ctx, result) return result return cast(_FnType, async_wrapper) else: @functools.wraps(fn) def sync_wrapper(*args: Any, **kwargs: Any) -> Any: """Sync wrapper that traces the wrapped callable.""" with self.tracer.operation_context(self.name, attributes=sanitized_init_attrs) as recording_ctx: _record_auto_inputs(recording_ctx, args, kwargs) result = fn(*args, **kwargs) _record_auto_outputs(recording_ctx, result) return result return cast(_FnType, sync_wrapper) @overload def operation( fn: _FnType, *, propagate: bool = True, name: Optional[str] = None, **additional_attributes: Any ) -> _FnType: ... @overload def operation( *, propagate: bool = True, name: Optional[str] = None, **additional_attributes: Any ) -> OperationContext: ... @overload def operation(fn: _FnType, *, name: Optional[str] = None, **additional_attributes: Any) -> _FnType: ... @overload def operation(*, name: Optional[str] = None, **additional_attributes: Any) -> OperationContext: ... @overload def operation(fn: _FnType, **additional_attributes: Any) -> _FnType: ... @overload def operation(**additional_attributes: Any) -> OperationContext: ... def operation( fn: Optional[_FnType] = None, *, propagate: bool = True, name: Optional[str] = None, **additional_attributes: Any, ) -> Union[_FnType, OperationContext]: """Entry point for tracking operations. This helper can be used either as a decorator or as a context manager. The span name is fixed to [`AGL_OPERATION`][agentlightning.semconv.AGL_OPERATION]; custom span names are not supported. Any keyword arguments are recorded as span attributes. Usage as a decorator: ```python @operation def func(...): ... @operation(category="compute") def func(...): ... ``` Usage as a context manager: ```python with operation(user_id=123) as op: op.set_input(data=data) # ... do work ... op.set_output(result) ``` Args: fn: When used as `@operation`, this is the wrapped function. When used as `operation(**attrs)`, this should be omitted (or left as `None`) and only keyword attributes are provided. propagate: Whether spans should use the active span processor. When False, spans will stay local and not be exported. name: Optional alias that populates [`LightningSpanAttributes.OPERATION_NAME`][agentlightning.semconv.LightningSpanAttributes.OPERATION_NAME] when `additional_attributes` does not already define it. **additional_attributes: Additional span attributes to attach at creation time. Returns: Either a wrapped callable (when used as a decorator) or an [`OperationContext`][agentlightning.emitter.annotation.OperationContext] (when used as a context manager factory). """ if name is not None: if LightningSpanAttributes.OPERATION_NAME.value in additional_attributes: raise ValueError("Cannot specify both `name` and `additional_attributes.operation_name`.") additional_attributes[LightningSpanAttributes.OPERATION_NAME.value] = name # Case 1: Used as @operation (bare decorator or with attributes) if callable(fn): # Create context with fixed name, then immediately wrap the function return OperationContext(AGL_OPERATION, additional_attributes, propagate=propagate)(fn) # Case 2: Used as operation(...) / with operation(...) # Custom span names are intentionally not supported; use AGL_OPERATION. if fn is not None: raise ValueError("Custom span names are intentionally not supported when used as a context manager.") return OperationContext(AGL_OPERATION, additional_attributes, propagate=propagate) ================================================ FILE: agentlightning/emitter/exception.py ================================================ # Copyright (c) Microsoft. All rights reserved. import logging from typing import Any, Dict, Optional from agentlightning.semconv import AGL_EXCEPTION from agentlightning.tracer.base import get_active_tracer from agentlightning.tracer.dummy import DummyTracer from agentlightning.types import TraceStatus from agentlightning.utils.otel import flatten_attributes, format_exception_attributes, sanitize_attributes logger = logging.getLogger(__name__) def emit_exception( exception: BaseException, attributes: Optional[Dict[str, Any]] = None, propagate: bool = True ) -> None: """Record an exception with OpenTelemetry metadata. Classic OpenTelemetry records exceptions in a dedicated logging service. We simplify the model and use trace spans to record exceptions as well. Args: exception: Raised exception instance to serialize into telemetry attributes. attributes: Additional attributes to attach to the exception span. propagate: Whether to propagate the span to exporters automatically. !!! note The helper validates its input. If a non-exception value is provided, a TypeError is raised to indicate a programming mistake. """ if not isinstance(exception, BaseException): # type: ignore raise TypeError(f"Expected a BaseException instance, got: {type(exception)}.") span_attributes = format_exception_attributes(exception) if attributes: flattened = flatten_attributes(attributes, expand_leaf_lists=False) span_attributes.update(sanitize_attributes(flattened)) logger.debug("Emitting exception span for %s", type(exception).__name__) if propagate: tracer = get_active_tracer() if tracer is None: raise RuntimeError("No active tracer found. Cannot emit exception span.") else: tracer = DummyTracer() tracer.create_span( AGL_EXCEPTION, attributes=span_attributes, # The exception span is successful by itself. status=TraceStatus(status_code="OK"), ) ================================================ FILE: agentlightning/emitter/message.py ================================================ # Copyright (c) Microsoft. All rights reserved. import logging from typing import Any, Dict, Optional from agentlightning.semconv import AGL_MESSAGE, LightningSpanAttributes from agentlightning.tracer.base import get_active_tracer from agentlightning.tracer.dummy import DummyTracer from agentlightning.types import Attributes, SpanLike from agentlightning.utils.otel import flatten_attributes, sanitize_attributes logger = logging.getLogger(__name__) def emit_message(message: str, attributes: Optional[Dict[str, Any]] = None, propagate: bool = True) -> None: """Emit a textual message as an OpenTelemetry span. Commonly used for sending debugging and logging messages. Args: message: Human readable message to attach as a span attribute. attributes: Additional attributes to attach to the message span. propagate: Whether to propagate the span to exporters automatically. !!! note OpenTelemetry distinguishes between logs and spans. Emitting the message as a span keeps all Agent Lightning telemetry in a single data store for analysis. """ if not isinstance(message, str): # type: ignore raise TypeError(f"Message must be a string or list of strings, got: {type(message)}.") if propagate: tracer = get_active_tracer() if tracer is None: raise RuntimeError("No active tracer found. Cannot emit message span.") else: tracer = DummyTracer() span_attributes: Attributes = {LightningSpanAttributes.MESSAGE_BODY.value: message} if attributes: flattened = flatten_attributes(attributes, expand_leaf_lists=False) span_attributes.update(sanitize_attributes(flattened)) logger.debug("Emitting message span with message: %s", message) tracer.create_span( AGL_MESSAGE, attributes=span_attributes, ) def get_message_value(span: SpanLike) -> Optional[str]: """Extract the message string from a message span. Args: span: Span-like object to extract the message from. """ span_attributes = span.attributes or {} if LightningSpanAttributes.MESSAGE_BODY.value not in span_attributes: return None message = span_attributes[LightningSpanAttributes.MESSAGE_BODY.value] if isinstance(message, str): return message raise TypeError(f"Message must be a string, got: {type(message)}.") ================================================ FILE: agentlightning/emitter/object.py ================================================ # Copyright (c) Microsoft. All rights reserved. import base64 import json import logging from typing import Any, Dict, Optional from agentlightning.semconv import AGL_OBJECT, LightningSpanAttributes from agentlightning.tracer.base import get_active_tracer from agentlightning.tracer.dummy import DummyTracer from agentlightning.types import SpanCoreFields, SpanLike, TraceStatus from agentlightning.utils.otel import flatten_attributes, full_qualified_name, sanitize_attributes logger = logging.getLogger(__name__) def emit_object(object: Any, attributes: Optional[Dict[str, Any]] = None, propagate: bool = True) -> SpanCoreFields: """Emit an object's serialized representation as an OpenTelemetry span. Args: object: Data structure to encode as JSON and attach to the span payload. attributes: Additional attributes to attach to the object span. propagate: Whether to propagate the span to exporters automatically. !!! note The payload must be JSON serializable. Non-serializable objects will lead to a RuntimeError. """ span_attributes = encode_object(object) if attributes: flattened = flatten_attributes(attributes, expand_leaf_lists=False) span_attributes.update(sanitize_attributes(flattened)) attr_length = 0 if LightningSpanAttributes.OBJECT_JSON.value in span_attributes: attr_length = len(span_attributes[LightningSpanAttributes.OBJECT_JSON.value]) elif LightningSpanAttributes.OBJECT_LITERAL.value in span_attributes: attr_length = len(span_attributes[LightningSpanAttributes.OBJECT_LITERAL.value]) logger.debug("Emitting object span with payload size %d characters", attr_length) if propagate: tracer = get_active_tracer() if tracer is None: raise RuntimeError("No active tracer found. Cannot emit object span.") else: # Do not actually propagate to any store or tracer backend. tracer = DummyTracer() return tracer.create_span( name=AGL_OBJECT, attributes=span_attributes, status=TraceStatus(status_code="OK"), ) def encode_object(object: Any) -> Dict[str, Any]: """Encode an object as span attributes. Args: object: Data structure to encode as JSON. """ span_attributes = {} if isinstance(object, (str, int, float, bool)): span_attributes = { LightningSpanAttributes.OBJECT_TYPE.value: type(object).__name__, LightningSpanAttributes.OBJECT_LITERAL.value: str(object), } elif isinstance(object, bytes): b64_encoded = base64.b64encode(object).decode("utf-8") span_attributes = { LightningSpanAttributes.OBJECT_TYPE.value: "bytes", LightningSpanAttributes.OBJECT_LITERAL.value: b64_encoded, } else: try: serialized = json.dumps(object) except (TypeError, ValueError) as exc: raise RuntimeError(f"Object must be JSON serializable, got: {type(object)}.") from exc span_attributes = { LightningSpanAttributes.OBJECT_TYPE.value: full_qualified_name(type(object)), # type: ignore LightningSpanAttributes.OBJECT_JSON.value: serialized, } return span_attributes def get_object_value(span: SpanLike) -> Any: """Extract the object payload from an object span. Args: span: Span object produced by Agent Lightning emitters. """ attributes = span.attributes or {} if LightningSpanAttributes.OBJECT_JSON.value in attributes: serialized = attributes[LightningSpanAttributes.OBJECT_JSON.value] try: return json.loads(serialized) # type: ignore except (TypeError, ValueError) as exc: raise RuntimeError("Failed to deserialize object JSON from span.") from exc elif LightningSpanAttributes.OBJECT_LITERAL.value in attributes: literal = attributes[LightningSpanAttributes.OBJECT_LITERAL.value] obj_type = attributes.get(LightningSpanAttributes.OBJECT_TYPE.value, "str") if obj_type == "str": return literal elif obj_type == "int": # Let it raise errors if there are any return int(literal) # type: ignore elif obj_type == "float": return float(literal) # type: ignore elif obj_type == "bool": return literal.lower() == "true" # type: ignore elif obj_type == "bytes": return base64.b64decode(literal.encode("utf-8")) # type: ignore else: raise RuntimeError(f"Unsupported object type for literal deserialization: {obj_type}") else: return None ================================================ FILE: agentlightning/emitter/reward.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Helpers for emitting reward spans and integrating with AgentOps telemetry.""" import asyncio import inspect import json import logging import warnings from typing import ( Any, Callable, Dict, List, Literal, Optional, Sequence, TypedDict, TypeVar, cast, ) from pydantic import TypeAdapter from agentlightning.semconv import AGL_ANNOTATION, LightningSpanAttributes, RewardPydanticModel from agentlightning.types import SpanCoreFields, SpanLike from agentlightning.utils.otel import filter_and_unflatten_attributes from .annotation import emit_annotation logger = logging.getLogger(__name__) __all__ = [ "reward", "emit_reward", "get_reward_value", "get_rewards_from_span", "is_reward_span", "find_reward_spans", "find_final_reward", ] class RewardDimension(TypedDict): """Type representing a single dimension in a multi-dimensional reward.""" name: str value: float class _RewardSpanData(TypedDict): type: Literal["reward"] value: Optional[float] _FnType = TypeVar("_FnType", bound=Callable[..., Any]) def _agentops_initialized() -> bool: """Return `True` when the AgentOps client has been configured.""" import agentops return agentops.get_client().initialized def reward(fn: _FnType) -> _FnType: """Decorate a reward function so its outputs are tracked as spans. The decorator integrates with AgentOps when it is available and falls back to the built-in telemetry otherwise. Both synchronous and asynchronous functions are supported transparently. Deprecated: This decorator is deprecated. Use [`emit_reward`][agentlightning.emit_reward] instead. Args: fn: Callable that produces a numeric reward. Returns: Wrapped callable that preserves the original signature. """ from agentops.sdk.decorators import operation def wrap_result(result: Optional[float]) -> _RewardSpanData: """Normalize the reward value into the span payload format.""" if result is None: return {"type": "reward", "value": None} if not isinstance(result, (float, int)): # type: ignore warnings.warn(f"Reward is ignored because it is not a number: {result}") return {"type": "reward", "value": None} return {"type": "reward", "value": float(result)} # Check if the function is async is_async = inspect.iscoroutinefunction(fn) or ( # For backwards compatibility. hasattr(asyncio, "iscoroutinefunction") and asyncio.iscoroutinefunction(fn) # type: ignore ) if is_async: async def wrapper_async(*args: Any, **kwargs: Any) -> Any: if not _agentops_initialized(): # Track the reward without AgentOps result = await fn(*args, **kwargs) emit_reward(cast(float, result)) return result result: Optional[float] = None @operation async def agentops_reward_operation() -> _RewardSpanData: # The reward function we are interested in tracing # It takes zero inputs and return a formatted dict nonlocal result result = await fn(*args, **kwargs) return wrap_result(result) await agentops_reward_operation() return result return wrapper_async # type: ignore else: def wrapper(*args: Any, **kwargs: Any) -> Any: if not _agentops_initialized(): # Track the reward without AgentOps result = fn(*args, **kwargs) emit_reward(cast(float, result)) return result result: Optional[float] = None @operation def agentops_reward_operation() -> _RewardSpanData: nonlocal result result = fn(*args, **kwargs) return wrap_result(result) agentops_reward_operation() return result return wrapper # type: ignore def emit_reward( reward: float | Dict[str, Any], *, primary_key: str | None = None, attributes: Dict[str, Any] | None = None, propagate: bool = True, ) -> SpanCoreFields: """Emit a reward value as an OpenTelemetry span. Examples: Emit a single-dimensional reward: >>> emit_reward(1.0) Emit multi-dimensional rewards: >>> emit_reward({"task_completion": 1.0, "efficiency": 0.8}, primary_key="task_completion") Emit a reward with additional attributes (for example linking to another response span): >>> from agentlightning.utils.otel import make_link_attributes >>> emit_reward(0.5, attributes=make_link_attributes({"gen_ai.response.id": "response-123"})) Or adding tags onto the reward span: >>> from agentlightning.utils.otel import make_tag_attributes >>> emit_reward(0.7, attributes=make_tag_attributes(["fast", "reliable"])) Args: reward: Numeric reward to record. Integers and booleans are converted to floating point numbers for consistency. Use a dictionary to represent a multi-dimensional reward. attributes: Other optional span attributes. propagate: Whether to propagate the span to exporters automatically. Returns: Span core fields capturing the recorded reward. """ logger.debug(f"Emitting reward: {reward}") reward_dimensions: List[RewardDimension] = [] if isinstance(reward, dict): reward_dict: Dict[str, float] = {} for k, v in reward.items(): if isinstance(v, (int, bool)): reward_dict[k] = float(v) elif isinstance(v, float): reward_dict[k] = v else: raise ValueError(f"Reward value must be a number, got: {type(v)} for key {k}") if primary_key is None: raise ValueError("When emitting a multi-dimensional reward as a dict, primary_key must be provided.") if primary_key not in reward_dict: raise ValueError(f"Primary key '{primary_key}' not found in reward dict keys: {list(reward_dict.keys())}") reward_dimensions.append(RewardDimension(name=primary_key, value=reward_dict[primary_key])) for k, v in reward_dict.items(): if k != primary_key: reward_dimensions.append(RewardDimension(name=k, value=v)) else: if isinstance(reward, (int, bool)): reward = float(reward) elif not isinstance(reward, float): # pyright: ignore[reportUnnecessaryIsInstance] raise TypeError(f"Reward must be a number, got: {type(reward)}") reward_dimensions.append(RewardDimension(name="primary", value=reward)) return emit_annotation( {LightningSpanAttributes.REWARD.value: reward_dimensions, **(attributes or {})}, propagate=propagate ) def get_reward_value(span: SpanLike) -> Optional[float]: """Extract the reward value from a span, if available. Args: span: Span object produced by AgentOps or Agent Lightning emitters. Returns: The primary reward encoded in the span or `None` when the span does not represent a reward. """ # v0.3+ emit reward format reward_list = get_rewards_from_span(span) if reward_list: # Reward list is ordered and the first element is the primary reward return reward_list[0].value for key in [ "agentops.task.output", # newer versions of agentops "agentops.entity.output", ]: reward_dict: Dict[str, Any] | None = None if span.attributes: output = span.attributes.get(key) if output: if isinstance(output, dict): reward_dict = cast(Dict[str, Any], output) elif isinstance(output, str): try: reward_dict = cast(Dict[str, Any], json.loads(output)) except json.JSONDecodeError: reward_dict = None if reward_dict and reward_dict.get("type") == "reward": reward_value = reward_dict.get("value", None) if reward_value is None: return None if not isinstance(reward_value, float): logger.error(f"Reward is not a number, got: {type(reward_value)}. This may cause undefined behaviors.") logger.warning( f"Extracted reward {reward_value} from AgentOps. This format is deprecated, please migrate to using `emit_reward`." ) return cast(float, reward_value) # v0.2 emit reward format if span.name == AGL_ANNOTATION and span.attributes: reward_value = span.attributes.get("reward", None) if reward_value is None: return None if not isinstance(reward_value, float): logger.error(f"Reward is not a number, got: {type(reward_value)}. This may cause undefined behaviors.") logger.warning( f"Extracted reward {reward_value} from a legacy version of reward span. You might have inconsistent agent-lightning versions." ) return cast(float, reward_value) return None def get_rewards_from_span(span: SpanLike) -> List[RewardPydanticModel]: """Extract the reward as a list from a span, if available. Args: span: Span object produced by AgentOps or Agent Lightning emitters. Returns: A list of reward dimensions encoded in the span or an empty list when the span does not represent a reward. """ if span.attributes and any(key.startswith(LightningSpanAttributes.REWARD.value) for key in span.attributes): reward_attr = filter_and_unflatten_attributes( cast(Any, span.attributes or {}), LightningSpanAttributes.REWARD.value ) recovered_rewards = TypeAdapter(List[RewardPydanticModel]).validate_python(reward_attr) return recovered_rewards else: return [] def is_reward_span(span: SpanLike) -> bool: """Return ``True`` when the provided span encodes a reward value.""" maybe_reward = get_reward_value(span) return maybe_reward is not None def find_reward_spans(spans: Sequence[SpanLike]) -> List[SpanLike]: """Return all reward spans in the provided sequence. Args: spans: Sequence containing [`ReadableSpan`](https://opentelemetry.io/docs/concepts/signals/traces/) objects or mocked span-like values. Returns: List of spans that could be parsed as rewards. """ return [span for span in spans if is_reward_span(span)] def find_final_reward(spans: Sequence[SpanLike]) -> Optional[float]: """Return the last reward value present in the provided spans. Args: spans: Sequence containing [`ReadableSpan`](https://opentelemetry.io/docs/concepts/signals/traces/) objects or mocked span-like values. Returns: Reward value from the latest reward span, or `None` when none are found. """ for span in reversed(spans): reward = get_reward_value(span) if reward is not None: return reward return None ================================================ FILE: agentlightning/env_var.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Environment variable managements.""" from __future__ import annotations import os from enum import Enum from typing import overload __all__ = [ "LightningEnvVar", "resolve_bool_env_var", "resolve_int_env_var", "resolve_str_env_var", ] class LightningEnvVar(Enum): """Environment variables for Agent Lightning.""" AGL_EMITTER_DEBUG = "AGL_EMITTER_DEBUG" """Enable debug logging for the emitter.""" AGL_MANAGED_STORE = "AGL_MANAGED_STORE" """If yes, the [`ExecutionStrategy`][agentlightning.ExecutionStrategy] constructs LightningStore wrappers automatically. When `False` the provided `store` is passed directly to the bundles, allowing callers to manage store wrappers manually.""" AGL_CURRENT_ROLE = "AGL_CURRENT_ROLE" """Which side(s) to run in this process. Used in [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy].""" AGL_SERVER_HOST = "AGL_SERVER_HOST" """Interface the [`LightningStoreServer`][agentlightning.LightningStoreServer] binds to when running the algorithm bundle locally.""" AGL_SERVER_PORT = "AGL_SERVER_PORT" """Port the [`LightningStoreServer`][agentlightning.LightningStoreServer] listens to.""" _TRUTHY_VALUES = {"1", "true", "yes", "on"} _FALSY_VALUES = {"0", "false", "no", "off"} @overload def resolve_bool_env_var(env_var: LightningEnvVar, override: bool, fallback: bool) -> bool: ... @overload def resolve_bool_env_var(env_var: LightningEnvVar, *, fallback: bool) -> bool: ... @overload def resolve_bool_env_var( env_var: LightningEnvVar, override: bool | None = None, fallback: bool | None = None ) -> bool | None: ... def resolve_bool_env_var( env_var: LightningEnvVar, override: bool | None = None, fallback: bool | None = None ) -> bool | None: """Resolve a boolean environment variable. Args: env_var: The environment variable to resolve. override: Optional override supplied by the caller. fallback: Default value if the environment variable is not set. """ if override is not None: return override env_value = os.getenv(env_var.value) if env_value is None: return fallback normalized = env_value.strip().lower() if normalized in _TRUTHY_VALUES: return True if normalized in _FALSY_VALUES: return False raise ValueError(f"{env_var.value} must be one of {_TRUTHY_VALUES} or {_FALSY_VALUES}") @overload def resolve_int_env_var(env_var: LightningEnvVar, override: int, fallback: int) -> int: ... @overload def resolve_int_env_var(env_var: LightningEnvVar, *, fallback: int) -> int: ... @overload def resolve_int_env_var( env_var: LightningEnvVar, override: int | None = None, fallback: int | None = None ) -> int | None: ... def resolve_int_env_var( env_var: LightningEnvVar, override: int | None = None, fallback: int | None = None ) -> int | None: """Resolve an integer environment variable. Args: env_var: The environment variable to resolve. override: Optional override supplied by the caller. fallback: Default value if the environment variable is not set. """ if override is not None: return override env_value = os.getenv(env_var.value) if env_value is None: return fallback try: return int(env_value) except ValueError: raise ValueError(f"{env_var.value} must be an integer") @overload def resolve_str_env_var(env_var: LightningEnvVar, override: str, fallback: str) -> str: ... @overload def resolve_str_env_var(env_var: LightningEnvVar, *, fallback: str) -> str: ... @overload def resolve_str_env_var( env_var: LightningEnvVar, override: str | None = None, fallback: str | None = None ) -> str | None: ... def resolve_str_env_var( env_var: LightningEnvVar, override: str | None = None, fallback: str | None = None ) -> str | None: """Resolve a string environment variable. Args: env_var: The environment variable to resolve. override: Optional override supplied by the caller. fallback: Default value if the environment variable is not set. """ if override is not None: return override env_value = os.getenv(env_var.value) if env_value is None: return fallback return env_value ================================================ FILE: agentlightning/execution/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .base import ExecutionStrategy from .client_server import ClientServerExecutionStrategy from .events import ExecutionEvent, MultiprocessingEvent, ThreadingEvent from .shared_memory import SharedMemoryExecutionStrategy __all__ = [ "ExecutionStrategy", "ClientServerExecutionStrategy", "ExecutionEvent", "ThreadingEvent", "MultiprocessingEvent", "SharedMemoryExecutionStrategy", ] ================================================ FILE: agentlightning/execution/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging from typing import Protocol from agentlightning.store.base import LightningStore from .events import ExecutionEvent logger = logging.getLogger(__name__) class AlgorithmBundle(Protocol): """Callable bundle produced by [`Trainer`][agentlightning.Trainer]. Execution strategies treat the returned coroutine as opaque, only providing the shared store instance and cooperative stop event. Bundles typically encapsulate algorithm setup plus adapter and LLM proxy, etc. """ async def __call__(self, store: LightningStore, event: ExecutionEvent) -> None: """Execute algorithm logic using ``store`` until completion or stop.""" class RunnerBundle(Protocol): """Callable bundle wrapping runner setup and the worker loop, as opposed to the [`AlgorithmBundle`][agentlightning.AlgorithmBundle].""" async def __call__(self, store: LightningStore, worker_id: int, event: ExecutionEvent) -> None: """Execute runner logic for ``worker_id`` using ``store`` and ``event``.""" class ExecutionStrategy: """Coordinate algorithm and runner bundles within a single process abstraction. Strategies decide how many worker bundles to launch, whether to communicate through shared memory or an HTTP boundary, and how to react to shutdown signals. They intentionally avoid inspecting the bundle internals; instead, each bundle remains responsible for its own scheduling semantics. !!! note Implementations must honor the [execute()][agentlightning.ExecutionStrategy.execute] contract by propagating `KeyboardInterrupt` and ensuring resources are released when an error occurs on either side of the algorithm/runner pair. """ def execute(self, algorithm: AlgorithmBundle, runner: RunnerBundle, store: LightningStore) -> None: """Run the provided bundles using the configured orchestration model. Args: algorithm: Callable bundle responsible for algorithm execution. runner: Callable bundle for runner workers. store: Concrete [`LightningStore`][agentlightning.LightningStore] shared across bundles. Raises: NotImplementedError: Subclasses must provide the orchestration implementation. """ raise NotImplementedError() ================================================ FILE: agentlightning/execution/client_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import logging import multiprocessing import os import signal import time from multiprocessing.context import BaseContext from typing import Callable, Iterable, Literal, cast from agentlightning.env_var import LightningEnvVar, resolve_bool_env_var, resolve_int_env_var, resolve_str_env_var from agentlightning.store.base import LightningStore from agentlightning.store.client_server import LightningStoreClient, LightningStoreServer from .base import AlgorithmBundle, ExecutionStrategy, RunnerBundle from .events import ExecutionEvent, MultiprocessingEvent logger = logging.getLogger(__name__) class ClientServerExecutionStrategy(ExecutionStrategy): """Run algorithm and runner bundles as separate processes over HTTP. Execution Roles: - `"algorithm"`: Start [`LightningStoreServer`][agentlightning.LightningStoreServer] in-process and execute the algorithm bundle against it. - `"runner"`: Connect to an existing server with [`LightningStoreClient`][agentlightning.LightningStoreClient] and run the runner bundle locally (spawning multiple processes when requested). - `"both"`: Spawn runner processes first, then execute the algorithm and server on the same machine. This mode orchestrates the full loop locally. When `role == "both"` you may choose which side runs on the main process via `main_process`. The runner-on-main option is limited to `n_runners == 1` because each additional runner requires its own event loop and process. !!! warning When `main_process == "runner"` the algorithm and HTTP server execute in a child process. Store mutations remain isolated inside that process, so the original store instance passed to [execute()][agentlightning.ExecutionStrategy.execute] is not updated. Abort Model (four-step escalation): 1. Cooperative stop. Every bundle receives a shared [`MultiprocessingEvent`][agentlightning.MultiprocessingEvent] (`stop_evt`). Any failure flips the event so peers can exit cleanly. Ctrl+C on the main process also sets the flag. 2. KeyboardInterrupt synthesis. Remaining subprocesses receive ``SIGINT`` to trigger `KeyboardInterrupt` handlers. 3. Termination. Stubborn processes are asked to ``terminate()`` (`SIGTERM` on POSIX). 4. Kill. As a last resort `kill()` is invoked (`SIGKILL` on POSIX). This mirrors the semantics implemented in [`SharedMemoryExecutionStrategy`][agentlightning.SharedMemoryExecutionStrategy] but adapts them to multiple processes and the HTTP client/server boundary. """ alias: str = "cs" def __init__( self, role: Literal["algorithm", "runner", "both"] | None = None, server_host: str | None = None, server_port: int | None = None, n_runners: int = 1, graceful_timeout: float = 10.0, terminate_timeout: float = 10.0, main_process: Literal["algorithm", "runner"] = "algorithm", managed_store: bool | None = None, allowed_exit_codes: Iterable[int] = (0, -15), ) -> None: """Configure the strategy. Args: role: Which side(s) to run in this process. When omitted, the `AGL_CURRENT_ROLE` environment variable is used. server_host: Interface the HTTP server binds to when running the algorithm bundle locally. Defaults to `AGL_SERVER_HOST` or `"localhost"` if unset. server_port: Port for the HTTP server in "algorithm"/"both" modes. Defaults to `AGL_SERVER_PORT` or `4747` if unset. n_runners: Number of runner processes to spawn in "runner"/"both". graceful_timeout: How long to wait (seconds) after setting the stop event before escalating to signals. terminate_timeout: How long to wait between escalation steps beyond the cooperative phase (re-used for SIGINT, terminate, and kill). main_process: Which bundle runs on the main process when `role == "both"`. `"runner"` requires `n_runners == 1` and is primarily intended for debugging. managed_store: When `True` (default) the strategy constructs LightningStore client/server wrappers automatically. When `False` the provided `store` is passed directly to the bundles, allowing callers to manage store wrappers manually. allowed_exit_codes: Allowed exit codes for subprocesses. By default, runner can exit gracefully with code 0 or terminated by SIGTERM (-15). """ resolved_role = resolve_str_env_var(LightningEnvVar.AGL_CURRENT_ROLE, override=role, fallback="both") if resolved_role not in ("algorithm", "runner", "both"): raise ValueError("role must be one of 'algorithm', 'runner', or 'both'") self.role: Literal["algorithm", "runner", "both"] = resolved_role self.n_runners = n_runners self.server_host = resolve_str_env_var( LightningEnvVar.AGL_SERVER_HOST, override=server_host, fallback="localhost" ) self.server_port = resolve_int_env_var(LightningEnvVar.AGL_SERVER_PORT, override=server_port, fallback=4747) self.graceful_timeout = graceful_timeout self.terminate_timeout = terminate_timeout if main_process not in ("algorithm", "runner"): raise ValueError("main_process must be 'algorithm' or 'runner'") if main_process == "runner": if self.role != "both": raise ValueError("main_process='runner' is only supported when role='both'") if n_runners != 1: raise ValueError("main_process='runner' requires n_runners to be 1") self.main_process = main_process self.managed_store = resolve_bool_env_var( LightningEnvVar.AGL_MANAGED_STORE, override=managed_store, fallback=True ) self.allowed_exit_codes = tuple(allowed_exit_codes) async def _execute_algorithm( self, algorithm: AlgorithmBundle, store: LightningStore, stop_evt: ExecutionEvent ) -> None: wrapper_store: LightningStore | None = None if self.managed_store: logger.info("Starting LightningStore server on %s:%s", self.server_host, self.server_port) wrapper_store = LightningStoreServer(store, host=self.server_host, port=self.server_port) server_started = False else: wrapper_store = store server_started = False try: if self.managed_store and isinstance(wrapper_store, LightningStoreServer): await wrapper_store.start() server_started = True logger.debug("Algorithm bundle starting against endpoint %s", wrapper_store.endpoint) await algorithm(wrapper_store, stop_evt) logger.debug("Algorithm bundle completed successfully") except asyncio.CancelledError: logger.info("Algorithm received CancelledError; signaling stop event") stop_evt.set() raise except KeyboardInterrupt: logger.warning("Algorithm received KeyboardInterrupt; signaling stop event") stop_evt.set() raise except BaseException: logger.exception("Algorithm bundle crashed; signaling stop event") stop_evt.set() raise finally: if self.managed_store and isinstance(wrapper_store, LightningStoreServer) and server_started: try: await wrapper_store.stop() except Exception: logger.exception("Error stopping LightningStore server") else: logger.debug("LightningStore server shutdown completed") async def _execute_runner( self, runner: RunnerBundle, worker_id: int, store: LightningStore, stop_evt: ExecutionEvent, ) -> None: if self.managed_store: # If managed, we actually do not use the provided store client_store = LightningStoreClient(f"http://{self.server_host}:{self.server_port}") else: client_store = store try: if self.managed_store: logger.debug("Runner %s connecting to server at %s:%s", worker_id, self.server_host, self.server_port) else: logger.debug("Runner %s executing with provided store", worker_id) await runner(client_store, worker_id, stop_evt) logger.debug("Runner %s completed successfully", worker_id) except asyncio.CancelledError: logger.debug("Runner %s received CancelledError; signaling stop event", worker_id) stop_evt.set() raise except KeyboardInterrupt: logger.warning("Runner %s received KeyboardInterrupt; signaling stop event", worker_id) stop_evt.set() raise except BaseException: logger.exception("Runner %s crashed; signaling stop event", worker_id) stop_evt.set() raise finally: if self.managed_store and isinstance(client_store, LightningStoreClient): try: await client_store.close() except Exception: logger.exception("Error closing LightningStore client for runner %s", worker_id) else: logger.debug("Runner %s closed LightningStore client", worker_id) def _spawn_runners( self, runner: RunnerBundle, store: LightningStore, stop_evt: ExecutionEvent, *, ctx: BaseContext, ) -> list[multiprocessing.Process]: """Used when `role == "runner"` or `role == "both"` and `n_runners > 1`.""" processes: list[multiprocessing.Process] = [] def _runner_sync(runner: RunnerBundle, worker_id: int, store: LightningStore, stop_evt: ExecutionEvent) -> None: # Runners are executed in child processes; each process owns its own # event loop to keep the asyncio scheduler isolated. try: asyncio.run(self._execute_runner(runner, worker_id, store, stop_evt)) except KeyboardInterrupt: logger.warning("Runner (asyncio) %s received KeyboardInterrupt; exiting gracefully", worker_id) except BaseException as exc: logger.exception("Runner (asyncio) %s crashed by %s; signaling stop event", worker_id, exc) raise for i in range(self.n_runners): process = cast( multiprocessing.Process, ctx.Process(target=_runner_sync, args=(runner, i, store, stop_evt), name=f"runner-{i}"), # type: ignore ) process.start() logger.debug("Spawned runner process %s (pid=%s)", process.name, process.pid) processes.append(process) return processes def _spawn_algorithm_process( self, algorithm: AlgorithmBundle, store: LightningStore, stop_evt: ExecutionEvent, *, ctx: BaseContext, ) -> multiprocessing.Process: """Used when `main_process == "runner"`.""" def _algorithm_sync(algorithm: AlgorithmBundle, store: LightningStore, stop_evt: ExecutionEvent) -> None: try: asyncio.run(self._execute_algorithm(algorithm, store, stop_evt)) except KeyboardInterrupt: logger.warning("Algorithm (asyncio.run) received KeyboardInterrupt; exiting gracefully") except BaseException as exc: logger.exception("Algorithm (asyncio.run) crashed by %s; signaling stop event", exc) raise process = cast( multiprocessing.Process, ctx.Process(target=_algorithm_sync, args=(algorithm, store, stop_evt), name="algorithm"), # type: ignore ) process.start() logger.debug("Spawned algorithm process %s (pid=%s)", process.name, process.pid) return process def _join_until_deadline( self, processes: Iterable[multiprocessing.Process], timeout: float, ) -> list[multiprocessing.Process]: """Join ``processes`` until ``timeout`` elapses, returning those still alive.""" deadline = time.monotonic() + timeout still_alive: list[multiprocessing.Process] = [] for process in processes: remaining = deadline - time.monotonic() if remaining > 0: process.join(remaining) else: process.join(0) if process.is_alive(): still_alive.append(process) return still_alive def _signal_processes( self, processes: Iterable[multiprocessing.Process], action: Callable[[multiprocessing.Process], None], ) -> None: """Invoke ``action`` on each process while suppressing individual failures.""" for process in processes: try: action(process) except Exception: logger.exception("Error signaling process %s (pid=%s)", process.name, process.pid) def _shutdown_processes( self, processes: list[multiprocessing.Process], stop_evt: ExecutionEvent, ) -> None: """4-step escalation shutdown of ``processes``.""" if not processes: logger.debug("No subprocesses to shutdown") return if not stop_evt.is_set(): logger.debug("Sending cooperative stop signal to subprocesses") stop_evt.set() else: logger.debug("Stop event already set; waiting for subprocesses to exit") alive = self._join_until_deadline(processes, self.graceful_timeout) if not alive: return logger.warning( "Subprocesses still alive after cooperative wait; sending SIGINT to %s", ", ".join(p.name or str(p.pid) for p in alive), ) # SIGINT is not reliable on Windows, but we do not consider such case yet. self._signal_processes(alive, lambda p: os.kill(cast(int, p.pid), signal.SIGINT)) alive = self._join_until_deadline(alive, self.terminate_timeout) if not alive: return logger.warning( "Subprocesses still alive after SIGINT wait; sending terminate() to %s", ", ".join(p.name or str(p.pid) for p in alive), ) self._signal_processes(alive, lambda p: p.terminate()) alive = self._join_until_deadline(alive, self.terminate_timeout) if not alive: return logger.error( "Subprocesses still alive after terminate(); sending kill() to %s", ", ".join(p.name or str(p.pid) for p in alive), ) self._signal_processes(alive, lambda p: p.kill()) alive = self._join_until_deadline(alive, self.terminate_timeout) if alive: logger.error( "Subprocesses failed to exit even after kill(): %s", ", ".join(p.name or str(p.pid) for p in alive) ) def _check_process_exitcodes(self, processes: Iterable[multiprocessing.Process]) -> None: """Raise an error if any managed process exited with a non-zero status.""" failed = [p for p in processes if p.exitcode not in self.allowed_exit_codes + (None,)] if failed: formatted = ", ".join(f"{p.name or p.pid} (exitcode={p.exitcode})" for p in failed) raise RuntimeError(f"Subprocesses failed with unexpected exit codes: {formatted}") def execute(self, algorithm: AlgorithmBundle, runner: RunnerBundle, store: LightningStore) -> None: logger.info( "Starting client-server execution with %d runner(s) [role=%s, main_process=%s]", self.n_runners, self.role, self.main_process, ) # Re-use the active multiprocessing context so the event and processes # agree on the start method (fork/spawn/forkserver). ctx = multiprocessing.get_context() stop_evt = MultiprocessingEvent(ctx=ctx) # Track spawned processes so we can enforce termination ordering and # surface non-zero exit codes back to the caller. processes: list[multiprocessing.Process] = [] exception: BaseException | None = None keyboard_interrupt = False try: if self.role == "algorithm": logger.info("Running algorithm solely...") asyncio.run(self._execute_algorithm(algorithm, store, stop_evt)) elif self.role == "runner": if self.n_runners == 1: logger.info("Running runner solely...") asyncio.run(self._execute_runner(runner, 0, store, stop_evt)) else: logger.info("Spawning runner processes...") processes = self._spawn_runners(runner, store, stop_evt, ctx=ctx) # Wait for the processes to finish naturally. for process in processes: process.join() self._check_process_exitcodes(processes) elif self.role == "both": if self.main_process == "algorithm": logger.info("Spawning runner processes...") processes = self._spawn_runners(runner, store, stop_evt, ctx=ctx) try: logger.info("Running algorithm...") asyncio.run(self._execute_algorithm(algorithm, store, stop_evt)) finally: # Always request the runner side to unwind once the # algorithm/server portion finishes (successfully or not). stop_evt.set() else: # main_process == "runner" if self.n_runners > 1: raise ValueError("main_process='runner' requires n_runners to be 1") logger.info("Spawning algorithm process...") algorithm_process = self._spawn_algorithm_process(algorithm, store, stop_evt, ctx=ctx) processes = [algorithm_process] # Run the lone runner cooperatively in-process so users can # attach a debugger. The algorithm + HTTP server live in # the background process spawned above (the provided # store must therefore be picklable when using spawn). logger.info("Running runner...") asyncio.run(self._execute_runner(runner, 0, store, stop_evt)) # Wait for the algorithm process to finish. algorithm_process.join() else: raise ValueError(f"Unknown role: {self.role}") except KeyboardInterrupt: logger.warning("KeyboardInterrupt received; initiating shutdown") stop_evt.set() keyboard_interrupt = True except BaseException as exc: logger.exception("Unhandled exception in execute method") stop_evt.set() # Preserve the original exception so we can avoid masking it during # the cleanup phase. exception = exc raise finally: logger.info("Shutting down subprocesses") self._shutdown_processes(processes, stop_evt) if processes: try: self._check_process_exitcodes(processes) except RuntimeError as err: if exception is not None or keyboard_interrupt: # We already propagate/handled a different failure, so # emit a warning instead of raising a secondary error. logger.warning("Subprocesses ended abnormally during shutdown: %s", err) else: raise ================================================ FILE: agentlightning/execution/events.py ================================================ # Copyright (c) Microsoft. All rights reserved. import multiprocessing as mp import threading from multiprocessing.context import BaseContext from typing import Optional, Protocol class ExecutionEvent(Protocol): """Protocol capturing the cooperative stop contract shared by strategies. Implementations mirror the API of ``threading.Event`` and ``multiprocessing.Event`` so the rest of the execution layer can remain agnostic to the underlying concurrency primitive. Methods: set: Signal cancellation. The call must be idempotent. clear: Reset the event to the unsignaled state. is_set: Return ``True`` when cancellation has been requested. wait: Block until the event is signaled or an optional timeout elapses. """ def set(self) -> None: ... def clear(self) -> None: ... def is_set(self) -> bool: ... def wait(self, timeout: Optional[float] = None) -> bool: ... class ThreadingEvent: """Thread-safe implementation of [`ExecutionEvent`][agentlightning.ExecutionEvent].""" __slots__ = ("_evt",) def __init__(self) -> None: self._evt = threading.Event() def set(self) -> None: self._evt.set() def clear(self) -> None: self._evt.clear() def is_set(self) -> bool: return self._evt.is_set() def wait(self, timeout: Optional[float] = None) -> bool: return self._evt.wait(timeout) class MultiprocessingEvent: """Process-safe implementation of [`ExecutionEvent`][agentlightning.ExecutionEvent].""" __slots__ = ("_evt",) def __init__(self, *, ctx: Optional[BaseContext] = None) -> None: self._evt = (ctx or mp).Event() def set(self) -> None: self._evt.set() def clear(self) -> None: self._evt.clear() def is_set(self) -> bool: return self._evt.is_set() def wait(self, timeout: Optional[float] = None) -> bool: return self._evt.wait(timeout) ================================================ FILE: agentlightning/execution/inter_process.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .base import ExecutionStrategy class InterProcessExecutionStrategy(ExecutionStrategy): """Placeholder strategy for future inter-process primitives. The class exists to reserve the `ipc` alias and make the planned implementation discoverable. Attempting to use it today will raise `NotImplementedError` once the execution contract is finalized. """ alias: str = "ipc" # TODO: to be implemented ================================================ FILE: agentlightning/execution/shared_memory.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import logging import threading from contextlib import suppress from queue import SimpleQueue from typing import Any, Awaitable, Callable, List, Literal, Optional, Tuple from agentlightning.env_var import LightningEnvVar, resolve_bool_env_var from agentlightning.store.base import LightningStore from agentlightning.store.threading import LightningStoreThreaded from .base import AlgorithmBundle, ExecutionStrategy, RunnerBundle from .events import ExecutionEvent, ThreadingEvent logger = logging.getLogger(__name__) class SharedMemoryExecutionStrategy(ExecutionStrategy): """Execute bundles in a single process with cooperative worker threads. Stop Model: - All bundles share one [`ThreadingEvent`][agentlightning.ThreadingEvent] named `stop_evt`. - Only the main thread receives `KeyboardInterrupt`. When Ctrl+C occurs we set `stop_evt`. - Any exception raised inside a bundle sets `stop_evt` so other threads can unwind cooperatively. - Once the bundle running on the main thread exits successfully the treatment depends on `main_thread`: - `"algorithm"`: the runners are asked to stop by setting `stop_evt`. - `"runner"`: the algorithm keeps running until it exits naturally. - Background threads are marked as daemons. We join them briefly and log any stragglers before shutting down. !!! note Signals other than `SIGINT` (such as `SIGTERM`) are not intercepted; Python's default behavior for those signals is preserved. """ alias: str = "shm" def __init__( self, n_runners: int = 1, main_thread: Literal["algorithm", "runner"] = "runner", join_timeout: float = 15.0, graceful_delay: float = 5.0, poll_interval: float = 0.05, managed_store: bool | None = None, ) -> None: if main_thread not in ("algorithm", "runner"): raise ValueError("main_thread must be 'algorithm' or 'runner'") if main_thread == "runner" and n_runners != 1: raise ValueError( "When main_thread is 'runner', n_runners must be 1. " "Either use 'algorithm' on the main thread or set n_runners to 1." ) self.n_runners = n_runners self.main_thread = main_thread self.join_timeout = join_timeout self.graceful_delay = graceful_delay self.poll_interval = poll_interval self.managed_store = resolve_bool_env_var( LightningEnvVar.AGL_MANAGED_STORE, override=managed_store, fallback=True ) async def _run_until_completed_or_canceled(self, coro: Awaitable[Any], stop_evt: ExecutionEvent) -> Any: """Run `coro` until it finishes or a cooperative stop is requested. Control flow: 1. Start the bundle coroutine as `task`. 2. Launch a watcher that polls `stop_evt` without blocking the loop. 3. When the stop event flips: a. Give the bundle `graceful_delay` seconds to finish on its own, because well-behaved bundles will check the event and return. b. Cancel the bundle task if it is still running after the grace period. 4. Await both tasks and swallow `CancelledError` where appropriate. This is a *backup* mechanism for bundles that might not poll the event frequently; cooperative shutdown (checking `stop_evt` inside the bundle) remains the preferred approach. """ task: asyncio.Task[Any] = asyncio.create_task(coro) # type: ignore task_exception: Optional[BaseException] = None async def watcher() -> None: # Poll the threading event without blocking the event loop. Using a # background thread via ``asyncio.to_thread`` makes cancellation # difficult because ``ThreadingEvent.wait`` is not interruptible. # Instead we cooperatively check the flag from the loop so the # watcher task stays cancellable and tests don't hang when the # bundle finishes naturally before the stop event is set. while not stop_evt.is_set(): await asyncio.sleep(self.poll_interval) # Grace period: let a cooperative bundle exit on its own. try: # At this point of waiting, the main task should already see the stop event. await asyncio.wait_for(asyncio.shield(task), timeout=self.graceful_delay) # type: ignore logger.debug("Bundle finished by itself during grace period.") return # bundle finished by itself during grace period except asyncio.TimeoutError: # Still running after the grace window. pass except asyncio.CancelledError: # If someone else canceled the task already, we're done. logger.debug("Bundle already canceled by someone else; exiting watcher.") return # Still running after the grace window: cancel it. if not task.done(): logger.debug("Graceful delay elapsed; canceling bundle task...") task.cancel() watcher_task = asyncio.create_task(watcher()) result: Any = None try: # We don't wait on FIRST_COMPLETED here, because we want the watcher # to be able to grant a grace window after stop_evt flips. await asyncio.wait( {task, watcher_task}, return_when=asyncio.FIRST_COMPLETED ) # pyright: ignore[reportUnknownArgumentType] finally: # If the main task hasn't completed yet (e.g., watcher scheduled cancel), # finish the cancellation handshake. if not task.done(): try: await asyncio.wait_for(task, timeout=self.graceful_delay) # second chance except asyncio.TimeoutError: logger.error( "Bundle task did not stop after cancellation; abandoning task." "This thread could live until the process exits." ) # We return without awaiting it. asyncio.run will still try to cancel # pending tasks on loop close; if the task ignores cancellation, this # thread may still stick. It's the best we can do in Python. # We don't raise an exception here, but the thread could be a zombie. return result else: # Task completed naturally; retrieve result. try: result = await task # type: ignore except asyncio.CancelledError: pass except BaseException as exc: task_exception = exc watcher_task.cancel() with suppress(asyncio.CancelledError): await watcher_task if task_exception is not None: raise task_exception return result # type: ignore def _run_algorithm( self, algorithm: AlgorithmBundle, store: LightningStore, stop_evt: ExecutionEvent, thread_exceptions: Optional[SimpleQueue[BaseException]], ) -> None: try: asyncio.run(self._run_until_completed_or_canceled(algorithm(store, stop_evt), stop_evt)) except asyncio.CancelledError: logger.info("Algorithm bundle canceled due to stop signal.") except BaseException as exc: logger.exception("Algorithm bundle crashed; signaling stop to others.") if thread_exceptions is not None: thread_exceptions.put(exc) stop_evt.set() raise def _run_runner( self, runner: RunnerBundle, store: LightningStore, worker_id: int, stop_evt: ExecutionEvent, thread_exceptions: Optional[SimpleQueue[BaseException]], ) -> None: try: asyncio.run(self._run_until_completed_or_canceled(runner(store, worker_id, stop_evt), stop_evt)) except asyncio.CancelledError: logger.info("Runner bundle (worker_id=%s) canceled due to stop signal.", worker_id) except BaseException as exc: logger.exception("Runner bundle crashed (worker_id=%s); signaling stop to others.", worker_id) if thread_exceptions is not None: thread_exceptions.put(exc) stop_evt.set() raise def execute(self, algorithm: AlgorithmBundle, runner: RunnerBundle, store: LightningStore) -> None: logger.info( "Starting shm execution with %d runner(s); main thread runs '%s'", self.n_runners, self.main_thread, ) # Create stop event and thread-safe store. stop_evt = ThreadingEvent() if self.managed_store: thread_safe_store = LightningStoreThreaded(store) else: thread_safe_store = store thread_exceptions: SimpleQueue[BaseException] = SimpleQueue() raised_from_thread: Optional[BaseException] = None def make_thread(name: str, target: Callable[..., Any], args: Tuple[Any, ...]) -> threading.Thread: t = threading.Thread(name=name, target=target, args=args, daemon=True) t.start() return t threads: List[threading.Thread] = [] try: if self.main_thread == "algorithm": # Start runner threads; algorithm runs on main thread. for i in range(self.n_runners): thread = make_thread( name=f"runner-{i}", target=self._run_runner, args=(runner, thread_safe_store, i, stop_evt, thread_exceptions), ) threads.append(thread) # Ctrl+C here raises KeyboardInterrupt on this stack. # Main thread doesn't need to collect exceptions. self._run_algorithm(algorithm, thread_safe_store, stop_evt, None) # If algo finishes naturally, request runners to stop. stop_evt.set() else: # main_thread == "runner" # Start algorithm in background; runner runs on main thread. thread = make_thread( name="algorithm", target=self._run_algorithm, args=(algorithm, thread_safe_store, stop_evt, thread_exceptions), ) threads.append(thread) # Ctrl+C here raises KeyboardInterrupt on this stack. # Main thread doesn't need to collect exceptions. self._run_runner(runner, thread_safe_store, 0, stop_evt, None) # If runner finishes naturally, WAIT FOR ALGORITHM TO FINISH. thread.join() if not thread_exceptions.empty(): raised_from_thread = thread_exceptions.get() except KeyboardInterrupt: logger.warning("KeyboardInterrupt received on main thread; initiating cooperative shutdown...") stop_evt.set() finally: # Attempt a clean join; if some threads don't comply, log and move on. for t in threads: logger.debug("Joining thread %s...", t.name) t.join(timeout=self.join_timeout) alive = [t.name for t in threads if t.is_alive()] if alive: logger.error( "Threads still alive after %.1fs: %s. They are daemons; continuing shutdown.", self.join_timeout, ", ".join(alive), ) if raised_from_thread is None and not thread_exceptions.empty(): raised_from_thread = thread_exceptions.get() if raised_from_thread is not None: raise raised_from_thread ================================================ FILE: agentlightning/instrumentation/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. import warnings AGENTOPS_INSTALLED: bool = False AGENTOPS_LANGCHAIN_INSTALLED: bool = False LITELLM_INSTALLED: bool = False VLLM_INSTALLED: bool = False WEAVE_INSTALLED: bool = False try: from . import agentops # type: ignore AGENTOPS_INSTALLED = True # type: ignore except ImportError: pass try: from . import litellm # type: ignore LITELLM_INSTALLED = True # type: ignore except ImportError: pass # MAGIC! DO NOT TOUCH THIS! # vllm import will cause reward tracing function to fail and produce nothing. # try: # from . import vllm # VLLM_INSTALLED = True # except ImportError: # pass try: from . import agentops_langchain # type: ignore AGENTOPS_LANGCHAIN_INSTALLED = True # type: ignore except ImportError: pass def instrument_all(): """Instrument all the instrumentation libraries.""" if AGENTOPS_INSTALLED: from .agentops import instrument_agentops instrument_agentops() else: warnings.warn("agentops is not installed. It's therefore not instrumented.") if LITELLM_INSTALLED: from .litellm import instrument_litellm instrument_litellm() else: warnings.warn("litellm is not installed. It's therefore not instrumented.") if VLLM_INSTALLED: from .vllm import instrument_vllm instrument_vllm() else: warnings.warn("vllm is not installed. It's therefore not instrumented.") if AGENTOPS_LANGCHAIN_INSTALLED: from .agentops_langchain import instrument_agentops_langchain instrument_agentops_langchain() else: warnings.warn("Agentops-langchain integration is not installed. It's therefore not instrumented.") def uninstrument_all(): """Uninstrument all the instrumentation libraries.""" if AGENTOPS_INSTALLED: try: from .agentops import uninstrument_agentops uninstrument_agentops() except ImportError: warnings.warn("agentops is installed but uninstrument_agentops could not be imported.") else: warnings.warn("agentops is not installed. It's therefore not uninstrumented.") if LITELLM_INSTALLED: try: from .litellm import uninstrument_litellm uninstrument_litellm() except ImportError: warnings.warn("litellm is installed but uninstrument_litellm could not be imported.") else: warnings.warn("litellm is not installed. It's therefore not uninstrumented.") if VLLM_INSTALLED: try: from .vllm import uninstrument_vllm uninstrument_vllm() except ImportError: warnings.warn("vllm is installed but uninstrument_vllm could not be imported.") else: warnings.warn("vllm is not installed. It's therefore not uninstrumented.") if AGENTOPS_LANGCHAIN_INSTALLED: try: from .agentops_langchain import uninstrument_agentops_langchain uninstrument_agentops_langchain() except ImportError: warnings.warn("agentops_langchain is installed but uninstrument_agentops_langchain could not be imported.") else: warnings.warn("Agentops-langchain integration is not installed. It's therefore not uninstrumented.") ================================================ FILE: agentlightning/instrumentation/agentops.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import json import logging from typing import Any, Callable, no_type_check import requests from agentops.client.api import V3Client, V4Client from agentops.client.api.types import AuthTokenResponse from agentops.sdk.exporters import AuthenticatedOTLPExporter from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.metrics.export import MetricExportResult from agentlightning.utils.otlp import LightningStoreOTLPExporter logger = logging.getLogger(__name__) __all__ = [ "instrument_agentops", "uninstrument_agentops", ] # Module-level storage for originals _original_handle_chat_attributes: Callable[..., Any] | None = None _original_handle_response: Callable[..., Any] | None = None _agentops_service_enabled = False def enable_agentops_service(enabled: bool = True) -> None: """ Enable or disable communication with the AgentOps service. By default, AgentOps exporters and clients will run in local mode and will NOT attempt to communicate with the remote AgentOps service. Args: enabled: If True, enable all AgentOps exporters and clients. All exporters and clients will operate in normal mode and send data to the [AgentOps service](https://www.agentops.ai). """ global _agentops_service_enabled _agentops_service_enabled = enabled logger.info(f"AgentOps service enabled is set to {enabled}.") def _patch_exporters(): import agentops.client.api import agentops.sdk.core agentops.sdk.core.AuthenticatedOTLPExporter = BypassableAuthenticatedOTLPExporter # type: ignore agentops.sdk.core.OTLPMetricExporter = BypassableOTLPMetricExporter if hasattr(agentops.sdk.core, "OTLPSpanExporter"): agentops.sdk.core.OTLPSpanExporter = BypassableOTLPSpanExporter # type: ignore agentops.client.api.V3Client = BypassableV3Client agentops.client.api.V4Client = BypassableV4Client def _unpatch_exporters(): import agentops.client.api import agentops.sdk.core agentops.sdk.core.AuthenticatedOTLPExporter = AuthenticatedOTLPExporter # type: ignore agentops.sdk.core.OTLPMetricExporter = OTLPMetricExporter if hasattr(agentops.sdk.core, "OTLPSpanExporter"): agentops.sdk.core.OTLPSpanExporter = OTLPSpanExporter # type: ignore agentops.client.api.V3Client = V3Client agentops.client.api.V4Client = V4Client def _unwrap_legacy_response(response: Any) -> Any: if hasattr(response, "parse") and callable(response.parse): return response.parse() return response def _patch_new_agentops(): import agentops.instrumentation.providers.openai.stream_wrapper import agentops.instrumentation.providers.openai.wrappers.chat from agentops.instrumentation.providers.openai.wrappers.chat import handle_chat_attributes # type: ignore global _original_handle_chat_attributes if _original_handle_chat_attributes is not None: logger.warning("AgentOps already patched. Skipping.") return True _original_handle_chat_attributes = handle_chat_attributes # type: ignore @no_type_check def _handle_chat_attributes_with_tokens(args=None, kwargs=None, return_value=None, **kws): # type: ignore attributes = _original_handle_chat_attributes(args=args, kwargs=kwargs, return_value=return_value, **kws) # In some cases, response is a openai._legacy_response.LegacyAPIResponse (e.g., LiteLLM, or LangChain), # This is created by client.with_raw_response.create() return_value = _unwrap_legacy_response(return_value) if ( return_value is not None and hasattr(return_value, "prompt_token_ids") and return_value.prompt_token_ids is not None ): attributes["prompt_token_ids"] = list(return_value.prompt_token_ids) if ( return_value is not None and hasattr(return_value, "response_token_ids") and return_value.response_token_ids is not None ): attributes["response_token_ids"] = list(return_value.response_token_ids[0]) # For LiteLLM Proxy (v0.2) with vLLM return_token_ids, response_token_ids now lives in choices if ( return_value is not None and hasattr(return_value, "choices") and return_value.choices and isinstance(return_value.choices, list) and len(return_value.choices) > 0 ): first_choice = return_value.choices[0] # Token IDs from "choices[0].token_ids" if "response_token_ids" not in attributes: if hasattr(first_choice, "token_ids") and first_choice.token_ids is not None: attributes["response_token_ids"] = list(first_choice.token_ids) # newer versions of OpenAI client SDK elif ( hasattr(first_choice, "provider_specific_fields") and first_choice.provider_specific_fields.get("token_ids") is not None ): attributes["response_token_ids"] = list(first_choice.provider_specific_fields["token_ids"]) # log probability # This is temporary. We need a unified convention for classifying and naming logprobs. if hasattr(first_choice, "logprobs") and first_choice.logprobs is not None: if hasattr(first_choice.logprobs, "content") and first_choice.logprobs.content is not None: attributes["logprobs.content"] = json.dumps( [logprob.model_dump() for logprob in first_choice.logprobs.content] ) if hasattr(first_choice.logprobs, "refusal") and first_choice.logprobs.refusal is not None: attributes["logprobs.refusal"] = json.dumps( [logprob.model_dump() for logprob in first_choice.logprobs.refusal] ) return attributes agentops.instrumentation.providers.openai.wrappers.chat.handle_chat_attributes = _handle_chat_attributes_with_tokens agentops.instrumentation.providers.openai.stream_wrapper.handle_chat_attributes = ( _handle_chat_attributes_with_tokens ) logger.info("Patched newer version of agentops using handle_chat_attributes") return True def _unpatch_new_agentops(): import agentops.instrumentation.providers.openai.stream_wrapper import agentops.instrumentation.providers.openai.wrappers.chat global _original_handle_chat_attributes if _original_handle_chat_attributes is not None: agentops.instrumentation.providers.openai.wrappers.chat.handle_chat_attributes = ( _original_handle_chat_attributes ) agentops.instrumentation.providers.openai.stream_wrapper.handle_chat_attributes = ( _original_handle_chat_attributes ) _original_handle_chat_attributes = None logger.info("Unpatched newer version of agentops using handle_chat_attributes") def _patch_old_agentops(): import opentelemetry.instrumentation.openai.shared.chat_wrappers # type: ignore from opentelemetry.instrumentation.openai.shared.chat_wrappers import _handle_response, dont_throw # type: ignore global _original_handle_response _original_handle_response = _handle_response # type: ignore @dont_throw # type: ignore def _handle_response_with_tokens(response, span, *args, **kwargs): # type: ignore _original_handle_response(response, span, *args, **kwargs) # type: ignore if hasattr(response, "prompt_token_ids"): # type: ignore span.set_attribute("prompt_token_ids", list(response.prompt_token_ids)) # type: ignore if hasattr(response, "response_token_ids"): # type: ignore span.set_attribute("response_token_ids", list(response.response_token_ids[0])) # type: ignore # For LiteLLM, response is a openai._legacy_response.LegacyAPIResponse if hasattr(response, "http_response") and hasattr(response.http_response, "json"): # type: ignore json_data = response.http_response.json() # type: ignore if isinstance(json_data, dict): if "prompt_token_ids" in json_data: span.set_attribute("prompt_token_ids", list(json_data["prompt_token_ids"])) # type: ignore if "response_token_ids" in json_data: span.set_attribute("response_token_ids", list(json_data["response_token_ids"][0])) # type: ignore opentelemetry.instrumentation.openai.shared.chat_wrappers._handle_response = _handle_response_with_tokens # type: ignore logger.info("Patched earlier version of agentops using _handle_response") return True def _unpatch_old_agentops(): import opentelemetry.instrumentation.openai.shared.chat_wrappers # type: ignore global _original_handle_response if _original_handle_response is not None: opentelemetry.instrumentation.openai.shared.chat_wrappers._handle_response = _original_handle_response # type: ignore _original_handle_response = None logger.info("Unpatched earlier version of agentops using _handle_response") def instrument_agentops(): """ Instrument agentops to capture token IDs. Automatically detects and uses the appropriate patching method based on the installed agentops version. """ _patch_exporters() # Try newest version first (tested for 0.4.16) try: return _patch_new_agentops() except ImportError as e: logger.debug(f"Couldn't patch newer version of agentops: {str(e)}") # Note: 0.4.15 needs another patching method, but it's too shortlived to be worth handling separately. # Try older version (tested for 0.4.13) try: return _patch_old_agentops() except ImportError as e: logger.warning(f"Couldn't patch older version of agentops: {str(e)}") logger.error("Failed to instrument agentops - neither patching method was successful") return False def uninstrument_agentops(): """Uninstrument agentops to stop capturing token IDs.""" _unpatch_exporters() try: _unpatch_new_agentops() except Exception: pass try: _unpatch_old_agentops() except Exception: pass class BypassableAuthenticatedOTLPExporter(LightningStoreOTLPExporter, AuthenticatedOTLPExporter): """ AuthenticatedOTLPExporter with switchable service control. When `_agentops_service_enabled` is False, skip export and return success. """ def should_bypass(self) -> bool: return not _agentops_service_enabled class BypassableOTLPMetricExporter(OTLPMetricExporter): """ OTLPMetricExporter with switchable service control. When `_agentops_service_enabled` is False, skip export and return success. """ def export(self, *args: Any, **kwargs: Any) -> MetricExportResult: if _agentops_service_enabled: return super().export(*args, **kwargs) # type: ignore[reportUnknownMemberType] else: logger.debug("SwitchableOTLPMetricExporter is switched off, skipping export.") return MetricExportResult.SUCCESS class BypassableOTLPSpanExporter(LightningStoreOTLPExporter): """ OTLPSpanExporter with switchable service control. When `_agentops_service_enabled` is False, skip export and return success. This is used instead of BypassableAuthenticatedOTLPExporter on legacy AgentOps versions. """ def should_bypass(self) -> bool: return not _agentops_service_enabled class BypassableV3Client(V3Client): """ V3Client with toggleable authentication calls. Returns dummy auth response when `_agentops_service_enabled` is False. """ # Temporary synchronous override of fetch_auth_token for mock purposes. def fetch_auth_token(self, *args: Any, **kwargs: Any) -> AuthTokenResponse: # type: ignore[override] if _agentops_service_enabled: return super().fetch_auth_token(*args, **kwargs) # type: ignore[override] else: logger.debug("SwitchableV3Client is switched off, skipping fetch_auth_token request.") return AuthTokenResponse(token="dummy", project_id="dummy") class BypassableV4Client(V4Client): """ V4Client with toggleable post requests. Returns dummy response when `_agentops_service_enabled` is False. """ def post(self, *args: Any, **kwargs: Any) -> requests.Response: if _agentops_service_enabled: return super().post(*args, **kwargs) else: logger.debug("SwitchableV4Client is switched off, skipping post request.") response = requests.Response() response.status_code = 200 response._content = b"{}" return response ================================================ FILE: agentlightning/instrumentation/agentops_langchain.py ================================================ # Copyright (c) Microsoft. All rights reserved. from typing import Any, Dict from agentops import instrumentation from agentops.integration.callbacks.langchain import LangchainCallbackHandler original_on_chain_start = LangchainCallbackHandler.on_chain_start langgraph_entry = None __all__ = [ "instrument_agentops_langchain", "uninstrument_agentops_langchain", ] def on_chain_start(self: Any, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any) -> None: if "name" in kwargs: if serialized is None: # type: ignore serialized = {} serialized = serialized.copy() serialized["name"] = kwargs["name"] if "run_id" in kwargs: if serialized is None: # type: ignore serialized = {} serialized = serialized.copy() if "id" not in serialized: serialized["id"] = kwargs["run_id"] return original_on_chain_start(self, serialized, inputs, **kwargs) def instrument_agentops_langchain(): """Bypass AgentOp's native support for Langchain.""" global langgraph_entry langgraph_entry = instrumentation.AGENTIC_LIBRARIES.pop("langgraph", None) LangchainCallbackHandler.on_chain_start = on_chain_start def uninstrument_agentops_langchain(): """Restore AgentOp's native support for Langchain.""" global langgraph_entry if langgraph_entry is not None: instrumentation.AGENTIC_LIBRARIES["langgraph"] = langgraph_entry langgraph_entry = None LangchainCallbackHandler.on_chain_start = original_on_chain_start ================================================ FILE: agentlightning/instrumentation/litellm.py ================================================ # Copyright (c) Microsoft. All rights reserved. """LiteLLM instrumentations. It's unclear whether or not this file is useful. It seems that LiteLLM owns its own telemetry from their own entrance [Related documentation](https://docs.litellm.ai/docs/observability/agentops_integration). """ from typing import Any, Optional from litellm.integrations.opentelemetry import OpenTelemetry __all__ = [ "instrument_litellm", "uninstrument_litellm", ] original_set_attributes = OpenTelemetry.set_attributes # type: ignore def patched_set_attributes(self: Any, span: Any, kwargs: Any, response_obj: Optional[Any]): original_set_attributes(self, span, kwargs, response_obj) # Add custom attributes if response_obj is not None and response_obj.get("prompt_token_ids"): span.set_attribute("prompt_token_ids", list(response_obj.get("prompt_token_ids"))) if response_obj is not None and response_obj.get("response_token_ids"): span.set_attribute("response_token_ids", list(response_obj.get("response_token_ids")[0])) def instrument_litellm(): """Instrument litellm to capture token IDs.""" OpenTelemetry.set_attributes = patched_set_attributes def uninstrument_litellm(): """Uninstrument litellm to stop capturing token IDs.""" OpenTelemetry.set_attributes = original_set_attributes ================================================ FILE: agentlightning/instrumentation/vllm.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import warnings from typing import Any, List import vllm.entrypoints.openai.protocol from vllm.entrypoints.openai.protocol import ChatCompletionResponse from vllm.entrypoints.openai.serving_chat import OpenAIServingChat __all__ = [ "instrument_vllm", "uninstrument_vllm", ] class ChatCompletionResponsePatched(ChatCompletionResponse): prompt_token_ids: List[int] | None = None response_token_ids: List[int] | None = None original_chat_completion_full_generator = OpenAIServingChat.chat_completion_full_generator async def chat_completion_full_generator( self: Any, request: Any, result_generator: Any, request_id: str, model_name: str, conversation: Any, tokenizer: Any, request_metadata: Any, ) -> Any: prompt_token_ids: List[int] | None = None response_token_ids: List[List[int]] | None = None async def _generate_inceptor(): nonlocal prompt_token_ids, response_token_ids async for res in result_generator: yield res prompt_token_ids = res.prompt_token_ids response_token_ids = [output.token_ids for output in res.outputs] response = await original_chat_completion_full_generator( self, request, _generate_inceptor(), request_id, model_name, conversation, tokenizer, request_metadata, ) response = response.model_copy( update={ "prompt_token_ids": prompt_token_ids, "response_token_ids": response_token_ids, } ) return response def instrument_vllm(): """Instrument vLLM to capture token IDs generated by engine. This instrumentation has been merged to upstream vLLM since v0.10.2. """ if vllm.entrypoints.openai.protocol.ChatCompletionResponse is ChatCompletionResponsePatched: warnings.warn("vllm is already instrumented. Skip the instrumentation.") return vllm.entrypoints.openai.protocol.ChatCompletionResponse = ChatCompletionResponsePatched OpenAIServingChat.chat_completion_full_generator = chat_completion_full_generator def uninstrument_vllm(): """Uninstrument vLLM to stop capturing token IDs generated by engine.""" OpenAIServingChat.chat_completion_full_generator = original_chat_completion_full_generator ================================================ FILE: agentlightning/instrumentation/weave.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging import threading import warnings from datetime import datetime, timezone from typing import Any, Callable, Dict, Iterator, List import weave.trace.weave_init from pydantic import validate_call from weave.trace_server import trace_server_interface as tsi from weave.trace_server.ids import generate_id from weave.trace_server_bindings.client_interface import TraceServerClientInterface from weave.trace_server_bindings.models import ServerInfoRes logger = logging.getLogger(__name__) __all__ = [ "instrument_weave", "uninstrument_weave", "InMemoryWeaveTraceServer", ] class InMemoryWeaveTraceServer(TraceServerClientInterface): """A minimal in-memory implementation of the TraceServerInterface. It stores calls and objects in local dictionaries and returns valid Pydantic responses to satisfy the Weave client and FullTraceServerInterface protocol. """ def __init__(self): # Minimal storage to allow basic querying in tests self.calls: Dict[str, tsi.CallSchema] = {} self.partial_calls: Dict[str, Dict[str, Any]] = {} self.objs: Dict[str, Any] = {} self.files: Dict[str, bytes] = {} self.feedback: List[tsi.FeedbackCreateReq] = [] self._call_threading_lock = threading.Lock() @classmethod def from_env(cls, *args: Any, **kwargs: Any) -> InMemoryWeaveTraceServer: return cls() def server_info(self) -> ServerInfoRes: return ServerInfoRes(min_required_weave_python_version="0.52.22") def ensure_project_exists(self, entity: str, project: str) -> tsi.EnsureProjectExistsRes: return tsi.EnsureProjectExistsRes(project_name=project) # --- Call API --- @validate_call def call_start(self, req: tsi.CallStartReq) -> tsi.CallStartRes: # NOTE: It's not necessary that call_end must be called after call_start. request_content = req.start.model_dump(exclude_none=True) # If id needs to be generated here, it's very likely we won't be able to find the call later. # This is just to make the type checker happy. call_id = request_content.get("id") or generate_id() trace_id = request_content.get("trace_id") or generate_id() request_content["id"] = call_id request_content["trace_id"] = trace_id with self._call_threading_lock: if call_id in self.partial_calls: # call_end has already been called for this call. kwargs = {**request_content, **self.partial_calls[call_id]} self.calls[call_id] = tsi.CallSchema(**kwargs) del self.partial_calls[call_id] else: self.partial_calls[call_id] = request_content return tsi.CallStartRes(id=call_id, trace_id=trace_id) @validate_call def call_end(self, req: tsi.CallEndReq) -> tsi.CallEndRes: request_content = req.end.model_dump(exclude_none=True) call_id = req.end.id with self._call_threading_lock: if call_id in self.partial_calls: # End request always override the start request content. kwargs = {**self.partial_calls[call_id], **request_content} self.calls[call_id] = tsi.CallSchema(**kwargs) del self.partial_calls[call_id] else: self.partial_calls[call_id] = request_content return tsi.CallEndRes() @validate_call def call_start_batch(self, req: tsi.CallCreateBatchReq) -> tsi.CallCreateBatchRes: for item in req.batch: if isinstance(item, tsi.CallStartReq): self.call_start(item) elif isinstance(item, tsi.CallEndReq): self.call_end(item) return tsi.CallCreateBatchRes(res=[]) @validate_call def call_read(self, req: tsi.CallReadReq) -> tsi.CallReadRes: call_data = self.calls.get(req.id) return tsi.CallReadRes(call=call_data) @validate_call def calls_query(self, req: tsi.CallsQueryReq) -> tsi.CallsQueryRes: return tsi.CallsQueryRes(calls=list(self.calls_query_stream(req))) @validate_call def calls_query_stream(self, req: tsi.CallsQueryReq) -> Iterator[tsi.CallSchema]: yield from self.calls.values() @validate_call def calls_delete(self, req: tsi.CallsDeleteReq) -> tsi.CallsDeleteRes: num_deleted = 0 for call_id in req.call_ids: if call_id in self.calls: del self.calls[call_id] num_deleted += 1 return tsi.CallsDeleteRes(num_deleted=num_deleted) @validate_call def call_update(self, req: tsi.CallUpdateReq) -> tsi.CallUpdateRes: return tsi.CallUpdateRes() @validate_call def calls_query_stats(self, req: tsi.CallsQueryStatsReq) -> tsi.CallsQueryStatsRes: return tsi.CallsQueryStatsRes(count=len(self.calls)) # --- Cost API --- @validate_call def cost_create(self, req: tsi.CostCreateReq) -> tsi.CostCreateRes: return tsi.CostCreateRes(ids=[(generate_id(), generate_id()) for _ in req.costs]) @validate_call def cost_query(self, req: tsi.CostQueryReq) -> tsi.CostQueryRes: return tsi.CostQueryRes(results=[]) @validate_call def cost_purge(self, req: tsi.CostPurgeReq) -> tsi.CostPurgeRes: return tsi.CostPurgeRes() # --- Object API (Legacy V1) --- @validate_call def obj_create(self, req: tsi.ObjCreateReq) -> tsi.ObjCreateRes: digest = generate_id() self.objs[digest] = req.obj return tsi.ObjCreateRes(digest=digest) @validate_call def obj_read(self, req: tsi.ObjReadReq) -> tsi.ObjReadRes: return tsi.ObjReadRes(obj=self.objs.get(req.digest, {})) @validate_call def objs_query(self, req: tsi.ObjQueryReq) -> tsi.ObjQueryRes: return tsi.ObjQueryRes(objs=[]) @validate_call def obj_delete(self, req: tsi.ObjDeleteReq) -> tsi.ObjDeleteRes: return tsi.ObjDeleteRes(num_deleted=0) # --- Table API --- @validate_call def table_create(self, req: tsi.TableCreateReq) -> tsi.TableCreateRes: return tsi.TableCreateRes(digest=generate_id(), row_digests=[]) @validate_call def table_create_from_digests(self, req: tsi.TableCreateFromDigestsReq) -> tsi.TableCreateFromDigestsRes: return tsi.TableCreateFromDigestsRes(digest=generate_id()) @validate_call def table_update(self, req: tsi.TableUpdateReq) -> tsi.TableUpdateRes: return tsi.TableUpdateRes(digest=generate_id(), updated_row_digests=[]) @validate_call def table_query(self, req: tsi.TableQueryReq) -> tsi.TableQueryRes: return tsi.TableQueryRes(rows=[]) @validate_call def table_query_stream(self, req: tsi.TableQueryReq) -> Iterator[tsi.TableRowSchema]: yield from [] @validate_call def table_query_stats(self, req: tsi.TableQueryStatsReq) -> tsi.TableQueryStatsRes: return tsi.TableQueryStatsRes(count=0) @validate_call def table_query_stats_batch(self, req: tsi.TableQueryStatsBatchReq) -> tsi.TableQueryStatsBatchRes: return tsi.TableQueryStatsBatchRes(tables=[]) # --- Ref API --- @validate_call def refs_read_batch(self, req: tsi.RefsReadBatchReq) -> tsi.RefsReadBatchRes: return tsi.RefsReadBatchRes(vals=[]) # --- File API --- def file_create(self, req: tsi.FileCreateReq) -> tsi.FileCreateRes: self.files[req.name] = req.content return tsi.FileCreateRes(digest=generate_id()) def file_content_read(self, req: tsi.FileContentReadReq) -> tsi.FileContentReadRes: return tsi.FileContentReadRes(content=self.files.get(req.digest, b"dummy_content")) def files_stats(self, req: tsi.FilesStatsReq) -> tsi.FilesStatsRes: total_size = sum(len(c) for c in self.files.values()) return tsi.FilesStatsRes(total_size_bytes=total_size) # --- Feedback API --- @validate_call def feedback_create(self, req: tsi.FeedbackCreateReq) -> tsi.FeedbackCreateRes: req.id = req.id or generate_id() self.feedback.append(req) return tsi.FeedbackCreateRes( id=req.id, created_at=datetime.now(timezone.utc), wb_user_id="dummy_user", payload=req.payload, ) def feedback_create_batch(self, req: tsi.FeedbackCreateBatchReq) -> tsi.FeedbackCreateBatchRes: results: List[tsi.FeedbackCreateRes] = [] for item in req.batch: res = self.feedback_create(item) results.append(res) return tsi.FeedbackCreateBatchRes(res=results) @validate_call def feedback_query(self, req: tsi.FeedbackQueryReq) -> tsi.FeedbackQueryRes: return tsi.FeedbackQueryRes(result=[]) @validate_call def feedback_purge(self, req: tsi.FeedbackPurgeReq) -> tsi.FeedbackPurgeRes: self.feedback.clear() return tsi.FeedbackPurgeRes() @validate_call def feedback_replace(self, req: tsi.FeedbackReplaceReq) -> tsi.FeedbackReplaceRes: return tsi.FeedbackReplaceRes( id=req.id or generate_id(), created_at=datetime.now(timezone.utc), wb_user_id="dummy", payload={}, ) # --- Action API --- @validate_call def actions_execute_batch(self, req: tsi.ActionsExecuteBatchReq) -> tsi.ActionsExecuteBatchRes: return tsi.ActionsExecuteBatchRes() # --- Execute LLM API --- @validate_call def completions_create(self, req: tsi.CompletionsCreateReq) -> tsi.CompletionsCreateRes: return tsi.CompletionsCreateRes(response={"choices": [{"text": "dummy completion"}]}) @validate_call def completions_create_stream(self, req: tsi.CompletionsCreateReq) -> Iterator[dict[str, Any]]: yield {"choices": [{"text": "dummy "}]} yield {"choices": [{"text": "stream"}]} # --- Execute Image Generation API --- @validate_call def image_create(self, req: tsi.ImageGenerationCreateReq) -> tsi.ImageGenerationCreateRes: return tsi.ImageGenerationCreateRes(response={}) # --- Project Statistics API --- @validate_call def project_stats(self, req: tsi.ProjectStatsReq) -> tsi.ProjectStatsRes: return tsi.ProjectStatsRes( trace_storage_size_bytes=0, objects_storage_size_bytes=0, tables_storage_size_bytes=0, files_storage_size_bytes=0, ) # --- Thread API --- @validate_call def threads_query_stream(self, req: tsi.ThreadsQueryReq) -> Iterator[tsi.ThreadSchema]: yield from [] # --- Evaluation API (V1) --- @validate_call def evaluate_model(self, req: tsi.EvaluateModelReq) -> tsi.EvaluateModelRes: return tsi.EvaluateModelRes(call_id=generate_id()) @validate_call def evaluation_status(self, req: tsi.EvaluationStatusReq) -> tsi.EvaluationStatusRes: return tsi.EvaluationStatusRes(status=tsi.EvaluationStatusNotFound()) # --- OTEL API --- def otel_export(self, req: tsi.OtelExportReq) -> tsi.OtelExportRes: return tsi.OtelExportRes() # ========================================== # Object Interface (V2 APIs) # ========================================== # --- Ops --- def op_create(self, req: tsi.OpCreateReq) -> tsi.OpCreateRes: return tsi.OpCreateRes(digest=generate_id(), object_id=generate_id(), version_index=0) def op_read(self, req: tsi.OpReadReq) -> tsi.OpReadRes: return tsi.OpReadRes(op=None) # type: ignore def op_list(self, req: tsi.OpListReq) -> Iterator[tsi.OpReadRes]: yield from [] def op_delete(self, req: tsi.OpDeleteReq) -> tsi.OpDeleteRes: return tsi.OpDeleteRes(num_deleted=0) # --- Datasets --- def dataset_create(self, req: tsi.DatasetCreateReq) -> tsi.DatasetCreateRes: return tsi.DatasetCreateRes(digest=generate_id(), object_id=generate_id(), version_index=0) def dataset_read(self, req: tsi.DatasetReadReq) -> tsi.DatasetReadRes: return tsi.DatasetReadRes(dataset=None) # type: ignore def dataset_list(self, req: tsi.DatasetListReq) -> Iterator[tsi.DatasetReadRes]: yield from [] def dataset_delete(self, req: tsi.DatasetDeleteReq) -> tsi.DatasetDeleteRes: return tsi.DatasetDeleteRes(num_deleted=0) # --- Scorers --- def scorer_create(self, req: tsi.ScorerCreateReq) -> tsi.ScorerCreateRes: return tsi.ScorerCreateRes(digest=generate_id(), object_id=generate_id(), version_index=0, scorer=generate_id()) def scorer_read(self, req: tsi.ScorerReadReq) -> tsi.ScorerReadRes: return tsi.ScorerReadRes(scorer=None) # type: ignore def scorer_list(self, req: tsi.ScorerListReq) -> Iterator[tsi.ScorerReadRes]: yield from [] def scorer_delete(self, req: tsi.ScorerDeleteReq) -> tsi.ScorerDeleteRes: return tsi.ScorerDeleteRes(num_deleted=0) # --- Evaluations (V2) --- def evaluation_create(self, req: tsi.EvaluationCreateReq) -> tsi.EvaluationCreateRes: return tsi.EvaluationCreateRes( digest=generate_id(), object_id=generate_id(), version_index=0, evaluation_ref=generate_id() ) def evaluation_read(self, req: tsi.EvaluationReadReq) -> tsi.EvaluationReadRes: return tsi.EvaluationReadRes(evaluation=None) # type: ignore def evaluation_list(self, req: tsi.EvaluationListReq) -> Iterator[tsi.EvaluationReadRes]: yield from [] def evaluation_delete(self, req: tsi.EvaluationDeleteReq) -> tsi.EvaluationDeleteRes: return tsi.EvaluationDeleteRes(num_deleted=0) # --- Models --- def model_create(self, req: tsi.ModelCreateReq) -> tsi.ModelCreateRes: return tsi.ModelCreateRes( digest=generate_id(), object_id=generate_id(), version_index=0, model_ref=generate_id() ) def model_read(self, req: tsi.ModelReadReq) -> tsi.ModelReadRes: return tsi.ModelReadRes(model=None) # type: ignore def model_list(self, req: tsi.ModelListReq) -> Iterator[tsi.ModelReadRes]: yield from [] def model_delete(self, req: tsi.ModelDeleteReq) -> tsi.ModelDeleteRes: return tsi.ModelDeleteRes(num_deleted=0) # --- Evaluation Runs --- def evaluation_run_create(self, req: tsi.EvaluationRunCreateReq) -> tsi.EvaluationRunCreateRes: return tsi.EvaluationRunCreateRes(evaluation_run_id=generate_id()) def evaluation_run_read(self, req: tsi.EvaluationRunReadReq) -> tsi.EvaluationRunReadRes: return tsi.EvaluationRunReadRes(evaluation_run=None) # type: ignore def evaluation_run_list(self, req: tsi.EvaluationRunListReq) -> Iterator[tsi.EvaluationRunReadRes]: yield from [] def evaluation_run_delete(self, req: tsi.EvaluationRunDeleteReq) -> tsi.EvaluationRunDeleteRes: return tsi.EvaluationRunDeleteRes(num_deleted=0) def evaluation_run_finish(self, req: tsi.EvaluationRunFinishReq) -> tsi.EvaluationRunFinishRes: return tsi.EvaluationRunFinishRes(success=True) # --- Predictions --- def prediction_create(self, req: tsi.PredictionCreateReq) -> tsi.PredictionCreateRes: return tsi.PredictionCreateRes(prediction_id=generate_id()) def prediction_read(self, req: tsi.PredictionReadReq) -> tsi.PredictionReadRes: return tsi.PredictionReadRes(prediction=None) # type: ignore def prediction_list(self, req: tsi.PredictionListReq) -> Iterator[tsi.PredictionReadRes]: yield from [] def prediction_delete(self, req: tsi.PredictionDeleteReq) -> tsi.PredictionDeleteRes: return tsi.PredictionDeleteRes(num_deleted=0) def prediction_finish(self, req: tsi.PredictionFinishReq) -> tsi.PredictionFinishRes: return tsi.PredictionFinishRes(success=True) # --- Scores --- def score_create(self, req: tsi.ScoreCreateReq) -> tsi.ScoreCreateRes: return tsi.ScoreCreateRes(score_id=generate_id()) def score_read(self, req: tsi.ScoreReadReq) -> tsi.ScoreReadRes: return tsi.ScoreReadRes(score=None) # type: ignore def score_list(self, req: tsi.ScoreListReq) -> Iterator[tsi.ScoreReadRes]: yield from [] def score_delete(self, req: tsi.ScoreDeleteReq) -> tsi.ScoreDeleteRes: return tsi.ScoreDeleteRes(num_deleted=0) # Experimental unstable APIs # We don't support these APIs yet. def annotation_queue_create(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotation_queues_query_stream(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotation_queue_read(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotation_queue_add_calls(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotation_queues_stats(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotation_queue_items_query(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def annotator_queue_items_progress_update(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def calls_complete(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def call_start_v2(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def call_end_v2(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def call_stats(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def trace_usage(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() def calls_usage(self, *args: Any, **kwargs: Any) -> Any: raise NotImplementedError() # Module-level storage for originals _original_init_weave_get_server: Callable[..., Any] | None = None _original_get_entity_project_from_project_name: Callable[..., Any] | None = None _original_get_username: Callable[..., Any] | None = None def init_weave_get_server_factory(server: InMemoryWeaveTraceServer) -> Callable[..., Any]: # Bypass the usage of Weave remote server def init_weave_get_server(*args: Any, **kwargs: Any) -> InMemoryWeaveTraceServer: return server return init_weave_get_server def get_entity_project_from_project_name_factory(entity_name: str) -> tuple[str, str]: # Bypass the usage of API try: assert _original_get_entity_project_from_project_name is not None if _original_get_entity_project_from_project_name is not get_entity_project_from_project_name_factory: return _original_get_entity_project_from_project_name(entity_name) else: warnings.warn("W&B integration might have been repeatedly/recursively instrumented.") return "agl", "weave" except weave.trace.weave_init.WeaveWandbAuthenticationException: # In case API is not available. return "agl", "weave" def get_username() -> str: # Bypass the usage of API try: assert _original_get_username is not None return _original_get_username() except RuntimeError: return "agl" except Exception as exc: warnings.warn(f"Unexpected error in get_username. Using default username. Error: {exc}") return "agl" def instrument_weave(server: InMemoryWeaveTraceServer): """Patch the Weave/W&B integration to bypass actual network calls for testing.""" global _original_init_weave_get_server, _original_get_entity_project_from_project_name, _original_get_username _original_init_weave_get_server = weave.trace.weave_init.init_weave_get_server _original_get_entity_project_from_project_name = weave.trace.weave_init.get_entity_project_from_project_name _original_get_username = weave.trace.weave_init.get_username weave.trace.weave_init.init_weave_get_server = init_weave_get_server_factory(server) weave.trace.weave_init.get_entity_project_from_project_name = get_entity_project_from_project_name_factory weave.trace.weave_init.get_username = get_username def uninstrument_weave(): """Restore the original Weave/W&B integration methods and HTTP requests.""" global _original_init_weave_get_server, _original_get_entity_project_from_project_name, _original_get_username if _original_init_weave_get_server is not None: weave.trace.weave_init.init_weave_get_server = _original_init_weave_get_server _original_init_weave_get_server = None else: raise RuntimeError("Weave/W&B integration was not instrumented.") if _original_get_entity_project_from_project_name is not None: weave.trace.weave_init.get_entity_project_from_project_name = _original_get_entity_project_from_project_name _original_get_entity_project_from_project_name = None else: raise RuntimeError("Weave/W&B integration was not instrumented.") if _original_get_username is not None: weave.trace.weave_init.get_username = _original_get_username _original_get_username = None else: raise RuntimeError("Weave/W&B integration was not instrumented.") ================================================ FILE: agentlightning/litagent/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .decorator import * from .litagent import * __all__ = [ "LitAgent", "llm_rollout", "prompt_rollout", "rollout", ] ================================================ FILE: agentlightning/litagent/decorator.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Convenience decorators for building lightweight `LitAgent` implementations.""" from __future__ import annotations import functools import inspect import logging from typing import Any, Awaitable, Callable, Dict, Protocol, TypeGuard, TypeVar, Union, overload from agentlightning.types import ( LLM, AttemptedRollout, NamedResources, PromptTemplate, ProxyLLM, Rollout, RolloutRawResult, ) from .litagent import LitAgent logger = logging.getLogger(__name__) T = TypeVar("T") __all__ = [ "llm_rollout", "prompt_rollout", "rollout", ] T_contra = TypeVar("T_contra", contravariant=True) class LlmRolloutFuncSync2(Protocol[T_contra]): def __call__(self, task: T_contra, llm: LLM) -> RolloutRawResult: ... class LlmRolloutFuncSync3(Protocol[T_contra]): def __call__(self, task: T_contra, llm: LLM, rollout: Rollout) -> RolloutRawResult: ... class LlmRolloutFuncAsync2(Protocol[T_contra]): def __call__(self, task: T_contra, llm: LLM) -> Awaitable[RolloutRawResult]: ... class LlmRolloutFuncAsync3(Protocol[T_contra]): def __call__(self, task: T_contra, llm: LLM, rollout: Rollout) -> Awaitable[RolloutRawResult]: ... LlmRolloutFunc = Union[ LlmRolloutFuncSync2[T_contra], LlmRolloutFuncSync3[T_contra], LlmRolloutFuncAsync2[T_contra], LlmRolloutFuncAsync3[T_contra], ] class PromptRolloutFuncSync2(Protocol[T_contra]): def __call__(self, task: T_contra, prompt_template: PromptTemplate) -> RolloutRawResult: ... class PromptRolloutFuncAsync2(Protocol[T_contra]): def __call__(self, task: T_contra, prompt_template: PromptTemplate) -> Awaitable[RolloutRawResult]: ... class PromptRolloutFuncSync3(Protocol[T_contra]): def __call__(self, task: T_contra, prompt_template: PromptTemplate, rollout: Rollout) -> RolloutRawResult: ... class PromptRolloutFuncAsync3(Protocol[T_contra]): def __call__( self, task: T_contra, prompt_template: PromptTemplate, rollout: Rollout ) -> Awaitable[RolloutRawResult]: ... PromptRolloutFunc = Union[ PromptRolloutFuncSync2[T_contra], PromptRolloutFuncSync3[T_contra], PromptRolloutFuncAsync2[T_contra], PromptRolloutFuncAsync3[T_contra], ] class FunctionalLitAgentFunc(Protocol[T_contra]): def __call__( self, task: T_contra, *args: Any, **kwargs: Any ) -> Union[RolloutRawResult, Awaitable[RolloutRawResult]]: ... class FunctionalLitAgent(LitAgent[T]): """Adapter that turns plain rollout functions into [`LitAgent`][agentlightning.LitAgent] instances. The helper inspects the wrapped function to determine which resources to inject, allowing both synchronous and asynchronous callables to participate in the training loop without writing a dedicated subclass. """ def __init__(self, rollout_func: FunctionalLitAgentFunc[T], *, strip_proxy: bool = True) -> None: """Initialize the wrapper around a rollout function. Args: rollout_func: Callable that implements the rollout. It may be synchronous or asynchronous and can optionally receive a [`Rollout`][agentlightning.Rollout] alongside resources such as `llm` or `prompt_template`. strip_proxy: When ``True``, convert [`ProxyLLM`][agentlightning.ProxyLLM] inputs into [`LLM`][agentlightning.LLM] instances before calling the rollout function. Defaults to `True`. """ super().__init__() self._rollout_func = rollout_func self._strip_proxy = strip_proxy self._is_async = inspect.iscoroutinefunction(rollout_func) self._sig = inspect.signature(rollout_func) # Copy function metadata to preserve type hints and other attributes functools.update_wrapper(self, rollout_func) # type: ignore def _accepts_rollout(self) -> bool: return "rollout" in self._sig.parameters def _accepts_llm(self) -> bool: return "llm" in self._sig.parameters def _accepts_prompt_template(self) -> bool: return "prompt_template" in self._sig.parameters def __call__(self, *args: Any, **kwargs: Any) -> Any: """Make the agent instance callable, preserving the original function behavior.""" return self._rollout_func(*args, **kwargs) # type: ignore def is_async(self) -> bool: return self._is_async def rollout(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Execute a synchronous rollout using the wrapped function. Args: task: Task input data. resources: Mapping of named resources available to the agent. rollout: Rollout metadata provided by the runtime. Returns: Result produced by the wrapped rollout function. Raises: RuntimeError: If the wrapped function is asynchronous. """ if self._is_async: raise RuntimeError(f"{self._rollout_func} is asynchronous. Use rollout_async instead.") kwargs = self._get_kwargs(resources, rollout) return self._rollout_func(task, **kwargs) # type: ignore async def rollout_async(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Execute an asynchronous rollout using the wrapped function. Args: task: Task input data. resources: Mapping of named resources available to the agent. rollout: Rollout metadata provided by the runtime. Returns: Result produced by the wrapped rollout coroutine. Raises: RuntimeError: If the wrapped function is synchronous. """ if not self._is_async: raise RuntimeError(f"{self._rollout_func} is synchronous. Use rollout instead.") kwargs = self._get_kwargs(resources, rollout) return await self._rollout_func(task, **kwargs) # type: ignore def _get_kwargs(self, resources: NamedResources, rollout: Rollout) -> Dict[str, Any]: """Prepare keyword arguments expected by the wrapped rollout function. It dynamically builds the `kwargs` dictionary by inspecting the function signature and including only the parameters the function accepts. This allows flexible function signatures that can request any combination of: rollout, llm, and/or prompt_template. Args: resources: Mapping of named resources available for the rollout. rollout: Rollout metadata provided by the runtime. Returns: Dictionary of keyword arguments to forward to the rollout function. """ kwargs: Dict[str, Any] = {} if self._accepts_rollout(): kwargs["rollout"] = rollout if self._accepts_llm(): kwargs["llm"] = self._get_llm_resource(resources, rollout) if self._accepts_prompt_template(): kwargs["prompt_template"] = self._get_prompt_template_resource(resources, rollout) return kwargs def _get_llm_resource(self, resources: NamedResources, rollout: Rollout) -> LLM: """Retrieve the first LLM resource from the available resources. Strip the ProxyLLM resource into a LLM resource if needed. Args: resources: Mapping of named resources. rollout: Rollout metadata used when stripping proxy endpoints. Returns: First [`LLM`][agentlightning.LLM] resource encountered. Raises: ValueError: If no LLM resource is present. """ resource_found: LLM | None = None for name, resource in resources.items(): if isinstance(resource, LLM): if resource_found is not None: logger.warning(f"Multiple LLM resources found in resources. Using the first one: '{name}'.") break resource_found = resource if resource_found is None: raise ValueError("No LLM resource found in the provided resources.") if self._strip_proxy: resource_found = self._strip_proxy_helper(resource_found, rollout) return resource_found def _get_prompt_template_resource(self, resources: NamedResources, rollout: Rollout) -> PromptTemplate: """Retrieve the first prompt template resource from the available resources. Args: resources: Mapping of named resources. rollout: Rollout metadata (unused). Returns: First [`PromptTemplate`][agentlightning.PromptTemplate] resource encountered. Raises: ValueError: If no prompt template resource is present. """ resource_found: PromptTemplate | None = None for name, resource in resources.items(): if isinstance(resource, PromptTemplate): if resource_found is not None: logger.warning( f"Multiple prompt template resources found in resources. Using the first one: '{name}'." ) break resource_found = resource if resource_found is None: raise ValueError("No prompt template resource found in the provided resources.") return resource_found def _strip_proxy_helper(self, proxy_llm: LLM, rollout: Rollout) -> LLM: """Convert [`ProxyLLM`][agentlightning.ProxyLLM] instances into concrete LLMs. It resolves ProxyLLM instances to their concrete LLM implementation by attaching the attempted rollout context. This is only used when the function signature accepts an `llm` parameter and strip_proxy is True. Args: proxy_llm: Candidate LLM resource. rollout: Rollout metadata that provides rollout and attempt identifiers. Returns: [`LLM`][agentlightning.LLM] with rollout context baked into the endpoint. Raises: ValueError: If the rollout is not an [`AttemptedRollout`][agentlightning.AttemptedRollout]. """ if not isinstance(proxy_llm, ProxyLLM): # Not a ProxyLLM, nothing to strip here. return proxy_llm # Rollout is still a Rollout here because API is not stabilized yet. # In practice, it must be an AttemptedRollout. if not isinstance(rollout, AttemptedRollout): raise ValueError("Rollout is not an AttemptedRollout.") return proxy_llm.with_attempted_rollout(rollout) @overload def llm_rollout(func: LlmRolloutFunc[T]) -> FunctionalLitAgent[T]: ... @overload def llm_rollout(*, strip_proxy: bool = True) -> Callable[[LlmRolloutFunc[T]], FunctionalLitAgent[T]]: ... def llm_rollout( func: LlmRolloutFunc[T] | None = None, *, strip_proxy: bool = True ) -> FunctionalLitAgent[T] | Callable[[LlmRolloutFunc[T]], FunctionalLitAgent[T]]: """Create a [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] for LLM-based rollouts. Args: func: Callable defining the agent's behaviour. Supported signatures include: * `(task, llm) -> result` * `(task, llm, rollout) -> result` * `async (task, llm) -> result` * `async (task, llm, rollout) -> result` strip_proxy: When `True`, convert proxy resources into concrete [`LLM`][agentlightning.LLM] instances before calling the function. Defaults to `True`. Returns: [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] that wraps the supplied function. Examples: ```python @llm_rollout def my_agent(task, llm): return llm.endpoint @llm_rollout(strip_proxy=False) def my_agent_no_strip(task, llm): return llm.model result = my_agent(task, llm) result = my_agent.rollout(task, resources, rollout) ``` """ def decorator(f: LlmRolloutFunc[T]) -> FunctionalLitAgent[T]: _validate_llm_rollout_func(f) return FunctionalLitAgent(f, strip_proxy=strip_proxy) if func is None: # Called with arguments: @llm_rollout(strip_proxy=False) return decorator else: # Called without arguments: @llm_rollout return decorator(func) def _validate_llm_rollout_func(func: Any) -> TypeGuard[LlmRolloutFunc[Any]]: """Validate the function signature of an LLM rollout function. Ensures the function follows the expected pattern for LLM-based rollouts: - Must have at least 2 parameters - First parameter must be named 'task' - Must have a parameter named 'llm' - Optionally can have a 'rollout' parameter Args: func: Function to inspect. Returns: `True` when the signature matches the supported patterns. Raises: ValueError: If the function signature does not match the expected pattern. """ sig = inspect.signature(func) params = list(sig.parameters.keys()) if len(params) < 2: raise ValueError(f"Function {func} must have at least 2 parameters.") if params[0] != "task": raise ValueError(f"Function {func} must be a positional parameter called 'task'.") if "llm" not in params: raise ValueError(f"Function {func} must have a positional parameter called 'llm'.") return True @overload def prompt_rollout(func: PromptRolloutFunc[T]) -> FunctionalLitAgent[T]: ... @overload def prompt_rollout() -> Callable[[PromptRolloutFunc[T]], FunctionalLitAgent[T]]: ... def prompt_rollout( func: PromptRolloutFunc[T] | None = None, ) -> FunctionalLitAgent[T] | Callable[[PromptRolloutFunc[T]], FunctionalLitAgent[T]]: """Create a [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] for prompt-based rollouts. This decorator is designed for agents that work with tunable prompt templates. It enables a workflow where algorithms manage and optimize the prompt template, while agents consume the template to perform rollouts. This is particularly useful for prompt optimization scenarios. Args: func: Callable defining the agent's behavior. Supported signatures include: * `(task, prompt_template) -> result` * `(task, prompt_template, rollout) -> result` * `async (task, prompt_template) -> result` * `async (task, prompt_template, rollout) -> result` Returns: [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] that wraps the supplied function. Examples: ```python @prompt_rollout def my_agent(task, prompt_template): messages = prompt_template.format(task=task.input) return messages result = my_agent(task, prompt_template) result = my_agent.rollout(task, resources, rollout) ``` """ def decorator(f: PromptRolloutFunc[T]) -> FunctionalLitAgent[T]: _validate_prompt_rollout_func(f) return FunctionalLitAgent(f) if func is None: return decorator else: return decorator(func) def _validate_prompt_rollout_func(func: Any) -> TypeGuard[PromptRolloutFunc[Any]]: """Validate the function signature of a prompt rollout function. Ensures the function follows the expected pattern for prompt-template-based rollouts: - Must have at least 2 parameters - First parameter must be named 'task' - Must have a parameter named 'prompt_template' - Optionally can have a 'rollout' parameter Args: func: Function to inspect. Returns: `True` when the signature matches the supported patterns. Raises: ValueError: If the function signature does not match the expected pattern. """ sig = inspect.signature(func) params = list(sig.parameters.keys()) if len(params) < 2: raise ValueError(f"Function {func} must have at least 2 parameters.") if params[0] != "task": raise ValueError(f"Function {func} must be a positional parameter called 'task'.") if "prompt_template" not in params: raise ValueError(f"Function {func} must have a positional parameter called 'prompt_template'.") return True def rollout(func: Union[LlmRolloutFunc[T], PromptRolloutFunc[T], Callable[..., Any]]) -> FunctionalLitAgent[T]: """Create a [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] from an arbitrary rollout function. This function inspects the provided callable and creates the appropriate agent type based on its signature. It supports both LLM-based and prompt-template-based agents. The returned agent instance is callable, preserving the original function's behavior and type hints. See [`llm_rollout`][agentlightning.litagent.decorator.llm_rollout] and [`prompt_rollout`][agentlightning.litagent.decorator.prompt_rollout] for more details. Args: func: Callable that implements the rollout. Supported signatures: - `[async ](task, llm[, rollout])` for LLM-based agents - `[async ](task, prompt_template[, rollout])` for prompt-template-based agents The supported output types of `func` is same as the return type of [`rollout`][agentlightning.LitAgent.rollout]. Returns: [`FunctionalLitAgent`][agentlightning.litagent.decorator.FunctionalLitAgent] that wraps the supplied function. Examples: ```python # LLM-based agent @rollout def my_llm_agent(task, llm): client = OpenAI(base_url=llm.endpoint) response = client.chat.completions.create( model=llm.model, messages=[{"role": "user", "content": task.input}], ) return response # Prompt-template-based agent @rollout def my_prompt_agent(task, prompt_template): messages = prompt_template.format(task=task.input) # ... perform rollout with the formatted prompt return response # Function is still callable with original behavior result = my_llm_agent(task, llm) # Agent methods are also available result = my_llm_agent.rollout(task, resources, rollout) ``` Raises: NotImplementedError: If the function signature doesn't match any known patterns. """ # Check if it matches the LLM rollout API pattern sig = inspect.signature(func) try: if _validate_llm_rollout_func(func): return llm_rollout(func) except ValueError: pass try: if _validate_prompt_rollout_func(func): return prompt_rollout(func) except ValueError: pass raise NotImplementedError( f"Function signature {sig} does not match any known agent patterns. " "Expected signatures: (task, llm[, rollout]) or (task, prompt_template[, rollout]). " "Functions can be sync or async." ) ================================================ FILE: agentlightning/litagent/litagent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Base abstractions for building agents that plug into Agent Lightning.""" from __future__ import annotations import inspect import logging import warnings import weakref from typing import TYPE_CHECKING, Any, Callable, Generic, Optional, TypeVar from agentlightning.types import NamedResources, Rollout, RolloutRawResult, Task if TYPE_CHECKING: from agentlightning.runner import Runner from agentlightning.tracer import Tracer from agentlightning.trainer import Trainer logger = logging.getLogger(__name__) T = TypeVar("T") __all__ = [ "LitAgent", ] def is_v0_1_rollout_api(func: Callable[..., Any]) -> bool: """Return `True` when the rollout function uses the deprecated v0.1 signature. The helper inspects the callable's signature to detect whether a `rollout_id` parameter is present, which indicates the legacy API. Args: func: Function to analyze. Returns: `True` if the callable exposes a `rollout_id` parameter. """ return "rollout_id" in inspect.signature(func).parameters class LitAgent(Generic[T]): """Base class for implementing agent rollouts. Subclasses override the rollout methods to process tasks while the trainer and runner infrastructure manages orchestration, tracing, and persistence. """ def __init__(self, *, trained_agents: Optional[str] = None) -> None: # FIXME: str | None won't work for cli """Initialize the agent instance. Args: trained_agents: Optional identifier used by legacy tooling to mark trained agents. !!! warning "Deprecated" The `trained_agents` flag is deprecated. Configure `agent_match` in the adapter layer instead. See [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] for more details. """ if trained_agents is not None: warnings.warn( "`trained_agents` is deprecated. Configure `agent_match` in adapter instead.", DeprecationWarning, stacklevel=2, ) self.trained_agents = trained_agents self._trainer_ref: weakref.ReferenceType[Trainer] | None = None self._runner_ref: weakref.ReferenceType[Runner[T]] | None = None def is_async(self) -> bool: """Return `True` when the agent overrides any asynchronous rollout methods. Override this method for customized async detection logic. """ return ( ( hasattr(self, "training_rollout_async") and self.__class__.training_rollout_async is not LitAgent.training_rollout_async # type: ignore ) or ( hasattr(self, "validation_rollout_async") and self.__class__.validation_rollout_async is not LitAgent.validation_rollout_async # type: ignore ) or (hasattr(self, "rollout_async") and self.__class__.rollout_async is not LitAgent.rollout_async) # type: ignore ) def set_trainer(self, trainer: Trainer) -> None: """Attach the trainer responsible for orchestration. Args: trainer: [`Trainer`][agentlightning.Trainer] that manages the agent. """ self._trainer_ref = weakref.ref(trainer) def get_trainer(self) -> Trainer: """Return the trainer associated with this agent.""" if self._trainer_ref is None: raise ValueError("Trainer has not been set for this agent.") trainer = self._trainer_ref() if trainer is None: raise ValueError("Trainer reference is no longer valid (object has been garbage collected).") return trainer @property def trainer(self) -> Trainer: """Return the trainer associated with this agent.""" return self.get_trainer() def get_tracer(self) -> Tracer: """Return the tracer configured for this agent.""" if hasattr(self.runner, "tracer"): return self.runner.tracer # type: ignore else: return self.trainer.tracer @property def tracer(self) -> Tracer: """Return the tracer configured for this agent.""" return self.get_tracer() def set_runner(self, runner: Runner[T]) -> None: """Attach the runner responsible for executing rollouts. Args: runner: [`Runner`][agentlightning.Runner] coordinating execution. """ self._runner_ref = weakref.ref(runner) def get_runner(self) -> Runner[T]: """Return the runner responsible for executing rollouts.""" if self._runner_ref is None: raise ValueError("Runner has not been set for this agent.") runner = self._runner_ref() if runner is None: raise ValueError("Runner reference is no longer valid (object has been garbage collected).") return runner @property def runner(self) -> Runner[T]: """Return the runner responsible for executing rollouts.""" return self.get_runner() def on_rollout_start(self, task: Task, runner: Runner[T], tracer: Tracer) -> None: """Hook invoked immediately before a rollout begins. Subclasses can override this method to implement custom logic such as logging, metric collection, or resource setup. The default implementation is a no-op. Args: task: [`Task`][agentlightning.Task] that will be processed. runner: [`Runner`][agentlightning.Runner] managing the rollout. tracer: [`Tracer`][agentlightning.Tracer] associated with the runner. !!! warning "Deprecated" Override [`Hook.on_rollout_start`][agentlightning.Hook.on_rollout_start] instead of this method when extending agents. """ def on_rollout_end(self, task: Task, rollout: Rollout, runner: Runner[T], tracer: Tracer) -> None: """Hook invoked after a rollout completes. Subclasses can override this method for cleanup or additional logging. The default implementation is a no-op. Args: task: [`Task`][agentlightning.Task] that was processed. rollout: Resulting [`Rollout`][agentlightning.Rollout]. runner: [`Runner`][agentlightning.Runner] managing the rollout. tracer: [`Tracer`][agentlightning.Tracer] associated with the runner. !!! warning "Deprecated" Override [`Hook.on_rollout_end`][agentlightning.Hook.on_rollout_end] instead of this method when extending agents. """ def rollout(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Execute a rollout synchronously. If you don't wish to implement both training rollout and validation rollout separately, you can just implement `rollout` which will work for both. Args: task: Task payload provided by the scheduler. resources: Mapping of named resources (for example LLMs or prompt templates). rollout: Rollout metadata. Avoid mutating this object directly unless a subclass needs to override defaults. Returns: One of the following values: * `None` when tracing is handled by the runner. * `float` representing the final reward. * `List[ReadableSpan]` with OpenTelemetry spans. * `List[Span]` with Agent Lightning spans. * `List[SpanCoreFields]` with Agent Lightning spans. """ raise NotImplementedError("Agents must implement the `rollout` method.") async def rollout_async(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Execute a rollout asynchronously. Args: task: Task payload provided by the scheduler. resources: Mapping of named resources (for example LLMs or prompt templates). rollout: Rollout metadata. Avoid mutating this object directly unless a subclass needs to override defaults. Returns: Same possible return values as [`rollout`][agentlightning.LitAgent.rollout]. """ raise NotImplementedError("Agents must implement the `rollout_async` method for async operations.") def training_rollout(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Process a single training task synchronously. By default, this method delegates to [`rollout`][agentlightning.LitAgent.rollout]. """ return self.rollout(task, resources, rollout) def validation_rollout(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Process a single validation task synchronously. Override this method when validation should differ from training. The default implementation delegates to [`training_rollout`][agentlightning.LitAgent.training_rollout]. """ return self.rollout(task, resources, rollout) async def training_rollout_async(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Process a single training task asynchronously. By default, this method delegates to [`rollout_async`][agentlightning.LitAgent.rollout_async]. """ return await self.rollout_async(task, resources, rollout) async def validation_rollout_async(self, task: T, resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Process a single validation task asynchronously. Override this method when validation should differ from training. The default implementation delegates to [`training_rollout_async`][agentlightning.LitAgent.training_rollout_async]. """ return await self.rollout_async(task, resources, rollout) ================================================ FILE: agentlightning/llm_proxy.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import ast import asyncio import json import logging import os import re import tempfile import threading import time from contextlib import asynccontextmanager from datetime import datetime from typing import ( Any, AsyncGenerator, Awaitable, Callable, Dict, Iterable, List, Literal, Optional, Sequence, Tuple, Type, TypedDict, Union, cast, ) import litellm import opentelemetry.trace as trace_api import yaml from fastapi import Request, Response from fastapi.responses import StreamingResponse from litellm.integrations.custom_logger import CustomLogger from litellm.integrations.opentelemetry import OpenTelemetry, OpenTelemetryConfig from litellm.proxy.proxy_server import app, save_worker_config # pyright: ignore[reportUnknownVariableType] from litellm.types.utils import CallTypes from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult from starlette.middleware.base import BaseHTTPMiddleware from starlette.types import Scope from agentlightning.semconv import LightningResourceAttributes from agentlightning.types import LLM, ProxyLLM from agentlightning.utils.server_launcher import ( LaunchMode, PythonServerLauncher, PythonServerLauncherArgs, noop_context, ) from .store.base import LightningStore logger = logging.getLogger(__name__) __all__ = [ "LLMProxy", ] class ModelConfig(TypedDict): """LiteLLM model registration entry. This mirrors the items in LiteLLM's `model_list` section. Attributes: model_name: Logical model name exposed by the proxy. litellm_params: Parameters passed to LiteLLM for this model (e.g., backend model id, api_base, additional options). """ # Google style kept concise. model_name: str litellm_params: Dict[str, Any] def _get_pre_call_data(args: Any, kwargs: Any) -> Dict[str, Any]: """Extract LiteLLM request payload from hook args. The LiteLLM logger hooks receive `(*args, **kwargs)` whose third positional argument or `data=` kwarg contains the request payload. Args: args: Positional arguments from the hook. kwargs: Keyword arguments from the hook. Returns: The request payload dict. Raises: ValueError: If the payload cannot be located or is not a dict. """ if kwargs.get("data"): data = kwargs["data"] elif len(args) >= 3: data = args[2] else: raise ValueError(f"Unable to get request data from args or kwargs: {args}, {kwargs}") if not isinstance(data, dict): raise ValueError(f"Request data is not a dictionary: {data}") return cast(Dict[str, Any], data) def _reset_litellm_logging_worker() -> None: """Reset LiteLLM's global logging worker to the current event loop. LiteLLM keeps a module-level ``GLOBAL_LOGGING_WORKER`` singleton that owns an ``asyncio.Queue``. The queue is bound to the event loop where it was created. When the proxy is restarted, Uvicorn spins up a brand new event loop in a new thread. If the existing logging worker (and its queue) are reused, LiteLLM raises ``RuntimeError: is bound to a different event loop`` the next time it tries to log. Recreating the worker ensures that LiteLLM will lazily initialise a fresh queue on the new loop. """ # ``GLOBAL_LOGGING_WORKER`` is imported in a few LiteLLM modules at runtime. # Update any already-imported references so future calls use the fresh worker. try: import litellm.utils as litellm_utils from litellm.litellm_core_utils import logging_worker as litellm_logging_worker litellm_logging_worker.GLOBAL_LOGGING_WORKER = litellm_logging_worker.LoggingWorker() litellm_utils.GLOBAL_LOGGING_WORKER = litellm_logging_worker.GLOBAL_LOGGING_WORKER # type: ignore[reportAttributeAccessIssue] except Exception: # pragma: no cover - best-effort hygiene logger.warning("Unable to propagate LiteLLM logging worker reset.", exc_info=True) def _reset_litellm_logging_callback_manager() -> None: """Reset LiteLLM's global callback manager. To get rid of the warning message: "Cannot add callback - would exceed MAX_CALLBACKS limit of 30." when litellm is restarted multiple times in the same process. It does not respect existing input/output callbacks. """ try: litellm.logging_callback_manager._reset_all_callbacks() # pyright: ignore[reportPrivateUsage] except Exception: # pragma: no cover - best-effort hygiene logger.warning("Unable to reset LiteLLM logging callback manager.", exc_info=True) class AddReturnTokenIds(CustomLogger): """LiteLLM logger hook to request token ids from vLLM. This mutates the outgoing request payload to include `return_token_ids=True` for backends that support token id return (e.g., vLLM). See also: [vLLM PR #22587](https://github.com/vllm-project/vllm/pull/22587) """ async def async_pre_call_hook(self, *args: Any, **kwargs: Any) -> Optional[Union[Exception, str, Dict[str, Any]]]: """Async pre-call hook to adjust request payload. Args: args: Positional args from LiteLLM. kwargs: Keyword args from LiteLLM. Returns: Either an updated payload dict or an Exception to short-circuit. """ try: data = _get_pre_call_data(args, kwargs) except Exception as e: return e # Ensure token ids are requested from the backend when supported. return {**data, "return_token_ids": True} class AddLogprobs(CustomLogger): """LiteLLM logger hook to request logprobs from vLLM. This mutates the outgoing request payload to include `logprobs=1` for backends that support logprobs return (e.g., vLLM). """ async def async_pre_call_hook(self, *args: Any, **kwargs: Any) -> Optional[Union[Exception, str, Dict[str, Any]]]: """Async pre-call hook to adjust request payload.""" try: data = _get_pre_call_data(args, kwargs) except Exception as e: return e # Ensure logprobs are requested from the backend when supported. return {**data, "logprobs": 1} class LightningSpanExporter(SpanExporter): """Buffered OTEL span exporter with subtree flushing and training-store sink. Design: * Spans are buffered until a root span's entire subtree is available. * A private event loop on a daemon thread runs async flush logic. * Rollout/attempt/sequence metadata is reconstructed by merging headers from any span within a subtree. Thread-safety: * Buffer access is protected by a re-entrant lock. * Export is synchronous to the caller yet schedules an async flush on the internal loop, then waits for completion. """ def __init__(self, _store: Optional[LightningStore] = None): self._store: Optional[LightningStore] = _store # this is only for testing purposes self._buffer: List[ReadableSpan] = [] self._lock: Optional[threading.Lock] = None self._loop_lock_pid: Optional[int] = None # Single dedicated event loop running in a daemon thread. # This decouples OTEL SDK threads from our async store I/O. # Deferred creation until first use. self._loop: Optional[asyncio.AbstractEventLoop] = None self._loop_thread: Optional[threading.Thread] = None self._otlp_exporter = OTLPSpanExporter() def _ensure_loop(self) -> asyncio.AbstractEventLoop: """Lazily initialize the event loop and thread on first use. Returns: asyncio.AbstractEventLoop: The initialized event loop. """ self._clear_loop_and_lock() if self._loop is None: self._loop = asyncio.new_event_loop() self._loop_thread = threading.Thread(target=self._run_loop, name="LightningSpanExporterLoop", daemon=True) self._loop_thread.start() return self._loop def _ensure_lock(self) -> threading.Lock: """Lazily initialize the lock on first use. Returns: threading.Lock: The initialized lock. """ self._clear_loop_and_lock() if self._lock is None: self._lock = threading.Lock() return self._lock def _clear_loop_and_lock(self) -> None: """Clear the loop and lock. This happens if the exporter was used in a process then used in another process. This should only happen in CI. """ if os.getpid() != self._loop_lock_pid: logger.warning("Loop and lock are not owned by the current process. Clearing them.") self._loop = None self._loop_thread = None self._lock = None self._loop_lock_pid = os.getpid() elif self._loop_lock_pid is None: self._loop_lock_pid = os.getpid() def _run_loop(self) -> None: """Run the private asyncio loop forever on the exporter thread.""" assert self._loop is not None, "Loop should be initialized before thread starts" asyncio.set_event_loop(self._loop) self._loop.run_forever() def shutdown(self) -> None: """Shut down the exporter event loop. Safe to call at process exit. """ if self._loop is None: return try: def _stop(): assert self._loop is not None self._loop.stop() self._loop.call_soon_threadsafe(_stop) if self._loop_thread is not None: self._loop_thread.join(timeout=2.0) self._loop.close() except Exception: logger.exception("Error during exporter shutdown") def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: """Export spans via buffered subtree flush. Appends spans to the internal buffer, then triggers an async flush on the private event loop. Blocks until that flush completes. Args: spans: Sequence of spans to export. Returns: SpanExportResult: SUCCESS on flush success, else FAILURE. """ # Buffer append under lock to protect against concurrent exporters. with self._ensure_lock(): for span in spans: self._buffer.append(span) default_endpoint = self._otlp_exporter._endpoint # pyright: ignore[reportPrivateUsage] try: self._maybe_flush() except Exception as e: logger.exception("Export flush failed: %s", e) return SpanExportResult.FAILURE finally: self._otlp_exporter._endpoint = default_endpoint # pyright: ignore[reportPrivateUsage] return SpanExportResult.SUCCESS def _maybe_flush(self): """Flush ready subtrees from the buffer. Strategy: We consider a subtree "ready" if we can identify a root span. We then take that root and all its descendants out of the buffer and try to reconstruct rollout/attempt/sequence headers by merging any span's `metadata.requester_custom_headers` within the subtree. Required headers: `x-rollout-id` (str), `x-attempt-id` (str), `x-sequence-id` (str of int) Raises: None directly. Logs and skips malformed spans. """ # Iterate over current roots. Each iteration pops a whole subtree. for root_span_id in self._get_root_span_ids(): subtree_spans = self._pop_subtrees(root_span_id) if not subtree_spans: continue # Store is initialized lazily here in most cases. store = self._store or get_active_llm_proxy().get_store() if store is None: logger.warning("Store is not set in LLMProxy. Cannot log spans to store.") continue # If the store supports OTLP endpoint, use it. if store.capabilities.get("otlp_traces", False): otlp_traces_endpoint = store.otlp_traces_endpoint() self._otlp_exporter._endpoint = otlp_traces_endpoint # pyright: ignore[reportPrivateUsage] otlp_enabled = True else: otlp_enabled = False # Merge all custom headers found in the subtree. headers_merged: Dict[str, Any] = {} for span in subtree_spans: if span.attributes is None: continue headers_str = span.attributes.get("metadata.requester_custom_headers") if headers_str is None: continue if not isinstance(headers_str, str): logger.error( f"metadata.requester_custom_headers is not stored as a string: {headers_str}. Skipping the span." ) continue if not headers_str.strip(): logger.warning("metadata.requester_custom_headers is an empty string. Skipping the span.") continue try: # Use literal_eval to parse the stringified dict safely. headers = ast.literal_eval(headers_str) except Exception as e: logger.error( f"Failed to parse metadata.requester_custom_headers: {headers_str}, error: {e}. Skipping the span." ) continue if not isinstance(headers, dict): logger.error( f"metadata.requester_custom_headers is not parsed as a dict: {headers}. Skipping the span." ) continue headers_merged.update(cast(Dict[str, Any], headers)) if not headers_merged: logger.warning( f"No headers found in {len(subtree_spans)} subtree spans of root {root_span_id}. Cannot log to store." ) continue # Validate and normalize required header fields. rollout_id = headers_merged.get("x-rollout-id") attempt_id = headers_merged.get("x-attempt-id") sequence_id = headers_merged.get("x-sequence-id") if not rollout_id or not attempt_id or not sequence_id or not sequence_id.isdigit(): logger.warning( f"Missing or invalid rollout_id, attempt_id, or sequence_id in headers: {headers_merged}. Cannot log to store." ) continue if not isinstance(rollout_id, str) or not isinstance(attempt_id, str): logger.warning( f"rollout_id or attempt_id is not a string: {rollout_id}, {attempt_id}. Cannot log to store." ) continue sequence_id_decimal = int(sequence_id) # Persist each span in the subtree with the resolved identifiers. if otlp_enabled: # If store has OTLP support, directly use OTLP exporter and export in batch for span in subtree_spans: span._resource = span._resource.merge( # pyright: ignore[reportPrivateUsage] Resource.create( { LightningResourceAttributes.ROLLOUT_ID.value: rollout_id, LightningResourceAttributes.ATTEMPT_ID.value: attempt_id, LightningResourceAttributes.SPAN_SEQUENCE_ID.value: sequence_id_decimal, } ) ) export_result = self._otlp_exporter.export(subtree_spans) if export_result != SpanExportResult.SUCCESS: raise RuntimeError(f"Failed to export spans via OTLP exporter. Result: {export_result}") else: # The old way: store does not support OTLP endpoint for span in subtree_spans: loop = self._ensure_loop() add_otel_span_task = store.add_otel_span( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id_decimal, readable_span=span, ) fut = asyncio.run_coroutine_threadsafe(add_otel_span_task, loop) fut.result() # Bubble up any exceptions from the coroutine. def _get_root_span_ids(self) -> Iterable[int]: """Yield span_ids for root spans currently in the buffer. A root span is defined as one with `parent is None`. Yields: int: Span id for each root span found. """ for span in self._buffer: if span.parent is None: span_context = span.get_span_context() if span_context is not None: yield span_context.span_id def _get_subtrees(self, root_span_id: int) -> Iterable[int]: """Yield span_ids in the subtree rooted at `root_span_id`. Depth-first traversal over the current buffer. Args: root_span_id: The span id of the root. Yields: int: Span ids including the root and all descendants found. """ # Yield the root span id first. yield root_span_id for span in self._buffer: # Check whether the span's parent is the root_span_id. if span.parent is not None and span.parent.span_id == root_span_id: span_context = span.get_span_context() if span_context is not None: # Recursively get child spans. yield from self._get_subtrees(span_context.span_id) def _pop_subtrees(self, root_span_id: int) -> List[ReadableSpan]: """Remove and return the subtree for a particular root from the buffer. Args: root_span_id: Root span id identifying the subtree. Returns: list[ReadableSpan]: Spans that were part of the subtree. Order follows buffer order. """ subtree_span_ids = set(self._get_subtrees(root_span_id)) subtree_spans: List[ReadableSpan] = [] new_buffer: List[ReadableSpan] = [] for span in self._buffer: span_context = span.get_span_context() if span_context is not None and span_context.span_id in subtree_span_ids: subtree_spans.append(span) else: new_buffer.append(span) # Replace buffer with remaining spans to avoid re-processing. self._buffer = new_buffer return subtree_spans class LightningOpenTelemetry(OpenTelemetry): """OpenTelemetry integration that exports spans to the Lightning store. Responsibilities: * Ensures each request is annotated with a per-attempt sequence id so spans are ordered deterministically even with clock skew across nodes. * Uses [`LightningSpanExporter`][agentlightning.llm_proxy.LightningSpanExporter] to persist spans for analytics and training. """ def __init__(self): config = OpenTelemetryConfig(exporter=LightningSpanExporter()) # Check for tracer initialization if _check_tracer_provider(): logger.error("Tracer is already initialized. OpenTelemetry may not work as expected.") super().__init__(config=config) # pyright: ignore[reportUnknownMemberType] async def async_pre_call_deployment_hook( self, kwargs: Dict[str, Any], call_type: Optional[CallTypes] = None ) -> Optional[Dict[str, Any]]: """The root span is sometimes missing (e.g., when Anthropic endpoint is used). It is created in an auth module in LiteLLM. If it's missing, we create it here. """ if "metadata" not in kwargs or "litellm_parent_otel_span" not in kwargs["metadata"]: parent_otel_span = self.create_litellm_proxy_request_started_span( # type: ignore start_time=datetime.now(), headers=kwargs.get("headers", {}), ) updated_metadata = {**kwargs.get("metadata", {}), "litellm_parent_otel_span": parent_otel_span} return {**kwargs, "metadata": updated_metadata} else: return kwargs class RolloutAttemptMiddleware(BaseHTTPMiddleware): """ Rewrites /rollout/{rid}/attempt/{aid}/... -> /... and injects x-rollout-id, x-attempt-id, x-sequence-id headers. LLMProxy can update store later without rebuilding middleware. """ async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response: # Decode rollout and attempt from the URL prefix. Example: # /rollout/r123/attempt/a456/v1/chat/completions # becomes # /v1/chat/completions # while adding request-scoped headers for trace attribution. path = request.url.path match = re.match(r"^/rollout/([^/]+)/attempt/([^/]+)(/.*)?$", path) if match: rollout_id = match.group(1) attempt_id = match.group(2) new_path = match.group(3) if match.group(3) is not None else "/" # Rewrite the ASGI scope path so downstream sees a clean OpenAI path. request.scope["path"] = new_path request.scope["raw_path"] = new_path.encode() store = get_active_llm_proxy().get_store() if store is not None: # Allocate a monotonic sequence id per (rollout, attempt). sequence_id = await store.get_next_span_sequence_id(rollout_id, attempt_id) # Inject headers so downstream components and exporters can retrieve them. request.scope["headers"] = list(request.scope["headers"]) + [ (b"x-rollout-id", rollout_id.encode()), (b"x-attempt-id", attempt_id.encode()), (b"x-sequence-id", str(sequence_id).encode()), ] else: logger.warning("Store is not set. Skipping sequence id allocation and header injection.") response = await call_next(request) return response class MessageInspectionMiddleware(BaseHTTPMiddleware): """Middleware to inspect the request and response bodies. It's for debugging purposes. Add it via "message_inspection" middleware alias. """ async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response: ti = time.time() logger.info(f"Received request with scope: {request.scope}") logger.info(f"Received request with body: {await request.body()}") response = await call_next(request) elapsed = time.time() - ti logger.info(f"Response to request took {elapsed} seconds") logger.info(f"Received response with status code: {response.status_code}") logger.info(f"Received response with body: {response.body}") return response class StreamConversionMiddleware(BaseHTTPMiddleware): """Middleware to convert streaming responses to non-streaming responses. Useful for backend that only supports non-streaming responses. LiteLLM's OpenTelemetry is also buggy with streaming responses. The conversion will hopefully bypass the bug. """ async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response: # Only process POST requests to completion endpoints if request.method != "POST": return await call_next(request) # Check if it's a chat completions or messages endpoint endpoint_format: Literal["openai", "anthropic", "unknown"] = "unknown" if request.url.path.endswith("/chat/completions") or "/chat/completions?" in request.url.path: endpoint_format = "openai" elif request.url.path.endswith("/messages") or "/messages?" in request.url.path: endpoint_format = "anthropic" else: endpoint_format = "unknown" if endpoint_format == "unknown": # Directly bypass the middleware return await call_next(request) # Read the request body try: json_body = await request.json() except json.JSONDecodeError: logger.warning(f"Request body is not valid JSON: {request.body}") return await call_next(request) # Check if streaming is requested is_streaming = json_body.get("stream", False) # Simple case: no streaming requested, just return the response if not is_streaming: return await call_next(request) # Now the stream case return await self._handle_stream_case(request, json_body, endpoint_format, call_next) async def _handle_stream_case( self, request: Request, json_body: Dict[str, Any], endpoint_format: Literal["openai", "anthropic"], call_next: Callable[[Request], Awaitable[Response]], ) -> Response: # 1) Modify the request body to force stream=False modified_json = dict(json_body) modified_json["stream"] = False modified_body = json.dumps(modified_json).encode("utf-8") # 2) Build a new scope + receive that yields our modified body scope: Scope = dict(request.scope) # rewrite headers for accept/content-length new_headers: List[Tuple[bytes, bytes]] = [] saw_accept = False for k, v in scope["headers"]: kl = k.lower() if kl == b"accept": saw_accept = True new_headers.append((k, b"application/json")) elif kl == b"content-length": # replace with new length continue else: new_headers.append((k, v)) if not saw_accept: new_headers.append((b"accept", b"application/json")) new_headers.append((b"content-length", str(len(modified_body)).encode("ascii"))) scope["headers"] = new_headers # Directly modify the request body # Creating a new request won't work because request is cached in the base class request._body = modified_body # type: ignore response = await call_next(request) buffered: Optional[bytes] = None # 4) If OK, buffer the response body (it should be JSON because we forced stream=False) if 200 <= response.status_code < 300: try: if hasattr(response, "body_iterator"): # Buffer body safely body_chunks: List[bytes] = [] async for chunk in response.body_iterator: # type: ignore body_chunks.append(chunk) # type: ignore buffered = b"".join(body_chunks) else: buffered = response.body # type: ignore data = json.loads(buffered or b"{}") if endpoint_format == "anthropic": return StreamingResponse( self.anthropic_stream_generator(data), media_type="text/event-stream", headers={"Cache-Control": "no-cache", "Connection": "keep-alive", "X-Accel-Buffering": "no"}, ) else: # openai format return StreamingResponse( self.openai_stream_generator(data), media_type="text/event-stream", headers={"Cache-Control": "no-cache", "Connection": "keep-alive", "X-Accel-Buffering": "no"}, ) except Exception as e: # If anything goes wrong, fall back to non-streaming JSON logger.exception(f"Error converting to stream; returning non-stream response: {e}") # Rebuild the consumed response return Response( content=buffered if buffered is not None else b"", status_code=response.status_code, headers=dict(response.headers), media_type=response.media_type, background=response.background, ) else: return response async def anthropic_stream_generator(self, original_response: Dict[str, Any]): """Generate Anthropic SSE-formatted chunks from complete content blocks This is a dirty hack for Anthropic-style streaming from non-streaming response. The sse format is subject to change based on Anthropic's implementation. If so, try to use `MessageInspectionMiddleware` to inspect the update and fix accordingly. """ # Anthropic format - handle multiple content blocks (text + tool_use) content_blocks: List[Dict[str, Any]] = original_response.get("content", []) message_id = original_response.get("id", f"msg_{int(time.time() * 1000)}") model = original_response.get("model", "claude") # Send message_start event message_start: Dict[str, Any] = { "type": "message_start", "message": { "id": message_id, "type": "message", "role": "assistant", "content": [], "model": model, "stop_reason": None, "stop_sequence": None, "usage": original_response.get("usage", {"input_tokens": 0, "output_tokens": 0}), }, } yield f"event: message_start\ndata: {json.dumps(message_start)}\n\n" # Send ping to keep connection alive ping = {"type": "ping"} yield f"event: ping\ndata: {json.dumps(ping)}\n\n" # Process each content block for block_index, block in enumerate(content_blocks): block_type = block.get("type", "text") if block_type == "text": # Handle text block content = block.get("text", "") # Send content_block_start event content_block_start = { "type": "content_block_start", "index": block_index, "content_block": {"type": "text", "text": ""}, } yield f"event: content_block_start\ndata: {json.dumps(content_block_start)}\n\n" # Stream text content in chunks if content: words = content.split() chunk_size = 5 for i in range(0, len(words), chunk_size): chunk_words = words[i : i + chunk_size] text_chunk = " ".join(chunk_words) # Add space after chunk unless it's the last one if i + chunk_size < len(words): text_chunk += " " content_block_delta = { "type": "content_block_delta", "index": block_index, "delta": {"type": "text_delta", "text": text_chunk}, } yield f"event: content_block_delta\ndata: {json.dumps(content_block_delta)}\n\n" await asyncio.sleep(0.02) # Send content_block_stop event content_block_stop = {"type": "content_block_stop", "index": block_index} yield f"event: content_block_stop\ndata: {json.dumps(content_block_stop)}\n\n" elif block_type == "tool_use": # Handle tool_use block tool_name = block.get("name", "") tool_input = block.get("input", {}) tool_id = block.get("id", f"toolu_{int(time.time() * 1000)}") # Send content_block_start event for tool use content_block_start: Dict[str, Any] = { "type": "content_block_start", "index": block_index, "content_block": {"type": "tool_use", "id": tool_id, "name": tool_name, "input": {}}, } yield f"event: content_block_start\ndata: {json.dumps(content_block_start)}\n\n" # Stream tool input as JSON string chunks input_json = json.dumps(tool_input) chunk_size = 20 # characters per chunk for JSON for i in range(0, len(input_json), chunk_size): json_chunk = input_json[i : i + chunk_size] content_block_delta = { "type": "content_block_delta", "index": block_index, "delta": {"type": "input_json_delta", "partial_json": json_chunk}, } yield f"event: content_block_delta\ndata: {json.dumps(content_block_delta)}\n\n" await asyncio.sleep(0.01) # Send content_block_stop event content_block_stop = {"type": "content_block_stop", "index": block_index} yield f"event: content_block_stop\ndata: {json.dumps(content_block_stop)}\n\n" # Send message_delta event with stop reason message_delta = { "type": "message_delta", "delta": {"stop_reason": original_response.get("stop_reason", "end_turn"), "stop_sequence": None}, "usage": {"output_tokens": original_response.get("usage", {}).get("output_tokens", 0)}, } yield f"event: message_delta\ndata: {json.dumps(message_delta)}\n\n" # Send message_stop event message_stop = {"type": "message_stop"} yield f"event: message_stop\ndata: {json.dumps(message_stop)}\n\n" async def openai_stream_generator(self, response_json: Dict[str, Any]) -> AsyncGenerator[str, Any]: """ Convert a *complete* OpenAI chat.completions choice into a stream of OpenAI-compatible SSE chunks. This emits: - an initial delta with the role ("assistant"), - a sequence of deltas for message.content (split into small chunks), - deltas for any tool_calls (including id/name and chunked arguments), - a terminal chunk with finish_reason, - and finally the literal '[DONE]'. Notes: - We only handle a *single* choice (index 0 typically). - We purposefully don't attempt to stream logprobs. - Chunking strategy is simple and conservative to avoid splitting multi-byte characters: we slice on spaces where possible, then fall back to fixed-size substrings. """ choice = cast(Dict[str, Any], (response_json.get("choices") or [{}])[0]) model = response_json.get("model", "unknown") created: int = int(time.time()) index: int = choice.get("index", 0) message: Dict[str, Any] = choice.get("message", {}) or {} role: str = message.get("role", "assistant") content: str = message.get("content") or "" tool_calls: List[Any] = message.get("tool_calls") or [] finish_reason: Optional[str] = choice.get( "finish_reason" ) # e.g., "stop", "length", "tool_calls", "content_filter" def sse_chunk(obj: Dict[str, Any]) -> str: return f"data: {json.dumps(obj, ensure_ascii=False)}\n\n" # 1) initial chunk with the role yield sse_chunk( { "id": f"chatcmpl-{created}", "object": "chat.completion.chunk", "created": created, "model": model, "choices": [{"index": index, "delta": {"role": role}, "finish_reason": None}], } ) # 2) stream textual content as small deltas async def stream_content(text: str): if not text: return # prefer splitting on spaces in ~20–40 char pieces approx = 28 start = 0 n = len(text) while start < n: end = min(start + approx, n) if end < n: # try to break on a space going forward space = text.rfind(" ", start, end) if space > start: end = space + 1 delta_text = text[start:end] start = end if not delta_text: break yield sse_chunk( { "id": f"chatcmpl-{created}", "object": "chat.completion.chunk", "created": created, "model": model, "choices": [{"index": index, "delta": {"content": delta_text}, "finish_reason": None}], } ) # tiny pause helps some UIs animate smoothly; keep very small await asyncio.sleep(0.0) async for piece in stream_content(content): # type: ignore[misc] yield piece # pass through the produced chunks # 3) stream tool_calls if present (id/name first, then arguments piecemeal) for tc_index, tc in enumerate(tool_calls): tc_type = tc.get("type", "function") tc_id = tc.get("id") or f"call_{created}_{tc_index}" fn: Dict[str, Any] = (tc.get("function") or {}) if tc_type == "function" else {} fn_name: str = fn.get("name", "") fn_args: str = fn.get("arguments", "") or "" # (a) delta that announces the tool call id/type/name yield sse_chunk( { "id": f"chatcmpl-{created}", "object": "chat.completion.chunk", "created": created, "model": model, "choices": [ { "index": index, "delta": { "tool_calls": [ {"index": tc_index, "id": tc_id, "type": tc_type, "function": {"name": fn_name}} ] }, "finish_reason": None, } ], } ) # (b) stream arguments in small substrings arg_chunk_size = 40 for pos in range(0, len(fn_args), arg_chunk_size): partial = fn_args[pos : pos + arg_chunk_size] yield sse_chunk( { "id": f"chatcmpl-{created}", "object": "chat.completion.chunk", "created": created, "model": model, "choices": [ { "index": index, "delta": {"tool_calls": [{"index": tc_index, "function": {"arguments": partial}}]}, "finish_reason": None, } ], } ) await asyncio.sleep(0.0) # 4) terminal chunk with finish_reason (default to "stop" if missing) yield sse_chunk( { "id": f"chatcmpl-{created}", "object": "chat.completion.chunk", "created": created, "model": model, "choices": [ { "index": index, "delta": {}, "finish_reason": finish_reason or ("tool_calls" if tool_calls else "stop"), } ], } ) # 5) literal DONE sentinel yield "data: [DONE]\n\n" _MIDDLEWARE_REGISTRY: Dict[str, Type[BaseHTTPMiddleware]] = { "rollout_attempt": RolloutAttemptMiddleware, "stream_conversion": StreamConversionMiddleware, "message_inspection": MessageInspectionMiddleware, } _CALLBACK_REGISTRY = { "return_token_ids": AddReturnTokenIds, "logprobs": AddLogprobs, "opentelemetry": LightningOpenTelemetry, } class LLMProxy: """Host a LiteLLM OpenAI-compatible proxy bound to a LightningStore. The proxy: * Serves an OpenAI-compatible API via uvicorn. * Adds rollout/attempt routing and headers via middleware. * Registers OTEL export and token-id callbacks. * Writes a LiteLLM worker config file with `model_list` and settings. Lifecycle: * [`start()`][agentlightning.LLMProxy.start] writes config, starts uvicorn server in a thread, and waits until ready. * [`stop()`][agentlightning.LLMProxy.stop] tears down the server and removes the temp config file. * [`restart()`][agentlightning.LLMProxy.restart] convenience wrapper to stop then start. !!! note As the LLM Proxy sets up an OpenTelemetry tracer, it's recommended to run it in a different process from the main runner (i.e., tracer from agents). See `launch_mode` for how to change that. !!! warning By default (or when "stream_conversion" middleware is enabled), the LLM Proxy will convert OpenAI and Anthropic requests with `stream=True` to a non-streaming request before going through the LiteLLM proxy. This is because the OpenTelemetry tracer provided by LiteLLM is buggy with streaming responses. You can disable this by removing the "stream_conversion" middleware. In that case, you might lose some tracing information like token IDs. !!! danger Do not run LLM proxy in the same process as the main runner. It's easy to cause conflicts in the tracer provider with tracers like [`AgentOpsTracer`][agentlightning.AgentOpsTracer]. Args: port: TCP port to bind. Will bind to a random port if not provided. model_list: LiteLLM `model_list` entries. store: LightningStore used for span sequence and persistence. host: Publicly reachable host used in resource endpoints. See `host` of `launcher_args` for more details. litellm_config: Extra LiteLLM proxy config merged with `model_list`. num_retries: Default LiteLLM retry count injected into `litellm_settings`. num_workers: Number of workers to run in the server. Only applicable for "mp" launch mode. Ignored if launcher_args is provided. When `num_workers > 1`, the server will be run using [gunicorn](https://gunicorn.org/). launch_mode: Launch mode for the server. Defaults to "mp". Cannot be used together with launcher_args. Ignored if launcher_args is provided. It's recommended to use `launch_mode="mp"` to launch the proxy, which will launch the server in a separate process. `launch_mode="thread"` can also be used if used in caution. It will launch the server in a separate thread. `launch_mode="asyncio"` launches the server in the current thread as an asyncio task. It is NOT recommended because it often causes hanging requests. Only use it if you know what you are doing. launcher_args: Arguments for the server launcher. If this is provided, host, port, and launch_mode will be ignored. Cannot be used together with port, host, and launch_mode. middlewares: List of FastAPI middleware classes or strings to register. You can specify the class aliases or classes that have been imported. If not provided, the default middlewares (RolloutAttemptMiddleware and StreamConversionMiddleware) will be used. Available middleware aliases are: "rollout_attempt", "stream_conversion", "message_inspection". Middlewares are the **first layer** of request processing. They are applied to all requests before the LiteLLM proxy. callbacks: List of LiteLLM callback classes or strings to register. You can specify the class aliases or classes that have been imported. If not provided, the default callbacks (AddReturnTokenIds and LightningOpenTelemetry) will be used. Available callback aliases are: "return_token_ids", "opentelemetry", "logprobs". """ def __init__( self, port: int | None = None, model_list: List[ModelConfig] | None = None, store: Optional[LightningStore] = None, host: str | None = None, litellm_config: Dict[str, Any] | None = None, num_retries: int = 0, num_workers: int = 1, launch_mode: LaunchMode = "mp", launcher_args: PythonServerLauncherArgs | None = None, middlewares: Sequence[Union[Type[BaseHTTPMiddleware], str]] | None = None, callbacks: Sequence[Union[Type[CustomLogger], str]] | None = None, ): self.store = store if launcher_args is not None and ( port is not None or host is not None or launch_mode != "mp" or num_workers != 1 ): raise ValueError("port, host, launch_mode, and num_workers cannot be set when launcher_args is provided.") self.server_launcher_args = launcher_args or PythonServerLauncherArgs( port=port, host=host, launch_mode=launch_mode, n_workers=num_workers, # NOTE: This /health endpoint can be slow sometimes because it actually probes the backend LLM service. healthcheck_url="/health", startup_timeout=60.0, ) if self.server_launcher_args.healthcheck_url is None: logger.warning("healthcheck_url is not set. LLM Proxy will not be checked for healthiness after starting.") self.model_list = model_list or [] self.litellm_config = litellm_config or {} # Ensure num_retries is present inside the litellm_settings block. self.litellm_config.setdefault("litellm_settings", {}) self.litellm_config["litellm_settings"].setdefault("num_retries", num_retries) self.server_launcher = PythonServerLauncher(app, self.server_launcher_args, noop_context()) self._config_file = None self.middlewares: List[Type[BaseHTTPMiddleware]] = [] if middlewares is None: middlewares = ["rollout_attempt", "stream_conversion"] for middleware in middlewares: if isinstance(middleware, str): if middleware not in _MIDDLEWARE_REGISTRY: raise ValueError( f"Invalid middleware alias: {middleware}. Available aliases are: {list(_MIDDLEWARE_REGISTRY.keys())}" ) middleware = _MIDDLEWARE_REGISTRY[middleware] self.middlewares.append(middleware) else: self.middlewares.append(middleware) self.callbacks: List[Type[CustomLogger]] = [] if callbacks is None: callbacks = ["return_token_ids", "opentelemetry"] for callback in callbacks: if isinstance(callback, str): if callback not in _CALLBACK_REGISTRY: raise ValueError( f"Invalid callback alias: {callback}. Available aliases are: {list(_CALLBACK_REGISTRY.keys())}" ) callback = _CALLBACK_REGISTRY[callback] self.callbacks.append(callback) else: self.callbacks.append(callback) def get_store(self) -> Optional[LightningStore]: """Get the store used by the proxy. Returns: The store used by the proxy. """ return self.store def set_store(self, store: LightningStore) -> None: """Set the store for the proxy. Args: store: The store to use for the proxy. """ self.store = store def update_model_list(self, model_list: List[ModelConfig]) -> None: """Replace the in-memory model list. Args: model_list: New list of model entries. """ self.model_list = model_list logger.info(f"Updating LLMProxy model list to: {model_list}") # Do nothing if the server is not running. def initialize(self): """Initialize global middleware and LiteLLM callbacks. Installs: * A FastAPI middleware that rewrites /rollout/{rid}/attempt/{aid}/... paths, injects rollout/attempt/sequence headers, and forwards downstream. * LiteLLM callbacks for token ids and OpenTelemetry export. The middleware can only be installed once because once the FastAPI app has started, the middleware cannot be changed any more. This function does not start any server. It only wires global hooks. """ if self.store is None: raise ValueError("Store is not set. Please set the store before initializing the LLMProxy.") if _global_llm_proxy is not None: logger.warning("A global LLMProxy is already set. Overwriting it with the new instance.") # Patch for LiteLLM v1.80.6+: https://github.com/BerriAI/litellm/issues/17243 os.environ["USE_OTEL_LITELLM_REQUEST_SPAN"] = "true" # Set the global LLMProxy reference for middleware/exporter access. set_active_llm_proxy(self) # Install middleware if it's not already installed. installation_status: Dict[Any, bool] = {} for mw in app.user_middleware: installation_status[mw.cls] = True for mw in self.middlewares: if mw not in installation_status: logger.info(f"Adding middleware {mw} to the FastAPI app.") app.add_middleware(mw) else: logger.info(f"Middleware {mw} is already installed. Will not install a new one.") if not initialize_llm_callbacks(self.callbacks): # If it's not the first time to initialize the callbacks, also # reset LiteLLM's logging worker so its asyncio.Queue binds to the new loop. _reset_litellm_logging_worker() @asynccontextmanager async def _serve_context(self) -> AsyncGenerator[None, None]: """Context manager to serve the proxy server. See [`start`][agentlightning.LLMProxy.start] and [`stop`][agentlightning.LLMProxy.stop] for more details. """ if not self.store: raise ValueError("Store is not set. Please set the store before starting the LLMProxy.") # Initialize global middleware and callbacks. self.initialize() # Persist a temp worker config for LiteLLM and point the proxy at it. self._config_file = tempfile.NamedTemporaryFile(suffix=".yaml", delete=False).name with open(self._config_file, "w") as fp: yaml.safe_dump( { "model_list": self.model_list, **self.litellm_config, }, fp, ) save_worker_config(config=self._config_file) # NOTE: When running the _serve_context in current process, you might encounter the following problems: # Problem 1: in litellm worker, is bound to a different event loop # Problem 2: Proxy has conflicted opentelemetry setup with the main process. # Ready logger.info("LLMProxy preparation is done. Will start the server.") yield # Clean up logger.info("LLMProxy server is cleaning up.") # Remove worker config to avoid stale references. if self._config_file and os.path.exists(self._config_file): os.unlink(self._config_file) logger.info("LLMProxy server finishes.") async def start(self): """Start the proxy server thread and initialize global wiring. Side effects: * Sets the module-level global store for middleware/exporter access. * Calls `initialize()` once to register middleware and callbacks. * Writes a temporary YAML config consumed by LiteLLM worker. * Launches uvicorn in a daemon thread and waits for readiness. """ # Refresh the serve context self.server_launcher.serve_context = self._serve_context() if self.store is None: raise ValueError("Store is not set. Please set the store before starting the LLMProxy.") store_capabilities = self.store.capabilities if self.server_launcher.args.launch_mode == "mp" and not store_capabilities.get("zero_copy", False): raise RuntimeError( "The store does not support zero-copy. Please use another store, or use asyncio or thread mode to launch the server." ) elif self.server_launcher.args.launch_mode == "thread" and not store_capabilities.get("thread_safe", False): raise RuntimeError( "The store is not thread-safe. Please use another store, or use asyncio mode to launch the server." ) elif self.server_launcher.args.launch_mode == "asyncio" and not store_capabilities.get("async_safe", False): raise RuntimeError("The store is not async-safe. Please use another store.") logger.info( f"Starting LLMProxy server in {self.server_launcher.args.launch_mode} mode with store capabilities: {store_capabilities}" ) await self.server_launcher.start() async def stop(self): """Stop the proxy server and clean up temporary artifacts. This is a best-effort graceful shutdown with a bounded join timeout. """ if not self.is_running(): logger.warning("LLMProxy is not running. Nothing to stop.") return await self.server_launcher.stop() async def restart(self, *, _port: int | None = None) -> None: """Restart the proxy if running, else start it. Convenience wrapper calling `stop()` followed by `start()`. """ logger.info("Restarting LLMProxy server...") if self.is_running(): await self.stop() if _port is not None: self.server_launcher_args.port = _port await self.start() def is_running(self) -> bool: """Return whether the uvicorn server is active. Returns: bool: True if server was started and did not signal exit. """ return self.server_launcher.is_running() def as_resource( self, rollout_id: str | None = None, attempt_id: str | None = None, model: str | None = None, sampling_parameters: Dict[str, Any] | None = None, ) -> LLM: """Create an `LLM` resource pointing at this proxy with rollout context. The returned endpoint is: `http://{host}:{port}/rollout/{rollout_id}/attempt/{attempt_id}` Args: rollout_id: Rollout identifier used for span attribution. If None, will instantiate a ProxyLLM resource. attempt_id: Attempt identifier used for span attribution. If None, will instantiate a ProxyLLM resource. model: Logical model name to use. If omitted and exactly one model is configured or all models have the same name, that model is used. sampling_parameters: Optional default sampling parameters. Returns: LLM: Configured resource ready for OpenAI-compatible calls. Raises: ValueError: If `model` is omitted and zero or multiple models are configured. """ if model is None: if len(self.model_list) == 1: model = self.model_list[0]["model_name"] elif len(self.model_list) == 0: raise ValueError("No models found in model_list. Please specify the model.") else: first_model_name = self.model_list[0]["model_name"] if all(model_config["model_name"] == first_model_name for model_config in self.model_list): model = first_model_name else: raise ValueError( f"Multiple models found in model_list: {self.model_list}. Please specify the model." ) if rollout_id is None and attempt_id is None: return ProxyLLM( endpoint=self.server_launcher.access_endpoint, model=model, sampling_parameters=dict(sampling_parameters or {}), ) elif rollout_id is not None and attempt_id is not None: return LLM( endpoint=f"{self.server_launcher.access_endpoint}/rollout/{rollout_id}/attempt/{attempt_id}", model=model, sampling_parameters=dict(sampling_parameters or {}), ) else: raise ValueError("Either rollout_id and attempt_id must be provided, or neither.") _global_llm_proxy: Optional[LLMProxy] = None _callbacks_before_litellm_start: Optional[List[Any]] = None def get_active_llm_proxy() -> LLMProxy: """Get the current global LLMProxy instance. Returns: Optional[LLMProxy]: The current LLMProxy if set, else None. """ if _global_llm_proxy is None: raise ValueError("Global LLMProxy is not set. Please call llm_proxy.start() first.") return _global_llm_proxy def set_active_llm_proxy(proxy: LLMProxy) -> None: """Set the current global LLMProxy instance. Args: proxy: The LLMProxy instance to set as global. """ global _global_llm_proxy _global_llm_proxy = proxy def initialize_llm_callbacks(callback_classes: List[Type[CustomLogger]]) -> bool: """Restore `litellm.callbacks` to a state that is just initialized by agent-lightning. When litellm is restarted multiple times in the same process, more and more callbacks will be appended to `litellm.callbacks`, which may exceed the MAX_CALLBACKS limit. This function remembers the initial state of `litellm.callbacks` and always restore to that state. Args: callback_classes: List of callback classes to register. Returns: Whether the callbacks are initialized for the first time. """ global _callbacks_before_litellm_start if _callbacks_before_litellm_start is None: litellm.callbacks.extend([cls() for cls in callback_classes]) # type: ignore _callbacks_before_litellm_start = [*litellm.callbacks] # type: ignore return True else: # Put whatever is missing in the new callback classes to the existing callbacks. for cls in callback_classes: if not any(isinstance(cb, cls) for cb in _callbacks_before_litellm_start): logger.info(f"Adding missing callback {cls} to the existing callbacks.") _callbacks_before_litellm_start.append(cls()) _reset_litellm_logging_callback_manager() if LightningOpenTelemetry in callback_classes: # Check if tracer provider is malformed due to global tracer clear in tests. if not _check_tracer_provider(): logger.warning( "Global tracer provider might have been cleared outside. Re-initializing OpenTelemetry callback." ) _callbacks_before_litellm_start = [ cb for cb in _callbacks_before_litellm_start if not isinstance(cb, LightningOpenTelemetry) ] + [LightningOpenTelemetry()] else: logger.debug("Global tracer provider is valid. Reusing existing OpenTelemetry callback.") # Otherwise, we just skip the check for opentelemetry and use the existing callback. litellm.callbacks.clear() # type: ignore litellm.callbacks.extend(_callbacks_before_litellm_start) # type: ignore return False def _check_tracer_provider() -> bool: """Check if the global tracer provider is properly initialized. We don't guarantee the tracer provider is our tracer provider. Returns: bool: True if the tracer provider is valid, else False. """ if ( hasattr(trace_api, "_TRACER_PROVIDER") and trace_api._TRACER_PROVIDER is not None # pyright: ignore[reportPrivateUsage] ): return True return False ================================================ FILE: agentlightning/logging.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging import os import platform import sys import warnings from logging.config import dictConfig from typing import Any, Dict, Optional from rich.console import Console __all__ = ["setup", "configure_logger", "setup_module"] def configure_logger(level: int = logging.INFO, name: str = "agentlightning") -> logging.Logger: """Create or reset a namespaced logger with a consistent console format. This helper clears any previously attached handlers before binding a single `StreamHandler` that writes to standard output. The resulting logger does not propagate to the root logger, preventing duplicate log emission when applications compose multiple logging configurations. !!! danger This function is deprecated in favor of [`setup_logging`][agentlightning.setup_logging]. Args: level: Logging level applied both to the logger and the installed handler. Defaults to `logging.INFO`. name: Dotted path for the logger instance. Defaults to `"agentlightning"`. Returns: Configured logger instance ready for immediate use. Examples: ```python from agentlightning import configure_logger logger = configure_logger(level=logging.INFO) logger.info("agent-lightning is ready!") ``` """ warnings.warn("This function is deprecated in favor of `setup_logging`.", DeprecationWarning, stacklevel=2) return setup_module(level=level, name=name, console=True, color=True, propagate=False) DEFAULT_FORMAT = "%(asctime)s [%(levelname)s] (Process-%(process)d %(name)s) %(message)s" DATE_FORMAT = "%H:%M:%S" def _to_level_value(lvl: int | str) -> int: if isinstance(lvl, int): return lvl val = getattr(logging, str(lvl).upper(), None) if val is None: raise ValueError(f"Invalid log level: {lvl}") return val def _ensure_file_handler( logger: logging.Logger, filename: str, *, level: int, formatter: Optional[logging.Formatter], ) -> None: """Attach a FileHandler to `logger` for `filename` if it doesn't already exist.""" abspath = os.path.abspath(filename) # Avoid duplicates for h in logger.handlers: if isinstance(h, logging.FileHandler) and getattr(h, "baseFilename", None) == abspath: return # Ensure directory exists dirname = os.path.dirname(abspath) if dirname: os.makedirs(dirname, exist_ok=True) fh = logging.FileHandler(abspath, encoding="utf-8") fh.setLevel(level) if formatter is not None: fh.setFormatter(formatter) else: fh.setFormatter(logging.Formatter(DEFAULT_FORMAT, DATE_FORMAT)) logger.addHandler(fh) def setup( level: int | str = "INFO", *, console: bool = True, color: bool | Dict[str, Any] = True, propagate: bool = False, disable_existing_loggers: bool = False, capture_warnings: bool = False, submodule_levels: Optional[dict[str, int | str]] = None, extra_handlers: Optional[list[logging.Handler]] = None, formatter: Optional[logging.Formatter] = None, apply_to: Optional[list[str]] = None, files: Optional[str | dict[str, str]] = None, ) -> None: """Configures logging for the `agentlightning` logger hierarchy. This function provides a one-stop setup utility for configuring the `agentlightning` root logger and optionally its submodules or external loggers. It supports console logging, colored rich output, per-submodule log levels, and optional handler/formatter injection. The setup is intentionally isolated: it does not modify the global root logger or loggers belonging to other libraries unless explicitly directed via `apply_to`. Args: level: Logging level for the base `agentlightning` logger. Accepts either an integer (e.g., `logging.DEBUG`) or a string level name (e.g., `"INFO"`). Defaults to `"INFO"`. console: Whether to attach a console handler to the logger. Defaults to `True`. color: Enables rich-formatted output using `RichHandler` when `True` or a configuration dict. If `False`, a plain text formatter is used instead. Defaults to `True`. propagate: Whether `agentlightning` logs should propagate to ancestor loggers. Defaults to `False`. disable_existing_loggers: Passed to `logging.config.dictConfig`. If `True`, disables all existing configured loggers before applying this configuration. Defaults to `False`. capture_warnings: If `True`, redirects Python `warnings` emitted via the `warnings` module into the logging system. Defaults to `False`. submodule_levels: Mapping of submodule logger names to logging levels. If a specified submodule level is more verbose than the base level, a warning is emitted. extra_handlers: A list of user-provided handlers to attach to the `agentlightning` logger. Handlers are added idempotently; duplicates are not reattached. formatter: A formatter to apply to any handler under `agentlightning` that does not already have one assigned. Useful for customizing output without overwriting formatters on custom handlers. apply_to: A list of additional logger names to configure identically to `agentlightning` base logger. Their handlers are replaced with copies of the base handlers, and propagation is disabled to avoid duplicate log emission. files: If a string, attach a FileHandler to the base `agentlightning` logger. If a dict, for each `(logger_name, filename)` pair, attach a FileHandler directly to that logger. Each file handler should use the logger's effective level at creation. Notes: * On Windows, this function forces UTF-8 mode in the console to prevent issues with rich output or special characters. * Submodule loggers can generate records below the handler's emission threshold. Whether such records appear depends on both the logger's level and the handler's level. * `apply_to` loggers inherit the same handlers but do not propagate upward, yielding isolated, consistent behavior. Examples: Basic setup: >>> setup() Enabling debug mode with no color: >>> setup(level="DEBUG", color=False) Overriding specific submodule levels: >>> setup(submodule_levels={"agentlightning.io": "DEBUG"}) Attaching an additional file handler: >>> fh = logging.FileHandler("app.log") >>> setup(extra_handlers=[fh]) """ # Ensure UTF-8 encoding on Windows consoles # Note: This change does not fully represent support for execution under the windows system. # It only fixes console printing issues caused by special characters. # TODO: More comprehensive Windows support may be needed in the future. if platform.system() == "Windows": os.environ["PYTHONUTF8"] = "1" base_logger = setup_module( level, name="agentlightning", console=console, color=color, propagate=propagate, disable_existing_loggers=disable_existing_loggers, ) base_level_value = base_logger.level # Apply user-provided formatter (only to handlers without one, # so we don't clobber custom extra_handlers) if formatter is not None: for h in base_logger.handlers: if h.formatter is None: h.setFormatter(formatter) # Attach user-provided handler(s) if any, idempotently if extra_handlers: for h in extra_handlers: if h not in base_logger.handlers: base_logger.addHandler(h) # Per-submodule levels if submodule_levels: for name, lvl in submodule_levels.items(): sub_level = _to_level_value(lvl) # Emit a warning if submodule level is lower (more verbose) than the global/base level if sub_level < base_level_value: base_logger.warning( "Submodule logger '%s' level %s (%s) is more verbose than base " "logger level %s (%s). Records below the base level may still be " "filtered out by handlers depending on their own levels.", name, lvl, sub_level, logging.getLevelName(base_level_value), base_level_value, ) # The logger will *create* records down to the logger's level, but a handler # with a higher level will still drop anything below its own threshold. # Effective emission is gated by both: record.level >= logger.level AND handler.level. logging.getLogger(name).setLevel(lvl) # Attach file handlers if requested if files is not None: if isinstance(files, str): # Single file for the entire `agentlightning` hierarchy. _ensure_file_handler( logger=base_logger, filename=files, level=base_level_value, formatter=formatter, ) else: # Per-logger files for logger_name, filename in files.items(): lg = logging.getLogger(logger_name) # Use the logger's *effective* level at creation time effective_level = lg.getEffectiveLevel() _ensure_file_handler( logger=lg, filename=filename, level=effective_level, formatter=formatter, ) # Optionally apply the same handler setup to other loggers outside this module if apply_to: for name in apply_to: lg = logging.getLogger(name) # This removes any existing handlers so we don't duplicate output # and ensures these loggers share exactly the same handlers as base_logger. lg.handlers.clear() for h in base_logger.handlers: lg.addHandler(h) lg.setLevel(base_logger.level) # We've attached handlers directly to these loggers; if propagate # stayed True, records would bubble up to ancestor loggers and could be # emitted twice (here and on the parent/root). Setting False isolates them. lg.propagate = False # Optionally capture warnings if capture_warnings: logging.captureWarnings(True) def setup_module( level: int | str = "INFO", *, name: str = "agentlightning", console: bool = True, color: bool | Dict[str, Any] = True, propagate: bool = False, disable_existing_loggers: bool = False, ) -> logging.Logger: """Initializes and returns the base logger for `agentlightning`. This function constructs and applies a `dictConfig` configuration for the logger hierarchy rooted at `name`. It supports either rich console formatting (via `RichHandler`) or plain text formatting, based on the `color` argument. Unlike [`setup_logging`][agentlightning.setup_logging], this function configures only a single logger namespace and does not attach extra handlers or submodule levels. It is primarily used internally by [`setup_logging`][agentlightning.setup_logging] but is also suitable for direct integration in custom logging workflows. """ root_cfg: Dict[str, Any] = { "version": 1, "disable_existing_loggers": disable_existing_loggers, "loggers": { name: { "handlers": [], "level": level, "propagate": propagate, } }, "handlers": {}, "formatters": {}, } # Choose formatter / handler definition if color is not False and console: # Console must be true to display colored outputs if isinstance(color, dict): rich_handler_config = color else: rich_handler_config: Dict[str, Any] = { "rich_tracebacks": False, "markup": False, "show_time": True, "show_path": True, } if not _has_width(): # e.g., in a CI environment. rich_handler_config["console"] = Console(width=200) root_cfg["handlers"]["console"] = { "class": "rich.logging.RichHandler", "level": level, **rich_handler_config, } # RichHandler manages its own style; keep formatter None else: fmt_name = "plain" root_cfg["formatters"][fmt_name] = { "format": DEFAULT_FORMAT, "datefmt": DATE_FORMAT, } if console: root_cfg["handlers"]["console"] = { "class": "logging.StreamHandler", "level": level, "formatter": fmt_name, } # Attach selected handlers to agentlightning handler_names = list(root_cfg["handlers"].keys()) root_cfg["loggers"][name]["handlers"] = handler_names # Apply dictConfig (this resets the logger handlers) dictConfig(root_cfg) return logging.getLogger(name) def _has_width() -> bool: """Automatically determine whether the terminal has a width.""" return sys.stdout.isatty() ================================================ FILE: agentlightning/reward.py ================================================ # Copyright (c) Microsoft. All rights reserved. import warnings from .emitter.reward import * # noqa: F401,F403 warnings.warn("agentlightning.reward is deprecated. Please use agentlightning.emitter instead.") ================================================ FILE: agentlightning/runner/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .agent import LitAgentRunner from .base import Runner from .legacy import LegacyAgentRunner __all__ = [ "Runner", "LegacyAgentRunner", "LitAgentRunner", ] ================================================ FILE: agentlightning/runner/agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Agent runner implementation for executing agent rollouts. This module provides the concrete implementation of the runner interface, handling the execution of agent rollouts with support for tracing, hooks, and distributed worker coordination. """ from __future__ import annotations import asyncio import logging import random import threading import time from contextlib import suppress from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, List, Literal, Optional, Sequence, TypeVar, cast, ) from opentelemetry.sdk.trace import ReadableSpan from agentlightning.litagent import LitAgent from agentlightning.reward import emit_reward, find_final_reward from agentlightning.store.base import LightningStore from agentlightning.tracer.base import Tracer from agentlightning.tracer.otel import OtelTracer from agentlightning.types import ( AttemptedRollout, Hook, NamedResources, Rollout, RolloutMode, RolloutRawResult, Span, SpanCoreFields, ) from agentlightning.utils.system_snapshot import system_snapshot if TYPE_CHECKING: from agentlightning.execution.events import ExecutionEvent from .base import Runner T_task = TypeVar("T_task") logger = logging.getLogger(__name__) class LitAgentRunner(Runner[T_task]): """Execute [`LitAgent`][agentlightning.LitAgent] tasks with tracing support. This runner manages the complete lifecycle of agent rollout execution, including task polling, resource management, tracing, and hooks. It supports both continuous iteration over tasks from the store and single-step execution. Attributes: worker_id: Identifier for the active worker process, if any. """ def __init__( self, tracer: Tracer, max_rollouts: Optional[int] = None, poll_interval: float = 5.0, heartbeat_interval: float = 10.0, interval_jitter: float = 0.5, heartbeat_launch_mode: Literal["asyncio", "thread"] = "thread", heartbeat_include_gpu: bool = False, ) -> None: """Initialize the agent runner. Args: tracer: [`Tracer`][agentlightning.Tracer] used for rollout spans. max_rollouts: Optional cap on iterations processed by [`iter`][agentlightning.LitAgentRunner.iter]. poll_interval: Seconds to wait between store polls when no work is available. heartbeat_interval: Seconds to wait between sending heartbeats to the store. interval_jitter: Jitter factor for the poll interval. The actual interval will be between poll_interval - interval_jitter and poll_interval + interval_jitter. This is to avoid the overload caused by the synchronization of the runners. heartbeat_launch_mode: Launch mode for the heartbeat loop. Can be "asyncio" or "thread". "thread" is the default and recommended mode as it prevents blocking the event loop under load. Use "asyncio" for simpler deployments with low worker counts. heartbeat_include_gpu: Whether to include GPU stats in heartbeat snapshots. Querying GPU stats can be slow under load, so this is disabled by default. """ super().__init__() self._tracer = tracer self._max_rollouts = max_rollouts self._poll_interval = poll_interval self._heartbeat_interval = heartbeat_interval self._interval_jitter = interval_jitter self._heartbeat_launch_mode = heartbeat_launch_mode self._heartbeat_include_gpu = heartbeat_include_gpu self._random_state = random.Random() # Set later self._agent: Optional[LitAgent[T_task]] = None self._hooks: Sequence[Hook] = [] self._store: Optional[LightningStore] = None self.worker_id: Optional[int] = None def init(self, agent: LitAgent[T_task], *, hooks: Optional[Sequence[Hook]] = None, **kwargs: Any) -> None: """Initialize the runner with the agent. This sets up the agent-runner relationship, registers hooks, and initializes the tracer. Args: agent: [`LitAgent`][agentlightning.LitAgent] instance executed by the runner. hooks: Optional sequence of [`Hook`][agentlightning.Hook] callbacks invoked around tracing and rollout boundaries. **kwargs: Additional initialization arguments (currently unused). """ self._agent = agent self._agent.set_runner(self) self._hooks = [*hooks] if hooks is not None else [] self._tracer.init() def init_worker(self, worker_id: int, store: LightningStore, **kwargs: Any) -> None: """Initialize the runner for each worker with worker_id and store. This method is called once per worker in a distributed setup to provide the worker with its ID and store connection. Args: worker_id: Unique identifier for this worker process. store: [`LightningStore`][agentlightning.LightningStore] used for task coordination and persistence. **kwargs: Additional worker-specific initialization arguments (currently unused). """ self._store = store self.worker_id = worker_id self._tracer.init_worker(worker_id, store) def teardown(self, *args: Any, **kwargs: Any) -> None: """Teardown the runner and clean up all resources. This method resets all internal state including the agent, store, hooks, and worker ID, and calls the tracer's teardown method. Args: *args: Additional teardown arguments (currently unused). **kwargs: Additional teardown keyword arguments (currently unused). """ self._agent = None self._store = None self.worker_id = None self._hooks = [] self._tracer.teardown() def teardown_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: """Teardown the runner for a specific worker. This method cleans up worker-specific resources and resets the worker ID. Args: worker_id: Unique identifier of the worker being torn down. *args: Additional teardown arguments (currently unused). **kwargs: Additional teardown keyword arguments (currently unused). """ self.worker_id = None self._tracer.teardown_worker(worker_id) @property def tracer(self) -> Tracer: """Get the tracer instance. Returns: The Tracer instance used by this runner. """ return self._tracer def get_agent(self) -> LitAgent[T_task]: """Get the agent instance. Returns: The LitAgent instance managed by this runner. Raises: ValueError: If the agent has not been initialized via [`init`][agentlightning.LitAgentRunner.init]. """ if self._agent is None: raise ValueError("Agent not initialized. Call init() first.") return self._agent def get_store(self) -> LightningStore: """Get the store instance. Returns: The LightningStore instance for this worker. Raises: ValueError: If the store has not been initialized via [`init_worker`][agentlightning.LitAgentRunner.init_worker]. """ if self._store is None: raise ValueError("Store not initialized. Call init_worker() first.") return self._store def get_worker_id(self) -> str: """Get the formatted worker ID string. Returns: A formatted string like "Worker-0" if initialized, or "Worker-Unknown" if the worker ID has not been set. """ return f"Worker-{self.worker_id}" if self.worker_id is not None else "Worker-Unknown" def _log_prefix(self, rollout_id: Optional[str] = None) -> str: """Generate a standardized log prefix for the current worker. This creates a consistent prefix format for log messages to identify which worker and rollout the message is associated with. Args: rollout_id: Optional rollout ID to include in the prefix. Returns: A formatted log prefix string like "[Worker 0 | Rollout xyz]", "[Worker 0]", "[Rollout xyz]", or "[Default Worker]". """ if self.worker_id is not None: if rollout_id: return f"[Worker {self.worker_id} | Rollout {rollout_id}]" else: return f"[Worker {self.worker_id}]" if rollout_id: return f"[Rollout {rollout_id}]" return "[Default Worker]" async def _trigger_hooks( self, hook_type: Literal["on_trace_start", "on_trace_end", "on_rollout_start", "on_rollout_end"], *args: Any, **kwargs: Any, ) -> None: """Trigger all registered hooks of a specific type. This method calls the specified hook method on all registered hooks, catching and logging any exceptions that occur during hook execution to prevent them from disrupting the main execution flow. Args: hook_type: The type of hook to trigger. Valid values are: "on_trace_start", "on_trace_end", "on_rollout_start", "on_rollout_end". *args: Positional arguments to pass to the hook methods. **kwargs: Keyword arguments to pass to the hook methods. """ for hook in self._hooks: try: await getattr(hook, hook_type)(*args, **kwargs) except Exception: logger.exception(f"{self._log_prefix()} Exception during {hook_type} hook {hook}.") async def _post_process_rollout_result( self, rollout: AttemptedRollout, raw_result: RolloutRawResult ) -> List[ReadableSpan] | List[Span]: """Standardizes the agent's return value and report what's needed to report to the store. Args: rollout: The rollout object for the current task. raw_result: The output from the agent's rollout method. Returns: The spans that are assumed to be added to the store. This only serves as an estimation for logging purposes. For precise tracking, use the store directly. """ store = self.get_store() trace_spans: list[Span] = [] result_recognized: bool = False # Case 0: result is None if raw_result is None: trace_spans = self._tracer.get_last_trace() result_recognized = True # Case 1: result is a float (final reward) if isinstance(raw_result, (bool, int, float)): if isinstance(raw_result, (bool, int)): logger.warning( f"{self._log_prefix(rollout.rollout_id)} Reward is not a number, got: {type(raw_result)}. " "Auto converting to float." ) raw_result = float(raw_result) # Preserve the existing spans before another span is emitted trace_spans = list(self._tracer.get_last_trace()) # This will NOT emit another span to the tracer reward_span_core_fields = emit_reward(raw_result, propagate=False) # We add it to the store manually sequence_id = await store.get_next_span_sequence_id(rollout.rollout_id, rollout.attempt.attempt_id) reward_span = Span.from_core_fields( reward_span_core_fields, rollout_id=rollout.rollout_id, attempt_id=rollout.attempt.attempt_id, sequence_id=sequence_id, ) await store.add_span(reward_span) result_recognized = True # Case 2-4: result is a list if isinstance(raw_result, list): # Case 2: result is a list of ReadableSpan (OpenTelemetry spans) if len(raw_result) > 0 and all(isinstance(t, ReadableSpan) for t in raw_result): if isinstance(self._tracer, OtelTracer): logger.warning( f"{self._log_prefix(rollout.rollout_id)} Tracer is already an OpenTelemetry tracer. " "The traces should have already been added to the store. " "Returning the traces from the rollout will result in duplicate spans." ) for span in raw_result: added_span = await store.add_otel_span( rollout.rollout_id, rollout.attempt.attempt_id, cast(ReadableSpan, span) ) if added_span is not None: trace_spans.append(added_span) else: logger.error( f"{self._log_prefix(rollout.rollout_id)} Failed to add OpenTelemetry span to the store: {span}" ) result_recognized = True # Case 3: result is a list of Span (agentlightning spans) elif len(raw_result) > 0 and all(isinstance(t, Span) for t in raw_result): # Add the spans directly to the store for span in raw_result: await store.add_span(cast(Span, span)) trace_spans = [cast(Span, span) for span in raw_result] result_recognized = True # Case 4: result is a list of SpanCoreFields (agentlightning spans) elif len(raw_result) > 0 and all(isinstance(t, SpanCoreFields) for t in raw_result): # Add the spans directly to the store too, but needs to get sequence id first sequence_ids = await store.get_many_span_sequence_ids( [(rollout.rollout_id, rollout.attempt.attempt_id) for _ in range(len(raw_result))] ) trace_spans = [ Span.from_core_fields( cast(SpanCoreFields, span_core_fields), rollout_id=rollout.rollout_id, attempt_id=rollout.attempt.attempt_id, sequence_id=sequence_id, ) for span_core_fields, sequence_id in zip(raw_result, sequence_ids, strict=True) ] await store.add_many_spans(trace_spans) result_recognized = True # Left over cases for list elif len(raw_result) == 0: logger.warning( f"{self._log_prefix(rollout.rollout_id)} The rollout returns an empty list. " "Please check your rollout implementation." ) trace_spans = [] result_recognized = True else: types = [type(t).__name__ for t in raw_result][:10] raise ValueError( f"Invalid raw result type. It's expected to be a list of ReadableSpan or Span, " f"but got: {', '.join(types)}..." ) if not result_recognized: raise TypeError( f"Invalid raw result type. It's expected to be none, float, or a list of ReadableSpan or Span, " f"but got: {type(raw_result).__name__}..." ) return trace_spans async def _emit_heartbeat(self, store: LightningStore) -> None: """Send a heartbeat tick to the store. Args: store: The lightning store to update. """ logger.debug(f"{self._log_prefix()} Preparing to emit heartbeat.") worker_id = self.get_worker_id() try: snapshot = await asyncio.wait_for( asyncio.to_thread(system_snapshot, self._heartbeat_include_gpu), timeout=self._heartbeat_interval, ) logger.debug(f"{self._log_prefix()} Heartbeat snapshot acquired.") except asyncio.TimeoutError: logger.warning( "%s Heartbeat snapshot acquisition timed out after %.1fs, skipping.", self._log_prefix(), self._heartbeat_interval, ) return except asyncio.CancelledError: # bypass the exception raise except Exception: logger.exception("%s Unable to acquire heartbeat snapshot.", self._log_prefix()) return try: await asyncio.wait_for(store.update_worker(worker_id, snapshot), timeout=self._heartbeat_interval) logger.debug(f"{self._log_prefix()} Heartbeat updated successfully.") except asyncio.CancelledError: # bypass the exception raise except asyncio.TimeoutError: logger.warning( "%s update worker heartbeat timed out after %.1fs, skipping.", self._log_prefix(), self._heartbeat_interval, ) except Exception: logger.exception("%s Unable to update worker heartbeat.", self._log_prefix()) def _start_heartbeat_loop(self, store: LightningStore) -> Optional[Callable[[], Awaitable[None]]]: """Start a background heartbeat loop and return an async stopper.""" if self._heartbeat_interval <= 0: return None if self.worker_id is None: logger.warning("%s Cannot start heartbeat loop without worker_id.", self._log_prefix()) return None if self._heartbeat_launch_mode == "asyncio": return self._start_heartbeat_asyncio_loop(store) if self._heartbeat_launch_mode == "thread": return self._start_heartbeat_thread_loop(store) raise ValueError(f"Unsupported heartbeat launch mode: {self._heartbeat_launch_mode}") def _start_heartbeat_asyncio_loop(self, store: LightningStore) -> Optional[Callable[[], Awaitable[None]]]: """Start a background heartbeat loop using asyncio. Args: store: The lightning store to update. Returns: An async stopper function that can be used to stop the heartbeat loop. """ stop_event = asyncio.Event() async def heartbeat_loop() -> None: while not stop_event.is_set(): try: # Run _emit_heartbeat in thread pool to avoid blocking the event loop. # Timeout at the interval - if it takes longer, the data is stale anyway. await self._emit_heartbeat(store) except Exception: logger.exception("%s Heartbeat failed.", self._log_prefix()) with suppress(asyncio.TimeoutError): interval = self._heartbeat_interval + self._random_state.uniform( -self._interval_jitter, self._interval_jitter ) interval = max(interval, 0.01) await asyncio.wait_for(stop_event.wait(), timeout=interval) task = asyncio.create_task(heartbeat_loop(), name=f"{self.get_worker_id()}-heartbeat") async def stop() -> None: stop_event.set() with suppress(asyncio.CancelledError): await task return stop def _start_heartbeat_thread_loop(self, store: LightningStore) -> Optional[Callable[[], Awaitable[None]]]: """Start a background heartbeat loop using threading. It uses two threads: one to produce the snapshot and one to consume it, to avoid either of them blocking the event loop. Args: store: The lightning store to update. Returns: An async stopper function that can be used to stop the heartbeat loop. """ stop_evt = threading.Event() lock = threading.Lock() latest_snapshot = None latest_ts = 0.0 # time.monotonic() when snapshot was captured # Consider snapshot stale after ~1 interval plus jitter slack. stale_after = self._heartbeat_interval + self._interval_jitter + 1.0 worker_id = self.get_worker_id() def producer() -> None: nonlocal latest_snapshot, latest_ts while not stop_evt.is_set(): try: logger.debug(f"{self._log_prefix()} Heartbeat producer: acquiring snapshot.") snap = system_snapshot(self._heartbeat_include_gpu) # sync logger.debug(f"{self._log_prefix()} Heartbeat producer: snapshot acquired.") ts = time.monotonic() with lock: latest_snapshot = snap latest_ts = ts except Exception: logger.warning("%s Heartbeat producer: system_snapshot failed.", self._log_prefix(), exc_info=True) interval = self._heartbeat_interval + self._random_state.uniform( -self._interval_jitter, self._interval_jitter ) stop_evt.wait(max(interval, 0.01)) def consumer() -> None: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) last_warned_ts = None # Track which snapshot we've already warned about try: while not stop_evt.is_set(): with lock: snap = latest_snapshot ts = latest_ts wait_interval = max( self._heartbeat_interval + self._random_state.uniform(-self._interval_jitter, self._interval_jitter), 0.01, ) if snap is None: # probably just started logger.debug("%s Heartbeat consumer: no snapshot yet; skipping update.", self._log_prefix()) stop_evt.wait(wait_interval) continue age = time.monotonic() - ts if age > stale_after: # Only warn once per stale snapshot (check if we haven't warned about this timestamp yet) if last_warned_ts != ts: logger.warning( "%s Heartbeat consumer: snapshot stale (age=%.2fs > %.2fs); skipping update.", self._log_prefix(), age, stale_after, ) last_warned_ts = ts stop_evt.wait(wait_interval) continue try: logger.debug(f"{self._log_prefix()} Heartbeat consumer: updating worker.") loop.run_until_complete( asyncio.wait_for( store.update_worker(worker_id, snap), timeout=self._heartbeat_interval, ) ) logger.debug(f"{self._log_prefix()} Heartbeat consumer: worker updated.") except asyncio.TimeoutError: logger.warning( "%s Heartbeat consumer: update timed out after %.1fs.", self._log_prefix(), self._heartbeat_interval, ) except Exception: logger.warning("%s Heartbeat consumer: update failed.", self._log_prefix(), exc_info=True) stop_evt.wait(wait_interval) finally: with suppress(Exception): loop.stop() with suppress(Exception): loop.close() t_prod = threading.Thread(target=producer, name=f"{worker_id}-heartbeat-producer", daemon=True) t_cons = threading.Thread(target=consumer, name=f"{worker_id}-heartbeat-consumer", daemon=True) t_prod.start() t_cons.start() async def stop() -> None: stop_evt.set() await asyncio.to_thread(t_prod.join) await asyncio.to_thread(t_cons.join) return stop async def _sleep_until_next_poll(self, event: Optional[ExecutionEvent] = None) -> None: """Sleep until the next poll interval, with optional event-based interruption. If an event is provided, the method will check it periodically (every 0.1s) and return early if the event is set. Args: event: Optional [`ExecutionEvent`][agentlightning.ExecutionEvent] object that can be used to interrupt the sleep. If set during the sleep period, the method returns immediately. """ interval = self._poll_interval + self._random_state.uniform(-self._interval_jitter, self._interval_jitter) interval = max(interval, 0.01) if event is None: await asyncio.sleep(interval) return current_time = time.time() next_time = current_time + interval while time.time() < next_time: await asyncio.sleep(0.1) if event.is_set(): return async def _step_impl(self, next_rollout: AttemptedRollout, raise_on_exception: bool = False) -> str: """Execute a single rollout implementation. This is the core method that handles the execution of a single rollout, including resource fetching, hook triggering, agent invocation, tracing, and result processing. Args: next_rollout: The rollout to execute, containing input data, mode, and resources information. raise_on_exception: If True, exceptions during rollout execution will be re-raised. If False, exceptions are logged but not propagated. """ store = self.get_store() agent = self.get_agent() rollout_id = next_rollout.rollout_id resources_id = next_rollout.resources_id resources_update = None if resources_id: resources_update = await store.get_resources_by_id(resources_id) else: logger.debug(f"{self._log_prefix(rollout_id)} No 'resources_id'. Fetching latest resources.") resources_update = await store.get_latest_resources() if not resources_update: if raise_on_exception: raise RuntimeError(f"{self._log_prefix(rollout_id)} Failed to fetch resources") else: logger.error(f"{self._log_prefix(rollout_id)} Failed to fetch resources. Skipping.") return rollout_id logger.debug(f"{self._log_prefix(rollout_id)} Resources fetched (id={resources_update.resources_id}).") trace_spans: List[ReadableSpan] | List[Span] = [] has_exception: bool = False try: await self._trigger_hooks(hook_type="on_rollout_start", agent=agent, runner=self, rollout=next_rollout) start_time = time.time() logger.debug(f"{self._log_prefix(rollout_id)} Prepared for trace context.") async with self._tracer.trace_context( name=rollout_id, rollout_id=rollout_id, attempt_id=next_rollout.attempt.attempt_id ): logger.debug(f"{self._log_prefix(rollout_id)} Entered trace context.") await self._trigger_hooks( hook_type="on_trace_start", agent=agent, runner=self, tracer=self._tracer, rollout=next_rollout ) # NOTE: This is the most costly step in the whole function # If the rollout method becomes unresponsive or timeouts, there is nothing we can do within the runner. # We might need some mechanisms in execution strategy to restart the runner. But that's a future work. if agent.is_async(): rollout_method = ( agent.training_rollout_async if next_rollout.mode == "train" else agent.validation_rollout_async ) logger.debug(f"{self._log_prefix(rollout_id)} Starting async rollout method.") result = await rollout_method( next_rollout.input, resources=resources_update.resources, rollout=next_rollout ) logger.debug(f"{self._log_prefix(rollout_id)} Async rollout method completed.") else: rollout_method = ( agent.training_rollout if next_rollout.mode == "train" else agent.validation_rollout ) logger.debug(f"{self._log_prefix(rollout_id)} Starting sync rollout method.") result = rollout_method( next_rollout.input, resources=resources_update.resources, rollout=next_rollout ) logger.debug(f"{self._log_prefix(rollout_id)} Sync rollout method completed.") await self._trigger_hooks( hook_type="on_trace_end", agent=agent, runner=self, tracer=self._tracer, rollout=next_rollout ) logger.debug(f"{self._log_prefix(rollout_id)} Trace context exited.") # Possible exceptions in post_process will be caught in the overall exception handler trace_spans = await self._post_process_rollout_result(next_rollout, result) last_reward = find_final_reward(trace_spans) end_time = time.time() logger.info( f"{self._log_prefix(rollout_id)} Completed in " f"{end_time - start_time:.2f}s. Collected {len(trace_spans)} span(s). " f"Final reward: {last_reward}" ) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during rollout.") has_exception = True if raise_on_exception: raise finally: try: await self._trigger_hooks( hook_type="on_rollout_end", agent=agent, runner=self, rollout=next_rollout, spans=trace_spans ) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during on_rollout_end hook.") try: if has_exception: # possibly timed out and cancelled? await store.update_attempt(rollout_id, next_rollout.attempt.attempt_id, status="failed") else: await store.update_attempt(rollout_id, next_rollout.attempt.attempt_id, status="succeeded") except Exception: logger.exception( f"{self._log_prefix(rollout_id)} Exception during update_attempt. Giving up the update." ) return rollout_id async def iter(self, *, event: Optional[ExecutionEvent] = None) -> None: """Run the runner, continuously iterating over tasks in the store. This method polls the store for new rollouts and executes them until: - The event is set (if provided) - The max_rollouts limit is reached (if configured) - No more tasks are available All exceptions during rollout execution are caught and logged but not propagated, allowing the runner to continue processing subsequent tasks. Args: event: Optional ExecutionEvent object to signal the runner to stop. The runner will check this event periodically and stop gracefully when set. """ num_tasks_processed = 0 logger.info(f"{self._log_prefix()} Started async rollouts (max: {self._max_rollouts or 'unlimited'}).") store = self.get_store() stop_heartbeat = self._start_heartbeat_loop(store) try: while not (event is not None and event.is_set()) and ( self._max_rollouts is None or num_tasks_processed < self._max_rollouts ): # Retrieve the next rollout next_rollout: Optional[Rollout] = None while not (event is not None and event.is_set()): logger.debug(f"{self._log_prefix()} Try to poll for next rollout.") next_rollout = await store.dequeue_rollout(worker_id=self.get_worker_id()) logger.debug(f"{self._log_prefix()} Next rollout retrieved: {next_rollout}") if next_rollout is None: logger.debug( f"{self._log_prefix()} No rollout to poll. Waiting for {self._poll_interval} seconds." ) await self._sleep_until_next_poll(event) else: break if next_rollout is None: return # Execute the step await self._step_impl(next_rollout) num_tasks_processed += 1 if num_tasks_processed % 10 == 0 or num_tasks_processed == 1: logger.info( f"{self._log_prefix()} Progress: {num_tasks_processed}/{self._max_rollouts or 'unlimited'}" ) finally: if stop_heartbeat is not None: await stop_heartbeat() logger.info(f"{self._log_prefix()} Finished async rollouts. Processed {num_tasks_processed} tasks.") async def step( self, input: T_task, *, resources: Optional[NamedResources] = None, mode: Optional[RolloutMode] = None, event: Optional[ExecutionEvent] = None, ) -> Rollout: """Execute a single task directly, bypassing the task queue. This method creates a new rollout for the given input and executes it immediately. Unlike [`iter()`][agentlightning.LitAgentRunner.iter], exceptions are propagated to the caller. Args: input: The task input to be processed by the agent. resources: Optional named resources to be used for this specific task. If provided, a new resources entry will be created in the store. If not provided, the latest resources from the store will be used. mode: Optional rollout mode ("train" or "validation"). If not provided, the agent's default mode will be used. event: Optional ExecutionEvent object to signal interruption (currently unused but included for interface consistency). Returns: The completed rollout. Raises: Exception: Any exception that occurs during rollout execution will be re-raised to the caller. """ store = self.get_store() if resources is not None: resources_update = await store.add_resources(resources) resources_id = resources_update.resources_id else: resources_id = None attempted_rollout = await self.get_store().start_rollout( input=input, mode=mode, resources_id=resources_id, worker_id=self.get_worker_id() ) rollout_id = await self._step_impl(attempted_rollout, raise_on_exception=True) completed_rollout = await store.get_rollout_by_id(rollout_id) if completed_rollout is None: raise RuntimeError(f"{self._log_prefix()} Failed to fetch completed rollout by id after step: {rollout_id}") return completed_rollout ================================================ FILE: agentlightning/runner/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Abstract runner interface for executing agent tasks.""" from __future__ import annotations import logging from contextlib import contextmanager from typing import TYPE_CHECKING, Any, Generic, Iterator, Optional, Sequence, TypeVar from agentlightning.execution.events import ExecutionEvent from agentlightning.litagent import LitAgent from agentlightning.store.base import LightningStore from agentlightning.types import Hook, NamedResources, ParallelWorkerBase, Rollout, RolloutMode if TYPE_CHECKING: from agentlightning.execution.events import ExecutionEvent T_task = TypeVar("T_task") logger = logging.getLogger(__name__) class Runner(ParallelWorkerBase, Generic[T_task]): """Abstract base class for long-running agent executors. Runner implementations coordinate [`LitAgent`][agentlightning.LitAgent] instances, acquire work from a [`LightningStore`][agentlightning.LightningStore], and emit [`Rollout`][agentlightning.Rollout] objects. Subclasses decide how to schedule work (polling, streaming, etc.) while this base class provides a minimal lifecycle contract. """ def init(self, agent: LitAgent[T_task], **kwargs: Any) -> None: """Prepare the runner to execute tasks for `agent`. This method is called only once during the setup for all workers, not for each worker. Args: agent: Agent instance providing task-specific logic. **kwargs: Optional runner-specific configuration. Raises: NotImplementedError: Subclasses must supply the initialization routine. """ raise NotImplementedError() def init_worker(self, worker_id: int, store: LightningStore, **kwargs: Any) -> None: """Configure worker-local state before processing tasks. This method is called for **each** worker during the setup. Args: worker_id: Unique identifier for this worker process or thread. store: Shared [`LightningStore`][agentlightning.LightningStore] backing task coordination. **kwargs: Optional worker-specific configuration. Raises: NotImplementedError: Subclasses must prepare per-worker resources. """ raise NotImplementedError() def run(self, *args: Any, **kwargs: Any) -> None: """Deprecated synchronous entry point. Use [`iter()`][agentlightning.Runner.iter] or [`step()`][agentlightning.Runner.step] instead. Raises: RuntimeError: Always raised to direct callers to [iter()][agentlightning.Runner.iter] or [step()][agentlightning.Runner.step]. """ raise RuntimeError("The behavior of run() of Runner is undefined. Use iter() or step() instead.") def teardown(self, *args: Any, **kwargs: Any) -> None: """Release resources acquired during [`init()`][agentlightning.Runner.init]. Raises: NotImplementedError: Subclasses must implement the shutdown routine. """ raise NotImplementedError() def teardown_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: """Release per-worker resources allocated by [`init_worker()`][agentlightning.Runner.init_worker]. Args: worker_id: Identifier of the worker being torn down. Raises: NotImplementedError: Subclasses must implement the shutdown routine. """ raise NotImplementedError() @contextmanager def run_context( self, *, agent: LitAgent[T_task], store: LightningStore, hooks: Optional[Sequence[Hook]] = None, worker_id: Optional[int] = None, ) -> Iterator[Runner[T_task]]: """Initialize and tear down a runner within a simple context manager. The helper is primarily intended for debugging runner implementations outside of a full [`Trainer`][agentlightning.Trainer] stack. Args: agent: Agent executed by this runner. store: Backing [`LightningStore`][agentlightning.LightningStore]. If you don't have one, you can easily create one with [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore]. hooks: Optional sequence of hooks recognised by the runner. Not all runners support hooks. worker_id: Override the worker identifier used during setup. Defaults to `0`. """ _initialized: bool = False _worker_initialized: bool = False try: self.init(agent=agent, hooks=hooks) _initialized = True self.init_worker(worker_id=0, store=store) _worker_initialized = True yield self finally: try: if _worker_initialized: self.teardown_worker(worker_id=worker_id if worker_id is not None else 0) except Exception: logger.error("Error during runner worker teardown", exc_info=True) try: if _initialized: self.teardown() except Exception: logger.error("Error during runner teardown", exc_info=True) async def iter(self, *, event: Optional[ExecutionEvent] = None) -> None: """Run the runner, continuously iterating over tasks in the store. This method runs in a loop, polling the store for new tasks and executing them until interrupted by the event or when no more tasks are available. Args: event: Cooperative stop signal. When set, the runner should complete the current unit of work and exit the loop. Raises: NotImplementedError: Subclasses provide the iteration behavior. """ raise NotImplementedError() async def step( self, input: T_task, *, resources: Optional[NamedResources] = None, mode: Optional[RolloutMode] = None, event: Optional[ExecutionEvent] = None, ) -> Rollout: """Execute a single task with the given input. This method provides fine-grained control for executing individual tasks directly, bypassing the store's task queue. Args: input: Task payload consumed by the agent. resources: Optional named resources scoped to this invocation. mode: Optional rollout mode such as `"train"` or `"eval"`. event: Cooperative stop signal for long-running tasks. Returns: Completed rollout produced by the agent. Raises: NotImplementedError: Subclasses provide the execution behavior. """ raise NotImplementedError() ================================================ FILE: agentlightning/runner/legacy.py ================================================ # Copyright (c) Microsoft. All rights reserved. import json import logging import time from typing import Any, Dict, List, Optional, cast from opentelemetry.sdk.trace import ReadableSpan from agentlightning.adapter import TracerTraceToTriplet from agentlightning.client import AgentLightningClient from agentlightning.litagent import LitAgent from agentlightning.litagent.litagent import is_v0_1_rollout_api from agentlightning.tracer.base import Tracer from agentlightning.types import RolloutLegacy, RolloutRawResultLegacy, Span, SpanLike, Triplet from .base import Runner logger = logging.getLogger(__name__) __all__ = [ "LegacyAgentRunner", ] class LegacyAgentRunner(Runner[Any]): """Manages the agent's execution loop and integrates with AgentOps. This class orchestrates the interaction between the agent (`LitAgent`) and the server (`AgentLightningClient`). It handles polling for tasks, executing the agent's logic, and reporting results back to the server. If enabled, it will also automatically trace each rollout using AgentOps. Attributes: agent: The `LitAgent` instance containing the agent's logic. client: The `AgentLightningClient` for server communication. tracer: The tracer instance for this runner/worker. worker_id: An optional identifier for the worker process. max_tasks: The maximum number of tasks to process before stopping. """ def __init__( self, agent: LitAgent[Any], client: AgentLightningClient, tracer: Tracer, triplet_exporter: TracerTraceToTriplet, worker_id: Optional[int] = None, max_tasks: Optional[int] = None, ): super().__init__() self.agent = agent self.client = client self.tracer = tracer self.triplet_exporter = triplet_exporter # Worker-specific attributes self.worker_id = worker_id self.max_tasks = max_tasks # These methods are overridden by Runner, getting them back to old behavior. def init(self, *args: Any, **kwargs: Any) -> None: pass def init_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: self.worker_id = worker_id def teardown_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: pass def teardown(self, *args: Any, **kwargs: Any) -> None: pass def _log_prefix(self, rollout_id: Optional[str] = None) -> str: """Generates a standardized log prefix for the current worker.""" if self.worker_id is not None: if rollout_id: return f"[Worker {self.worker_id} | RolloutLegacy {rollout_id}]" else: return f"[Worker {self.worker_id}]" if rollout_id: return f"[RolloutLegacy {rollout_id}]" return "[Default Worker]" def _to_rollout_object( self, result: RolloutRawResultLegacy, rollout_id: str, ) -> RolloutLegacy: """Standardizes the agent's return value into a RolloutLegacy object. Args: result: The output from the agent's rollout method. rollout_id: The unique identifier for the current task. Returns: A standardized `RolloutLegacy` object for reporting to the server. """ trace: Any = None final_reward: Optional[float] = None triplets: Optional[List[Triplet]] = None trace_spans: Optional[List[SpanLike]] = None # Handle different types of results from the agent # Case 1: result is a float (final reward) if isinstance(result, float): final_reward = result # Case 2: result is a list of Triplets if isinstance(result, list) and all(isinstance(t, Triplet) for t in result): triplets = result # type: ignore # Case 3.1: result is a list of ReadableSpan (OpenTelemetry spans) if isinstance(result, list) and all(isinstance(t, (ReadableSpan)) for t in result): trace_spans = result # type: ignore trace = [json.loads(readable_span.to_json()) for readable_span in trace_spans] # type: ignore # Case 3.2: result is a list of Span (Agent-lightning spans) if isinstance(result, list) and all(isinstance(t, Span) for t in result): trace_spans = result # type: ignore trace = [span.model_dump() for span in trace_spans] # type: ignore # Case 4: result is a list of dict (trace JSON) if isinstance(result, list) and all(isinstance(t, dict) for t in result): trace = result # Case 5: result is a RolloutLegacy object if isinstance(result, RolloutLegacy): final_reward = result.final_reward triplets = result.triplets trace = result.trace # If the agent has tracing enabled, use the tracer's last trace if not already set if self.tracer and (trace is None or trace_spans is None): trace_spans = self.tracer.get_last_trace() # type: ignore if trace_spans: trace = [cast(Span, span).model_dump() for span in trace_spans] # Always extract triplets from the trace using TracerTraceToTriplet if trace_spans: triplets = self.triplet_exporter(trace_spans) # type: ignore # If the agent has triplets, use the last one for final reward if not set if triplets and triplets[-1].reward is not None and final_reward is None: final_reward = triplets[-1].reward # Create the RolloutLegacy object with standardized fields result_dict: Dict[str, Any] = { "rollout_id": rollout_id, } if final_reward is not None: result_dict["final_reward"] = final_reward if triplets is not None: result_dict["triplets"] = triplets if trace is not None: result_dict["trace"] = trace if isinstance(result, RolloutLegacy): return result.model_copy(update=result_dict) return RolloutLegacy(**result_dict) def run(self) -> bool: # type: ignore """Poll the task and rollout once synchronously.""" self.agent.set_runner(self) # Ensure the agent has a reference to this runner task = self.client.poll_next_task() if task is None: logger.info(f"{self._log_prefix()} Poll returned no task. Exiting.") return False rollout_id = task.rollout_id resources_id = task.resources_id resources_update = None if resources_id: resources_update = self.client.get_resources_by_id(resources_id) else: logger.debug(f"{self._log_prefix(rollout_id)} No 'resources_id'. Fetching latest resources.") resources_update = self.client.get_latest_resources() if not resources_update: logger.error(f"{self._log_prefix(rollout_id)} Failed to fetch resources. Skipping.") return False rollout_obj = RolloutLegacy(rollout_id=task.rollout_id, task=task) # Default empty rollout try: try: self.agent.on_rollout_start(task, self, self.tracer) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during on_rollout_start hook.") with self.tracer._trace_context_sync(name=f"rollout_{rollout_id}"): # pyright: ignore[reportPrivateUsage] start_time = time.time() rollout_method = self.agent.training_rollout if task.mode == "train" else self.agent.validation_rollout # Pass the task input, not the whole task object if is_v0_1_rollout_api(rollout_method): result = cast( RolloutRawResultLegacy, rollout_method( task.input, rollout_id=rollout_obj.rollout_id, resources=resources_update.resources # type: ignore ), ) # type: ignore else: result = rollout_method(task.input, resources=resources_update.resources, rollout=rollout_obj) # type: ignore rollout_obj = self._to_rollout_object(result, task.rollout_id) # type: ignore end_time = time.time() logger.info( f"{self._log_prefix(rollout_id)} Completed in " f"{end_time - start_time:.2f}s. Triplet length: " f"{len(rollout_obj.triplets) if rollout_obj.triplets is not None else 'N/A'}. " f"Reward: {rollout_obj.final_reward}" ) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during rollout.") finally: try: self.agent.on_rollout_end(task, rollout_obj, self, self.tracer) # type: ignore except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during on_rollout_end hook.") self.client.post_rollout(rollout_obj) return True def iter(self) -> int: # type: ignore """Executes the synchronous polling and rollout loop.""" num_tasks_processed = 0 logger.info(f"{self._log_prefix()} Started sync rollouts (max: {self.max_tasks or 'unlimited'}).") while self.max_tasks is None or num_tasks_processed < self.max_tasks: if self.run(): num_tasks_processed += 1 if num_tasks_processed % 10 == 0 or num_tasks_processed == 1: logger.info(f"{self._log_prefix()} Progress: {num_tasks_processed}/{self.max_tasks or 'unlimited'}") logger.info(f"{self._log_prefix()} Finished sync rollouts. Processed {num_tasks_processed} tasks.") return num_tasks_processed async def run_async(self) -> bool: """Poll the task and rollout once.""" self.agent.set_runner(self) # Ensure the agent has a reference to this runner task = await self.client.poll_next_task_async() if task is None: logger.info(f"{self._log_prefix()} Poll returned no task. Exiting.") return False rollout_id = task.rollout_id resources_id = task.resources_id resources_update = None if resources_id: resources_update = await self.client.get_resources_by_id_async(resources_id) else: logger.debug(f"{self._log_prefix(rollout_id)} No 'resources_id'. Fetching latest resources.") resources_update = await self.client.get_latest_resources_async() if not resources_update: logger.error(f"{self._log_prefix(rollout_id)} Failed to fetch resources. Skipping.") return False rollout_obj = RolloutLegacy(rollout_id=task.rollout_id, task=task) # Default empty rollout try: try: self.agent.on_rollout_start(task, self, self.tracer) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during on_rollout_start hook.") async with self.tracer.trace_context(name=f"rollout_{rollout_id}"): start_time = time.time() rollout_method = ( self.agent.training_rollout_async if task.mode == "train" else self.agent.validation_rollout_async ) # Pass the task input, not the whole task object if is_v0_1_rollout_api(rollout_method): result = cast( RolloutRawResultLegacy, await rollout_method( task.input, rollout_id=rollout_obj.rollout_id, resources=resources_update.resources # type: ignore ), ) # type: ignore else: result = await rollout_method(task.input, resources=resources_update.resources, rollout=rollout_obj) # type: ignore rollout_obj = self._to_rollout_object(result, task.rollout_id) # type: ignore end_time = time.time() logger.info( f"{self._log_prefix(rollout_id)} Completed in " f"{end_time - start_time:.2f}s. Triplet length: " f"{len(rollout_obj.triplets) if rollout_obj.triplets is not None else 'N/A'}. " f"Reward: {rollout_obj.final_reward}" ) except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during rollout.") finally: try: self.agent.on_rollout_end(task, rollout_obj, self, self.tracer) # type: ignore except Exception: logger.exception(f"{self._log_prefix(rollout_id)} Exception during on_rollout_end hook.") await self.client.post_rollout_async(rollout_obj) return True async def iter_async(self) -> int: """Executes the asynchronous polling and rollout loop.""" num_tasks_processed = 0 logger.info(f"{self._log_prefix()} Started async rollouts (max: {self.max_tasks or 'unlimited'}).") while self.max_tasks is None or num_tasks_processed < self.max_tasks: if await self.run_async(): num_tasks_processed += 1 if num_tasks_processed % 10 == 0 or num_tasks_processed == 1: logger.info(f"{self._log_prefix()} Progress: {num_tasks_processed}/{self.max_tasks or 'unlimited'}") logger.info(f"{self._log_prefix()} Finished async rollouts. Processed {num_tasks_processed} tasks.") return num_tasks_processed ================================================ FILE: agentlightning/semconv.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Semantic conventions for Agent-lightning spans. Conventions in this file are added on demand. We generally DO NOT add new semantic conventions unless it's absolutely needed for certain algorithms or scenarios. """ from enum import Enum from pydantic import BaseModel AGL_ANNOTATION = "agentlightning.annotation" """Agent-lightning's standard span name for annotations. Annotations are minimal span units for rewards, tags, and metadatas. They are used to "annotate" a specific event or a part of rollout. """ AGL_MESSAGE = "agentlightning.message" """Agent-lightning's standard span name for messages and logs.""" AGL_OBJECT = "agentlightning.object" """Agent-lightning's standard span name for customized objects.""" AGL_EXCEPTION = "agentlightning.exception" """Agent-lightning's standard span name for exceptions. Used by the exception emitter to record exception details. """ AGL_OPERATION = "agentlightning.operation" """Agent-lightning's standard span name for functions. Wrap function or code-blocks as operations. """ AGL_REWARD = "agentlightning.reward" """Agent-lightning's standard span name for reward operations.""" AGL_VIRTUAL = "agentlightning.virtual" """Agent-lightning's standard span name for virtual operations. Mostly used in adapter when needing to represent the root or intermediate operations. """ class LightningResourceAttributes(Enum): """Resource attribute names used in Agent-lightning spans.""" ROLLOUT_ID = "agentlightning.rollout_id" """Resource name for rollout ID in Agent-lightning spans.""" ATTEMPT_ID = "agentlightning.attempt_id" """Resource name for attempt ID in Agent-lightning spans.""" SPAN_SEQUENCE_ID = "agentlightning.span_sequence_id" """Resource name for span sequence ID in Agent-lightning spans.""" TRACER_NAME = "agentlightning.tracer.name" """Which tracer is used to create this span.""" class LightningSpanAttributes(Enum): """Attribute names that commonly appear in Agent-lightning spans. Exception types can't be found here because they are defined in OpenTelemetry's official semantic conventions. """ REWARD = "agentlightning.reward" """Attribute prefix for rewards-related data in reward spans. It should be used as a prefix. For example, "agentlightning.reward.0.value" can be used to track a specific metric. See [RewardAttributes][agentlightning.semconv.RewardAttributes]. """ LINK = "agentlightning.link" """Attribute name for linking the current span to another span or other objects like requests/responses.""" TAG = "agentlightning.tag" """Attribute name for tagging spans with customized strings.""" MESSAGE_BODY = "agentlightning.message.body" """Attribute name for message text in message spans.""" OBJECT_TYPE = "agentlightning.object.type" """Attribute name for object type (full qualified name) in object spans. I think builtin types like str, int, bool, list, dict are self-explanatory and should also be qualified to use here. """ OBJECT_LITERAL = "agentlightning.object.literal" """Attribute name for object literal value in object spans (for str, int, bool, ...).""" OBJECT_JSON = "agentlightning.object.json" """Attribute name for object serialized value (JSON) in object spans.""" OPERATION_NAME = "agentlightning.operation.name" """Attribute name for operation name in operation spans, normally the function name.""" OPERATION_INPUT = "agentlightning.operation.input" """Attribute name for operation input in operation spans.""" OPERATION_OUTPUT = "agentlightning.operation.output" """Attribute name for operation output in operation spans.""" class RewardAttributes(Enum): """Multi-dimensional reward attributes will look like: ```json {"agentlightning.reward.0.name": "efficiency", "agentlightning.reward.0.value": 0.75} ``` The first reward in the reward list will automatically be the primary reward. If the reward list has greater than 1, it shall be a multi-dimensional case. """ REWARD_NAME = "name" """Key for each dimension in multi-dimensional reward spans.""" REWARD_VALUE = "value" """Value for each dimension in multi-dimensional reward spans.""" class RewardPydanticModel(BaseModel): """A stricter implementation of RewardAttributes used in otel helpers.""" name: str """Name of the reward dimension.""" value: float """Value of the reward dimension.""" class LinkAttributes(Enum): """Standard link types used in Agent-lightning spans. The link is more powerful than [OpenTelemetry link](https://opentelemetry.io/docs/specs/otel/trace/api/#link) in that it supports linking to a queryset of spans. It can even link to span object that hasn't been emitted yet. """ KEY_MATCH = "key_match" """Linking to spans with matching attribute keys. `trace_id` and `span_id` are reserved and will be used to link to specific spans directly. For example, it can be `gen_ai.response.id` if intended to be link to a chat completion response span. Or it can be `span_id` to link to a specific span by its ID. """ VALUE_MATCH = "value_match" """Linking to spans with corresponding attribute values on those keys.""" class LinkPydanticModel(BaseModel): """A stricter implementation of LinkAttributes used in otel helpers.""" key_match: str """The attribute key to match on the target spans.""" value_match: str """The attribute value to match on the target spans.""" ================================================ FILE: agentlightning/server.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Legacy HTTP server compatible with the original Agent Lightning protocol. The implementation in this module predates the modern store-powered runtime and is kept for backwards compatibility with older deployments. New applications should migrate to the store architecture where possible. """ from __future__ import annotations import asyncio import logging import threading import time import uuid import warnings from contextlib import asynccontextmanager from typing import Any, Dict, List, Literal, Optional import uvicorn from fastapi import FastAPI, HTTPException, Path from .types import ( GenericResponse, NamedResources, ResourcesUpdate, RolloutLegacy, Task, TaskIfAny, ) logger = logging.getLogger(__name__) class ServerDataStore: """Async-safe container for in-memory server state. The store tracks queued tasks, claimed tasks, uploaded rollouts, and the currently published resources. All interactions are guarded by asyncio locks so that the FastAPI handlers can safely run in parallel. !!! warning "Deprecated" [`ServerDataStore`][agentlightning.server.ServerDataStore] is part of the legacy client/server stack. Use [`LightningStore`][agentlightning.LightningStore] instead. """ def __init__(self): self._task_queue: asyncio.Queue[Task] = asyncio.Queue() self._processing_tasks: Dict[str, Task] = {} # Currently processing tasks self._completed_rollouts: Dict[str, RolloutLegacy] = {} # Store for versioned resources self._resource_versions: Dict[str, NamedResources] = {} self._latest_resources_id: Optional[str] = None # Locks for thread-safe access self._results_lock = asyncio.Lock() self._resources_lock = asyncio.Lock() async def add_task( self, sample: Any, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, metadata: Dict[str, Any] | None = None, ) -> str: """Enqueue a new task and return the generated rollout identifier. Args: sample: Payload that describes the task input. mode: Phase in which the sample should be executed (`"train"`, `"val"`, or `"test"`). resources_id: Identifier of a resource bundle that the executor should load before running the task. metadata: Optional metadata forwarded to the executor. Returns: Unique rollout identifier assigned to the task. """ rollout_id = f"rollout-{uuid.uuid4()}" task = Task( rollout_id=rollout_id, input=sample, mode=mode, resources_id=resources_id, create_time=time.time(), num_claims=0, metadata=metadata or {}, ) await self._task_queue.put(task) logger.info(f"Task queued: {rollout_id} (mode: {mode}, resources_id: {resources_id})") return rollout_id async def get_next_task(self) -> Optional[Task]: """Retrieve the next task from the queue without blocking. Returns: Next [`Task`][agentlightning.Task] ready to execute, or ``None`` when the queue is empty. """ try: async with self._results_lock: task = self._task_queue.get_nowait() task = task.model_copy( update={ "last_claim_time": time.time(), "num_claims": (task.num_claims or 0) + 1, } ) self._processing_tasks[task.rollout_id] = task if task.num_claims == 1: logger.debug(f"Next task retrieved: {task.rollout_id}") else: logger.info(f"Task {task.rollout_id} re-claimed (attempt {task.num_claims})") return task except asyncio.QueueEmpty: return None async def update_resources(self, update: ResourcesUpdate): """Persist a new resource bundle and mark it as the latest version. Args: update: Resource payload received from a client. """ # TODO: evict old resources if necessary. async with self._resources_lock: self._resource_versions[update.resources_id] = update.resources self._latest_resources_id = update.resources_id logger.info(f"Resources updated. New version '{update.resources_id}' is now latest.") async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: """Retrieve a specific resource bundle by identifier. Args: resources_id: Identifier that was previously published to the store. Returns: Matching [`ResourcesUpdate`][agentlightning.ResourcesUpdate] instance, or ``None`` when the identifier is unknown. """ async with self._resources_lock: resources = self._resource_versions.get(resources_id) if resources: return ResourcesUpdate( resources_id=resources_id, resources=resources, create_time=time.time(), update_time=time.time(), version=1, ) return None async def get_latest_resources(self) -> Optional[ResourcesUpdate]: """Return the most recent resource bundle, if one exists.""" if self._latest_resources_id: return await self.get_resources_by_id(self._latest_resources_id) return None async def store_rollout(self, rollout: RolloutLegacy): """Persist a completed rollout for later inspection. Args: rollout: Rollout returned by a client. """ async with self._results_lock: self._processing_tasks.pop(rollout.rollout_id, None) self._completed_rollouts[rollout.rollout_id] = rollout logger.info(f"Rollout received and stored: {rollout.rollout_id}") async def retrieve_rollout(self, rollout_id: str) -> Optional[RolloutLegacy]: """Retrieve and remove a stored rollout by identifier. Args: rollout_id: Identifier of the rollout to fetch. Returns: Stored [`RolloutLegacy`][agentlightning.RolloutLegacy], or ``None`` when the identifier is unknown. """ async with self._results_lock: return self._completed_rollouts.pop(rollout_id, None) async def retrieve_completed_rollouts(self) -> List[RolloutLegacy]: """Return all completed rollouts and clear the internal buffer.""" async with self._results_lock: rollouts = list(self._completed_rollouts.values()) self._completed_rollouts.clear() return rollouts def get_processing_tasks(self) -> Dict[str, Task]: """Return a copy of currently processing tasks for timeout checking.""" return self._processing_tasks.copy() async def requeue_task(self, task: Task): """Requeue a task that timed out while being processed.""" logger.warning(f"Requeuing task {task.rollout_id} after timeout (attempt {task.num_claims})") async with self._results_lock: # Remove from processing tasks self._processing_tasks.pop(task.rollout_id, None) self._task_queue.put_nowait(task) class AgentLightningServer: """High-level controller for the legacy Agent Lightning FastAPI server. The controller orchestrates server start-up, task queueing, resource updates, and retrieval of client rollouts. It is primarily used by existing systems that still rely on the HTTP-based workflow. !!! warning "Deprecated" [`AgentLightningServer`][agentlightning.server.AgentLightningServer] is part of the legacy client/server stack. Prefer the store-based runtime for new integrations. """ def __init__(self, host: str = "127.0.0.1", port: int = 8000, task_timeout_seconds: float = 300.0): """Initialize the controller. Args: host: Hostname or IP address to bind the HTTP server to. port: TCP port exposed by the server. task_timeout_seconds: Seconds before a claimed task is considered stale and re-queued. """ warnings.warn( "AgentLightningServer is deprecated. Please use LightningStoreServer instead.", DeprecationWarning ) self.host = host self.port = port self.endpoint = f"http://{host}:{port}" self._task_timeout_seconds = task_timeout_seconds # Defer initialization and use event for cross-thread communication self._store: Optional[ServerDataStore] = None self.loop: Optional[asyncio.AbstractEventLoop] = None self.startup_event = threading.Event() # Create FastAPI app instance with a lifespan manager self._app = FastAPI(lifespan=self._lifespan) self._setup_routes() self._uvicorn_config = uvicorn.Config(self._app, host=self.host, port=self.port, log_level="info") self._uvicorn_server = uvicorn.Server(self._uvicorn_config) # --- ADDED: Lifespan context manager --- @asynccontextmanager async def _lifespan(self, app: FastAPI): """Manage server start-up and shutdown within the event loop.""" logger.info("Server is starting up...") self.loop = asyncio.get_running_loop() self._store = ServerDataStore() # Initialize data store here self.startup_event.set() # Signal that the server is ready yield logger.info("Server is shutting down.") self._store = None self.startup_event.clear() # Clear the startup event self.loop = None async def _check_and_requeue_stale_tasks(self): """Check for stale tasks and requeue them when they exceed the timeout.""" current_time = time.time() # Ensure store is initialized before checking if not self._store: return processing_tasks = self._store.get_processing_tasks() for _, task in processing_tasks.items(): if task.last_claim_time and current_time - task.last_claim_time > self._task_timeout_seconds: await self._store.requeue_task(task) logger.warning( f"Task {task.rollout_id} timed out after {self._task_timeout_seconds}s, requeued (attempt {task.num_claims})" ) def _setup_routes(self): """Configure the FastAPI routes that make up the legacy HTTP API.""" @self._app.get("/task", response_model=TaskIfAny) async def next_task() -> TaskIfAny: # type: ignore """Provide the next available task to a client.""" await self._check_and_requeue_stale_tasks() if not self._store: return TaskIfAny(is_available=False) task = await self._store.get_next_task() if task: logger.debug(f"Serving task {task.rollout_id} to a client.") return TaskIfAny(is_available=True, task=task) else: logger.debug("No task available for client.") return TaskIfAny(is_available=False) @self._app.get("/resources/latest", response_model=ResourcesUpdate) async def fetch_latest_resources() -> ResourcesUpdate: # type: ignore """Return the most recent resource bundle published to the server.""" if not self._store: raise HTTPException(status_code=503, detail="Server not fully initialized.") resources_update = await self._store.get_latest_resources() if not resources_update: raise HTTPException(status_code=404, detail="No resources have been set on the server.") logger.debug(f"Serving latest resources '{resources_update.resources_id}' to a client.") return resources_update @self._app.get("/resources/{resource_id}", response_model=ResourcesUpdate) async def fetch_resources_by_id( # type: ignore resource_id: str = Path(..., description="The unique identifier for the resource version.") ) -> ResourcesUpdate: """Return a specific version of resources by identifier.""" if not self._store: raise HTTPException(status_code=503, detail="Server not fully initialized.") resources_update = await self._store.get_resources_by_id(resource_id) if not resources_update: raise HTTPException(status_code=404, detail=f"Resource ID '{resource_id}' not found.") logger.debug(f"Serving resources for ID '{resource_id}' to a client.") return resources_update @self._app.post("/rollout", response_model=GenericResponse) async def post_rollout(payload: RolloutLegacy) -> GenericResponse: # type: ignore """Persist the rollout reported by a client.""" if not self._store: raise HTTPException(status_code=503, detail="Server not fully initialized.") await self._store.store_rollout(payload) return GenericResponse( status="ok", message=f"Rollout {payload.rollout_id} received and stored.", ) async def start(self): """Start the FastAPI server in the background.""" logger.info(f"Starting server at {self.endpoint}") asyncio.create_task(self._uvicorn_server.serve()) await asyncio.sleep(1) # Allow time for server to start up. async def stop(self): """Stop the FastAPI server and wait for a graceful shutdown.""" if self._uvicorn_server.started: logger.info("Stopping server...") self._uvicorn_server.should_exit = True await asyncio.sleep(1) # Allow time for graceful shutdown. logger.info("Server stopped.") async def run_forever(self): """Run the server indefinitely until `stop()` is invoked.""" await self._uvicorn_server.serve() async def queue_task( self, sample: Any, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, metadata: Dict[str, Any] | None = None, ) -> str: """Add a task to the queue for a client to process.""" if not self._store: raise RuntimeError("Store not initialized. The server may not be running.") return await self._store.add_task(sample, mode=mode, resources_id=resources_id, metadata=metadata) async def update_resources(self, resources: NamedResources) -> str: """Publish a new resource bundle and return its generated identifier.""" if not self._store: raise RuntimeError("Store not initialized. The server may not be running.") resources_id = f"res-{uuid.uuid4()}" update = ResourcesUpdate( resources_id=resources_id, resources=resources, create_time=time.time(), update_time=time.time(), version=1 ) await self._store.update_resources(update) return resources_id async def get_completed_rollout(self, rollout_id: str) -> Optional[RolloutLegacy]: """Retrieve a specific completed rollout by identifier.""" if not self._store: raise RuntimeError("Store not initialized. The server may not be running.") return await self._store.retrieve_rollout(rollout_id) async def poll_completed_rollout(self, rollout_id: str, timeout: Optional[float] = None) -> Optional[RolloutLegacy]: """Poll for a completed rollout until it becomes available or a timeout expires. Args: rollout_id: Identifier of the rollout to wait for. timeout: Maximum number of seconds to wait. ``None`` waits indefinitely. Returns: Retrieved rollout, or ``None`` when the timeout is reached without success. """ start_time = time.time() while True: rollout = await self.get_completed_rollout(rollout_id) if rollout: return rollout if timeout and (time.time() - start_time) >= timeout: return None await asyncio.sleep(1) async def retrieve_completed_rollouts(self) -> List[RolloutLegacy]: """Return every completed rollout and clear the internal buffer.""" if not self._store: raise RuntimeError("Store not initialized. The server may not be running.") return await self._store.retrieve_completed_rollouts() ================================================ FILE: agentlightning/store/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .base import LightningStore, LightningStoreCapabilities, LightningStoreStatistics from .client_server import LightningStoreClient, LightningStoreServer from .collection_based import CollectionBasedLightningStore from .memory import InMemoryLightningStore from .threading import LightningStoreThreaded __all__ = [ "LightningStore", "LightningStoreCapabilities", "LightningStoreStatistics", "LightningStoreClient", "LightningStoreServer", "InMemoryLightningStore", "CollectionBasedLightningStore", "LightningStoreThreaded", ] ================================================ FILE: agentlightning/store/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations from typing import Any, Dict, List, Literal, Optional, Sequence, Tuple, TypedDict from opentelemetry.sdk.trace import ReadableSpan from agentlightning.types import ( Attempt, AttemptedRollout, AttemptStatus, EnqueueRolloutRequest, NamedResources, ResourcesUpdate, Rollout, RolloutConfig, RolloutMode, RolloutStatus, Span, TaskInput, Worker, WorkerStatus, ) def is_queuing(rollout: Rollout) -> bool: return rollout.status == "queuing" or rollout.status == "requeuing" def is_running(rollout: Rollout) -> bool: return rollout.status == "preparing" or rollout.status == "running" def is_finished(rollout: Rollout) -> bool: return rollout.status == "failed" or rollout.status == "succeeded" or rollout.status == "cancelled" class _UnsetType: """A sentinel type to indicate an unset value.""" __slots__ = () def __repr__(self) -> str: return "UNSET" def __reduce__(self): return (_get_unset, ()) def _get_unset() -> _UnsetType: return UNSET UNSET = _UnsetType() Unset = _UnsetType # Alias for convenience class LightningStoreCapabilities(TypedDict, total=False): """Capability of a LightningStore implementation. All keys are optional and false by default. """ thread_safe: bool """Whether the store is thread-safe.""" async_safe: bool """Whether the store is async-safe.""" zero_copy: bool """Whether the store has only one copy across all threads/processes.""" otlp_traces: bool """Whether the store supports OTLP/HTTP traces.""" class LightningStoreStatistics(TypedDict, total=False): """Statistics of a LightningStore implementation.""" name: str """Name of the store implementation.""" total_rollouts: int """Total number of rollouts in the store.""" total_attempts: int """Total number of attempts in the store.""" total_spans: int """Total number of spans in the store.""" total_resources: int """Total number of resources in the store.""" total_workers: int """Total number of workers in the store.""" uptime: float """Uptime of since the store has been started.""" # Memory-related statistics total_span_bytes: int """Total number of bytes of spans in the store.""" eviction_threshold_bytes: int """Eviction threshold for spans in bytes.""" safe_threshold_bytes: int """Safe threshold for spans in bytes.""" memory_capacity_bytes: int """Memory capacity of the store in bytes.""" class LightningStore: """Contract for the persistent control-plane that coordinates training rollouts. A `LightningStore` mediates every interaction between algorithms and runners: - **Rollout lifecycle:** accept new rollouts, queue them for execution, create attempts, and drive the rollout status machine (`"queuing"` → `"preparing"` → `"running"` → `{"succeeded","failed","cancelled"}` or `"requeuing"` when a retry is justified). - **Attempt tracking:** record each execution attempt, including progress heartbeats, retry sequencing, and terminal states such as `"timeout"` or `"unresponsive"`. - **Span ingest:** capture structured telemetry emitted by runners (either as native [`Span`][agentlightning.Span] objects or as `opentelemetry.sdk.trace.ReadableSpan` instances) so that algorithms can reconstruct trajectories and rewards. - **Resource versioning:** manage immutable snapshots of named resources (prompt templates, model checkpoints, proxy endpoints, …) and expose a single "latest" snapshot that runners can fetch just after claiming work. Implementations must provide thread-safe/async-safe semantics: each coroutine should appear atomic to callers even when multiple algorithms or runners call the API concurrently. Unless stated otherwise, missing identifiers should result in a `ValueError`. """ @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" return LightningStoreCapabilities( thread_safe=False, async_safe=False, zero_copy=False, otlp_traces=False, ) async def statistics(self) -> LightningStoreStatistics: """Return the statistics of the store.""" return { "name": self.__class__.__name__, } def otlp_traces_endpoint(self) -> str: """Return the OTLP/HTTP traces endpoint of the store. The traces can have rollout ID and attempt ID (and optionally sequence ID) saved in the "resource" of the spans. The store, if it supports OTLP, should be able to receive the traces and save them via [`add_span`][agentlightning.LightningStore.add_span] or [`add_otel_span`][agentlightning.LightningStore.add_otel_span]. The endpoint should be compatible with [OTLP HTTP protocol](https://opentelemetry.io/docs/specs/otlp/). It's not necessarily compatible with OTLP gRPC protocol. The returned endpoint will usually ends with `/v1/traces`. """ raise NotImplementedError() async def start_rollout( self, input: TaskInput, mode: RolloutMode | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, worker_id: str | None = None, ) -> AttemptedRollout: """Register a rollout and immediately create its first attempt. !!! note Use [`enqueue_rollout()`][agentlightning.LightningStore.enqueue_rollout] when the caller only wants to submit work for later scheduling. The rollout must be persisted with `status="preparing"` and an initial attempt with `sequence_id == 1` so the caller can begin execution without visiting the public queue. Implementations are expected to: 1. Generate a unique `rollout_id` and `attempt_id`. 2. Record `start_time` for both rollout and attempt based on the current clock. 3. Copy `config` and `metadata` so later mutations do not leak shared references. 4. Resolve `resources_id` to the latest resource snapshot when `None` is supplied. Args: input: Arbitrary task payload supplied by an algorithm. mode: Optional semantic mode for downstream analytics (`"train"`, `"val"`, `"test"`). resources_id: Concrete resource snapshot to execute against; defaults to the latest stored snapshot. config: Rollout retry/timeout policy. Should default to a fresh [`RolloutConfig`][agentlightning.RolloutConfig]. metadata: Free-form metadata persisted verbatim with the rollout. worker_id: Optional worker identifier to associate the new attempt with. Returns: The fully-populated [`AttemptedRollout`][agentlightning.AttemptedRollout] including the just-created attempt. Raises: NotImplementedError: Subclasses must provide durable storage for the rollout. ValueError: Implementations should raise when `resources_id` does not exist. """ raise NotImplementedError() async def enqueue_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: """Persist a rollout in `queuing` state so runners can claim it later. !!! note Different from [`start_rollout()`][agentlightning.LightningStore.start_rollout], this method is called when the caller only wants to submit work for later scheduling. Implementations must generate a unique `rollout_id`, stamp `start_time` with the current time, default `config` to a fresh [`RolloutConfig`][agentlightning.RolloutConfig], and insert the rollout at the tail of the scheduling queue. No attempt is created yet. Args: input: Arbitrary task payload supplied by an algorithm. mode: Optional semantic mode indicator (`"train"`, `"val"`, `"test"`). resources_id: Resource snapshot used when a runner eventually executes the rollout. config: Fine-grained retry/timeout parameters to persist with the rollout. metadata: Free-form metadata stored verbatim with the rollout record. Returns: The stored [`Rollout`][agentlightning.Rollout] in `queuing` status. Raises: NotImplementedError: Subclasses must persist the rollout. ValueError: Implementations should raise when `resources_id` does not exist. """ raise NotImplementedError() async def enqueue_many_rollouts(self, rollouts: Sequence[EnqueueRolloutRequest]) -> Sequence[Rollout]: """Persist multiple rollouts in `queuing` state. The implementation can delegate to [`enqueue_rollout()`][agentlightning.LightningStore.enqueue_rollout] per request and preserves the input ordering. Subclasses can override to provide more efficient bulk enqueue semantics. Args: rollouts: Rollout submission payloads mirroring [`enqueue_rollout()`][agentlightning.LightningStore.enqueue_rollout]'s parameters. Each entry requires `input` and can optionally include other fields. Returns: Rollouts enqueued in the same order as `rollouts`. """ raise NotImplementedError() async def dequeue_rollout(self, worker_id: Optional[str] = None) -> Optional[AttemptedRollout]: """Claim the oldest queued rollout and transition it to `preparing`. This function do not block. Retrieval must be FIFO across rollouts that remain in `queuing` or `requeuing` state. When a rollout is claimed, implementations must: * Transition its status to `"preparing"`. * Create a new attempt with `status="preparing"` and `sequence_id` equal to the number of attempts already registered for the rollout plus one. * Return an [`AttemptedRollout`][agentlightning.AttemptedRollout] snapshot so the runner knows both rollout metadata and the attempt identifier. * Optionally refresh the caller's [`Worker`][agentlightning.Worker] telemetry (e.g., `last_dequeue_time`) when `worker_id` is provided. Args: worker_id: Optional worker identifier to associate the claimed attempt with. Returns: The next attempt to execute, or `None` when no eligible rollouts are queued. Raises: NotImplementedError: Subclasses must implement queue retrieval. """ raise NotImplementedError() async def dequeue_many_rollouts( self, *, limit: int = 1, worker_id: Optional[str] = None, ) -> Sequence[AttemptedRollout]: """Claim up to `limit` queued rollouts without blocking. The implementation can repeatedly invokes [`dequeue_rollout()`][agentlightning.LightningStore.dequeue_rollout] until reaching the requested limit or the queue is empty. Subclasses can override it to fetch multiple rollouts atomically. Args: limit: Maximum number of rollouts to claim. Non-positive values return an empty list. worker_id: Optional worker identifier passed through to each dequeue call. Returns: Attempted rollouts claimed in FIFO order. May contain fewer than `limit` entries when the queue is exhausted. """ raise NotImplementedError() async def start_attempt(self, rollout_id: str, worker_id: Optional[str] = None) -> AttemptedRollout: """Create a manual retry attempt for an existing rollout. This is typically invoked by runners that wish to retry outside of the normal queue flow (for example in an online RL setup). Implementations must validate that the rollout exists, allocate a fresh `attempt_id`, increment the `sequence_id` monotonically, stamp the new attempt with `status="preparing"`, and return an up-to-date [`AttemptedRollout`][agentlightning.AttemptedRollout]. Args: rollout_id: Unique identifier of the rollout receiving a new attempt. worker_id: Optional worker identifier to associate the new attempt with. Returns: The rollout paired with its newly-created attempt. Raises: NotImplementedError: Subclasses must implement attempt creation. ValueError: Implementations must raise when `rollout_id` is unknown. """ raise NotImplementedError() async def add_many_spans(self, spans: Sequence[Span]) -> Sequence[Span]: """Persist a sequence of pre-constructed spans emitted during rollout execution. Implementations can simply delegate to [`add_span()`][agentlightning.LightningStore.add_span] for each span. However, if the store supports bulk insertion, it can implement this method to improve performance. """ raise NotImplementedError() async def add_span(self, span: Span) -> Optional[Span]: """Persist a pre-constructed span emitted during rollout execution. The provided [`Span`][agentlightning.Span] must already contain the `rollout_id`, `attempt_id`, and `sequence_id`. Implementations must: * Verify that both rollout and attempt exist. * Ensure span ordering remains strictly increasing per attempt (rejecting or keeping duplicates). * Treat the span arrival as a heartbeat: update the attempt's `last_heartbeat_time` and transition both attempt and rollout to `"running"` if they were still `"preparing"` or `"requeuing"`. Args: span: Fully populated span to persist. Returns: The stored span record (implementations may return a copy). Return `None` if the span was not added due to a duplicate. Raises: NotImplementedError: Subclasses must implement span persistence. ValueError: Implementations must raise when the referenced rollout or attempt is missing. """ raise NotImplementedError() async def add_otel_span( self, rollout_id: str, attempt_id: str, readable_span: ReadableSpan, sequence_id: int | None = None, ) -> Optional[Span]: """Convert and persist an OpenTelemetry span for a particular attempt. Implementations must transform the `readable_span` into a [`Span`][agentlightning.Span] (typically via [`Span.from_opentelemetry()`][agentlightning.Span.from_opentelemetry]), assign a strictly increasing `sequence_id` when one is not provided, and persist it using the same semantics as [`add_span()`][agentlightning.LightningStore.add_span]. Args: rollout_id: Identifier of the rollout that produced the span. attempt_id: Attempt identifier the span belongs to. readable_span: OpenTelemetry span in SDK form. sequence_id: Optional explicit ordering hint. When omitted, call [`get_next_span_sequence_id()`][agentlightning.LightningStore.get_next_span_sequence_id] automatically. Returns: The stored span record. Return `None` if the span was not added due to a duplicate. Raises: NotImplementedError: Subclasses must implement span persistence. ValueError: Implementations must raise when the rollout or attempt is unknown. """ raise NotImplementedError() async def query_rollouts( self, *, status_in: Optional[Sequence[RolloutStatus]] = None, rollout_id_in: Optional[Sequence[str]] = None, rollout_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, # Deprecated fields status: Optional[Sequence[RolloutStatus]] = None, rollout_ids: Optional[Sequence[str]] = None, ) -> Sequence[Rollout]: """Retrieve rollouts filtered by status and/or explicit identifiers. This interface supports structured filtering, sorting, and pagination so callers can build simple dashboards without copying data out of the store. The legacy parameters `status` and `rollout_ids` remain valid and are treated as aliases for `status_in` and `rollout_id_in` respectively—when both the new and deprecated parameters are supplied the new parameters take precedence. Args: status_in: Optional whitelist of [`RolloutStatus`][agentlightning.RolloutStatus] values. rollout_id_in: Optional whitelist of rollout identifiers to include. rollout_id_contains: Optional substring match for rollout identifiers. filter_logic: Logical operator to combine filters. sort_by: Optional field to sort by. Must reference a numeric or string field on [`Rollout`][agentlightning.Rollout]. sort_order: Direction to sort when `sort_by` is provided. limit: Maximum number of rows to return. Use `-1` for "no limit". offset: Number of rows to skip before returning results. status: Deprecated field. Use `status_in` instead. rollout_ids: Deprecated field. Use `rollout_id_in` instead. Returns: A sequence of matching rollouts (or [`AttemptedRollout`][agentlightning.AttemptedRollout] when attempts exist). Ordering is deterministic when `sort_by` is set. The return value is not guaranteed to be a list. Raises: NotImplementedError: Subclasses must implement the query. """ raise NotImplementedError() async def query_attempts( self, rollout_id: str, *, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[Attempt]: """Return every attempt ever created for `rollout_id` in ascending sequence order. The parameters allow callers to re-order or paginate the attempts so that large retry histories can be streamed lazily. Args: rollout_id: Identifier of the rollout being inspected. sort_by: Field to sort by. Must be a numeric or string field of [`Attempt`][agentlightning.Attempt]. Defaults to `sequence_id` (oldest first). sort_order: Order to sort by. limit: Limit on the number of results. `-1` for unlimited. offset: Offset into the results. Returns: Sequence of Attempts. Returns an empty sequence when none exist. The return value is not guaranteed to be a list. Raises: NotImplementedError: Subclasses must implement the query. ValueError: Implementations must raise when the rollout does not exist. """ raise NotImplementedError() async def get_rollout_by_id(self, rollout_id: str) -> Optional[Rollout]: """Fetch a rollout by identifier without mutating its state. Args: rollout_id: Identifier to retrieve. Returns: The rollout when found, otherwise `None`. Raises: NotImplementedError: Subclasses must implement retrieval. """ raise NotImplementedError() async def get_latest_attempt(self, rollout_id: str) -> Optional[Attempt]: """Fetch the attempt with the highest `sequence_id` for `rollout_id`. Args: rollout_id: Identifier to inspect. Returns: The most recent attempt or `None` when no attempts exist yet. Raises: NotImplementedError: Subclasses must implement retrieval. ValueError: Implementations must raise when the rollout does not exist. """ raise NotImplementedError() async def query_resources( self, *, resources_id: Optional[str] = None, resources_id_contains: Optional[str] = None, # Filter logic is not supported here because I can't see why it's needed. sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[ResourcesUpdate]: """List every stored resource snapshot in insertion order. Supports lightweight filtering, sorting, and pagination for embedding in dashboards. Args: resources_id: Optional identifier of the resources to include. resources_id_contains: Optional substring match for resources identifiers. sort_by: Optional field to sort by (must be numeric or string on [`ResourcesUpdate`][agentlightning.ResourcesUpdate]). sort_order: Order to sort by. limit: Limit on the number of results. `-1` for unlimited. offset: Offset into the results. Returns: [`ResourcesUpdate`][agentlightning.ResourcesUpdate] objects. By default, resources are sorted in a deterministic but undefined order. The return value is not guaranteed to be a list. Raises: NotImplementedError: Subclasses must implement retrieval. """ raise NotImplementedError() async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: """Return a specific named resource snapshot by identifier. Args: resources_id: Identifier of the snapshot. Returns: The stored [`ResourcesUpdate`][agentlightning.ResourcesUpdate], or `None` when missing. Raises: NotImplementedError: Subclasses must implement retrieval. """ raise NotImplementedError() async def get_latest_resources(self) -> Optional[ResourcesUpdate]: """Fetch the latest resource snapshot marked as the global default. Returns: The current latest [`ResourcesUpdate`][agentlightning.ResourcesUpdate], or `None` when no resources have been registered yet. Raises: NotImplementedError: Subclasses must implement retrieval. """ raise NotImplementedError() async def get_next_span_sequence_id(self, rollout_id: str, attempt_id: str) -> int: """Allocate the next strictly increasing sequence number used to order spans. Implementations must retain counters so repeated calls return `1, 2, ...` without gaps unless spans were explicitly inserted with a custom `sequence_id`. The counter may be scoped per rollout or per attempt, but the sequence must be strictly increasing for spans emitted by the specified attempt so traces remain totally ordered. See [Distributed Tracing][distributed-tracing] for detailed motivations. Args: rollout_id: Identifier of the rollout emitting spans. attempt_id: Attempt identifier for the upcoming span. Returns: The next integer sequence identifier, unique within the attempt. Raises: NotImplementedError: Subclasses must provide the allocator. ValueError: Implementations must raise when the rollout or attempt does not exist. """ raise NotImplementedError() async def get_many_span_sequence_ids(self, rollout_attempt_ids: Sequence[Tuple[str, str]]) -> Sequence[int]: """Bulk allocate the next strictly increasing sequence number used to order spans. Implementations may delegate to [`get_next_span_sequence_id()`][agentlightning.LightningStore.get_next_span_sequence_id] for each rollout and attempt. Args: rollout_attempt_ids: List of tuples of rollout and attempt identifiers. Returns: List of sequence numbers. """ raise NotImplementedError() async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: """Block until the targeted rollouts reach a terminal status or the timeout expires. Terminal statuses are `"succeeded"`, `"failed"`, and `"cancelled"`. When the timeout elapses, implementations should return the subset of rollouts that are already terminal and omit the rest. !!! warning It's dangerous and might be event-loop blocking to call this function with a long timeout. It's a good idea to poll for the method to check if new completed rollouts can coming. Be careful in implementing the sleep logic to avoid busy-waiting. Args: rollout_ids: Identifiers of rollouts to watch. timeout: Maximum time in seconds to wait. `None` waits indefinitely. Returns: Rollouts that finished before the deadline, in arbitrary order. Raises: NotImplementedError: Subclasses must implement waiting semantics. ValueError: Implementations must raise when a rollout identifier is unknown. """ raise NotImplementedError() async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, *, # Filtering trace_id: Optional[str] = None, trace_id_contains: Optional[str] = None, span_id: Optional[str] = None, span_id_contains: Optional[str] = None, parent_id: Optional[str] = None, parent_id_contains: Optional[str] = None, name: Optional[str] = None, name_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", # Pagination limit: int = -1, offset: int = 0, # Sorting sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", ) -> Sequence[Span]: """Return the stored spans for a rollout, optionally scoped to one attempt. Supports a handful of filters that cover the most common debugging scenarios (matching `trace_id`/`span_id`/`parent_id` or substring matches on the span name). `attempt_id="latest"` acts as a convenience that resolves the most recent attempt before evaluating filters. When `attempt_id=None`, spans across every attempt are eligible. By default results are sorted by `sequence_id` (oldest first). Implementations may raise a `RuntimeError` when spans were evicted or expired. Args: rollout_id: Identifier of the rollout being inspected. attempt_id: Attempt identifier to filter by. Pass `"latest"` to retrieve only the most recent attempt, or `None` to return all spans across attempts. trace_id: Optional trace ID to filter by. trace_id_contains: Optional substring match for trace IDs. span_id: Optional span ID to filter by. span_id_contains: Optional substring match for span IDs. parent_id: Optional parent span ID to filter by. parent_id_contains: Optional substring match for parent span IDs. name: Optional span name to filter by. name_contains: Optional substring match for span names. filter_logic: Logical operator to combine the optional filters above. The `rollout_id` argument is always applied with AND semantics. limit: Limit on the number of results. `-1` for unlimited. offset: Offset into the results. sort_by: Field to sort by. Must be a numeric or string field of [`Span`][agentlightning.Span]. sort_order: Order to sort by. Returns: An ordered list of spans (possibly empty). The return value is not guaranteed to be a list. Raises: NotImplementedError: Subclasses must implement the query. ValueError: Implementations must raise when the rollout or attempt is unknown. """ raise NotImplementedError() async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: """Persist a new immutable snapshot of named resources and mark it as latest. Implementations must assign a fresh `resources_id` and ensure subsequent calls to [`get_latest_resources()`][agentlightning.LightningStore.get_latest_resources] return the snapshot produced here. Args: resources: Mapping of resource names to their serialized payloads. Returns: The stored [`ResourcesUpdate`][agentlightning.ResourcesUpdate] including its generated id. Raises: NotImplementedError: Subclasses must implement resource persistence. """ raise NotImplementedError() async def update_resources(self, resources_id: str, resources: NamedResources) -> ResourcesUpdate: """Overwrite or extend an existing resource snapshot and mark it as latest. This API is typically used by algorithms that maintain mutable resources (e.g., model checkpoints) under a stable identifier. Args: resources_id: Identifier of the snapshot to replace. resources: Updated mapping of resource names to payloads. Returns: The persisted [`ResourcesUpdate`][agentlightning.ResourcesUpdate]. Raises: NotImplementedError: Subclasses must implement resource persistence. ValueError: Implementations must raise when `resources_id` does not exist. """ raise NotImplementedError() async def update_rollout( self, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Rollout: """Update rollout metadata and, when provided, drive status transitions. Parameters default to the sentinel [`UNSET`][agentlightning.store.base.UNSET] to distinguish omitted fields from explicit `None` assignments. Implementations must: * Validate the rollout exists before mutating it. * Replace each property when a concrete value (including `None`) is supplied. * When the status switches into a terminal state, set `end_time` and signal any waiters. * When the status re-enters a queueing state, ensure the rollout is enqueued exactly once. Args: rollout_id: Identifier of the rollout to update. input: Replacement task payload; pass `None` to explicitly clear the input. mode: Replacement rollout mode. resources_id: Replacement resources snapshot reference. status: Target rollout status. config: Replacement retry/timeout configuration. metadata: Replacement metadata dictionary. Returns: The updated rollout record. Raises: NotImplementedError: Subclasses must implement mutation logic. ValueError: Implementations must raise when the rollout is unknown or the update is invalid. """ raise NotImplementedError() async def update_attempt( self, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Attempt: """Update attempt bookkeeping such as status, worker ownership, and heartbeats. When `attempt_id` is `"latest"` the update must target the attempt with the highest `sequence_id`; otherwise it must target the specific attempt. Implementations should propagate status changes to the rollout (for example via [`rollout_status_from_attempt()`][agentlightning.store.utils.rollout_status_from_attempt]) once the latest attempt transitions to a terminal state. Similar to [`update_rollout()`][agentlightning.LightningStore.update_rollout], parameters also default to the sentinel [`UNSET`][agentlightning.store.base.UNSET]. If `worker_id` is present, the worker status will be updated following the rules: 1. If attempt status is "succeeded" or "failed", the corresponding worker status will be set to "idle". 2. If attempt status is "unresponsive" or "timeout", the corresponding worker status will be set to "unknown". 3. Otherwise, the worker status will be set to "busy". Args: rollout_id: Identifier of the rollout whose attempt will be updated. attempt_id: Attempt identifier or `"latest"` as a convenience. status: Replacement attempt status. Terminal statuses must set `end_time`. worker_id: Identifier for the worker currently processing the attempt. last_heartbeat_time: Wall-clock timestamp (seconds) of the latest heartbeat/span. metadata: Replacement metadata dictionary. Returns: The updated attempt record. Raises: NotImplementedError: Subclasses must implement mutation logic. ValueError: Implementations must raise when the rollout or attempt is unknown. """ raise NotImplementedError() async def query_workers( self, *, status_in: Optional[Sequence[WorkerStatus]] = None, worker_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[Worker]: """Query all workers in the system. Args: status_in: Optional whitelist of [`WorkerStatus`][agentlightning.WorkerStatus] values. worker_id_contains: Optional substring match for worker identifiers. filter_logic: Logical operator to combine the optional filters above. sort_by: Field to sort by. Must be a numeric or string field of [`Worker`][agentlightning.Worker]. sort_order: Order to sort by. limit: Limit on the number of results. `-1` for unlimited. offset: Offset into the results. Returns: Sequence of Workers. Returns an empty sequence when none exist. The return value is not guaranteed to be a list. """ raise NotImplementedError() async def get_worker_by_id(self, worker_id: str) -> Optional[Worker]: """Retrieve a single worker by identifier. Args: worker_id: Identifier of the worker. Returns: The worker record if it exists, otherwise `None`. Raises: NotImplementedError: Subclasses must implement lookup semantics. """ raise NotImplementedError() async def update_worker( self, worker_id: str, heartbeat_stats: Dict[str, Any] | Unset = UNSET, ) -> Worker: """Record a heartbeat for `worker_id` and refresh telemetry. Implementations must treat this API as heartbeat-only: it should snapshot the latest stats when provided, stamp `last_heartbeat_time` with the current wall clock, and rely on other store mutations (`dequeue_rollout`, `update_attempt`, etc.) to drive the worker's busy/idle status, assignment, and activity timestamps. Args: worker_id: Identifier of the worker to update. heartbeat_stats: Replacement worker heartbeat statistics (non-null when provided). """ raise NotImplementedError() ================================================ FILE: agentlightning/store/client_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging import os import re import threading import time import traceback from pathlib import Path from typing import ( Any, Awaitable, Callable, Dict, List, Literal, Mapping, Optional, Sequence, Tuple, Type, TypeVar, Union, cast, ) import aiohttp from fastapi import APIRouter, Body, Depends, FastAPI, HTTPException from fastapi import Query as FastAPIQuery from fastapi import Request, Response from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, JSONResponse from fastapi.staticfiles import StaticFiles from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( ExportTraceServiceRequest as PbExportTraceServiceRequest, ) from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( ExportTraceServiceResponse as PbExportTraceServiceResponse, ) from opentelemetry.sdk.trace import ReadableSpan from pydantic import BaseModel, Field, TypeAdapter from agentlightning.types import ( Attempt, AttemptedRollout, AttemptStatus, EnqueueRolloutRequest, NamedResources, PaginatedResult, ResourcesUpdate, Rollout, RolloutConfig, RolloutStatus, Span, TaskInput, Worker, WorkerStatus, ) from agentlightning.utils.metrics import MetricsBackend, get_prometheus_registry from agentlightning.utils.otlp import handle_otlp_export, spans_from_proto from agentlightning.utils.server_launcher import LaunchMode, PythonServerLauncher, PythonServerLauncherArgs from .base import UNSET, LightningStore, LightningStoreCapabilities, LightningStoreStatistics, Unset from .collection.base import resolve_error_type from .utils import LATENCY_BUCKETS server_logger = logging.getLogger("agentlightning.store.server") client_logger = logging.getLogger("agentlightning.store.client") API_V1_PREFIX = "/v1" API_AGL_PREFIX = "/agl" API_V1_AGL_PREFIX = API_V1_PREFIX + API_AGL_PREFIX T = TypeVar("T") T_model = TypeVar("T_model", bound=BaseModel) class RolloutRequest(BaseModel): input: TaskInput mode: Optional[Literal["train", "val", "test"]] = None resources_id: Optional[str] = None config: Optional[RolloutConfig] = None metadata: Optional[Dict[str, Any]] = None worker_id: Optional[str] = None class DequeueRolloutRequest(BaseModel): worker_id: Optional[str] = None class StartAttemptRequest(BaseModel): worker_id: Optional[str] = None class EnqueueManyRolloutsRequest(BaseModel): rollouts: List[EnqueueRolloutRequest] class DequeueManyRolloutsRequest(BaseModel): limit: int = 1 worker_id: Optional[str] = None class QueryRolloutsRequest(BaseModel): status_in: Optional[List[RolloutStatus]] = Field(FastAPIQuery(default=None)) rollout_id_in: Optional[List[str]] = Field(FastAPIQuery(default=None)) rollout_id_contains: Optional[str] = None # Pagination limit: int = -1 offset: int = 0 # Sorting sort_by: Optional[str] = None sort_order: Literal["asc", "desc"] = "asc" # Filtering logic filter_logic: Literal["and", "or"] = "and" class WaitForRolloutsRequest(BaseModel): rollout_ids: List[str] timeout: Optional[float] = None class NextSequenceIdRequest(BaseModel): rollout_id: str attempt_id: str class NextSequenceIdResponse(BaseModel): sequence_id: int class UpdateRolloutRequest(BaseModel): input: Optional[TaskInput] = None mode: Optional[Literal["train", "val", "test"]] = None resources_id: Optional[str] = None status: Optional[RolloutStatus] = None config: Optional[RolloutConfig] = None metadata: Optional[Dict[str, Any]] = None class UpdateAttemptRequest(BaseModel): status: Optional[AttemptStatus] = None worker_id: Optional[str] = None last_heartbeat_time: Optional[float] = None metadata: Optional[Dict[str, Any]] = None class UpdateWorkerRequest(BaseModel): heartbeat_stats: Optional[Dict[str, Any]] = None class QueryAttemptsRequest(BaseModel): # Pagination limit: int = -1 offset: int = 0 # Sorting sort_by: Optional[str] = "sequence_id" sort_order: Literal["asc", "desc"] = "asc" class QueryResourcesRequest(BaseModel): # Filtering resources_id: Optional[str] = None resources_id_contains: Optional[str] = None # Pagination limit: int = -1 offset: int = 0 # Sorting sort_by: Optional[str] = None sort_order: Literal["asc", "desc"] = "asc" class QuerySpansRequest(BaseModel): rollout_id: str attempt_id: Optional[str] = None # Filtering trace_id: Optional[str] = None trace_id_contains: Optional[str] = None span_id: Optional[str] = None span_id_contains: Optional[str] = None parent_id: Optional[str] = None parent_id_contains: Optional[str] = None name: Optional[str] = None name_contains: Optional[str] = None filter_logic: Literal["and", "or"] = "and" # Pagination limit: int = -1 offset: int = 0 # Sorting sort_by: Optional[str] = "sequence_id" sort_order: Literal["asc", "desc"] = "asc" class QueryWorkersRequest(BaseModel): status_in: Optional[List[WorkerStatus]] = Field(FastAPIQuery(default=None)) worker_id_contains: Optional[str] = None # Pagination limit: int = -1 offset: int = 0 # Sorting sort_by: Optional[str] = None sort_order: Literal["asc", "desc"] = "asc" # Filtering logic filter_logic: Literal["and", "or"] = "and" class CachedStaticFiles(StaticFiles): def file_response(self, *args: Any, **kwargs: Any) -> Response: resp = super().file_response(*args, **kwargs) # hashed filenames are safe to cache "forever" resp.headers.setdefault("Cache-Control", "public, max-age=31536000, immutable") return resp class LightningStoreServer(LightningStore): """ Server wrapper that exposes a LightningStore via HTTP API. Delegates all operations to an underlying store implementation. Healthcheck and watchdog relies on the underlying store. `agl store` is a convenient CLI to start a store server. When the server is executed in a subprocess, the store will discover itself having a different PID and automatically delegate to an HTTP client instead of using the local store. This ensures one single copy of the store will be shared across all processes. This server exporting OTLP-compatible traces via the `/v1/traces` endpoint. Args: store: The underlying store to delegate operations to. host: The hostname or IP address to bind the server to. port: The TCP port to listen on. cors_allow_origins: A list of CORS origins to allow. Use '*' to allow all origins. launch_mode: The launch mode to use for the server. Defaults to "thread", which runs the server in a separate thread. launcher_args: The arguments to use for the server launcher. It's not allowed to set `host`, `port`, `launch_mode` together with `launcher_args`. n_workers: The number of workers to run in the server. Only applicable for `mp` launch mode. tracker: The metrics tracker to use for the server. """ def __init__( self, store: LightningStore, host: str | None = None, port: int | None = None, cors_allow_origins: Sequence[str] | str | None = None, launch_mode: LaunchMode = "thread", launcher_args: PythonServerLauncherArgs | None = None, n_workers: int = 1, tracker: MetricsBackend | None = None, ): super().__init__() self.store = store if launcher_args is not None: if host is not None or port is not None or launch_mode != "thread": raise ValueError("host, port, and launch_mode cannot be set when launcher_args is provided.") self.launcher_args = launcher_args else: if port is None: server_logger.warning("No port provided, using default port 4747.") port = 4747 self.launcher_args = PythonServerLauncherArgs( host=host, port=port, launch_mode=launch_mode, healthcheck_url=API_V1_AGL_PREFIX + "/health", n_workers=n_workers, ) store_capabilities = self.store.capabilities if not store_capabilities.get("async_safe", False): raise ValueError("The store is not async-safe. Please use another store for the server.") if self.launcher_args.launch_mode == "mp" and not store_capabilities.get("zero_copy", False): raise ValueError( "The store does not support zero-copy. Please use another store, or use asyncio or thread mode to launch the server." ) if self.launcher_args.launch_mode == "thread" and not store_capabilities.get("thread_safe", False): server_logger.warning( "The store is not thread-safe. Please be careful when using the store server and the underlying store in different threads." ) self.app: FastAPI | None = FastAPI(title="LightningStore Server") self.server_launcher = PythonServerLauncher( app=self.app, args=self.launcher_args, ) self._tracker = tracker self._lock: threading.Lock = threading.Lock() self._cors_allow_origins = self._normalize_cors_origins(cors_allow_origins) self._apply_cors() self._setup_routes() # Process-awareness: # LightningStoreServer holds a plain Python object (self.store) in one process # (the process that runs uvicorn/FastAPI). # When you multiprocessing.Process(...) and call methods on a different LightningStore instance # (or on a copy inherited via fork), you’re mutating another process’s memory, not the server’s memory. # So we need to track the owner process (whoever creates the server), # and only mutate the store in that process. self._owner_pid = os.getpid() self._client: Optional[LightningStoreClient] = None @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" return LightningStoreCapabilities( async_safe=True, thread_safe=True, zero_copy=True, otlp_traces=True, ) def otlp_traces_endpoint(self) -> str: """Return the OTLP/HTTP traces endpoint of the store.""" return f"{self.endpoint}/v1/traces" def __getstate__(self): """ Control pickling to prevent server state from being sent to subprocesses. When LightningStoreServer is pickled (e.g., passed to a subprocess), we only serialize the underlying store and connection details. The client instance and process-awareness state are excluded as they should not be transferred between processes. The subprocess should create its own server instance if needed. """ # server-launcher is needed for the host/port address are propagated to the subprocess return { "launcher_args": self.launcher_args, "server_launcher": self.server_launcher, "_owner_pid": self._owner_pid, } def __setstate__(self, state: Dict[str, Any]): """ Restore from pickle by reconstructing only the essential attributes. Note: This creates a new server instance without FastAPI/uvicorn initialized. Call __init__() pattern or create a new LightningStoreServer if you need a fully functional server in the subprocess. The unpickled server will also have no app and store attributes, this is to make sure there is only one copy of the server in the whole system. """ self.app = None self.store = None self.launcher_args = state["launcher_args"] self.server_launcher = state["server_launcher"] self._tracker = None self._owner_pid = state["_owner_pid"] self._cors_allow_origins = state.get("_cors_allow_origins") self._client = None self._lock = threading.Lock() self._prometheus_registry = None # Do NOT reconstruct app, _uvicorn_config, _uvicorn_server # to avoid transferring server state to subprocess @staticmethod def _normalize_cors_origins( origins: Sequence[str] | str | None, ) -> list[str] | None: if origins is None: return None if isinstance(origins, str): candidates = [origins] else: candidates = list(origins) cleaned: list[str] = [] for origin in candidates: if not origin or not origin.strip(): continue value = origin.strip() if value == "*": return ["*"] cleaned.append(value) return cleaned or None def _apply_cors(self) -> None: if self.app is None or not self._cors_allow_origins: return self.app.add_middleware( CORSMiddleware, allow_origins=self._cors_allow_origins.copy(), allow_methods=["*"], allow_headers=["*"], allow_credentials=True, expose_headers=["*"], ) @property def endpoint(self) -> str: """Endpoint is the address that the client will use to connect to the server.""" return self.server_launcher.access_endpoint async def start(self): """Starts the FastAPI server in the background. You need to call this method in the same process as the server was created in. """ server_logger.info( f"Serving the lightning store at {self.server_launcher.endpoint}, accessible at {self.server_launcher.access_endpoint}" ) start_time = time.time() await self.server_launcher.start() end_time = time.time() server_logger.info(f"Lightning store server started in {end_time - start_time:.2f} seconds") async def run_forever(self): """Runs the FastAPI server indefinitely.""" server_logger.info( f"Running the lightning store server at {self.server_launcher.endpoint}, accessible at {self.server_launcher.access_endpoint}" ) await self.server_launcher.run_forever() async def stop(self): """Gracefully stops the running FastAPI server. You need to call this method in the same process as the server was created in. """ server_logger.info("Stopping the lightning store server...") await self.server_launcher.stop() server_logger.info("Lightning store server stopped.") def _setup_routes(self): """Set up FastAPI routes for all store operations.""" assert self.app is not None api = APIRouter(prefix=API_V1_PREFIX) # The outermost-layer of monitoring if self._tracker is not None: self._setup_metrics(api=api, app=self.app) # TODO: This should only be enabled in development mode. @self.app.middleware("http") async def _app_exception_handler( # pyright: ignore[reportUnusedFunction] request: Request, call_next: Callable[[Request], Awaitable[Response]] ) -> Response: """ Convert unhandled application exceptions into 500 responses. Only covers /v1/agl requests. - Client needs a reliable signal to distinguish "app bug / bad request" from transport/session failures. - 400 means "do not retry"; network issues will surface as aiohttp exceptions or 5xx and will be retried by the client shield. """ try: return await call_next(request) except Exception as exc: # decide whether to convert this into your 400 JSONResponse if request.url.path.startswith(API_V1_AGL_PREFIX): server_logger.exception("Unhandled application error", exc_info=exc) payload = { "detail": "Internal server error", "error_type": type(exc).__name__, "traceback": traceback.format_exc(), } # 500 so clients can decide to retry return JSONResponse(status_code=500, content=payload) # otherwise re-raise and let FastAPI/Starlette handle it (500 or other handlers) raise @self.app.middleware("http") async def _log_time( # pyright: ignore[reportUnusedFunction] request: Request, call_next: Callable[[Request], Awaitable[Response]] ): # If not API request, just pass through if not request.url.path.startswith(API_V1_AGL_PREFIX) and not request.url.path.startswith( API_V1_PREFIX + "/traces" ): return await call_next(request) start = time.perf_counter() response = await call_next(request) duration = (time.perf_counter() - start) * 1000 client = request.client if client is None: client_address = "unknown" else: client_address = f"{client.host}:{client.port}" server_logger.debug( f"{client_address} - " f'"{request.method} {request.url.path} HTTP/{request.scope["http_version"]}" ' f"{response.status_code} in {duration:.2f} ms" ) return response def _validate_paginated_request( request: Union[ QueryRolloutsRequest, QueryAttemptsRequest, QueryResourcesRequest, QueryWorkersRequest, QuerySpansRequest, ], target_type: Type[T_model], ) -> None: """Raise an error early if the request is not a valid paginated request.""" if request.sort_by is not None and request.sort_by not in target_type.model_fields: raise HTTPException( status_code=400, detail=f"Invalid sort_by: {request.sort_by}, allowed fields are: {', '.join(target_type.model_fields.keys())}", ) if request.sort_order not in ["asc", "desc"]: raise HTTPException( status_code=400, detail=f"Invalid sort_order: {request.sort_order}, allowed values are: asc, desc" ) if request.limit == 0 or (request.limit < 0 and request.limit != -1): raise HTTPException(status_code=400, detail="Limit must be greater than 0 or -1 for no limit") if not request.offset >= 0: raise HTTPException(status_code=400, detail="Offset must be greater than or equal to 0") if hasattr(request, "filter_logic") and request.filter_logic not in ["and", "or"]: # type: ignore raise HTTPException( status_code=400, detail=f"Invalid filter_logic: {request.filter_logic}, allowed values are: and, or" # type: ignore ) def _build_paginated_response(items: Sequence[Any], *, limit: int, offset: int) -> PaginatedResult[Any]: """FastAPI routes expect PaginatedResult payloads; wrap plain lists accordingly.""" if isinstance(items, PaginatedResult): return items # Assuming it's a list. server_logger.warning( "PaginatedResult expected; got a plain list. Converting to PaginatedResult. " "Total items count will be inaccurate: %d", len(items), ) return PaginatedResult(items=items, limit=limit, offset=offset, total=len(items)) @api.get(API_AGL_PREFIX + "/health") async def health(): # pyright: ignore[reportUnusedFunction] return {"status": "ok"} @api.post(API_AGL_PREFIX + "/queues/rollouts/enqueue", status_code=201, response_model=List[Rollout]) async def enqueue_rollouts( # pyright: ignore[reportUnusedFunction] request: EnqueueManyRolloutsRequest, ) -> List[Rollout]: enqueue_requests = request.rollouts if not enqueue_requests: return [] if len(enqueue_requests) == 1: single = enqueue_requests[0] rollout = await self.enqueue_rollout( input=single.input, mode=single.mode, resources_id=single.resources_id, config=single.config, metadata=single.metadata, ) return [rollout] rollouts = await self.enqueue_many_rollouts(enqueue_requests) return list(rollouts) @api.post(API_AGL_PREFIX + "/queues/rollouts/dequeue", response_model=List[AttemptedRollout]) async def dequeue_rollouts( # pyright: ignore[reportUnusedFunction] request: DequeueManyRolloutsRequest | None = Body(None), ) -> List[AttemptedRollout]: payload = request or DequeueManyRolloutsRequest() if payload.limit <= 0: return [] if payload.limit == 1: single = await self.dequeue_rollout(worker_id=payload.worker_id) return [single] if single else [] rollouts = await self.dequeue_many_rollouts(limit=payload.limit, worker_id=payload.worker_id) return list(rollouts) @api.post(API_AGL_PREFIX + "/rollouts", status_code=201, response_model=AttemptedRollout) async def start_rollout(request: RolloutRequest): # pyright: ignore[reportUnusedFunction] return await self.start_rollout( input=request.input, mode=request.mode, resources_id=request.resources_id, config=request.config, metadata=request.metadata, worker_id=request.worker_id, ) @api.get(API_AGL_PREFIX + "/rollouts", response_model=PaginatedResult[Union[AttemptedRollout, Rollout]]) async def query_rollouts(params: QueryRolloutsRequest = Depends()): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(params, Rollout) # Get all rollouts from the underlying store results = await self.query_rollouts( status_in=params.status_in, rollout_id_in=params.rollout_id_in, rollout_id_contains=params.rollout_id_contains, filter_logic=params.filter_logic, sort_by=params.sort_by, sort_order=params.sort_order, limit=params.limit, offset=params.offset, ) return _build_paginated_response(results, limit=params.limit, offset=params.offset) @api.post(API_AGL_PREFIX + "/rollouts/search", response_model=PaginatedResult[Union[AttemptedRollout, Rollout]]) async def search_rollouts(request: QueryRolloutsRequest): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(request, Rollout) status_in = request.status_in if "status_in" in request.model_fields_set else None rollout_id_in = request.rollout_id_in if "rollout_id_in" in request.model_fields_set else None # Get all rollouts from the underlying store results = await self.query_rollouts( status_in=status_in, rollout_id_in=rollout_id_in, rollout_id_contains=request.rollout_id_contains, filter_logic=request.filter_logic, sort_by=request.sort_by, sort_order=request.sort_order, limit=request.limit, offset=request.offset, ) return _build_paginated_response(results, limit=request.limit, offset=request.offset) @api.get(API_AGL_PREFIX + "/rollouts/{rollout_id}", response_model=Union[AttemptedRollout, Rollout]) async def get_rollout_by_id(rollout_id: str): # pyright: ignore[reportUnusedFunction] return await self.get_rollout_by_id(rollout_id) def _get_mandatory_field_or_unset(request: BaseModel | None, field: str) -> Any: # If some fields are mandatory by the underlying store, but optional in the FastAPI, # we make sure it's set to non-null value or UNSET via this function. if request is None: return UNSET if field in request.model_fields_set: value = getattr(request, field) if value is None: raise HTTPException(status_code=400, detail=f"{field} is invalid; it cannot be a null value.") return value else: return UNSET @api.post(API_AGL_PREFIX + "/rollouts/{rollout_id}", response_model=Rollout) async def update_rollout( # pyright: ignore[reportUnusedFunction] rollout_id: str, request: UpdateRolloutRequest = Body(...) ): return await self.update_rollout( rollout_id=rollout_id, input=request.input if "input" in request.model_fields_set else UNSET, mode=request.mode if "mode" in request.model_fields_set else UNSET, resources_id=request.resources_id if "resources_id" in request.model_fields_set else UNSET, status=_get_mandatory_field_or_unset(request, "status"), config=_get_mandatory_field_or_unset(request, "config"), metadata=request.metadata if "metadata" in request.model_fields_set else UNSET, ) @api.post(API_AGL_PREFIX + "/rollouts/{rollout_id}/attempts", status_code=201, response_model=AttemptedRollout) async def start_attempt( # pyright: ignore[reportUnusedFunction] rollout_id: str, request: StartAttemptRequest | None = Body(None) ): worker_id = request.worker_id if request else None return await self.start_attempt(rollout_id, worker_id=worker_id) @api.post(API_AGL_PREFIX + "/rollouts/{rollout_id}/attempts/search", response_model=PaginatedResult[Attempt]) async def search_attempts( # pyright: ignore[reportUnusedFunction] rollout_id: str, request: QueryAttemptsRequest ): _validate_paginated_request(request, Attempt) attempts = await self.query_attempts( rollout_id, sort_by=request.sort_by, sort_order=request.sort_order, limit=request.limit, offset=request.offset, ) return _build_paginated_response(attempts, limit=request.limit, offset=request.offset) @api.post(API_AGL_PREFIX + "/rollouts/{rollout_id}/attempts/{attempt_id}", response_model=Attempt) async def update_attempt( # pyright: ignore[reportUnusedFunction] rollout_id: str, attempt_id: str, request: UpdateAttemptRequest = Body(...) ): return await self.update_attempt( rollout_id=rollout_id, attempt_id=attempt_id, status=_get_mandatory_field_or_unset(request, "status"), worker_id=_get_mandatory_field_or_unset(request, "worker_id"), last_heartbeat_time=_get_mandatory_field_or_unset(request, "last_heartbeat_time"), metadata=_get_mandatory_field_or_unset(request, "metadata"), ) @api.get(API_AGL_PREFIX + "/workers", response_model=PaginatedResult[Worker]) async def query_workers(params: QueryWorkersRequest = Depends()): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(params, Worker) workers = await self.query_workers( status_in=params.status_in, worker_id_contains=params.worker_id_contains, filter_logic=params.filter_logic, sort_by=params.sort_by, sort_order=params.sort_order, limit=params.limit, offset=params.offset, ) return _build_paginated_response(workers, limit=params.limit, offset=params.offset) @api.post(API_AGL_PREFIX + "/workers/search", response_model=PaginatedResult[Worker]) async def search_workers(request: QueryWorkersRequest): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(request, Worker) status_in = request.status_in if "status_in" in request.model_fields_set else None workers = await self.query_workers( status_in=status_in, worker_id_contains=request.worker_id_contains, filter_logic=request.filter_logic, sort_by=request.sort_by, sort_order=request.sort_order, limit=request.limit, offset=request.offset, ) return _build_paginated_response(workers, limit=request.limit, offset=request.offset) @api.get(API_AGL_PREFIX + "/workers/{worker_id}", response_model=Optional[Worker]) async def get_worker(worker_id: str): # pyright: ignore[reportUnusedFunction] return await self.get_worker_by_id(worker_id) @api.post(API_AGL_PREFIX + "/workers/{worker_id}", response_model=Worker) async def update_worker( # pyright: ignore[reportUnusedFunction] worker_id: str, request: UpdateWorkerRequest | None = Body(None) ): return await self.update_worker( worker_id=worker_id, heartbeat_stats=_get_mandatory_field_or_unset(request, "heartbeat_stats"), ) @api.get(API_AGL_PREFIX + "/statistics", response_model=Dict[str, Any]) async def get_statistics(): # pyright: ignore[reportUnusedFunction] return await self.statistics() @api.get(API_AGL_PREFIX + "/rollouts/{rollout_id}/attempts", response_model=PaginatedResult[Attempt]) async def query_attempts( # pyright: ignore[reportUnusedFunction] rollout_id: str, params: QueryAttemptsRequest = Depends() ): _validate_paginated_request(params, Attempt) attempts = await self.query_attempts( rollout_id, sort_by=params.sort_by, sort_order=params.sort_order, limit=params.limit, offset=params.offset, ) return _build_paginated_response(attempts, limit=params.limit, offset=params.offset) @api.get(API_AGL_PREFIX + "/rollouts/{rollout_id}/attempts/latest", response_model=Optional[Attempt]) async def get_latest_attempt(rollout_id: str): # pyright: ignore[reportUnusedFunction] return await self.get_latest_attempt(rollout_id) @api.get(API_AGL_PREFIX + "/resources", response_model=PaginatedResult[ResourcesUpdate]) async def query_resources(params: QueryResourcesRequest = Depends()): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(params, ResourcesUpdate) resources = await self.query_resources( resources_id=params.resources_id, resources_id_contains=params.resources_id_contains, sort_by=params.sort_by, sort_order=params.sort_order, limit=params.limit, offset=params.offset, ) return _build_paginated_response(resources, limit=params.limit, offset=params.offset) @api.post(API_AGL_PREFIX + "/resources", status_code=201, response_model=ResourcesUpdate) async def add_resources(resources: NamedResources): # pyright: ignore[reportUnusedFunction] return await self.add_resources(resources) @api.get(API_AGL_PREFIX + "/resources/latest", response_model=Optional[ResourcesUpdate]) async def get_latest_resources(): # pyright: ignore[reportUnusedFunction] return await self.get_latest_resources() @api.post(API_AGL_PREFIX + "/resources/{resources_id}", response_model=ResourcesUpdate) async def update_resources( # pyright: ignore[reportUnusedFunction] resources_id: str, resources: NamedResources ): return await self.update_resources(resources_id, resources) @api.get(API_AGL_PREFIX + "/resources/{resources_id}", response_model=Optional[ResourcesUpdate]) async def get_resources_by_id(resources_id: str): # pyright: ignore[reportUnusedFunction] return await self.get_resources_by_id(resources_id) @api.post(API_AGL_PREFIX + "/spans", status_code=201, response_model=Optional[Span]) async def add_span(span: Span): # pyright: ignore[reportUnusedFunction] return await self.add_span(span) @api.get(API_AGL_PREFIX + "/spans", response_model=PaginatedResult[Span]) async def query_spans(params: QuerySpansRequest = Depends()): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(params, Span) spans = await self.query_spans( params.rollout_id, params.attempt_id, trace_id=params.trace_id, trace_id_contains=params.trace_id_contains, span_id=params.span_id, span_id_contains=params.span_id_contains, parent_id=params.parent_id, parent_id_contains=params.parent_id_contains, name=params.name, name_contains=params.name_contains, filter_logic=params.filter_logic, sort_by=params.sort_by, sort_order=params.sort_order, limit=params.limit, offset=params.offset, ) return _build_paginated_response(spans, limit=params.limit, offset=params.offset) @api.post(API_AGL_PREFIX + "/spans/search", response_model=PaginatedResult[Span]) async def search_spans(request: QuerySpansRequest): # pyright: ignore[reportUnusedFunction] _validate_paginated_request(request, Span) spans = await self.query_spans( request.rollout_id, request.attempt_id, trace_id=request.trace_id, trace_id_contains=request.trace_id_contains, span_id=request.span_id, span_id_contains=request.span_id_contains, parent_id=request.parent_id, parent_id_contains=request.parent_id_contains, name=request.name, name_contains=request.name_contains, filter_logic=request.filter_logic, sort_by=request.sort_by, sort_order=request.sort_order, limit=request.limit, offset=request.offset, ) return _build_paginated_response(spans, limit=request.limit, offset=request.offset) @api.post(API_AGL_PREFIX + "/spans/next", response_model=NextSequenceIdResponse) async def get_next_span_sequence_id(request: NextSequenceIdRequest): # pyright: ignore[reportUnusedFunction] sequence_id = await self.get_next_span_sequence_id(request.rollout_id, request.attempt_id) return NextSequenceIdResponse(sequence_id=sequence_id) @api.post(API_AGL_PREFIX + "/waits/rollouts", response_model=List[Rollout]) async def wait_for_rollouts(request: WaitForRolloutsRequest): # pyright: ignore[reportUnusedFunction] return await self.wait_for_rollouts(rollout_ids=request.rollout_ids, timeout=request.timeout) # Setup OTLP endpoints self._setup_otlp(api) # Mount the API router of /v1/... self.app.include_router(api) # Finally, mount the dashboard assets self._setup_dashboard() def _setup_metrics(self, api: APIRouter, app: FastAPI): """Setup Prometheus metrics endpoints.""" if self._tracker is None: return self._tracker.register_counter( "agl.http.total", ["path", "method", "status"], group_level=2, ) self._tracker.register_histogram( "agl.http.latency", ["path", "method", "status"], buckets=LATENCY_BUCKETS, group_level=2, ) def get_template_path(path: str) -> str: # Handle "latest" keywords BEFORE generic IDs if path.endswith("/attempts/latest") and "/rollouts/" in path: return re.sub(r"rollouts/[^/]+/attempts/latest$", "rollouts/{rollout_id}/attempts/latest", path) if path.endswith("/attempts/search") and "/rollouts/" in path: return re.sub(r"rollouts/[^/]+/attempts/search$", "rollouts/{rollout_id}/attempts/search", path) if path.endswith("/resources/latest"): return path if path.endswith("/search"): return path if "enqueue" in path or "dequeue" in path: return path # Handle generic IDs # (Order matters: longest paths first or lookaheads) path = re.sub(r"/attempts/[^/]+$", "/attempts/{attempt_id}", path) path = re.sub(r"/rollouts/[^/]+", "/rollouts/{rollout_id}", path) # Handles root and middle path = re.sub(r"/resources/[^/]+$", "/resources/{resources_id}", path) path = re.sub(r"/workers/[^/]+$", "/workers/{worker_id}", path) return path @app.middleware("http") async def tracking_middleware( # pyright: ignore[reportUnusedFunction] request: Request, call_next: Callable[[Request], Awaitable[Response]] ) -> Response: if self._tracker is None: return await call_next(request) start = time.perf_counter() status = 520 # Default to 520 if things crash hard try: response = await call_next(request) status = response.status_code return response except asyncio.CancelledError: # Client disconnected (Timeout) status = 499 # Standard Nginx code for "Client Closed Request" server_logger.debug(f"Client disconnected (Timeout): {request.url.path}", exc_info=True) raise # Re-raise to let Uvicorn handle the cleanup except Exception as exc: status = resolve_error_type(exc) server_logger.debug(f"Server error: {request.url.path}", exc_info=True) raise finally: # This block executes NO MATTER WHAT happens above elapsed = time.perf_counter() - start # Strip the ID-specific URL parts path = get_template_path(request.url.path) method = request.method await self._tracker.inc_counter( "agl.http.total", labels={"method": method, "path": path, "status": str(status)}, ) await self._tracker.observe_histogram( "agl.http.latency", value=elapsed, labels={"method": method, "path": path, "status": str(status)}, ) if self._tracker.has_prometheus(): from prometheus_client import make_asgi_app # pyright: ignore[reportUnknownVariableType] metrics_app = make_asgi_app( # pyright: ignore[reportUnknownVariableType] registry=get_prometheus_registry() ) # This App would need to be accessed via /v1/prometheus/ (note the trailing slash) app.mount(api.prefix + "/prometheus", metrics_app) # pyright: ignore[reportUnknownArgumentType] def _setup_otlp(self, api: APIRouter): """Setup OTLP endpoints.""" async def _trace_handler(request: PbExportTraceServiceRequest) -> None: spans = await spans_from_proto(request, self.get_many_span_sequence_ids) server_logger.debug(f"Received {len(spans)} OTLP spans: {', '.join([span.name for span in spans])}") await self.add_many_spans(spans) # Reserved methods for OTEL traces # https://opentelemetry.io/docs/specs/otlp/#otlphttp-request # This is currently the recommended path for Otel compatibility and bulk-insertion support. @api.post("/traces") async def otlp_traces(request: Request): # pyright: ignore[reportUnusedFunction] return await handle_otlp_export( request, PbExportTraceServiceRequest, PbExportTraceServiceResponse, _trace_handler, "traces" ) # Other API endpoints are not supported yet @api.post("/metrics") async def otlp_metrics(): # pyright: ignore[reportUnusedFunction] return Response(status_code=501) @api.post("/logs") async def otlp_logs(): # pyright: ignore[reportUnusedFunction] return Response(status_code=501) @api.post("/development/profiles") async def otlp_development_profiles(): # pyright: ignore[reportUnusedFunction] return Response(status_code=501) def _setup_dashboard(self): """Setup the dashboard static files and SPA.""" assert self.app is not None dashboard_dir = (Path(__file__).parent.parent / "dashboard").resolve() if not dashboard_dir.exists(): server_logger.error("Dashboard directory not found at %s. Please build the dashboard first.", dashboard_dir) return dashboard_assets_dir = dashboard_dir / "assets" if not dashboard_assets_dir.exists(): server_logger.error( "Dashboard assets directory not found at %s. Please build the dashboard first.", dashboard_assets_dir ) return index_file = dashboard_dir / "index.html" if not index_file.exists(): server_logger.error("Dashboard index file not found at %s. Please build the dashboard first.", index_file) return # Mount the static files in dashboard/assets self.app.mount("/assets", CachedStaticFiles(directory=dashboard_assets_dir), name="assets") # SPA fallback (client-side routing) # Anything that's not /v1/* or a real file in /assets will serve index.html @self.app.get("/", include_in_schema=False) def root(): # pyright: ignore[reportUnusedFunction] return FileResponse(index_file) @self.app.get("/{full_path:path}", include_in_schema=False) def spa_fallback(full_path: str): # pyright: ignore[reportUnusedFunction] if full_path.startswith("v1/"): raise HTTPException(status_code=404, detail="Not Found") # Let the frontend router handle it return FileResponse(index_file) server_logger.info("Agent-lightning dashboard will be available at %s", self.endpoint) # Delegate methods async def _call_store_method(self, method_name: str, *args: Any, **kwargs: Any) -> Any: """First decide what store to delegate to in *this* process, and then call the method on it. - In the owner process: delegate to the in-process store. - In a different process: delegate to a HTTP client talking to the server. """ # If the store is zero-copy, we can just call the method directly. if self.store is not None and self.store.capabilities.get("zero_copy", False): return await getattr(self.store, method_name)(*args, **kwargs) if os.getpid() == self._owner_pid: if method_name == "wait_for_rollouts": # wait_for_rollouts can block for a long time; avoid holding the lock # so other requests can make progress while we wait. return await getattr(self.store, method_name)(*args, **kwargs) # If it's already thread-safe, we can just call the method directly. # Acquiring the threading lock directly would block the event loop if it's # already held by another thread (for example, the HTTP server thread). # Potential fix here are needed to make it work. For example: # ``` # acquired = self._lock.acquire(blocking=False) # if not acquired: # await asyncio.to_thread(self._lock.acquire) # try: # return await getattr(self.store, method_name)(*args, **kwargs) # finally: # self._lock.release() # ``` # Or we can just bypass the lock for thread-safe stores. if self.store is not None and self.store.capabilities.get("thread_safe", False): return await getattr(self.store, method_name)(*args, **kwargs) else: with self._lock: return await getattr(self.store, method_name)(*args, **kwargs) if self._client is None: self._client = LightningStoreClient(self.endpoint) return await getattr(self._client, method_name)(*args, **kwargs) async def statistics(self) -> LightningStoreStatistics: return await self._call_store_method("statistics") async def start_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, worker_id: Optional[str] = None, ) -> AttemptedRollout: return await self._call_store_method( "start_rollout", input, mode, resources_id, config, metadata, worker_id, ) async def enqueue_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: return await self._call_store_method( "enqueue_rollout", input, mode, resources_id, config, metadata, ) async def enqueue_many_rollouts(self, rollouts: Sequence[EnqueueRolloutRequest]) -> Sequence[Rollout]: return await self._call_store_method("enqueue_many_rollouts", rollouts) async def dequeue_rollout(self, worker_id: Optional[str] = None) -> Optional[AttemptedRollout]: return await self._call_store_method("dequeue_rollout", worker_id) async def dequeue_many_rollouts( self, *, limit: int = 1, worker_id: Optional[str] = None, ) -> Sequence[AttemptedRollout]: return await self._call_store_method("dequeue_many_rollouts", limit=limit, worker_id=worker_id) async def start_attempt(self, rollout_id: str, worker_id: Optional[str] = None) -> AttemptedRollout: return await self._call_store_method("start_attempt", rollout_id, worker_id) async def query_rollouts( self, *, status_in: Optional[Sequence[RolloutStatus]] = None, rollout_id_in: Optional[Sequence[str]] = None, rollout_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, status: Optional[Sequence[RolloutStatus]] = None, rollout_ids: Optional[Sequence[str]] = None, ) -> PaginatedResult[Union[AttemptedRollout, Rollout]]: return await self._call_store_method( "query_rollouts", status_in=status_in, rollout_id_in=rollout_id_in, rollout_id_contains=rollout_id_contains, filter_logic=filter_logic, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, status=status, rollout_ids=rollout_ids, ) async def query_attempts( self, rollout_id: str, *, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Attempt]: return await self._call_store_method( "query_attempts", rollout_id, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def get_latest_attempt(self, rollout_id: str) -> Optional[Attempt]: return await self._call_store_method("get_latest_attempt", rollout_id) async def query_resources( self, *, resources_id: Optional[str] = None, resources_id_contains: Optional[str] = None, sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[ResourcesUpdate]: return await self._call_store_method( "query_resources", resources_id=resources_id, resources_id_contains=resources_id_contains, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def get_rollout_by_id(self, rollout_id: str) -> Optional[Rollout]: return await self._call_store_method("get_rollout_by_id", rollout_id) async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: return await self._call_store_method("add_resources", resources) async def update_resources(self, resources_id: str, resources: NamedResources) -> ResourcesUpdate: return await self._call_store_method("update_resources", resources_id, resources) async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: return await self._call_store_method("get_resources_by_id", resources_id) async def get_latest_resources(self) -> Optional[ResourcesUpdate]: return await self._call_store_method("get_latest_resources") async def add_span(self, span: Span) -> Optional[Span]: return await self._call_store_method("add_span", span) async def add_many_spans(self, spans: Sequence[Span]) -> Sequence[Span]: return await self._call_store_method("add_many_spans", spans) async def get_next_span_sequence_id(self, rollout_id: str, attempt_id: str) -> int: return await self._call_store_method("get_next_span_sequence_id", rollout_id, attempt_id) async def get_many_span_sequence_ids(self, rollout_attempt_ids: Sequence[Tuple[str, str]]) -> Sequence[int]: return await self._call_store_method("get_many_span_sequence_ids", rollout_attempt_ids) async def add_otel_span( self, rollout_id: str, attempt_id: str, readable_span: ReadableSpan, sequence_id: int | None = None, ) -> Optional[Span]: return await self._call_store_method( "add_otel_span", rollout_id, attempt_id, readable_span, sequence_id, ) async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: return await self._call_store_method("wait_for_rollouts", rollout_ids=rollout_ids, timeout=timeout) async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, *, trace_id: Optional[str] = None, trace_id_contains: Optional[str] = None, span_id: Optional[str] = None, span_id_contains: Optional[str] = None, parent_id: Optional[str] = None, parent_id_contains: Optional[str] = None, name: Optional[str] = None, name_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", limit: int = -1, offset: int = 0, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", ) -> PaginatedResult[Span]: return await self._call_store_method( "query_spans", rollout_id, attempt_id, trace_id=trace_id, trace_id_contains=trace_id_contains, span_id=span_id, span_id_contains=span_id_contains, parent_id=parent_id, parent_id_contains=parent_id_contains, name=name, name_contains=name_contains, filter_logic=filter_logic, limit=limit, offset=offset, sort_by=sort_by, sort_order=sort_order, ) async def update_rollout( self, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Rollout: return await self._call_store_method( "update_rollout", rollout_id, input, mode, resources_id, status, config, metadata, ) async def update_attempt( self, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Attempt: return await self._call_store_method( "update_attempt", rollout_id, attempt_id, status, worker_id, last_heartbeat_time, metadata, ) async def query_workers( self, *, status_in: Optional[Sequence[WorkerStatus]] = None, worker_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Worker]: return await self._call_store_method( "query_workers", status_in=status_in, worker_id_contains=worker_id_contains, filter_logic=filter_logic, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def get_worker_by_id(self, worker_id: str) -> Optional[Worker]: return await self._call_store_method("get_worker_by_id", worker_id) async def update_worker( self, worker_id: str, heartbeat_stats: Dict[str, Any] | Unset = UNSET, ) -> Worker: return await self._call_store_method( "update_worker", worker_id, heartbeat_stats, ) class LightningStoreClient(LightningStore): """HTTP client that talks to a remote LightningStoreServer. Args: server_address: The address of the LightningStoreServer to connect to. retry_delays: Backoff schedule (seconds) used when the initial request fails for a non-application reason. Each entry is a retry attempt. Setting to an empty sequence to disable retries. health_retry_delays: Delays between /health probes while waiting for the server to come back. Setting to an empty sequence to disable health checks. request_timeout: Timeout (seconds) for each request. connection_timeout: Timeout (seconds) for establishing connection. """ def __init__( self, server_address: str, *, retry_delays: Sequence[float] = (1.0, 2.0, 5.0), health_retry_delays: Sequence[float] = (0.1, 0.2, 0.5), request_timeout: float = 30.0, connection_timeout: float = 5.0, ): self.server_address_root = server_address.rstrip("/") self.server_address = self.server_address_root + API_V1_AGL_PREFIX self._sessions: Dict[int, aiohttp.ClientSession] = {} # id(loop) -> ClientSession self._lock = threading.Lock() # retry config self._retry_delays = tuple(float(d) for d in retry_delays) self._health_retry_delays = tuple(float(d) for d in health_retry_delays) # Timeouts self._request_timeout = request_timeout self._connection_timeout = connection_timeout # Store whether the dequeue was successful in history self._dequeue_was_successful: bool = False self._dequeue_first_unsuccessful: bool = True @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" return LightningStoreCapabilities( thread_safe=True, async_safe=True, zero_copy=True, otlp_traces=True, ) def otlp_traces_endpoint(self) -> str: """Return the OTLP/HTTP traces endpoint of the store.""" return f"{self.server_address_root}/v1/traces" async def statistics(self) -> LightningStoreStatistics: payload = await self._request_json("get", "/statistics") return cast(LightningStoreStatistics, payload) def __getstate__(self): """ When LightningStoreClient is pickled (e.g., passed to a subprocess), we only serialize the server address and retry configurations. The ClientSessions are excluded as they should not be transferred between processes. """ return { "server_address_root": self.server_address_root, "server_address": self.server_address, "_retry_delays": self._retry_delays, "_health_retry_delays": self._health_retry_delays, "_request_timeout": self._request_timeout, "_connection_timeout": self._connection_timeout, } def __setstate__(self, state: Dict[str, Any]): """ Restore from pickle by reconstructing only the essential attributes. Replicating `__init__` logic to create another client instance in the subprocess. """ self.server_address = state["server_address"] self.server_address_root = state["server_address_root"] self._sessions = {} self._lock = threading.Lock() self._retry_delays = state["_retry_delays"] self._health_retry_delays = state["_health_retry_delays"] self._request_timeout = state["_request_timeout"] self._connection_timeout = state["_connection_timeout"] self._dequeue_was_successful = False self._dequeue_first_unsuccessful = True async def _get_session(self) -> aiohttp.ClientSession: # In the proxy process, FastAPI middleware calls # client_store.get_next_span_sequence_id(...). With # reuse_session=True, _get_session() creates and caches a # single ClientSession bound to the uvicorn event loop. # # Later, the OpenTelemetry exporter (LightningSpanExporter) # runs its flush on its own private event loop (in a different # thread) and calls client_store.add_otel_span(...) -> # client_store.add_span(...). # # If we reuse one session across all, the exporter tries to reuse the # same cached ClientSession that was created on the uvicorn # loop. aiohttp.ClientSession is not loop-agnostic or # thread-safe. Using it from another loop can hang on the # first request. That's why we need a map from loop to session. loop = asyncio.get_running_loop() key = id(loop) with self._lock: sess = self._sessions.get(key) if sess is None or sess.closed: timeout = aiohttp.ClientTimeout( total=self._request_timeout, connect=self._connection_timeout, sock_connect=self._connection_timeout, sock_read=self._request_timeout, ) sess = aiohttp.ClientSession(timeout=timeout) self._sessions[key] = sess return sess async def _wait_until_healthy(self, session: aiohttp.ClientSession) -> bool: """ Probe the server's /health until it responds 200 or retries are exhausted. Returns True if healthy, False otherwise. """ if not self._health_retry_delays: client_logger.info("No health retry delays configured; skipping health checks.") return True client_logger.info(f"Waiting for server to be healthy at {self.server_address}/health") for delay in [*self._health_retry_delays, 0.0]: try: async with session.get(f"{self.server_address}/health") as r: if r.status == 200: client_logger.info(f"Server is healthy at {self.server_address}/health") return True except Exception: # swallow and retry if delay > 0.0: client_logger.warning(f"Server is not healthy yet. Retrying in {delay} seconds.") if delay > 0.0: await asyncio.sleep(delay) client_logger.error( f"Server is not healthy at {self.server_address}/health after {len(self._health_retry_delays)} retry attempts" ) return False async def _request_json( self, method: Literal["get", "post"], path: str, *, json: Any | None = None, params: Mapping[str, Any] | Sequence[Tuple[str, Any]] | None = None, ) -> Any: """ Make an HTTP request with: 1) First attempt. 2) On network/session failures: probe /health until back, then retry according to self._retry_delays. 3) On 4xx (e.g., 400 set by server exception handler): do not retry. Returns parsed JSON (or raw JSON scalar like int). Raises the last exception if all retries fail. """ session = await self._get_session() url = f"{self.server_address}{path if path.startswith('/') else '/'+path}" # attempt 0 is immediate, then follow retry schedule attempts = (0.0,) + self._retry_delays last_exc: Exception | None = None for delay in attempts: if delay: client_logger.info(f"Waiting {delay} seconds before retrying {method}: {path}") await asyncio.sleep(delay) try: http_call = getattr(session, method) async with http_call(url, json=json, params=params) as resp: resp.raise_for_status() return await resp.json() except aiohttp.ClientResponseError as cre: # Respect app-level 4xx as final # 4xx => application issue; do not retry (except 408 which is transient) client_logger.debug(f"ClientResponseError ({method} {path}): {cre.status} {cre.message}", exc_info=True) if 400 <= cre.status < 500 and cre.status != 408: raise # 5xx and others will be retried below if they raise last_exc = cre client_logger.info(f"5xx and other status codes will be retried. Retrying the request {method}: {path}") # before next retry, ensure server is healthy if not await self._wait_until_healthy(session): break # server is not healthy, do not retry except ( aiohttp.ServerDisconnectedError, aiohttp.ClientConnectorError, aiohttp.ClientOSError, asyncio.TimeoutError, ) as net_exc: # Network/session issue: probe health before retrying client_logger.debug(f"Network/session issue ({method} {path}): {net_exc}", exc_info=True) last_exc = net_exc client_logger.info(f"Network/session issue: {net_exc} - will retry the request {method}: {path}") if not await self._wait_until_healthy(session): break # server is not healthy, do not retry # exhausted retries assert last_exc is not None raise last_exc async def close(self): """Close the HTTP session.""" with self._lock: sessions = list(self._sessions.values()) self._sessions.clear() # close them on their own loops to avoid warnings async def _close(sess: aiohttp.ClientSession): if not sess.closed: await sess.close() # If called from one loop, best-effort close here. for s in sessions: try: await _close(s) except RuntimeError: # If created on a different loop/thread, schedule a thread-safe close # Fallback: close without awaiting (library tolerates it in practice), # or keep a per-loop shutdown hook where they were created. pass async def start_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, worker_id: Optional[str] = None, ) -> AttemptedRollout: data = await self._request_json( "post", "/rollouts", json=RolloutRequest( input=input, mode=mode, resources_id=resources_id, config=config, metadata=metadata, worker_id=worker_id, ).model_dump(exclude_none=False), ) return AttemptedRollout.model_validate(data) async def enqueue_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: request_body = EnqueueManyRolloutsRequest( rollouts=[ EnqueueRolloutRequest( input=input, mode=mode, resources_id=resources_id, config=config, metadata=metadata, ) ] ).model_dump(exclude_none=False) data = await self._request_json( "post", "/queues/rollouts/enqueue", json=request_body, ) if not data: raise RuntimeError("enqueue_rollout returned no rollouts") return Rollout.model_validate(data[0]) async def enqueue_many_rollouts(self, rollouts: Sequence[EnqueueRolloutRequest]) -> Sequence[Rollout]: if not rollouts: return [] request_body = EnqueueManyRolloutsRequest(rollouts=list(rollouts)).model_dump(exclude_none=False) data = await self._request_json( "post", "/queues/rollouts/enqueue", json=request_body, ) return [Rollout.model_validate(entry) for entry in data] async def _dequeue_batch( self, *, limit: int, worker_id: Optional[str], ) -> List[AttemptedRollout]: if limit <= 0: return [] session = await self._get_session() url = f"{self.server_address}/queues/rollouts/dequeue" payload: Dict[str, Any] = {"limit": limit} if worker_id is not None: payload["worker_id"] = worker_id try: async with session.post(url, json=payload) as resp: resp.raise_for_status() data = await resp.json() self._dequeue_was_successful = True return [AttemptedRollout.model_validate(item) for item in data] except Exception as e: if self._dequeue_was_successful: if self._dequeue_first_unsuccessful: client_logger.warning(f"dequeue_rollout failed with exception: {e}") self._dequeue_first_unsuccessful = False client_logger.debug("dequeue_rollout failed with exception. Details:", exc_info=True) # Else ignore the exception because the server is not ready yet return [] async def dequeue_rollout(self, worker_id: Optional[str] = None) -> Optional[AttemptedRollout]: """ Dequeue a rollout from the server queue. Returns: AttemptedRollout if a rollout is available, None if queue is empty. Note: This method does NOT retry on failures. If any exception occurs (network error, server error, etc.), it logs the error and returns None immediately. """ attempts = await self._dequeue_batch(limit=1, worker_id=worker_id) return attempts[0] if attempts else None async def dequeue_many_rollouts( self, *, limit: int = 1, worker_id: Optional[str] = None, ) -> Sequence[AttemptedRollout]: return await self._dequeue_batch(limit=limit, worker_id=worker_id) async def start_attempt(self, rollout_id: str, worker_id: Optional[str] = None) -> AttemptedRollout: payload = {"worker_id": worker_id} if worker_id is not None else None data = await self._request_json( "post", f"/rollouts/{rollout_id}/attempts", json=payload, ) return AttemptedRollout.model_validate(data) async def query_rollouts( self, *, status_in: Optional[Sequence[RolloutStatus]] = None, rollout_id_in: Optional[Sequence[str]] = None, rollout_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, status: Optional[Sequence[RolloutStatus]] = None, rollout_ids: Optional[Sequence[str]] = None, ) -> PaginatedResult[Union[AttemptedRollout, Rollout]]: resolved_status = status_in if status_in is not None else status resolved_rollout_ids = rollout_id_in if rollout_id_in is not None else rollout_ids payload: Dict[str, Any] = { "limit": limit, "offset": offset, } if resolved_status is not None: payload["status_in"] = resolved_status if resolved_rollout_ids is not None: payload["rollout_id_in"] = resolved_rollout_ids if rollout_id_contains is not None: payload["rollout_id_contains"] = rollout_id_contains payload["filter_logic"] = filter_logic if sort_by is not None: payload["sort_by"] = sort_by payload["sort_order"] = sort_order data = await self._request_json("post", "/rollouts/search", json=payload) items = [ ( AttemptedRollout.model_validate(item) if isinstance(item, dict) and "attempt" in item else Rollout.model_validate(item) ) for item in data["items"] ] return PaginatedResult(items=items, limit=data["limit"], offset=data["offset"], total=data["total"]) async def query_attempts( self, rollout_id: str, *, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Attempt]: payload: Dict[str, Any] = { "limit": limit, "offset": offset, } if sort_by is not None: payload["sort_by"] = sort_by payload["sort_order"] = sort_order data = await self._request_json("post", f"/rollouts/{rollout_id}/attempts/search", json=payload) items = [Attempt.model_validate(item) for item in data["items"]] return PaginatedResult(items=items, limit=data["limit"], offset=data["offset"], total=data["total"]) async def get_latest_attempt(self, rollout_id: str) -> Optional[Attempt]: """ Get the latest attempt for a rollout. Args: rollout_id: ID of the rollout to query. Returns: Attempt if found, None if not found or if all retries are exhausted. Note: This method retries on transient failures (network errors, 5xx status codes). If all retries fail, it logs the error and returns None instead of raising an exception. """ try: data = await self._request_json("get", f"/rollouts/{rollout_id}/attempts/latest") return Attempt.model_validate(data) if data else None except Exception as e: client_logger.error( f"get_latest_attempt failed after all retries for rollout_id={rollout_id}: {e}", exc_info=True ) return None async def get_rollout_by_id(self, rollout_id: str) -> Optional[Rollout]: """ Get a rollout by its ID. Args: rollout_id: ID of the rollout to retrieve. Returns: Rollout if found, None if not found or if all retries are exhausted. Note: This method retries on transient failures (network errors, 5xx status codes). If all retries fail, it logs the error and returns None instead of raising an exception. """ try: data = await self._request_json("get", f"/rollouts/{rollout_id}") if data is None: return None elif isinstance(data, dict) and "attempt" in data: return AttemptedRollout.model_validate(data) else: return Rollout.model_validate(data) except Exception as e: client_logger.error( f"get_rollout_by_id failed after all retries for rollout_id={rollout_id}: {e}", exc_info=True ) return None async def query_resources( self, *, resources_id: Optional[str] = None, resources_id_contains: Optional[str] = None, sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[ResourcesUpdate]: """ List all resource snapshots stored on the server. """ params: List[Tuple[str, Any]] = [ ("limit", limit), ("offset", offset), ] if sort_by is not None: params.append(("sort_by", sort_by)) params.append(("sort_order", sort_order)) if resources_id is not None: params.append(("resources_id", resources_id)) if resources_id_contains is not None: params.append(("resources_id_contains", resources_id_contains)) data = await self._request_json("get", "/resources", params=params) items = [ResourcesUpdate.model_validate(item) for item in data["items"]] return PaginatedResult(items=items, limit=data["limit"], offset=data["offset"], total=data["total"]) async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: data = await self._request_json("post", "/resources", json=TypeAdapter(NamedResources).dump_python(resources)) return ResourcesUpdate.model_validate(data) async def update_resources(self, resources_id: str, resources: NamedResources) -> ResourcesUpdate: data = await self._request_json( "post", f"/resources/{resources_id}", json=TypeAdapter(NamedResources).dump_python(resources) ) return ResourcesUpdate.model_validate(data) async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: """ Get resources by their ID. Args: resources_id: ID of the resources to retrieve. Returns: ResourcesUpdate if found, None if not found or if all retries are exhausted. Note: This method retries on transient failures (network errors, 5xx status codes). If all retries fail, it logs the error and returns None instead of raising an exception. """ try: data = await self._request_json("get", f"/resources/{resources_id}") return ResourcesUpdate.model_validate(data) if data else None except Exception as e: client_logger.error( f"get_resources_by_id failed after all retries for resources_id={resources_id}: {e}", exc_info=True ) return None async def get_latest_resources(self) -> Optional[ResourcesUpdate]: """ Get the latest resources. Returns: ResourcesUpdate if found, None if not found or if all retries are exhausted. Note: This method retries on transient failures (network errors, 5xx status codes). If all retries fail, it logs the error and returns None instead of raising an exception. """ try: data = await self._request_json("get", "/resources/latest") return ResourcesUpdate.model_validate(data) if data else None except Exception as e: client_logger.error(f"get_latest_resources failed after all retries: {e}", exc_info=True) return None async def add_span(self, span: Span) -> Optional[Span]: data = await self._request_json("post", "/spans", json=span.model_dump(mode="json")) return Span.model_validate(data) if data is not None else None async def add_many_spans(self, spans: Sequence[Span]) -> Sequence[Span]: result: List[Span] = [] for span in spans: ret = await self.add_span(span) if ret is not None: result.append(ret) return result async def get_next_span_sequence_id(self, rollout_id: str, attempt_id: str) -> int: data = await self._request_json( "post", "/spans/next", json=NextSequenceIdRequest(rollout_id=rollout_id, attempt_id=attempt_id).model_dump(), ) response = NextSequenceIdResponse.model_validate(data) return response.sequence_id async def get_many_span_sequence_ids(self, rollout_attempt_ids: Sequence[Tuple[str, str]]) -> Sequence[int]: return [ await self.get_next_span_sequence_id(rollout_id, attempt_id) for rollout_id, attempt_id in rollout_attempt_ids ] async def add_otel_span( self, rollout_id: str, attempt_id: str, readable_span: ReadableSpan, sequence_id: int | None = None, ) -> Optional[Span]: # unchanged logic, now benefits from retries inside add_span/get_next_span_sequence_id if sequence_id is None: sequence_id = await self.get_next_span_sequence_id(rollout_id, attempt_id) span = Span.from_opentelemetry( readable_span, rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, ) return await self.add_span(span) async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: """Wait for rollouts to complete. Args: rollout_ids: List of rollout IDs to wait for. timeout: Timeout in seconds. If not None, the method will raise a ValueError if the timeout is greater than 0.1 seconds. Returns: List of rollouts that are completed. """ if timeout is not None and timeout > 0.1: raise ValueError( "Timeout must be less than 0.1 seconds in LightningStoreClient to avoid blocking the event loop" ) data = await self._request_json( "post", "/waits/rollouts", json=WaitForRolloutsRequest(rollout_ids=rollout_ids, timeout=timeout).model_dump(), ) return [Rollout.model_validate(item) for item in data] async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, *, trace_id: Optional[str] = None, trace_id_contains: Optional[str] = None, span_id: Optional[str] = None, span_id_contains: Optional[str] = None, parent_id: Optional[str] = None, parent_id_contains: Optional[str] = None, name: Optional[str] = None, name_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", limit: int = -1, offset: int = 0, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", ) -> PaginatedResult[Span]: payload: Dict[str, Any] = {"rollout_id": rollout_id, "limit": limit, "offset": offset} if attempt_id is not None: payload["attempt_id"] = attempt_id if trace_id is not None: payload["trace_id"] = trace_id if trace_id_contains is not None: payload["trace_id_contains"] = trace_id_contains if span_id is not None: payload["span_id"] = span_id if span_id_contains is not None: payload["span_id_contains"] = span_id_contains if parent_id is not None: payload["parent_id"] = parent_id if parent_id_contains is not None: payload["parent_id_contains"] = parent_id_contains if name is not None: payload["name"] = name if name_contains is not None: payload["name_contains"] = name_contains payload["filter_logic"] = filter_logic if sort_by is not None: payload["sort_by"] = sort_by payload["sort_order"] = sort_order data = await self._request_json("post", "/spans/search", json=payload) items = [Span.model_validate(item) for item in data["items"]] return PaginatedResult(items=items, limit=data["limit"], offset=data["offset"], total=data["total"]) async def update_rollout( self, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Rollout: payload: Dict[str, Any] = {} if not isinstance(input, Unset): payload["input"] = input if not isinstance(mode, Unset): payload["mode"] = mode if not isinstance(resources_id, Unset): payload["resources_id"] = resources_id if not isinstance(status, Unset): payload["status"] = status if not isinstance(config, Unset): payload["config"] = config.model_dump() if not isinstance(metadata, Unset): payload["metadata"] = metadata data = await self._request_json("post", f"/rollouts/{rollout_id}", json=payload) return Rollout.model_validate(data) async def update_attempt( self, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Attempt: payload: Dict[str, Any] = {} if not isinstance(status, Unset): payload["status"] = status if not isinstance(worker_id, Unset): payload["worker_id"] = worker_id if not isinstance(last_heartbeat_time, Unset): payload["last_heartbeat_time"] = last_heartbeat_time if not isinstance(metadata, Unset): payload["metadata"] = metadata data = await self._request_json( "post", f"/rollouts/{rollout_id}/attempts/{attempt_id}", json=payload, ) return Attempt.model_validate(data) async def query_workers( self, *, status_in: Optional[Sequence[WorkerStatus]] = None, worker_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Worker]: payload: Dict[str, Any] = {} if status_in is not None: payload["status_in"] = status_in if worker_id_contains is not None: payload["worker_id_contains"] = worker_id_contains payload["filter_logic"] = filter_logic if sort_by is not None: payload["sort_by"] = sort_by payload["sort_order"] = sort_order data = await self._request_json("post", "/workers/search", json=payload) items = [Worker.model_validate(item) for item in data.get("items", [])] return PaginatedResult(items=items, limit=data["limit"], offset=data["offset"], total=data["total"]) async def get_worker_by_id(self, worker_id: str) -> Optional[Worker]: data = await self._request_json("get", f"/workers/{worker_id}") if data is None: return None return Worker.model_validate(data) async def update_worker( self, worker_id: str, heartbeat_stats: Dict[str, Any] | Unset = UNSET, ) -> Worker: payload: Dict[str, Any] = {} if not isinstance(heartbeat_stats, Unset): payload["heartbeat_stats"] = heartbeat_stats json_payload = payload if payload else None data = await self._request_json("post", f"/workers/{worker_id}", json=json_payload) return Worker.model_validate(data) ================================================ FILE: agentlightning/store/collection/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .base import ( AtomicLabels, AtomicMode, Collection, FilterOptions, KeyValue, LightningCollections, PaginatedResult, Queue, SortOptions, ) from .memory import DequeBasedQueue, DictBasedKeyValue, InMemoryLightningCollections, ListBasedCollection __all__ = [ "AtomicLabels", "AtomicMode", "Collection", "Queue", "KeyValue", "FilterOptions", "SortOptions", "PaginatedResult", "LightningCollections", "ListBasedCollection", "DequeBasedQueue", "DictBasedKeyValue", "InMemoryLightningCollections", ] ================================================ FILE: agentlightning/store/collection/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import functools import time from contextlib import asynccontextmanager from numbers import Real from typing import ( TYPE_CHECKING, Any, AsyncContextManager, Awaitable, Callable, Dict, Generic, List, Literal, Mapping, MutableMapping, Optional, Sequence, Tuple, Type, TypeGuard, TypeVar, cast, ) from agentlightning.store.utils import LATENCY_BUCKETS from agentlightning.utils.metrics import MetricsBackend if TYPE_CHECKING: from typing import Self from agentlightning.types import ( Attempt, FilterField, FilterOptions, PaginatedResult, ResourcesUpdate, Rollout, SortOptions, Span, Worker, ) T = TypeVar("T") # Recommended to be a BaseModel K = TypeVar("K") V = TypeVar("V") T_callable = TypeVar("T_callable", bound=Callable[..., Any]) AtomicMode = Literal["r", "w", "rw"] """What is expected within the atomic context. Can be "read", "write", or "read-write".""" AtomicLabels = Literal[ "rollouts", "attempts", "spans", "resources", "workers", "rollout_queue", "span_sequence_ids", "generic" ] """Labels for atomic operations. These labels are used to identify the collections that are affected by the atomic operation. The `generic` label is used to identify atomic operations that are not associated with any specific collection. """ def resolve_error_type(exc: BaseException | None) -> str: if exc is None: return "N/A" try: from .mongo import resolve_mongo_error_type error_type = resolve_mongo_error_type(exc) if error_type is not None: return error_type except ImportError: # If the mongo backend is not available, fall back to using the exception's class name. pass return exc.__class__.__name__ def tracked(operation: str): """Decorator to track the execution of the decorated method.""" def decorator(func: T_callable) -> T_callable: @functools.wraps(func) async def wrapper(self: TrackedCollection, *args: Any, **kwargs: Any) -> Any: async with self.tracking_context(operation, self.collection_name): return await func(self, *args, **kwargs) return cast(T_callable, wrapper) return decorator def ensure_numeric(value: Any, *, description: str) -> TypeGuard[Real]: """Validate that *value* behaves like a real number. Returns true or crashes. """ if isinstance(value, bool): raise TypeError(f"{description} must be numeric; got bool") if not isinstance(value, Real): raise TypeError(f"{description} must be numeric; got {type(value).__name__}") return True class DuplicatedPrimaryKeyError(ValueError): """Error raised when a duplicate key is encountered.""" pass class TrackedCollection: """An object that can be tracked by the metrics backend.""" def __init__(self, tracker: MetricsBackend | None = None): self._tracker = tracker @property def tracker(self) -> MetricsBackend | None: return self._tracker @property def collection_name(self) -> str: """The identifier of the collection.""" raise NotImplementedError() @property def extra_tracking_labels(self) -> Mapping[str, Any]: """Extra labels to add to the tracking context.""" return {} @asynccontextmanager async def tracking_context(self, operation: str, collection: str): """Context manager to track the execution of the decorated method. Args: operation: The operation to track. collection: The collection to track. """ if self._tracker is None: # no-op context manager yield else: from agentlightning.store.collection_based import get_current_store_methods # Enable tracking start_time = time.perf_counter() status: str = "OK" public_store_method, private_store_method = get_current_store_methods() try: yield except BaseException as exc: status = resolve_error_type(exc) raise finally: elapsed = time.perf_counter() - start_time await self._tracker.inc_counter( # pyright: ignore[reportPrivateUsage] "agl.collections.total", labels={ "store_pubmeth": public_store_method, "store_privmeth": private_store_method, "operation": operation, "collection": collection, "status": status, **self.extra_tracking_labels, }, ) await self._tracker.observe_histogram( # pyright: ignore[reportPrivateUsage] "agl.collections.latency", value=elapsed, labels={ "store_pubmeth": public_store_method, "store_privmeth": private_store_method, "operation": operation, "collection": collection, "status": status, **self.extra_tracking_labels, }, ) class Collection(TrackedCollection, Generic[T]): """Standard collection interface. Behaves like a list of items. Supporting addition, updating, and deletion of items.""" def primary_keys(self) -> Sequence[str]: """Get the primary keys of the collection.""" raise NotImplementedError() def __repr__(self) -> str: return f"<{self.__class__.__name__}[{self.item_type().__name__}]>" def item_type(self) -> Type[T]: """Get the type of the items in the collection.""" raise NotImplementedError() async def size(self) -> int: """Get the number of items in the collection.""" raise NotImplementedError() async def query( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, limit: int = -1, offset: int = 0, ) -> PaginatedResult[T]: """Query the collection with the given filters, sort order, and pagination. Args: filter: The filters to apply to the collection. See [`FilterOptions`][agentlightning.FilterOptions]. sort: The options for sorting the collection. See [`SortOptions`][agentlightning.SortOptions]. The field must exist in the model. If field might contain null values, in which case the behavior is undefined (i.e., depending on the implementation). limit: Max number of items to return. Use -1 for "no limit". offset: Number of items to skip from the start of the *matching* items. Returns: PaginatedResult with items, limit, offset, and total matched items. """ raise NotImplementedError() async def get( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, ) -> Optional[T]: """Get the first item that matches the given filters. Args: filter: The filters to apply to the collection. See [`FilterOptions`][agentlightning.store.collection.FilterOptions]. sort: Sort options. See [`SortOptions`][agentlightning.store.collection.SortOptions]. Returns: The first item that matches the given filters, or None if no item matches. """ raise NotImplementedError() async def insert(self, items: Sequence[T]) -> None: """Add the given items to the collection. Raises: ValueError: If an item with the same primary key already exists. """ raise NotImplementedError() async def update(self, items: Sequence[T], update_fields: Sequence[str] | None = None) -> Sequence[T]: """Update the given items in the collection. Args: items: The items to update in the collection. update_fields: The fields to update. If not provided, all fields in the type will be updated. Only applicable if the item type is a Pydantic BaseModel. Raises: ValueError: If an item with the primary keys does not exist. Returns: The items that were updated. """ raise NotImplementedError() async def upsert(self, items: Sequence[T], update_fields: Sequence[str] | None = None) -> Sequence[T]: """Upsert the given items into the collection. If the items with the same primary keys already exist, they will be updated. Otherwise, they will be inserted. The operation has three semantics configurable via `update_fields`: - `update_or_insert` via `collection.upsert(items, update_fields=["status", "updated_at"])`. If the item with the same primary keys already exists, only the specified fields will be updated. Otherwise, the item will be inserted. - `get_or_insert` via `collection.upsert(items, update_fields=[])`. If the item with the same primary keys already exists, the item will be left unchanged. Otherwise, the item will be inserted. - `replace_ish` via `collection.upsert(items)`. If the item with the same primary keys already exists, all fields from the item will be set. Otherwise, the item will be inserted. Returns: The items that were upserted. """ raise NotImplementedError() async def delete(self, items: Sequence[T]) -> None: """Delete the given items from the collection. Args: items: The items to delete from the collection. Raises: ValueError: If the items with the primary keys to be deleted do not exist. """ raise NotImplementedError() class Queue(TrackedCollection, Generic[T]): """Behaves like a deque. Supporting appending items to the end and popping items from the front.""" def __repr__(self) -> str: return f"<{self.__class__.__name__}[{self.item_type().__name__}]>" def item_type(self) -> Type[T]: """Get the type of the items in the queue.""" raise NotImplementedError() async def has(self, item: T) -> bool: """Check if the given item is in the queue.""" raise NotImplementedError() async def enqueue(self, items: Sequence[T]) -> Sequence[T]: """Append the given items to the end of the queue. Args: items: The items to append to the end of the queue. Returns: The items that were appended to the end of the queue. """ raise NotImplementedError() async def dequeue(self, limit: int = 1) -> Sequence[T]: """Pop the given number of items from the front of the queue. Args: limit: The number of items to pop from the front of the queue. Returns: The items that were popped from the front of the queue. If there are less than `limit` items in the queue, the remaining items will be returned. """ raise NotImplementedError() async def peek(self, limit: int = 1) -> Sequence[T]: """Peek the given number of items from the front of the queue. Args: limit: The number of items to peek from the front of the queue. Returns: The items that were peeked from the front of the queue. If there are less than `limit` items in the queue, the remaining items will be returned. """ raise NotImplementedError() async def size(self) -> int: """Get the number of items in the queue.""" raise NotImplementedError() class KeyValue(TrackedCollection, Generic[K, V]): """Behaves like a dictionary. Supporting addition, updating, and deletion of items.""" def __repr__(self) -> str: return f"<{self.__class__.__name__}>" async def has(self, key: K) -> bool: """Check if the given key is in the dictionary.""" raise NotImplementedError() async def get(self, key: K, default: V | None = None) -> V | None: """Get the value for the given key, or the default value if the key is not found.""" raise NotImplementedError() async def set(self, key: K, value: V) -> None: """Set the value for the given key.""" raise NotImplementedError() async def inc(self, key: K, amount: V) -> V: """Increase the numeric value for the given key by `amount` and return the new value. Raises: TypeError: If the existing value or `amount` is not numeric. """ raise NotImplementedError() async def chmax(self, key: K, value: V) -> V: """Set the value for the given key to the maximum of the current and new value. Raises: TypeError: If the existing value or `value` is not numeric. """ raise NotImplementedError() async def pop(self, key: K, default: V | None = None) -> V | None: """Pop the value for the given key, or the default value if the key is not found.""" raise NotImplementedError() async def size(self) -> int: """Get the number of items in the dictionary.""" raise NotImplementedError() class LightningCollections(TrackedCollection): """Collections of rollouts, attempts, spans, resources, and workers. [LightningStore][agentlightning.LightningStore] implementations can use this as a storage base to implement the store API. """ def __init__(self, tracker: MetricsBackend | None = None, extra_labels: Optional[Sequence[str]] = None): super().__init__(tracker=tracker) self.register_collection_metrics(extra_labels) def register_collection_metrics(self, extra_labels: Optional[Sequence[str]] = None) -> None: if self._tracker is None: return labels = ["store_pubmeth", "operation", "collection", "store_privmeth", "status"] if extra_labels is not None: labels.extend(extra_labels) self._tracker.register_histogram( "agl.collections.latency", labels, buckets=LATENCY_BUCKETS, group_level=2, ) self._tracker.register_counter("agl.collections.total", labels, group_level=2) @property def tracker(self) -> MetricsBackend | None: return self._tracker @property def rollouts(self) -> Collection[Rollout]: """Collections of rollouts.""" raise NotImplementedError() @property def attempts(self) -> Collection[Attempt]: """Collections of attempts.""" raise NotImplementedError() @property def spans(self) -> Collection[Span]: """Collections of spans.""" raise NotImplementedError() @property def resources(self) -> Collection[ResourcesUpdate]: """Collections of resources.""" raise NotImplementedError() @property def workers(self) -> Collection[Worker]: """Collections of workers.""" raise NotImplementedError() @property def rollout_queue(self) -> Queue[str]: """Queue of rollouts (tasks).""" raise NotImplementedError() @property def span_sequence_ids(self) -> KeyValue[str, int]: """Dictionary (counter) of span sequence IDs.""" raise NotImplementedError() def atomic( self, *, mode: AtomicMode = "rw", snapshot: bool = False, commit: bool = False, labels: Optional[Sequence[AtomicLabels]] = None, **kwargs: Any, ) -> AsyncContextManager[Self]: """Perform a atomic operation on the collections. Subclass may use args and kwargs to support multiple levels of atomicity. The arguments can be seen as tags. They only imply the behavior of the operation, not the implementation. Args: mode: The mode of atomicity. See [`AtomicMode`][agentlightning.store.collection.AtomicMode]. snapshot: Enable read snapshot for repeatable reads. Data consistency is guaranteed. The real behavior is implementation-dependent. commit: Enable commitment for write operations. Unsuccessful operations will be rolled back depending on the implementation. Recommend to use [`execute()`][agentlightning.store.collection.LightningCollections.execute] for this level to enable automatic retries. Remember that the real behavior is implementation-dependent. labels: Labels to add to the atomic operation (commonly used as lock names or collection names). **kwargs: Keyword arguments to pass to the operation. """ raise NotImplementedError() async def execute( self, callback: Callable[[Self], Awaitable[T]], *, mode: AtomicMode = "rw", snapshot: bool = False, commit: bool = False, labels: Optional[Sequence[AtomicLabels]] = None, **kwargs: Any, ) -> T: """Execute the given callback within an atomic operation. Retry on transient errors is implied. See [`atomic()`][agentlightning.store.collection.LightningCollections.atomic] for more details. """ async with self.atomic(mode=mode, snapshot=snapshot, commit=commit, labels=labels, **kwargs) as collections: return await callback(collections) FilterMap = Mapping[str, FilterField] def merge_must_filters(target: MutableMapping[str, FilterField], definition: Any) -> None: """Normalize a `_must` filter group into the provided mapping. Mainly for validation purposes. """ if definition is None: return entries: List[Mapping[str, FilterField]] = [] if isinstance(definition, Mapping): entries.append(cast(Mapping[str, FilterField], definition)) elif isinstance(definition, Sequence) and not isinstance(definition, (str, bytes)): for entry in definition: # type: ignore if not isinstance(entry, Mapping): raise TypeError("Each `_must` entry must be a mapping of field names to operators") entries.append(cast(Mapping[str, FilterField], entry)) else: raise TypeError("`_must` filters must be provided as a mapping or sequence of mappings") for entry in entries: for field_name, ops in entry.items(): existing = target.get(field_name, {}) merged_ops: Dict[str, Any] = dict(existing) for op_name, expected in ops.items(): if op_name in merged_ops: raise ValueError(f"Duplicate operator '{op_name}' for field '{field_name}' in must filters") merged_ops[op_name] = expected target[field_name] = cast(FilterField, merged_ops) def normalize_filter_options( filter_options: Optional[FilterOptions], ) -> Tuple[Optional[FilterMap], Optional[FilterMap], Literal["and", "or"]]: """Convert FilterOptions to the internal structure and resolve aggregate logic.""" if not filter_options: return None, None, "and" aggregate = cast(Literal["and", "or"], filter_options.get("_aggregate", "and")) if aggregate not in ("and", "or"): raise ValueError(f"Unsupported filter aggregate '{aggregate}'") # Extract normalized filters and must filters from the filter options. normalized: Dict[str, FilterField] = {} must_filters: Dict[str, FilterField] = {} for field_name, ops in filter_options.items(): if field_name == "_aggregate": continue if field_name == "_must": merge_must_filters(must_filters, ops) continue normalized[field_name] = cast(FilterField, dict(ops)) # type: ignore return (normalized or None, must_filters or None, aggregate) def resolve_sort_options(sort: Optional[SortOptions]) -> Tuple[Optional[str], Literal["asc", "desc"]]: """Extract sort field/order from the caller-provided SortOptions.""" if not sort: return None, "asc" sort_name = sort.get("name") if not sort_name: raise ValueError("Sort options must include a 'name' field") sort_order = sort.get("order", "asc") if sort_order not in ("asc", "desc"): raise ValueError(f"Unsupported sort order '{sort_order}'") return sort_name, sort_order ================================================ FILE: agentlightning/store/collection/memory.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging import uuid import weakref from collections import deque from contextlib import AsyncExitStack, asynccontextmanager from typing import ( Any, Deque, Dict, Iterable, List, Literal, Mapping, MutableMapping, Optional, Sequence, Tuple, Type, TypeVar, Union, cast, ) import aiologic from pydantic import BaseModel from agentlightning.types import ( Attempt, FilterField, FilterOptions, PaginatedResult, ResourcesUpdate, Rollout, SortOptions, Span, Worker, ) from agentlightning.utils.metrics import MetricsBackend from .base import ( AtomicLabels, AtomicMode, Collection, DuplicatedPrimaryKeyError, FilterMap, KeyValue, LightningCollections, Queue, ensure_numeric, normalize_filter_options, resolve_sort_options, tracked, ) T = TypeVar("T") # Recommended to be a BaseModel, not a dict K = TypeVar("K") V = TypeVar("V") logger = logging.getLogger(__name__) # Nested structure type: # dict[pk1] -> dict[pk2] -> ... -> item ListBasedCollectionItemType = Union[ Dict[Any, "ListBasedCollectionItemType[T]"], # intermediate node Dict[Any, T], # leaf node dictionary ] MutationMode = Literal["insert", "update", "upsert", "delete"] def _item_matches_filters( item: object, filters: Optional[FilterMap], filter_logic: Literal["and", "or"], must_filters: Optional[FilterMap] = None, ) -> bool: """Check whether an item matches the provided filter definition. Filter format: ```json { "_aggregate": "or", "field_name": { "exact": , "within": , "contains": , }, ... } ``` Operators within the same field are stored in a unified pool and combined using a universal logical operator. """ if must_filters and not _item_matches_filters(item, must_filters, "and"): return False if not filters: return True all_conditions_match: List[bool] = [] for field_name, ops in filters.items(): item_value = getattr(item, field_name, None) for op_name, expected in ops.items(): # Ignore no-op filters if expected is None: continue if op_name == "exact": all_conditions_match.append(item_value == expected) elif op_name == "within": try: all_conditions_match.append(item_value in expected) # type: ignore[arg-type] except TypeError: all_conditions_match.append(False) elif op_name == "contains": if item_value is None: all_conditions_match.append(False) elif isinstance(item_value, str) and isinstance(expected, str): all_conditions_match.append(expected in item_value) else: # Fallback: treat as generic iterable containment. try: all_conditions_match.append(expected in item_value) # type: ignore[arg-type] except TypeError: all_conditions_match.append(False) else: raise ValueError(f"Unsupported filter operator '{op_name}' for field '{field_name}'") return all(all_conditions_match) if filter_logic == "and" else any(all_conditions_match) def _get_sort_value(item: object, sort_by: str) -> Any: """Get a sort key for the given item/field. - If the field name ends with '_time', values are treated as comparable timestamps. - For other fields we try to infer a safe default from the Pydantic model annotation. """ value = getattr(item, sort_by, None) if sort_by.endswith("_time"): # For *_time fields, push missing values to the end. return float("inf") if value is None else value if value is None: # Introspect model field type to choose a reasonable default for None. model_fields = getattr(item.__class__, "model_fields", {}) if sort_by not in model_fields: raise ValueError( f"Failed to sort items by '{sort_by}': field does not exist " f"on {item.__class__.__name__}" ) field_type_str = str(model_fields[sort_by].annotation) if "str" in field_type_str or "Literal" in field_type_str: return "" if "int" in field_type_str: return 0 if "float" in field_type_str: return 0.0 raise ValueError(f"Failed to sort items by '{sort_by}': unsupported field type {field_type_str!r}") return value class ListBasedCollection(Collection[T]): """In-memory implementation of Collection using a nested dict for O(1) primary-key lookup. The internal structure is: { pk1_value: { pk2_value: { ... pkN_value: item } } } where the nesting depth equals the number of primary keys. Sorting behavior: 1. If no sort_by is provided, the items are returned in the order of insertion. 2. If sort_by is provided, the items are sorted by the value of the sort_by field. 3. If the sort_by field is a timestamp, the null values are treated as infinity. 4. If the sort_by field is not a timestamp, the null values are treated as empty string if the field is str-like, 0 if the field is int-like, 0.0 if the field is float-like. """ def __init__( self, items: List[T], item_type: Type[T], primary_keys: Sequence[str], id: Optional[str] = None, tracker: Optional[MetricsBackend] = None, ): super().__init__(tracker=tracker) if not primary_keys: raise ValueError("primary_keys must be non-empty") self._id = id if id is not None else str(uuid.uuid4()) self._items: Dict[Any, Any] = {} self._size: int = 0 if issubclass(item_type, dict): raise TypeError(f"Expect item to be not a dict, got {item_type.__name__}") self._item_type: Type[T] = item_type self._primary_keys: Tuple[str, ...] = tuple(primary_keys) # Pre-populate the collection with the given items. for item in items or []: self._mutate_single(item, mode="insert") @property def collection_name(self) -> str: return self._id def primary_keys(self) -> Sequence[str]: """Return the primary key field names for this collection.""" return self._primary_keys def item_type(self) -> Type[T]: """Return the Pydantic model type of items stored in this collection.""" return self._item_type async def size(self) -> int: """Return the number of items stored in the collection.""" return self._size def __repr__(self) -> str: return f"<{self.__class__.__name__}[{self.item_type().__name__}] ({self._size})>" # ------------------------------------------------------------------------- # Internal helpers # ------------------------------------------------------------------------- def _ensure_item_type(self, item: T) -> None: """Validate that the item matches the declared item_type.""" if not isinstance(item, self._item_type): raise TypeError(f"Expected item of type {self._item_type.__name__}, " f"got {type(item).__name__}") def _extract_primary_key_values(self, item: T) -> Tuple[Any, ...]: """Extract the primary key values from an item. Raises: ValueError: If any primary key is missing on the item. """ values: List[Any] = [] for key in self._primary_keys: if not hasattr(item, key): raise ValueError(f"Item {item} does not have primary key field '{key}'") values.append(getattr(item, key)) return tuple(values) def _render_key_values(self, key_values: Sequence[Any]) -> str: return ", ".join(f"{name}={value!r}" for name, value in zip(self._primary_keys, key_values)) def _locate_node( self, key_values: Sequence[Any], create_missing: bool, ) -> Tuple[MutableMapping[Any, Any], Any]: """Locate the parent mapping and final key for an item path. Args: key_values: The sequence of primary key values. create_missing: Whether to create intermediate dictionaries as needed. Returns: (parent_mapping, final_key) Raises: KeyError: If the path does not exist and create_missing is False. ValueError: If the internal structure is corrupted (non-dict where dict is expected). """ if not key_values: raise ValueError("key_values must be non-empty") current: MutableMapping[Any, Any] = self._items for idx, value in enumerate(key_values): is_last = idx == len(key_values) - 1 if is_last: # At the final level, current[value] is the item (or will be). return current, value # type: ignore # Intermediate level: current[value] must be a dict. if value not in current: if not create_missing: raise KeyError(f"Path does not exist for given primary keys: {self._render_key_values(key_values)}") current[value] = {} next_node = current[value] # type: ignore if not isinstance(next_node, dict): raise ValueError(f"Internal structure corrupted: expected dict, got {type(next_node)!r}") # type: ignore current = next_node # type: ignore # We should always return inside the loop. raise RuntimeError("Unreachable") def _mutate_single(self, item: T, mode: MutationMode, update_fields: Sequence[str] | None = None) -> Optional[T]: """Core mutation logic shared by insert, update, upsert, and delete.""" self._ensure_item_type(item) key_values = self._extract_primary_key_values(item) if mode in ("insert", "upsert"): parent, final_key = self._locate_node(key_values, create_missing=True) exists = final_key in parent if mode == "insert": if exists: raise DuplicatedPrimaryKeyError( f"Item already exists with primary key(s): {self._render_key_values(key_values)}" ) parent[final_key] = item self._size += 1 else: # upsert if not exists: self._size += 1 parent[final_key] = item elif update_fields is None: # update_or_insert: update all fields parent[final_key] = item else: if not issubclass(self._item_type, BaseModel): raise TypeError( f"When using update_fields, the item type must be a Pydantic BaseModel, got {self._item_type.__name__}" ) # Try to fetch the existing item existing = parent[final_key] if not isinstance(existing, self._item_type): raise ValueError( f"Internal structure corrupted: expected {self._item_type.__name__}, got {type(existing)!r}" ) if not isinstance(item, self._item_type): raise TypeError( f"When using update_fields, the item type must be a Pydantic BaseModel, got {type(item).__name__}" ) parent[final_key] = parent[final_key].model_copy( update={field: getattr(item, field) for field in update_fields} ) return parent[final_key] elif mode in ("update", "delete"): # For update/delete we must not create missing paths. try: parent, final_key = self._locate_node(key_values, create_missing=False) except KeyError: raise ValueError( f"Item does not exist with primary key(s): {self._render_key_values(key_values)}" ) from None if final_key not in parent: raise ValueError(f"Item does not exist with primary key(s): {self._render_key_values(key_values)}") if mode == "update": if update_fields is None: # replace the entire item parent[final_key] = item else: if not issubclass(self._item_type, BaseModel): raise TypeError( f"When using update_fields, the item type must be a Pydantic BaseModel, got {self._item_type.__name__}" ) if not isinstance(item, self._item_type): raise TypeError( f"When using update_fields, the item type must be a Pydantic BaseModel, got {type(item).__name__}" ) parent[final_key] = parent[final_key].model_copy( update={field: getattr(item, field) for field in update_fields} ) return parent[final_key] else: # delete del parent[final_key] self._size -= 1 else: raise ValueError(f"Unknown mutation mode: {mode}") def _iter_items( self, root: Optional[Mapping[Any, Any]] = None, filters: Optional[FilterMap] = None, must_filters: Optional[FilterMap] = None, filter_logic: Literal["and", "or"] = "and", ) -> Iterable[T]: """Iterate over all items in the nested dictionary structure, optionally applying filters.""" if root is None: root = self._items if not root: return stack: List[Mapping[Any, Any]] = [root] while stack: node = stack.pop() for value in node.values(): # Leaf nodes contain items; intermediate nodes are dicts. if isinstance(value, self._item_type): if _item_matches_filters(value, filters, filter_logic, must_filters): yield value elif isinstance(value, dict): stack.append(value) # type: ignore else: raise ValueError( f"Internal structure corrupted: expected dict or {self._item_type.__name__}, " f"got {type(value)!r}" ) def _iter_matching_items( self, filters: Optional[FilterMap], must_filters: Optional[FilterMap], filter_logic: Literal["and", "or"], ) -> Iterable[T]: """Efficiently iterate over items matching filters, using primary-key prefix when possible.""" # Fast path: when optional filters can't form a prefix, fall back to scanning. if filter_logic != "and" and must_filters is None: return self._iter_items(filters=filters, must_filters=must_filters, filter_logic=filter_logic) # Try to derive a primary-key prefix from exact filters. pk_values_prefix: List[Any] = [] prefix_sources: List[FilterMap] = [] if must_filters: prefix_sources.append(must_filters) if filter_logic == "and" and filters: prefix_sources.append(filters) for pk in self._primary_keys: # combined_ops are: [{"exact": value}, {"within": [...]}, ...] combined_ops: List[FilterField] = [] for source in prefix_sources: field_ops = source.get(pk) # type: ignore[union-attr] if field_ops: combined_ops.append(field_ops) if not combined_ops: break # Only allow a pure {"exact": value} constraint. exact_value: Any | None = None allow_prefix = True for ops in combined_ops: if set(ops.keys()) != {"exact"}: allow_prefix = False break candidate = ops.get("exact") if candidate is None: allow_prefix = False break if exact_value is not None and candidate != exact_value: # Contradictory exact filters mean no items can match. logger.warning(f"Contradictory exact filters for field '{pk}': {exact_value} != {candidate}") return () exact_value = candidate if not allow_prefix: break value = exact_value if value is None: break pk_values_prefix.append(value) if not pk_values_prefix: return self._iter_items(filters=filters, must_filters=must_filters, filter_logic=filter_logic) try: if len(pk_values_prefix) == len(self._primary_keys): # All primary keys specified -> at most a single item. parent, final_key = self._locate_node(pk_values_prefix, create_missing=False) single_item = parent.get(final_key) if isinstance(single_item, self._item_type) and _item_matches_filters( single_item, filters, filter_logic, must_filters, ): return (single_item,) return () else: # Prefix of primary keys specified -> iterate only the subtree below that prefix. parent, final_key = self._locate_node(pk_values_prefix, create_missing=False) subtree = parent.get(final_key) if isinstance(subtree, dict): return self._iter_items( subtree, # type: ignore filters=filters, must_filters=must_filters, filter_logic=filter_logic, ) return () except KeyError: # No items exist for this primary-key prefix. return () @tracked("query") async def query( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, limit: int = -1, offset: int = 0, ) -> PaginatedResult[T]: """Query the collection with filters, sort order, and pagination. Args: filter: Mapping of field name to operator dict along with the optional `_aggregate` logic. sort: Options describing which field to sort by and in which order. limit: Max number of items to return. Use -1 for "no limit". offset: Number of items to skip from the start of the *matching* items. """ filters, must_filters, filter_logic = normalize_filter_options(filter) sort_by, sort_order = resolve_sort_options(sort) items_iter: Iterable[T] = self._iter_matching_items(filters, must_filters, filter_logic) # No sorting: stream through items and apply pagination on the fly. if not sort_by: matched_items: List[T] = [] total_matched = 0 for item in items_iter: # Count every match for 'total' total_matched += 1 # Apply offset/limit window if total_matched <= offset: continue if limit != -1 and len(matched_items) >= limit: # Still need to finish iteration to get accurate total_matched. continue matched_items.append(item) return PaginatedResult( items=matched_items, limit=limit, offset=offset, total=total_matched, ) # With sorting: we must materialize all matching items to sort them. all_matches: List[T] = list(items_iter) total_matched = len(all_matches) reverse = sort_order == "desc" all_matches.sort(key=lambda x: _get_sort_value(x, sort_by), reverse=reverse) if limit == -1: paginated_items = all_matches[offset:] else: paginated_items = all_matches[offset : offset + limit] return PaginatedResult( items=paginated_items, limit=limit, offset=offset, total=total_matched, ) @tracked("get") async def get( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, ) -> Optional[T]: """Return the first (or best-sorted) item that matches the given filters, or None.""" filters, must_filters, filter_logic = normalize_filter_options(filter) sort_by, sort_order = resolve_sort_options(sort) items_iter: Iterable[T] = self._iter_matching_items(filters, must_filters, filter_logic) if not sort_by: # Just return the first matching item, if any. for item in items_iter: return item return None # Single-pass min/max according to sort_order. best_item: Optional[T] = None best_key: Any = None for item in items_iter: key = _get_sort_value(item, sort_by) if best_item is None: best_item = item best_key = key continue if sort_order == "asc": if key < best_key: best_item, best_key = item, key else: if key > best_key: best_item, best_key = item, key return best_item @tracked("insert") async def insert(self, items: Sequence[T]) -> None: """Insert the given items. Raises: DuplicatedPrimaryKeyError: If any item with the same primary keys already exists. """ seen_keys: set[Tuple[Any, ...]] = set() prepared: List[T] = [] for item in items: self._ensure_item_type(item) key_values = self._extract_primary_key_values(item) if key_values in seen_keys: raise DuplicatedPrimaryKeyError( f"Insert payload contains duplicated primary key(s): {self._render_key_values(key_values)}" ) seen_keys.add(key_values) prepared.append(item) for item in prepared: self._mutate_single(item, mode="insert") @tracked("update") async def update(self, items: Sequence[T], update_fields: Sequence[str] | None = None) -> Sequence[T]: """Update the given items. Raises: ValueError: If any item with the given primary keys does not exist. """ updated_items: List[T] = [] for item in items: updated = self._mutate_single(item, mode="update", update_fields=update_fields) if updated is None: raise RuntimeError(f"_mutate_single returned None for item {item}. This should never happen.") updated_items.append(updated) return updated_items @tracked("upsert") async def upsert(self, items: Sequence[T], update_fields: Sequence[str] | None = None) -> Sequence[T]: """Upsert the given items (insert if missing, otherwise update).""" upserted_items: List[T] = [] for item in items: upserted = self._mutate_single(item, mode="upsert", update_fields=update_fields) if upserted is None: raise RuntimeError(f"_mutate_single returned None for item {item}. This should never happen.") upserted_items.append(upserted) return upserted_items @tracked("delete") async def delete(self, items: Sequence[T]) -> None: """Delete the given items. Raises: ValueError: If any item with the given primary keys does not exist. """ # We use a two-phase approach to avoid partial deletion if one fails: # first compute key_values to validate, then perform deletions. for item in items: # _mutate_single will validate existence and update size. self._mutate_single(item, mode="delete") class DequeBasedQueue(Queue[T]): """Queue implementation backed by collections.deque. Provides O(1) amortized enqueue (append) and dequeue (popleft). """ def __init__( self, item_type: Type[T], items: Optional[Sequence[T]] = None, id: Optional[str] = None, tracker: Optional[MetricsBackend] = None, ): super().__init__(tracker=tracker) self._items: Deque[T] = deque() self._item_type: Type[T] = item_type self._id = id if id is not None else str(uuid.uuid4()) if items: self._items.extend(items) def item_type(self) -> Type[T]: return self._item_type @property def collection_name(self) -> str: return self._id def __repr__(self) -> str: return f"<{self.__class__.__name__}[{self.item_type().__name__}] ({len(self._items)})>" @tracked("has") async def has(self, item: T) -> bool: if not isinstance(item, self._item_type): raise TypeError(f"Expected item of type {self._item_type.__name__}, got {type(item).__name__}") return item in self._items @tracked("enqueue") async def enqueue(self, items: Sequence[T]) -> Sequence[T]: for item in items: if not isinstance(item, self._item_type): raise TypeError(f"Expected item of type {self._item_type.__name__}, got {type(item).__name__}") self._items.append(item) return items @tracked("dequeue") async def dequeue(self, limit: int = 1) -> Sequence[T]: if limit <= 0: return [] out: List[T] = [] for _ in range(min(limit, len(self._items))): out.append(self._items.popleft()) return out @tracked("peek") async def peek(self, limit: int = 1) -> Sequence[T]: if limit <= 0: return [] result: List[T] = [] count = min(limit, len(self._items)) for idx, item in enumerate(self._items): if idx >= count: break result.append(item) return result @tracked("size") async def size(self) -> int: return len(self._items) class DictBasedKeyValue(KeyValue[K, V]): """KeyValue implementation backed by a plain dictionary.""" def __init__( self, data: Optional[Mapping[K, V]] = None, id: Optional[str] = None, tracker: Optional[MetricsBackend] = None ): super().__init__(tracker=tracker) self._values: Dict[K, V] = dict(data) if data else {} self._id = id if id is not None else str(uuid.uuid4()) @property def collection_name(self) -> str: return self._id @tracked("has") async def has(self, key: K) -> bool: return key in self._values @tracked("get") async def get(self, key: K, default: V | None = None) -> V | None: return self._values.get(key, default) @tracked("set") async def set(self, key: K, value: V) -> None: self._values[key] = value @tracked("inc") async def inc(self, key: K, amount: V) -> V: assert ensure_numeric(amount, description="amount") if key in self._values: current_value = self._values[key] assert ensure_numeric(current_value, description=f"value for key {key!r}") new_value = cast(V, current_value + amount) self._values[key] = new_value else: new_value = amount self._values[key] = new_value return new_value @tracked("chmax") async def chmax(self, key: K, value: V) -> V: assert ensure_numeric(value, description="value") if key in self._values: current_value = self._values[key] assert ensure_numeric(current_value, description=f"value for key {key!r}") if value > current_value: self._values[key] = value return value return current_value else: self._values[key] = value return value @tracked("pop") async def pop(self, key: K, default: V | None = None) -> V | None: return self._values.pop(key, default) @tracked("size") async def size(self) -> int: return len(self._values) class InMemoryLightningCollections(LightningCollections): """In-memory implementation of LightningCollections using Python data structures. Serves as the storage base for [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore]. """ def __init__(self, lock_type: Literal["thread", "asyncio"], tracker: MetricsBackend | None = None): super().__init__(tracker=tracker) self._lock: Mapping[AtomicLabels, _LoopAwareAsyncLock | _ThreadSafeAsyncLock] = { "rollouts": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "attempts": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "spans": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "resources": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "workers": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "rollout_queue": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "span_sequence_ids": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), "generic": _LoopAwareAsyncLock() if lock_type == "asyncio" else _ThreadSafeAsyncLock(), } self._rollouts = ListBasedCollection( items=[], item_type=Rollout, primary_keys=["rollout_id"], id="rollouts", tracker=tracker ) self._attempts = ListBasedCollection( items=[], item_type=Attempt, primary_keys=["rollout_id", "attempt_id"], id="attempts", tracker=tracker ) self._spans = ListBasedCollection( items=[], item_type=Span, primary_keys=["rollout_id", "attempt_id", "span_id"], id="spans", tracker=tracker ) self._resources = ListBasedCollection( items=[], item_type=ResourcesUpdate, primary_keys=["resources_id"], id="resources", tracker=tracker ) self._workers = ListBasedCollection( items=[], item_type=Worker, primary_keys=["worker_id"], id="workers", tracker=tracker ) self._rollout_queue = DequeBasedQueue(items=[], item_type=str, id="rollout_queue", tracker=tracker) self._span_sequence_ids = DictBasedKeyValue[str, int]( data={}, id="span_sequence_ids", tracker=tracker ) # rollout_id -> sequence_id @property def collection_name(self) -> str: return "router" @property def rollouts(self) -> ListBasedCollection[Rollout]: return self._rollouts @property def attempts(self) -> ListBasedCollection[Attempt]: return self._attempts @property def spans(self) -> ListBasedCollection[Span]: return self._spans @property def resources(self) -> ListBasedCollection[ResourcesUpdate]: return self._resources @property def workers(self) -> ListBasedCollection[Worker]: return self._workers @property def rollout_queue(self) -> DequeBasedQueue[str]: return self._rollout_queue @property def span_sequence_ids(self) -> DictBasedKeyValue[str, int]: return self._span_sequence_ids @asynccontextmanager async def atomic( self, *, mode: AtomicMode = "rw", snapshot: bool = False, labels: Optional[Sequence[AtomicLabels]] = None, **kwargs: Any, ): """In-memory collections apply a lock outside. It doesn't need to manipulate the collections inside. Skip the locking if mode is "r" and snapshot is False. This collection implementation does NOT support rollback / commit. """ if mode == "r" and not snapshot: yield self return if not labels: # If no labels are provided, use all locks. labels = list(self._lock.keys()) # IMPORTANT: Sort the labels to ensure consistent locking order. # This is necessary to avoid deadlocks when multiple threads/coroutines # are trying to acquire the same locks in different orders. labels = sorted(labels) async with self.tracking_context(operation="atomic", collection=self.collection_name): managers = [(label, self._lock[label]) for label in labels] async with AsyncExitStack() as stack: for label, manager in managers: async with self.tracking_context(operation="lock", collection=label): await stack.enter_async_context(manager) yield self @tracked("evict_spans_for_rollout") async def evict_spans_for_rollout(self, rollout_id: str) -> None: """Evict all spans for a given rollout ID. Uses private API for efficiency. """ self._spans._items.pop(rollout_id, []) # pyright: ignore[reportPrivateUsage] class _LoopAwareAsyncLock: """Async lock that transparently rebinds to the current event loop. The lock intentionally remains *thread-unsafe*: callers must only use it from one thread at a time. If multiple threads interact with the store, each thread gets its own event loop specific lock. """ def __init__(self) -> None: self._locks: weakref.WeakKeyDictionary[asyncio.AbstractEventLoop, asyncio.Lock] = weakref.WeakKeyDictionary() # When serializing and deserializing, we don't need to serialize the locks. # Because another process will have its own set of event loops and its own lock. def __getstate__(self) -> dict[str, Any]: return {} def __setstate__(self, state: dict[str, Any]) -> None: self._locks = weakref.WeakKeyDictionary() def _get_lock_for_current_loop(self) -> asyncio.Lock: loop = asyncio.get_running_loop() lock = self._locks.get(loop) if lock is None: lock = asyncio.Lock() self._locks[loop] = lock return lock async def __aenter__(self) -> asyncio.Lock: lock = self._get_lock_for_current_loop() await lock.acquire() return lock async def __aexit__(self, exc_type: type[BaseException] | None, exc: BaseException | None, tb: Any) -> None: loop = asyncio.get_running_loop() lock = self._locks.get(loop) if lock is None or not lock.locked(): raise RuntimeError("Lock released without being acquired") lock.release() class _ThreadSafeAsyncLock: """A thread lock powered by aiologic that can be used in both async and sync contexts. aiologic claims itself to be a thread-safe asyncio lock. """ def __init__(self): self._lock = aiologic.Lock() async def __aenter__(self): await self._lock.async_acquire() return self async def __aexit__(self, *args: Any, **kwargs: Any): # .release() is non-blocking, so we can call it directly self._lock.async_release() ================================================ FILE: agentlightning/store/collection/mongo.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging import random import re import time from contextlib import asynccontextmanager from datetime import datetime from typing import ( TYPE_CHECKING, Any, Awaitable, Callable, Dict, Generic, List, Mapping, Optional, Sequence, Tuple, Type, TypeVar, cast, ) import aiologic from agentlightning.utils.metrics import MetricsBackend if TYPE_CHECKING: from typing import Self from pydantic import BaseModel, TypeAdapter from pymongo import AsyncMongoClient, ReadPreference, ReturnDocument, WriteConcern from pymongo.asynchronous.client_session import AsyncClientSession from pymongo.asynchronous.collection import AsyncCollection from pymongo.asynchronous.database import AsyncDatabase from pymongo.errors import ( BulkWriteError, CollectionInvalid, ConnectionFailure, DuplicateKeyError, OperationFailure, PyMongoError, ) from pymongo.read_concern import ReadConcern from agentlightning.types import ( Attempt, FilterOptions, PaginatedResult, ResourcesUpdate, Rollout, SortOptions, Span, Worker, ) from .base import ( AtomicLabels, AtomicMode, Collection, DuplicatedPrimaryKeyError, KeyValue, LightningCollections, Queue, ensure_numeric, normalize_filter_options, resolve_sort_options, tracked, ) T_model = TypeVar("T_model", bound=BaseModel) T_generic = TypeVar("T_generic") T_mapping = TypeVar("T_mapping", bound=Mapping[str, Any]) T_callable = TypeVar("T_callable", bound=Callable[..., Any]) K = TypeVar("K") V = TypeVar("V") logger = logging.getLogger(__name__) def resolve_mongo_error_type(exc: BaseException | None) -> str | None: is_transient = isinstance(exc, PyMongoError) and exc.has_error_label("TransientTransactionError") if isinstance(exc, OperationFailure): if is_transient: return f"OperationFailure-{exc.code}-Transient" else: return f"OperationFailure-{exc.code}" if isinstance(exc, DuplicateKeyError): return "DuplicateKeyError-Transient" if is_transient else "DuplicateKeyError" if isinstance(exc, PyMongoError): if is_transient: return f"{exc.__class__.__name__}-Transient" else: return exc.__class__.__name__ if isinstance(exc, ConnectionFailure): return "ConnectionFailure-Transient" if is_transient else "ConnectionFailure" if is_transient: return "Other-Transient" else: return None def _field_ops_to_conditions(field: str, ops: Mapping[str, Any]) -> List[Dict[str, Any]]: """Convert a FilterField (ops) into one or more Mongo conditions.""" conditions: List[Dict[str, Any]] = [] for op_name, raw_value in ops.items(): if op_name == "exact": if raw_value is None: logger.debug(f"Skipping exact filter for field '{field}' with None value") continue conditions.append({field: raw_value}) elif op_name == "within": if raw_value is None: logger.debug(f"Skipping within filter for field '{field}' with None value") continue try: iterable = list(raw_value) except TypeError as exc: raise ValueError(f"Invalid iterable for within filter for field '{field}': {raw_value!r}") from exc conditions.append({field: {"$in": iterable}}) elif op_name == "contains": if raw_value is None: logger.debug(f"Skipping contains filter for field '{field}' with None value") continue value = str(raw_value) pattern = f".*{re.escape(value)}.*" conditions.append({field: {"$regex": pattern, "$options": "i"}}) else: raise ValueError(f"Unsupported filter operator '{op_name}' for field '{field}'") return conditions def _build_mongo_filter(filter_options: Optional[FilterOptions]) -> Dict[str, Any]: """Translate FilterOptions into a MongoDB filter dict.""" normalized, must_filters, aggregate = normalize_filter_options(filter_options) regular_conditions: List[Dict[str, Any]] = [] must_conditions: List[Dict[str, Any]] = [] # Normal filters if normalized: for field_name, ops in normalized.items(): regular_conditions.extend(_field_ops_to_conditions(field_name, ops)) # Must filters if must_filters: for field_name, ops in must_filters.items(): must_conditions.extend(_field_ops_to_conditions(field_name, ops)) # No filters at all if not regular_conditions and not must_conditions: return {} # Aggregate logic for regular conditions; _must always ANDs in. if aggregate == "and": all_conds = regular_conditions + must_conditions if len(all_conds) == 1: return all_conds[0] return {"$and": all_conds} # aggregate == "or" if regular_conditions and must_conditions: # (OR of regular) AND (all must) if len(regular_conditions) == 1: or_part: Dict[str, Any] = regular_conditions[0] else: or_part = {"$or": regular_conditions} and_parts: List[Dict[str, Any]] = [or_part] + must_conditions if len(and_parts) == 1: return and_parts[0] return {"$and": and_parts} if regular_conditions: if len(regular_conditions) == 1: return regular_conditions[0] return {"$or": regular_conditions} # Only must conditions if len(must_conditions) == 1: return must_conditions[0] return {"$and": must_conditions} async def _ensure_collection( db: AsyncDatabase[Mapping[str, Any]], collection_name: str, primary_keys: Optional[Sequence[str]] = None, extra_indexes: Optional[Sequence[Sequence[str]]] = None, ) -> bool: """Ensure the backing MongoDB collection exists. This method is idempotent and safe to call multiple times. """ # Create collection if it doesn't exist yet try: await db.create_collection(collection_name) except CollectionInvalid as exc: # Thrown if collection already exists logger.debug(f"Collection '{collection_name}' may have already existed. No need to create it: {exc!r}") except OperationFailure as exc: logger.debug(f"Failed to create collection '{collection_name}'. Probably already exists: {exc!r}") # Some servers use OperationFailure w/ specific codes for "NamespaceExists" if exc.code in (48, 68): # 48: NamespaceExists, 68: already exists on older versions pass else: raise # Optionally create a unique index on primary keys (scoped by partition_id) if primary_keys: # Always include the partition field in the unique index. keys = [("partition_id", 1)] + [(pk, 1) for pk in primary_keys] try: await db[collection_name].create_index(keys, name=f"uniq_partition_{'_'.join(primary_keys)}", unique=True) except OperationFailure as exc: logger.debug(f"Index for collection '{collection_name}' already exists. No need to create it: {exc!r}") # Ignore "index already exists" type errors if exc.code in (68, 85): # IndexOptionsConflict, etc. pass else: raise # Optionally create extra indexes if extra_indexes: for index in extra_indexes: try: await db[collection_name].create_index(index, name=f"idx_{'_'.join(index)}") except OperationFailure as exc: logger.debug(f"Index for collection '{collection_name}' already exists. No need to create it: {exc!r}") # Ignore "index already exists" type errors if exc.code in (68, 85): # IndexOptionsConflict, etc. pass else: raise return True class MongoClientPool(Generic[T_mapping]): """A pool of MongoDB clients, each bound to a specific event loop. The pool lazily creates `AsyncMongoClient` instances per event loop using the provided connection parameters, ensuring we never try to reuse a client across loops. """ def __init__(self, *, mongo_uri: str, mongo_client_kwargs: Mapping[str, Any] | None = None): self._get_collection_lock = aiologic.Lock() self._get_client_lock = aiologic.Lock() self._mongo_uri = mongo_uri self._mongo_client_kwargs = dict(mongo_client_kwargs or {}) self._client_pool: Dict[int, AsyncMongoClient[T_mapping]] = {} self._collection_pool: Dict[Tuple[int, str, str], AsyncCollection[T_mapping]] = {} async def __aenter__(self) -> Self: return self async def __aexit__(self, exc_type: type[BaseException] | None, exc: BaseException | None, tb: Any) -> None: await self.close() async def close(self) -> None: """Close all clients currently tracked by the pool.""" async with self._get_client_lock, self._get_collection_lock: clients = list(self._client_pool.values()) self._client_pool.clear() self._collection_pool.clear() for client in clients: try: await client.close() except Exception: logger.exception("Error closing MongoDB client: %s", client) async def get_client(self) -> AsyncMongoClient[T_mapping]: loop = asyncio.get_running_loop() key = id(loop) # If there is already a client specifically for this loop, return it. existing = self._client_pool.get(key) if existing is not None: await existing.aconnect() # This actually does nothing if the client is already connected. return existing async with self._get_client_lock: # Another coroutine may have already created the client. if key in self._client_pool: await self._client_pool[key].aconnect() return self._client_pool[key] # Create a new client for this loop. client = AsyncMongoClient[T_mapping](self._mongo_uri, **self._mongo_client_kwargs) await client.aconnect() self._client_pool[key] = client return client async def get_collection(self, database_name: str, collection_name: str) -> AsyncCollection[T_mapping]: loop = asyncio.get_running_loop() key = (id(loop), database_name, collection_name) if key in self._collection_pool: return self._collection_pool[key] async with self._get_collection_lock: # Another coroutine may have already created the collection. if key in self._collection_pool: return self._collection_pool[key] # Create a new collection for this loop. client = await self.get_client() collection = client[database_name][collection_name] self._collection_pool.setdefault(key, collection) return collection class MongoBasedCollection(Collection[T_model]): """Mongo-based implementation of Collection. Args: client_pool: The pool of MongoDB clients. database_name: The name of the database. collection_name: The name of the collection. partition_id: The partition ID. Used to partition the collection into multiple collections. primary_keys: The primary keys of the collection. item_type: The type of the items in the collection. extra_indexes: The extra indexes to create on the collection. tracker: The metrics tracker to use. """ def __init__( self, client_pool: MongoClientPool[Mapping[str, Any]], database_name: str, collection_name: str, partition_id: str, primary_keys: Sequence[str], item_type: Type[T_model], extra_indexes: Sequence[Sequence[str]] = [], tracker: MetricsBackend | None = None, ): super().__init__(tracker=tracker) self._client_pool = client_pool self._database_name = database_name self._collection_name = collection_name self._partition_id = partition_id self._collection_created = False self._extra_indexes = [list(index) for index in extra_indexes] self._session: Optional[AsyncClientSession] = None if not primary_keys: raise ValueError("primary_keys must be non-empty") self._primary_keys = list(primary_keys) if not issubclass(item_type, BaseModel): # type: ignore raise ValueError(f"item_type must be a subclass of BaseModel, got {item_type.__name__}") self._item_type = item_type @property def collection_name(self) -> str: return self._collection_name @property def extra_tracking_labels(self) -> Mapping[str, str]: return { "database": self._database_name, } @tracked("ensure_collection") async def ensure_collection(self) -> AsyncCollection[Mapping[str, Any]]: """Ensure the backing MongoDB collection exists (and optionally its indexes). This method is idempotent and safe to call multiple times. It will also create a unique index across the configured primary key fields. """ if not self._collection_created: client = await self._client_pool.get_client() self._collection_created = await _ensure_collection( client[self._database_name], self._collection_name, self._primary_keys, self._extra_indexes ) return await self._client_pool.get_collection(self._database_name, self._collection_name) def with_session(self, session: AsyncClientSession) -> MongoBasedCollection[T_model]: """Create a new collection with the same configuration but a new session.""" collection = MongoBasedCollection( client_pool=self._client_pool, database_name=self._database_name, collection_name=self._collection_name, partition_id=self._partition_id, primary_keys=self._primary_keys, item_type=self._item_type, extra_indexes=self._extra_indexes, tracker=self._tracker, ) collection._collection_created = self._collection_created collection._session = session return collection def primary_keys(self) -> Sequence[str]: """Return the primary key field names for this collection.""" return self._primary_keys def item_type(self) -> Type[T_model]: return self._item_type @tracked("size") async def size(self) -> int: collection = await self.ensure_collection() return await collection.count_documents({"partition_id": self._partition_id}, session=self._session) def _pk_filter(self, item: T_model) -> Dict[str, Any]: """Build a Mongo filter for the primary key(s) of a model instance.""" data = item.model_dump() missing = [pk for pk in self._primary_keys if pk not in data] if missing: raise ValueError(f"Missing primary key fields {missing} on item {item!r}") pk_filter: Dict[str, Any] = {"partition_id": self._partition_id} pk_filter.update({pk: data[pk] for pk in self._primary_keys}) return pk_filter def _render_pk_values(self, values: Sequence[Any]) -> str: return ", ".join(f"{pk}={value!r}" for pk, value in zip(self._primary_keys, values)) def _ensure_item_type(self, item: T_model) -> None: if not isinstance(item, self._item_type): raise TypeError(f"Expected item of type {self._item_type.__name__}, got {type(item).__name__}") def _inject_partition_filter(self, filter: Optional[FilterOptions]) -> Dict[str, Any]: """Ensure every query is scoped to this collection's partition.""" combined: Dict[str, Any] if filter is None: combined = {} else: combined = dict(filter) partition_must = {"partition_id": {"exact": self._partition_id}} existing_must = combined.get("_must") if existing_must is None: combined["_must"] = partition_must return combined if isinstance(existing_must, Mapping): combined["_must"] = [existing_must, partition_must] elif isinstance(existing_must, Sequence) and not isinstance(existing_must, (str, bytes)): combined["_must"] = [*existing_must, partition_must] else: raise TypeError("`_must` filters must be a mapping or sequence of mappings") return combined def _model_validate_item(self, raw: Mapping[str, Any]) -> T_model: item_type_has_id = "_id" in self._item_type.model_fields # Remove _id from the raw document if the item type does not have it. if not item_type_has_id: raw = {k: v for k, v in raw.items() if k != "_id"} # Convert Mongo document to Pydantic model return self._item_type.model_validate(raw) # type: ignore[arg-type] @tracked("query") async def query( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, limit: int = -1, offset: int = 0, ) -> PaginatedResult[T_model]: """Mongo-based implementation of Collection.query. The handling of null-values in sorting is different from memory-based implementation. In MongoDB, null values are treated as less than non-null values. """ collection = await self.ensure_collection() combined = self._inject_partition_filter(filter) mongo_filter = _build_mongo_filter(cast(FilterOptions, combined)) total = await collection.count_documents(mongo_filter, session=self._session) if limit == 0: return PaginatedResult[T_model](items=[], limit=0, offset=offset, total=total) cursor = collection.find(mongo_filter, session=self._session) sort_name, sort_order = resolve_sort_options(sort) if sort_name is not None: model_fields = getattr(self._item_type, "model_fields", {}) if sort_name not in model_fields: raise ValueError( f"Failed to sort items by '{sort_name}': field does not exist on {self._item_type.__name__}" ) direction = 1 if sort_order == "asc" else -1 cursor = cursor.sort(sort_name, direction) if offset > 0: cursor = cursor.skip(offset) if limit >= 0: cursor = cursor.limit(limit) items: List[T_model] = [] async for raw in cursor: items.append(self._model_validate_item(raw)) return PaginatedResult[T_model](items=items, limit=limit, offset=offset, total=total) @tracked("get") async def get( self, filter: Optional[FilterOptions] = None, sort: Optional[SortOptions] = None, ) -> Optional[T_model]: collection = await self.ensure_collection() combined = self._inject_partition_filter(filter) mongo_filter = _build_mongo_filter(cast(FilterOptions, combined)) sort_name, sort_order = resolve_sort_options(sort) mongo_sort: Optional[List[Tuple[str, int]]] = None if sort_name is not None: model_fields = getattr(self._item_type, "model_fields", {}) if sort_name not in model_fields: raise ValueError( f"Failed to sort items by '{sort_name}': field does not exist on {self._item_type.__name__}" ) direction = 1 if sort_order == "asc" else -1 mongo_sort = [(sort_name, direction)] raw = await collection.find_one(mongo_filter, sort=mongo_sort, session=self._session) if raw is None: return None return self._model_validate_item(raw) @tracked("insert") async def insert(self, items: Sequence[T_model]) -> None: """Insert items into the collection. The implementation does NOT do checks for duplicate primary keys, neither within the same insert call nor across different insert calls. It relies on the database to enforce uniqueness via indexes. """ if not items: return collection = await self.ensure_collection() docs: List[Mapping[str, Any]] = [] for item in items: self._ensure_item_type(item) doc = item.model_dump() doc["partition_id"] = self._partition_id docs.append(doc) if not docs: return try: async with self.tracking_context("insert.insert_many", self._collection_name): await collection.insert_many(docs, session=self._session) except DuplicateKeyError as exc: # In case the DB enforces uniqueness via index, normalize to ValueError raise DuplicatedPrimaryKeyError("Duplicated primary key(s) while inserting items") from exc except BulkWriteError as exc: write_errors = exc.details.get("writeErrors", []) if write_errors and write_errors[0].get("code") == 11000: raise DuplicatedPrimaryKeyError("Duplicated primary key(s) while inserting items") from exc raise @tracked("update") async def update(self, items: Sequence[T_model], update_fields: Sequence[str] | None = None) -> List[T_model]: if not items: return [] updated_items: List[T_model] = [] collection = await self.ensure_collection() for item in items: self._ensure_item_type(item) pk_filter = self._pk_filter(item) doc = item.model_dump() doc["partition_id"] = self._partition_id updated_doc = None # Branch 1: Full Replace if update_fields is None: async with self.tracking_context("update.find_one_and_replace", self._collection_name): updated_doc = await collection.find_one_and_replace( filter=pk_filter, replacement=doc, session=self._session, return_document=ReturnDocument.AFTER, # Returns the new version ) # Branch 2: Partial Update else: update_doc = {field: doc[field] for field in update_fields if field in doc} async with self.tracking_context("update.find_one_and_update", self._collection_name): updated_doc = await collection.find_one_and_update( filter=pk_filter, update={"$set": update_doc}, session=self._session, return_document=ReturnDocument.AFTER, # Returns the new version ) # Validation and Reconstruction if updated_doc is None: # type: ignore raise ValueError(f"Item with primary key(s) {pk_filter} does not exist") # Re-instantiate the model from the raw MongoDB dictionary. new_item = self._model_validate_item(updated_doc) updated_items.append(new_item) return updated_items @tracked("upsert") async def upsert(self, items: Sequence[T_model], update_fields: Sequence[str] | None = None) -> List[T_model]: if not items: return [] upserted_items: List[T_model] = [] collection = await self.ensure_collection() for item in items: self._ensure_item_type(item) pk_filter = self._pk_filter(item) insert_doc = item.model_dump() insert_doc["partition_id"] = self._partition_id # If update_fields is None, we update ALL fields (standard upsert behavior). # Otherwise, we only update specific fields, but insert the full doc if it's new. target_fields = update_fields if update_fields is not None else list(insert_doc.keys()) # 1. $set: Fields that should be overwritten if the document exists update_subset = {field: insert_doc[field] for field in target_fields if field in insert_doc} # 2. $setOnInsert: Fields that are only set if we are creating a NEW document # (Everything in the model that isn't in the update_subset) set_on_insert = {k: v for k, v in insert_doc.items() if k not in update_subset} update_spec: Dict[str, Dict[str, Any]] = {} if set_on_insert: update_spec["$setOnInsert"] = set_on_insert if update_subset: update_spec["$set"] = update_subset async with self.tracking_context("upsert.find_one_and_update", self._collection_name): result_doc = await collection.find_one_and_update( filter=pk_filter, update=update_spec, upsert=True, session=self._session, return_document=ReturnDocument.AFTER, ) if result_doc is None: # pyright: ignore[reportUnnecessaryComparison] raise RuntimeError(f"Upsert resulted in no document for filter: {pk_filter}") # Because upsert=True, result_doc is guaranteed to be not None new_item = self._model_validate_item(result_doc) upserted_items.append(new_item) return upserted_items @tracked("delete") async def delete(self, items: Sequence[T_model]) -> None: if not items: return collection = await self.ensure_collection() for item in items: self._ensure_item_type(item) pk_filter = self._pk_filter(item) async with self.tracking_context("delete.delete_one", self._collection_name): result = await collection.delete_one(pk_filter, session=self._session) if result.deleted_count == 0: raise ValueError(f"Item with primary key(s) {pk_filter} does not exist") class MongoBasedQueue(Queue[T_generic], Generic[T_generic]): """Mongo-based implementation of Queue backed by a MongoDB collection. Items are stored append-only; dequeue marks items as consumed instead of deleting them. """ def __init__( self, client_pool: MongoClientPool[Mapping[str, Any]], database_name: str, collection_name: str, partition_id: str, item_type: Type[T_generic], tracker: MetricsBackend | None = None, ) -> None: """ Args: client_pool: The pool of MongoDB clients. database_name: The name of the database. collection_name: The name of the collection backing the queue. partition_id: Partition identifier; allows multiple logical queues in one collection. item_type: The Python type of queue items (primitive or BaseModel subclass). """ super().__init__(tracker=tracker) self._client_pool = client_pool self._database_name = database_name self._collection_name = collection_name self._partition_id = partition_id self._item_type = item_type self._adapter: TypeAdapter[T_generic] = TypeAdapter(item_type) self._collection_created = False self._session: Optional[AsyncClientSession] = None def item_type(self) -> Type[T_generic]: return self._item_type @property def extra_tracking_labels(self) -> Mapping[str, str]: return { "database": self._database_name, } @property def collection_name(self) -> str: return self._collection_name @tracked("ensure_collection") async def ensure_collection(self) -> AsyncCollection[Mapping[str, Any]]: """Ensure the backing collection exists. If it already exists, it returns the existing collection. """ if not self._collection_created: client = await self._client_pool.get_client() self._collection_created = await _ensure_collection( client[self._database_name], self._collection_name, primary_keys=["consumed", "_id"] ) return await self._client_pool.get_collection(self._database_name, self._collection_name) def with_session(self, session: AsyncClientSession) -> MongoBasedQueue[T_generic]: queue = MongoBasedQueue( client_pool=self._client_pool, database_name=self._database_name, collection_name=self._collection_name, partition_id=self._partition_id, item_type=self._item_type, tracker=self._tracker, ) queue._collection_created = self._collection_created queue._session = session return queue @tracked("has") async def has(self, item: T_generic) -> bool: collection = await self.ensure_collection() encoded = self._adapter.dump_python(item, mode="python") doc = await collection.find_one( { "partition_id": self._partition_id, "consumed": False, "value": encoded, }, session=self._session, ) return doc is not None @tracked("enqueue") async def enqueue(self, items: Sequence[T_generic]) -> Sequence[T_generic]: if not items: return [] collection = await self.ensure_collection() docs: List[Mapping[str, Any]] = [] for item in items: if not isinstance(item, self._item_type): raise TypeError(f"Expected item of type {self._item_type.__name__}, got {type(item).__name__}") docs.append( { "partition_id": self._partition_id, "value": self._adapter.dump_python(item, mode="python"), "consumed": False, "created_at": datetime.now(), } ) async with self.tracking_context("enqueue.insert_many", self.collection_name): await collection.insert_many(docs, session=self._session) return list(items) @tracked("dequeue") async def dequeue(self, limit: int = 1) -> Sequence[T_generic]: if limit <= 0: return [] collection = await self.ensure_collection() results: list[T_generic] = [] # Atomic claim loop using find_one_and_update for _ in range(limit): async with self.tracking_context("dequeue.find_one_and_update", self.collection_name): doc = await collection.find_one_and_update( { "partition_id": self._partition_id, "consumed": False, }, {"$set": {"consumed": True}}, sort=[("_id", 1)], # FIFO using insertion order return_document=True, session=self._session, ) if doc is None: # type: ignore # No more items to dequeue break raw_value = doc["value"] item = self._adapter.validate_python(raw_value) results.append(item) return results @tracked("peek") async def peek(self, limit: int = 1) -> Sequence[T_generic]: if limit <= 0: return [] collection = await self.ensure_collection() async with self.tracking_context("peek.find", self.collection_name): cursor = ( collection.find( { "partition_id": self._partition_id, "consumed": False, }, session=self._session, ) .sort("_id", 1) .limit(limit) ) items: list[T_generic] = [] async for doc in cursor: raw_value = doc["value"] items.append(self._adapter.validate_python(raw_value)) return items @tracked("size") async def size(self) -> int: collection = await self.ensure_collection() return await collection.count_documents( { "partition_id": self._partition_id, "consumed": False, }, session=self._session, ) class MongoBasedKeyValue(KeyValue[K, V], Generic[K, V]): """Mongo-based implementation of KeyValue.""" def __init__( self, client_pool: MongoClientPool[Mapping[str, Any]], database_name: str, collection_name: str, partition_id: str, key_type: Type[K], value_type: Type[V], tracker: MetricsBackend | None = None, ) -> None: """ Args: client_pool: The pool of MongoDB clients. database_name: The name of the database. collection_name: The name of the collection backing the key-value store. partition_id: Partition identifier; allows multiple logical maps in one collection. key_type: The Python type of keys (primitive or BaseModel). value_type: The Python type of values (primitive or BaseModel). tracker: The metrics tracker to use. """ super().__init__(tracker=tracker) self._client_pool = client_pool self._database_name = database_name self._collection_name = collection_name self._partition_id = partition_id self._key_type = key_type self._value_type = value_type self._key_adapter: TypeAdapter[K] = TypeAdapter(key_type) self._value_adapter: TypeAdapter[V] = TypeAdapter(value_type) self._collection_created = False self._session: Optional[AsyncClientSession] = None @property def extra_tracking_labels(self) -> Mapping[str, str]: return { "database": self._database_name, } @property def collection_name(self) -> str: return self._collection_name @tracked("ensure_collection") async def ensure_collection(self, *, create_indexes: bool = True) -> AsyncCollection[Mapping[str, Any]]: """Ensure the backing collection exists (and optionally its indexes).""" if not self._collection_created: client = await self._client_pool.get_client() self._collection_created = await _ensure_collection( client[self._database_name], self._collection_name, primary_keys=["key"] ) return await self._client_pool.get_collection(self._database_name, self._collection_name) def with_session(self, session: AsyncClientSession) -> MongoBasedKeyValue[K, V]: key_value = MongoBasedKeyValue( client_pool=self._client_pool, database_name=self._database_name, collection_name=self._collection_name, partition_id=self._partition_id, key_type=self._key_type, value_type=self._value_type, tracker=self._tracker, ) key_value._collection_created = self._collection_created key_value._session = session return key_value @tracked("has") async def has(self, key: K) -> bool: collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") doc = await collection.find_one( { "partition_id": self._partition_id, "key": encoded_key, }, session=self._session, ) return doc is not None @tracked("get") async def get(self, key: K, default: V | None = None) -> V | None: collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") doc = await collection.find_one( { "partition_id": self._partition_id, "key": encoded_key, }, session=self._session, ) if doc is None: return default raw_value = doc["value"] return self._value_adapter.validate_python(raw_value) @tracked("set") async def set(self, key: K, value: V) -> None: collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") encoded_value = self._value_adapter.dump_python(value, mode="python") try: async with self.tracking_context("set.replace_one", self.collection_name): await collection.replace_one( { "partition_id": self._partition_id, "key": encoded_key, }, { "partition_id": self._partition_id, "key": encoded_key, "value": encoded_value, }, upsert=True, session=self._session, ) except DuplicateKeyError as exc: # Very unlikely with replace_one+upsert, but normalize anyway. raise DuplicatedPrimaryKeyError("Duplicate key error while setting key-value item") from exc @tracked("inc") async def inc(self, key: K, amount: V) -> V: assert ensure_numeric(amount, description="amount") collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") encoded_amount = self._value_adapter.dump_python(amount, mode="python") try: async with self.tracking_context("inc.find_one_and_update", self.collection_name): doc = await collection.find_one_and_update( { "partition_id": self._partition_id, "key": encoded_key, }, { "$inc": {"value": encoded_amount}, }, upsert=True, return_document=ReturnDocument.AFTER, session=self._session, ) except OperationFailure as exc: if exc.code == 14 or "Cannot apply $inc" in str(exc): raise TypeError(f"value for key {key!r} is not numeric") from exc raise if doc is None: # type: ignore raise RuntimeError("Failed to increment value; MongoDB did not return a document") raw_value = doc["value"] return self._value_adapter.validate_python(raw_value) @tracked("chmax") async def chmax(self, key: K, value: V) -> V: assert ensure_numeric(value, description="value") collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") encoded_value = self._value_adapter.dump_python(value, mode="python") try: async with self.tracking_context("chmax.find_one_and_update", self.collection_name): doc = await collection.find_one_and_update( { "partition_id": self._partition_id, "key": encoded_key, }, { "$max": {"value": encoded_value}, }, upsert=True, return_document=ReturnDocument.AFTER, session=self._session, ) except OperationFailure as exc: if exc.code == 14 or "Cannot apply $max" in str(exc): raise TypeError(f"value for key {key!r} is not numeric") from exc raise if doc is None: # type: ignore raise RuntimeError("Failed to update value; MongoDB did not return a document") raw_value = doc["value"] return self._value_adapter.validate_python(raw_value) @tracked("pop") async def pop(self, key: K, default: V | None = None) -> V | None: collection = await self.ensure_collection() encoded_key = self._key_adapter.dump_python(key, mode="python") doc = await collection.find_one_and_delete( { "partition_id": self._partition_id, "key": encoded_key, }, session=self._session, ) if doc is None: # type: ignore return default raw_value = doc["value"] return self._value_adapter.validate_python(raw_value) @tracked("size") async def size(self) -> int: collection = await self.ensure_collection() return await collection.count_documents( { "partition_id": self._partition_id, }, session=self._session, ) class MongoLightningCollections(LightningCollections): """Mongo implementation of LightningCollections using MongoDB collections. Serves as the storage base for [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore]. """ def __init__( self, client_pool: MongoClientPool[Mapping[str, Any]], database_name: str, partition_id: str, rollouts: Optional[MongoBasedCollection[Rollout]] = None, attempts: Optional[MongoBasedCollection[Attempt]] = None, spans: Optional[MongoBasedCollection[Span]] = None, resources: Optional[MongoBasedCollection[ResourcesUpdate]] = None, workers: Optional[MongoBasedCollection[Worker]] = None, rollout_queue: Optional[MongoBasedQueue[str]] = None, span_sequence_ids: Optional[MongoBasedKeyValue[str, int]] = None, tracker: MetricsBackend | None = None, ): super().__init__(tracker=tracker, extra_labels=["database"]) self._client_pool = client_pool self._database_name = database_name self._partition_id = partition_id self._collection_ensured = False self._lock = aiologic.Lock() # used for generic atomic operations like scan debounce seconds self._rollouts = ( rollouts if rollouts is not None else MongoBasedCollection( self._client_pool, self._database_name, "rollouts", self._partition_id, ["rollout_id"], Rollout, [["status"]], tracker=self._tracker, ) ) self._attempts = ( attempts if attempts is not None else MongoBasedCollection( self._client_pool, self._database_name, "attempts", self._partition_id, ["rollout_id", "attempt_id"], Attempt, [["status"], ["sequence_id"]], tracker=self._tracker, ) ) self._spans = ( spans if spans is not None else MongoBasedCollection( self._client_pool, self._database_name, "spans", self._partition_id, ["rollout_id", "attempt_id", "span_id"], Span, [["sequence_id"]], tracker=self._tracker, ) ) self._resources = ( resources if resources is not None else MongoBasedCollection( self._client_pool, self._database_name, "resources", self._partition_id, ["resources_id"], ResourcesUpdate, ["update_time"], tracker=self._tracker, ) ) self._workers = ( workers if workers is not None else MongoBasedCollection( self._client_pool, self._database_name, "workers", self._partition_id, ["worker_id"], Worker, ["status"], tracker=self._tracker, ) ) self._rollout_queue = ( rollout_queue if rollout_queue is not None else MongoBasedQueue( self._client_pool, self._database_name, "rollout_queue", self._partition_id, str, tracker=self._tracker, ) ) self._span_sequence_ids = ( span_sequence_ids if span_sequence_ids is not None else MongoBasedKeyValue( self._client_pool, self._database_name, "span_sequence_ids", self._partition_id, str, int, tracker=self._tracker, ) ) @property def collection_name(self) -> str: return "router" # Special collection name for tracking transactions @property def extra_tracking_labels(self) -> Mapping[str, str]: return { "database": self._database_name, } def with_session(self, session: AsyncClientSession) -> Self: instance = self.__class__( client_pool=self._client_pool, database_name=self._database_name, partition_id=self._partition_id, rollouts=self._rollouts.with_session(session), attempts=self._attempts.with_session(session), spans=self._spans.with_session(session), resources=self._resources.with_session(session), workers=self._workers.with_session(session), rollout_queue=self._rollout_queue.with_session(session), span_sequence_ids=self._span_sequence_ids.with_session(session), tracker=self._tracker, ) instance._collection_ensured = self._collection_ensured return instance @property def rollouts(self) -> MongoBasedCollection[Rollout]: return self._rollouts @property def attempts(self) -> MongoBasedCollection[Attempt]: return self._attempts @property def spans(self) -> MongoBasedCollection[Span]: return self._spans @property def resources(self) -> MongoBasedCollection[ResourcesUpdate]: return self._resources @property def workers(self) -> MongoBasedCollection[Worker]: return self._workers @property def rollout_queue(self) -> MongoBasedQueue[str]: return self._rollout_queue @property def span_sequence_ids(self) -> MongoBasedKeyValue[str, int]: return self._span_sequence_ids @tracked("ensure_collections") async def _ensure_collections(self) -> None: """Ensure all collections exist.""" if self._collection_ensured: return await self._rollouts.ensure_collection() await self._attempts.ensure_collection() await self._spans.ensure_collection() await self._resources.ensure_collection() await self._workers.ensure_collection() await self._rollout_queue.ensure_collection() await self._span_sequence_ids.ensure_collection() self._collection_ensured = True @asynccontextmanager async def _lock_manager(self, labels: Optional[Sequence[AtomicLabels]]): if labels is None or "generic" not in labels: yield else: # Only lock the generic label. try: async with self.tracking_context("lock", self.collection_name): await self._lock.async_acquire() yield finally: self._lock.async_release() @asynccontextmanager async def atomic( self, mode: AtomicMode = "rw", snapshot: bool = False, commit: bool = False, labels: Optional[Sequence[AtomicLabels]] = None, *args: Any, **kwargs: Any, ): """Perform a atomic operation on the collections.""" if commit: raise ValueError("Commit should be used with execute() instead.") async with self._lock_manager(labels): async with self.tracking_context("atomic", self.collection_name): # First step: ensure all collections exist before going into the atomic block if not self._collection_ensured: await self._ensure_collections() # Execute directly without commit yield self @tracked("execute") async def execute( self, callback: Callable[[Self], Awaitable[T_generic]], *, mode: AtomicMode = "rw", snapshot: bool = False, commit: bool = False, labels: Optional[Sequence[AtomicLabels]] = None, **kwargs: Any, ) -> T_generic: """Execute the given callback within an atomic operation, and with retries on transient errors.""" if not self._collection_ensured: await self._ensure_collections() client = await self._client_pool.get_client() # If commit is not turned on, just execute the callback directly. if not commit: async with self._lock_manager(labels): return await callback(self) # If snapshot is enabled, use snapshot read concern. read_concern = ReadConcern("snapshot") if snapshot else ReadConcern("local") # If mode is "r", write_concern is not needed. write_concern = WriteConcern("majority") if mode != "r" else None async with client.start_session() as session: collections = self.with_session(session) try: async with self._lock_manager(labels): return await self.with_transaction(session, collections, callback, read_concern, write_concern) except (ConnectionFailure, OperationFailure) as exc: # Un-retryable errors. raise RuntimeError("Transaction failed with connection or operation error") from exc @tracked("with_transaction") async def with_transaction( self, session: AsyncClientSession, collections: Self, callback: Callable[[Self], Awaitable[T_generic]], read_concern: ReadConcern, write_concern: Optional[WriteConcern], ) -> T_generic: # This will start a transaction, run transaction callback, and commit. # It will also transparently retry on some transient errors. # Expanded implementation of with_transaction from client_session read_preference = ReadPreference.PRIMARY transaction_retry_time_limit = 120 start_time = time.monotonic() def _within_time_limit() -> bool: return time.monotonic() - start_time < transaction_retry_time_limit async def _jitter_before_retry() -> None: async with self.tracking_context("execute.jitter", self.collection_name): await asyncio.sleep(random.uniform(0, 0.05)) while True: await session.start_transaction(read_concern, write_concern, read_preference) try: # The _session is always the same within one transaction, # so we can use the same collections object. async with self.tracking_context("execute.callback", self.collection_name): ret = await callback(collections) # Catch KeyboardInterrupt, CancelledError, etc. and cleanup. except BaseException as exc: if session.in_transaction: await session.abort_transaction() if ( isinstance(exc, PyMongoError) and exc.has_error_label("TransientTransactionError") and _within_time_limit() ): # Retry the entire transaction. await _jitter_before_retry() continue raise if not session.in_transaction: # Assume callback intentionally ended the transaction. return ret # Tracks the commit operation. async with self.tracking_context("execute.commit", self.collection_name): # Loop until the commit succeeds or we hit the time limit. while True: # Tracks the commit attempt. try: async with self.tracking_context("execute.commit_once", self.collection_name): await session.commit_transaction() except PyMongoError as exc: if ( exc.has_error_label("UnknownTransactionCommitResult") and _within_time_limit() and not (isinstance(exc, OperationFailure) and exc.code == 50) # max_time_expired_error ): # Retry the commit. await _jitter_before_retry() continue if exc.has_error_label("TransientTransactionError") and _within_time_limit(): # Retry the entire transaction. await _jitter_before_retry() break raise # Commit succeeded. return ret ================================================ FILE: agentlightning/store/collection_based.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Collection-based LightningStore implementation. To developers, please check whether the implementation is correct by checking the following: 1. Whether all `_unlocked_*` methods are guarded by some `atomic()` or `execute()` context. 2. Whether all `atomic()` or `execute()` contexts are labeled (labels="...") correctly. 3. `_unlocked_update_attempt_and_rollout` should be accompanied by `_post_update_rollout`, `_unlocked_sync_worker_with_attempt`. 4. `_post_add_spans` should be called after the spans are inserted into the store. 5. `_unlocked_update_rollout_only` should be accompanied by `_post_update_rollout`. """ from __future__ import annotations import asyncio import functools import logging import time import warnings from collections import defaultdict from contextvars import ContextVar from types import CoroutineType from typing import ( Any, Callable, Dict, Generic, List, Literal, Optional, ParamSpec, Sequence, Tuple, TypeVar, Union, cast, ) from opentelemetry.sdk.trace import ReadableSpan from pydantic import BaseModel from typing_extensions import Concatenate from agentlightning.types import ( Attempt, AttemptedRollout, AttemptStatus, EnqueueRolloutRequest, FilterField, NamedResources, PaginatedResult, ResourcesUpdate, Rollout, RolloutConfig, RolloutStatus, SortOptions, Span, TaskInput, Worker, WorkerStatus, ) from agentlightning.utils.id import generate_id from agentlightning.utils.metrics import MetricsBackend from .base import ( UNSET, LightningStore, LightningStoreCapabilities, LightningStoreStatistics, Unset, is_finished, is_queuing, ) from .collection import FilterOptions, LightningCollections from .collection.base import AtomicLabels, DuplicatedPrimaryKeyError from .utils import LATENCY_BUCKETS, rollout_status_from_attempt, scan_unhealthy_rollouts T_callable = TypeVar("T_callable", bound=Callable[..., Any]) T_model = TypeVar("T_model", bound=BaseModel) T_collections = TypeVar("T_collections", bound=LightningCollections) P = ParamSpec("P") R = TypeVar("R") C = TypeVar("C") # The collections type SelfT = TypeVar("SelfT", bound="CollectionBasedLightningStore[Any]") logger = logging.getLogger(__name__) # ContextVars for tracking the current store method without expensive stack introspection. # These are set by the @tracked decorator and read by tracking_context in collection/base.py. _UNKNOWN_STORE_METHOD = "unknown" _current_public_store_method: ContextVar[str] = ContextVar("public_store_method", default=_UNKNOWN_STORE_METHOD) _current_private_store_method: ContextVar[str] = ContextVar("private_store_method", default=_UNKNOWN_STORE_METHOD) def _with_collections_execute(labels: Sequence[AtomicLabels]): """Hands over the function execution to the collections.execute method. Used to enable committing and automatic retries. The wrapped function should accept an extra locked collection as its first argument. """ def decorator( func: Callable[Concatenate[SelfT, T_collections, P], CoroutineType[Any, Any, R]], ) -> Callable[Concatenate[SelfT, P], CoroutineType[Any, Any, R]]: @functools.wraps(func) async def wrapper(self: SelfT, *args: P.args, **kwargs: P.kwargs) -> R: async def callback(collections: T_collections) -> R: return await func(self, collections, *args, **kwargs) return await self.collections.execute( callback, mode="rw", # Read-write all enabled. snapshot=self._read_snapshot, # pyright: ignore[reportPrivateUsage] commit=True, # Enable committing. labels=labels, ) return wrapper return decorator def tracked(name: str): """Decorator to track the execution of the decorated method with Prometheus.""" def decorator(func: T_callable) -> T_callable: @functools.wraps(func) async def wrapper(self: CollectionBasedLightningStore[T_collections], *args: Any, **kwargs: Any) -> Any: # Get the current public method from ContextVar (set by outer tracked methods) public_meth_in_stack = _current_public_store_method.get() # Set ContextVars for nested calls to read. Use tokens for proper cleanup. pub_token = None priv_token = None if name in COLLECTION_STORE_PUBLIC_METHODS: pub_token = _current_public_store_method.set(name) public_meth_in_stack = name # We are in a public method already. if name in COLLECTION_STORE_ALL_METHODS: priv_token = _current_private_store_method.set(name) try: if self._tracker is None: # pyright: ignore[reportPrivateUsage] # Skip the tracking because tracking is not configured return await func(self, *args, **kwargs) start_time = time.perf_counter() status: str = "OK" try: return await func(self, *args, **kwargs) except BaseException as exc: status = exc.__class__.__name__ raise finally: elapsed = time.perf_counter() - start_time await self._tracker.inc_counter( # pyright: ignore[reportPrivateUsage] "agl.store.total", labels={"method": name, "store_pubmeth": public_meth_in_stack, "status": status}, ) await self._tracker.observe_histogram( # pyright: ignore[reportPrivateUsage] "agl.store.latency", value=elapsed, labels={"method": name, "store_pubmeth": public_meth_in_stack, "status": status}, ) finally: # Reset ContextVars to their previous values if pub_token is not None: _current_public_store_method.reset(pub_token) if priv_token is not None: _current_private_store_method.reset(priv_token) return cast(T_callable, wrapper) return decorator def healthcheck_before(func: T_callable) -> T_callable: """ Decorator to run the watchdog healthcheck **before** executing the decorated method. Only runs if the store has a watchdog configured. Prevents recursive healthcheck execution using a flag on the store instance. """ @functools.wraps(func) async def wrapper(self: CollectionBasedLightningStore[T_collections], *args: Any, **kwargs: Any) -> Any: # Check if healthcheck is already running to prevent recursion if getattr(self, "_healthcheck_running", False): # Skip healthcheck if already running return await func(self, *args, **kwargs) # Set flag to prevent recursive healthcheck calls # This flag is not asyncio/thread-safe, but it doesn't matter self._healthcheck_running = True # type: ignore try: # The following methods should live inside one lock. await self._scan_for_unhealthy_rollouts() # pyright: ignore[reportPrivateUsage] finally: # Always clear the flag, even if healthcheck fails self._healthcheck_running = False # type: ignore # Execute the original method # This should be outside the lock. return await func(self, *args, **kwargs) return cast(T_callable, wrapper) def _generate_resources_id() -> str: return "rs-" + generate_id(12) def _generate_rollout_id() -> str: return "ro-" + generate_id(12) def _generate_attempt_id() -> str: """We don't need that long because attempts are limited to rollouts.""" return "at-" + generate_id(8) class CollectionBasedLightningStore(LightningStore, Generic[T_collections]): """It's the standard implementation of LightningStore that uses collections to store data. If the store implementation is to use the store's default behavior, it's recommended to inherit from this class and override the methods if needed. Bring your own collection implementation by using a different `collections` argument. The methods in this class should generally not call each other, especially those that are locked. Args: collections: The collections to use for storage. read_snapshot: Make sure read operations are atomic. If set to true, all read operations like `query_rollouts` will have better consistency. It may use an isolated snapshot that supports repeatable reads. tracker: Enable metrics tracking. scan_debounce_seconds: The debounce time for the scan for unhealthy rollouts. Set to 0 to disable debouncing. The debounce is a non-perfect traffic control. It's isolated for each store instance if there are multiple worker replicas. """ def __init__( self, collections: T_collections, *, read_snapshot: bool = False, tracker: MetricsBackend | None = None, scan_debounce_seconds: float = 10.0, ) -> None: # rollouts and spans' storage self.collections = collections self._read_snapshot = read_snapshot self._tracker = tracker self._launch_time = time.time() # Control scan debounce to avoid overloading the store. self._scan_debounce_seconds = scan_debounce_seconds last_scan_time = self._launch_time if self._scan_debounce_seconds > 0: # Allow the first scan immediately after instantiation last_scan_time -= self._scan_debounce_seconds self._last_scan_entrance_time = last_scan_time if self._tracker is not None: self._tracker.register_histogram( "agl.store.latency", ["method", "store_pubmeth", "status"], buckets=LATENCY_BUCKETS, group_level=1, ) self._tracker.register_counter( "agl.store.total", ["method", "store_pubmeth", "status"], group_level=1, ) self._tracker.register_counter( "agl.rollouts.total", ["status", "mode"], group_level=1, ) self._tracker.register_histogram( "agl.rollouts.duration", ["status", "mode"], buckets=LATENCY_BUCKETS, group_level=1, ) async def statistics(self) -> LightningStoreStatistics: """Return the statistics of the store.""" current_time = time.time() return { "name": self.__class__.__name__, "total_rollouts": await self.collections.rollouts.size(), "total_attempts": await self.collections.attempts.size(), "total_spans": await self.collections.spans.size(), "total_resources": await self.collections.resources.size(), "total_workers": await self.collections.workers.size(), "uptime": current_time - self._launch_time, } @tracked("_get_latest_resources") async def _get_latest_resources(self) -> Optional[ResourcesUpdate]: """Get the latest resources from the collections. Returns `None` if no resources are found.""" async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["resources"]) as collections: return await collections.resources.get(sort={"name": "update_time", "order": "desc"}) @tracked("_update_or_insert_worker") async def _update_or_insert_worker(self, worker: Worker, update_fields: Sequence[str] | None = None) -> Worker: """Create a worker if it doesn't exist. Update its `update_fields` if it already exists.""" async with self.collections.atomic(mode="rw", snapshot=self._read_snapshot, labels=["workers"]) as collections: updated_workers = await collections.workers.upsert([worker], update_fields=update_fields) return updated_workers[0] @tracked("_unlocked_sync_worker_with_attempt") async def _unlocked_sync_worker_with_attempt( self, collections: T_collections, attempt: Attempt, dequeue: bool ) -> None: """Update the worker's status. This can be done in a separate session.""" worker_id = attempt.worker_id if not worker_id: return worker = Worker(worker_id=worker_id) update_fields: List[str] = [] now = time.time() # This is called from dequeue_rollout if dequeue: worker.last_dequeue_time = now update_fields.append("last_dequeue_time") # NOTE: We don't check the status change anymore, in sake of performance. # Instead, we always update the last_idle_time regardless of whether the attempt status has changed. if attempt.status in ("succeeded", "failed"): worker.last_idle_time = now worker.status = "idle" worker.current_rollout_id = None worker.current_attempt_id = None update_fields.extend(["last_idle_time", "status", "current_rollout_id", "current_attempt_id"]) elif attempt.status in ("timeout", "unresponsive"): worker.last_idle_time = now worker.status = "unknown" worker.current_rollout_id = None worker.current_attempt_id = None update_fields.extend(["last_idle_time", "status", "current_rollout_id", "current_attempt_id"]) else: worker.last_busy_time = now worker.status = "busy" worker.current_rollout_id = attempt.rollout_id worker.current_attempt_id = attempt.attempt_id update_fields.extend(["last_busy_time", "status", "current_rollout_id", "current_attempt_id"]) # Validate the schema to make sure it's valid. Worker.model_validate(worker.model_dump()) await collections.workers.upsert([worker], update_fields=update_fields) @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store. This store supports no capability. The capability depends on the underlying collections. """ return LightningStoreCapabilities() @tracked("_sync_workers_with_attempts") async def _sync_workers_with_attempts(self, attempts: Sequence[Attempt], dequeue: bool = False) -> None: """Update the worker's status. Locked bulk version of `_unlocked_sync_workers_with_attempts`. Use `dequeue = True` if `last_dequeue_time` should be updated. """ async with self.collections.atomic(mode="w", snapshot=self._read_snapshot, labels=["workers"]) as collections: for attempt in attempts: await self._unlocked_sync_worker_with_attempt(collections, attempt, dequeue) @tracked("_dequeue_mark_worker_idle") async def _dequeue_mark_worker_idle(self, worker_id: str) -> None: """Dequeue fails and mark the worker as idle.""" async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["workers"]) as collections: worker = await collections.workers.get({"worker_id": {"exact": worker_id}}) now = time.time() if not worker or worker.status != "idle": # should mark the worker as idle worker = Worker(worker_id=worker_id, status="idle", last_idle_time=now, last_dequeue_time=now) await self._update_or_insert_worker(worker, update_fields=["status", "last_idle_time", "last_dequeue_time"]) else: # only update last_dequeue_time worker = Worker(worker_id=worker_id, last_dequeue_time=now) await self._update_or_insert_worker(worker, update_fields=["last_dequeue_time"]) @tracked("start_rollout") @healthcheck_before async def start_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, worker_id: str | None = None, ) -> AttemptedRollout: """Notify the store that I'm about to run a rollout. See [`LightningStore.start_rollout()`][agentlightning.LightningStore.start_rollout] for semantics. """ rollout_id = _generate_rollout_id() current_time = time.time() rollout_config = config.model_copy(deep=True) if config is not None else RolloutConfig() rollout_metadata = dict(metadata) if metadata is not None else {} if resources_id is None: latest_resources = await self._get_latest_resources() resources_id = latest_resources.resources_id if latest_resources is not None else None rollout = Rollout( rollout_id=rollout_id, input=input, mode=mode, resources_id=resources_id, start_time=current_time, status="preparing", config=rollout_config, metadata=rollout_metadata, ) # Create the initial attempt attempt_id = _generate_attempt_id() attempt = Attempt( rollout_id=rollout.rollout_id, attempt_id=attempt_id, sequence_id=1, start_time=current_time, status="preparing", worker_id=worker_id, ) async def _insert_rollout_and_attempt(collections: T_collections) -> None: await collections.attempts.insert([attempt]) await collections.rollouts.insert([rollout]) await self.collections.execute( _insert_rollout_and_attempt, mode="rw", snapshot=self._read_snapshot, commit=True, labels=["rollouts", "attempts"], ) # Notify the subclass that the rollout status has changed. all_fields = list(rollout.__class__.model_fields.keys()) await self._post_update_rollout([(rollout, all_fields)]) if worker_id is not None: await self._sync_workers_with_attempts([attempt]) # Return a rollout with attempt attached. return AttemptedRollout(**rollout.model_dump(), attempt=attempt) @tracked("_enqueue_many_rollouts") @_with_collections_execute(labels=["rollouts", "rollout_queue"]) async def _enqueue_many_rollouts(self, collections: T_collections, rollouts: Sequence[Rollout]) -> None: """Enqueue many rollouts into the rollout queue. Locked bulk version.""" rollout_ids = [rollout.rollout_id for rollout in rollouts] await collections.rollout_queue.enqueue(rollout_ids) await collections.rollouts.insert(rollouts) @tracked("_prepare_single_rollout") async def _prepare_single_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: """Prepare a single rollout object without enqueuing it. Expects resources_id to have been resolved. """ rollout_id = _generate_rollout_id() current_time = time.time() rollout_config = config.model_copy(deep=True) if config is not None else RolloutConfig() rollout_metadata = dict(metadata) if metadata is not None else {} return Rollout( rollout_id=rollout_id, input=input, mode=mode, resources_id=resources_id, start_time=current_time, status="queuing", # should be queuing config=rollout_config, metadata=rollout_metadata, ) @tracked("enqueue_rollout") @healthcheck_before async def enqueue_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: """Adds a new task to the queue with specific metadata and returns the rollout. See [`LightningStore.enqueue_rollout()`][agentlightning.LightningStore.enqueue_rollout] for semantics. """ if resources_id is None: latest_resources = await self._get_latest_resources() resources_id = latest_resources.resources_id if latest_resources is not None else None rollout = await self._prepare_single_rollout( input=input, resources_id=resources_id, mode=mode, config=config, metadata=metadata, ) await self._enqueue_many_rollouts([rollout]) # Notify the subclass that the rollout status has changed. all_fields = list(Rollout.model_fields.keys()) # Skip queueing because the rollout is already in the queue. await self._post_update_rollout([(rollout, all_fields)], skip_enqueue=True) # Return the rollout with no attempt attached. return rollout @tracked("enqueue_many_rollouts") @healthcheck_before async def enqueue_many_rollouts(self, rollouts: Sequence[EnqueueRolloutRequest]) -> Sequence[Rollout]: """Adds many rollouts in a batch.""" prepared_rollouts: List[Rollout] = [] latest_resources = await self._get_latest_resources() for request in rollouts: resources_id = request.resources_id if resources_id is None: resources_id = latest_resources.resources_id if latest_resources is not None else None rollout = await self._prepare_single_rollout( input=request.input, resources_id=resources_id, mode=request.mode, config=request.config, metadata=request.metadata, ) prepared_rollouts.append(rollout) await self._enqueue_many_rollouts(prepared_rollouts) all_fields = list(Rollout.model_fields.keys()) rollout_updates = [(rollout, all_fields) for rollout in prepared_rollouts] await self._post_update_rollout(rollout_updates, skip_enqueue=True) return prepared_rollouts @tracked("_unlocked_query_rollouts_by_rollout_ids") async def _unlocked_query_rollouts_by_rollout_ids( self, collections: T_collections, rollout_ids: Sequence[str] ) -> List[Rollout]: """Query rollouts by rollout IDs.""" if len(rollout_ids) == 0: return [] elif len(rollout_ids) == 1: # Performance optimization: use exact filter for single rollout. rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_ids[0]}}) return [rollout] if rollout is not None else [] else: result = await collections.rollouts.query({"rollout_id": {"within": rollout_ids}}) # Preserve the order of rollout_ids. result_dict = {rollout.rollout_id: rollout for rollout in result} return [result_dict[rollout_id] for rollout_id in rollout_ids if rollout_id in result_dict] @tracked("_post_dequeue_rollouts") @_with_collections_execute(labels=["rollouts", "attempts"]) async def _post_dequeue_rollouts( self, collections: T_collections, rollout_ids: Sequence[str], worker_id: Optional[str] ) -> Sequence[Tuple[AttemptedRollout, Sequence[str]]]: """Post-dequeue logic for the rollout. Returns the rollout and the update fields (for post-update logic).""" rollouts = await self._unlocked_query_rollouts_by_rollout_ids(collections, rollout_ids) if not rollouts: logger.warning(f"No rollout found for rollout IDs: {rollout_ids}, skipping dequeuing") return [] dequeue_results: List[Tuple[AttemptedRollout, Sequence[str]]] = [] for rollout in rollouts: # Check if rollout is still in a queuing state # (it might have been updated to a different status while in queue) if is_queuing(rollout): # Create a new attempt (could be first attempt or retry) attempt_id = _generate_attempt_id() current_time = time.time() # Get existing attempts to determine sequence number existing_attempts = await self._unlocked_query_attempts_for_rollout(collections, rollout.rollout_id) sequence_id = len(existing_attempts) + 1 attempt = Attempt( rollout_id=rollout.rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, start_time=current_time, status="preparing", worker_id=worker_id, ) await collections.attempts.insert([attempt]) # Sync attempt status to rollout rollout, update_fields = await self._unlocked_update_rollout_only( collections, rollout.rollout_id, status="preparing" ) dequeue_results.append((AttemptedRollout(**rollout.model_dump(), attempt=attempt), update_fields)) else: # If not in queuing state, skip this rollout and continue # (it was updated externally and should not be processed) logger.warning( f"Rollout {rollout.rollout_id} is not in queuing state: {rollout.status}, skipping dequeuing" ) return dequeue_results @tracked("dequeue_rollout") @healthcheck_before async def dequeue_rollout(self, worker_id: Optional[str] = None) -> Optional[AttemptedRollout]: """Retrieves the next task from the queue without blocking. Returns `None` if the queue is empty. Will set the rollout status to preparing and create a new attempt. See [`LightningStore.dequeue_rollout()`][agentlightning.LightningStore.dequeue_rollout] for semantics. """ # Keep looking until we find a rollout that's still in queuing status # or the queue is empty while True: async with self.collections.atomic( mode="rw", snapshot=self._read_snapshot, labels=["rollout_queue"] ) as collections: dequeued = await collections.rollout_queue.dequeue(1) if not dequeued: break rollout_id = dequeued[0] logger.debug("Rollout ID %s has been dequeued by Worker ID %s", rollout_id, worker_id) post_dequeue_result = await self._post_dequeue_rollouts([rollout_id], worker_id) if post_dequeue_result: await self._post_update_rollout(post_dequeue_result) attempted_rollout, _ = post_dequeue_result[0] if worker_id is not None: await self._sync_workers_with_attempts([attempted_rollout.attempt], dequeue=True) logger.debug("Rollout has been prepared for Worker ID %s: %s", worker_id, attempted_rollout) return attempted_rollout # else continue the loop # No valid rollouts found if worker_id is not None: # Mark the current worker as idle await self._dequeue_mark_worker_idle(worker_id) return None @tracked("dequeue_many_rollouts") @healthcheck_before async def dequeue_many_rollouts( self, *, limit: int = 1, worker_id: Optional[str] = None ) -> Sequence[AttemptedRollout]: """Retrieves up to `limit` tasks from the queue without blocking.""" dequeued_rollouts: List[AttemptedRollout] = [] # Keep looking until we find a rollout that's still in queuing status # or the queue is empty while len(dequeued_rollouts) < limit: rest_limit = limit - len(dequeued_rollouts) async with self.collections.atomic( mode="rw", snapshot=self._read_snapshot, labels=["rollout_queue"] ) as collections: dequeued = await collections.rollout_queue.dequeue(rest_limit) if not dequeued: # have no more rollouts in the queue; break. break post_dequeue_result = await self._post_dequeue_rollouts(dequeued, worker_id) if post_dequeue_result: await self._post_update_rollout(post_dequeue_result) dequeued_rollouts.extend([item for item, _ in post_dequeue_result]) # else continue the loop # Final cleanup and worker status update if worker_id is not None: if dequeued_rollouts: # NOTE: One worker can currently only associated with one attempt. # Assuming the worker is working on the last dequeued rollout. await self._sync_workers_with_attempts([dequeued_rollouts[-1].attempt], dequeue=True) else: # Mark the current worker as idle await self._dequeue_mark_worker_idle(worker_id) return dequeued_rollouts @tracked("start_attempt") @healthcheck_before async def start_attempt(self, rollout_id: str, worker_id: Optional[str] = None) -> AttemptedRollout: """Creates a new attempt for a given rollout ID and return the attempt details. See [`LightningStore.start_attempt()`][agentlightning.LightningStore.start_attempt] for semantics. """ async def _create_attempt(collections: T_collections): # Get the rollout rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if not rollout: raise ValueError(f"Rollout {rollout_id} not found") # Get existing attempts to determine sequence number existing_attempts = await self._unlocked_query_attempts_for_rollout(collections, rollout_id) sequence_id = len(existing_attempts) + 1 # We don't care whether the max attempts have reached or not # This attempt is from user trigger # Create new attempt attempt_id = _generate_attempt_id() current_time = time.time() attempt = Attempt( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, start_time=current_time, status="preparing", worker_id=worker_id, ) # Add attempt to storage await collections.attempts.insert([attempt]) # Sync attempt status to rollout rollout, update_fields = await self._unlocked_update_rollout_only( collections, rollout_id, status="preparing" ) return attempt, rollout, update_fields attempt, rollout, update_fields = await self.collections.execute( _create_attempt, mode="rw", snapshot=self._read_snapshot, commit=True, labels=["rollouts", "attempts"] ) await self._post_update_rollout([(rollout, update_fields)]) if worker_id is not None: await self._sync_workers_with_attempts([attempt]) # Return the rollout with the new attempt attached. return AttemptedRollout(**rollout.model_dump(), attempt=attempt) @tracked("query_rollouts") @healthcheck_before async def query_rollouts( self, *, status_in: Optional[Sequence[RolloutStatus]] = None, rollout_id_in: Optional[Sequence[str]] = None, rollout_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, status: Optional[Sequence[RolloutStatus]] = None, rollout_ids: Optional[Sequence[str]] = None, ) -> PaginatedResult[Union[Rollout, AttemptedRollout]]: """Retrieve rollouts with filtering and pagination. See [`LightningStore.query_rollouts()`][agentlightning.LightningStore.query_rollouts] for semantics. """ # Construct filters condition if status_in is not None: resolved_status = status_in elif status is not None: warnings.warn("status is deprecated, use status_in instead", DeprecationWarning, stacklevel=3) resolved_status = status else: resolved_status = None if rollout_id_in is not None: resolved_rollout_ids = rollout_id_in elif rollout_ids is not None: warnings.warn("rollout_ids is deprecated, use rollout_id_in instead", DeprecationWarning, stacklevel=3) resolved_rollout_ids = rollout_ids else: resolved_rollout_ids = None filters: FilterOptions = {} filters["_aggregate"] = filter_logic if resolved_status is not None: filters["status"] = {"within": list(resolved_status)} if resolved_rollout_ids is not None: rollout_id_field = cast(FilterField, filters.setdefault("rollout_id", {})) rollout_id_field["within"] = list(resolved_rollout_ids) if rollout_id_contains is not None: rollout_id_field = cast(FilterField, filters.setdefault("rollout_id", {})) rollout_id_field["contains"] = rollout_id_contains async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts", "attempts"] ) as collections: rollouts = await collections.rollouts.query( filter=filters if list(filters.keys()) != ["_aggregate"] else None, sort=SortOptions(name=sort_by, order=sort_order) if sort_by else None, limit=limit, offset=offset, ) # Attach the latest attempt to the rollout objects attempted_rollouts = await self._unlocked_many_rollouts_to_attempted_rollouts(collections, rollouts.items) return PaginatedResult( items=attempted_rollouts, limit=rollouts.limit, offset=rollouts.offset, total=rollouts.total ) @tracked("_unlocked_query_attempts_for_rollout") async def _unlocked_query_attempts_for_rollout(self, collections: T_collections, rollout_id: str) -> List[Attempt]: """The unlocked version of `query_attempts_for_rollout`.""" result = await collections.attempts.query( filter={"rollout_id": {"exact": rollout_id}}, sort={"name": "sequence_id", "order": "asc"}, ) return list(result.items) @tracked("get_rollout_by_id") @healthcheck_before async def get_rollout_by_id(self, rollout_id: str) -> Optional[Union[Rollout, AttemptedRollout]]: """Retrieves a specific rollout by its ID. See [`LightningStore.get_rollout_by_id()`][agentlightning.LightningStore.get_rollout_by_id] for semantics. If the rollout has been attempted, the latest attempt will also be returned. """ async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts", "attempts"] ) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if rollout is None: return None return await self._unlocked_rollout_to_attempted_rollout(collections, rollout) @tracked("_unlocked_rollout_to_attempted_rollout") async def _unlocked_rollout_to_attempted_rollout( self, collections: T_collections, rollout: Rollout ) -> Union[Rollout, AttemptedRollout]: """Query the latest attempt for the rollout, and attach it to the rollout object. If the rollout has no attempts, return the rollout object itself. """ latest_attempt = await self._unlocked_get_latest_attempt(collections, rollout.rollout_id) if latest_attempt is None: return rollout else: return AttemptedRollout(**rollout.model_dump(), attempt=latest_attempt) @tracked("_unlocked_many_rollouts_to_attempted_rollouts") async def _unlocked_many_rollouts_to_attempted_rollouts( self, collections: T_collections, rollouts: Sequence[Rollout] ) -> List[Union[Rollout, AttemptedRollout]]: """Query the latest attempts for the rollouts, and attach them to the rollout objects.""" # TODO: Maybe we can use asyncio.gather here to speed up the process? return [await self._unlocked_rollout_to_attempted_rollout(collections, rollout) for rollout in rollouts] @tracked("_unlocked_get_latest_attempt") async def _unlocked_get_latest_attempt(self, collections: T_collections, rollout_id: str) -> Optional[Attempt]: """The unlocked version of `get_latest_attempt`.""" return await collections.attempts.get( filter={"rollout_id": {"exact": rollout_id}}, sort={"name": "sequence_id", "order": "desc"}, ) @tracked("query_attempts") @healthcheck_before async def query_attempts( self, rollout_id: str, *, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Attempt]: """Retrieve attempts for a rollout with optional ordering/pagination.""" async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["attempts"]) as collections: return await collections.attempts.query( filter={"rollout_id": {"exact": rollout_id}}, sort={"name": sort_by, "order": sort_order} if sort_by else None, limit=limit, offset=offset, ) @tracked("get_latest_attempt") @healthcheck_before async def get_latest_attempt(self, rollout_id: str) -> Optional[Attempt]: """Retrieves the latest attempt for a given rollout ID. See [`LightningStore.get_latest_attempt()`][agentlightning.LightningStore.get_latest_attempt] for semantics. """ async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["attempts"]) as collections: return await self._unlocked_get_latest_attempt(collections, rollout_id) @tracked("query_resources") async def query_resources( self, *, resources_id: Optional[str] = None, resources_id_contains: Optional[str] = None, sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[ResourcesUpdate]: """Return every stored resource snapshot in insertion order.""" filters: FilterOptions = {} if resources_id is not None: resources_id_field = cast(FilterField, filters.setdefault("resources_id", {})) resources_id_field["exact"] = resources_id if resources_id_contains is not None: resources_id_field = cast(FilterField, filters.setdefault("resources_id", {})) resources_id_field["contains"] = resources_id_contains async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["resources"]) as collections: return await collections.resources.query( filter=filters or None, sort={"name": sort_by, "order": sort_order} if sort_by else None, limit=limit, offset=offset, ) @tracked("add_resources") async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: """Stores a new version of named resources and sets it as the latest. See [`LightningStore.add_resources()`][agentlightning.LightningStore.add_resources] for semantics. """ resources_id = _generate_resources_id() current_time = time.time() update = ResourcesUpdate( resources_id=resources_id, resources=resources, create_time=current_time, update_time=current_time, version=1, ) async with self.collections.atomic(mode="w", snapshot=self._read_snapshot, labels=["resources"]) as collections: await collections.resources.insert([update]) return update @tracked("update_resources") @healthcheck_before @_with_collections_execute(labels=["resources"]) async def update_resources( self, collections: T_collections, resources_id: str, resources: NamedResources ) -> ResourcesUpdate: """ Safely stores a new version of named resources and sets it as the latest. See [`LightningStore.update_resources()`][agentlightning.LightningStore.update_resources] for semantics. """ current_time = time.time() existing = await collections.resources.get({"resources_id": {"exact": resources_id}}) if existing is None: update = ResourcesUpdate( resources_id=resources_id, resources=resources, create_time=current_time, update_time=current_time, version=1, ) await collections.resources.insert([update]) else: update = existing.model_copy( update={ "resources": resources, "update_time": current_time, "version": existing.version + 1, } ) await collections.resources.update([update]) return update @tracked("get_resources_by_id") async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: """Retrieves a specific version of named resources by its ID. See [`LightningStore.get_resources_by_id()`][agentlightning.LightningStore.get_resources_by_id] for semantics. """ async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["resources"]) as collections: return await collections.resources.get({"resources_id": {"exact": resources_id}}) @tracked("get_latest_resources") async def get_latest_resources(self) -> Optional[ResourcesUpdate]: """Retrieves the latest version of named resources. See [`LightningStore.get_latest_resources()`][agentlightning.LightningStore.get_latest_resources] for semantics. """ return await self._get_latest_resources() @tracked("_issue_many_span_sequence_ids") async def _issue_many_span_sequence_ids(self, rollout_ids: List[str]) -> List[int]: """Issue a new span sequence ID for a given rollout.""" if not rollout_ids: return [] request_counts: Dict[str, int] = defaultdict(int) for rollout_id in rollout_ids: request_counts[rollout_id] += 1 latest_values: Dict[str, int] = {} for rollout_id, count in request_counts.items(): async with self.collections.atomic(mode="rw", snapshot=False, labels=["span_sequence_ids"]) as collections: latest_values[rollout_id] = await collections.span_sequence_ids.inc(rollout_id, count) next_value_tracker: Dict[str, int] = { rollout_id: latest_values[rollout_id] - request_counts[rollout_id] for rollout_id in request_counts } result: List[int] = [] for rollout_id in rollout_ids: next_value_tracker[rollout_id] += 1 result.append(next_value_tracker[rollout_id]) return result @tracked("_sync_span_sequence_id") async def _sync_span_sequence_id(self, rollout_id: str, sequence_id: int) -> None: """Sync the span sequence ID for a given rollout from the input span sequence ID.""" async with self.collections.atomic(mode="rw", snapshot=False, labels=["span_sequence_ids"]) as collections: await collections.span_sequence_ids.chmax(rollout_id, sequence_id) @tracked("get_next_span_sequence_id") async def get_next_span_sequence_id(self, rollout_id: str, attempt_id: str) -> int: """Get the next span sequence ID for a given rollout and attempt. The number is strictly increasing for each rollout. The store will not issue the same sequence ID twice. See [`LightningStore.get_next_span_sequence_id()`][agentlightning.LightningStore.get_next_span_sequence_id] for semantics. """ ret = await self._issue_many_span_sequence_ids([rollout_id]) return ret[0] @tracked("get_many_span_sequence_ids") async def get_many_span_sequence_ids(self, rollout_attempt_ids: Sequence[Tuple[str, str]]) -> Sequence[int]: """Get the next span sequence IDs for a given list of rollout and attempt identifiers.""" return await self._issue_many_span_sequence_ids([rollout_id for rollout_id, _ in rollout_attempt_ids]) @tracked("add_span") async def add_span(self, span: Span) -> Optional[Span]: """Persist a pre-converted span. See [`LightningStore.add_span()`][agentlightning.LightningStore.add_span] for semantics. """ # Update the sequence ID to be synced with latest input span await self._sync_span_sequence_id(span.rollout_id, span.sequence_id) successful_spans = await self._add_many_spans_helper(span.rollout_id, span.attempt_id, [span]) return successful_spans[0] if len(successful_spans) > 0 else None @tracked("add_many_spans") async def add_many_spans(self, spans: Sequence[Span]) -> Sequence[Span]: """Persist a sequence of pre-converted spans. See [`LightningStore.add_many_spans()`][agentlightning.LightningStore.add_many_spans] for semantics. """ # Group spans by rollout and attempt spans_by_rollout_attempt: Dict[Tuple[str, str], List[Span]] = defaultdict(list) for span in spans: spans_by_rollout_attempt[(span.rollout_id, span.attempt_id)].append(span) # Bulk add spans for each rollout and attempt successful_spans: List[Span] = [] for (rollout_id, attempt_id), spans in spans_by_rollout_attempt.items(): await self._sync_span_sequence_id(rollout_id, max(span.sequence_id for span in spans)) ret = await self._add_many_spans_helper(rollout_id, attempt_id, spans) successful_spans.extend(ret) return successful_spans @tracked("add_otel_span") async def add_otel_span( self, rollout_id: str, attempt_id: str, readable_span: ReadableSpan, sequence_id: int | None = None, ) -> Optional[Span]: """Add an opentelemetry span to the store. See [`LightningStore.add_otel_span()`][agentlightning.LightningStore.add_otel_span] for semantics. """ if sequence_id is None: # Issue a new sequence ID for the rollout sequence_id = (await self._issue_many_span_sequence_ids([rollout_id]))[0] else: # Comes from a provided sequence ID # Make sure our counter is strictly increasing await self._sync_span_sequence_id(rollout_id, sequence_id) span = Span.from_opentelemetry( readable_span, rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id ) ret = await self._add_many_spans_helper(rollout_id, attempt_id, [span]) return ret[0] if len(ret) > 0 else None @tracked("_insert_spans_with_fallback") async def _insert_spans_with_fallback(self, spans: Sequence[Span]) -> Sequence[Span]: """Insert spans into the store. If the insert fails, fallback to inserting one by one.""" async def _add_span_fallback(collections: T_collections, span: Span) -> bool: try: await collections.spans.insert([span]) return True except DuplicatedPrimaryKeyError: logger.error( f"Duplicated span added for rollout={span.rollout_id}, attempt={span.attempt_id}, span={span.span_id}. Skipping." ) return False successful_spans: List[Span] = [] try: # This is not guarded by commit=True. async with self.collections.atomic( mode="w", snapshot=self._read_snapshot, commit=False, labels=["spans"] ) as collections: # FIXME: Part of the insertion might complete though the full operation fails. # In that case, the "insert spans" return values might not be accurate. await collections.spans.insert(spans) successful_spans.extend(spans) except DuplicatedPrimaryKeyError: # There is a duplicate span, we warn it # We fallback to adding the spans one by one for span in spans: async with self.collections.atomic( mode="w", snapshot=self._read_snapshot, labels=["spans"] ) as collections: # No need to commit here, it will be simple atomic write operations if await _add_span_fallback(collections, span): successful_spans.append(span) return successful_spans @tracked("_add_many_spans_helper") async def _add_many_spans_helper(self, rollout_id: str, attempt_id: str, spans: Sequence[Span]) -> Sequence[Span]: """Add many spans to the store. All spans must be for the same rollout and attempt. This method is divided into three parts: 1. Verify the rollout and attempt exist; 2. Insert the spans in bulk; if insert fails, fallback to inserting one by one; 3. Update rollout and attempt status if necessary. """ async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts", "attempts"] ) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if not rollout: raise ValueError(f"Rollout {rollout_id} not found") current_attempt = await collections.attempts.get( filter={"rollout_id": {"exact": rollout_id}, "attempt_id": {"exact": attempt_id}}, ) if not current_attempt: raise ValueError(f"Attempt {attempt_id} not found for rollout {rollout_id}") successful_spans = await self._insert_spans_with_fallback(spans) if successful_spans: await self._post_add_spans(successful_spans, rollout_id, attempt_id) logger.debug("Added %d spans for rollout %s, attempt %s", len(successful_spans), rollout_id, attempt_id) return successful_spans @tracked("_post_add_spans") async def _post_add_spans(self, spans: Sequence[Span], rollout_id: str, attempt_id: str) -> None: """Update attempt heartbeat and rollout status after spans are inserted. Args: spans: Newly inserted spans. rollout_id: Identifier for the rollout receiving the spans. attempt_id: Identifier for the attempt receiving the spans. Note: The method refetches the attempt/rollout inside the transactional callback to avoid clobbering fields that might have changed after the spans were queued. """ if not spans: return rollout_update = await self._on_attempt_heartbeat(rollout_id=rollout_id, attempt_id=attempt_id) if rollout_update is not None: await self._post_update_rollout([rollout_update]) @tracked("_on_attempt_heartbeat") @_with_collections_execute(labels=["rollouts", "attempts"]) async def _on_attempt_heartbeat( self, collections: T_collections, rollout_id: str, attempt_id: str ) -> Optional[Tuple[Rollout, Sequence[str]]]: attempt = await collections.attempts.get( {"rollout_id": {"exact": rollout_id}, "attempt_id": {"exact": attempt_id}} ) if attempt is None: return None rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if rollout is None: return None # Update attempt heartbeat and ensure persistence attempt.last_heartbeat_time = time.time() if attempt.status in ["preparing", "unresponsive"]: attempt.status = "running" await collections.attempts.update([attempt], update_fields=["last_heartbeat_time", "status"]) # If the status has already timed out or failed, do not change it (but heartbeat is still recorded) # Update rollout status if it's the latest attempt rollout_updated: bool = False updated_fields: List[str] = [] latest_attempt = await self._unlocked_get_latest_attempt(collections, rollout.rollout_id) if latest_attempt is not None and attempt.attempt_id == latest_attempt.attempt_id: if rollout.status in ["preparing", "queueing", "requeuing"]: # If rollout is currently preparing or queuing, set it to running rollout.status = "running" await collections.rollouts.update([rollout], update_fields=["status"]) rollout_updated = True updated_fields = ["status"] # Otherwise, the rollout has succeeded or failed, do nothing return (rollout, updated_fields) if rollout_updated else None @tracked("wait_for_rollouts") @healthcheck_before async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: """Wait for specified rollouts to complete with a timeout. Returns the completed rollouts, potentially incomplete if timeout is reached. This method does not change the state of the store. See [`LightningStore.wait_for_rollouts()`][agentlightning.LightningStore.wait_for_rollouts] for semantics. """ # Wait for all rollouts concurrently rollouts = await asyncio.gather( *[self.wait_for_rollout(rid, timeout) for rid in rollout_ids], return_exceptions=True ) for rollout_id, rollout in zip(rollout_ids, rollouts): if isinstance(rollout, Exception): logger.error(f"Error waiting for rollout {rollout_id}: {rollout}") # Filter out the exceptions ret = [rollout for rollout in rollouts if isinstance(rollout, Rollout)] finished_rollout_ids = set([rollout.rollout_id for rollout in ret]) unfinished_rollout_ids = set(rollout_ids) - finished_rollout_ids logger.debug( "Waiting for rollouts. Number of finished rollouts: %d; number of unfinished rollouts: %d", len(finished_rollout_ids), len(unfinished_rollout_ids), ) if len(unfinished_rollout_ids) < 30: logger.debug("Unfinished rollouts: %s", unfinished_rollout_ids) return ret @tracked("wait_for_rollout") async def wait_for_rollout(self, rollout_id: str, timeout: Optional[float] = None) -> Optional[Rollout]: """Wait for a specific rollout to complete with a timeout. Subclass may use advanced mechanisms like events to accelerate this. Returns the completed rollout, or None if timeout is reached. """ # First check if already completed async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["rollouts"]) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if rollout is None: # Rollout does not exist, return immediately return None if is_finished(rollout): # Rollout is already finished, return immediately return rollout # No timeout, return immediately if timeout is not None and timeout <= 0: return None start_time = time.time() deadline = start_time + timeout if timeout is not None else None # If not completed, wait for completion while deadline is None or time.time() < deadline: # Poll every 10 seconds by default rest_time = max(0.01, min(deadline - time.time(), 10.0)) if deadline is not None else 10.0 await asyncio.sleep(rest_time) async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts"] ) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) # check if rollout is finished if rollout and is_finished(rollout): return rollout return None @tracked("query_spans") @healthcheck_before # latest can point to a different attempt async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, *, trace_id: Optional[str] = None, trace_id_contains: Optional[str] = None, span_id: Optional[str] = None, span_id_contains: Optional[str] = None, parent_id: Optional[str] = None, parent_id_contains: Optional[str] = None, name: Optional[str] = None, name_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", limit: int = -1, offset: int = 0, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", ) -> PaginatedResult[Span]: """ Query and retrieve spans associated with a specific rollout ID. Returns an empty list if no spans are found. See [`LightningStore.query_spans()`][agentlightning.LightningStore.query_spans] for semantics. """ resolved_attempt_id: Optional[str] if attempt_id is None: resolved_attempt_id = None elif attempt_id == "latest": async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["attempts"] ) as collections: latest_attempt = await self._unlocked_get_latest_attempt(collections, rollout_id) if not latest_attempt: logger.debug(f"No attempts found for rollout {rollout_id} when querying latest spans") return PaginatedResult(items=[], limit=limit, offset=offset, total=0) resolved_attempt_id = latest_attempt.attempt_id else: resolved_attempt_id = attempt_id must_filter: Dict[str, FilterField] = {"rollout_id": {"exact": rollout_id}} if resolved_attempt_id is not None: must_filter["attempt_id"] = {"exact": resolved_attempt_id} filter_options: FilterOptions = { "_aggregate": filter_logic, # this can be and/or "_must": must_filter, # Must satisfy all the filters in the must list } def _resolve_filter_field( field_name: str, filter_exact: Optional[str] | None, filter_contains: Optional[str] | None ) -> None: field = cast(FilterField, filter_options.setdefault(field_name, {})) if filter_exact is not None: field["exact"] = filter_exact if filter_contains is not None: field["contains"] = filter_contains _resolve_filter_field("trace_id", trace_id, trace_id_contains) _resolve_filter_field("span_id", span_id, span_id_contains) _resolve_filter_field("parent_id", parent_id, parent_id_contains) _resolve_filter_field("name", name, name_contains) async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["spans"]) as collections: return await collections.spans.query( filter=filter_options, sort={"name": sort_by, "order": sort_order} if sort_by else None, limit=limit, offset=offset, ) @tracked("update_rollout") @healthcheck_before async def update_rollout( self, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Rollout: """Update the rollout status and related metadata. See [`LightningStore.update_rollout()`][agentlightning.LightningStore.update_rollout] for semantics. """ async with self.collections.atomic(mode="w", snapshot=self._read_snapshot, labels=["rollouts"]) as collections: rollout, update_fields = await self._unlocked_update_rollout_only( collections=collections, rollout_id=rollout_id, input=input, mode=mode, resources_id=resources_id, status=status, config=config, metadata=metadata, ) await self._post_update_rollout([(rollout, update_fields)]) return rollout @tracked("update_attempt") @healthcheck_before async def update_attempt( self, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Attempt: """Update a specific or latest attempt for a given rollout. See [`LightningStore.update_attempt()`][agentlightning.LightningStore.update_attempt] for semantics. """ attempt, rollout_update, worker_sync_required = await self.collections.execute( lambda collections: self._unlocked_update_attempt_and_rollout( collections=collections, rollout_id=rollout_id, attempt_id=attempt_id, status=status, worker_id=worker_id, last_heartbeat_time=last_heartbeat_time, metadata=metadata, ), mode="rw", snapshot=self._read_snapshot, commit=True, labels=["rollouts", "attempts"], ) if rollout_update: await self._post_update_rollout([rollout_update]) if worker_sync_required: await self._sync_workers_with_attempts([attempt]) return attempt @tracked("_unlocked_update_rollout_only") async def _unlocked_update_rollout_only( self, collections: T_collections, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Tuple[Rollout, Sequence[str]]: """Update the rollout status and related metadata only. Not updating related attempts or workers. There is only one update operation call inside; so commit is not strictly required. """ rollout_construct_params: Dict[str, Any] = {"rollout_id": rollout_id} # Update fields if they are not UNSET if not isinstance(input, Unset): rollout_construct_params["input"] = input if not isinstance(mode, Unset): rollout_construct_params["mode"] = mode if not isinstance(resources_id, Unset): rollout_construct_params["resources_id"] = resources_id if not isinstance(status, Unset): rollout_construct_params["status"] = status if not isinstance(config, Unset): rollout_construct_params["config"] = config if not isinstance(metadata, Unset): rollout_construct_params["metadata"] = metadata # Set end time for finished rollouts # Rollout is only finished when it succeeded or fail with no more retries. if not isinstance(status, Unset) and status in ["failed", "succeeded", "cancelled"]: rollout_construct_params["end_time"] = time.time() update_fields = list(rollout_construct_params.keys()) # Set required fields for validation purposes. rollout_construct_params.setdefault("input", None) rollout_construct_params.setdefault("start_time", 0.0) rollout_obj = Rollout.model_validate(rollout_construct_params) rollouts_updated = await collections.rollouts.update([rollout_obj], update_fields=update_fields) return rollouts_updated[0], update_fields @tracked("_post_update_rollout") async def _post_update_rollout( self, rollouts: Sequence[Tuple[Rollout, Sequence[str]]], skip_enqueue: bool = False ) -> None: """Post-update logic for the rollout. This method has locks inside, so it should be called with the lock held. Args: rollouts: A sequence of tuples, each containing a rollout and the fields that were updated. skip_enqueue: Whether to skip queueing the rollouts. """ for rollout, updated_fields in rollouts: # Sometimes "end_time" is set but it's not really updated. if "end_time" in updated_fields and is_finished(rollout): if self._tracker is not None: labels = { "status": rollout.status, "mode": rollout.mode if rollout.mode is not None else "unknown", } duration = cast(float, rollout.end_time) - rollout.start_time await self._tracker.inc_counter("agl.rollouts.total", labels=labels) await self._tracker.observe_histogram( "agl.rollouts.duration", value=duration, labels=labels, ) if not skip_enqueue: # If requeuing, add back to queue. # Check whether the rollout is already in queue. candidate_requeue_rollouts = [ rollout.rollout_id for rollout, updated_fields in rollouts if "status" in updated_fields and is_queuing(rollout) ] if candidate_requeue_rollouts: # Do another filter: filter out rollouts that are already in the queue. async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollout_queue"] ) as collections: candidate_requeue_rollouts = [ rollout_id for rollout_id in candidate_requeue_rollouts if not await collections.rollout_queue.has(rollout_id) ] if candidate_requeue_rollouts: async with self.collections.atomic( mode="w", snapshot=self._read_snapshot, labels=["rollout_queue"] ) as collections: await collections.rollout_queue.enqueue(candidate_requeue_rollouts) # NOTE: We also don't need to remove non-queuing rollouts from the queue. @tracked("_unlocked_update_attempt_and_rollout") async def _unlocked_update_attempt_and_rollout( self, collections: T_collections, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Tuple[Attempt, Optional[Tuple[Rollout, Sequence[str]]], bool]: """Update an attempt. The attempt status is propagated to the rollout if the attempt is the latest attempt. Returns: - The updated attempt - The updated rollout (or none if unchanged); post-rollout-update is not invoked yet - Whether the worker needs to be synced """ # No lock, but with status propagation. rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if not rollout: raise ValueError(f"Rollout {rollout_id} not found") latest_attempt = await self._unlocked_get_latest_attempt(collections, rollout_id) if not latest_attempt: raise ValueError(f"No attempts found for rollout {rollout_id}") # Find the attempt to update if attempt_id == "latest": attempt = latest_attempt else: attempt = await collections.attempts.get( {"rollout_id": {"exact": rollout_id}, "attempt_id": {"exact": attempt_id}} ) if not attempt: raise ValueError(f"Attempt {attempt_id} not found for rollout {rollout_id}") worker_sync_required = False # Update fields if they are not UNSET if not isinstance(worker_id, Unset): attempt.worker_id = worker_id worker_sync_required = worker_sync_required or bool(worker_id) if not isinstance(status, Unset): attempt.status = status # Also update end_time if the status indicates completion if status in ["failed", "succeeded"]: attempt.end_time = time.time() worker_sync_required = worker_sync_required or bool(attempt.worker_id) if not isinstance(last_heartbeat_time, Unset): attempt.last_heartbeat_time = last_heartbeat_time if not isinstance(metadata, Unset): attempt.metadata = metadata # Re-validate the attempt to ensure legality Attempt.model_validate(attempt.model_dump()) # Update the attempt in storage await collections.attempts.update([attempt]) rollout_update: Optional[Tuple[Rollout, Sequence[str]]] = None if attempt.attempt_id == latest_attempt.attempt_id: # Propagate the status to the rollout rollout_status = await rollout_status_from_attempt(attempt, rollout.config) if rollout_status != rollout.status: updated_rollout, update_fields = await self._unlocked_update_rollout_only( collections, rollout_id, status=rollout_status ) rollout_update = (updated_rollout, update_fields) return attempt, rollout_update, worker_sync_required @tracked("query_workers") @healthcheck_before async def query_workers( self, *, status_in: Optional[Sequence[WorkerStatus]] = None, worker_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> PaginatedResult[Worker]: """Return the current snapshot of all workers.""" filters: FilterOptions = {} if status_in is not None: filters["status"] = {"within": list(status_in)} if worker_id_contains is not None: filters["worker_id"] = {"contains": worker_id_contains} filters["_aggregate"] = filter_logic async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["workers"]) as collections: return await collections.workers.query( filter=filters if list(filters.keys()) != ["_aggregate"] else None, sort={"name": sort_by, "order": sort_order} if sort_by else None, limit=limit, offset=offset, ) @tracked("get_worker_by_id") async def get_worker_by_id(self, worker_id: str) -> Optional[Worker]: async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["workers"]) as collections: return await collections.workers.get({"worker_id": {"exact": worker_id}}) @tracked("update_worker") async def update_worker( self, worker_id: str, heartbeat_stats: Dict[str, Any] | Unset = UNSET, ) -> Worker: """Create or update a worker entry.""" update_fields = ["last_heartbeat_time"] new_worker = Worker(worker_id=worker_id, last_heartbeat_time=time.time()) if not isinstance(heartbeat_stats, Unset): update_fields.append("heartbeat_stats") new_worker.heartbeat_stats = dict(heartbeat_stats) return await self._update_or_insert_worker(new_worker, update_fields=update_fields) @tracked("_unlocked_get_running_rollouts") async def _unlocked_get_running_rollouts(self, collections: T_collections) -> List[AttemptedRollout]: """Get all running rollouts. As this is invoked very frequently (probably at every requests), subclass can implement hacks to make it more efficient. It should also be unlocked and let the caller hold the lock. """ filtered_rollouts = await collections.rollouts.query(filter={"status": {"within": ["preparing", "running"]}}) running_rollouts = await self._unlocked_many_rollouts_to_attempted_rollouts(collections, filtered_rollouts) running_attempted_rollouts: List[AttemptedRollout] = [] for rollout in running_rollouts: if not isinstance(rollout, AttemptedRollout): logger.error(f"Rollout {rollout.rollout_id} is running but has no attempts") continue running_attempted_rollouts.append(rollout) return running_attempted_rollouts @tracked("_scan_for_unhealthy_rollouts") async def _scan_for_unhealthy_rollouts(self) -> None: """Perform healthcheck against all running rollouts in the store.""" if not await self._should_scan_for_unhealthy_rollouts(): return rollouts, attempts_sync_required = await self._find_and_update_unhealthy_rollouts() if rollouts: await self._post_update_rollout(rollouts) # Sync worker status if attempts_sync_required: await self._sync_workers_with_attempts(attempts_sync_required) @tracked("_should_scan_for_unhealthy_rollouts") async def _should_scan_for_unhealthy_rollouts(self) -> bool: """Check if the scan for unhealthy rollouts should be performed.""" if self._scan_debounce_seconds <= 0: return True now = time.time() should_scan = now - self._last_scan_entrance_time >= self._scan_debounce_seconds if not should_scan: return False # Someone else may be racing for the same scan. Double-check inside the lock. async with self.collections.atomic(mode="rw", snapshot=self._read_snapshot, labels=["generic"]): now = time.time() if now - self._last_scan_entrance_time < self._scan_debounce_seconds: return False self._last_scan_entrance_time = now return True @tracked("_find_and_update_unhealthy_rollouts") @_with_collections_execute(labels=["rollouts", "attempts"]) async def _find_and_update_unhealthy_rollouts( self, collections: T_collections ) -> Tuple[List[Tuple[Rollout, Sequence[str]]], List[Attempt]]: """Batch update the status of unhealthy attempts. Returns: - The list of rollouts that have been updated - The list of attempts that need worker-sync """ running_rollouts = await self._unlocked_get_running_rollouts(collections) candidate_updates = await scan_unhealthy_rollouts(running_rollouts) if not candidate_updates: return [], [] rollouts: List[Tuple[Rollout, Sequence[str]]] = [] attempts: List[Attempt] = [] for (rollout_id, attempt_id), status in candidate_updates.items(): attempt, rollout_update, worker_sync_required = await self._unlocked_update_attempt_and_rollout( collections, rollout_id, attempt_id, status=status ) if rollout_update: rollouts.append(rollout_update) if worker_sync_required: attempts.append(attempt) return rollouts, attempts # _scan_for_unhealthy_rollouts is somehow standalone and automatically invoked. COLLECTION_STORE_PUBLIC_METHODS = frozenset( [name for name in LightningStore.__dict__ if not name.startswith("_")] + ["_scan_for_unhealthy_rollouts"] ) COLLECTION_STORE_ALL_METHODS = frozenset([name for name in CollectionBasedLightningStore.__dict__]) def get_current_store_methods() -> Tuple[str, str]: """Get the current store method names from ContextVars. This is a fast O(1) replacement for stack introspection. The ContextVars are set by the @tracked decorator when entering store methods. Returns: A tuple of (public_method_name, private_method_name). """ return _current_public_store_method.get(), _current_private_store_method.get() ================================================ FILE: agentlightning/store/memory.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging import sys from collections.abc import Iterable from collections.abc import Mapping as MappingABC from typing import ( Any, Callable, Counter, Dict, List, Literal, Mapping, Optional, Sequence, Set, Tuple, TypeVar, Union, cast, ) import aiologic from pydantic import BaseModel from agentlightning.types import AttemptedRollout, NamedResources, PaginatedResult, ResourcesUpdate, Rollout, Span from agentlightning.utils.metrics import MetricsBackend from .base import UNSET, LightningStoreCapabilities, LightningStoreStatistics, Unset, is_finished, is_running from .collection import InMemoryLightningCollections from .collection_based import CollectionBasedLightningStore, tracked T_callable = TypeVar("T_callable", bound=Callable[..., Any]) logger = logging.getLogger(__name__) def estimate_model_size(obj: Any) -> int: """Rough recursive size estimate for Pydantic BaseModel instances.""" if isinstance(obj, BaseModel): values = cast(Iterable[Any], obj.__dict__.values()) return sum(estimate_model_size(value) for value in values) + sys.getsizeof(cast(object, obj)) if isinstance(obj, MappingABC): mapping = cast(Mapping[Any, Any], obj) return sum(estimate_model_size(value) for value in mapping.values()) + sys.getsizeof(cast(object, obj)) if isinstance(obj, (list, tuple, set)): iterable = cast(Iterable[Any], obj) return sum(estimate_model_size(value) for value in iterable) + sys.getsizeof(cast(object, obj)) return sys.getsizeof(cast(object, obj)) def _detect_total_memory_bytes() -> int: """Best-effort detection of the total available system memory in bytes.""" try: import psutil return int(psutil.virtual_memory().total) except ImportError: # Fallback to 8GB if memory cannot be detected. logger.error("psutil is not installed. Falling back to 8GB of memory in total.") return 8 * 1024**3 class InMemoryLightningStore(CollectionBasedLightningStore[InMemoryLightningCollections]): """ In-memory implementation of LightningStore using Python data structures. Thread-safe and async-compatible but data is not persistent. Args: thread_safe: Whether the store is thread-safe. eviction_memory_threshold: The threshold for evicting spans in bytes. By default, it's 70% of the total VRAM available. safe_memory_threshold: The threshold for safe memory usage in bytes. By default, it's 80% of the eviction threshold. span_size_estimator: A function to estimate the size of a span in bytes. By default, it's a simple size estimator that uses sys.getsizeof. tracker: The metrics tracker to use. scan_debounce_seconds: The debounce time for the scan for unhealthy rollouts. Set to 0 to disable debouncing. """ def __init__( self, *, thread_safe: bool = False, eviction_memory_threshold: float | int | None = None, safe_memory_threshold: float | int | None = None, span_size_estimator: Callable[[Span], int] | None = None, tracker: MetricsBackend | None = None, scan_debounce_seconds: float = 10.0, ): super().__init__( collections=InMemoryLightningCollections(lock_type="thread" if thread_safe else "asyncio", tracker=tracker), tracker=tracker, scan_debounce_seconds=scan_debounce_seconds, ) self._thread_safe = thread_safe self._start_time_by_rollout: Dict[str, float] = {} self._span_bytes_by_rollout: Dict[str, int] = Counter() self._total_span_bytes: int = 0 self._evicted_rollout_span_sets: Set[str] = set() self._memory_capacity_bytes = _detect_total_memory_bytes() if self._memory_capacity_bytes <= 0: raise ValueError("Detected memory capacity must be positive") self._eviction_threshold_bytes = self._resolve_memory_threshold( eviction_memory_threshold, default_ratio=0.7, capacity_bytes=self._memory_capacity_bytes, name="eviction_memory_threshold", minimum=1, ) if safe_memory_threshold is None: safe_memory_threshold = max(int(self._eviction_threshold_bytes * 0.8), 0) self._safe_threshold_bytes = self._resolve_memory_threshold( safe_memory_threshold, default_ratio=self._eviction_threshold_bytes / self._memory_capacity_bytes, capacity_bytes=self._memory_capacity_bytes, name="safe_memory_threshold", minimum=0, ) if not (0 <= self._safe_threshold_bytes < self._eviction_threshold_bytes): raise ValueError("safe_memory_threshold must be smaller than eviction_memory_threshold") self._custom_span_size_estimator = span_size_estimator # Completion tracking for wait_for_rollouts (cross-loop safe) self._completion_events: Dict[str, aiologic.Event] = {} # Running rollouts cache, including preparing and running rollouts self._running_rollout_ids: Set[str] = set() # Caches the latest resources ID. self._latest_resources_id: Union[str, None, Unset] = UNSET @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" return LightningStoreCapabilities( thread_safe=self._thread_safe, async_safe=True, zero_copy=False, otlp_traces=False, ) async def statistics(self) -> LightningStoreStatistics: """Return the statistics of the store.""" return { **(await super().statistics()), "total_span_bytes": self._total_span_bytes, "eviction_threshold_bytes": self._eviction_threshold_bytes, "safe_threshold_bytes": self._safe_threshold_bytes, "memory_capacity_bytes": self._memory_capacity_bytes, } @tracked("wait_for_rollout") async def wait_for_rollout(self, rollout_id: str, timeout: Optional[float] = None) -> Optional[Rollout]: """Wait for a specific rollout to complete with a timeout.""" async with self.collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["rollouts"]) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if rollout and is_finished(rollout): return rollout if timeout is not None and timeout <= 0: return None # If not completed and we have an event, wait for completion if rollout_id in self._completion_events: evt = self._completion_events[rollout_id] # Wait for the event with proper timeout handling # evt.wait() returns True if event was set, False if timeout occurred if timeout is None: # Wait indefinitely by polling with finite timeouts # This allows threads to exit cleanly on shutdown while True: result = await asyncio.to_thread(evt.wait, 10.0) # Poll every 10 seconds if result: # Event was set break # Loop and check again (continues indefinitely since timeout=None) else: # Wait with the specified timeout result = await asyncio.to_thread(evt.wait, timeout) # If event was set (not timeout), check if rollout is finished if result: async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts"] ) as collections: rollout = await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) if rollout and is_finished(rollout): return rollout return None @tracked("add_resources_inmemory") async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: ret = await super().add_resources(resources) async with self.collections.atomic(mode="rw", snapshot=self._read_snapshot, labels=["resources"]): self._latest_resources_id = ret.resources_id return ret @tracked("update_resources_inmemory") async def update_resources(self, resources_id: str, resources: NamedResources) -> ResourcesUpdate: ret = await super().update_resources(resources_id, resources) async with self.collections.atomic(mode="rw", snapshot=self._read_snapshot, labels=["resources"]): self._latest_resources_id = ret.resources_id return ret @tracked("_post_update_rollout_inmemory") async def _post_update_rollout( self, rollouts: Sequence[Tuple[Rollout, Sequence[str]]], skip_enqueue: bool = False ) -> None: """Update the running rollout ids set when the rollout updates.""" await super()._post_update_rollout(rollouts, skip_enqueue=skip_enqueue) async with self.collections.atomic(mode="rw", snapshot=self._read_snapshot, labels=["rollouts"]): for rollout, _ in rollouts: if is_running(rollout): self._running_rollout_ids.add(rollout.rollout_id) else: self._running_rollout_ids.discard(rollout.rollout_id) if is_finished(rollout): self._completion_events.setdefault(rollout.rollout_id, aiologic.Event()) self._completion_events[rollout.rollout_id].set() else: self._completion_events.setdefault(rollout.rollout_id, aiologic.Event()) # Rollout status can never transition from finished to running (unlike attempt) # so we don't need to clear the completion event even in case of retrying. if rollout.rollout_id not in self._start_time_by_rollout: self._start_time_by_rollout[rollout.rollout_id] = rollout.start_time @tracked("_unlocked_query_rollouts_by_rollout_ids") async def _unlocked_query_rollouts_by_rollout_ids( self, collections: InMemoryLightningCollections, rollout_ids: Sequence[str] ) -> List[Rollout]: """Always use exact. This is faster than within filter for in-memory store.""" if len(rollout_ids) == 0: return [] rollouts = [await collections.rollouts.get({"rollout_id": {"exact": rollout_id}}) for rollout_id in rollout_ids] return [rollout for rollout in rollouts if rollout is not None] @tracked("_unlocked_get_running_rollouts") async def _unlocked_get_running_rollouts(self, collections: InMemoryLightningCollections) -> List[AttemptedRollout]: """Accelerated version of `_unlocked_get_running_rollouts` for in-memory store. Used for healthcheck.""" async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts", "attempts"] ) as collections: rollouts = await self._unlocked_query_rollouts_by_rollout_ids(collections, list(self._running_rollout_ids)) running_rollouts: List[AttemptedRollout] = [] for rollout in rollouts: latest_attempt = await collections.attempts.get( filter={"rollout_id": {"exact": rollout.rollout_id}}, sort={"name": "sequence_id", "order": "desc"}, ) if not latest_attempt: # The rollout is running but has no attempts, this should not happen logger.error(f"Rollout {rollout.rollout_id} is running but has no attempts") continue running_rollouts.append(AttemptedRollout(**rollout.model_dump(), attempt=latest_attempt)) return running_rollouts @tracked("query_spans_inmemory") # Since this method calls super, we need to track it separately async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, **kwargs: Any, ) -> PaginatedResult[Span]: if rollout_id in self._evicted_rollout_span_sets: raise RuntimeError(f"Spans for rollout {rollout_id} have been evicted") return await super().query_spans(rollout_id, attempt_id, **kwargs) @tracked("_post_add_spans") async def _post_add_spans(self, spans: Sequence[Span], rollout_id: str, attempt_id: str) -> None: """In-memory store needs to maintain the span data in memory, and evict spans when memory is low.""" await super()._post_add_spans(spans, rollout_id, attempt_id) async with self.collections.atomic( mode="rw", snapshot=self._read_snapshot, labels=["rollouts", "spans"] ) as collections: for span in spans: await self._account_span_size(span) await self._maybe_evict_spans(collections) @tracked("_get_latest_resources_inmemory") async def _get_latest_resources(self) -> Optional[ResourcesUpdate]: if isinstance(self._latest_resources_id, Unset): return await super()._get_latest_resources() if self._latest_resources_id is not None: async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["resources"] ) as collections: return await collections.resources.get(filter={"resources_id": {"exact": self._latest_resources_id}}) return None @staticmethod def _resolve_memory_threshold( value: float | int | None, *, default_ratio: float, capacity_bytes: int, name: str, minimum: int, ) -> int: if value is None: resolved = int(capacity_bytes * default_ratio) elif isinstance(value, float): if minimum == 0: if not (0 <= value <= 1): raise ValueError(f"{name} ratio must be between 0 and 1 inclusive") else: if not (0 < value <= 1): raise ValueError(f"{name} ratio must be greater than 0 and at most 1") resolved = int(capacity_bytes * value) else: value_int = value if value_int < 0: raise ValueError(f"{name} must be non-negative") resolved = value_int if resolved < minimum: raise ValueError(f"{name} must be at least {minimum} bytes") return resolved @tracked("_account_span_size") async def _account_span_size(self, span: Span) -> int: if self._custom_span_size_estimator is not None: size = max(int(self._custom_span_size_estimator(span)), 0) else: size = estimate_model_size(span) self._span_bytes_by_rollout[span.rollout_id] += size self._total_span_bytes += size return size @tracked("_maybe_evict_spans") async def _maybe_evict_spans(self, collections: InMemoryLightningCollections) -> None: if self._total_span_bytes <= self._eviction_threshold_bytes: return logger.info( f"Total span bytes: {self._total_span_bytes}, eviction threshold: {self._eviction_threshold_bytes}, " f"safe threshold: {self._safe_threshold_bytes}. Evicting spans..." ) candidates: List[tuple[float, str]] = [ (start_time, rollout_id) for rollout_id, start_time in self._start_time_by_rollout.items() ] candidates.sort() logger.info(f"Evicting spans for {len(candidates)} rollouts to free up memory...") memory_consumed_before = self._total_span_bytes for _, rollout_id in candidates: if self._total_span_bytes <= self._safe_threshold_bytes: break logger.debug(f"Evicting spans for rollout {rollout_id} to free up memory...") await self._evict_spans_for_rollout(collections, rollout_id) logger.info(f"Freed up {memory_consumed_before - self._total_span_bytes} bytes of memory") @tracked("_evict_spans_for_rollout") async def _evict_spans_for_rollout(self, collections: InMemoryLightningCollections, rollout_id: str) -> None: await collections.evict_spans_for_rollout(rollout_id) removed_bytes = self._span_bytes_by_rollout.pop(rollout_id, 0) if removed_bytes > 0: # There is something removed for real self._total_span_bytes = max(self._total_span_bytes - removed_bytes, 0) self._evicted_rollout_span_sets.add(rollout_id) ================================================ FILE: agentlightning/store/mongo.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import hashlib import logging import time import uuid from typing import Any, Callable, Dict, List, Mapping, Optional, Sequence, TypeVar, Union from agentlightning.types import Attempt, AttemptedRollout, Rollout from agentlightning.utils.metrics import MetricsBackend from .base import LightningStoreCapabilities, is_finished from .collection.mongo import MongoClientPool, MongoLightningCollections from .collection_based import CollectionBasedLightningStore, healthcheck_before, tracked T_callable = TypeVar("T_callable", bound=Callable[..., Any]) logger = logging.getLogger(__name__) def _generate_partition_id() -> str: return "pt-" + hashlib.sha1(uuid.uuid4().bytes).hexdigest()[:12] class MongoLightningStore(CollectionBasedLightningStore[MongoLightningCollections]): """ MongoDB implementation of LightningStore using MongoDB collections. Data is persistent and can be shared between multiple processes. Args: mongo_uri: MongoDB connection string (defaults to local replica set). mongo_client_kwargs: Extra keyword arguments forwarded to `AsyncMongoClient`. database_name: The MongoDB database name. Defaults to ``agentlightning``. partition_id: The partition id. Useful when sharing the database among multiple Agent-lightning trainers. tracker: The metrics tracker to use. scan_debounce_seconds: The debounce time for the scan for unhealthy rollouts. Set to 0 to disable debouncing. """ def __init__( self, *, mongo_uri: str = "mongodb://localhost:27017/?replicaSet=rs0", mongo_client_kwargs: Mapping[str, Any] | None = None, database_name: str | None = None, partition_id: str | None = None, tracker: MetricsBackend | None = None, scan_debounce_seconds: float = 10.0, ) -> None: self._mongo_uri = mongo_uri self._mongo_client_kwargs = dict(mongo_client_kwargs or {}) if database_name is None: database_name = "agentlightning" logger.info("No database name provided, using default 'agentlightning'") if partition_id is None: partition_id = _generate_partition_id() logger.info("No partition id provided, generated a new one: %s", partition_id) self._client_pool = MongoClientPool[Mapping[str, Any]]( mongo_uri=self._mongo_uri, mongo_client_kwargs=self._mongo_client_kwargs, ) super().__init__( collections=MongoLightningCollections( self._client_pool, database_name, partition_id, tracker=tracker, ), tracker=tracker, scan_debounce_seconds=scan_debounce_seconds, ) @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" return LightningStoreCapabilities( thread_safe=True, async_safe=True, zero_copy=True, otlp_traces=False, ) async def close(self) -> None: """Close the store by closing the client pool.""" await self._client_pool.close() @tracked("wait_for_rollouts") @healthcheck_before async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: """Wait for specified rollouts to complete with a timeout. Concurrently wait for all rollouts to complete with a timeout. """ start_time = time.time() current_time = start_time deadline = start_time + timeout if timeout is not None else None finished_rollouts: Dict[str, Rollout] = {} unfinished_rollout_ids = set(rollout_ids) while deadline is None or current_time <= deadline: async with self.collections.atomic( mode="r", snapshot=self._read_snapshot, labels=["rollouts"] ) as collections: # Query the rollouts that are not finished in a single query rollouts = await collections.rollouts.query( filter={"rollout_id": {"within": list(unfinished_rollout_ids)}} ) for rollout in rollouts.items: if is_finished(rollout): finished_rollouts[rollout.rollout_id] = rollout unfinished_rollout_ids.remove(rollout.rollout_id) if not unfinished_rollout_ids: break # Poll every 10 seconds by default # Minus 0.1 to make sure the time is still sufficient for another call rest_time = max(0.01, min(deadline - time.time() - 0.1, 10.0)) if deadline is not None else 10.0 await asyncio.sleep(rest_time) current_time = time.time() # Logging will help debugging when there are stuck rollouts. logger.debug( "Waiting for rollouts. Number of finished rollouts: %d; number of unfinished rollouts: %d", len(finished_rollouts), len(unfinished_rollout_ids), ) if len(unfinished_rollout_ids) < 30: logger.debug("Unfinished rollouts: %s", unfinished_rollout_ids) # Reorder the rollouts to match the input order return [finished_rollouts[rollout_id] for rollout_id in rollout_ids if rollout_id in finished_rollouts] @tracked("_unlocked_many_rollouts_to_attempted_rollouts") async def _unlocked_many_rollouts_to_attempted_rollouts( self, collections: MongoLightningCollections, rollouts: Sequence[Rollout] ) -> List[Union[Rollout, AttemptedRollout]]: """Query the latest attempts for the rollouts, and attach them to the rollout objects.""" async with collections.atomic(mode="r", snapshot=self._read_snapshot, labels=["attempts"]) as collections: attempts = await collections.attempts.query( filter={"rollout_id": {"within": [rollout.rollout_id for rollout in rollouts]}}, sort={"name": "sequence_id", "order": "desc"}, ) latest_attempts: Dict[str, Attempt] = {} for attempt in attempts: if attempt.rollout_id not in latest_attempts: latest_attempts[attempt.rollout_id] = attempt # Otherwise we ignore the attempt because there's already a newer attempt return [ ( AttemptedRollout(**rollout.model_dump(), attempt=latest_attempts[rollout.rollout_id]) if rollout.rollout_id in latest_attempts else rollout ) for rollout in rollouts ] ================================================ FILE: agentlightning/store/sqlite.py ================================================ # Copyright (c) Microsoft. All rights reserved. # TODO: Implement this ================================================ FILE: agentlightning/store/threading.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import threading from typing import Any, Dict, List, Literal, Optional, Sequence, Tuple from opentelemetry.sdk.trace import ReadableSpan from agentlightning.types import ( Attempt, AttemptedRollout, AttemptStatus, EnqueueRolloutRequest, NamedResources, ResourcesUpdate, Rollout, RolloutConfig, RolloutStatus, Span, TaskInput, Worker, WorkerStatus, ) from .base import UNSET, LightningStore, LightningStoreCapabilities, LightningStoreStatistics, Unset class LightningStoreThreaded(LightningStore): """Facade that delegates all store operations to a underlying store instance. The operations are guaranteed to be thread-safe. Make sure the threaded stores are instantiated before initializing the threads. """ def __init__(self, store: LightningStore) -> None: super().__init__() # watchdog relies on the underlying store self.store = store self._lock = threading.Lock() @property def capabilities(self) -> LightningStoreCapabilities: """Return the capabilities of the store.""" capabilities = self.store.capabilities return { **capabilities, "async_safe": True, "thread_safe": True, } async def statistics(self) -> LightningStoreStatistics: """Return the statistics of the store.""" with self._lock: return await self.store.statistics() async def start_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, worker_id: Optional[str] = None, ) -> AttemptedRollout: with self._lock: return await self.store.start_rollout( input, mode, resources_id, config, metadata, worker_id, ) async def enqueue_rollout( self, input: TaskInput, mode: Literal["train", "val", "test"] | None = None, resources_id: str | None = None, config: RolloutConfig | None = None, metadata: Dict[str, Any] | None = None, ) -> Rollout: with self._lock: return await self.store.enqueue_rollout(input, mode, resources_id, config, metadata) async def enqueue_many_rollouts(self, rollouts: Sequence[EnqueueRolloutRequest]) -> Sequence[Rollout]: with self._lock: return await self.store.enqueue_many_rollouts(rollouts) async def dequeue_rollout(self, worker_id: Optional[str] = None) -> Optional[AttemptedRollout]: with self._lock: return await self.store.dequeue_rollout(worker_id=worker_id) async def dequeue_many_rollouts( self, *, limit: int = 1, worker_id: Optional[str] = None, ) -> Sequence[AttemptedRollout]: with self._lock: return await self.store.dequeue_many_rollouts(limit=limit, worker_id=worker_id) async def start_attempt(self, rollout_id: str, worker_id: Optional[str] = None) -> AttemptedRollout: with self._lock: return await self.store.start_attempt(rollout_id, worker_id) async def query_rollouts( self, *, status_in: Optional[Sequence[RolloutStatus]] = None, rollout_id_in: Optional[Sequence[str]] = None, rollout_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, status: Optional[Sequence[RolloutStatus]] = None, rollout_ids: Optional[Sequence[str]] = None, ) -> Sequence[Rollout]: with self._lock: return await self.store.query_rollouts( status_in=status_in, rollout_id_in=rollout_id_in, rollout_id_contains=rollout_id_contains, filter_logic=filter_logic, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, status=status, rollout_ids=rollout_ids, ) async def query_attempts( self, rollout_id: str, *, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[Attempt]: with self._lock: return await self.store.query_attempts( rollout_id, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def get_rollout_by_id(self, rollout_id: str) -> Optional[Rollout]: with self._lock: return await self.store.get_rollout_by_id(rollout_id) async def get_latest_attempt(self, rollout_id: str) -> Optional[Attempt]: with self._lock: return await self.store.get_latest_attempt(rollout_id) async def query_resources( self, *, resources_id: Optional[str] = None, resources_id_contains: Optional[str] = None, sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[ResourcesUpdate]: with self._lock: return await self.store.query_resources( resources_id=resources_id, resources_id_contains=resources_id_contains, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def add_resources(self, resources: NamedResources) -> ResourcesUpdate: with self._lock: return await self.store.add_resources(resources) async def update_resources(self, resources_id: str, resources: NamedResources) -> ResourcesUpdate: with self._lock: return await self.store.update_resources(resources_id, resources) async def get_resources_by_id(self, resources_id: str) -> Optional[ResourcesUpdate]: with self._lock: return await self.store.get_resources_by_id(resources_id) async def get_latest_resources(self) -> Optional[ResourcesUpdate]: with self._lock: return await self.store.get_latest_resources() async def add_many_spans(self, spans: Sequence[Span]) -> Sequence[Span]: with self._lock: return await self.store.add_many_spans(spans) async def add_span(self, span: Span) -> Optional[Span]: with self._lock: return await self.store.add_span(span) async def add_otel_span( self, rollout_id: str, attempt_id: str, readable_span: ReadableSpan, sequence_id: int | None = None, ) -> Optional[Span]: with self._lock: return await self.store.add_otel_span(rollout_id, attempt_id, readable_span, sequence_id) async def wait_for_rollouts(self, *, rollout_ids: List[str], timeout: Optional[float] = None) -> List[Rollout]: # This method does not change the state of the store, and it's not thread-safe. return await self.store.wait_for_rollouts(rollout_ids=rollout_ids, timeout=timeout) async def get_next_span_sequence_id(self, rollout_id: str, attempt_id: str) -> int: with self._lock: return await self.store.get_next_span_sequence_id(rollout_id, attempt_id) async def get_many_span_sequence_ids(self, rollout_attempt_ids: Sequence[Tuple[str, str]]) -> Sequence[int]: with self._lock: return await self.store.get_many_span_sequence_ids(rollout_attempt_ids) async def query_spans( self, rollout_id: str, attempt_id: str | Literal["latest"] | None = None, *, trace_id: Optional[str] = None, trace_id_contains: Optional[str] = None, span_id: Optional[str] = None, span_id_contains: Optional[str] = None, parent_id: Optional[str] = None, parent_id_contains: Optional[str] = None, name: Optional[str] = None, name_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", limit: int = -1, offset: int = 0, sort_by: Optional[str] = "sequence_id", sort_order: Literal["asc", "desc"] = "asc", ) -> Sequence[Span]: with self._lock: return await self.store.query_spans( rollout_id, attempt_id, trace_id=trace_id, trace_id_contains=trace_id_contains, span_id=span_id, span_id_contains=span_id_contains, parent_id=parent_id, parent_id_contains=parent_id_contains, name=name, name_contains=name_contains, filter_logic=filter_logic, limit=limit, offset=offset, sort_by=sort_by, sort_order=sort_order, ) async def update_rollout( self, rollout_id: str, input: TaskInput | Unset = UNSET, mode: Optional[Literal["train", "val", "test"]] | Unset = UNSET, resources_id: Optional[str] | Unset = UNSET, status: RolloutStatus | Unset = UNSET, config: RolloutConfig | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Rollout: with self._lock: return await self.store.update_rollout( rollout_id=rollout_id, input=input, mode=mode, resources_id=resources_id, status=status, config=config, metadata=metadata, ) async def update_attempt( self, rollout_id: str, attempt_id: str | Literal["latest"], status: AttemptStatus | Unset = UNSET, worker_id: str | Unset = UNSET, last_heartbeat_time: float | Unset = UNSET, metadata: Optional[Dict[str, Any]] | Unset = UNSET, ) -> Attempt: with self._lock: return await self.store.update_attempt( rollout_id=rollout_id, attempt_id=attempt_id, status=status, worker_id=worker_id, last_heartbeat_time=last_heartbeat_time, metadata=metadata, ) async def query_workers( self, *, status_in: Optional[Sequence[WorkerStatus]] = None, worker_id_contains: Optional[str] = None, filter_logic: Literal["and", "or"] = "and", sort_by: Optional[str] = None, sort_order: Literal["asc", "desc"] = "asc", limit: int = -1, offset: int = 0, ) -> Sequence[Worker]: with self._lock: return await self.store.query_workers( status_in=status_in, worker_id_contains=worker_id_contains, sort_by=sort_by, sort_order=sort_order, limit=limit, offset=offset, ) async def get_worker_by_id(self, worker_id: str) -> Optional[Worker]: with self._lock: return await self.store.get_worker_by_id(worker_id) async def update_worker( self, worker_id: str, heartbeat_stats: Dict[str, Any] | Unset = UNSET, ) -> Worker: with self._lock: return await self.store.update_worker( worker_id=worker_id, heartbeat_stats=heartbeat_stats, ) ================================================ FILE: agentlightning/store/utils.py ================================================ # Copyright (c) Microsoft. All rights reserved. import time from typing import Awaitable, Callable, Dict, List, Tuple from agentlightning.types import Attempt, AttemptedRollout, AttemptStatus, Rollout, RolloutConfig, RolloutStatus UpdateRolloutStatus = Callable[[str, RolloutStatus], Awaitable[Rollout]] UpdateAttemptStatus = Callable[[str, str, AttemptStatus], Awaitable[Attempt]] LATENCY_BUCKETS = [ 0.000001, 0.000002, 0.000005, 0.00001, 0.00002, 0.00005, 0.0001, 0.0002, 0.0005, 0.001, 0.002, 0.003, 0.005, 0.007, 0.01, 0.015, 0.02, 0.03, 0.05, 0.07, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 12.0, 15.0, 20.0, 25.0, 30.0, 40.0, 50.0, 60.0, 90.0, 120.0, 180.0, 240.0, 300.0, ] async def rollout_status_from_attempt( attempt: Attempt, config: RolloutConfig, ) -> RolloutStatus: """ Propagate the status of an attempt to the rollout. Returns: The status of the rollout from the perspective of the attempt. """ # Propagate the status directly to the rollout if attempt.status == "preparing" or attempt.status == "running" or attempt.status == "succeeded": return attempt.status if attempt.status == "failed" or attempt.status == "timeout" or attempt.status == "unresponsive": # Check if this status should trigger a retry if attempt.status in config.retry_condition: # If we haven't exceeded max attempts, retry if attempt.sequence_id < config.max_attempts: return "requeuing" # If we can't retry or shouldn't retry, mark as failed return "failed" raise ValueError(f"Invalid attempt status: {attempt.status}") async def scan_unhealthy_rollouts( rollouts: List[AttemptedRollout], ) -> Dict[Tuple[str, str], AttemptStatus]: """ Perform health check on all running rollouts in the store. This method should be called periodically to: 1. Check for unresponsive attempts (no heartbeat or spans for a while) 2. Check for timed-out rollouts (running too long since start_time) This operation is completely unlocked. The caller is responsible for locking the store. Args: rollouts: The list of running rollouts to check. Returns: A dictionary of updates to the rollouts. """ current_time = time.time() updates: Dict[Tuple[str, str], AttemptStatus] = {} for rollout in rollouts: config = rollout.config # policy for retry and timeout # Get the latest attempt for this rollout latest_attempt = rollout.attempt if not latest_attempt: # This should not happen continue # Check for timeout condition (based on attempt start_time, instead of rollout start_time) if config.timeout_seconds is not None and current_time - latest_attempt.start_time > config.timeout_seconds: updates[(latest_attempt.rollout_id, latest_attempt.attempt_id)] = "timeout" continue # Check for unresponsive condition (based on last heartbeat) # (1) Haven't received heartbeat for a while if ( latest_attempt.last_heartbeat_time and config.unresponsive_seconds is not None and current_time - latest_attempt.last_heartbeat_time > config.unresponsive_seconds ): updates[(latest_attempt.rollout_id, latest_attempt.attempt_id)] = "unresponsive" continue # (2) Check if there's no last heartbeat (no spans) at all if ( latest_attempt.last_heartbeat_time is None and config.unresponsive_seconds is not None and current_time - latest_attempt.start_time > config.unresponsive_seconds ): updates[(latest_attempt.rollout_id, latest_attempt.attempt_id)] = "unresponsive" continue return updates ================================================ FILE: agentlightning/tracer/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .agentops import AgentOpsTracer from .base import Tracer, clear_active_tracer, get_active_tracer, set_active_tracer from .dummy import DummyTracer from .otel import OtelTracer __all__ = [ "AgentOpsTracer", "Tracer", "OtelTracer", "DummyTracer", "get_active_tracer", "set_active_tracer", "clear_active_tracer", ] ================================================ FILE: agentlightning/tracer/agentops.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging import os import warnings from contextlib import asynccontextmanager, contextmanager from typing import TYPE_CHECKING, Any, AsyncGenerator, Iterator, List, Optional import agentops import agentops.sdk.core import opentelemetry.trace as trace_api from agentops.sdk.core import TracingCore from opentelemetry.sdk.trace import TracerProvider as TracerProviderImpl from opentelemetry.trace.status import StatusCode from agentlightning.instrumentation import instrument_all, uninstrument_all from agentlightning.store.base import LightningStore from agentlightning.utils.otel import get_span_processors, get_tracer_provider from .base import with_active_tracer_context from .otel import LightningSpanProcessor, OtelTracer if TYPE_CHECKING: from agentops.integration.callbacks.langchain import LangchainCallbackHandler logger = logging.getLogger(__name__) class AgentOpsTracer(OtelTracer): """Traces agent execution using AgentOps. This tracer provides functionality to capture execution details using the AgentOps library. It manages the AgentOps client initialization, server setup, and integration with the OpenTelemetry tracing ecosystem. Attributes: agentops_managed: Whether to automatically manage `agentops`. When set to true, tracer calls `agentops.init()` automatically and launches an agentops endpoint locally. If not, you are responsible for calling and using it before using the tracer. instrument_managed: Whether to automatically manage instrumentation. When set to false, you will manage the instrumentation yourself and the tracer might not work as expected. daemon: Whether the AgentOps server runs as a daemon process. Only applicable if `agentops_managed` is True. """ def __init__(self, *, agentops_managed: bool = True, instrument_managed: bool = True, daemon: bool = True): super().__init__() self._lightning_span_processor: Optional[LightningSpanProcessor] = None self.agentops_managed = agentops_managed self.instrument_managed = instrument_managed self.daemon = daemon if not self.agentops_managed: logger.warning("agentops_managed=False. You are responsible for AgentOps setup.") if not self.instrument_managed: logger.warning("instrument_managed=False. You are responsible for all instrumentation.") def instrument(self, worker_id: int): instrument_all() def uninstrument(self, worker_id: int): uninstrument_all() def _initialize_tracer_provider(self, worker_id: int): logger.info(f"[Worker {worker_id}] Setting up AgentOps tracer...") # worker_id included in process name if self.instrument_managed: self.instrument(worker_id) logger.info(f"[Worker {worker_id}] Instrumentation applied.") if self.agentops_managed: os.environ.setdefault("AGENTOPS_API_KEY", "dummy") if not agentops.get_client().initialized: agentops.init(auto_start_session=False) # type: ignore logger.info(f"[Worker {worker_id}] AgentOps client initialized.") else: logger.warning(f"[Worker {worker_id}] AgentOps client was already initialized. Skip initialization.") span_processors = get_span_processors(self._get_tracer_provider(), LightningSpanProcessor) if len(span_processors) > 0: logger.warning( "LightningSpanProcessor already present in TracerProvider. You might have called init_worker() multiple times." "Agent-lightning will try to reuse the existing LightningSpanProcessor." ) if len(span_processors) > 1: logger.error("More than one LightningSpanProcessors present in TracerProvider. This should not happen.") self._lightning_span_processor = span_processors[0] else: self._lightning_span_processor = LightningSpanProcessor() self._get_tracer_provider().add_span_processor(self._lightning_span_processor) # type: ignore def teardown_worker(self, worker_id: int) -> None: super().teardown_worker(worker_id) if self.instrument_managed: self.uninstrument(worker_id) logger.info(f"[Worker {worker_id}] Instrumentation removed.") # NOTE: The teardown doesn't try to remove the LightningSpanProcessor from the TracerProvider. # Currently there is no stable way to fully restore the AgentOps state to the initial state. @with_active_tracer_context @asynccontextmanager async def trace_context( self, name: Optional[str] = None, *, store: Optional[LightningStore] = None, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, ) -> AsyncGenerator[trace_api.Tracer, None]: """ Starts a new tracing context. This should be used as a context manager. Args: name: Optional name for the tracing context. store: Optional store to add the spans to. rollout_id: Optional rollout ID to add the spans to. attempt_id: Optional attempt ID to add the spans to. Yields: The OpenTelemetry tracer instance to collect spans. """ if store is not None: warnings.warn( "store is deprecated in favor of init_worker(). It will be removed in the future.", DeprecationWarning, stacklevel=3, ) else: store = self._store with self._trace_context_sync(name=name, store=store, rollout_id=rollout_id, attempt_id=attempt_id) as tracer: yield tracer @contextmanager def _trace_context_sync( self, name: Optional[str] = None, *, store: Optional[LightningStore] = None, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, ) -> Iterator[trace_api.Tracer]: """Implementation of `trace_context` for synchronous execution.""" if not self._lightning_span_processor: raise RuntimeError("LightningSpanProcessor is not initialized. Call init_worker() first.") tracer_provider = self._get_tracer_provider() kwargs: dict[str, Any] = {} if name is not None: kwargs["trace_name"] = name elif rollout_id is not None: kwargs["trace_name"] = rollout_id if store is not None and rollout_id is not None and attempt_id is not None: if store.capabilities.get("otlp_traces", False) is True: logger.debug(f"Tracing to LightningStore rollout_id={rollout_id}, attempt_id={attempt_id}") self._enable_native_otlp_exporter(store, rollout_id, attempt_id) else: self._disable_native_otlp_exporter() ctx = self._lightning_span_processor.with_context(store=store, rollout_id=rollout_id, attempt_id=attempt_id) with ctx: # AgentOps end_trace and start_trace must live inside the lightning span processor context. # Otherwise some traces might not be recorded. with self._agentops_trace_context(rollout_id, attempt_id, kwargs): yield trace_api.get_tracer(__name__, tracer_provider=tracer_provider) elif store is None and rollout_id is None and attempt_id is None: self._disable_native_otlp_exporter() with self._lightning_span_processor: with self._agentops_trace_context(None, None, kwargs): yield trace_api.get_tracer(__name__, tracer_provider=tracer_provider) else: raise ValueError("store, rollout_id, and attempt_id must be either all provided or all None") @contextmanager def _agentops_trace_context(self, rollout_id: Optional[str], attempt_id: Optional[str], kwargs: dict[str, Any]): trace = agentops.start_trace(**kwargs) status = StatusCode.OK # type: ignore try: yield except Exception as e: # This will catch errors in user code. status = StatusCode.ERROR # type: ignore logger.error(f"Trace failed for rollout_id={rollout_id}, attempt_id={attempt_id}: {e}") raise # should reraise the error here so that runner can handle it finally: agentops.end_trace(trace, end_state=status) # type: ignore def get_langchain_handler(self, tags: List[str] | None = None) -> LangchainCallbackHandler: """ Get the Langchain callback handler for integrating with Langchain. Args: tags: Optional list of tags to apply to the Langchain callback handler. Returns: An instance of the Langchain callback handler. """ import agentops from agentops.integration.callbacks.langchain import LangchainCallbackHandler tags = tags or [] client_instance = agentops.get_client() api_key = None if client_instance.initialized: api_key = client_instance.config.api_key else: logger.warning( "AgentOps client not initialized when creating LangchainCallbackHandler. API key may be missing." ) return LangchainCallbackHandler(api_key=api_key, tags=tags) get_langchain_callback_handler = get_langchain_handler # alias def _get_tracer_provider(self) -> TracerProviderImpl: try: # new versions instance = agentops.sdk.core.tracer if instance.provider is None: raise RuntimeError("AgentOps TracerProvider is not initialized.") if get_tracer_provider() is not instance.provider: logger.error( "Mismatch between global singleton TracerProvider and AgentOps TracerProvider. " "AgentOps might not work properly." ) if not isinstance(instance.provider, TracerProviderImpl): # type: ignore raise RuntimeError("Unsupported TracerProvider type for AgentOps instrumentation.") self._tracer_provider = instance.provider return self._tracer_provider except AttributeError: # old versions instance = TracingCore.get_instance() # type: ignore self._tracer_provider = instance._provider # type: ignore return self._tracer_provider # type: ignore ================================================ FILE: agentlightning/tracer/base.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import functools import logging from contextlib import contextmanager from typing import TYPE_CHECKING, Any, AsyncContextManager, Awaitable, Callable, ContextManager, List, Optional, TypeVar from agentlightning.store.base import LightningStore from agentlightning.types import Attributes, ParallelWorkerBase, Span, SpanCoreFields, SpanRecordingContext, TraceStatus if TYPE_CHECKING: from langchain_core.callbacks.base import BaseCallbackHandler # type: ignore logger = logging.getLogger(__name__) T = TypeVar("T") _active_tracer: Optional[Tracer] = None T_func = Callable[..., Awaitable[Any]] class Tracer(ParallelWorkerBase): """ An abstract base class for tracers. This class defines a standard interface for tracing code execution, capturing the resulting spans, and providing them for analysis. It is designed to be backend-agnostic, allowing for different implementations (e.g., for AgentOps, OpenTelemetry, Docker, etc.). The primary interaction pattern is through the [`trace_context`][agentlightning.Tracer.trace_context] context manager, which ensures that traces are properly started and captured, even in the case of exceptions. A typical workflow: ```python tracer = YourTracerImplementation() try: async with tracer.trace_context(name="my_traced_task"): # ... code to be traced ... await run_my_agent_logic() except Exception as e: print(f"An error occurred: {e}") # Retrieve the trace data after the context block spans: list[ReadableSpan] = tracer.get_last_trace() # Process the trace data if trace_tree: rl_triplets = TracerTraceToTriplet().adapt(spans) # ... do something with the triplets ``` """ _store: Optional[LightningStore] = None def init_worker(self, worker_id: int, store: Optional[LightningStore] = None) -> None: """Initialize the tracer for a worker. Args: worker_id: The ID of the worker. store: The store to add the spans to. If it's provided, traces will be added to the store when tracing. """ super().init_worker(worker_id) self._store = store def trace_context( self, name: Optional[str] = None, *, store: Optional[LightningStore] = None, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, ) -> AsyncContextManager[Any]: """ Starts a new tracing context. This should be used as a context manager. The implementation should handle the setup and teardown of the tracing for the enclosed code block. It must ensure that any spans generated within the `with` block are collected and made available via [`get_last_trace`][agentlightning.Tracer.get_last_trace]. Args: name: The name for the root span of this trace context. store: The store to add the spans to. Deprecated in favor of passing store to init_worker(). rollout_id: The rollout ID to add the spans to. attempt_id: The attempt ID to add the spans to. """ raise NotImplementedError() def _trace_context_sync( self, name: Optional[str] = None, *, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, ) -> ContextManager[Any]: """Internal API for CI backward compatibility.""" raise NotImplementedError() def get_last_trace(self) -> List[Span]: """ Retrieves the raw list of captured spans from the most recent trace. Returns: A list of [`Span`][agentlightning.Span] objects collected during the last trace. """ raise NotImplementedError() def trace_run(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: """ A convenience wrapper to trace the execution of a single synchronous function. Deprecated in favor of customizing Runners. Args: func: The synchronous function to execute and trace. *args: Positional arguments to pass to the function. **kwargs: Keyword arguments to pass to the function. Returns: The return value of the function. """ with self._trace_context_sync(name=func.__name__): return func(*args, **kwargs) def create_span( self, name: str, attributes: Optional[Attributes] = None, timestamp: Optional[float] = None, status: Optional[TraceStatus] = None, ) -> SpanCoreFields: """Notify the tracer that a span should be created here. It uses a fire-and-forget approach and doesn't wait for the span to be created. Args: name: The name of the span. attributes: The attributes of the span. timestamp: The timestamp of the span. status: The status of the span. Returns: The core fields of the span. """ raise NotImplementedError() def operation_context( self, name: str, attributes: Optional[Attributes] = None, start_time: Optional[float] = None, end_time: Optional[float] = None, ) -> ContextManager[SpanRecordingContext]: """Start to record an operation to a span. Args: name: The name of the operation. attributes: The attributes of the operation. start_time: The start time of the operation. end_time: The end time of the operation. Returns: A [`SpanRecordingContext`][agentlightning.SpanRecordingContext] for recording the operation on the span. """ raise NotImplementedError() async def trace_run_async(self, func: Callable[..., Awaitable[Any]], *args: Any, **kwargs: Any) -> Any: """ A convenience wrapper to trace the execution of a single asynchronous function. Deprecated in favor of customizing Runners. Args: func: The asynchronous function to execute and trace. *args: Positional arguments to pass to the function. **kwargs: Keyword arguments to pass to the function. Returns: The return value of the function. """ async with self.trace_context(name=func.__name__): return await func(*args, **kwargs) def get_langchain_handler(self) -> Optional[BaseCallbackHandler]: # type: ignore """Get a handler to install in langchain agent callback. Agents are expected to use this handler in their agents to enable tracing. """ logger.warning(f"{self.__class__.__name__} does not provide a LangChain callback handler.") return None @contextmanager def lifespan(self, store: Optional[LightningStore] = None): """A context manager to manage the lifespan of the tracer. This can be used to set up and tear down any necessary resources for the tracer, useful for debugging purposes. Args: store: The store to add the spans to. If it's provided, traces will be added to the store when tracing. """ has_init = False has_init_worker = False try: self.init() has_init = True self.init_worker(0, store) has_init_worker = True yield finally: if has_init_worker: self.teardown_worker(0) if has_init: self.teardown() def set_active_tracer(tracer: Tracer): """Set the active tracer for the current process. Args: tracer: The tracer to set as active. """ global _active_tracer if _active_tracer is not None: raise ValueError("An active tracer is already set. Cannot set a new one.") _active_tracer = tracer def clear_active_tracer(): """Clear the active tracer for the current process.""" global _active_tracer _active_tracer = None def get_active_tracer() -> Optional[Tracer]: """Get the active tracer for the current process. Returns: The active tracer, or None if no tracer is active. """ global _active_tracer return _active_tracer class _ActiveTracerAsyncCM(AsyncContextManager[T]): def __init__(self, tracer: Tracer, inner: AsyncContextManager[T]): self._tracer = tracer self._inner = inner async def __aenter__(self) -> T: set_active_tracer(self._tracer) # will raise if nested try: return await self._inner.__aenter__() except Exception: clear_active_tracer() raise async def __aexit__(self, *args: Any, **kwargs: Any) -> Optional[bool]: try: return await self._inner.__aexit__(*args, **kwargs) finally: clear_active_tracer() def with_active_tracer_context( func: Callable[..., AsyncContextManager[T]], ) -> Callable[..., AsyncContextManager[T]]: """Decorate a method returning an AsyncContextManager so tracer is active for the whole `async with`.""" @functools.wraps(func) def wrapper(self: Tracer, *args: Any, **kwargs: Any) -> AsyncContextManager[T]: cm = func(self, *args, **kwargs) return _ActiveTracerAsyncCM(self, cm) return wrapper ================================================ FILE: agentlightning/tracer/dummy.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging import time from contextlib import contextmanager from typing import ( Iterator, Optional, ) from agentlightning.types import ( Attributes, SpanCoreFields, SpanRecordingContext, StatusCode, TraceStatus, ) from agentlightning.utils.otel import format_exception_attributes from .base import Tracer logger = logging.getLogger(__name__) class DummySpanRecordingContext(SpanRecordingContext): """Context for recording operations on a dummy span, not dependent on any backend tracer.""" def __init__(self, name: str, attributes: Optional[Attributes] = None, start_time: Optional[float] = None) -> None: self.name = name self.attributes = attributes or {} self.start_time = start_time or time.time() self.end_time = None self.status = TraceStatus(status_code="OK") def record_exception(self, exception: BaseException) -> None: self.record_status("ERROR", str(exception)) self.record_attributes(format_exception_attributes(exception)) def record_attributes(self, attributes: Attributes) -> None: self.attributes.update(attributes) def record_status(self, status_code: StatusCode, description: Optional[str] = None) -> None: self.status = TraceStatus(status_code=status_code, description=description) def finalize(self, end_time: Optional[float] = None) -> None: self.end_time = end_time or time.time() def get_recorded_span(self) -> SpanCoreFields: if self.end_time is None: raise ValueError("End time is not set. Call finalize() first.") return SpanCoreFields( name=self.name, attributes=self.attributes, start_time=self.start_time, end_time=self.end_time, status=self.status, ) class DummyTracer(Tracer): """A dummy tracer that does not trace anything, but it is compatible with the emitter API. It doesn't rely on any backend tracer, and also doesn't use any stores. """ def create_span( self, name: str, attributes: Optional[Attributes] = None, timestamp: Optional[float] = None, status: Optional[TraceStatus] = None, ) -> SpanCoreFields: if attributes is None: attributes = {} if timestamp is None: timestamp = time.time() if status is None: status = TraceStatus(status_code="OK") return SpanCoreFields( name=name, attributes=attributes, start_time=timestamp, end_time=timestamp, status=status, ) @contextmanager def operation_context( self, name: str, attributes: Optional[Attributes] = None, start_time: Optional[float] = None, end_time: Optional[float] = None, ) -> Iterator[DummySpanRecordingContext]: start_time = start_time or time.time() recording_context = DummySpanRecordingContext(name, attributes, start_time) try: yield recording_context except Exception as exc: recording_context.record_exception(exc) recording_context.record_status("ERROR", str(exc)) raise finally: recording_context.finalize(end_time) ================================================ FILE: agentlightning/tracer/otel.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import logging import threading import warnings from contextlib import asynccontextmanager, contextmanager from typing import Any, AsyncGenerator, Awaitable, Iterator, List, Optional import opentelemetry.trace as trace_api from opentelemetry.instrumentation.utils import suppress_instrumentation from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import ReadableSpan, SpanProcessor from opentelemetry.sdk.trace import TracerProvider as TracerProviderImpl from opentelemetry.sdk.trace.export import BatchSpanProcessor, SimpleSpanProcessor from agentlightning.semconv import LightningResourceAttributes from agentlightning.store.base import LightningStore from agentlightning.types import Attributes, Span, SpanCoreFields, SpanRecordingContext, StatusCode, TraceStatus from agentlightning.types.tracer import convert_timestamp from agentlightning.utils.otel import get_tracer_provider from agentlightning.utils.otlp import LightningStoreOTLPExporter from .base import Tracer, with_active_tracer_context logger = logging.getLogger(__name__) STORE_WRITE_TIMEOUT_SECONDS = 10.0 def to_otel_status_code(status_code: StatusCode) -> trace_api.StatusCode: if status_code == "UNSET": return trace_api.StatusCode.UNSET elif status_code == "ERROR": return trace_api.StatusCode.ERROR else: return trace_api.StatusCode.OK class OtelSpanRecordingContext(SpanRecordingContext): def __init__(self, span: trace_api.Span) -> None: self._span = span def record_exception(self, exception: BaseException) -> None: self._span.record_exception(exception) self.record_status("ERROR", str(exception)) def record_attributes(self, attributes: Attributes) -> None: self._span.set_attributes(attributes) def record_status(self, status_code: StatusCode, description: Optional[str] = None) -> None: otel_status_code = to_otel_status_code(status_code) self._span.set_status(otel_status_code, description) def get_otel_span(self) -> trace_api.Span: return self._span def get_recorded_span(self) -> SpanCoreFields: if isinstance(self._span, ReadableSpan): return SpanCoreFields( name=self._span.name, attributes=dict(self._span.attributes) if self._span.attributes else {}, start_time=convert_timestamp(self._span.start_time), end_time=convert_timestamp(self._span.end_time), status=TraceStatus.from_opentelemetry(self._span.status), ) else: raise ValueError(f"Span is not a ReadableSpan: {self._span}") class OtelTracer(Tracer): """Tracer that provides a basic OpenTelemetry tracer provider. You should be able to collect agent-lightning signals like rewards with this tracer, but no other function instrumentations like `openai.chat.completion`. """ def __init__(self): super().__init__() # This provider is only initialized when the worker is initialized. self._tracer_provider: Optional[trace_api.TracerProvider] = None self._lightning_span_processor: Optional[LightningSpanProcessor] = None self._simple_span_processor: Optional[SimpleSpanProcessor] = None self._otlp_span_exporter: Optional[LightningStoreOTLPExporter] = None self._initialized: bool = False def init_worker(self, worker_id: int, store: Optional[LightningStore] = None): super().init_worker(worker_id, store) self._initialize_tracer_provider(worker_id) def _initialize_tracer_provider(self, worker_id: int): logger.info(f"[Worker {worker_id}] Setting up OpenTelemetry tracer...") if self._initialized: logger.info(f"[Worker {worker_id}] Tracer provider is already initialized. Skipping initialization.") return try: get_tracer_provider() logger.error( f"[Worker {worker_id}] Tracer provider is already initialized but not by OtelTracer. OpenTelemetry may not work as expected." ) except RuntimeError: logger.debug(f"[Worker {worker_id}] Tracer provider is not initialized by OtelTracer. Initializing it now.") self._tracer_provider = TracerProviderImpl() trace_api.set_tracer_provider(self._tracer_provider) self._lightning_span_processor = LightningSpanProcessor() self._tracer_provider.add_span_processor(self._lightning_span_processor) self._otlp_span_exporter = LightningStoreOTLPExporter() self._simple_span_processor = SimpleSpanProcessor(self._otlp_span_exporter) self._tracer_provider.add_span_processor(self._simple_span_processor) self._initialized = True logger.info(f"[Worker {worker_id}] OpenTelemetry tracer provider initialized.") def teardown_worker(self, worker_id: int): super().teardown_worker(worker_id) logger.info(f"[Worker {worker_id}] Tearing down OpenTelemetry tracer does NOT remove the tracer provider.") @with_active_tracer_context @asynccontextmanager async def trace_context( self, name: Optional[str] = None, *, store: Optional[LightningStore] = None, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, ) -> AsyncGenerator[trace_api.Tracer, None]: """ Starts a new tracing context. This should be used as a context manager. Args: name: Optional name for the tracing context. store: Optional store to add the spans to. rollout_id: Optional rollout ID to add the spans to. attempt_id: Optional attempt ID to add the spans to. Yields: The OpenTelemetry tracer instance to collect spans. """ if not self._lightning_span_processor: raise RuntimeError("LightningSpanProcessor is not initialized. Call init_worker() first.") if store is not None: warnings.warn( "store is deprecated in favor of init_worker(). It will be removed in the future.", DeprecationWarning, stacklevel=3, ) else: store = self._store if rollout_id is not None and attempt_id is not None: if store is None: raise ValueError("store is required to be initialized when rollout_id and attempt_id are provided") if store.capabilities.get("otlp_traces", False) is True: logger.debug(f"Tracing to LightningStore rollout_id={rollout_id}, attempt_id={attempt_id}") self._enable_native_otlp_exporter(store, rollout_id, attempt_id) else: self._disable_native_otlp_exporter() ctx = self._lightning_span_processor.with_context(store=store, rollout_id=rollout_id, attempt_id=attempt_id) with ctx: yield trace_api.get_tracer(__name__, tracer_provider=self._tracer_provider) elif rollout_id is None and attempt_id is None: self._disable_native_otlp_exporter() with self._lightning_span_processor: yield trace_api.get_tracer(__name__, tracer_provider=self._tracer_provider) else: raise ValueError("rollout_id and attempt_id must be either all provided or all None") def create_span( self, name: str, attributes: Optional[Attributes] = None, timestamp: Optional[float] = None, status: Optional[TraceStatus] = None, ) -> SpanCoreFields: # Fire the span to the current active tracer provider. tracer_provider = self._get_tracer_provider() tracer = tracer_provider.get_tracer(__name__) span = tracer.start_span( name, attributes=attributes, start_time=int(timestamp * 1_000_000_000) if timestamp else None ) if status is not None: span.set_status(to_otel_status_code(status.status_code), status.description) span.end(int(timestamp * 1_000_000_000) if timestamp else None) # The span should have been auto-created by now. # Return the core fields of the span. if isinstance(span, ReadableSpan): return SpanCoreFields( name=name, attributes=dict(span.attributes) if span.attributes else {}, start_time=convert_timestamp(span.start_time), end_time=convert_timestamp(span.end_time), status=TraceStatus.from_opentelemetry(span.status), ) else: raise ValueError(f"Span is not a ReadableSpan: {span}") @contextmanager def operation_context( self, name: str, attributes: Optional[Attributes] = None, start_time: Optional[float] = None, end_time: Optional[float] = None, ) -> Iterator[SpanRecordingContext]: if end_time is not None: logger.warning("OpenTelemetry doesn't support customizing the end time of a span. End time is ignored.") # Record the span to the current active tracer provider. tracer_provider = self._get_tracer_provider() tracer = tracer_provider.get_tracer(__name__) # Activate the span as the current span within otel. with tracer.start_as_current_span( name, attributes=attributes, start_time=int(start_time * 1_000_000_000) if start_time else None ) as span: recording_context = OtelSpanRecordingContext(span) try: yield recording_context except Exception as exc: recording_context.record_exception(exc) raise # No need to retrieve the span here. It's already been sent to otel processor. def get_last_trace(self) -> List[Span]: """ Retrieves the raw list of captured spans from the most recent trace. Returns: A list of [`Span`][agentlightning.Span] objects captured during the most recent trace. """ if not self._lightning_span_processor: raise RuntimeError("LightningSpanProcessor is not initialized. Call init_worker() first.") return self._lightning_span_processor.spans() def _get_tracer_provider(self) -> TracerProviderImpl: if self._tracer_provider is None: raise RuntimeError("TracerProvider is not initialized. Call init_worker() first.") if not isinstance(self._tracer_provider, TracerProviderImpl): raise TypeError(f"TracerProvider is not a opentelemetry.sdk.trace.TracerProvider: {self._tracer_provider}") return self._tracer_provider def _enable_native_otlp_exporter(self, store: LightningStore, rollout_id: str, attempt_id: str): tracer_provider = self._get_tracer_provider() active_span_processor = tracer_provider._active_span_processor # pyright: ignore[reportPrivateUsage] # Override the resources so that the server knows where the request comes from. tracer_provider._resource = tracer_provider._resource.merge( # pyright: ignore[reportPrivateUsage] Resource.create( { LightningResourceAttributes.ROLLOUT_ID.value: rollout_id, LightningResourceAttributes.ATTEMPT_ID.value: attempt_id, } ) ) instrumented = False candidates: List[str] = [] for processor in active_span_processor._span_processors: # pyright: ignore[reportPrivateUsage] if isinstance(processor, LightningSpanProcessor): # We don't need the LightningSpanProcessor any more. logger.debug("LightningSpanProcessor already present in TracerProvider, disabling it.") processor.disable_store_submission = True elif isinstance(processor, (SimpleSpanProcessor, BatchSpanProcessor)): # Instead, we rely on the OTLPSpanExporter to send spans to the store. if isinstance(processor.span_exporter, LightningStoreOTLPExporter): processor.span_exporter.enable_store_otlp(store.otlp_traces_endpoint(), rollout_id, attempt_id) logger.debug(f"Set LightningStoreOTLPExporter endpoint to {store.otlp_traces_endpoint()}") instrumented = True else: candidates.append( f"{processor.__class__.__name__} with {processor.span_exporter.__class__.__name__}" ) else: candidates.append(f"{processor.__class__.__name__}") if not instrumented: raise RuntimeError( "Failed to enable native OTLP exporter: no BatchSpanProcessor or SimpleSpanProcessor with " "LightningStoreOTLPExporter found in TracerProvider. Please try using a non-OTLP store." "Candidates are: " + ", ".join(candidates) ) def _disable_native_otlp_exporter(self): tracer_provider = self._get_tracer_provider() active_span_processor = tracer_provider._active_span_processor # pyright: ignore[reportPrivateUsage] tracer_provider._resource = tracer_provider._resource.merge( # pyright: ignore[reportPrivateUsage] Resource.create( { LightningResourceAttributes.ROLLOUT_ID.value: "", LightningResourceAttributes.ATTEMPT_ID.value: "", } ) ) # reset resource for processor in active_span_processor._span_processors: # pyright: ignore[reportPrivateUsage] if isinstance(processor, LightningSpanProcessor): # We will be in need of the LightningSpanProcessor again. logger.debug("Enabling LightningSpanProcessor in TracerProvider.") processor.disable_store_submission = False class LightningSpanProcessor(SpanProcessor): """Span processor that subclasses OpenTelemetry's `SpanProcessor` and adds support to dump traces to a [`LightningStore`][agentlightning.LightningStore]. It serves two purposes: 1. Records all the spans in a local buffer. 2. Submits the spans to the event loop to be added to the store. """ def __init__(self, disable_store_submission: bool = False): self._disable_store_submission: bool = disable_store_submission self._spans: List[Span] = [] # Store related context and states self._store: Optional[LightningStore] = None self._rollout_id: Optional[str] = None self._attempt_id: Optional[str] = None self._local_sequence_id: int = 0 self._lock = threading.Lock() # private asyncio loop running in a daemon thread self._loop_ready = threading.Event() self._loop: Optional[asyncio.AbstractEventLoop] = None self._loop_thread: Optional[threading.Thread] = None self._loop_init_lock = threading.Lock() def __repr__(self) -> str: return ( f"{self.__class__.__name__}(" + f"disable_store_submission={self.disable_store_submission}, " + f"store={self.store!r}, " + f"rollout_id={self.rollout_id!r}, " + f"attempt_id={self.attempt_id!r})" ) @property def store(self) -> Optional[LightningStore]: """The store to submit the spans to.""" return self._store @property def rollout_id(self) -> Optional[str]: """The rollout ID to submit the spans to.""" return self._rollout_id @property def attempt_id(self) -> Optional[str]: """The attempt ID to submit the spans to.""" return self._attempt_id @property def disable_store_submission(self) -> bool: """Whether to disable submitting spans to the store.""" return self._disable_store_submission @disable_store_submission.setter def disable_store_submission(self, value: bool) -> None: self._disable_store_submission = value def _ensure_loop(self) -> None: # Fast path: loop already initialized if self._loop_thread is not None and self._loop is not None: return with self._loop_init_lock: # Double-check after acquiring lock if self._loop_thread is not None and self._loop is not None: return self._loop_ready.clear() self._loop_thread = threading.Thread(target=self._loop_runner, name="otel-loop", daemon=True) self._loop_thread.start() if not self._loop_ready.wait(timeout=30.0): raise RuntimeError("Timed out waiting for otel-loop thread to start") def _loop_runner(self): loop = asyncio.new_event_loop() self._loop = loop asyncio.set_event_loop(loop) self._loop_ready.set() loop.run_forever() loop.close() def __enter__(self): self._last_trace = None self._spans = [] return self def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any): self._store = None self._rollout_id = None self._attempt_id = None def _await_in_loop(self, coro: Awaitable[Any], timeout: Optional[float] = None) -> Any: # submit to the dedicated loop and wait synchronously self._ensure_loop() if self._loop is None: raise RuntimeError("Loop is not initialized. This should not happen.") # If already on the exporter loop thread, schedule and return immediately. # --------------------------------------------------------------------------- # WHY THIS CONDITIONAL EXISTS: # In rare cases, span.end() is triggered from a LangchainCallbackHandler.__del__ # (or another finalizer) while the Python garbage collector is running on the # *same thread* that owns our exporter event loop ("otel-loop"). # # When that happens, on_end() executes on the exporter loop thread itself. # If we were to call `asyncio.run_coroutine_threadsafe(...).result()` here, # it would deadlock immediately — because the loop cannot both wait on and run # the same coroutine. The Future stays pending forever and the loop stops # processing scheduled callbacks. # # To avoid that self-deadlock, we detect when on_end() runs on the exporter # loop thread. If so, we *schedule* the coroutine on the loop (fire-and-forget) # instead of blocking with .result(). # # This situation can occur because Python calls __del__ in whatever thread # releases the last reference, which can easily be our loop thread if the # object is dereferenced during loop._run_once(). # --------------------------------------------------------------------------- if threading.current_thread() is self._loop_thread: self._loop.call_soon_threadsafe(asyncio.create_task, coro) # type: ignore return None fut = asyncio.run_coroutine_threadsafe(coro, self._loop) # type: ignore return fut.result(timeout=timeout) # raises on error # type: ignore def shutdown(self) -> None: if self._loop: self._loop.call_soon_threadsafe(self._loop.stop) self._loop = None if self._loop_thread: self._loop_thread.join(timeout=5) def force_flush(self, timeout_millis: int = 30000) -> bool: return True def spans(self) -> List[Span]: """ Get the list of spans collected by this processor. This is useful for debugging and testing purposes. Returns: List of [`Span`][agentlightning.Span] objects collected during tracing. """ return self._spans def with_context(self, store: LightningStore, rollout_id: str, attempt_id: str): # simple context manager without nesting into asyncio class _Ctx: def __enter__(_): # type: ignore # Use _ instead of self to avoid shadowing the instance method. with self._lock: self._store, self._rollout_id, self._attempt_id = store, rollout_id, attempt_id self._last_trace = None self._spans = [] return self def __exit__(_, exc_type, exc, tb): # type: ignore with self._lock: self._store = self._rollout_id = self._attempt_id = None return _Ctx() def on_end(self, span: ReadableSpan) -> None: """ Process a span when it ends. Args: span: The span that has ended. """ # Skip if span is not sampled if not span.context or not span.context.trace_flags.sampled: return if not self._disable_store_submission and self._store and self._rollout_id and self._attempt_id: try: # Submit add_otel_span to the event loop and wait for it to complete with suppress_instrumentation(): self._ensure_loop() uploaded_span = self._await_in_loop( self._store.add_otel_span(self._rollout_id, self._attempt_id, span), timeout=STORE_WRITE_TIMEOUT_SECONDS, ) if uploaded_span is not None: self._spans.append(uploaded_span) except TimeoutError: logger.warning( "Timed out adding span %s to store after %.1f seconds. The span will be stored locally " "but it's not guaranteed to be persisted.", span.name, STORE_WRITE_TIMEOUT_SECONDS, ) self._spans.append( Span.from_opentelemetry( span, rollout_id=self._rollout_id, attempt_id=self._attempt_id, sequence_id=self._local_sequence_id, ) ) except Exception: # log; on_end MUST NOT raise logger.exception(f"Error adding span to store: {span.name}. The span will be store locally only.") self._spans.append( Span.from_opentelemetry( span, rollout_id=self._rollout_id, attempt_id=self._attempt_id, sequence_id=self._local_sequence_id, ) ) else: # Fallback path created_span = Span.from_opentelemetry( span, rollout_id=self._rollout_id or "rollout-dummy", attempt_id=self._attempt_id or "attempt-dummy", sequence_id=self._local_sequence_id, ) self._local_sequence_id += 1 self._spans.append(created_span) ================================================ FILE: agentlightning/tracer/weave.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import concurrent.futures as futures import logging import os import re import weakref from contextlib import asynccontextmanager, contextmanager from datetime import datetime from typing import ( Any, AsyncIterator, Callable, Dict, Iterator, List, Optional, cast, ) import weave from opentelemetry.semconv.attributes import exception_attributes from weave.trace.call import Call from weave.trace.settings import UserSettings from weave.trace.weave_client import WeaveClient from weave.trace_server import trace_server_interface as tsi from weave.wandb_interface.context import set_wandb_api_context from agentlightning.instrumentation.weave import InMemoryWeaveTraceServer, instrument_weave, uninstrument_weave from agentlightning.semconv import LightningResourceAttributes, LightningSpanAttributes from agentlightning.store.base import LightningStore from agentlightning.types import ( Attributes, OtelResource, Span, SpanContext, SpanCoreFields, SpanRecordingContext, StatusCode, TraceStatus, ) from agentlightning.utils.id import generate_id from agentlightning.utils.otel import ( filter_and_unflatten_attributes, flatten_attributes, format_exception_attributes, sanitize_attributes, ) from .base import Tracer, with_active_tracer_context logger = logging.getLogger(__name__) def op_name_to_func_name(op_name: str) -> str: """Convert a Weave operation name to a function name. Weave operation names look like this: `weave:///xxx/agentlightning.tracer.weave/op/openai.chat.completions.create:019b10be-...-44d74272569c` """ match = re.search(r"/([^/:]+):", op_name) if match: return match.group(1) else: return op_name def random_project_name() -> str: return "agl/weave-" + generate_id(12) def get_timestamp_or_throw(date: Optional[datetime], field_name: str) -> float: if date is None: raise ValueError(f"{field_name} is required but not set") return date.timestamp() class WeaveSpanRecordingContext(SpanRecordingContext): """Universal interface for recording operations on a Weave call.""" def __init__(self, call: Call) -> None: self._call = call def record_exception(self, exception: BaseException) -> None: self._call.exception = str(exception) self.record_status("ERROR", str(exception)) self.record_attributes(format_exception_attributes(exception)) def _get_input_from_attributes(self, attributes: Attributes) -> Dict[str, Any]: if LightningSpanAttributes.OPERATION_INPUT.value in attributes: # This can be a very rare case. If it happens, we can just let it throw. return cast(Dict[str, Any], attributes[LightningSpanAttributes.OPERATION_INPUT.value]) else: filtered_attributes = filter_and_unflatten_attributes( attributes, LightningSpanAttributes.OPERATION_INPUT.value ) if isinstance(filtered_attributes, list): return {str(i): v for i, v in enumerate(filtered_attributes)} else: return filtered_attributes def _get_output_from_attributes(self, attributes: Attributes) -> Any: if LightningSpanAttributes.OPERATION_OUTPUT.value in attributes: return attributes[LightningSpanAttributes.OPERATION_OUTPUT.value] else: return filter_and_unflatten_attributes(attributes, LightningSpanAttributes.OPERATION_OUTPUT.value) def record_attributes(self, attributes: Attributes) -> None: input_attributes = self._get_input_from_attributes(attributes) if input_attributes: self._call.inputs.update(input_attributes) output_attributes = self._get_output_from_attributes(attributes) if output_attributes: if self._call.output is not None: logger.warning(f"Output is already set. It will be overridden: {self._call.output}") self._call.output = output_attributes if LightningSpanAttributes.OPERATION_NAME.value in attributes: logger.error( f"Cannot record operation name as an attribute. It will be skipped: {attributes[LightningSpanAttributes.OPERATION_NAME.value]}" ) # The rest of the attributes are recorded as summary. for key, value in attributes.items(): if ( not key == LightningSpanAttributes.OPERATION_INPUT.value and not key.startswith(LightningSpanAttributes.OPERATION_INPUT.value + ".") and not key == LightningSpanAttributes.OPERATION_OUTPUT.value and not key.startswith(LightningSpanAttributes.OPERATION_OUTPUT.value + ".") and not key == LightningSpanAttributes.OPERATION_NAME.value ): if self._call.summary is None: self._call.summary = {} self._call.summary[key] = value def record_status(self, status_code: StatusCode, description: Optional[str] = None) -> None: if status_code == "ERROR": if not description: raise ValueError("Description is required when status code is ERROR") self._call.exception = description elif status_code == "OK": self._call.exception = None # Do nothing for other status codes. def finalize(self) -> None: # Do nothing pass def get_recorded_span(self) -> SpanCoreFields: return SpanCoreFields( name=self._call.op_name, attributes=flatten_attributes(self._call.attributes or {}), start_time=self._call.started_at.timestamp() if self._call.started_at else None, end_time=self._call.ended_at.timestamp() if self._call.ended_at else None, status=TraceStatus( status_code="OK" if self._call.exception is None else "ERROR", description=self._call.exception ), ) class WeaveTracerManagedTraceServer(InMemoryWeaveTraceServer): """A managed trace server for WeaveTracer.""" def __init__( self, partial_call_callback: Callable[[Dict[str, Any]], None], complete_call_callback: Callable[[tsi.CallSchema], None], ): super().__init__() self.partial_call_callback = partial_call_callback self.complete_call_callback = complete_call_callback self._calls_already_invoked: set[str] = set() def trigger_callbacks(self, call_id: str) -> None: with self._call_threading_lock: if call_id in self.calls: if call_id not in self._calls_already_invoked: self._calls_already_invoked.add(call_id) self.complete_call_callback(self.calls[call_id]) else: logger.info(f"Call {call_id} has callback already invoked. Skipping.") elif call_id in self.partial_calls: self.partial_call_callback(self.partial_calls[call_id]) else: logger.error(f"Call {call_id} not found in partial_calls or calls") def call_start(self, req: tsi.CallStartReq) -> tsi.CallStartRes: try: ret = super().call_start(req) self.trigger_callbacks(ret.id) return ret except Exception: logger.exception(f"Error calling call_start: {req}", exc_info=True) raise def call_end(self, req: tsi.CallEndReq) -> tsi.CallEndRes: try: ret = super().call_end(req) self.trigger_callbacks(req.end.id) return ret except Exception: logger.exception(f"Error calling call_end: {req}", exc_info=True) raise def clear(self) -> None: self._calls_already_invoked.clear() class WeaveTracer(Tracer): """Tracer implementation using Weave for telemetry and trace logging. This replaces AgentOpsTracer with a Weave-based manual trace context. It tracks: - Function/method calls - Input/Output data - Exceptions and logs them to Weave Cloud (W&B backend) or optionally bypasses the network for testing. """ def __init__( self, *, project_name: str | None = None, weave_user_settings: UserSettings | None = None, instrument_managed: bool = True, ): """Initialize a WeaveTracer instance. Args: project_name: Optional project name for Weave; defaults to the current module name. weave_user_settings: Optional UserSettings for Weave. instrument_managed: Whether to patch the Weave/W&B integration to bypass actual network calls for testing. """ super().__init__() self.project_name = project_name self.instrument_managed = instrument_managed self.weave_user_settings = weave_user_settings or UserSettings(use_server_cache=False) self._store: Optional[LightningStore] = None self._server = WeaveTracerManagedTraceServer( partial_call_callback=self.partial_call_callback, complete_call_callback=self.complete_call_callback ) self._default_sequence_counter: int = 0 self._calls: Dict[str, tsi.CallSchema] = {} # call_id -> call self._spans: List[Span] = [] # spans in the current trace self._rollout_id: Optional[str] = None self._attempt_id: Optional[str] = None self._partial_call_futures: Dict[str, asyncio.Future[int] | futures.Future[int]] = {} self._complete_call_futures: List[asyncio.Future[None] | futures.Future[None]] = [] self._loop: weakref.ReferenceType[asyncio.AbstractEventLoop] | None = None def instrument(self, worker_id: int): instrument_weave(self._server) def uninstrument(self, worker_id: int): uninstrument_weave() def init_worker(self, worker_id: int, store: Optional[LightningStore] = None): """ Initialize the tracer for a worker thread/process. Args: worker_id: Identifier of the worker. store: Optional LightningStore for storing spans. """ super().init_worker(worker_id, store) logger.info(f"[Worker {worker_id}] Setting up Weave tracer...") self._store = store # Optionally patch network calls to bypass real Weave/W&B endpoints if self.instrument_managed: self.instrument(worker_id) # If WANDB_API_KEY is not set, we need to initialize Weave with a hack if not os.getenv("WANDB_API_KEY"): logger.info("WANDB_API_KEY is not set. Initializing Weave a mock context.") set_wandb_api_context("agl", api_key=None, headers=None, cookies=None) else: logger.debug("WANDB_API_KEY is set. Weave will be initialized automatically.") weave_client = weave.get_client() if self.project_name is None: self.project_name = random_project_name() if weave_client is not None: logger.warning("Weave client was already initialized. Reentrant calls are at your own risk.") if weave_client.project == self.project_name: logger.error( f"Weave client was already initialized for the same project '{self.project_name}'. It's very likely that weave won't work correctly." ) # Init no matter what try: weave.init(project_name=self.project_name, settings=self.weave_user_settings) logger.info(f"[Worker {worker_id}] Weave client initialized.") except Exception as exc: raise RuntimeError(f"Failed to initialize Weave for project '{self.project_name}'") from exc def teardown_worker(self, worker_id: int): """ Clean up tracer resources for the worker. Args: worker_id: Identifier of the worker. """ super().teardown_worker(worker_id) if self.instrument_managed: self.uninstrument(worker_id) logger.info(f"[Worker {worker_id}] Instrumentation removed.") @with_active_tracer_context @asynccontextmanager async def trace_context( self, name: Optional[str] = None, *, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, **kwargs: Any, ) -> AsyncIterator[Any]: """Asynchronous implementation of the tracing context. Args: name: Optional operation name. rollout_id: Optional rollout ID. attempt_id: Optional attempt ID. Raises: ValueError: If store, rollout_id, and attempt_id are inconsistently provided. RuntimeError: If Weave is not installed or client is uninitialized. """ if rollout_id is not None and attempt_id is not None: self._rollout_id = rollout_id self._attempt_id = attempt_id elif rollout_id is None and attempt_id is None: logger.info("No rollout_id or attempt_id provided. Skipping writing to store.") self._rollout_id = self._attempt_id = None else: raise ValueError("rollout_id and attempt_id must be either both provided or both None") await self._init_trace_context() weave_client = self._get_weave_client() if weave_client.server is not self._server: logger.error( "Weave client is not using the correct trace server. You might have multiple WeaveTracer instances running in the same process. " f"Expected {self._server}, got {weave_client.server}" ) arg_op = name or weave_client.project arg_inputs: dict[str, str] = {} if rollout_id is not None: arg_inputs[LightningResourceAttributes.ROLLOUT_ID.value] = rollout_id if attempt_id is not None: arg_inputs[LightningResourceAttributes.ATTEMPT_ID.value] = attempt_id try: # Create a new trace call object in Weave trace_call = weave_client.create_call( # pyright: ignore[reportUnknownMemberType] op=arg_op, inputs=arg_inputs ) try: yield trace_call # Finish trace even if no exception weave_client.finish_call(trace_call) # pyright: ignore[reportUnknownMemberType] except Exception as exc: # Finish trace and log any exception weave_client.finish_call(trace_call, exception=exc) # pyright: ignore[reportUnknownMemberType] logger.error(f"Trace failed for rollout_id={rollout_id}, attempt_id={attempt_id}, error={exc}") raise finally: try: weave_client.flush() # It's possible that the call end futures are from a dedicated Weave thread pool, await asyncio.gather(*[asyncio.wrap_future(future) for future in self._complete_call_futures]) finally: # Mandatory cleanup self._rollout_id = None self._attempt_id = None self._server.clear() def create_span( self, name: str, attributes: Optional[Attributes] = None, timestamp: Optional[float] = None, status: Optional[TraceStatus] = None, ) -> SpanCoreFields: if timestamp is not None: logger.warning("Weave doesn't support customizing the start time of a call. Timestamp is ignored.") weave_client = self._get_weave_client() trace_call = weave_client.create_call( # pyright: ignore[reportUnknownMemberType] op=name, attributes=attributes, inputs={}, ) # Immediately finish the call weave_client.finish_call(trace_call) # pyright: ignore[reportUnknownMemberType] # We don't wait for the call to be propagated to the server. start_time = trace_call.started_at.timestamp() if trace_call.started_at else None end_time = trace_call.ended_at.timestamp() if trace_call.ended_at else None trace_status = ( TraceStatus(status_code="OK") if trace_call.exception is None else TraceStatus(status_code="ERROR", description=trace_call.exception) ) return SpanCoreFields( name=name, attributes=flatten_attributes(trace_call.attributes or {}), start_time=start_time, end_time=end_time, status=trace_status, ) @contextmanager def operation_context( self, name: str, attributes: Optional[Attributes] = None, start_time: Optional[float] = None, end_time: Optional[float] = None, ) -> Iterator[SpanRecordingContext]: if start_time is not None: logger.warning("Weave doesn't support customizing the start time of a call. Timestamp is ignored.") if end_time is not None: logger.warning("Weave doesn't support customizing the end time of a call. Timestamp is ignored.") weave_client = self._get_weave_client() trace_call = weave_client.create_call( # pyright: ignore[reportUnknownMemberType] op=name, attributes=attributes, inputs={}, ) recording_context = WeaveSpanRecordingContext(trace_call) try: yield recording_context except Exception as exc: recording_context.record_exception(exc) raise finally: weave_client.finish_call(trace_call) # pyright: ignore[reportUnknownMemberType] async def _init_trace_context(self) -> None: """Initialize the trace context.""" self._spans.clear() self._calls.clear() self._partial_call_futures.clear() self._complete_call_futures.clear() self._loop = weakref.ref(asyncio.get_running_loop()) def _get_weave_client(self) -> WeaveClient: """Get the Weave client.""" weave_client = weave.get_client() if not weave_client: raise RuntimeError("Weave client is not initialized. Call init_worker() first.") return weave_client def _ensure_loop(self) -> tuple[asyncio.AbstractEventLoop, bool]: """Returns a usable event loop and a boolean indicating whether it's the current running loop. Prefer using the main loop if it's possible. Otherwise, use the current running loop. """ # Get the current running loop try: running_loop = asyncio.get_running_loop() except RuntimeError: running_loop = None # Get the main loop, which can be a different loop if self._loop is not None: main_loop = self._loop() else: main_loop = None if main_loop is not None: return main_loop, id(main_loop) == id(running_loop) elif running_loop is not None: return running_loop, True else: raise RuntimeError("No running event loop found. This should not happen.") def get_last_trace(self) -> List[Span]: return self._spans def partial_call_callback(self, request_content: Dict[str, Any]) -> None: call_id = request_content.get("id") if call_id is None: raise ValueError("Call ID is required even for partial calls") if call_id in self._partial_call_futures: raise ValueError(f"Call {call_id} already has a start future") # The callback must possibly be called from a dedicated Weave thread pool, # but it should be executed on the main event loop. try: loop, is_current_loop = self._ensure_loop() if is_current_loop: task = loop.create_task(self.partial_call_handler(request_content)) else: # Schedule the task on the dedicated loop task = asyncio.run_coroutine_threadsafe(self.partial_call_handler(request_content), loop) self._partial_call_futures[call_id] = task except Exception as exc: logger.exception(f"Error creating call start task: {exc}", exc_info=True) def complete_call_callback(self, call: tsi.CallSchema) -> None: try: loop, is_current_loop = self._ensure_loop() if is_current_loop: task = loop.create_task(self.complete_call_handler(call)) else: # Schedule the task on the dedicated loop task = asyncio.run_coroutine_threadsafe(self.complete_call_handler(call), loop) self._complete_call_futures.append(task) except Exception as exc: logger.exception(f"Error creating call finish task: {exc}", exc_info=True) async def _get_next_sequence_id(self) -> int: """Get the next sequence ID for a span. Use store to get the next sequence ID if available, otherwise use a default counter. """ if self._rollout_id and self._attempt_id and self._store: return await self._store.get_next_span_sequence_id(self._rollout_id, self._attempt_id) else: self._default_sequence_counter += 1 return self._default_sequence_counter async def partial_call_handler(self, request_content: Dict[str, Any]) -> int: """Handler called when a Weave Call starts. Args: request_content: The partial Weave Call object. Returns: The sequence ID for the call. """ sequence_id = await self._get_next_sequence_id() return sequence_id async def complete_call_handler(self, call: tsi.CallSchema) -> None: """Handler called when a Weave Call finishes. Converts the call (including nested children) into spans and stores them in LightningStore. """ # Make sure the corresponding call_start_future is complete if call.id in self._partial_call_futures: sequence_id = await asyncio.wrap_future(self._partial_call_futures[call.id]) del self._partial_call_futures[call.id] else: # Fetch a new sequence ID as the call_start is somehow missing if call.id in self._calls: logger.warning( f"Call {call.id} is already in calls. The call is already completed. Overwriting the call." ) else: logger.warning(f"Call {call.id} has no start future. Fetching a new sequence ID.") sequence_id = await self._get_next_sequence_id() self._calls[call.id] = call span = await self.convert_call_to_span(call, self._rollout_id, self._attempt_id, sequence_id) self._spans.append(span) if self._store and self._rollout_id and self._attempt_id: try: await self._store.add_span(span) except Exception as exc: logger.exception(f"Error adding span to store: {exc}") async def convert_call_to_span( self, call: tsi.CallSchema, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, sequence_id: Optional[int] = None, ) -> Span: """Convert a Weave Call (with nested children) into a Agent-lightning Span. `rollout_id` and `attempt_id` are required to attach the spans to the store. Args: call: The Weave Call object. rollout_id: Optional rollout ID to attach to spans. attempt_id: Optional attempt ID to attach to spans. sequence_id: Optional sequence ID to attach to spans. Returns: List of converted spans. """ rollout_id = rollout_id or "rollout-dummy" attempt_id = attempt_id or "attempt-dummy" sequence_id = sequence_id or 0 start_ts: float = call.started_at.timestamp() end_ts: Optional[float] = call.ended_at.timestamp() if call.ended_at else None if call.exception: status = TraceStatus(status_code="ERROR", description=call.exception) else: status = TraceStatus(status_code="OK") attributes: Dict[str, Any] = { LightningSpanAttributes.OPERATION_NAME.value: call.op_name, # op_name can be possibly overridden by the attributes. **call.attributes, } if call.inputs: attributes[LightningSpanAttributes.OPERATION_INPUT.value] = call.inputs if call.output: attributes[LightningSpanAttributes.OPERATION_OUTPUT.value] = call.output if call.summary: # attributes can be possibly overridden by the summary. attributes.update(call.summary) if call.exception: attributes[exception_attributes.EXCEPTION_MESSAGE] = call.exception sanitized_attributes = sanitize_attributes(flatten_attributes(attributes, expand_leaf_lists=False)) context = SpanContext( trace_id=call.trace_id, span_id=call.id, is_remote=False, trace_state={}, ) # Get context for parent if call.parent_id: parent_call = self._calls.get(call.parent_id) if parent_call: parent_context = SpanContext( trace_id=parent_call.trace_id, span_id=parent_call.id, is_remote=False, trace_state={}, ) else: parent_context = None else: parent_context = None # Build the Span object return Span( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, trace_id=call.trace_id, span_id=call.id, parent_id=call.parent_id, name=op_name_to_func_name(call.op_name), status=status, attributes=sanitized_attributes, events=[], # Weave calls do not generate events links=[], # Weave calls do not generate links start_time=start_ts, end_time=end_ts, context=context, parent=parent_context, resource=OtelResource( attributes={ LightningResourceAttributes.ROLLOUT_ID.value: rollout_id, LightningResourceAttributes.ATTEMPT_ID.value: attempt_id, LightningResourceAttributes.SPAN_SEQUENCE_ID.value: sequence_id, LightningResourceAttributes.TRACER_NAME.value: "weave", }, schema_url="", ), ) ================================================ FILE: agentlightning/trainer/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .init_utils import build_component from .trainer import Trainer __all__ = ["Trainer", "build_component"] ================================================ FILE: agentlightning/trainer/init_utils.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Utility helpers for dynamic component initialization within the trainer.""" from __future__ import annotations import importlib import inspect from typing import Any, Callable, Dict, Optional, TypeVar, Union, cast, overload OptionalDefaults = Dict[str, Callable[[], Any] | Any] T = TypeVar("T") def load_class(path: str) -> type[Any]: """Load a class from its fully qualified import path.""" module_name, class_name = path.rsplit(".", 1) module = importlib.import_module(module_name) return getattr(module, class_name) def instantiate_component( cls: type[Any], provided_kwargs: Optional[Dict[str, Any]] = None, optional_defaults: Optional[OptionalDefaults] = None, ) -> Any: """Instantiate `cls`, filling optional kwargs when the constructor accepts them.""" kwargs = dict(provided_kwargs or {}) if optional_defaults: signature = inspect.signature(cls.__init__) for name, value in optional_defaults.items(): if name in kwargs or name not in signature.parameters: continue kwargs[name] = value() if callable(value) else value return cls(**kwargs) def instantiate_from_spec( spec: Union[str, Dict[str, Any]], *, spec_name: str, optional_defaults: Optional[OptionalDefaults] = None, dict_requires_type: bool = True, dict_default_cls: type[Any] | None = None, registry: Optional[Dict[str, str]] = None, ) -> Any: """Instantiate a component from a string or dict spec.""" if isinstance(spec, str): type_path = registry.get(spec, spec) if registry else spec cls = load_class(type_path) return instantiate_component(cls, optional_defaults=optional_defaults) if isinstance(spec, dict): # pyright: ignore[reportUnnecessaryIsInstance] spec_conf = dict(spec) type_path = spec_conf.pop("type", None) if type_path is None and registry and "name" in spec_conf: type_path = registry.get(spec_conf.pop("name")) elif registry and type_path is not None: type_path = registry.get(type_path, type_path) if type_path is None: if dict_requires_type: raise ValueError(f"{spec_name} dict must have a 'type' key with the class full name") if dict_default_cls is None: raise ValueError(f"{spec_name} dict missing 'type' and no default class provided") cls = dict_default_cls else: cls = load_class(type_path) return instantiate_component(cls, spec_conf, optional_defaults) raise TypeError(f"{spec_name} spec must be a string or dict (got {type(spec)}).") def _ensure_expected_type( instance: Any, expected_type: type[T], spec_name: str, type_error_fmt: str | None, ) -> T: if not isinstance(instance, expected_type): type_name = str(type(instance)) # type: ignore if type_error_fmt: raise TypeError(type_error_fmt.format(type_name=type_name, expected_type=expected_type.__name__)) raise TypeError(f"{spec_name} factory returned {type_name}, which is not a {expected_type.__name__} subclass.") return instance @overload def build_component( spec: Union[T, str, Dict[str, Any], type[T], Callable[[], T], None], *, expected_type: type[T], spec_name: str, default_factory: Callable[[], T], allow_none: bool = ..., optional_defaults: Optional[OptionalDefaults] = ..., dict_requires_type: bool = ..., dict_default_cls: type[T] | None = ..., type_error_fmt: str | None = ..., invalid_spec_error_fmt: str | None = ..., registry: Optional[Dict[str, str]] = ..., ) -> T: ... @overload def build_component( spec: Union[T, str, Dict[str, Any], type[T], Callable[[], T], None], *, expected_type: type[T], spec_name: str, default_factory: None = ..., allow_none: bool, optional_defaults: Optional[OptionalDefaults] = ..., dict_requires_type: bool = ..., dict_default_cls: type[T] | None = ..., type_error_fmt: str | None = ..., invalid_spec_error_fmt: str | None = ..., registry: Optional[Dict[str, str]] = ..., ) -> T | None: ... @overload def build_component( spec: Union[T, str, Dict[str, Any], type[T], Callable[[], T], None], *, expected_type: type[T], spec_name: str, default_factory: None = ..., allow_none: bool = ..., optional_defaults: Optional[OptionalDefaults] = ..., dict_requires_type: bool = ..., dict_default_cls: type[T] | None = ..., type_error_fmt: str | None = ..., invalid_spec_error_fmt: str | None = ..., registry: Optional[Dict[str, str]] = ..., ) -> T | None: ... def build_component( spec: Union[T, str, Dict[str, Any], type[T], Callable[[], T], None], *, expected_type: type[T], spec_name: str, default_factory: Callable[[], T] | None = None, allow_none: bool = False, optional_defaults: Optional[OptionalDefaults] = None, dict_requires_type: bool = True, dict_default_cls: type[T] | None = None, type_error_fmt: str | None = None, invalid_spec_error_fmt: str | None = None, registry: Optional[Dict[str, str]] = None, ) -> T | None: """Build and return a component instance from a flexible specification. This function provides a flexible way to create component instances from various input formats including direct instances, class types, factory functions, import paths, or configuration dictionaries. Args: spec: The component specification. Can be: - An instance of expected_type (returned as-is) - A string import path (e.g., 'module.Class') or registry key - A dict with 'type' key (import path or registry key) and constructor kwargs - A class type (will be instantiated) - A factory function (will be called) - None (uses default_factory or returns None if allow_none=True) expected_type: The type that the resulting instance must be or inherit from. spec_name: Descriptive name for the spec, used in error messages. default_factory: Optional factory function called when spec is None. allow_none: If True, allows None to be returned when spec is None and no default_factory is provided. optional_defaults: Dict mapping parameter names to default values or factory functions that will be injected if the constructor accepts them. dict_requires_type: If True, dict specs must include a 'type' key. dict_default_cls: Default class to use for dict specs without a 'type' key (only used when dict_requires_type=False). type_error_fmt: Custom format string for type validation errors. Should include {type_name} and {expected_type} placeholders. invalid_spec_error_fmt: Custom format string for invalid spec type errors. Should include {actual_type} and {expected_type} placeholders. registry: Optional mapping of short names to fully qualified import paths. When provided, string specs or dict 'type'/'name' entries are first resolved through this registry before attempting to import. Returns: An instance of expected_type, or None if allow_none=True and spec is None without a default_factory. Raises: TypeError: If the instantiated object is not an instance of expected_type. ValueError: If spec is None and neither default_factory nor allow_none is set, or if spec type is invalid, or if dict spec is invalid. Examples: >>> # Direct instance >>> optimizer = build_component(AdamW(), expected_type=Optimizer, spec_name='optimizer') >>> >>> # String import path >>> optimizer = build_component('torch.optim.AdamW', expected_type=Optimizer, spec_name='optimizer') >>> >>> # Dict with type and kwargs >>> spec = {'type': 'torch.optim.AdamW', 'lr': 0.001} >>> optimizer = build_component(spec, expected_type=Optimizer, spec_name='optimizer') >>> >>> # Class type >>> optimizer = build_component(AdamW, expected_type=Optimizer, spec_name='optimizer') >>> >>> # Factory function >>> optimizer = build_component(lambda: AdamW(lr=0.001), expected_type=Optimizer, ... spec_name='optimizer') """ if isinstance(spec, expected_type): return cast(T, spec) if spec is None: if default_factory is not None: instance = default_factory() return _ensure_expected_type(instance, expected_type, spec_name, type_error_fmt) if allow_none: return None raise ValueError( invalid_spec_error_fmt.format(actual_type=type(spec), expected_type=expected_type.__name__) if invalid_spec_error_fmt else f"{spec_name} cannot be None." ) if isinstance(spec, type) and issubclass(spec, expected_type): instance = instantiate_component(spec, optional_defaults=optional_defaults) return _ensure_expected_type(instance, expected_type, spec_name, type_error_fmt) if callable(spec) and not isinstance(spec, type): # type: ignore instance = spec() return _ensure_expected_type(instance, expected_type, spec_name, type_error_fmt) if isinstance(spec, str): instance = instantiate_from_spec( spec, spec_name=spec_name, optional_defaults=optional_defaults, dict_requires_type=dict_requires_type, dict_default_cls=dict_default_cls, registry=registry, ) return _ensure_expected_type(instance, expected_type, spec_name, type_error_fmt) if isinstance(spec, dict): instance = instantiate_from_spec( spec, # type: ignore spec_name=spec_name, optional_defaults=optional_defaults, dict_requires_type=dict_requires_type, dict_default_cls=dict_default_cls, registry=registry, ) return _ensure_expected_type(instance, expected_type, spec_name, type_error_fmt) if invalid_spec_error_fmt: raise ValueError(invalid_spec_error_fmt.format(actual_type=type(spec), expected_type=expected_type.__name__)) # type: ignore type_name = str(type(spec)) # type: ignore raise ValueError(f"Invalid {spec_name} type: {type_name}. Expected {expected_type.__name__}, str, dict, or None.") __all__ = ["OptionalDefaults", "build_component", "instantiate_component", "instantiate_from_spec", "load_class"] ================================================ FILE: agentlightning/trainer/legacy.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import logging import multiprocessing import signal import time import warnings from typing import Any, List, Optional, TypeVar, Union from agentlightning.adapter import TraceAdapter, TracerTraceToTriplet from agentlightning.algorithm import Algorithm from agentlightning.client import AgentLightningClient from agentlightning.litagent import LitAgent from agentlightning.runner import LegacyAgentRunner from agentlightning.tracer.base import Tracer from agentlightning.types import Dataset, ParallelWorkerBase logger = logging.getLogger(__name__) T_co = TypeVar("T_co", covariant=True) class TrainerLegacy(ParallelWorkerBase): """Trainer for legacy mode for v0.1 compatibility.""" def __init__(self, *args: Any, **kwargs: Any): """Initialize the TrainerLegacy. This method is mainly to make type checker happy. It won't be used in practice. """ self._dev = kwargs.pop("dev", False) self.algorithm: Optional[Algorithm] = kwargs.pop("algorithm", None) self.tracer: Tracer = kwargs.pop("tracer", None) self.n_workers: int = kwargs.pop("n_workers", None) self.max_tasks: Optional[int] = kwargs.pop("max_tasks", None) self.daemon: bool = kwargs.pop("daemon", True) self.triplet_exporter: TraceAdapter[Any] = kwargs.pop("triplet_exporter", None) def _extract_client_from_data( self, data: Union[str, AgentLightningClient, Dataset[Any]] ) -> Optional[AgentLightningClient]: """Extract client from data if it's a string URL or AgentLightningClient.""" if isinstance(data, str): if not data.startswith("http://") and not data.startswith("https://"): raise ValueError("String data must be a valid URL starting with http:// or https://") return AgentLightningClient(endpoint=data) elif isinstance(data, AgentLightningClient): return data return None def _extract_dataset_from_data( self, data: Union[str, AgentLightningClient, Dataset[Any]] ) -> Optional[Dataset[Any]]: """Extract dataset from data if it's a Dataset.""" if isinstance(data, str) or isinstance(data, AgentLightningClient): return None return data def _determine_backend( self, train_data: Union[str, AgentLightningClient, Dataset[Any]], dev_data: Union[str, AgentLightningClient, Dataset[Any], None] = None, ) -> Union[str, AgentLightningClient]: """Determine which backend to use for initialization.""" if self._dev: if dev_data is None: raise ValueError("dev_data must be provided when dev=True.") client = self._extract_client_from_data(dev_data) if client is None: raise ValueError("dev_data must be a string URL or AgentLightningClient when dev=True.") return client else: client = self._extract_client_from_data(train_data) if client is None and self.algorithm is None: raise ValueError( "train_data must be a string URL or AgentLightningClient when no algorithm is provided." ) elif client is None and self.algorithm is not None: # Algorithm will be responsible for creating the client client = self.algorithm.get_client() logger.info(f"Algorithm created client: {client}") return client if client is None: raise ValueError( "train_data must be a string URL or AgentLightningClient when no algorithm is provided." ) return client def init(self, backend: Union[str, AgentLightningClient]) -> None: logger.info(f"Initializing Trainer...") self._init_client(backend) self.tracer.init() logger.info(f"Trainer main initialization complete.") def teardown(self) -> None: logger.info(f"Cleaning up Trainer...") self.tracer.teardown() self._client = None logger.info(f"Trainer main cleanup complete.") def client(self) -> AgentLightningClient: """Returns the AgentLightningClient instance.""" if self._client is None: raise RuntimeError("AgentLightningClient has not been initialized. Call `init` first.") return self._client def _init_client(self, backend: Union[str, AgentLightningClient]) -> AgentLightningClient: if self._client is None: if isinstance(backend, AgentLightningClient): logger.info("Using provided AgentLightningClient instance.") self._client = backend else: logger.info(f"Initializing AgentLightningClient with endpoint: {backend}") if not isinstance(backend, str): # type: ignore raise ValueError("backend must be a string URL or an AgentLightningClient instance.") if not backend.startswith("http://") and not backend.startswith("https://"): raise ValueError("backend must be a valid URL starting with http:// or https://") # Initialize the client with the provided backend URL self._client = AgentLightningClient(endpoint=backend) else: logger.warning("AgentLightningClient already initialized. Returning existing instance.") return self._client def _worker_main_loop(self, agent: LitAgent[Any], worker_id: int, is_async: bool): """The main function for each worker process. This function initializes the client and the loop, then starts the execution. It also configures process-specific settings like the process title and signal handling. Args: agent: The `LitAgent` instance to run. worker_id: The unique ID for this worker. is_async: A boolean indicating if the async loop should be run. """ if self.n_workers > 1: import setproctitle # Ignore Ctrl+C in worker processes; the main process handles it signal.signal(signal.SIGINT, signal.SIG_IGN) setproctitle.setproctitle(multiprocessing.current_process().name) # Now we are in child processes, so we can safely set up the environment. agent.set_trainer(self) # type: ignore if not isinstance(self.triplet_exporter, TracerTraceToTriplet): # type: ignore raise ValueError("triplet_exporter must be a TracerTraceToTriplet for the legacy trainer.") # TODO: this should be set elsewhere if agent.trained_agents: self.triplet_exporter.agent_match = agent.trained_agents self._initialize_worker_env(worker_id) mode = "Async" if is_async else "Sync" logger.info(f"[Worker {worker_id}] {mode} worker process started.") num_processed = 0 try: client = self.client() loop = LegacyAgentRunner( agent=agent, client=client, tracer=self.tracer, triplet_exporter=self.triplet_exporter, max_tasks=self.max_tasks, worker_id=worker_id, ) loop.init_worker(worker_id) # type: ignore if is_async: num_processed = asyncio.run(loop.iter_async()) else: num_processed = loop.iter() except Exception: logger.exception(f"[Worker {worker_id}] Unhandled exception in worker loop.") finally: self._teardown_worker_env(worker_id) return num_processed def _initialize_worker_env(self, worker_id: int): logger.info(f"[Worker {worker_id}] Setting up trainer environment...") # worker_id included in process name self.tracer.init_worker(worker_id) def _teardown_worker_env(self, worker_id: int): logger.info(f"[Worker {worker_id}] Cleaning up trainer environment...") self.tracer.teardown_worker(worker_id) logger.info(f"[Worker {worker_id}] Environment cleanup complete.") @staticmethod def kill_orphaned_processes() -> None: """ Kill any orphaned processes that may have been left behind by previous runs. This is useful for cleaning up after crashes or unexpected exits. """ import psutil for proc in psutil.process_iter(): # type: ignore # check whether the process name matches if proc.name().startswith("AgentLightning-"): proc.kill() def _terminate_processes(self, processes: List[multiprocessing.Process]) -> None: if self.n_workers > 1 and len(processes) > 0: for i, p in enumerate(processes): if p.is_alive(): logger.info(f"Terminating worker {i} (name: {p.name}, PID: {p.pid})...") p.terminate() else: logger.info(f"Worker {i} (name: {p.name}, PID: {p.pid}) is not alive or has already terminated.") for i, p in enumerate(processes): if p.is_alive(): p.join(timeout=10) # Give some time to terminate if p.is_alive(): # If still alive, kill logger.warning( f"Worker {i} (name: {p.name}, PID: {p.pid}) did not terminate gracefully, killing..." ) p.kill() p.join(timeout=10) # Ensure it's reaped def fit_v0( self, agent: LitAgent[T_co], train_data: Union[str, AgentLightningClient, Dataset[T_co]], *, val_data: Union[str, AgentLightningClient, Dataset[T_co], None] = None, dev_data: Union[str, AgentLightningClient, Dataset[T_co], None] = None, dev_backend: Union[str, AgentLightningClient, None] = None, ): """Train the agent using the provided data. Each data argument can be a string URL connecting to a agent-lightning server, or an AgentLightningClient instance connecting to a server (or mock server), or a dataset. If no algorithm is provided when instantiating the trainer, the data must be provided to connecting a server. Otherwise, dataset is also allowed and will be passed to the algorithm. If the algorithm is instantiated and there is no URL/client provided, the algorithm will be responsible for creating a client that will connect to itself. It can also create a mock client if the algorithm does not require a server. """ if dev_backend is not None: warnings.warn("dev_backend is deprecated. Use dev_data instead.") if dev_data is not None: raise ValueError("dev_data and dev_backend cannot be provided at the same time.") dev_data = dev_backend # Extract datasets for algorithm if available train_dataset = self._extract_dataset_from_data(train_data) val_dataset = self._extract_dataset_from_data(val_data) if val_data else None # Initialize the algorithm with trainer if provided if self.algorithm is not None: self.algorithm.set_trainer(self) # type: ignore # DO NOT RUN TRAINING HERE. Need to spawn the worker first. # Determine the backend to use for client-server mode backend = self._determine_backend(train_data, dev_data) if self._dev: logger.warning(f"Running in dev mode. Using dev backend: {backend}") else: logger.debug(f"Running in non-dev mode. Using backend: {backend}") self.init(backend) processes: List[multiprocessing.Process] = [] # Determine if the agent is asynchronous mode = "asynchronous" if agent.is_async() else "synchronous" try: if self.n_workers == 1: logger.info(f"Running with n_workers=1 ({mode} in main process).") # Warn if algorithm is set with single worker mode if self.algorithm is not None: logger.warning( "Algorithm is set but using single worker mode. Algorithm will never get the chance to run." ) # Ideally the single worker should be run in a separate thread or process. num_tasks = self._worker_main_loop(agent, 0, agent.is_async()) logger.info(f"Single worker mode finished. Tasks processed: {num_tasks}") # If algorithm is provided and we have datasets, run algorithm after worker completes if self.algorithm is not None and train_dataset is not None: logger.info("Running algorithm training after worker completion.") self.algorithm.run( train_dataset=train_dataset, val_dataset=val_dataset, ) else: logger.info(f"Running with n_workers={self.n_workers} ({mode} multiprocessing).") for i in range(self.n_workers): process_name = f"AgentLightning-Worker-{i}" p = multiprocessing.Process( target=self._worker_main_loop, args=(agent, i, agent.is_async()), daemon=self.daemon, name=process_name, ) processes.append(p) logger.info(f"Starting worker process {i} (name: {process_name})...") p.start() if self.daemon: # If algorithm is provided and we have datasets, pass them to the algorithm if self.algorithm is not None: logger.info("All workers have been spawned. Running algorithm training with provided datasets.") self.algorithm.run( train_dataset=train_dataset, val_dataset=val_dataset, ) logger.info("Algorithm exits. Killing the workers.") self._terminate_processes(processes) for i, p in enumerate(processes): p.join() # Wait for the process to complete logger.info( f"Worker process {i} (name: {p.name}, PID: {p.pid}) joined with exit code {p.exitcode}." ) if p.exitcode != 0: logger.warning( f"Worker process {i} (name: {p.name}, PID: {p.pid}) exited with non-zero code: {p.exitcode}." ) logger.info(f"All {self.n_workers} worker processes have completed.") else: logger.info("All worker processes started. Main process will not wait.") # A hack to stop the main process from waiting for child processes to finish. time.sleep(1) # Give workers time to start import multiprocessing.process as multiprocessing_process multiprocessing_process._children.clear() # type: ignore if self.algorithm is not None: logger.info("Main process continues to run algorithm.") self.algorithm.run( train_dataset=train_dataset, val_dataset=val_dataset, ) logger.info("Algorithm exits. Killing the workers.") self._terminate_processes(processes) except KeyboardInterrupt: logger.info("KeyboardInterrupt received. Killing the workers.") self._terminate_processes(processes) logger.info(f"Workers terminated or single worker interrupted.") raise except Exception: logger.exception(f"Unhandled exception in fit method.") self._terminate_processes(processes) logger.info(f"Workers terminated or single worker interrupted.") raise finally: if self.daemon: self.teardown() else: logger.info("Main process exiting. Please use Trainer.kill_orphaned_processes() for cleanup.") ================================================ FILE: agentlightning/trainer/registry.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Put components in this file to make them available to the Trainer. Currently only used for ExecutionStrategy. """ ExecutionStrategyRegistry = { "shm": "agentlightning.execution.shared_memory.SharedMemoryExecutionStrategy", # "ipc": "agentlightning.execution.inter_process.InterProcessExecutionStrategy", "cs": "agentlightning.execution.client_server.ClientServerExecutionStrategy", } ================================================ FILE: agentlightning/trainer/trainer.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import functools import logging import warnings from typing import Any, Callable, Dict, Optional, Sequence, TypeVar, Union from agentlightning.adapter import TraceAdapter, TracerTraceToTriplet from agentlightning.algorithm import Algorithm, Baseline, FastAlgorithm from agentlightning.client import AgentLightningClient from agentlightning.execution.base import ExecutionStrategy from agentlightning.execution.client_server import ClientServerExecutionStrategy from agentlightning.execution.events import ExecutionEvent from agentlightning.litagent import LitAgent from agentlightning.llm_proxy import LLMProxy from agentlightning.runner import LitAgentRunner, Runner from agentlightning.store.base import LightningStore from agentlightning.store.memory import InMemoryLightningStore from agentlightning.tracer.agentops import AgentOpsTracer from agentlightning.tracer.base import Tracer from agentlightning.types import Dataset, Hook, NamedResources from .init_utils import build_component, instantiate_component from .legacy import TrainerLegacy from .registry import ExecutionStrategyRegistry logger = logging.getLogger(__name__) T_co = TypeVar("T_co", covariant=True) T = TypeVar("T") ComponentSpec = Union[T, type[T], Callable[[], T], str, Dict[str, Any], None] class Trainer(TrainerLegacy): """High-level orchestration layer that wires Algorithm <-> Runner <-> Store. A [`Trainer`][agentlightning.Trainer] packages the moving parts of Agent-Lightning's training loop into a single entry point: * **Algorithm lifecycle:** Instantiates or accepts an [`Algorithm`][agentlightning.Algorithm], attaches the current [`LightningStore`][agentlightning.LightningStore], adapter, and initial resources, then executes the algorithm role inside the configured execution strategy. * **Runner fleet:** Spawns one or more [`Runner`][agentlightning.Runner] instances (defaulting to [`LitAgentRunner`][agentlightning.LitAgentRunner]) that hydrate a [`LitAgent`][agentlightning.LitAgent], claim rollouts, stream spans, and respect graceful termination signals from the execution strategy. * **Execution strategy:** Delegates process management to an [`ExecutionStrategy`][agentlightning.ExecutionStrategy] (shared memory, client/server, etc.), so advanced users can swap orchestration backends without changing trainer code. * **Telemetry plumbing:** Ensures tracers, adapters, and optional [`LLMProxy`][agentlightning.LLMProxy] are wired into both algorithm and runners so telemetry flows back into the store. The trainer exposes two convenience entry points: [`fit()`][agentlightning.Trainer.fit] for full training and [`dev()`][agentlightning.Trainer.dev] for fast, reproducible dry-runs. See the [Train the First Agent](../how-to/train-first-agent.md) and [Write the First Algorithm](../how-to/write-first-algorithm.md) tutorials for the broader context. """ algorithm: Optional[Algorithm] """An instance of [`Algorithm`][agentlightning.Algorithm] to use for training.""" store: LightningStore """An instance of [`LightningStore`][agentlightning.LightningStore] to use for storing tasks and traces.""" runner: Runner[Any] """An instance of [`Runner`][agentlightning.Runner] to use for running the agent.""" initial_resources: Optional[NamedResources] """An instance of [`NamedResources`][agentlightning.NamedResources] to use for bootstrapping the fit/dev process. The resources will be handed over to the algorithm. Note that not all algorithms support seeding resources. """ n_runners: int """Number of agent runners to run in parallel.""" max_rollouts: Optional[int] """Maximum number of rollouts to process per runner. If None, workers run until no more rollouts are available.""" strategy: ExecutionStrategy """An instance of [`ExecutionStrategy`][agentlightning.ExecutionStrategy] to use for spawning the algorithm and runners.""" tracer: Tracer """A tracer instance, or a string pointing to the class full name or a dictionary with a 'type' key that specifies the class full name and other initialization parameters. If None, a default [`AgentOpsTracer`][agentlightning.AgentOpsTracer] will be created with the current settings.""" hooks: Sequence[Hook] """A sequence of [`Hook`][agentlightning.Hook] instances to be called at various lifecycle stages (e.g., `on_trace_start`, `on_trace_end`, `on_rollout_start`, `on_rollout_end`).""" adapter: TraceAdapter[Any] """An instance of [`TraceAdapter`][agentlightning.TraceAdapter] to export data consumble by algorithms from traces.""" llm_proxy: Optional[LLMProxy] """An instance of [`LLMProxy`][agentlightning.LLMProxy] to use for intercepting the LLM calls. If not provided, algorithm may create one on its own.""" n_workers: int """Number of agent workers to run in parallel. Deprecated in favor of `n_runners`.""" max_tasks: Optional[int] """Maximum number of tasks to process per runner. Deprecated in favor of `max_rollouts`.""" daemon: bool """Whether worker processes should be daemons. Daemon processes are terminated automatically when the main process exits. Deprecated. Only have effect with `fit_v0`.""" triplet_exporter: TraceAdapter[Any] """An instance of [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] to export triplets from traces, or a dictionary with the initialization parameters for the exporter. Deprecated. Use [`adapter`][agentlightning.Trainer.adapter] instead.""" port: Optional[int] """Port forwarded to [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy].""" def __init__( self, *, dev: bool = False, n_runners: Optional[int] = None, max_rollouts: Optional[int] = None, initial_resources: Optional[NamedResources] = None, tracer: ComponentSpec[Tracer] = None, adapter: ComponentSpec[TraceAdapter[Any]] = None, store: ComponentSpec[LightningStore] = None, runner: ComponentSpec[Runner[Any]] = None, strategy: ComponentSpec[ExecutionStrategy] = None, port: Optional[int] = None, algorithm: ComponentSpec[Algorithm] = None, llm_proxy: ComponentSpec[LLMProxy] = None, n_workers: Optional[int] = None, max_tasks: Optional[int] = None, daemon: bool = True, triplet_exporter: ComponentSpec[TracerTraceToTriplet] = None, hooks: Optional[Union[Hook, Sequence[Hook]]] = None, ): """Configure the trainer and resolve user-provided component specifications. Each keyword accepts either a concrete instance, a class, a callable factory, a registry string, or a lightweight configuration dictionary (see [`build_component()`][agentlightning.trainer.init_utils.build_component]). When ``port`` is provided it is forwarded to [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy] instances constructed (or supplied) for the trainer. """ # Do not call super().__init__() here. # super().__init__() will call TrainerLegacy's initialization, which is not intended. self.worker_id: Optional[int] = None if dev: warnings.warn( "Trainer(dev=True) is deprecated and will be removed in future versions. " "Please use Trainer.dev(...) instead.", DeprecationWarning, stacklevel=2, ) self._dev = dev self.daemon = daemon self._client: AgentLightningClient | None = None # Will be initialized in fit or fit_v0 if n_workers is not None: warnings.warn( "`n_workers` is deprecated. Please use `n_runners`.", DeprecationWarning, stacklevel=2, ) if n_runners is None: n_runners = n_workers if n_workers is not None else 1 else: if n_workers is not None and n_workers != n_runners: warnings.warn( "`n_workers` is ignored when `n_runners` is provided.", DeprecationWarning, stacklevel=2, ) self.n_runners = n_runners self.n_workers = n_runners # Backwards compatibility for fit_v0 if max_tasks is not None: warnings.warn( "`max_tasks` is deprecated. Please use `max_rollouts`.", DeprecationWarning, stacklevel=2, ) if max_rollouts is None: max_rollouts = max_tasks elif max_tasks is not None and max_tasks != max_rollouts: warnings.warn( "`max_tasks` is ignored when `max_rollouts` is provided.", DeprecationWarning, stacklevel=2, ) self.max_rollouts = max_rollouts self.max_tasks = max_tasks if max_tasks is not None else max_rollouts self.tracer = self._make_tracer(tracer) if adapter is not None and triplet_exporter is not None: warnings.warn( "`triplet_exporter` is deprecated and ignored because `adapter` is provided.", DeprecationWarning, stacklevel=2, ) adapter_spec = adapter if adapter is not None else triplet_exporter self.adapter = self._make_adapter(adapter_spec) self.triplet_exporter = self.adapter # Backwards compatibility self.algorithm = self._make_algorithm(algorithm) # We might be able to support a list of resources in future. self.initial_resources = initial_resources self.port = port self.strategy = self._make_strategy( strategy, n_runners=self.n_runners, port=port, ) # The active store for the current execution context self.store = self._make_store(store, self.strategy) self.runner = self._make_runner(runner) if hasattr(self.strategy, "n_runners"): strategy_runners = getattr(self.strategy, "n_runners") if isinstance(strategy_runners, int) and strategy_runners > 0: self.n_runners = strategy_runners self.n_workers = strategy_runners self.llm_proxy = self._make_llm_proxy(llm_proxy, store=self.store) self.hooks = self._normalize_hooks(hooks) if not self.daemon: logger.warning( "daemon=False. Worker processes are non-daemonic. " "The worker processes will NOT be terminated when the main process exits. " "The cleanup must be handled manually." ) def _make_tracer(self, tracer: ComponentSpec[Tracer]) -> Tracer: """Resolve the tracer component from user input, falling back to AgentOpsTracer.""" default_factory = lambda: AgentOpsTracer( agentops_managed=True, instrument_managed=True, daemon=self.daemon, ) return build_component( tracer, expected_type=Tracer, spec_name="tracer", default_factory=default_factory, dict_requires_type=True, invalid_spec_error_fmt="Invalid tracer type: {actual_type}. Expected Tracer, str, dict, or None.", type_error_fmt="Tracer factory returned {type_name}, which is not a Tracer subclass.", ) def _make_algorithm(self, algorithm: ComponentSpec[Algorithm]) -> Optional[Algorithm]: """Resolve the algorithm component, allowing `None` for dev-mode dry runs.""" return build_component( algorithm, expected_type=Algorithm, spec_name="algorithm", allow_none=True, invalid_spec_error_fmt="Invalid algorithm type: {actual_type}. Expected Algorithm, str, dict, or None.", type_error_fmt="Algorithm factory returned {type_name}, which is not a Algorithm subclass.", ) def _make_adapter(self, adapter: ComponentSpec[TraceAdapter[Any]]) -> TraceAdapter[Any]: """Resolve the adapter used to transform spans into algorithm-ready payloads.""" return build_component( adapter, expected_type=TraceAdapter, spec_name="adapter", default_factory=TracerTraceToTriplet, dict_requires_type=False, dict_default_cls=TracerTraceToTriplet, invalid_spec_error_fmt="Invalid adapter type: {actual_type}. Expected TraceAdapter, dict, or None.", type_error_fmt="Adapter factory returned {type_name}, which is not a TraceAdapter subclass.", ) def _make_store(self, store: ComponentSpec[LightningStore], strategy: ExecutionStrategy) -> LightningStore: """Resolve the store implementation backing rollouts, attempts, spans, and resources. By default, it's always a in-memory store. If using a client/server execution strategy, the in-memory store will be initialized in a thread-safe manner. """ is_client_server = isinstance(strategy, ClientServerExecutionStrategy) default_store_factory = lambda: InMemoryLightningStore(thread_safe=is_client_server) return build_component( store, expected_type=LightningStore, spec_name="store", default_factory=default_store_factory, invalid_spec_error_fmt="Invalid store type: {actual_type}. Expected LightningStore, str, dict, or None.", type_error_fmt="Store factory returned {type_name}, which is not a LightningStore subclass.", ) def _make_strategy( self, strategy: ComponentSpec[ExecutionStrategy], *, n_runners: int, port: Optional[int] = None, ) -> ExecutionStrategy: """Resolve the execution strategy and seed defaults such as `n_runners`.""" if isinstance(strategy, ExecutionStrategy): if port is not None and isinstance(strategy, ClientServerExecutionStrategy): strategy.server_port = port return strategy optional_defaults: Dict[str, Callable[[], Any]] = {"n_runners": lambda: n_runners} if port is not None: optional_defaults["server_port"] = lambda: port def default_factory() -> ExecutionStrategy: if port is not None: return ClientServerExecutionStrategy(n_runners=n_runners, server_port=port) return ClientServerExecutionStrategy(n_runners=n_runners) return build_component( strategy, expected_type=ExecutionStrategy, spec_name="strategy", default_factory=default_factory, optional_defaults=optional_defaults, invalid_spec_error_fmt="Invalid strategy type: {actual_type}. Expected ExecutionStrategy, str, dict, or None.", type_error_fmt="Strategy factory returned {type_name}, which is not an ExecutionStrategy subclass.", registry=ExecutionStrategyRegistry, ) def _make_llm_proxy( self, llm_proxy: ComponentSpec[LLMProxy], *, store: LightningStore, ) -> Optional[LLMProxy]: """Resolve an optional LLM proxy and ensure it shares the trainer's store instance.""" if isinstance(llm_proxy, LLMProxy): return llm_proxy optional_defaults: Dict[str, Callable[[], Any]] = {"store": lambda: store} if isinstance(llm_proxy, dict): llm_proxy = {**llm_proxy} llm_proxy.setdefault("store", store) return build_component( llm_proxy, expected_type=LLMProxy, spec_name="llm_proxy", allow_none=True, optional_defaults=optional_defaults, invalid_spec_error_fmt="Invalid llm_proxy type: {actual_type}. Expected LLMProxy, dict, str, or None.", type_error_fmt="llm_proxy factory returned {type_name}, which is not an LLMProxy subclass.", ) def _make_runner(self, runner: ComponentSpec[Runner[Any]]) -> Runner[Any]: """Resolve the runner responsible for executing the agent inside each worker.""" optional_defaults: Dict[str, Callable[[], Any]] = {"tracer": lambda: self.tracer} if self.max_rollouts is not None: optional_defaults["max_rollouts"] = lambda: self.max_rollouts def default_runner_factory() -> Runner[Any]: return instantiate_component(LitAgentRunner, optional_defaults=optional_defaults) return build_component( runner, expected_type=Runner, spec_name="runner", default_factory=default_runner_factory, optional_defaults=optional_defaults, invalid_spec_error_fmt="Invalid runner type: {actual_type}. Expected Runner, callable, str, dict, or None.", type_error_fmt="Runner factory returned {type_name}, which is not a Runner subclass.", ) def _normalize_hooks(self, hooks: Optional[Union[Hook, Sequence[Hook]]]) -> Sequence[Hook]: """Coerce hook inputs into an immutable sequence for runner initialization.""" if hooks is None: return () if isinstance(hooks, Hook): return (hooks,) return tuple(hooks) def fit( self, agent: LitAgent[T_co], train_dataset: Optional[Dataset[T_co]] = None, *, val_dataset: Optional[Dataset[T_co]] = None, ) -> None: """Execute the full algorithm/runner training loop. [`Trainer.fit`][agentlightning.Trainer.fit] packages the algorithm and runner bundles, then hands them to the active [`ExecutionStrategy`][agentlightning.ExecutionStrategy]. The strategy rarely returns until: * The algorithm exhausts the dataset(s) and stops enqueuing rollouts. * `max_rollouts` causes individual runners to exit. * An exception or interrupt cancels the shared [`ExecutionEvent`][agentlightning.ExecutionEvent]. Args: agent: [`LitAgent`][agentlightning.LitAgent] implementation executed by runners. train_dataset: Optional iterable of rollout inputs consumed by the algorithm. val_dataset: Optional iterable consumed by validation passes. """ if isinstance(train_dataset, str): logger.warning( "Trainer.fit will no longer accepts a string URL in future version. " "To continue using a string URL, please use Trainer.fit_v0 instead. " "See documentation for how to migrate to latest version: https://microsoft.github.io/agent-lightning/stable/" ) return self.fit_v0( # type: ignore agent, train_dataset, val_dataset, # type: ignore ) agent.set_trainer(self) algorithm_bundle = functools.partial( self._algorithm_bundle, train_dataset=train_dataset, val_dataset=val_dataset, algorithm=self.algorithm, ) runner_bundle = functools.partial(self._runner_bundle, agent=agent) self.strategy.execute(algorithm_bundle, runner_bundle, self.store) def dev( self, agent: LitAgent[T_co], train_dataset: Optional[Dataset[T_co]] = None, *, val_dataset: Optional[Dataset[T_co]] = None, ) -> None: """Exercise the infrastructure using a fast, synchronous algorithm. [`Trainer.dev`][agentlightning.Trainer.dev] mirrors [`fit()`][agentlightning.Trainer.fit] but insists on an [`Algorithm`][agentlightning.Algorithm] subtype that also derives from [`FastAlgorithm`][agentlightning.FastAlgorithm]. This keeps the loop responsive for debugging while still touching the same store, runners, hooks, and tracer plumbing. If no algorithm is provided, a default [`Baseline`][agentlightning.Baseline] algorithm will be used. Args: agent: [`LitAgent`][agentlightning.LitAgent] implementation to execute. train_dataset: Optional iterable passed to the algorithm. val_dataset: Optional iterable passed to the algorithm. Raises: TypeError: If the configured algorithm does not inherit from `FastAlgorithm`. """ agent.set_trainer(self) # Sanity check if self.algorithm is None: algorithm = Baseline() else: algorithm = self.algorithm if not isinstance(algorithm, FastAlgorithm): raise TypeError( "Trainer.dev() requires an algorithm that inherits from FastAlgorithm. " f"Received {type(algorithm).__name__}." ) algorithm_bundle = functools.partial( self._algorithm_bundle, train_dataset=train_dataset, val_dataset=val_dataset, algorithm=algorithm, ) runner_bundle = functools.partial(self._runner_bundle, agent=agent) self.strategy.execute(algorithm_bundle, runner_bundle, self.store) async def _algorithm_bundle( self, store: LightningStore, event: ExecutionEvent, train_dataset: Optional[Dataset[T_co]], val_dataset: Optional[Dataset[T_co]], algorithm: Optional[Algorithm], ) -> None: """Internal entry point executed by the strategy for the algorithm role. This coroutine is scheduled inside the strategy's process/thread and is responsible for binding algorithm dependencies (store, adapter, initial resources, proxy) before invoking [`Algorithm.run`][agentlightning.Algorithm.run]. When `algorithm` is `None` the bundle simply waits for the shared `event` to signal shutdown so runners can still execute (useful for manual queue seeding or external algorithms). """ if algorithm is not None: algorithm.set_trainer(self) algorithm.set_store(store) algorithm.set_adapter(self.adapter) if self.initial_resources is not None: algorithm.set_initial_resources(self.initial_resources) if self.llm_proxy is not None: self.llm_proxy.set_store(store) algorithm.set_llm_proxy(self.llm_proxy) if algorithm is None: while not event.is_set(): await asyncio.sleep(0.1) return try: if algorithm.is_async(): await algorithm.run( # type: ignore train_dataset=train_dataset, val_dataset=val_dataset, ) else: # This will block the event loop to maximize the debugging experience # It's the responsibility of the execution strategy to enable async execution algorithm.run( train_dataset=train_dataset, val_dataset=val_dataset, ) except Exception: logger.exception("Algorithm bundle encountered an error.") raise async def _runner_bundle( self, store: LightningStore, worker_id: int, event: ExecutionEvent, agent: LitAgent[T_co] ) -> None: """Internal entry point executed by the strategy for each runner role. The bundle materializes the configured runner, binds the agent and hooks, associates the worker with the shared store, and then drives the runner's [`iter`][agentlightning.Runner.iter] loop until the execution event is set or an exception occurs. Cleanup mirrors the initialization sequence to keep tracer state, hooks, and agent resources consistent across restarts. """ runner_instance: Runner[Any] | None = None runner_initialized = False worker_initialized = False try: # If not using shm execution strategy, we are already in the forked process runner_instance = self.runner runner_instance.init(agent=agent, hooks=self.hooks) runner_initialized = True runner_instance.init_worker(worker_id, store) worker_initialized = True await runner_instance.iter(event=event) except Exception: logger.exception("Runner bundle encountered an error (worker_id=%s).", worker_id) raise finally: if runner_instance is not None: if worker_initialized: try: runner_instance.teardown_worker(worker_id) except Exception: logger.exception("Error during runner worker teardown (worker_id=%s).", worker_id) if runner_initialized: try: runner_instance.teardown() except Exception: logger.exception("Error during runner teardown (worker_id=%s).", worker_id) ================================================ FILE: agentlightning/types/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .core import * from .resources import * from .tracer import * ================================================ FILE: agentlightning/types/core.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Core data models shared across Agent Lightning components.""" from __future__ import annotations from typing import ( TYPE_CHECKING, Any, Callable, Dict, Generic, Iterator, List, Literal, Mapping, Optional, Protocol, Sequence, SupportsIndex, TypedDict, TypeVar, Union, cast, overload, ) from opentelemetry.sdk.trace import ReadableSpan from pydantic import BaseModel, Field, model_validator from .tracer import Span, SpanCoreFields if TYPE_CHECKING: from agentlightning.litagent import LitAgent from agentlightning.runner.base import Runner from agentlightning.tracer.base import Tracer __all__ = [ "Triplet", "RolloutLegacy", "Task", "TaskInput", "TaskIfAny", "RolloutRawResultLegacy", "RolloutRawResult", "RolloutMode", "GenericResponse", "ParallelWorkerBase", "Dataset", "AttemptStatus", "RolloutStatus", "RolloutConfig", "Rollout", "Attempt", "AttemptedRollout", "EnqueueRolloutRequest", "Hook", "Worker", "WorkerStatus", "PaginatedResult", "FilterOptions", "SortOptions", "FilterField", ] T_co = TypeVar("T_co", covariant=True) class Triplet(BaseModel): """Single interaction turn captured during reinforcement learning.""" prompt: Any response: Any reward: Optional[float] = None metadata: Dict[str, Any] = Field(default_factory=dict) class RolloutLegacy(BaseModel): """Legacy reporting payload exchanged with the deprecated HTTP server. !!! warning "Deprecated" Use [`Rollout`][agentlightning.Rollout] instead. """ rollout_id: str # Echoing the input task task: Optional[Task] = None # Primary, high-level feedback final_reward: Optional[float] = None # Structured, sequential feedback for RL-style optimization triplets: Optional[List[Triplet]] = None # Optional, rich-context data for deep analysis trace: Optional[List[Dict[str, Any]]] = Field( default=None, description="A list of spans that conform to the OpenTelemetry JSON format. " "Users of the opentelemetry-sdk can generate this by calling " "json.loads(readable_span.to_json()).", ) logs: Optional[List[str]] = None # A bucket for any other relevant information metadata: Dict[str, Any] = Field(default_factory=dict) RolloutStatus = Literal[ "queuing", # initial status "preparing", # after the trace is claimed "running", # after receiving the first trace "failed", # crashed "succeeded", # status OK "cancelled", # cancelled by user (or watchdog) "requeuing", # retrying ] """The status of a rollout.""" AttemptStatus = Literal[ # A status is essentially a process. # It should not have scheduling/management statuses like "queuing" or "cancelled". "preparing", "running", "failed", "succeeded", "unresponsive", # the worker has not reported results for a while "timeout", # the worker has been emitting new logs, but have been working on the task for too long ] """The status of an attempt.""" RolloutMode = Literal["train", "val", "test"] """Possible rollout modes.""" class Attempt(BaseModel): """Execution attempt for a rollout, including metadata for retries.""" rollout_id: str """The rollout which this attempt belongs to.""" attempt_id: str """The universal id for current attempt.""" sequence_id: int """The sequence number of the attempt, starting from 1.""" start_time: float """The time when the attempt has started.""" end_time: Optional[float] = None """The time when the attempt has ended.""" status: AttemptStatus = "preparing" """The status of the attempt.""" worker_id: Optional[str] = None """The rollout worker which is executing this attempt.""" last_heartbeat_time: Optional[float] = None """The last time when the worker has reported progress (i.e., a span).""" metadata: Optional[Dict[str, Any]] = None """A bucket for any other relevant information.""" class RolloutConfig(BaseModel): """Configuration controlling rollout retries and timeouts.""" timeout_seconds: Optional[float] = None """The timeout for the rollout, in seconds. None indicates no timeout.""" unresponsive_seconds: Optional[float] = None """The unresponsive timeout for the rollout, in seconds. None indicates no unresponsive timeout.""" max_attempts: int = Field(default=1, ge=1) """The maximum number of attempts for the rollout, including the first attempt.""" retry_condition: List[AttemptStatus] = Field(default_factory=cast(Callable[[], List[AttemptStatus]], list)) """The list of statuses that should trigger a retry.""" class Rollout(BaseModel): rollout_id: str """Unique identifier for the rollout.""" input: TaskInput """Task input used to generate the rollout.""" # Time to track the lifecycle of the rollout start_time: float """Timestamp when the rollout started.""" end_time: Optional[float] = None """Timestamp when the rollout ended.""" mode: Optional[RolloutMode] = None """Execution mode such as `"train"`, `"val"` or `"test"`. See [`RolloutMode`][agentlightning.RolloutMode].""" resources_id: Optional[str] = None """Identifier of the resources required to execute the rollout.""" status: RolloutStatus = "queuing" """Latest status emitted by the controller.""" config: RolloutConfig = Field(default_factory=RolloutConfig) """Retry and timeout configuration associated with the rollout.""" metadata: Optional[Dict[str, Any]] = None """Additional metadata attached to the rollout.""" class AttemptedRollout(Rollout): """Rollout paired with the currently active attempt.""" attempt: Attempt """The attempt that is currently processing the rollout.""" @model_validator(mode="after") def check_consistency(self) -> AttemptedRollout: if self.attempt.rollout_id != self.rollout_id: raise ValueError("Inconsistent rollout_id between Rollout and Attempt") return self class EnqueueRolloutRequest(BaseModel): """Payload describing a rollout to be queued via [`enqueue_rollout`][agentlightning.LightningStore.enqueue_rollout]. A subset of fields from [`Rollout`][agentlightning.Rollout] used for queuing new rollouts. """ input: TaskInput """Task input used to generate the rollout.""" mode: Optional[RolloutMode] = None """Execution mode such as `"train"`, `"val"` or `"test"`. See [`RolloutMode`][agentlightning.RolloutMode].""" resources_id: Optional[str] = None """Identifier of the resources required to execute the rollout.""" config: Optional[RolloutConfig] = None """Retry and timeout configuration associated with the rollout.""" metadata: Optional[Dict[str, Any]] = None """Additional metadata attached to the rollout.""" WorkerStatus = Literal["idle", "busy", "unknown"] class Worker(BaseModel): """Worker information. This is actually the same as Runner info.""" worker_id: str """The ID of the worker.""" status: WorkerStatus = "unknown" """The status of the worker.""" heartbeat_stats: Optional[Dict[str, Any]] = None """Statistics about the worker's heartbeat.""" last_heartbeat_time: Optional[float] = None """The last time when the worker has reported the stats.""" last_dequeue_time: Optional[float] = None """The last time when the worker has tried to dequeue a rollout.""" last_busy_time: Optional[float] = None """The last time when the worker has started an attempt and became busy.""" last_idle_time: Optional[float] = None """The last time when the worker has triggered the end of an attempt and became idle.""" current_rollout_id: Optional[str] = None """The ID of the current rollout that the worker is processing.""" current_attempt_id: Optional[str] = None """The ID of the current attempt that the worker is processing.""" TaskInput = Any """Task input type. Accepts arbitrary payloads.""" class Task(BaseModel): """Rollout request served to client agents. !!! warning "Deprecated" The legacy HTTP client/server stack still uses this model. Prefer [`LightningStore`][agentlightning.LightningStore] APIs for new workflows. """ rollout_id: str input: TaskInput mode: Optional[RolloutMode] = None resources_id: Optional[str] = None # Optional fields for tracking task lifecycle create_time: Optional[float] = None last_claim_time: Optional[float] = None num_claims: Optional[int] = None # Allow additional metadata fields metadata: Dict[str, Any] = Field(default_factory=dict) class TaskIfAny(BaseModel): """A task or indication that no task is available. !!! warning "Deprecated" Use [`LightningStore`][agentlightning.LightningStore] APIs for new workflows. """ is_available: bool """Indication that a task is available.""" task: Optional[Task] = None RolloutRawResultLegacy = Union[None, float, List[Triplet], List[Dict[str, Any]], List[ReadableSpan], RolloutLegacy] """Legacy rollout result type. !!! warning "Deprecated" Use [`RolloutRawResult`][agentlightning.RolloutRawResult] instead. """ RolloutRawResult = Union[ None, # nothing (relies on tracer) float, # only final reward List[ReadableSpan], # constructed OTEL spans by user List[Span], # constructed Span objects by user List[SpanCoreFields], # constructed SpanCoreFields objects by user ] """Rollout result type. Possible return values of [`rollout`][agentlightning.LitAgent.rollout]. """ class GenericResponse(BaseModel): """Generic server response used by compatibility endpoints. !!! warning "Deprecated" This response is no longer used by the new [`LightningStore`][agentlightning.LightningStore] APIs. Attributes: status: Status string describing the result of the request. message: Optional human readable explanation. data: Arbitrary payload serialized as JSON. """ status: str = "success" message: Optional[str] = None data: Optional[Dict[str, Any]] = None class ParallelWorkerBase: """Base class for workloads executed across multiple worker processes. The lifecycle is orchestrated by the main process: * [`init()`][agentlightning.ParallelWorkerBase.init] prepares shared state. * Each worker calls [`init_worker()`][agentlightning.ParallelWorkerBase.init_worker] during start-up. * [`run()`][agentlightning.ParallelWorkerBase.run] performs the parallel workload. * Workers call [`teardown_worker()`][agentlightning.ParallelWorkerBase.teardown_worker] before exiting. * The main process finalizes through [`teardown()`][agentlightning.ParallelWorkerBase.teardown]. Subclasses must implement [`run()`][agentlightning.ParallelWorkerBase.run] and can override other lifecycle hooks. """ def __init__(self) -> None: """Initialize the base class. This method can be overridden by subclasses.""" self.worker_id: Optional[int] = None def init(self, *args: Any, **kwargs: Any) -> None: """Initialize before spawning the workers. This method can be overridden by subclasses.""" pass def init_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: """Initialize the worker. This method can be overridden by subclasses.""" self.worker_id = worker_id def run(self, *args: Any, **kwargs: Any) -> Any: """Run the workload. This method can be overridden by subclasses.""" pass def teardown_worker(self, worker_id: int, *args: Any, **kwargs: Any) -> None: """Teardown the worker. This method can be overridden by subclasses.""" pass def teardown(self, *args: Any, **kwargs: Any) -> None: """Teardown after the workers have exited. This method can be overridden by subclasses.""" pass class Dataset(Protocol, Generic[T_co]): """The general interface for a dataset. It's currently implemented as a protocol, having a similar interface to `torch.utils.data.Dataset`. You don't have to inherit from this class; you can use a simple list if you want to. """ def __getitem__(self, index: SupportsIndex, /) -> T_co: ... def __len__(self) -> int: ... class Hook(ParallelWorkerBase): """Base class for defining hooks in the agent runner's lifecycle.""" async def on_trace_start( self, *, agent: LitAgent[Any], runner: Runner[Any], tracer: Tracer, rollout: Rollout ) -> None: """Hook called immediately after the tracer enters the trace context but before the rollout begins. Args: agent: The [`LitAgent`][agentlightning.LitAgent] instance associated with the runner. runner: The [`Runner`][agentlightning.Runner] managing the rollout. tracer: The [`Tracer`][agentlightning.Tracer] instance associated with the runner. rollout: The [`Rollout`][agentlightning.Rollout] object that will be processed. Subclasses can override this method to implement custom logic such as logging, metric collection, or resource setup. By default, this is a no-op. """ async def on_trace_end( self, *, agent: LitAgent[Any], runner: Runner[Any], tracer: Tracer, rollout: Rollout ) -> None: """Hook called immediately after the rollout completes but before the tracer exits the trace context. Args: agent: The [`LitAgent`][agentlightning.LitAgent] instance associated with the runner. runner: The [`Runner`][agentlightning.Runner] managing the rollout. tracer: The [`Tracer`][agentlightning.Tracer] instance associated with the runner. rollout: The [`Rollout`][agentlightning.Rollout] object that has been processed. Subclasses can override this method to implement custom logic such as logging, metric collection, or resource cleanup. By default, this is a no-op. """ async def on_rollout_start(self, *, agent: LitAgent[Any], runner: Runner[Any], rollout: Rollout) -> None: """Hook called immediately before a rollout *attempt* begins. Args: agent: The [`LitAgent`][agentlightning.LitAgent] instance associated with the runner. runner: The [`Runner`][agentlightning.Runner] managing the rollout. rollout: The [`Rollout`][agentlightning.Rollout] object that will be processed. Subclasses can override this method to implement custom logic such as logging, metric collection, or resource setup. By default, this is a no-op. """ async def on_rollout_end( self, *, agent: LitAgent[Any], runner: Runner[Any], rollout: Rollout, spans: Union[List[ReadableSpan], List[Span]], ) -> None: """Hook called after a rollout *attempt* completes. Args: agent: The [`LitAgent`][agentlightning.LitAgent] instance associated with the runner. runner: The [`Runner`][agentlightning.Runner] managing the rollout. rollout: The [`Rollout`][agentlightning.Rollout] object that has been processed. spans: The spans that have been added to the store. Subclasses can override this method for cleanup or additional logging. By default, this is a no-op. """ class FilterField(TypedDict, total=False): """An operator dict for a single field.""" exact: Any within: Sequence[Any] contains: str FilterOptions = Mapping[ Union[str, Literal["_aggregate", "_must"]], Union[FilterField, Literal["and", "or"], Mapping[str, FilterField]], ] """A mapping of field name -> operator dict. Each operator dict can contain: - "exact": value for exact equality. - "within": iterable of allowed values. - "contains": substring to search for in string fields. The filter can also have a special field called "_aggregate" that can be used to specify the logic to combine the results of the filters: - "and": all conditions must match. This is the default value if not specified. - "or": at least one condition must match. All conditions within a field and between different fields are stored in a unified pool and combined using `_aggregate`. The filter can also have a special group called "_must", which is a mapping of filters that must all match, no matter whether the aggregate logic is "and" or "or". Example: ```json { "_aggregate": "or", "_must": { "city": {"exact": "New York"}, "timezone": {"within": ["America/New_York", "America/Los_Angeles"]}, }, "status": {"exact": "active"}, "id": {"within": [1, 2, 3]}, "name": {"contains": "foo"}, } ``` """ class SortOptions(TypedDict): """Options for sorting the collection.""" name: str """The name of the field to sort by.""" order: Literal["asc", "desc"] """The order to sort by.""" T_item = TypeVar("T_item") class PaginatedResult(BaseModel, Sequence[T_item]): """Result of a paginated query. Behaves like a sequence, but also carries pagination metadata (limit, offset, total). """ items: Sequence[T_item] """Items in the result.""" limit: int """Limit of the result.""" offset: int """Offset of the result.""" total: int """Total number of items in the collection.""" def __len__(self) -> int: return len(self.items) @overload def __getitem__(self, index: int) -> T_item: ... @overload def __getitem__(self, index: slice) -> Sequence[T_item]: ... def __getitem__(self, index: Union[int, slice]) -> Union[T_item, Sequence[T_item]]: return self.items[index] # Overriding __iter__ enables list(paginated_result) to work as expected, # but changes Pydantic's default dict iteration behavior (which would otherwise # iterate over field names). def __iter__(self) -> Iterator[T_item]: # type: ignore return iter(self.items) def __repr__(self) -> str: first_item_repr = repr(self.items[0]) if self.items else "empty" items_repr = f"[{first_item_repr}, ...]" if len(self.items) > 1 else first_item_repr slice_repr = f"{self.offset}:" if self.limit == -1 else f"{self.offset}:{self.offset + self.limit}" return f"" ================================================ FILE: agentlightning/types/resources.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations """Typed representations of tunable resources shared between Agent Lightning components.""" import inspect import logging from typing import ( Annotated, Any, Dict, Literal, Optional, Union, ) from pydantic import BaseModel, Field from .core import AttemptedRollout logger = logging.getLogger(__name__) __all__ = [ "Resource", "LLM", "ProxyLLM", "PromptTemplate", "ResourceUnion", "NamedResources", "ResourcesUpdate", ] class Resource(BaseModel): """Base class for tunable resources distributed to executors.""" resource_type: Any """Alias of the resource type.""" class LLM(Resource): """Resource that identifies an LLM endpoint and its configuration.""" resource_type: Literal["llm"] = "llm" endpoint: str """The URL of the LLM API endpoint.""" model: str """The identifier for the model to be used (e.g., 'gpt-4o').""" api_key: Optional[str] = None """Optional secret used to authenticate requests.""" sampling_parameters: Dict[str, Any] = Field(default_factory=dict) """A dictionary of hyperparameters for model inference, such as temperature, top_p, etc.""" def get_base_url(self, *args: Any, **kwargs: Any) -> str: """Return the base URL consumed by OpenAI-compatible clients. Users are encouraged to use `get_base_url(rollout_id, attempt_id)` to get the LLM endpoint instead of accessing `.endpoint` directly. """ return self.endpoint class ProxyLLM(LLM): """LLM resource that rewrites endpoints through [`LLMProxy`][agentlightning.LLMProxy]. The proxy injects rollout- and attempt-specific routing information into the endpoint so that downstream services can attribute requests correctly. """ resource_type: Literal["proxy_llm"] = "proxy_llm" # type: ignore _initialized: bool = False def model_post_init(self, __context: Any) -> None: """Mark initialization as complete after Pydantic finishes setup.""" super().model_post_init(__context) object.__setattr__(self, "_initialized", True) def __getattribute__(self, name: str) -> Any: """Emit a warning when `endpoint` is accessed directly after initialization.""" # Check if we're accessing endpoint after initialization and not from base_url if name == "endpoint": try: initialized = object.__getattribute__(self, "_initialized") except AttributeError: initialized = False if initialized: # Check the call stack to see if we're being called from base_url frame = inspect.currentframe() if frame and frame.f_back: caller_name = frame.f_back.f_code.co_name if caller_name != "get_base_url": logger.warning( "Accessing 'endpoint' directly on ProxyLLM is discouraged. " "Use 'get_base_url(rollout_id, attempt_id)' instead to get the properly formatted endpoint." ) return super().__getattribute__(name) def with_attempted_rollout(self, rollout: AttemptedRollout) -> LLM: """Bake rollout metadata into a concrete [`LLM`][agentlightning.LLM] instance.""" return LLM( endpoint=self.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id), model=self.model, sampling_parameters=self.sampling_parameters, api_key=self.api_key, ) def get_base_url(self, rollout_id: Optional[str], attempt_id: Optional[str]) -> str: """Return the routed endpoint for a specific rollout/attempt pair. Args: rollout_id: Identifier of the rollout making the request. attempt_id: Identifier of the attempt within that rollout. Returns: Fully qualified endpoint including rollout metadata. Raises: ValueError: If exactly one of ``rollout_id`` or ``attempt_id`` is provided. """ if rollout_id is None and attempt_id is None: return self.endpoint if not (isinstance(rollout_id, str) and isinstance(attempt_id, str)): raise ValueError("rollout_id and attempt_id must be strings or all be empty") prefix = self.endpoint if prefix.endswith("/"): prefix = prefix[:-1] if prefix.endswith("/v1"): prefix = prefix[:-3] has_v1 = True else: has_v1 = False # Now the prefix should look like "http://localhost:11434" # Append the rollout and attempt id to the prefix prefix = prefix + f"/rollout/{rollout_id}/attempt/{attempt_id}" if has_v1: prefix = prefix + "/v1" return prefix class PromptTemplate(Resource): """Resource describing a reusable prompt template.""" resource_type: Literal["prompt_template"] = "prompt_template" template: str """The template string. The format depends on the engine.""" engine: Literal["jinja", "f-string", "poml"] """The templating engine to use for rendering the prompt.""" def format(self, **kwargs: Any) -> str: """Format the prompt using keyword arguments. !!! warning Only the `f-string` engine is supported for now. """ if self.engine == "f-string": return self.template.format(**kwargs) else: raise NotImplementedError( "Formatting prompt templates for non-f-string engines with format() helper is not supported yet." ) # Use discriminated union for proper deserialization # TODO: migrate to use a registry ResourceUnion = Annotated[Union[LLM, ProxyLLM, PromptTemplate], Field(discriminator="resource_type")] NamedResources = Dict[str, ResourceUnion] """Mapping from resource names to their configured instances. Examples: ```python resources: NamedResources = { "main_llm": LLM( endpoint="http://localhost:8080", model="llama3", sampling_parameters={"temperature": 0.7, "max_tokens": 100}, ), "system_prompt": PromptTemplate( template="You are a helpful assistant.", engine="f-string", ), } ``` """ class ResourcesUpdate(BaseModel): """Update payload broadcast to clients when resources change.""" resources_id: str """Identifier used to version the resources.""" create_time: float """Timestamp of the creation time of the resources.""" update_time: float """Timestamp of the last update time of the resources.""" version: int """Version of the resources.""" resources: NamedResources """Mapping of resource names to their definitions.""" ================================================ FILE: agentlightning/types/tracer.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import time """Data models that mirror OpenTelemetry spans for Agent Lightning.""" import json from enum import Enum from typing import Any, Dict, List, Literal, Optional, Protocol, Sequence, Union from opentelemetry import trace as trace_api from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import Event as OtelEvent from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.id_generator import RandomIdGenerator from opentelemetry.trace.status import Status as OtelStatus from pydantic import BaseModel, ConfigDict from agentlightning.semconv import AGL_VIRTUAL __all__ = [ "AttributeValue", "Attributes", "TraceState", "SpanContext", "TraceStatus", "Event", "Link", "OtelResource", "Span", "SpanNames", "SpanAttributeNames", "SpanLike", "StatusCode", "SpanCoreFields", "SpanRecordingContext", ] def convert_timestamp(timestamp: Optional[int]) -> Optional[float]: """Normalize OpenTelemetry timestamps to seconds. Args: timestamp: Timestamp expressed either in seconds or nanoseconds. Returns: Timestamp in seconds when `timestamp` is provided; otherwise `None`. """ if not timestamp: return None return timestamp / 1_000_000_000 if timestamp > 1e12 else timestamp def extract_extra_fields(src: Any, excluded_fields: List[str]) -> Dict[str, Any]: """Capture custom attributes from an OpenTelemetry object. Args: src: Object that exposes a `__dict__` of potential attributes. excluded_fields: Attribute names that should be removed from the output. Returns: Dictionary containing JSON-serializable representations of the remaining fields. """ excluded_fields_set = set(excluded_fields) | set(["_" + k for k in excluded_fields]) # Exclude the function fields excluded_fields_set |= set(src.__class__.__dict__.keys()) stripped_dict = {k.lstrip("_"): v for k, v in src.__dict__.items()} candidates = {k: v for k, v in stripped_dict.items() if k not in excluded_fields_set and not k.startswith("_")} # This should strip or flatten the unserializable fields candidates_serialized = json.dumps(candidates, default=str) return json.loads(candidates_serialized) AttributeValue = Union[ str, bool, int, float, Sequence[str], Sequence[bool], Sequence[int], Sequence[float], ] """Possible values for OpenTelemetry attributes.""" Attributes = Dict[str, AttributeValue] """Mapping from attribute names to their values. Same as OpenTelemetry `Attributes` type.""" TraceState = Dict[str, str] """Mapping from trace state key to its value. Same as OpenTelemetry `TraceState` type.""" StatusCode = Literal["UNSET", "OK", "ERROR"] """The status code of the span.""" class SpanContext(BaseModel): """Pydantic representation of `opentelemetry.trace.SpanContext` values.""" trace_id: str """The trace ID of the span.""" span_id: str """The span ID of the span.""" is_remote: bool """Whether the span is remote.""" trace_state: TraceState """Mapping from trace state key to its value.""" model_config = ConfigDict(extra="allow") @classmethod def from_opentelemetry(cls, src: trace_api.SpanContext) -> "SpanContext": """Construct a [`SpanContext`][agentlightning.SpanContext] from OpenTelemetry data.""" return cls( trace_id=trace_api.format_trace_id(src.trace_id), span_id=trace_api.format_span_id(src.span_id), is_remote=src.is_remote, trace_state={k: v for k, v in src.trace_state.items()} if src.trace_state else {}, **extract_extra_fields(src, ["trace_id", "span_id", "is_remote", "trace_state"]), ) class TraceStatus(BaseModel): """Serializable variant of `opentelemetry.trace.Status`.""" status_code: StatusCode """The status code of the span. Same as OpenTelemetry `Status.status_code` type.""" description: Optional[str] = None """The description of the span. Same as OpenTelemetry `Status.description` type.""" model_config = ConfigDict(extra="allow") @classmethod def from_opentelemetry(cls, src: OtelStatus) -> "TraceStatus": """Create a [`TraceStatus`][agentlightning.TraceStatus] from OpenTelemetry metadata.""" return cls( status_code=src.status_code.name, description=src.description, **extract_extra_fields(src, ["status_code", "description"]), ) class Event(BaseModel): """Serializable representation of OpenTelemetry `Event` values.""" name: str """The name of the event.""" attributes: Attributes """Mapping from attribute names to their values. Same as OpenTelemetry `Attributes` type.""" timestamp: Optional[float] = None """The timestamp of the event. Same as OpenTelemetry `Event.timestamp` type.""" model_config = ConfigDict(extra="allow") @classmethod def from_opentelemetry(cls, src: OtelEvent) -> "Event": """Create an [`Event`][agentlightning.Event] from an OpenTelemetry event.""" return cls( name=src.name, attributes=dict(src.attributes) if src.attributes else {}, timestamp=convert_timestamp(src.timestamp), **extract_extra_fields(src, ["name", "attributes", "timestamp"]), ) class Link(BaseModel): """Serializable representation of OpenTelemetry `Link` values.""" context: SpanContext """The context of the link.""" attributes: Optional[Attributes] = None """Optional attributes.""" model_config = ConfigDict(extra="allow") @classmethod def from_opentelemetry(cls, src: trace_api.Link) -> "Link": """Create a [`Link`][agentlightning.Link] from an OpenTelemetry link.""" return cls( context=SpanContext.from_opentelemetry(src.context), attributes=dict(src.attributes) if src.attributes else None, **extract_extra_fields(src, ["context", "attributes"]), ) class OtelResource(BaseModel): """Serializable representation of OpenTelemetry `Resource` values. Named as `OtelResource` to avoid confusion with the [`Resource`][agentlightning.Resource] class. Users will very rarely need to construct this class directly. Most of the times, they deal with the [`Resource`][agentlightning.Resource] class instead, which describes a very different concept. """ attributes: Attributes """Mapping from attribute names to their values. Same as OpenTelemetry `Attributes` type.""" schema_url: str """The schema URL of the resource.""" @classmethod def from_opentelemetry(cls, src: Resource) -> "OtelResource": """Create a [`Resource`][agentlightning.Resource] from an OpenTelemetry resource.""" return cls( attributes=dict(src.attributes) if src.attributes else {}, schema_url=src.schema_url if src.schema_url else "", **extract_extra_fields(src, ["attributes", "schema_url"]), ) class SpanCoreFields(BaseModel): """Core fields of a span. Used by span creators who don't care about the full span model. If the spans are managed by some OTel tracer provider, it's not advised to create spans via this path. """ name: str """The name of the span.""" status: TraceStatus """The status of the span.""" attributes: Attributes """The attributes of the span.""" start_time: Optional[float] """The start time of the span.""" end_time: Optional[float] """The end time of the span.""" class SpanRecordingContext(Protocol): """Context for recording operations on a span. It doesn't have to finalize the span; the caller will do it.""" def record_exception(self, exception: BaseException) -> None: """Record an exception on the span.""" raise NotImplementedError() def record_attributes(self, attributes: Attributes) -> None: """Record attributes on the span.""" raise NotImplementedError() def record_status(self, status_code: StatusCode, description: Optional[str] = None) -> None: """Record the status of the span.""" raise NotImplementedError() def get_recorded_span(self) -> SpanCoreFields: """Get the recording of the span.""" raise NotImplementedError() class Span(BaseModel): """Agent Lightning's canonical span model used for persistence and analytics. The model captures the most relevant fields from `opentelemetry.sdk.trace.ReadableSpan` instances while preserving unmodeled attributes in Pydantic `BaseModel`'s extra storage. This keeps the serialized format stable even as upstream OpenTelemetry types evolve. """ model_config = ConfigDict(extra="allow") rollout_id: str """The rollout which this span belongs to.""" attempt_id: str """The attempt which this span belongs to.""" sequence_id: int """The ID to make spans ordered within a single attempt.""" # Current ID (in hex, formatted via trace_api.format_*) trace_id: str # one rollout can have traces coming from multiple places """The trace ID of the span. One rollout/attempt can have multiple traces. This ID comes from the OpenTelemetry trace ID generator. """ span_id: str """The span ID of the span. This ID comes from the OpenTelemetry span ID generator.""" parent_id: Optional[str] """The parent span ID of the span.""" # Core ReadableSpan fields name: str """The name of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" status: TraceStatus """The status of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" attributes: Attributes """The attributes of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" events: List[Event] """The events of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" links: List[Link] """The links of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" # Timestamps start_time: Optional[float] """The start time of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" end_time: Optional[float] """The end time of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" # Other parsable fields context: Optional[SpanContext] """The context of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" parent: Optional[SpanContext] """The parent context of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" resource: OtelResource """The resource of the span. See [OpenTelemetry docs](https://opentelemetry.io/docs/concepts/signals/traces/).""" # Preserve other fields in the readable span as extra fields # Make sure that are json serializable (so no bytes, complex objects, ...) @classmethod def from_opentelemetry( cls, src: ReadableSpan, rollout_id: str, attempt_id: str, sequence_id: int, ) -> "Span": """Convert an OpenTelemetry span into the Agent Lightning data model. Args: src: Span captured by OpenTelemetry. rollout_id: Identifier for the rollout that produced the span. attempt_id: Identifier of the attempt within the rollout. sequence_id: Monotonically increasing identifier assigned to the span. Returns: Parsed [`Span`][agentlightning.Span] instance suitable for persistence. """ context = src.get_span_context() if context is None: trace_id = span_id = 0 else: trace_id = context.trace_id span_id = context.span_id return cls( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, trace_id=trace_api.format_trace_id(trace_id), span_id=trace_api.format_span_id(span_id), parent_id=(trace_api.format_span_id(src.parent.span_id) if src.parent else None), name=src.name, status=TraceStatus.from_opentelemetry(src.status), attributes=dict(src.attributes) if src.attributes else {}, events=[Event.from_opentelemetry(event) for event in src.events] if src.events else [], links=[Link.from_opentelemetry(link) for link in src.links] if src.links else [], start_time=convert_timestamp(src.start_time), end_time=convert_timestamp(src.end_time), context=SpanContext.from_opentelemetry(context) if context else None, parent=(SpanContext.from_opentelemetry(src.parent) if src.parent else None), resource=OtelResource.from_opentelemetry(src.resource), **extract_extra_fields( src, [ "name", "context", "parent", "resource", "attributes", "events", "links", "start_time", "end_time", "status", "span_processor", "rollout_id", "attempt_id", "trace_id", "span_id", "parent_id", ], ), ) @classmethod def from_attributes( cls, *, attributes: Attributes, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, sequence_id: Optional[int] = None, name: Optional[str] = None, trace_id: Optional[str] = None, span_id: Optional[str] = None, parent_id: Optional[str] = None, start_time: Optional[float] = None, end_time: Optional[float] = None, resource: Optional[OtelResource] = None, status: Optional[TraceStatus] = None, ) -> "Span": """Build a synthetic span from raw attributes. Different from the [`from_opentelemetry`][agentlightning.Span.from_opentelemetry] method, all parameters other than `attributes` are optional and will be generated if not provided. Args: attributes: Span attributes to persist. rollout_id: Optional rollout identifier associated with the span. attempt_id: Optional attempt identifier associated with the span. sequence_id: Optional sequence number to preserve ordering. name: Optional human-readable span name. trace_id: Custom trace identifier. When omitted, a random identifier is generated. span_id: Custom span identifier. When omitted, a random identifier is generated. parent_id: Optional parent span identifier. start_time: Span start timestamp in seconds. end_time: Span end timestamp in seconds. resource: Explicit resource information to attach to the span. status: Optional status of the span. Returns: [`Span`][agentlightning.Span] populated with the provided attributes. """ id_generator = RandomIdGenerator() trace_id = trace_id or trace_api.format_trace_id(id_generator.generate_trace_id()) span_id = span_id or trace_api.format_span_id(id_generator.generate_span_id()) return cls( rollout_id=rollout_id or "", attempt_id=attempt_id or "", sequence_id=sequence_id or 0, trace_id=trace_id, span_id=span_id, parent_id=parent_id, start_time=start_time, end_time=end_time, context=SpanContext( trace_id=trace_id, span_id=span_id, is_remote=False, trace_state={}, ), name=name or AGL_VIRTUAL, resource=resource or OtelResource(attributes={}, schema_url=""), attributes=attributes, status=status or TraceStatus(status_code="OK"), events=[], links=[], parent=( SpanContext( trace_id=trace_id, span_id=parent_id, is_remote=False, trace_state={}, ) if parent_id else None ), ) @classmethod def from_core_fields( cls, core: SpanCoreFields, *, rollout_id: Optional[str] = None, attempt_id: Optional[str] = None, sequence_id: Optional[int] = None, ) -> Span: """Build a span from a core span. Args: core: Core span to build from. rollout_id: Optional rollout identifier associated with the span. attempt_id: Optional attempt identifier associated with the span. sequence_id: Optional sequence number to preserve ordering. Returns: [`Span`][agentlightning.Span] populated with the provided attributes. """ return cls.from_attributes( attributes=core.attributes, rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=sequence_id, name=core.name, start_time=core.start_time or time.time(), end_time=core.end_time, status=core.status, ) class SpanNames(str, Enum): """Enumerated span names recognised by Agent-lightning. Deprecated in favor of [semconv][agentlightning.semconv].""" REWARD = "agentlightning.reward" """The name of the reward span.""" MESSAGE = "agentlightning.message" """The name of the message span.""" OBJECT = "agentlightning.object" """The name of the object span.""" EXCEPTION = "agentlightning.exception" """The name of the exception span.""" VIRTUAL = "agentlightning.virtual" """The name of the virtual span. It represents derived spans without concrete operations.""" ROLLOUT_ID = "agentlightning.rollout_id" """The name of the rollout ID.""" ATTEMPT_ID = "agentlightning.attempt_id" """The name of the attempt ID.""" SPAN_SEQUENCE_ID = "agentlightning.span_sequence_id" """The name of the span sequence ID.""" class SpanAttributeNames(str, Enum): """Canonical attribute names written by Agent Lightning emitters. Deprecated in favor of [semconv][agentlightning.semconv].""" MESSAGE = "message" """The name of the message attribute.""" OBJECT = "object" """The name of the object attribute.""" SpanLike = Union[ReadableSpan, Span] """Union type of OpenTelemetry `ReadableSpan` and Agent-lightning [`Span`][agentlightning.Span].""" ================================================ FILE: agentlightning/utils/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. ================================================ FILE: agentlightning/utils/id.py ================================================ # Copyright (c) Microsoft. All rights reserved. import hashlib import uuid __all__ = ["generate_id"] def generate_id(length: int) -> str: """Generate a random hexadecimal ID of the given length. Args: length: The desired length of the generated ID. Must be a positive integer. Returns: A random hexadecimal ID string of the given length. Raises: ValueError: If length is not a positive integer. """ if length <= 0: raise ValueError("length must be a positive integer") return hashlib.sha1(uuid.uuid4().bytes).hexdigest()[:length] ================================================ FILE: agentlightning/utils/metrics.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Metrics abstraction with explicit registration and several backends. It provides: - MetricsBackend: Abstract interface for registering and recording metrics. - ConsoleMetricsBackend: In-process backend with sliding-window aggregations (rate, P50, P95, P99) logged to stdout. - PrometheusMetricsBackend: Thin wrapper around prometheus_client. - MultiMetricsBackend: Fan-out backend that forwards calls to multiple underlying backends. """ from __future__ import annotations import logging import os import tempfile import time from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Tuple import aiologic if TYPE_CHECKING: from prometheus_client import CollectorRegistry LabelDict = Dict[str, str] # Label metadata LabelKey = Tuple[Tuple[str, str], ...] # normalized (key, value) pairs in registration order logger = logging.getLogger(__name__) def _validate_labels( kind: str, metric_name: str, labels: LabelDict, expected_names: Tuple[str, ...], ) -> LabelKey: """Validates label keys against the metric definition. Args: kind: Metric kind for error messages ("counter" or "histogram"). metric_name: Metric name. labels: Provided label dictionary. expected_names: Expected label names as a tuple. Returns: A tuple of (key, value) pairs honoring the registered label order. Raises: ValueError: If label keys do not match expected_names. """ label_items: List[Tuple[str, str]] = [] for label_name in expected_names: if label_name not in labels: raise ValueError(f"Label '{label_name}' is required for {kind.capitalize()} '{metric_name}'.") label_items.append((label_name, labels[label_name])) return tuple(label_items) def _normalize_label_names(label_names: Optional[Sequence[str]]) -> Tuple[str, ...]: """Normalizes label names into a canonical tuple. Args: label_names: Iterable of label names or None. Returns: A tuple of label names preserving their original order. """ if not label_names: return () return tuple(label_names) def _normalize_prometheus_metric_name(metric_name: str) -> str: """Normalizes Prometheus metric names by replacing unsupported characters.""" return metric_name.replace(".", "_") @dataclass(frozen=True) class _CounterDef: """Definition of a registered counter metric.""" name: str label_names: Tuple[str, ...] group_level: Optional[int] = None @dataclass(frozen=True) class _HistogramDef: """Definition of a registered histogram metric.""" name: str label_names: Tuple[str, ...] buckets: Tuple[float, ...] group_level: Optional[int] = None @dataclass class _CounterState: """Runtime state of a counter metric group (for console backend).""" timestamps: List[float] amounts: List[float] @dataclass class _HistogramState: """Runtime state of a histogram metric group (for console backend).""" timestamps: List[float] values: List[float] class MetricsBackend: """Abstract base class for metrics backends.""" def has_prometheus(self) -> bool: """Check if the backend has prometheus support.""" return False def register_counter( self, name: str, label_names: Optional[Sequence[str]] = None, group_level: Optional[int] = None, ) -> None: """Registers a counter metric. Args: name: Metric name. label_names: List of label names. Order determines the truncation priority for group-level logging. group_level: Optional per-metric grouping depth for backends that support label grouping (Console). Global backend settings take precedence when provided. Raises: ValueError: If the metric is already registered with a different type or label set. """ raise NotImplementedError() def register_histogram( self, name: str, label_names: Optional[Sequence[str]] = None, buckets: Optional[Sequence[float]] = None, group_level: Optional[int] = None, ) -> None: """Registers a histogram metric. Args: name: Metric name. label_names: List of label names. Order determines the truncation priority for group-level logging. buckets: Bucket boundaries (exclusive upper bounds). If None, the backend may choose defaults. group_level: Optional per-metric grouping depth for backends that support label grouping (Console). Global backend settings take precedence when provided. Raises: ValueError: If the metric is already registered with a different type or label set. """ raise NotImplementedError() async def inc_counter( self, name: str, amount: float = 1.0, labels: Optional[LabelDict] = None, ) -> None: """Increments a registered counter. Args: name: Metric name (must be registered as a counter). amount: Increment amount. labels: Label values. Raises: ValueError: If the metric is not registered, has the wrong type, or label keys do not match the registered label names. """ raise NotImplementedError() async def observe_histogram( self, name: str, value: float, labels: Optional[LabelDict] = None, ) -> None: """Records an observation for a registered histogram. Args: name: Metric name (must be registered as a histogram). value: Observed value. labels: Label values. Raises: ValueError: If the metric is not registered, has the wrong type, or label keys do not match the registered label names. """ raise NotImplementedError() class ConsoleMetricsBackend(MetricsBackend): """Console backend with sliding-window aggregations and label grouping. This backend: * Requires explicit metric registration. * Stores timestamped events per (metric_name, labels) key. * Computes rate and percentiles (P50, P95, P99) over a sliding time window. * Uses a single global logging decision: when logging is triggered, it logs all metric groups, not just the one being updated. Rate is always per second. Label grouping: When logging, label dictionaries are truncated to the first `group_level` label pairs (following the registered label order) and metrics with identical truncated labels are aggregated together. For example: ```python labels = {"method": "GET", "path": "/", "status": "200"} group_level = 2 # aggregated labels {"method": "GET", "path": "/"} ``` If `group_level` is None or < 1, all label combinations for a metric are merged into a single log entry (equivalent to grouping by zero labels). Individual counters or histograms can set their own `group_level` during registration; those values apply only when the backend-level `group_level` is unset, allowing selective overrides. Thread-safety: Runtime updates and snapshotting use two aiologic locks: one for mutating shared state and another that serializes the global logging decision/snapshot capture so other tasks can continue writing. Metric registration happens during initialization, so it is intentionally left lock-free; this assumption is documented here to avoid blocking writes unnecessarily. """ def __init__( self, window_seconds: Optional[float] = 60.0, log_interval_seconds: float = 10.0, group_level: Optional[int] = None, ) -> None: """Initializes ConsoleMetricsBackend. Args: window_seconds: Sliding window size (in seconds) used when computing rate and percentiles. If None, all in-memory events are used. log_interval_seconds: Minimum time (in seconds) between log bursts. When the interval elapses, the next metric event triggers a snapshot and logging of all metrics. group_level: Label grouping depth. When logging, only the first `group_level` labels (following registered order) are retained and metric events sharing those labels are aggregated. If None or < 1, all label combinations collapse into a single group per metric. """ self.window_seconds = window_seconds self.log_interval_seconds = log_interval_seconds self.group_level = group_level self._counters: Dict[str, _CounterDef] = {} self._histograms: Dict[str, _HistogramDef] = {} # Runtime state keyed by (metric_name, label_key) self._counter_state: Dict[Tuple[str, LabelKey], _CounterState] = {} self._hist_state: Dict[Tuple[str, LabelKey], _HistogramState] = {} # Global last log time (for all metrics) self._last_log_time: Optional[float] = None self._write_lock = aiologic.Lock() self._snapshot_lock = aiologic.Lock() def register_counter( self, name: str, label_names: Optional[Sequence[str]] = None, group_level: Optional[int] = None, ) -> None: """Registers a counter metric. See base class for argument documentation. """ label_tuple = _normalize_label_names(label_names) existing_counter = self._counters.get(name) existing_hist = self._histograms.get(name) if existing_hist is not None: raise ValueError(f"Metric '{name}' already registered as histogram.") if existing_counter is not None: if existing_counter.label_names != label_tuple: raise ValueError( f"Counter '{name}' already registered with labels " f"{existing_counter.label_names}, got {label_tuple}." ) return self._counters[name] = _CounterDef(name=name, label_names=label_tuple, group_level=group_level) def register_histogram( self, name: str, label_names: Optional[Sequence[str]] = None, buckets: Optional[Sequence[float]] = None, group_level: Optional[int] = None, ) -> None: """Registers a histogram metric. See base class for argument documentation. """ label_tuple = _normalize_label_names(label_names) if buckets is None: bucket_tuple: Tuple[float, ...] = (0.1, 0.2, 0.5, 1.0, 2.0) else: bucket_tuple = tuple(buckets) existing_counter = self._counters.get(name) existing_hist = self._histograms.get(name) if existing_counter is not None: raise ValueError(f"Metric '{name}' already registered as counter.") if existing_hist is not None: if existing_hist.label_names != label_tuple or existing_hist.buckets != bucket_tuple: raise ValueError( f"Histogram '{name}' already registered with " f"labels={existing_hist.label_names}, " f"buckets={existing_hist.buckets}." ) return self._histograms[name] = _HistogramDef( name=name, label_names=label_tuple, buckets=bucket_tuple, group_level=group_level, ) async def inc_counter( self, name: str, amount: float = 1.0, labels: Optional[LabelDict] = None, ) -> None: """Increments a registered counter metric. See base class for behavior and error conditions. """ now = time.time() labels = labels or {} definition = self._counters.get(name) if definition is None: raise ValueError(f"Counter '{name}' is not registered.") label_key = _validate_labels("counter", name, labels, definition.label_names) state_key = (name, label_key) async with self._write_lock: state = self._counter_state.get(state_key) if state is None: state = _CounterState(timestamps=[], amounts=[]) self._counter_state[state_key] = state state.timestamps.append(now) state.amounts.append(amount) self._prune_events(state.timestamps, state.amounts, now) counter_snaps: List[Tuple[str, LabelDict, List[float], List[float]]] = [] hist_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]] = [] should_log = False snapshot_time = now async with self._snapshot_lock: should_log = self._should_log_locked(now) if should_log: async with self._write_lock: counter_snaps, hist_snaps = self._snapshot_locked(now) self._log_snapshot(counter_snaps, hist_snaps, snapshot_time) async def observe_histogram( self, name: str, value: float, labels: Optional[LabelDict] = None, ) -> None: """Records an observation for a registered histogram metric. See base class for behavior and error conditions. """ now = time.time() labels = labels or {} definition = self._histograms.get(name) if definition is None: raise ValueError(f"Histogram '{name}' is not registered.") label_key = _validate_labels("histogram", name, labels, definition.label_names) state_key = (name, label_key) async with self._write_lock: state = self._hist_state.get(state_key) if state is None: state = _HistogramState(timestamps=[], values=[]) self._hist_state[state_key] = state state.timestamps.append(now) state.values.append(value) self._prune_events(state.timestamps, state.values, now) counter_snaps: List[Tuple[str, LabelDict, List[float], List[float]]] = [] hist_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]] = [] should_log = False snapshot_time = now async with self._snapshot_lock: should_log = self._should_log_locked(now) if should_log: async with self._write_lock: counter_snaps, hist_snaps = self._snapshot_locked(now) self._log_snapshot(counter_snaps, hist_snaps, snapshot_time) def _prune_events( self, timestamps: List[float], values: List[float], now: float, ) -> None: """Prunes events older than the sliding window. Args: timestamps: List of event timestamps (ascending). values: List of corresponding values or amounts. now: Current time. """ if self.window_seconds is None or not timestamps: return cutoff = now - self.window_seconds idx = 0 for i, ts in enumerate(timestamps): if ts >= cutoff: idx = i break else: idx = len(timestamps) if idx > 0: del timestamps[:idx] del values[:idx] def _should_log_locked(self, now: float) -> bool: """Determines whether to emit a log snapshot (lock must be held). This decision is global: if it returns True, all metrics will be logged based on a snapshot taken at this time. Args: now: Current timestamp. Returns: True if enough time has elapsed since the last log; False otherwise. """ last = self._last_log_time if last is None or now - last >= self.log_interval_seconds: self._last_log_time = now return True return False def _snapshot_locked( self, now: float, ) -> Tuple[ List[Tuple[str, LabelDict, List[float], List[float]]], List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]], ]: """Creates a snapshot of all metric state (lock must be held). Args: now: Current timestamp. Returns: A tuple (counter_snapshots, histogram_snapshots) where: - counter_snapshots: list of (metric_name, labels, timestamps, amounts) - histogram_snapshots: list of (metric_name, labels, values, buckets) """ counter_snaps: List[Tuple[str, LabelDict, List[float], List[float]]] = [] hist_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]] = [] # Prune and snapshot counters. for (name, label_key), state in self._counter_state.items(): self._prune_events(state.timestamps, state.amounts, now) if not state.timestamps: continue labels = dict(label_key) counter_snaps.append( ( name, labels, list(state.timestamps), list(state.amounts), ) ) # Prune and snapshot histograms. for (name, label_key), state in self._hist_state.items(): self._prune_events(state.timestamps, state.values, now) if not state.values: continue labels = dict(label_key) buckets = self._histograms[name].buckets hist_snaps.append( ( name, labels, list(state.values), buckets, ) ) return counter_snaps, hist_snaps def _truncate_labels_for_logging(self, labels: LabelDict, group_level: Optional[int]) -> LabelDict: """Returns a label dict truncated to the configured group depth. Args: labels: Original label dictionary. group_level: Effective grouping depth for this metric. Returns: A new dictionary containing at most `group_level` label pairs, chosen by registered label order. If group_level is None or < 1, returns an empty dict so that all label combinations collapse together. """ if group_level is None or group_level < 1: return {} items = list(labels.items()) return dict(items[:group_level]) def _log(self, message: str) -> None: """Logs a message via the module logger.""" logger.info(message) def _log_snapshot( self, counter_snaps: List[Tuple[str, LabelDict, List[float], List[float]]], hist_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]], snapshot_time: float, ) -> None: """Logs all metrics from a snapshot. Args: counter_snaps: Counter snapshot list. hist_snaps: Histogram snapshot list. """ entries: List[str] = [] for name, labels, timestamps, amounts in self._group_counter_snapshots(counter_snaps): line = self._log_counter(name, labels, timestamps, amounts, snapshot_time) if line: entries.append(line) for name, labels, values, buckets in self._group_histogram_snapshots(hist_snaps): line = self._log_histogram(name, labels, values, buckets, snapshot_time) if line: entries.append(line) if entries: entries.sort() self._log(" ".join(entries)) def _effective_group_level(self, metric_name: str, *, is_histogram: bool) -> Optional[int]: """Returns the active group level for a metric, honoring per-metric overrides.""" if self.group_level is not None: return self.group_level if is_histogram: definition = self._histograms.get(metric_name) else: definition = self._counters.get(metric_name) if definition is None: return None return definition.group_level def _group_counter_snapshots( self, counter_snaps: List[Tuple[str, LabelDict, List[float], List[float]]], ) -> List[Tuple[str, LabelDict, List[float], List[float]]]: grouped: Dict[Tuple[str, Tuple[Tuple[str, str], ...]], Dict[str, Any]] = {} for name, labels, timestamps, amounts in counter_snaps: group_level = self._effective_group_level(name, is_histogram=False) truncated_labels = self._truncate_labels_for_logging(labels, group_level) key = (name, tuple(truncated_labels.items())) entry = grouped.setdefault( key, {"name": name, "labels": truncated_labels, "timestamps": [], "amounts": []}, ) entry["timestamps"].extend(timestamps) entry["amounts"].extend(amounts) grouped_snaps: List[Tuple[str, LabelDict, List[float], List[float]]] = [] for entry in grouped.values(): timestamps = entry["timestamps"] amounts = entry["amounts"] if not timestamps: continue combined = sorted(zip(timestamps, amounts), key=lambda item: item[0]) ordered_timestamps = [ts for ts, _ in combined] ordered_amounts = [amt for _, amt in combined] grouped_snaps.append( ( entry["name"], entry["labels"], ordered_timestamps, ordered_amounts, ) ) return grouped_snaps def _group_histogram_snapshots( self, hist_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]], ) -> List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]]: grouped: Dict[Tuple[str, Tuple[Tuple[str, str], ...]], Dict[str, Any]] = {} for name, labels, values, buckets in hist_snaps: group_level = self._effective_group_level(name, is_histogram=True) truncated_labels = self._truncate_labels_for_logging(labels, group_level) key = (name, tuple(truncated_labels.items())) entry = grouped.setdefault( key, {"name": name, "labels": truncated_labels, "values": [], "buckets": buckets}, ) if entry["buckets"] != buckets: raise ValueError(f"Histogram buckets mismatch for metric '{name}'.") entry["values"].extend(values) grouped_snaps: List[Tuple[str, LabelDict, List[float], Tuple[float, ...]]] = [] for entry in grouped.values(): values = entry["values"] if not values: continue grouped_snaps.append( ( entry["name"], entry["labels"], list(values), entry["buckets"], ) ) return grouped_snaps def _log_counter( self, name: str, labels: LabelDict, timestamps: List[float], amounts: List[float], snapshot_time: float, ) -> Optional[str]: """Computes counter stats and returns formatted line.""" if not timestamps: return None total = sum(amounts) window_start = timestamps[0] if self.window_seconds is not None: window_start = max(window_start, snapshot_time - self.window_seconds) min_duration = self.log_interval_seconds if self.log_interval_seconds > 0 else 1e-3 duration = max(snapshot_time - window_start, min_duration) rate = total / duration label_str = _format_label_string(labels) return f"{name}{label_str}={rate:.2f}/s" def _log_histogram( self, name: str, labels: LabelDict, values: List[float], buckets: Tuple[float, ...], snapshot_time: float, ) -> Optional[str]: """Computes histogram stats and returns formatted line.""" if not values: return None sorted_vals = sorted(values) n = len(sorted_vals) def percentile(p: float) -> float: if n == 1: return sorted_vals[0] pos = (p / 100.0) * (n - 1) lo = int(pos) hi = min(lo + 1, n - 1) if lo == hi: return sorted_vals[lo] w = pos - lo return sorted_vals[lo] * (1 - w) + sorted_vals[hi] * w p50 = percentile(50.0) p95 = percentile(95.0) p99 = percentile(99.0) label_str = _format_label_string(labels) formatted = ",".join([_format_duration(p50), _format_duration(p95), _format_duration(p99)]) return f"{name}{label_str}={formatted}" def _format_label_string(labels: LabelDict) -> str: if not labels: return "" ordered = ",".join(f"{key}={value}" for key, value in labels.items()) return f"{{{ordered}}}" def _format_duration(value: float) -> str: abs_value = abs(value) if abs_value >= 1.0: return f"{value:.2f}s" if abs_value >= 1e-3: return f"{value * 1_000:.2f}ms" if abs_value >= 1e-6: return f"{value * 1_000_000:.2f}µs" return f"{value * 1_000_000_000:.2f}ns" class PrometheusMetricsBackend(MetricsBackend): """Metrics backend that forwards events to prometheus_client. All metrics must be registered before use. This backend does not compute any aggregations; it only updates Prometheus metrics. Thread-safety: Registration is protected by a lock. Metric updates assume metrics are registered during initialization and then remain stable. Due to the nature of Prometheus, this backend is only suitable for recording high-volume metrics. Low-volume metrics might be lost if the event has only appeared once. """ def __init__(self) -> None: """Initializes PrometheusMetricsBackend. Raises: ImportError: If prometheus_client is not installed. """ try: import prometheus_client # type: ignore except ImportError: raise ImportError( "prometheus_client is not installed. Please either install it or use ConsoleMetricsBackend instead." ) self._counters: Dict[str, _CounterDef] = {} self._histograms: Dict[str, _HistogramDef] = {} self._prom_counters: Dict[str, Any] = {} self._prom_histograms: Dict[str, Any] = {} self._prom_metric_names: Dict[str, str] = {} def has_prometheus(self) -> bool: """Check if the backend has prometheus support.""" return True def register_counter( self, name: str, label_names: Optional[Sequence[str]] = None, group_level: Optional[int] = None, ) -> None: """Registers a Prometheus counter metric.""" from prometheus_client import Counter as PromCounter label_tuple = _normalize_label_names(label_names) if name in self._histograms: raise ValueError(f"Metric '{name}' already registered as histogram.") existing = self._counters.get(name) if existing is not None: if existing.label_names != label_tuple: raise ValueError( f"Counter '{name}' already registered with labels " f"{existing.label_names}, got {label_tuple}." ) return prom_name = self._register_prometheus_metric_name(name) self._counters[name] = _CounterDef(name=name, label_names=label_tuple, group_level=group_level) prom_counter = PromCounter( prom_name, f"Counter {name}", labelnames=label_tuple, ) self._prom_counters[name] = prom_counter def register_histogram( self, name: str, label_names: Optional[Sequence[str]] = None, buckets: Optional[Sequence[float]] = None, group_level: Optional[int] = None, ) -> None: """Registers a Prometheus histogram metric.""" from prometheus_client import Histogram as PromHistogram label_tuple = _normalize_label_names(label_names) bucket_tuple = tuple(buckets) if buckets is not None else () if name in self._counters: raise ValueError(f"Metric '{name}' already registered as counter.") existing = self._histograms.get(name) if existing is not None: if existing.label_names != label_tuple or existing.buckets != bucket_tuple: raise ValueError( f"Histogram '{name}' already registered with " f"labels={existing.label_names}, " f"buckets={existing.buckets}." ) return prom_name = self._register_prometheus_metric_name(name) self._histograms[name] = _HistogramDef( name=name, label_names=label_tuple, buckets=bucket_tuple, group_level=group_level, ) if bucket_tuple: prom_hist = PromHistogram( prom_name, f"Histogram {name}", labelnames=label_tuple, buckets=bucket_tuple, ) else: prom_hist = PromHistogram( prom_name, f"Histogram {name}", labelnames=label_tuple, ) self._prom_histograms[name] = prom_hist async def inc_counter( self, name: str, amount: float = 1.0, labels: Optional[LabelDict] = None, ) -> None: """Increments a registered Prometheus counter.""" labels = labels or {} definition = self._counters.get(name) if definition is None: raise ValueError(f"Counter '{name}' is not registered.") prom_counter = self._prom_counters[name] if definition.label_names: label_key = _validate_labels("counter", name, labels, definition.label_names) prom_counter.labels(**dict(label_key)).inc(amount) else: prom_counter.inc(amount) async def observe_histogram( self, name: str, value: float, labels: Optional[LabelDict] = None, ) -> None: """Records an observation for a registered Prometheus histogram.""" labels = labels or {} definition = self._histograms.get(name) if definition is None: raise ValueError(f"Histogram '{name}' is not registered.") prom_hist = self._prom_histograms[name] if definition.label_names: label_key = _validate_labels("histogram", name, labels, definition.label_names) prom_hist.labels(**dict(label_key)).observe(value) else: prom_hist.observe(value) def _register_prometheus_metric_name(self, name: str) -> str: """Registers the normalized Prometheus metric name and ensures uniqueness.""" normalized = _normalize_prometheus_metric_name(name) existing = self._prom_metric_names.get(normalized) if existing is not None and existing != name: raise ValueError( f"Prometheus metric name conflict: '{name}' normalizes to '{normalized}', " f"which is already used by '{existing}'. Consider renaming one of the metrics." ) self._prom_metric_names.setdefault(normalized, name) return normalized class MultiMetricsBackend(MetricsBackend): """Metrics backend that forwards calls to multiple underlying backends.""" def __init__(self, backends: Sequence[MetricsBackend]) -> None: """Initializes MultiMetricsBackend. Args: backends: Sequence of underlying backends. Raises: ValueError: If no backends are provided. """ if not backends: raise ValueError("MultiMetricsBackend requires at least one backend.") self._backends = list(backends) def has_prometheus(self) -> bool: """Check if the backend has prometheus support.""" return any(backend.has_prometheus() for backend in self._backends) def register_counter( self, name: str, label_names: Optional[Sequence[str]] = None, group_level: Optional[int] = None, ) -> None: """Registers a counter metric in all underlying backends.""" for backend in self._backends: backend.register_counter(name, label_names=label_names, group_level=group_level) def register_histogram( self, name: str, label_names: Optional[Sequence[str]] = None, buckets: Optional[Sequence[float]] = None, group_level: Optional[int] = None, ) -> None: """Registers a histogram metric in all underlying backends.""" for backend in self._backends: backend.register_histogram( name, label_names=label_names, buckets=buckets, group_level=group_level, ) async def inc_counter( self, name: str, amount: float = 1.0, labels: Optional[LabelDict] = None, ) -> None: """Increments a counter metric in all underlying backends.""" for backend in self._backends: await backend.inc_counter(name, amount=amount, labels=labels) async def observe_histogram( self, name: str, value: float, labels: Optional[LabelDict] = None, ) -> None: """Records a histogram observation in all underlying backends.""" for backend in self._backends: await backend.observe_histogram(name, value=value, labels=labels) # This variable should be carried into forked processes _prometheus_multiproc_dir: tempfile.TemporaryDirectory[str] | None = None def setup_multiprocess_prometheus(): """Set up prometheus multiprocessing directory if not already configured.""" global _prometheus_multiproc_dir if "PROMETHEUS_MULTIPROC_DIR" not in os.environ: # Make TemporaryDirectory for prometheus multiprocessing # Note: global TemporaryDirectory will be automatically # cleaned up upon exit. _prometheus_multiproc_dir = tempfile.TemporaryDirectory() os.environ["PROMETHEUS_MULTIPROC_DIR"] = _prometheus_multiproc_dir.name logger.debug("Created PROMETHEUS_MULTIPROC_DIR at %s", _prometheus_multiproc_dir.name) else: logger.warning( "Found PROMETHEUS_MULTIPROC_DIR was set by user. This directory must be wiped between multiple runs." ) def get_prometheus_registry() -> CollectorRegistry: """Get the appropriate prometheus registry based on multiprocessing configuration.""" from prometheus_client import REGISTRY, CollectorRegistry, multiprocess if os.getenv("PROMETHEUS_MULTIPROC_DIR") is not None: logger.info("Using multiprocess registry for prometheus metrics: %s", os.getenv("PROMETHEUS_MULTIPROC_DIR")) registry = CollectorRegistry() multiprocess.MultiProcessCollector(registry) return registry return REGISTRY def shutdown_metrics(server: Any = None, worker: Any = None, *args: Any, **kwargs: Any) -> None: """Shutdown prometheus metrics.""" if _prometheus_multiproc_dir is not None: from prometheus_client import multiprocess path = _prometheus_multiproc_dir try: if hasattr(worker, "pid"): pid = worker.pid else: pid = os.getpid() multiprocess.mark_process_dead(pid, path.name) # type: ignore logger.debug("Marked Prometheus metrics for process %d as dead", pid) except Exception as e: logger.error("Error during metrics cleanup: %s", str(e)) ================================================ FILE: agentlightning/utils/otel.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Utilities shared for OpenTelemetry span (attributes) support.""" import json import logging import traceback from typing import Any, Dict, List, Sequence, Type, TypeVar, Union, cast from warnings import filterwarnings import opentelemetry.trace as trace_api from agentops.sdk.exporters import OTLPSpanExporter from opentelemetry.sdk.trace import ReadableSpan, SpanLimits, SpanProcessor, SynchronousMultiSpanProcessor, Tracer from opentelemetry.sdk.trace import TracerProvider as TracerProviderImpl from opentelemetry.sdk.trace.export import BatchSpanProcessor, SimpleSpanProcessor from opentelemetry.sdk.util.instrumentation import InstrumentationInfo, InstrumentationScope from opentelemetry.semconv.attributes import exception_attributes from opentelemetry.trace import get_tracer_provider as otel_get_tracer_provider from pydantic import TypeAdapter from agentlightning.env_var import LightningEnvVar, resolve_bool_env_var from agentlightning.semconv import LightningSpanAttributes, LinkAttributes, LinkPydanticModel from agentlightning.types import Attributes, AttributeValue, SpanLike from agentlightning.utils.otlp import LightningStoreOTLPExporter logger = logging.getLogger(__name__) __all__ = [ "full_qualified_name", "get_tracer_provider", "get_tracer", "make_tag_attributes", "extract_tags_from_attributes", "make_link_attributes", "query_linked_spans", "extract_links_from_attributes", "filter_attributes", "filter_and_unflatten_attributes", "flatten_attributes", "unflatten_attributes", "sanitize_attribute_value", "sanitize_attributes", "sanitize_list_attribute_sanity", "check_attributes_sanity", "format_exception_attributes", ] T_SpanLike = TypeVar("T_SpanLike", bound=SpanLike) T_SpanProcessor = TypeVar("T_SpanProcessor", bound=SpanProcessor) def full_qualified_name(obj: type) -> str: if str(obj.__module__) == "builtins": return obj.__qualname__ return f"{obj.__module__}.{obj.__qualname__}" def get_tracer_provider(inspect: bool = True) -> TracerProviderImpl: """Get the OpenTelemetry tracer provider configured for Agent Lightning. Args: inspect: Whether to inspect the tracer provider and log its configuration. When it's on, make sure you also set the logger level to DEBUG to see the logs. """ from agentlightning.tracer.otel import LightningSpanProcessor if hasattr(trace_api, "_TRACER_PROVIDER") and trace_api._TRACER_PROVIDER is None: # type: ignore[attr-defined] raise RuntimeError("Tracer is not initialized. Cannot emit a meaningful span.") tracer_provider = otel_get_tracer_provider() if not isinstance(tracer_provider, TracerProviderImpl): logger.error( "Tracer provider is expected to be an instance of opentelemetry.sdk.trace.TracerProvider, found: %s", full_qualified_name(type(tracer_provider)), ) return cast(TracerProviderImpl, tracer_provider) if not inspect: return tracer_provider emitter_debug = resolve_bool_env_var(LightningEnvVar.AGL_EMITTER_DEBUG, fallback=None) logger_effective_level = logger.getEffectiveLevel() if emitter_debug is True and logger_effective_level > logging.DEBUG: logger.warning( "Emitter debug logging is enabled but logging level is not set to DEBUG. Nothing will be logged." ) if emitter_debug is None: # Set to true by default if the logging level is lower than DEBUG emitter_debug = logging.DEBUG >= logger_effective_level if emitter_debug: active_span_processor = tracer_provider._active_span_processor # pyright: ignore[reportPrivateUsage] processors: List[str] = [] active_span_processor_cls = active_span_processor.__class__.__name__ for processor in active_span_processor._span_processors: # pyright: ignore[reportPrivateUsage] if isinstance(processor, LightningSpanProcessor): # The legacy case for tracers without OTLP support. processors.append(f"{active_span_processor_cls} - {processor!r}") elif isinstance(processor, (SimpleSpanProcessor, BatchSpanProcessor)): processor_cls = processor.__class__.__name__ if isinstance(processor.span_exporter, LightningStoreOTLPExporter): # This should be the main path now. processors.append(f"{active_span_processor_cls} - {processor_cls} - {processor.span_exporter!r}") elif isinstance(processor.span_exporter, OTLPSpanExporter): # You need to be careful if the code goes into this path. endpoint = processor.span_exporter._endpoint # pyright: ignore[reportPrivateUsage] processors.append( f"{active_span_processor_cls} - {processor_cls} - " f"{processor.span_exporter.__class__.__name__}(endpoint={endpoint!r})" ) else: # Other cases like Console Span Exporter. processors.append( f"{active_span_processor_cls} - {processor_cls} - {processor.span_exporter.__class__.__name__}" ) else: processors.append(f"{active_span_processor_cls} - {processor.__class__.__name__}") logger.debug(f"Tracer provider: {tracer_provider!r}. Active span processors:") for processor in processors: logger.debug(" * " + processor) return tracer_provider def get_span_processors( tracer_provider: TracerProviderImpl, expected_type: Type[T_SpanProcessor] ) -> List[T_SpanProcessor]: """Get the span processors from the tracer provider. Args: tracer_provider: The tracer provider to get the span processors from. expected_type: The type of the span processors to get. Returns: A list of span processors of the expected type. """ processors: List[T_SpanProcessor] = [] for processor in tracer_provider._active_span_processor._span_processors: # pyright: ignore[reportPrivateUsage] if isinstance(processor, expected_type): processors.append(processor) return processors def get_tracer(use_active_span_processor: bool = True) -> trace_api.Tracer: """Resolve the OpenTelemetry tracer configured for Agent Lightning. Args: use_active_span_processor: Whether to use the active span processor. Returns: OpenTelemetry tracer tagged with the `agentlightning` instrumentation name. Raises: RuntimeError: If OpenTelemetry was not initialized before calling this helper. """ if hasattr(trace_api, "_TRACER_PROVIDER") and trace_api._TRACER_PROVIDER is None: # type: ignore[attr-defined] raise RuntimeError("Tracer is not initialized. Cannot emit a meaningful span.") tracer_provider = get_tracer_provider(inspect=True) # inspection is on by default if use_active_span_processor: return tracer_provider.get_tracer("agentlightning") else: filterwarnings( "ignore", message=r"You should use InstrumentationScope. Deprecated since version 1.11.1.", category=DeprecationWarning, module="opentelemetry.sdk.trace", ) return Tracer( tracer_provider.sampler, tracer_provider.resource, # We use an empty span processor to avoid emitting spans to the tracer SynchronousMultiSpanProcessor(), tracer_provider.id_generator, InstrumentationInfo("agentlightning", "", ""), # type: ignore SpanLimits(), InstrumentationScope( "agentlightning", "", "", {}, ), ) def make_tag_attributes(tags: List[str]) -> Dict[str, Any]: """Convert a list of tags into flattened attributes for span tagging. There is no syntax enforced for tags, they are just strings. For example: ```python ["gen_ai.model:gpt-4", "reward.extrinsic"] ``` """ return flatten_attributes({LightningSpanAttributes.TAG.value: tags}, expand_leaf_lists=True) def extract_tags_from_attributes(attributes: Dict[str, Any]) -> List[str]: """Extract tag attributes from flattened span attributes. Args: attributes: A dictionary of flattened span attributes. """ maybe_tag_list = filter_and_unflatten_attributes(attributes, LightningSpanAttributes.TAG.value) return TypeAdapter(List[str]).validate_python(maybe_tag_list) def make_link_attributes(links: Dict[str, str]) -> Dict[str, Any]: """Convert a dictionary of links into flattened attributes for span linking. Links example: ```python { "gen_ai.response.id": "response-123", "span_id": "abcd-efgh-ijkl", } ``` """ link_list: List[Dict[str, str]] = [] for key, value in links.items(): if not isinstance(value, str): # pyright: ignore[reportUnnecessaryIsInstance] raise ValueError(f"Link value must be a string, got {type(value)} for key '{key}'") link_list.append({LinkAttributes.KEY_MATCH.value: key, LinkAttributes.VALUE_MATCH.value: value}) return flatten_attributes({LightningSpanAttributes.LINK.value: link_list}, expand_leaf_lists=True) def query_linked_spans(spans: Sequence[T_SpanLike], links: List[LinkPydanticModel]) -> List[T_SpanLike]: """Query spans that are linked by the given link attributes. Args: spans: A sequence of spans to search. links: A list of link attributes to match. Returns: A list of spans that match the given link attributes. """ matched_spans: List[T_SpanLike] = [] for span in spans: span_attributes = span.attributes or {} is_match = True for link in links: # trace_id and span_id must be full match. if link.key_match == "trace_id": if isinstance(span, ReadableSpan): trace_id = trace_api.format_trace_id(span.context.trace_id) if span.context else None else: trace_id = span.trace_id if trace_id != link.value_match: is_match = False break elif link.key_match == "span_id": if isinstance(span, ReadableSpan): span_id = trace_api.format_span_id(span.context.span_id) if span.context else None else: span_id = span.span_id if span_id != link.value_match: is_match = False break else: attribute = span_attributes.get(link.key_match) # attributes must also be a full match currently. if attribute != link.value_match: is_match = False break if is_match: matched_spans.append(span) return matched_spans def extract_links_from_attributes(attributes: Dict[str, Any]) -> List[LinkPydanticModel]: """Extract link attributes from flattened span attributes. Args: attributes: A dictionary of flattened span attributes. """ maybe_link_list = filter_and_unflatten_attributes(attributes, LightningSpanAttributes.LINK.value) return TypeAdapter(List[LinkPydanticModel]).validate_python(maybe_link_list) def filter_attributes(attributes: Dict[str, Any], prefix: str) -> Dict[str, Any]: """Filter attributes that start with the given prefix. The attribute must start with `prefix.` or be exactly `prefix` to be included. Args: attributes: A dictionary of span attributes. prefix: The prefix to filter by. Returns: A dictionary of attributes that start with the given prefix. """ return {k: v for k, v in attributes.items() if k.startswith(prefix + ".") or k == prefix} def filter_and_unflatten_attributes(attributes: Dict[str, Any], prefix: str) -> Union[Dict[str, Any], List[Any]]: """Filter attributes that start with the given prefix and unflatten them. The prefix will be removed during unflattening. Args: attributes: A dictionary of span attributes. prefix: The prefix to filter by. Returns: A nested dictionary or list of attributes that start with the given prefix. """ filtered_attributes = filter_attributes(attributes, prefix) stripped_attributes: Dict[str, Any] = {} for k, v in filtered_attributes.items(): if k == prefix: raise ValueError(f"Cannot unflatten attribute with key exactly equal to prefix: {prefix}") else: stripped_key = k[len(prefix) + 1 :] # +1 to remove the dot stripped_attributes[stripped_key] = v return unflatten_attributes(stripped_attributes) def flatten_attributes( nested_data: Union[Dict[str, Any], List[Any]], *, expand_leaf_lists: bool = False ) -> Dict[str, Any]: """Flatten a nested dictionary or list into a flat dictionary with dotted keys. This function recursively traverses dictionaries and lists, producing a flat key-value mapping where nested paths are represented via dot-separated keys. Lists are indexed numerically. Example: >>> flatten_attributes({"a": {"b": 1, "c": [2, 3]}}, expand_leaf_lists=True) {"a.b": 1, "a.c.0": 2, "a.c.1": 3} Args: nested_data: A nested structure composed of dictionaries, lists, or primitive values. expand_leaf_lists: Whether to expand lists composed only of primitive values. When `False` (the default), lists of str/int/float/bool are treated as leaf values and stored without enumerating their indices. Returns: A flat dictionary mapping dotted-string paths to primitive values. """ flat: Dict[str, Any] = {} def _primitive_type(value: Any) -> Union[type[str], type[int], type[float], type[bool]]: if isinstance(value, bool): return bool if isinstance(value, int): return int if isinstance(value, float): return float return str def _walk(value: Any, prefix: str = "") -> None: if isinstance(value, dict): for k, v in cast(Dict[Any, Any], value).items(): if not isinstance(k, str): raise ValueError( f"Only string keys are supported in dictionaries, got '{k}' of type {type(k)} in {prefix}" ) new_prefix = f"{prefix}.{k}" if prefix else k _walk(v, new_prefix) elif isinstance(value, list): maybe_list = cast(List[Any], value) is_leaf_candidate = bool(maybe_list) and all( isinstance(item, (str, int, float, bool)) for item in maybe_list ) if not expand_leaf_lists and is_leaf_candidate and prefix: primitive_types = {_primitive_type(item) for item in maybe_list} if len(primitive_types) == 1: flat[prefix] = maybe_list return logger.warning( "List attribute '%s' contains mixed primitive types %s; expanding indexed keys instead.", prefix, primitive_types, ) for idx, item in enumerate(maybe_list): new_prefix = f"{prefix}.{idx}" if prefix else str(idx) _walk(item, new_prefix) else: flat[prefix] = value _walk(nested_data) return flat def unflatten_attributes(flat_data: Dict[str, Any]) -> Union[Dict[str, Any], List[Any]]: """Reconstruct a nested dictionary/list structure from a flat dictionary. Keys are dot-separated paths. Segments that are digit strings will only become list indices if *all* keys in that dict form a consecutive 0..n-1 range. Otherwise they remain dict keys. Example: >>> unflatten_attributes({"a.b": 1, "a.c.0": 2, "a.c.1": 3}) {"a": {"b": 1, "c": [2, 3]}} Args: flat_data: A dictionary whose keys are dot-separated paths and whose values are primitive data elements. Returns: A nested dictionary (and lists where appropriate) corresponding to the flattened structure. """ # 1) Build a pure dict tree first (no lists yet) root: Dict[str, Any] = {} for flat_key, value in flat_data.items(): parts = flat_key.split(".") curr: Dict[str, Any] = root for part in parts[:-1]: # Ensure intermediate node is a dict if part not in curr or not isinstance(curr[part], dict): curr[part] = {} curr = curr[part] # type: ignore[assignment] curr[parts[-1]] = value # 2) Recursively convert dicts-with-consecutive-numeric-keys into lists def convert(node: Union[Dict[str, Any], List[Any]]) -> Union[Dict[str, Any], List[Any]]: if isinstance(node, dict): # First convert children for k, v in list(node.items()): node[k] = convert(v) if not node: # empty dict stays dict return node # Check if keys are all numeric strings keys = list(node.keys()) if all(isinstance(k, str) and k.isdigit() for k in keys): # pyright: ignore[reportUnnecessaryIsInstance] indices = sorted(int(k) for k in keys) # Must be exactly 0..n-1 if indices == list(range(len(indices))): return [node[str(i)] for i in range(len(indices))] return node if isinstance(node, list): # pyright: ignore[reportUnnecessaryIsInstance] return [convert(v) for v in node] # Keep as is return node return convert(root) def sanitize_attribute_value(object: Any, force: bool = True) -> AttributeValue: """Sanitize an attribute value to be a valid OpenTelemetry attribute value.""" if isinstance(object, (str, int, float, bool)): return object if isinstance(object, list): try: return sanitize_list_attribute_sanity(cast(List[Any], object)) except ValueError as exc: logger.warning(f"Failed to sanitize list attribute. Fallback to JSON serialization: {exc}") try: # This include null, dict, etc. serialized = json.dumps(object, default=str if force else None) except (TypeError, ValueError) as exc: raise ValueError(f"Object must be JSON serializable, got: {type(cast(Any, object))}.") from exc return serialized def sanitize_attributes(attributes: Dict[str, Any], force: bool = True) -> Attributes: """Sanitize a dictionary of attributes to be a valid OpenTelemetry attributes. Args: attributes: A dictionary of attributes to sanitize. force: Whether to force sanitization even when the value is not JSON serializable. """ result: Attributes = {} for k, v in attributes.items(): try: result[k] = sanitize_attribute_value(v, force=force) except ValueError as exc: raise ValueError(f"Failed to sanitize attribute '{k}': {exc}") from exc return result def sanitize_list_attribute_sanity(maybe_list: List[Any]) -> AttributeValue: """Try to sanitize a list of attributes to be a valid OpenTelemetry attribute value. Raise error if the list contains multiple types of primitive values. """ if all(isinstance(item, str) for item in maybe_list): return list[str](maybe_list) if all(isinstance(item, bool) for item in maybe_list): return list[bool](maybe_list) if all(isinstance(item, (int, bool)) for item in maybe_list): return [int(item) for item in maybe_list] if all(isinstance(item, (float, int, bool)) for item in maybe_list): return [float(item) for item in maybe_list] list_types: List[Any] = [type(item) for item in maybe_list] raise ValueError(f"List must contain only one type of primitive values, got: {set(list_types)}.") def check_attributes_sanity(attributes: Dict[Any, Any]) -> None: """Check if a dictionary of attributes is a valid OpenTelemetry attributes.""" for k, v in attributes.items(): if not isinstance(k, str): raise ValueError(f"Attribute key must be a string, got {type(k)} for key '{k}'") if isinstance(v, list): try: sanitize_list_attribute_sanity(cast(List[Any], v)) except ValueError as exc: raise ValueError(f"Failed to sanitize list attribute '{k}': {exc}") from exc elif not isinstance(v, (str, int, float, bool)): raise ValueError( f"Attribute value must be a string, int, float, bool, or list of these, got {type(v)} for value '{v}'" ) def format_exception_attributes(exception: BaseException) -> Attributes: """Format an exception into a dictionary of attributes.""" stacktrace = "".join(traceback.format_exception(type(exception), exception, exception.__traceback__)) span_attributes: Attributes = { exception_attributes.EXCEPTION_TYPE: type(exception).__name__, exception_attributes.EXCEPTION_MESSAGE: str(exception), exception_attributes.EXCEPTION_ESCAPED: True, } if stacktrace.strip(): span_attributes[exception_attributes.EXCEPTION_STACKTRACE] = stacktrace return span_attributes ================================================ FILE: agentlightning/utils/otlp.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import gzip import logging from typing import Any, Awaitable, Callable, Dict, List, Mapping, Optional, Sequence, Tuple, Type, TypeVar from fastapi import Request, Response from google.protobuf import json_format from google.rpc.status_pb2 import Status from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ExportLogsServiceResponse, ) from opentelemetry.proto.collector.metrics.v1.metrics_service_pb2 import ( ExportMetricsServiceRequest, ExportMetricsServiceResponse, ) from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( ExportTraceServiceRequest, ExportTraceServiceResponse, ) from opentelemetry.proto.common.v1.common_pb2 import AnyValue, KeyValue from opentelemetry.proto.resource.v1.resource_pb2 import Resource as ProtoResource from opentelemetry.proto.trace.v1.trace_pb2 import Span as ProtoSpan from opentelemetry.proto.trace.v1.trace_pb2 import Status as ProtoStatus from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExportResult from opentelemetry.util.types import AttributeValue from agentlightning.semconv import LightningResourceAttributes from agentlightning.types.tracer import ( Attributes, Event, Link, OtelResource, Span, SpanContext, StatusCode, TraceStatus, convert_timestamp, ) PROTOBUF_CT = "application/x-protobuf" logger = logging.getLogger(__name__) T_request = TypeVar("T_request", ExportLogsServiceRequest, ExportMetricsServiceRequest, ExportTraceServiceRequest) T_response = TypeVar("T_response", ExportLogsServiceResponse, ExportMetricsServiceResponse, ExportTraceServiceResponse) async def handle_otlp_export( request: Request, request_message_cls: Type[T_request], response_message_cls: Type[T_response], message_callback: Optional[Callable[[T_request], Awaitable[None]]], signal_name: str, ) -> Response: """ Generic handler for /v1/traces, /v1/metrics, /v1/logs. Convert the OTLP Protobuf request to a JSON-like object. """ content_type = request.headers.get("Content-Type", "").split(";")[0].strip() if content_type != PROTOBUF_CT: # For brevity we only support binary protobuf here. return _bad_request_response( request, f"Unsupported Content-Type '{content_type}', expected '{PROTOBUF_CT}'", content_type=PROTOBUF_CT, ) raw_body = await request.body() body = _read_body_maybe_gzip(request, raw_body) # Empty request is allowed and should still succeed. if not body: req_msg = request_message_cls() else: req_msg = request_message_cls() try: req_msg.ParseFromString(body) except Exception as exc: return _bad_request_response(request, f"Unable to parse OTLP {signal_name} payload: {exc}") if message_callback is not None: await message_callback(req_msg) # Build success response. Partial success field is left unset. resp_msg = response_message_cls() # Encode response in the same Content-Type as request. if content_type == PROTOBUF_CT: resp_bytes = resp_msg.SerializeToString() else: resp_bytes = json_format.MessageToJson(resp_msg).encode("utf-8") resp_bytes, headers = _maybe_gzip_response(request, resp_bytes) return Response( content=resp_bytes, media_type=content_type, status_code=200, headers=headers, ) async def spans_from_proto( request: ExportTraceServiceRequest, sequence_id_bulk_issuer: Callable[[Sequence[Tuple[str, str]]], Awaitable[Sequence[int]]], ) -> List[Span]: """Parse an OTLP proto payload into List[Span]. A store is needed here for generating a sequence ID for each span. """ output_spans: List[Span] = [] for resource_spans in request.resource_spans: # Resource-level attributes & IDs resource_attrs = _kv_list_to_dict(resource_spans.resource.attributes) # rollout_id, attempt_id from resource attributes when present. rollout_id_resource = resource_attrs.get(LightningResourceAttributes.ROLLOUT_ID.value) attempt_id_resource = resource_attrs.get(LightningResourceAttributes.ATTEMPT_ID.value) # If sequence id is provided, all the spans will share the same sequence ID. # unless otherwise overridden by span-level attributes. sequence_id_resource = resource_attrs.get(LightningResourceAttributes.SPAN_SEQUENCE_ID.value) otel_resource = _resource_from_proto(resource_spans.resource, getattr(resource_spans, "schema_url", "")) # Each ScopeSpans contains multiple spans for scope_spans in resource_spans.scope_spans: for proto_span in scope_spans.spans: trace_id_hex = _bytes_to_trace_id_hex(proto_span.trace_id) span_id_hex = _bytes_to_span_id_hex(proto_span.span_id) parent_id_hex = _bytes_to_span_id_hex(proto_span.parent_span_id) if proto_span.parent_span_id else None # Status status_code_str = _STATUS_CODE_MAP.get(proto_span.status.code, "UNSET") status = TraceStatus( status_code=status_code_str, description=proto_span.status.message or None, ) # Attributes span_attrs = _kv_list_to_dict(proto_span.attributes) # Context context = SpanContext( trace_id=trace_id_hex, span_id=span_id_hex, is_remote=False, trace_state={}, ) # Try to get if span attributes contain something like rollout_id or attempt_id # Override the resource-level attributes with the span-level attributes if present. rollout_id_span = span_attrs.get(LightningResourceAttributes.ROLLOUT_ID.value) attempt_id_span = span_attrs.get(LightningResourceAttributes.ATTEMPT_ID.value) sequence_id_span = span_attrs.get(LightningResourceAttributes.SPAN_SEQUENCE_ID.value) # Normalize to regular strings and ints rollout_id_raw = rollout_id_span if rollout_id_span is not None else rollout_id_resource attempt_id_raw = attempt_id_span if attempt_id_span is not None else attempt_id_resource sequence_id_raw = sequence_id_span if sequence_id_span is not None else sequence_id_resource rollout_id, attempt_id = _normalize_rollout_attempt_id(rollout_id_raw, attempt_id_raw) sequence_id = _normalize_sequence_id(sequence_id_raw) if rollout_id is None or attempt_id is None: logger.warning( "Both rollout_id and attempt_id must be present in resource attributes. " "Spans will not be able to log to the store because of missing IDs: rollout_id=%s, attempt_id=%s, sequence_id=%s", rollout_id, attempt_id, sequence_id, ) continue # Generate a new sequence ID if not provided if sequence_id is None: current_sequence_id = -1 elif sequence_id < 0: logger.error( "Invalid sequence_id value in resource attributes: %r. Must be a positive integer. Regenerating one.", sequence_id, ) current_sequence_id = -1 else: current_sequence_id = sequence_id # Build Span span = Span( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=current_sequence_id, trace_id=trace_id_hex, span_id=span_id_hex, parent_id=parent_id_hex, name=proto_span.name, status=status, attributes=span_attrs, events=_events_from_proto(proto_span), links=_links_from_proto(proto_span), start_time=convert_timestamp(proto_span.start_time_unix_nano), end_time=convert_timestamp(proto_span.end_time_unix_nano), context=context, parent=None, # OTLP only has parent_span_id; we don't have full SpanContext resource=otel_resource, ) output_spans.append(span) # Finalize the sequence IDs bulk_issue_requests = [(span.rollout_id, span.attempt_id) for span in output_spans if span.sequence_id < 0] bulk_sequence_ids = await sequence_id_bulk_issuer(bulk_issue_requests) for span, sequence_id in zip( [span for span in output_spans if span.sequence_id < 0], bulk_sequence_ids, strict=True ): span.sequence_id = sequence_id return output_spans class LightningStoreOTLPExporter(OTLPSpanExporter): """OTLP Exporter that write to a LightningStore-compatible backend. The backend requires two special attributes on each span: - `agentlightning.rollout_id`: The rollout ID to associate the span with. - `agentlightning.attempt_id`: The attempt ID to associate the span with. It can optionally use the following attribute to sequence spans: - `agentlightning.span_sequence_id`: A decimal string representing the sequence ID of the span. """ _default_endpoint: Optional[str] = None _rollout_id: Optional[str] = None _attempt_id: Optional[str] = None def __repr__(self) -> str: return ( f"{self.__class__.__name__}(" + f"endpoint={self.endpoint!r}, " + f"rollout_id={self.rollout_id!r}, " + f"attempt_id={self.attempt_id!r}, " + f"should_bypass={self.should_bypass()!r})" ) @property def endpoint(self) -> Optional[str]: """The endpoint to submit the spans to.""" if hasattr(self, "_endpoint"): return self._endpoint return None @property def rollout_id(self) -> Optional[str]: """The rollout ID to submit the spans to.""" if hasattr(self, "_rollout_id"): return self._rollout_id return None @property def attempt_id(self) -> Optional[str]: """The attempt ID to submit the spans to.""" if hasattr(self, "_attempt_id"): return self._attempt_id return None def enable_store_otlp(self, endpoint: str, rollout_id: str, attempt_id: str) -> None: """Enable storing OTLP data to a specific LightningStore rollout/attempt.""" self._rollout_id = rollout_id self._attempt_id = attempt_id self._default_endpoint = self._endpoint self._endpoint = endpoint def disable_store_otlp(self) -> None: """Disable storing OTLP data to LightningStore.""" self._rollout_id = None self._attempt_id = None if self._default_endpoint is not None: self._endpoint = self._default_endpoint def should_bypass(self) -> bool: """Check if the exporter should bypass the default export if rollout_id and attempt_id are not set.""" return True def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: if self._rollout_id is not None and self._attempt_id is not None: # rollout_id and attempt_id are present in resource attributes # It means that the server supports OTLP endpoint. for span in spans: # Override the resources so that the server knows where the request comes from. span._resource = span._resource.merge( # pyright: ignore[reportPrivateUsage] Resource.create( { LightningResourceAttributes.ROLLOUT_ID.value: self._rollout_id, LightningResourceAttributes.ATTEMPT_ID.value: self._attempt_id, } ) ) return super().export(spans) elif not self.should_bypass(): logger.debug("Rollout ID and Attempt ID not set; using default OTLP exporter behavior.") return super().export(spans) else: logger.debug("Rollout ID and Attempt ID not set; bypassing export.") return SpanExportResult.SUCCESS def _read_body_maybe_gzip(request: Request, raw_body: bytes) -> bytes: """ Decompress body if Content-Encoding: gzip; otherwise return as is. """ encoding = request.headers.get("Content-Encoding", "").lower() if encoding == "gzip": return gzip.decompress(raw_body) return raw_body def _maybe_gzip_response(request: Request, payload: bytes) -> Tuple[bytes, Dict[str, str]]: """ If Accept-Encoding includes gzip, gzip the payload and set Content-Encoding header. """ ae = request.headers.get("Accept-Encoding", "") tokens = [token.split(";")[0].strip().lower() for token in ae.split(",") if token.strip()] headers: Dict[str, str] = {} if "gzip" in tokens: payload = gzip.compress(payload) headers["Content-Encoding"] = "gzip" return payload, headers def _bad_request_response(request: Request, message: str, content_type: str = PROTOBUF_CT) -> Response: """ Build a 400 response whose body is a protobuf Status message, encoded in the same Content-Type as the request (OTLP/HTTP requirement). """ status_msg = Status(message=message) if content_type == PROTOBUF_CT: body = status_msg.SerializeToString() else: # Fallback: JSON representation of Status. body = json_format.MessageToJson(status_msg).encode("utf-8") body, headers = _maybe_gzip_response(request, body) return Response( content=body, status_code=400, media_type=content_type, headers=headers, ) def _normalize_rollout_attempt_id( rollout_id: Optional[AttributeValue], attempt_id: Optional[AttributeValue] ) -> Tuple[Optional[str], Optional[str]]: """Normalize a rollout or attempt ID to a string.""" rollout_id_str = str(rollout_id) if rollout_id is not None else None attempt_id_str = str(attempt_id) if attempt_id is not None else None return rollout_id_str, attempt_id_str def _normalize_sequence_id(sequence_id: Optional[AttributeValue]) -> Optional[int]: """Normalize a sequence ID to an integer.""" if sequence_id is None: return None try: sequence_id_int = int(str(sequence_id)) except (ValueError, TypeError): logger.warning( "Invalid sequence_id value in resource attributes: %r. Must be an integer or string representing an integer. Assuming None.", sequence_id, ) sequence_id_int = None return sequence_id_int def _any_value_to_python(value: AnyValue) -> Any: """Convert OTLP AnyValue -> plain Python value.""" kind = value.WhichOneof("value") if kind is None: return None if kind == "string_value": return value.string_value if kind == "bool_value": return value.bool_value if kind == "int_value": return int(value.int_value) if kind == "double_value": return float(value.double_value) if kind == "array_value": return [_any_value_to_python(v) for v in value.array_value.values] if kind == "kvlist_value": # Map -> dict return {kv.key: _any_value_to_python(kv.value) for kv in value.kvlist_value.values} if kind == "bytes_value": # Serialize bytes as hex string to stay JSON-friendly return value.bytes_value.hex() return None def _kv_list_to_dict(kvs: Sequence[KeyValue]) -> Attributes: """Convert repeated KeyValue -> Attributes dict.""" return {kv.key: _any_value_to_python(kv.value) for kv in kvs} _STATUS_CODE_MAP: Mapping[ProtoStatus.StatusCode.ValueType, StatusCode] = { ProtoStatus.STATUS_CODE_UNSET: "UNSET", ProtoStatus.STATUS_CODE_OK: "OK", ProtoStatus.STATUS_CODE_ERROR: "ERROR", } def _bytes_to_trace_id_hex(b: bytes) -> str: # OTLP uses 16-byte trace IDs; format as 32-char hex if not b: return "0" * 32 return b.hex().rjust(32, "0") def _bytes_to_span_id_hex(b: bytes) -> str: # OTLP uses 8-byte span IDs; format as 16-char hex if not b: return "0" * 16 return b.hex().rjust(16, "0") def _events_from_proto(span: ProtoSpan) -> List[Event]: """Event converter from OTLP ProtoSpan to List[Event].""" return [ Event( name=e.name, attributes=_kv_list_to_dict(e.attributes), timestamp=convert_timestamp(e.time_unix_nano), ) for e in span.events ] def _links_from_proto(span: ProtoSpan) -> List[Link]: """Link converter from OTLP ProtoSpan to List[Link].""" links: List[Link] = [] for link in span.links: trace_id_hex = _bytes_to_trace_id_hex(link.trace_id) span_id_hex = _bytes_to_span_id_hex(link.span_id) ctx = SpanContext( trace_id=trace_id_hex, span_id=span_id_hex, is_remote=False, trace_state={}, # OTLP trace_state is currently a string; you can parse if needed ) links.append( Link( context=ctx, attributes=_kv_list_to_dict(link.attributes) or None, ) ) return links def _resource_from_proto(resource: ProtoResource, schema_url: str = "") -> OtelResource: return OtelResource( attributes=_kv_list_to_dict(resource.attributes), schema_url=schema_url or "", ) ================================================ FILE: agentlightning/utils/server_launcher.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import asyncio import inspect import logging import multiprocessing import os import queue import signal import socket import threading import time import traceback from contextlib import asynccontextmanager, suppress from dataclasses import dataclass from multiprocessing.process import BaseProcess from typing import Any, AsyncContextManager, AsyncIterator, Dict, Literal, Optional, cast import aiohttp import requests import uvicorn from fastapi import FastAPI from gunicorn.app.base import BaseApplication from gunicorn.arbiter import Arbiter from portpicker import pick_unused_port __all__ = ["PythonServerLauncher", "PythonServerLauncherArgs", "LaunchMode"] LaunchMode = Literal["asyncio", "thread", "mp"] """The launch mode for the server.""" @dataclass class PythonServerLauncherArgs: port: Optional[int] = None """The TCP port to listen on. If not provided, the server will use a random available port.""" host: Optional[str] = None """The hostname or IP address to bind the server to.""" access_host: Optional[str] = None """The hostname or IP address to advertise to the client. If not provided, the server will use the default outbound IPv4 address for this machine.""" launch_mode: LaunchMode = "asyncio" """The launch mode. `asyncio` is the default mode to runs the server in the current thread. `thread` runs the server in a separate thread. `mp` runs the server in a separate process.""" n_workers: int = 1 """The number of workers to run in the server. Only applicable for `mp` mode. When `n_workers > 1`, the server will be run using Gunicorn. """ healthcheck_url: Optional[str] = None """The health check URL to use. If not provided, the server will not be checked for healthiness after starting. """ log_level: int = logging.INFO """The log level to use.""" access_log: bool = False """Whether to turn on access logs.""" startup_timeout: float = 60.0 """The timeout to wait for the server to start up.""" kill_unhealthy_server: bool = True """Whether to kill the server if it is not healthy after startup. This setting is ignored when `launch_mode` is not `asyncio`. """ thread_join_timeout: float = 10.0 """The timeout to wait for the thread to join.""" process_join_timeout: float = 10.0 """The timeout to wait for the process to join.""" timeout_keep_alive: int = 30 """The timeout to keep the connection alive.""" @dataclass class ChildEvent: """An event that occurred in a child process.""" kind: Literal["ready", "error"] """The kind of message.""" exc_type: Optional[str] = None """The type of the exception, only used for error messages.""" message: Optional[str] = None """The message of the exception, only used for error messages.""" traceback: Optional[str] = None """The traceback of the exception, only used for error messages.""" logger = logging.getLogger(__name__) class GunicornApp(BaseApplication): """ Programmatic Gunicorn application that: - Accepts a `FastAPI` app object and option dict. - Uses `uvicorn_worker.UvicornWorker`. """ def __init__(self, app: FastAPI, options: Dict[str, Any]): self.application = app self.options = options super().__init__() # type: ignore def load_config(self): cfg = self.cfg valid_keys = cfg.settings.keys() # type: ignore for k, v in (self.options or {}).items(): if k in valid_keys and v is not None: cfg.set(k, v) # type: ignore def load(self): return self.application async def shutdown_uvicorn_server(server: uvicorn.Server, task: asyncio.Task[None], timeout: float = 5.0) -> None: """Shutdown a uvicorn server and await the serving task.""" logger.debug("Requesting graceful shutdown of uvicorn server.") server.should_exit = True # Give uvicorn a brief window to shut down cleanly. try: logger.debug("Waiting for graceful shutdown of uvicorn server.") await asyncio.wait_for(task, timeout=timeout) logger.debug("Graceful shutdown of uvicorn server completed.") except asyncio.TimeoutError: logger.error("Graceful shutdown of uvicorn server timed out.") # As a last resort, cancel; this shouldn't happen under normal circumstances. task.cancel() with suppress(asyncio.CancelledError): await task logger.warning("Uvicorn server forced to stop.") @asynccontextmanager async def noop_context() -> AsyncIterator[None]: """A real async context manager that does nothing (satisfies serve_context).""" yield async def run_uvicorn_asyncio( uvicorn_server: uvicorn.Server, serve_context: AsyncContextManager[Any], timeout: float = 60.0, health_url: Optional[str] = None, wait_for_serve: bool = True, kill_unhealthy_server: bool = True, ) -> asyncio.Task[None]: """Run two Asyncio tasks in parallel: - A watcher task that waits for the server to start up and then checks for healthiness. - A server task that serves the server. """ server_start_exception: Optional[BaseException] = None # watcher: when server.started flips True, announce READY once async def _watch_server() -> None: start_time = time.time() deadline = start_time + timeout # child-side startup window logger.debug(f"Waiting for server to start up for {timeout:.2f} seconds...") # Wait for the server to start up or the deadline to be reached, or an exception to be raised. while time.time() < deadline and not uvicorn_server.started and server_start_exception is None: await asyncio.sleep(0.1) if not uvicorn_server.started: # Normally, the program will not reach this point, as the server will throw the exception itself earlier. raise RuntimeError( f"Server did not start up within {time.time() - start_time:.2f} seconds." ) from server_start_exception logger.info(f"Server started up in {time.time() - start_time:.2f} seconds.") # Check for health endpoint status if provided if health_url is not None: logger.info(f"Probing health endpoint {health_url}...") async with aiohttp.ClientSession() as session: while time.time() < deadline: try: async with session.get(health_url) as resp: if resp.status == 200: logger.info( f"Server is healthy at {health_url} in {time.time() - start_time:.2f} seconds." ) return else: logger.debug( f"Server is NOT healthy at {health_url} in {time.time() - start_time:.2f} seconds. Got status {resp.status}." ) except Exception as e: logger.debug(f"Error probing health endpoint {health_url}: {str(e)}") await asyncio.sleep(0.1) # If the server is not healthy, kill it if requested. health_failed_seconds = time.time() - start_time if kill_unhealthy_server: logger.error( f"Server is not healthy at {health_url} after {health_failed_seconds:.2f} seconds. Shutting down server gracefully." ) uvicorn_server.should_exit = True await serve_task raise RuntimeError( f"Server is not healthy at {health_url} after {health_failed_seconds:.2f} seconds. It has been killed." ) else: logger.error( f"Server is not healthy at {health_url} after {health_failed_seconds:.2f} seconds. It has been left running." ) else: logger.info("Server does not provide a health check endpoint. Skipping health check.") async def _serve_server() -> None: nonlocal server_start_exception async with serve_context: try: await uvicorn_server.serve() except (asyncio.CancelledError, KeyboardInterrupt): # Normal shutdown path; propagate without rewrapping raise except BaseException as exc: server_start_exception = exc if wait_for_serve: # This probably sends out earlier than watcher exception; but either one is fine. raise RuntimeError("Uvicorn server failed to serve") from exc else: # If the caller is not waiting for this coroutine, we just log the error. # It will be handled by the watch task. logger.exception("Uvicorn server failed to serve. Inspect the logs for details.") serve_task = asyncio.create_task(_serve_server()) watch_task = asyncio.create_task(_watch_server()) if wait_for_serve: await asyncio.gather(watch_task, serve_task) else: # Wait for watch only, the serve task will run in the background. await watch_task return serve_task def run_uvicorn_thread( uvicorn_server: uvicorn.Server, serve_context: AsyncContextManager[Any], event_queue: queue.Queue[ChildEvent], stop_event: threading.Event, timeout: float = 60.0, health_url: Optional[str] = None, ): """ Run a uvicorn server in a thread. How to stop programmatically (from the main thread): uvicorn_server.should_exit = True This function: - starts the server and waits for startup/health (if provided), - then blocks until the server exits, - shuts down cleanly if an error happens during startup/health, - or if the thread is stopped by stop event. """ async def _main() -> None: # Start server without waiting for full lifecycle; return once startup/health is done. serve_task: Optional[asyncio.Task[None]] = None try: serve_task = await run_uvicorn_asyncio( uvicorn_server=uvicorn_server, serve_context=serve_context, timeout=timeout, health_url=health_url, wait_for_serve=False, # return after startup watcher finishes kill_unhealthy_server=True, # raise if health fails within timeout ) event_queue.put(ChildEvent(kind="ready")) except Exception as exc: # Startup/health failed; nothing is running in the background. logger.exception("Uvicorn failed to start or was unhealthy.") event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc() ) ) return logger.debug("Thread server started and ready.") try: # At this point, the server is up and serving in the same thread's loop. # Block here until it exits (caller can stop it via setting the stop_event). while not stop_event.is_set(): await asyncio.sleep(0.1) except asyncio.CancelledError: # Shutdown the server. logger.warning( "Thread server received asyncio cancellation signal. Shutting down gracefully. This is not the recommended way to stop the server." ) raise except Exception as exc: logger.exception("Exception during the thread event waiting loop.") event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc() ) ) finally: logger.info("Requesting graceful shutdown of uvicorn server.") await shutdown_uvicorn_server(uvicorn_server, serve_task) logger.info("Uvicorn server shut down gracefully.") # Each thread needs its own event loop; use asyncio.run to manage it cleanly. try: asyncio.run(_main()) except Exception: # Exceptions are already logged above; don't crash the process from a thread. # (Caller can inspect logs or add a queue/handler if they need to propagate.) logger.exception("Exception within the thread server loop. Inspect the logs for details.") def run_uvicorn_subprocess( uvicorn_server: uvicorn.Server, serve_context: AsyncContextManager[Any], event_queue: multiprocessing.Queue[ChildEvent], timeout: float = 60.0, health_url: Optional[str] = None, ): """Run a uvicorn server in a subprocess. Behavior: - Start uvicorn and wait for startup/health (if provided). - Post `ChildEvent(kind="ready")` once the server is up. - Stay alive until a termination signal (SIGTERM/SIGINT). - On signal, request graceful shutdown and wait for the server to exit. This must be used with forked multiprocessing.Process. """ async def _main() -> None: stop_event = asyncio.Event() # Register signal handlers loop = asyncio.get_running_loop() for sig in (signal.SIGTERM, signal.SIGINT): loop.add_signal_handler(sig, stop_event.set) logger.debug("Subprocess signal handlers registered.") serve_task: Optional[asyncio.Task[None]] = None try: # Start server but don't block on its full lifecycle; this returns once the watcher finishes. serve_task = await run_uvicorn_asyncio( uvicorn_server=uvicorn_server, serve_context=serve_context, timeout=timeout, health_url=health_url, wait_for_serve=False, # return after startup/health passes kill_unhealthy_server=True, # if unhealthy, fail fast in the child ) # Announce readiness only after watcher success. event_queue.put(ChildEvent(kind="ready")) logger.debug("Subprocess server started and ready.") # Wait until we're told to stop. await stop_event.wait() except Exception as exc: # Propagate any startup/health errors to the parent. event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc(), ) ) logger.exception("Subprocess server failed to start or was unhealthy.") finally: # Request graceful shutdown if the server is running. if serve_task is not None: logger.info("Requesting graceful shutdown of subprocess server.") await shutdown_uvicorn_server(uvicorn_server, serve_task) logger.info("Subprocess server shut down gracefully.") else: logger.info("Subprocess server was not running. Nothing to stop.") try: asyncio.run(_main()) except Exception as exc: # If something escapes _main(), make sure the parent hears about it. event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc(), ) ) def run_gunicorn( gunicorn_app: GunicornApp, serve_context: AsyncContextManager[Any], event_queue: multiprocessing.Queue[ChildEvent], timeout: float = 60.0, health_url: Optional[str] = None, ): """Run a gunicorn server in a subprocess. The master arbiter will reside in a non-daemon subprocess, and the workers will be forked from the arbiter. Behavior: - Start Arbiter.run() (blocking) in this process. - A watchdog thread waits for workers to spawn, then (optionally) verifies a health URL. - On success: put `ChildEvent(kind="ready")`. - On failure/timeout: put `ChildEvent(kind="error")` and request a graceful shutdown. `serve_context` will be applied around the `arbiter.run()` call. """ # Create the arbiter up-front so the watchdog can inspect it. try: arbiter = Arbiter(gunicorn_app) except Exception as exc: logger.exception("Failed to initialize Gunicorn Arbiter.") event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc(), ) ) return runtime_error: Optional[BaseException] = None def _watchdog() -> None: start = time.time() deadline = start + timeout # First, wait for arbiter.workers to get populated while time.time() < deadline and not arbiter.WORKERS: # type: ignore # If arbiter died early, abort quickly. if runtime_error is not None: logger.error("Gunicorn arbiter exited during startup. Watchdog exiting.") return time.sleep(0.1) if not arbiter.WORKERS: # type: ignore elapsed_time = time.time() - start logger.error("Gunicorn workers did not start within %.2f seconds.", elapsed_time) if runtime_error is None: # Timeout case: arbiter throws no exception. event_queue.put( ChildEvent( kind="error", exc_type="RuntimeError", message=f"Gunicorn workers did not start within {elapsed_time:.2f} seconds.", traceback=None, ) ) logger.info("Halting Gunicorn arbiter.") # Ask arbiter to stop if it's still alive. # It will make the watchdog exit too. arbiter.signal(signal.SIGTERM, inspect.currentframe()) # type: ignore else: # Timeout case: arbiter has thrown an exception. logger.error("Gunicorn arbiter exited during startup. Watchdog exiting.") return # Second, check for health endpoint status if provided if health_url: while time.time() < deadline: # If arbiter died early, abort. if runtime_error is not None: logger.error("Gunicorn arbiter exited during health check. Watchdog exiting.") return # Check if the server is healthy. try: resp = requests.get(health_url, timeout=2.0) if resp.status_code == 200: logger.debug(f"Server is healthy at {health_url} in {time.time() - start:.2f} seconds.") # Check arbiter status again. if runtime_error is None: event_queue.put(ChildEvent(kind="ready")) else: logger.error( "Response status is 200 but arbiter has thrown an exception. This should not happen." ) return except Exception: logger.debug( f"Server is still not healthy at {health_url} in {time.time() - start:.2f} seconds.", exc_info=True, ) time.sleep(0.1) # Health failed: report and shut down. elapsed = time.time() - start logger.error( "Server is not healthy at %s after %.2f seconds. Shutting down.", health_url, elapsed, ) if runtime_error is None: # Arbiter throws no exception. This is a simple timeout case. event_queue.put( ChildEvent( kind="error", exc_type="RuntimeError", message=( f"Server is not healthy at {health_url} after " f"{elapsed:.2f} seconds. It will be killed by the watchdog." ), traceback=None, ) ) logger.info("Halting Gunicorn arbiter.") # Ask arbiter to stop if it's still alive. arbiter.signal(signal.SIGTERM, inspect.currentframe()) # type: ignore else: # If arbiter has thrown an exception, report it. logger.error("Gunicorn arbiter exited during health check. Watchdog exiting.") else: # No health check; workers up => ready. if runtime_error is None: event_queue.put(ChildEvent(kind="ready")) else: # If arbiter has thrown an exception, report it. logger.error("Gunicorn arbiter exited unexpectedly before health check. Watchdog exiting.") def _watchdog_with_exception() -> None: try: _watchdog() except Exception as exc: logger.exception("Exception in watchdog thread.") event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc() ) ) watchdog_thread = threading.Thread(target=_watchdog_with_exception, daemon=True) watchdog_thread.start() async def _serve() -> None: nonlocal runtime_error try: async with serve_context: arbiter.run() except Exception as exc: runtime_error = exc event_queue.put( ChildEvent( kind="error", exc_type=type(exc).__name__, message=str(exc), traceback=traceback.format_exc(), ) ) logger.exception("Gunicorn server failed to start.") try: asyncio.run(_serve()) # Most exceptions should have been caught within the _serve() coroutine. finally: # Ensure watchdog doesn't try to act on a dead arbiter for long. watchdog_thread.join(timeout=5.0) def _get_default_ipv4_address() -> str: """Determine the default outbound IPv4 address for this machine. Implementation: Opens a UDP socket and "connects" to a public address to force route selection, then inspects the socket's local address. No packets are sent. Returns: str: Best-guess IPv4 like `192.168.x.y`. Falls back to `127.0.0.1`. """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # Doesn't actually contact 8.8.8.8; just forces the OS to pick a route. s.connect(("8.8.8.8", 80)) return s.getsockname()[0] except Exception: return "127.0.0.1" finally: s.close() class PythonServerLauncher: """Unified launcher for FastAPI, using uvicorn or gunicorn per mode/worker count. See [`PythonServerLauncherArgs`][agentlightning.utils.server_launcher.PythonServerLauncherArgs] for configuration options. Args: app: The FastAPI app to launch. args: The configuration for the server. serve_context: An optional context manager to apply around the server startup. """ def __init__( self, app: FastAPI, args: PythonServerLauncherArgs, serve_context: Optional[AsyncContextManager[Any]] = None ): """Initialize the launcher with the FastAPI app, configuration, and optional serve context.""" self.app = app self.args = args self.serve_context = serve_context self._host: Optional[str] = self.args.host self._port: Optional[int] = self.args.port self._access_host: Optional[str] = self.args.access_host self.initialize() def initialize(self): # ensure the host/port/access_host are set self._ensure_host() self._ensure_port() self._ensure_access_host() # uvicorn (in-proc asyncio) self._uvicorn_server: Optional[uvicorn.Server] = None self._uvicorn_task: Optional[asyncio.Task[None]] = None # returned by run_uvicorn_asyncio() # uvicorn (thread) self._thread: Optional[threading.Thread] = None self._thread_event_queue: Optional[queue.Queue[ChildEvent]] = None self._thread_stop_event: Optional[threading.Event] = None # subprocess (uvicorn / gunicorn) self._proc: Optional[BaseProcess] = None self._mp_event_queue: Optional[multiprocessing.Queue[ChildEvent]] = None self._gunicorn_app: Optional[GunicornApp] = None # programmatic gunicorn wrapper # is_running flag self._is_running: bool = False def __getstate__(self): """Control pickling to prevent server state from being sent to subprocesses.""" return { "app": self.app, "args": self.args, "serve_context": self.serve_context, "_host": self._host, "_port": self._port, "_access_host": self._access_host, } def __setstate__(self, state: Dict[str, Any]): self.app = state["app"] self.args = cast(PythonServerLauncherArgs, state["args"]) self.serve_context = state["serve_context"] self._host = state["_host"] self._port = state["_port"] self._access_host = state["_access_host"] self.initialize() @property def endpoint(self) -> str: """Return the externally advertised host:port pair regardless of accessibility.""" return f"http://{self._ensure_host()}:{self._ensure_port()}" @property def access_endpoint(self) -> str: """Return a loopback-friendly URL so health checks succeed even when binding to 0.0.0.0.""" return f"http://{self._ensure_access_host()}:{self._ensure_port()}" @property def health_url(self) -> Optional[str]: """Build the absolute health-check endpoint from args, if one is configured.""" if not self.args.healthcheck_url: return None path = self.args.healthcheck_url if not path.startswith("/"): path = "/" + path return f"{self.access_endpoint}{path}" async def start(self): """Starts the server according to launch_mode and n_workers.""" logger.info(f"Starting server {self._normalize_app_ref(self.app)}...") mode = self.args.launch_mode if mode == "mp": await self._start_serving_process() elif mode == "thread": await self._start_uvicorn_thread() elif mode == "asyncio": await self._start_uvicorn_asyncio() else: raise ValueError(f"Unsupported launch mode: {mode}") logger.info(f"Server {self._normalize_app_ref(self.app)} started at {self.endpoint}") async def stop(self): """Stop the server using the inverse of whatever launch mode was used to start it.""" logger.info(f"Stopping server {self._normalize_app_ref(self.app)}...") mode = self.args.launch_mode if mode == "mp": await self._stop_serving_process() elif mode == "thread": await self._stop_uvicorn_thread() elif mode == "asyncio": await self._stop_uvicorn_asyncio() else: raise ValueError(f"Unsupported launch mode: {mode}") logger.info(f"Server {self._normalize_app_ref(self.app)} stopped") async def reload(self): """Restart the server by stopping it if necessary and invoking start again.""" if self.is_running(): await self.stop() await self.start() async def run_forever(self): """Start the server and block the caller until it exits, respecting the configured mode.""" mode = self.args.launch_mode if mode == "asyncio": await self._start_uvicorn_asyncio() try: if self._uvicorn_task is not None: # Wait for the server # Won't allow outer cancel to directly cancel the inner task await asyncio.shield(self._uvicorn_task) except (asyncio.CancelledError, KeyboardInterrupt): logger.warning("Server received cancellation signal. Shutting down gracefully.") await self._stop_uvicorn_asyncio() raise elif mode == "thread": await self._start_uvicorn_thread() try: # Wait for the thread to exit while self._thread and self._thread.is_alive(): await asyncio.sleep(0.5) except (asyncio.CancelledError, KeyboardInterrupt): logger.warning("Server thread received cancellation signal. Shutting down gracefully.") await self._stop_uvicorn_thread() raise elif mode == "mp": await self._start_serving_process() try: # Wait for the process to exit while self._proc and self._proc.is_alive(): await asyncio.sleep(0.5) except (asyncio.CancelledError, KeyboardInterrupt): logger.warning("Server process received cancellation signal. Shutting down gracefully.") await self._stop_serving_process() raise else: raise ValueError(f"Unsupported launch mode: {mode}") def is_running(self) -> bool: """Return True if the server has been started and not yet stopped.""" return self._is_running @staticmethod def _normalize_app_ref(app: FastAPI) -> str: module = getattr(app, "__module__", None) if module and module != "__main__": return f"{module}:app" return "unknown:app" def _ensure_host(self) -> str: if self._host is None: logger.warning("No host provided, using 0.0.0.0.") self._host = "0.0.0.0" return self._host def _ensure_port(self) -> int: if self._port is None: logger.warning("No port provided, using pick_unused_port to pick a random unused port.") self._port = pick_unused_port() return self._port def _ensure_access_host(self) -> str: if self._access_host is None: if self.args.access_host is None: if self._ensure_host() in ("0.0.0.0", "::"): # Probe host normalization for 0.0.0.0 logger.warning("No access host provided, using default outbound IPv4 address for this machine.") self._access_host = _get_default_ipv4_address() else: logger.warning("No access host provided, using the host provided.") self._access_host = self._ensure_host() else: self._access_host = self.args.access_host return self._access_host # type: ignore def _create_uvicorn_server(self) -> uvicorn.Server: config = uvicorn.Config( app=self.app, host=self._ensure_host(), port=self._ensure_port(), log_level=self.args.log_level, access_log=self.args.access_log, loop="asyncio", timeout_keep_alive=self.args.timeout_keep_alive, ) return uvicorn.Server(config) def _ctx(self) -> AsyncContextManager[Any]: # Use the provided serve_context if any; otherwise a no-op async CM if self.serve_context is None: logger.info("No serve_context provided, using noop_context.") return noop_context() return self.serve_context # --- Mode 1: asyncio (in-proc) using run_uvicorn_asyncio --- async def _start_uvicorn_asyncio(self): if self.is_running(): raise RuntimeError("Server is already running. Stopping it first.") logger.info("Starting uvicorn asyncio server...") self._uvicorn_server = self._create_uvicorn_server() # Start server; return after health passes; keep serving in background task self._uvicorn_task = await run_uvicorn_asyncio( uvicorn_server=self._uvicorn_server, serve_context=self._ctx(), timeout=self.args.startup_timeout, health_url=self.health_url, wait_for_serve=False, # return once startup/health OK kill_unhealthy_server=self.args.kill_unhealthy_server, ) self._is_running = True logger.info("Uvicorn asyncio server started") async def _stop_uvicorn_asyncio(self): # Gracefully shut down the in-proc uvicorn server task if running logger.info("Stopping uvicorn asyncio server...") if self._uvicorn_server and self._uvicorn_task: await shutdown_uvicorn_server(self._uvicorn_server, self._uvicorn_task) self._uvicorn_task = None self._uvicorn_server = None self._is_running = False logger.info("Uvicorn asyncio server stopped") # --- Mode 2: thread (in-proc) using run_uvicorn_thread --- async def _start_uvicorn_thread(self): if self.is_running(): raise RuntimeError("Server is already running. Stopping it first.") logger.info("Starting uvicorn thread server...") self._uvicorn_server = self._create_uvicorn_server() self._thread_event_queue = queue.Queue() self._thread_stop_event = threading.Event() self._thread = threading.Thread( target=run_uvicorn_thread, kwargs={ "uvicorn_server": self._uvicorn_server, "serve_context": self._ctx(), "event_queue": self._thread_event_queue, "stop_event": self._thread_stop_event, "timeout": self.args.startup_timeout, "health_url": self.health_url, }, daemon=True, ) self._thread.start() # Wait for ready or error event from the thread timeout = self.args.startup_timeout * 2 # Allows twice the timeout for the thread to get the event try: evt: ChildEvent = await asyncio.to_thread(self._thread_event_queue.get, True, timeout) except queue.Empty: if not self._thread.is_alive(): raise RuntimeError("Threaded server failed to start and is not alive. No error event was received.") logger.error( "Threaded server failed to start and sends no event. This should not happen. Shutting down server." ) await self._stop_uvicorn_thread() raise RuntimeError("Threaded server failed to start and sends no event. This should not happen.") if evt.kind == "error": logger.error("Threaded server failed to start (%s): %s\n%s", evt.exc_type, evt.message, evt.traceback) await asyncio.to_thread(self._thread.join, self.args.thread_join_timeout) if self._thread.is_alive(): logger.error("Threaded server failed to start and refused to shut down.") raise RuntimeError(evt.message) else: logger.info("Threaded server started successfully.") self._is_running = True async def _stop_uvicorn_thread(self): logger.info("Stopping uvicorn thread server...") if self._thread_stop_event: self._thread_stop_event.set() if self._thread: await asyncio.to_thread(self._thread.join, self.args.thread_join_timeout) if self._thread.is_alive(): raise RuntimeError("Threaded server refused to shut down.") else: logger.info("Uvicorn thread server was not running. Nothing to stop.") self._thread = None self._thread_event_queue = None self._thread_stop_event = None self._uvicorn_server = None self._is_running = False logger.info("Uvicorn thread server stopped") # --- Mode 3: subprocess (uvicorn / gunicorn) using run_uvicorn_subprocess or run_gunicorn --- async def _start_serving_process(self): if self.is_running(): raise RuntimeError("Server process is already running. Stopping it first.") host = self._ensure_host() port = self._ensure_port() try: ctx = multiprocessing.get_context("fork") except ValueError as e: raise RuntimeError( "Process launch requires 'fork' start method (Linux/macOS). " "On Windows, use 'thread' or 'asyncio' modes." ) from e self._mp_event_queue = ctx.Queue() # Gunicorn path when n_workers > 1 if self.args.n_workers > 1: logger.info(f"Starting Gunicorn server...") options = { "bind": f"{host}:{port}", "workers": int(self.args.n_workers), "worker_class": "uvicorn_worker.UvicornWorker", "loglevel": logging.getLevelName(self.args.log_level).lower(), "accesslog": "-" if self.args.access_log else None, "errorlog": "-", "preload_app": True, "graceful_timeout": int( self.args.process_join_timeout / 2 ), # Allow half the timeout for graceful shutdown } if "PROMETHEUS_MULTIPROC_DIR" in os.environ: from agentlightning.utils.metrics import shutdown_metrics options["child_exit"] = shutdown_metrics # type: ignore self._gunicorn_app = GunicornApp(self.app, options) self._proc = ctx.Process( target=run_gunicorn, kwargs={ "gunicorn_app": self._gunicorn_app, "serve_context": self._ctx(), "event_queue": self._mp_event_queue, "timeout": self.args.startup_timeout, "health_url": self.health_url, }, daemon=False, ) self._proc.start() else: # Single-worker subprocess uvicorn logger.info("Starting uvicorn subprocess server...") self._uvicorn_server = self._create_uvicorn_server() self._proc = ctx.Process( target=run_uvicorn_subprocess, kwargs={ "uvicorn_server": self._uvicorn_server, "serve_context": self._ctx(), "event_queue": self._mp_event_queue, "timeout": self.args.startup_timeout, "health_url": self.health_url, }, daemon=True, ) self._proc.start() # Wait for ready or error event from the thread timeout = self.args.startup_timeout * 2 # Allows twice the timeout for the thread to get the event try: evt: ChildEvent = await asyncio.to_thread(self._mp_event_queue.get, True, timeout) except queue.Empty: if not self._proc.is_alive(): raise RuntimeError("Server process failed to start and is not alive. No error event was received.") logger.error( "Server process failed to start and sends no event. This should not happen. Shutting down server." ) await self._stop_serving_process() raise RuntimeError("Server process failed to start and sends no event. This should not happen.") if evt.kind == "error": logger.error( "Server process (%s) failed to start (%s): %s\n%s", "gunicorn" if self.args.n_workers > 1 else "uvicorn", evt.exc_type, evt.message, evt.traceback, ) await asyncio.to_thread(self._proc.join, self.args.process_join_timeout) if self._proc.is_alive(): logger.error("Server process failed to start and refused to shut down.") raise RuntimeError(evt.message) else: logger.info("Subprocess server started successfully.") self._is_running = True async def _stop_serving_process(self): logger.info("Stopping subprocess server...") if self._proc is not None: if self._proc.is_alive(): # Prefer graceful: SIGTERM, then wait try: self._proc.terminate() except Exception: logger.exception("Error sending SIGTERM to server process.") await asyncio.to_thread(self._proc.join, self.args.process_join_timeout) if self._proc.is_alive(): # Still alive, send SIGKILL try: self._proc.kill() except Exception: logger.exception("Error sending SIGKILL to server process.") await asyncio.to_thread(self._proc.join, 5.0) # Use a constant timeout for SIGKILL if self._proc.is_alive(): raise RuntimeError("Server process failed to shut down after SIGTERM and SIGKILL.") else: logger.info("Subprocess server was not running. Nothing to stop.") if self._mp_event_queue is not None: self._mp_event_queue.close() try: self._mp_event_queue.join_thread() except Exception: logger.exception("Error joining event queue thread.") self._proc = None self._mp_event_queue = None self._gunicorn_app = None self._uvicorn_server = None self._is_running = False logger.info("Subprocess server stopped") ================================================ FILE: agentlightning/utils/system_snapshot.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import platform import socket from contextlib import suppress from datetime import datetime from typing import Any, Dict, List, cast import psutil from gpustat import GPUStat, GPUStatCollection def system_snapshot(include_gpu: bool = False) -> Dict[str, Any]: """Capture a snapshot of the system's hardware and software information. Args: include_gpu: Whether to include GPU information. Returns: A dictionary containing the system's hardware and software information. """ # CPU cpu = { "cpu_name": platform.processor(), "cpu_cores": psutil.cpu_count(logical=False), "cpu_threads": psutil.cpu_count(logical=True), "cpu_usage_pct": psutil.cpu_percent(0.0), } # Memory vm = psutil.virtual_memory() mem = { "mem_used_gb": round(vm.used / (2**30), 2), "mem_total_gb": round(vm.total / (2**30), 2), "mem_pct": vm.percent, } # Disk du = psutil.disk_usage("/") disk = { "disk_used_gb": round(du.used / (2**30), 2), "disk_total_gb": round(du.total / (2**30), 2), "disk_pct": du.percent, } # GPU (only query if explicitly requested) gpus: List[Dict[str, Any]] = [] if include_gpu: with suppress(Exception): for g in GPUStatCollection.new_query().gpus: # type: ignore g = cast(GPUStat, g) gpus.append( { "gpu": g.name, # type: ignore "util_pct": g.utilization, "mem_used_mb": g.memory_used, "mem_total_mb": g.memory_total, "temp_c": g.temperature, } ) # Network net = psutil.net_io_counters() netinfo = { "bytes_sent_mb": round(net.bytes_sent / (2**20), 2), "bytes_recv_mb": round(net.bytes_recv / (2**20), 2), } # OS / meta return { "timestamp": datetime.now().isoformat(timespec="seconds"), "host": socket.gethostname(), "os": platform.platform(), **cpu, **mem, **disk, **netinfo, **({"gpus": gpus} if include_gpu else {}), } ================================================ FILE: agentlightning/verl/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This package contains a *hacky* integration of VERL with Agent Lightning.""" from .daemon import * from .dataset import * from .entrypoint import * from .trainer import * ================================================ FILE: agentlightning/verl/__main__.py ================================================ # Copyright (c) Microsoft. All rights reserved. from .entrypoint import main if __name__ == "__main__": main() ================================================ FILE: agentlightning/verl/async_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. # type: ignore from copy import deepcopy import ray from starlette.requests import Request from starlette.responses import JSONResponse, StreamingResponse from verl.workers.rollout.vllm_rollout.vllm_async_server import AsyncvLLMServer from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ErrorResponse from agentlightning.instrumentation.vllm import ChatCompletionResponsePatched, instrument_vllm def _unwrap_ray_remote(cls): if hasattr(cls, "__ray_actor_class__"): cls = cls.__ray_actor_class__ return cls @ray.remote(num_cpus=1) class PatchedvLLMServer(_unwrap_ray_remote(AsyncvLLMServer)): def __init__(self, *args, **kwargs): instrument_vllm() super().__init__(*args, **kwargs) self.config = deepcopy(self.config) self.config.rollout.multi_turn.tool_config_path = "/dev/null" async def chat_completion(self, raw_request: Request): """OpenAI-compatible HTTP endpoint. API reference: [OpenAI-compatible server documentation](https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html) """ request_json = await raw_request.json() request = ChatCompletionRequest(**request_json) generator = await self.openai_serving_chat.create_chat_completion(request, raw_request) if isinstance(generator, ErrorResponse): return JSONResponse(content=generator.model_dump(), status_code=generator.code) if request.stream: return StreamingResponse(content=generator, media_type="text/event-stream") else: return JSONResponse(content=generator.model_dump()) ================================================ FILE: agentlightning/verl/config.yaml ================================================ hydra: searchpath: - pkg://verl/trainer/config defaults: - ppo_trainer - _self_ agentlightning: port: 9999 trace_aggregator: level: transition # transition or trajectory, docs refer to https://agent-lightning.github.io/posts/trajectory_level_aggregation/ trajectory_max_prompt_length: 2048 # supported in trajectory level aggregation, suggest to set as maximum length for the prompt in first turn trajectory_max_response_length: 8192 # supported in trajectory level aggregation, suggest to set as maximum length for the cumulative agent responses in the full trajectory, i.e., n_turns * (max_response_length + max_prompt_length) debug: False # supported in trajectory level aggregation, enable to diagnose trace merging failures mismatch_log_dir: ./mismatch_cases # supported in trajectory level aggregation with debug=True, directory to store logs of mismatch cases data: filter_overlong_prompts: false actor_rollout_ref: rollout: mode: async agent: custom_async_server: path: pkg://agentlightning.verl.async_server name: PatchedvLLMServer ================================================ FILE: agentlightning/verl/daemon.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import json import os import random import socket import threading import time import uuid from collections import defaultdict from collections.abc import Mapping from typing import Any, Dict, List, Literal, Optional, Tuple, cast import numpy as np import requests import torch from flask import Flask, Response, abort, request from tensordict import TensorDict from verl import DataProto from agentlightning import LLM, AgentLightningServer, NamedResources, RolloutLegacy from agentlightning.adapter.triplet import TracerTraceToTriplet, TraceToTripletBase from agentlightning.llm_proxy import LLMProxy, ModelConfig from agentlightning.store.base import LightningStore from agentlightning.types import EnqueueRolloutRequest, Rollout, RolloutConfig, Task __all__ = [ "AgentModeDaemon", "get_left_padded_ids_and_attention_mask", "get_right_padded_ids_and_attention_mask", ] def ids_startswith( full_ids: List[int], prefix_ids: List[int], tokenizer: Any, debug: bool = False ) -> Tuple[bool, Tuple[bool, bool, bool]]: is_prefix: bool template_mismatch, retoken_mismatch, others_mismatch = False, False, False if full_ids[: len(prefix_ids)] == prefix_ids: is_prefix = True return True, (template_mismatch, retoken_mismatch, others_mismatch) else: is_prefix = False if not debug: return is_prefix, (template_mismatch, retoken_mismatch, others_mismatch) def _special_token_sequence(ids: List[int]) -> List[int]: return [id for id in ids if id in tokenizer.all_special_ids] def _none_special_token_sequence(ids: List[int]) -> List[int]: return [id for id in ids if id not in tokenizer.all_special_ids] # First, handle special tokens full_special_ids = _special_token_sequence(full_ids) prefix_special_ids = _special_token_sequence(prefix_ids) if sum(1 for a, b in zip(full_special_ids, prefix_special_ids) if a != b) > 0: template_mismatch = True # Next, handle string content full_content_ids = _none_special_token_sequence(full_ids) prefix_content_ids = _none_special_token_sequence(prefix_ids) full_string = tokenizer.decode(full_ids, skip_special_tokens=True) prefix_string = tokenizer.decode(prefix_ids, skip_special_tokens=True) if full_content_ids[: len(prefix_content_ids)] != prefix_content_ids and full_string.startswith(prefix_string): retoken_mismatch = True elif full_content_ids[: len(prefix_content_ids)] != prefix_content_ids and not full_string.startswith( prefix_string ): others_mismatch = True return is_prefix, (template_mismatch, retoken_mismatch, others_mismatch) def log_mismatch_detail( diagnostic: Tuple[bool, bool, bool], full_ids: List[int], prefix_ids: List[int], global_steps: int, rollout_id: str, turn_id: int, log_dir: str | None = None, ): if log_dir is None: return os.makedirs(log_dir, exist_ok=True) template_mismatch, retoken_mismatch, others_mismatch = diagnostic if template_mismatch: with open(os.path.join(log_dir, "template_mismatch.log"), "a+") as f: print( "-" * 10 + f" Global Steps: {global_steps}, Rollout ID: {rollout_id}, Turn ID: {turn_id} " + "-" * 10, file=f, ) print(full_ids, file=f) print(prefix_ids, file=f) if retoken_mismatch: with open(os.path.join(log_dir, "retoken_mismatch.log"), "a+") as f: print( "-" * 10 + f" Global Steps: {global_steps}, Rollout ID: {rollout_id}, Turn ID: {turn_id} " + "-" * 10, file=f, ) print(full_ids, file=f) print(prefix_ids, file=f) if others_mismatch: with open(os.path.join(log_dir, "others_mismatch.log"), "a+") as f: print( "-" * 10 + f" Global Steps: {global_steps}, Rollout ID: {rollout_id}, Turn ID: {turn_id} " + "-" * 10, file=f, ) print(full_ids, file=f) print(prefix_ids, file=f) def get_left_padded_ids_and_attention_mask( ids: List[int], max_length: int, pad_token_id: int ) -> Tuple[List[int], List[int]]: """ Left-pad (or truncate) a sequence of token IDs to a fixed length, and build the corresponding attention mask. Args: ids: the original list of token IDs. max_length: desired total length after padding/truncation. pad_token_id: ID to use for padding. Returns: padded_ids (any): list of length == max_length. attention_mask (any): list of same length: 1 for non-pad tokens, 0 for pads. """ seq_len = len(ids) if seq_len >= max_length: # too long → truncate from the left, keep the last max_length tokens trimmed = ids[-max_length:] attention_mask = [1] * max_length return trimmed, attention_mask # too short → pad on the left pad_len = max_length - seq_len padded_ids = [pad_token_id] * pad_len + ids attention_mask = [0] * pad_len + [1] * seq_len return padded_ids, attention_mask def get_right_padded_ids_and_attention_mask( ids: List[int], max_length: int, pad_token_id: int ) -> Tuple[List[int], List[int]]: """ Right-pad (or truncate) a sequence of token IDs to a fixed length, and build the corresponding attention mask. Args: ids: the original list of token IDs. max_length: desired total length after padding/truncation. pad_token_id: ID to use for padding. Returns: padded_ids (any): list of length == max_length. attention_mask (any): list of same length: 1 for non-pad tokens, 0 for pads. """ seq_len = len(ids) if seq_len >= max_length: # too long → truncate to the first max_length tokens trimmed = ids[:max_length] attention_mask = [1] * max_length return trimmed, attention_mask # too short → pad on the right pad_len = max_length - seq_len padded_ids = ids + [pad_token_id] * pad_len attention_mask = [1] * seq_len + [0] * pad_len return padded_ids, attention_mask def _find_available_port() -> int: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("", 0)) return s.getsockname()[1] def _to_native(obj: Any) -> Any: """Convert data retrieved from Parquet to data usable in AGL server.""" # 1) Arrays -> list (then recurse) if isinstance(obj, np.ndarray): return _to_native(obj.tolist()) # 2) NumPy scalar types -> Python scalars if isinstance(obj, np.generic): return _to_native(obj.item()) # 3) Dict-like -> dict if isinstance(obj, Mapping): return {_to_native(k): _to_native(v) for k, v in obj.items()} # type: ignore # 4) Lists/Tuples/Sets -> list if isinstance(obj, (list, tuple, set)): return [_to_native(x) for x in obj] # type: ignore # 5) Anything else: leave as-is return obj class AgentModeDaemon: """ AgentModeDaemon using the AgentLightningServer SDK. This class manages the server lifecycle, task queueing, and results retrieval, while also running a proxy server for LLM requests. It maintains the original interface for compatibility with the RayPPOTrainer. """ def __init__( self, port: Optional[int], train_rollout_n: int, train_information: Dict[str, Any], tokenizer: Any, mini_batch_size: int, pad_token_id: int, reward_fillna_value: float = 0.0, llm_timeout_seconds: float = 1200.0, mode: Literal["v0", "v1"] = "v1", llm_proxy: LLMProxy | None = None, store: LightningStore | None = None, adapter: TraceToTripletBase | None = None, processor: Any = None, image_base_dir: Optional[str] = None, trace_aggregator: Dict[str, Any] = {"level": "transition"}, ): self.mode = mode self.llm_timeout_seconds = llm_timeout_seconds # Server and Task Configuration if mode == "v0": assert port is not None self.server_port = port self.server = AgentLightningServer( host="0.0.0.0", port=self.server_port, task_timeout_seconds=self.llm_timeout_seconds ) self.proxy_port = _find_available_port() # Run proxy on a different port else: assert store is not None self.store = store if llm_proxy is None: self.llm_proxy = LLMProxy( port=_find_available_port(), model_list=[], store=store, ) else: # Reuse the existing LLM proxy (probably configured by user) self.llm_proxy = llm_proxy if adapter is None: self.adapter = TracerTraceToTriplet() else: # Reuse the one from trainer self.adapter = adapter self._internal_loop: Optional[asyncio.AbstractEventLoop] = None self._internal_loop_thread = threading.Thread(target=self._internal_loop_runner, daemon=True) self._internal_loop_thread.start() # Training and Data Configuration self.train_rollout_n = train_rollout_n self.train_information = train_information self.mini_batch_size = mini_batch_size self.pad_token_id = pad_token_id self.tokenizer = tokenizer self.processor = processor self.reward_fillna_value = reward_fillna_value self.image_base_dir = image_base_dir self.trace_aggregator = trace_aggregator # Check if model requires multimodal position_ids (e.g., Qwen2-VL) self._use_mrope = self._is_mrope_model() # Internal State self.backend_llm_server_addresses: List[str] = [] self._total_tasks_queued = 0 self._completed_rollouts_v0: Dict[str, RolloutLegacy] = {} self._task_id_to_original_sample: Dict[str, Dict[str, Any]] = {} self._server_thread: Optional[threading.Thread] = None self._proxy_thread: Optional[threading.Thread] = None self.is_train = True def _internal_loop_runner(self): """Run the internal loop.""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) self._internal_loop = loop loop.run_forever() loop.close() # Multimodal utilities for M-RoPE position embeddings def _is_mrope_model(self) -> bool: """Check if processor requires M-RoPE position embeddings.""" if self.processor is None or not hasattr(self.processor, "image_processor"): return False name = self.processor.image_processor.__class__.__name__ return "Qwen2VLImageProcessor" in name or "Qwen3VLImageProcessor" in name def _resolve_image_path(self, path: str) -> str: """Resolve relative image path with base directory.""" import os if os.path.isabs(path): return path if self.image_base_dir is None: raise ValueError(f"Relative path '{path}' requires 'image_base_dir' to be set.") return os.path.join(self.image_base_dir, path) def _get_image_grid_thw(self, image_urls: List[str]) -> Optional[torch.Tensor]: """Compute image_grid_thw from image URLs for M-RoPE computation. Args: image_urls: List of image URLs extracted from triplet prompt payload. URLs can be http(s):// URLs or file:// URIs, or data: URIs. """ from PIL import Image from verl.utils.dataset.vision_utils import process_image # pyright: ignore[reportUnknownVariableType] if self.processor is None or not image_urls: return None def to_image_uri(url: str) -> str: # Already a proper URI (http, https, file, data) if url.startswith(("http://", "https://", "file://", "data:")): return url # Treat as a file path that needs resolution resolved = self._resolve_image_path(url) return f"file://{resolved}" images: List[Image.Image] = [process_image({"image": to_image_uri(url)}) for url in image_urls] model_inputs = self.processor(text=["dummy"], images=images, return_tensors="pt") return model_inputs.get("image_grid_thw") def _compute_mrope_position_ids( self, input_ids: torch.Tensor, attention_mask: torch.Tensor, image_grid_thw: Optional[torch.Tensor] = None, ) -> torch.Tensor: """Compute 4D position_ids for M-RoPE models.""" from typing import Callable get_rope_index: Callable[..., torch.Tensor] if "Qwen3VL" in self.processor.__class__.__name__: from verl.models.transformers.qwen3_vl import get_rope_index # pyright: ignore[reportUnknownVariableType] else: from verl.models.transformers.qwen2_vl import get_rope_index # pyright: ignore[reportUnknownVariableType] vision_pos = get_rope_index( self.processor, input_ids=input_ids, image_grid_thw=image_grid_thw, attention_mask=attention_mask ) valid_mask = attention_mask.bool() text_pos = torch.zeros((1, len(input_ids)), dtype=torch.long, device=input_ids.device) text_pos[0, valid_mask] = torch.arange(valid_mask.sum().item(), device=input_ids.device) return torch.cat([text_pos, vision_pos], dim=0) def _start_proxy_server_v0(self): """ Initializes and runs a Flask-based proxy server in a separate thread. This proxy load-balances requests to the actual backend LLM servers. """ app = Flask(__name__) num_requests = 0 last_request_time = 0 @app.route("/v1/", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]) def proxy(path: str): # type: ignore if not self.backend_llm_server_addresses: abort(503, description="No backend LLM servers available.") # Randomly choose a backend server for load balancing target_server = random.choice(self.backend_llm_server_addresses) target_url = f"http://{target_server}/v1/{path}" # Copy client request headers, removing the Host header headers = {key: value for key, value in request.headers if key.lower() != "host"} # Log the request for debugging nonlocal num_requests, last_request_time current_time = time.time() num_requests += 1 if current_time - last_request_time > 60 or num_requests == 1 or num_requests % 100 == 0: print(f"Proxying {request.method} request to {target_server}. Request data: {request.get_data()}") last_request_time = current_time try: # Forward the request to the target backend resp = requests.request( method=request.method, url=target_url, headers=headers, params=request.args, # type: ignore data=request.get_data(), cookies=request.cookies, allow_redirects=False, timeout=self.llm_timeout_seconds, ) # Filter out hop-by-hop headers before returning the response excluded_headers = [ "content-encoding", "content-length", "transfer-encoding", "connection", "keep-alive", "proxy-authenticate", "proxy-authorization", "te", "trailers", "upgrade", ] response_headers = [ (name, value) for name, value in resp.raw.headers.items() if name.lower() not in excluded_headers ] if resp.status_code == 200: # NOTE: from Zhiyuan's code. # https://github.com/hzy46/verl_agent_mode/blob/2db65ea9858f645a914120357412a7540f8bd82d/verl/trainer/ppo/ray_trainer.py#L692-L711 # request_json = json.loads(request.get_data().decode("utf-8")) response_json = json.loads(resp.content.decode("utf-8")) # response_message = ChatCompletion(**response_json).choices[0].message.model_dump(exclude_unset=True, exclude_none=True) # tool_schemas = request_json.get("tools", None) # prompt_ids = self.tokenizer.apply_chat_template(request_json["messages"], tools=tool_schemas, add_generation_prompt=True, tokenize=True) # full_ids = self.tokenizer.apply_chat_template(request_json["messages"] + [response_message], tools=tool_schemas, add_generation_prompt=False, tokenize=True) # TBD: response_ids sometimes ends with "\n", shall we keep the extra "\n"? # sometimes it has some differences with the hacky method in the end, but this should align with ToolCompletionCallback # response_ids = full_ids[len(prompt_ids):] # NOTE (yuge): They are different. Don't know why. # assert response_json['prompt_token_ids'] == prompt_ids # patched_response_ids = response_json['response_token_ids'][0] # assert patched_response_ids == response_ids[:len(patched_response_ids)], f"{patched_response_ids} != {response_ids[:len(patched_response_ids)]}" # response_json['prompt_token_ids'] = prompt_ids # response_json['response_token_ids'] = [response_ids] replaced_return_content = json.dumps(response_json).encode("utf-8") return Response(replaced_return_content, status=resp.status_code, headers=response_headers) return Response(resp.content, resp.status_code, response_headers) except requests.exceptions.RequestException as e: abort(500, description=f"Error proxying request: {e}") def run_app(): app.run(host="0.0.0.0", port=self.proxy_port, threaded=True, debug=False) self._proxy_thread = threading.Thread(target=run_app, daemon=True) self._proxy_thread.start() print(f"Proxy server running on port {self.proxy_port}") async def _update_proxy_server_v1(self): model_name = self.train_information.get("model") if not model_name: raise ValueError("Model name is not set.") self.llm_proxy.update_model_list( [ ModelConfig( { "model_name": model_name, "litellm_params": { "model": "hosted_vllm/" + model_name, "api_base": f"http://{address}/v1/", }, } ) for address in self.backend_llm_server_addresses ], ) await self.llm_proxy.restart() def start(self): """Starts the main AgentLightningServer and the proxy server.""" if self.mode == "v0": def run_server(): """Run the AgentLightningServer in a separate thread.""" asyncio.run(self.server.run_forever()) self._server_thread = threading.Thread(target=run_server, daemon=True) self._server_thread.start() # Wait for the server's internal startup event to be set. print("Waiting for AgentLightningServer to start...") is_ready = self.server.startup_event.wait(timeout=20.0) # Wait up to 20s if not is_ready: raise RuntimeError("AgentLightningServer failed to start within the timeout period.") print(f"AgentLightningServer control plane running on port {self.server_port}") self._start_proxy_server_v0() else: # Agent lightning server is no longer needed; # Start proxy server in _async_set_up pass async def _async_set_up(self, data: Dict[str, Any], server_addresses: List[str], is_train: bool = True): """Async helper to set up data and resources on the server.""" self.clear_data_and_server() if server_addresses != self.backend_llm_server_addresses: self.backend_llm_server_addresses = server_addresses if self.mode == "v1" and not self.llm_proxy.is_running(): await self._update_proxy_server_v1() self.is_train = is_train # 1. Update resources on the server for clients to use if self.mode == "v0": llm_resource = LLM( endpoint=f"http://127.0.0.1:{self.proxy_port}/v1", model=self.train_information.get("model", "default-model"), sampling_parameters={ "temperature": self.train_information.get("temperature", 0.7 if is_train else 0.0) }, ) else: llm_resource = self.llm_proxy.as_resource( sampling_parameters={ "temperature": self.train_information.get("temperature", 0.7 if is_train else 0.0) }, ) resources: NamedResources = {"main_llm": llm_resource} if self.mode == "v0": resources_id = await self.server.update_resources(resources) else: resources_update = await self.store.add_resources(resources) resources_id = resources_update.resources_id # 2. Queue tasks for agents to process keys = list(data.keys()) num_samples = len(data[keys[0]]) rollouts_per_sample = self.train_rollout_n if is_train else 1 enqueue_rollout_requests: List[EnqueueRolloutRequest] = [] data_id_to_original_sample: Dict[str, Dict[str, Any]] = {} for i in range(num_samples): data_id = str(uuid.uuid4()) original_sample = {key: data[key][i] for key in keys} original_sample["data_id"] = data_id data_id_to_original_sample[data_id] = original_sample # For training, each sample is rolled out multiple times # Data ID is different from Rollout ID, as one data can have multiple rollouts. for _ in range(rollouts_per_sample): task_metadata = {"data_id": data_id, "is_train": is_train} if self.mode == "v0": # Queue immediately rollout_id = await self.server.queue_task( sample=_to_native(original_sample), mode="train" if is_train else "val", resources_id=resources_id, metadata=task_metadata, ) # Store original sample data to reconstruct batch information later self._task_id_to_original_sample[rollout_id] = original_sample self._total_tasks_queued += 1 else: # Collect tasks to enqueue in batch and queue them later enqueue_rollout_requests.append( EnqueueRolloutRequest( input=_to_native(original_sample), mode="train" if is_train else "val", resources_id=resources_id, config=RolloutConfig( unresponsive_seconds=self.llm_timeout_seconds, timeout_seconds=self.llm_timeout_seconds, ), metadata=task_metadata, ) ) if self.mode == "v1": # Enqueue all the tasks in a single batch rollouts = await self.store.enqueue_many_rollouts(enqueue_rollout_requests) self._task_id_to_original_sample.update( { # Recover the original data and store it for later use. rollout.rollout_id: data_id_to_original_sample[cast(Dict[str, Any], rollout.metadata)["data_id"]] for rollout in rollouts } ) self._total_tasks_queued += len(rollouts) def set_up_data_and_server(self, data: Dict[str, Any], server_addresses: List[str], is_train: bool = True): """Synchronous wrapper for setting up data and server resources.""" coro = self._async_set_up(data, server_addresses, is_train) if self.mode == "v0": if not self.server.loop or not self.server.startup_event.is_set(): raise RuntimeError("Server is not running or ready.") future = asyncio.run_coroutine_threadsafe(coro, self.server.loop) else: if self._internal_loop is None: raise RuntimeError("Internal loop is not running.") future = asyncio.run_coroutine_threadsafe(coro, self._internal_loop) try: future.result(timeout=300) # Wait for completion with a timeout except Exception as e: print(f"Failed to set up data on server: {e}") raise def _validate_data(self, rollout: RolloutLegacy): if rollout.final_reward is None: print( f"Warning: Reward is None for rollout {rollout.rollout_id}, will be auto-set to {self.reward_fillna_value}." ) if rollout.triplets is None: print(f"Warning: Triplet is None for rollout {rollout.rollout_id}.") elif len(rollout.triplets) == 0: print(f"Warning: Length of triplets is 0 for rollout {rollout.rollout_id}.") elif any(not r.response.get("token_ids", []) for r in rollout.triplets): print(f"Warning: Rollout {rollout.rollout_id} contains empty response: {rollout.triplets}") elif any(not r.prompt.get("token_ids", []) for r in rollout.triplets): print(f"Warning: Rollout {rollout.rollout_id} contains empty prompt: {rollout.triplets}") async def _validate_data_v1(self, rollout: Rollout) -> RolloutLegacy: """Convert Rollout to RolloutLegacy and validate. 1. Task: construct from Rollout 2. Triplets: obtained by querying spans and feeding into the adapter 3. Final reward: extracted from last triplet's reward, searching backwards if not found """ # Query spans for this rollout (latest attempt) spans = await self.store.query_spans(rollout.rollout_id, attempt_id="latest") # Convert spans to triplets using the adapter if not spans: # No triplets found, will emit a warning later. triplets = [] else: triplets = self.adapter.adapt(spans) # Extract final reward from triplets final_reward: Optional[float] = None if triplets: # Search backwards through triplets for the first non-None reward for triplet in reversed(triplets): if triplet.reward is not None: final_reward = triplet.reward break # Construct the Task object from Rollout task = Task( rollout_id=rollout.rollout_id, input=rollout.input, mode=rollout.mode, resources_id=rollout.resources_id, metadata=rollout.metadata or {}, ) # Create the Rollout object (without trace and logs as per user's note) result_rollout = RolloutLegacy( rollout_id=rollout.rollout_id, task=task, final_reward=final_reward, triplets=triplets, metadata=rollout.metadata or {}, ) # Run the same validation as v0 self._validate_data(result_rollout) return result_rollout async def _async_run_until_finished(self, verbose: bool = True): """Async helper to wait for all tasks to complete.""" while len(self._completed_rollouts_v0) < self._total_tasks_queued: if self.mode == "v0": completed_batch = await self.server.retrieve_completed_rollouts() else: completed_batch = await self.store.wait_for_rollouts( rollout_ids=list(self._task_id_to_original_sample.keys()), timeout=0 ) for rollout in completed_batch: if rollout.rollout_id in self._completed_rollouts_v0: # Already processed, skip continue if isinstance(rollout, Rollout): rollout = await self._validate_data_v1(rollout) else: self._validate_data(rollout) if rollout.rollout_id not in self._task_id_to_original_sample: print(f"Warning: Received unknown rollout ID {rollout.rollout_id}, skipping.") else: self._completed_rollouts_v0[rollout.rollout_id] = rollout if verbose: print(f"Completed {len(self._completed_rollouts_v0)}/{self._total_tasks_queued} tasks...") await asyncio.sleep(5) print("All tasks finished.") def run_until_all_finished(self, verbose: bool = True): """Synchronously waits for all queued tasks to be completed and reported.""" if self._total_tasks_queued == 0: print("Warning: No tasks were queued.") return if self.mode == "v0": if not self.server.loop or not self.server.startup_event.is_set(): raise RuntimeError("Server is not running or ready.") loop = self.server.loop else: loop = self._internal_loop assert loop is not None coro = self._async_run_until_finished(verbose) future = asyncio.run_coroutine_threadsafe(coro, loop) try: future.result() # Wait indefinitely for all tasks to complete except Exception as e: print(f"Error while waiting for tasks to finish: {e}") raise def get_test_metrics(self): """Calculates and returns metrics for a validation run.""" assert not self.is_train, "This method should only be called during validation." assert len(self._completed_rollouts_v0) == self._total_tasks_queued sample_stat_list: List[Dict[str, Any]] = [] sample_stat_list_by_source: Dict[str, List[Dict[str, Any]]] = defaultdict( list ) # FIXME: Evaluate whether grouping stats by source is actually needed. for rollout_id, rollout in self._completed_rollouts_v0.items(): final_reward_raw: Optional[float] = rollout.final_reward final_reward = self._fillna_reward(rollout) if not rollout.triplets: print(f"Warning: No triplets found for test rollout {rollout.rollout_id}.") sample_stat_list.append({"reward": final_reward, "has_reward": final_reward_raw is not None}) continue response_length_list = [len(triplet.response.get("token_ids", [])) for triplet in rollout.triplets] if "data_source" in self._task_id_to_original_sample[rollout_id]: # When a test sample includes a 'data_source' field, record per-source statistics for test results. # TODO: This is a flawed design. We should have a better way to handle this. data_source = self._task_id_to_original_sample[rollout_id]["data_source"] sample_stat_list_by_source[data_source].append( { "sum_response_length": np.sum(response_length_list), "mean_response_length": np.mean(response_length_list) if response_length_list else 0, "turn_count": len(rollout.triplets), "reward": final_reward, "has_reward": final_reward_raw is not None, } ) sample_stat_list.append( { "sum_response_length": np.sum(response_length_list), "mean_response_length": np.mean(response_length_list) if response_length_list else 0, "turn_count": len(rollout.triplets), "reward": final_reward, "has_reward": final_reward_raw is not None, } ) metric_dict: Dict[str, Any] = {} stats_w_trace = [stat for stat in sample_stat_list if "sum_response_length" in stat] stats_w_trace_by_source = { data_source: [stat for stat in sample_stats if "sum_response_length" in stat] for data_source, sample_stats in sample_stat_list_by_source.items() } for data_source, sample_stats in sample_stat_list_by_source.items(): metric_dict.update( { f"val/{data_source}/n_rollouts": len(sample_stats), f"val/{data_source}/n_rollouts_w_trace": len(stats_w_trace_by_source[data_source]), f"val/{data_source}/n_rollouts_w_reward": len( [stat for stat in sample_stats if stat["has_reward"]] ), f"val/{data_source}/reward": np.mean( [stat["reward"] for stat in sample_stats] ), # each rollout must have a reward (fillna if missing) f"val/{data_source}/mean_response_length": np.mean( [stat["mean_response_length"] for stat in stats_w_trace_by_source[data_source]] ), f"val/{data_source}/sum_response_length": np.mean( [stat["sum_response_length"] for stat in stats_w_trace_by_source[data_source]] ), f"val/{data_source}/turn_count": np.mean( [stat["turn_count"] for stat in stats_w_trace_by_source[data_source]] ), } ) metric_dict.update( { "val/n_rollouts": len(sample_stat_list), "val/n_rollouts_w_trace": len(stats_w_trace), "val/n_rollouts_w_reward": len([stat for stat in sample_stat_list if stat["has_reward"]]), "val/reward": np.mean( [stat["reward"] for stat in sample_stat_list] ), # each rollout must have a reward (fillna if missing) "val/mean_response_length": np.mean([stat["mean_response_length"] for stat in stats_w_trace]), "val/sum_response_length": np.mean([stat["sum_response_length"] for stat in stats_w_trace]), "val/turn_count": np.mean([stat["turn_count"] for stat in stats_w_trace]), } ) return metric_dict def get_train_data_batch( self, max_prompt_length: int, max_response_length: int, device: torch.device, global_steps: int ): """ Processes completed rollouts to generate a training data batch. This function reconstructs the logic from the original AgentModeDaemon, using data retrieved from the new server architecture. It handles padding, truncation, and tensor creation for the PPO training loop. """ assert self.is_train, "This method should only be called during training." assert len(self._completed_rollouts_v0) == self._total_tasks_queued # 1. Reconstruct the `finished_id_to_sample_info` structure from completed rollouts finished_id_to_sample_info: Dict[str, Dict[str, Any]] = {} finished_id_to_final_reward: Dict[str, float] = {} sample_with_reward_count = 0 for rollout_id, rollout in self._completed_rollouts_v0.items(): original_sample = self._task_id_to_original_sample[rollout_id] sample_with_reward_count += int(rollout.final_reward is not None) final_reward = self._fillna_reward(rollout) if not rollout.triplets: finished_id_to_final_reward[rollout_id] = final_reward print(f"Warning: No triplets found for training rollout {rollout.rollout_id}, skipping.") continue # The client should report triplets that contain prompt_ids and response_ids. # Example triplet.prompt: {"token_ids": [...], "image_urls": [...]} # Example triplet.response: {"token_ids": [...]} trace_list = [ { "prompt_ids": t.prompt.get("token_ids", []), "response_ids": t.response.get("token_ids", []), "image_urls": t.prompt.get("image_urls", []), } for t in rollout.triplets ] info = { "reward": final_reward, "trace_list": trace_list, "data_id": original_sample["data_id"], } finished_id_to_sample_info[rollout_id] = info finished_id_to_final_reward[rollout_id] = final_reward # # --- Data processing and tensor creation logic --- # Get all the reported data. # prompt_ids are left-padded. # response_ids are right-padded. # They are concatenated in the middle. # Discard handling: # - Those exceeding max_prompt_length will be marked for discard, but not # discarded here. They are only truncated and marked, to be discarded later. # This is for the correctness of the advantage calculation. # - The discard for the PPO mini-batch should also be handled this way. input_ids_list: List[List[int]] = [] input_attention_mask_list: List[List[int]] = [] response_ids_list: List[List[int]] = [] response_attention_mask_list: List[List[int]] = [] reward_list: List[float] = [] data_id_list: List[str] = [] rollout_id_list: List[str] = [] turn_index_list: List[int] = [] is_drop_list: List[bool] = [] image_grid_thw_list: List[Optional[torch.Tensor]] = [] # For Qwen2-VL mrope n_trunc_sample_because_of_response = 0 if self.trace_aggregator.get("level", "transition") == "transition": for rollout_id, sample_info in finished_id_to_sample_info.items(): for turn_index, trace in enumerate(sample_info["trace_list"]): reward_list.append(sample_info["reward"]) prompt_ids, response_ids = trace["prompt_ids"], trace["response_ids"] # Mark samples with prompts exceeding max_prompt_length to be dropped later if len(prompt_ids) > max_prompt_length: prompt_ids = prompt_ids[:max_prompt_length] is_drop_list.append(True) else: is_drop_list.append(False) # Truncate responses that exceed max_response_length if len(response_ids) > max_response_length: response_ids = response_ids[:max_response_length] n_trunc_sample_because_of_response += 1 # Pad prompts to the left and responses to the right one_input_ids, one_input_attention_mask = get_left_padded_ids_and_attention_mask( prompt_ids, max_prompt_length, self.pad_token_id ) one_response_ids, one_response_attention_mask = get_right_padded_ids_and_attention_mask( response_ids, max_response_length, self.pad_token_id ) input_ids_list.append(one_input_ids) input_attention_mask_list.append(one_input_attention_mask) response_ids_list.append(one_response_ids) response_attention_mask_list.append(one_response_attention_mask) data_id_list.append(sample_info["data_id"]) rollout_id_list.append(rollout_id) turn_index_list.append(turn_index) # Compute image_grid_thw for this triplet using image_urls from prompt if self._use_mrope: image_urls = trace.get("image_urls", []) image_grid_thw_list.append(self._get_image_grid_thw(image_urls)) elif self.trace_aggregator.get("level", "transition") == "trajectory": assert not self._use_mrope, "M-RoPE is not supported in trajectory level yet." response_mask_list: List[List[int]] = [] unmerged_count: int = 0 template_mismatch_count, retoken_mismatch_count, others_mismatch_count = 0, 0, 0 response_per_turn_list: List[int] = [] for rollout_id, sample_info in finished_id_to_sample_info.items(): merged_trace_idx: List[List[int]] = [] # Identify which turns can be merged based on token ids prefix matching current_merged_trace_idx: List[int] = [] current_context: List[int] = [] for turn_index, trace in enumerate(sample_info["trace_list"]): response_per_turn_list.append(len(trace["response_ids"])) is_prefix, diagnostic = ids_startswith( trace["prompt_ids"] + trace["response_ids"], current_context, self.tokenizer, self.trace_aggregator.get("debug", False), ) if not is_prefix and self.trace_aggregator.get("debug", False) == True: template_mismatch_count += diagnostic[0] retoken_mismatch_count += diagnostic[1] others_mismatch_count += diagnostic[2] log_mismatch_detail( diagnostic, trace["prompt_ids"] + trace["response_ids"], current_context, global_steps, rollout_id, turn_index, self.trace_aggregator.get("mismatch_log_dir", None), ) if is_prefix: current_context = trace["prompt_ids"] + trace["response_ids"] current_merged_trace_idx.append(turn_index) else: merged_trace_idx.append(current_merged_trace_idx) current_merged_trace_idx = [turn_index] current_context = trace["prompt_ids"] + trace["response_ids"] if current_merged_trace_idx not in merged_trace_idx: merged_trace_idx.append(current_merged_trace_idx) if len(merged_trace_idx) > 1: unmerged_count += 1 # Merge all trace segments in merged_trace_idx into training samples for current_merged_trace_idx in merged_trace_idx: prompt_ids = sample_info["trace_list"][current_merged_trace_idx[0]]["prompt_ids"] # if the merged_trace_idx doesn't start with the beginning of the prompt_ids, we need to adjust it if current_merged_trace_idx[0] > 0 and len(prompt_ids) > max_prompt_length: response_ids = prompt_ids[max_prompt_length:] prompt_ids = prompt_ids[:max_prompt_length] response_mask = [1] * len(response_ids) else: response_ids = [] response_mask = [] prompt_length = len(prompt_ids) response_ids += sample_info["trace_list"][current_merged_trace_idx[0]]["response_ids"] response_mask += [1] * len(response_ids) for turn_index in current_merged_trace_idx[1:]: trace = sample_info["trace_list"][turn_index] new_prompt_length = len(trace["prompt_ids"]) - len(response_ids) - prompt_length response_ids += trace["prompt_ids"][-new_prompt_length:] response_ids += trace["response_ids"] response_mask += [0] * new_prompt_length response_mask += [1] * len(trace["response_ids"]) reward_list.append(sample_info["reward"]) # Mark samples with prompts exceeding max_prompt_length to be dropped later if len(prompt_ids) > max_prompt_length: prompt_ids = prompt_ids[:max_prompt_length] is_drop_list.append(True) else: is_drop_list.append(False) # Truncate responses that exceed max_response_length if len(response_ids) > max_response_length: response_ids = response_ids[:max_response_length] response_mask = response_mask[:max_response_length] n_trunc_sample_because_of_response += 1 # Pad prompts to the left and responses to the right one_input_ids, one_input_attention_mask = get_left_padded_ids_and_attention_mask( prompt_ids, max_prompt_length, self.pad_token_id ) one_response_ids, one_response_attention_mask = get_right_padded_ids_and_attention_mask( response_ids, max_response_length, self.pad_token_id ) one_response_mask, _ = get_right_padded_ids_and_attention_mask( response_mask, max_response_length, 0 ) input_ids_list.append(one_input_ids) input_attention_mask_list.append(one_input_attention_mask) response_ids_list.append(one_response_ids) response_attention_mask_list.append(one_response_attention_mask) response_mask_list.append(one_response_mask) data_id_list.append(sample_info["data_id"]) rollout_id_list.append(rollout_id) # turn_index_list.append(current_merged_trace_idx) else: raise ValueError(f"Unknown trace_aggregator level: {self.trace_aggregator.get('level')}") n_transition = len(input_ids_list) batch_input_ids = torch.LongTensor(input_ids_list).to(device) input_attention_mask = torch.LongTensor(input_attention_mask_list).to(device) batch_response_ids = torch.LongTensor(response_ids_list).to(device) response_attention_mask = torch.LongTensor(response_attention_mask_list).to(device) response_mask = ( torch.LongTensor(response_mask_list).to(device) if self.trace_aggregator.get("level", "transition") == "trajectory" else None # type: ignore ) # Concatenate prompts and responses to form the full sequence batch_seq = torch.cat([batch_input_ids, batch_response_ids], dim=-1) attention_mask = torch.cat([input_attention_mask, response_attention_mask], dim=-1) # Compute position_ids - use mrope for Qwen2-VL, standard 2D otherwise if self._use_mrope: # For Qwen2-VL: compute 4D position_ids (batch_size, 4, seq_length) position_ids_list: list[torch.Tensor] = [] for i in range(n_transition): pos_ids = self._compute_mrope_position_ids( input_ids=batch_seq[i], attention_mask=attention_mask[i], image_grid_thw=image_grid_thw_list[i] if image_grid_thw_list else None, ) # (4, seq_length) position_ids_list.append(pos_ids) # Stack to (batch_size, 4, seq_length) position_ids = torch.stack(position_ids_list, dim=0) else: # Standard 2D position_ids (batch_size, seq_length) position_ids = torch.clamp(torch.cumsum(attention_mask, dim=-1) - 1, min=0) is_drop_mask = torch.BoolTensor(is_drop_list).to(device) scores = torch.tensor(reward_list, dtype=torch.bfloat16).to(device) # Create token-level scores by placing the final reward at the last token position token_level_scores = torch.zeros_like(attention_mask, dtype=scores.dtype) # For mrope (3D position_ids), use the first dimension (text position_ids) for eos calculation if self._use_mrope: # position_ids is (batch_size, 4, seq_length), use first dim for text positions text_position_ids = position_ids[:, 0, :] # (batch_size, seq_length) eos_mask_idx = torch.argmax(text_position_ids * attention_mask, dim=-1) # (bsz,) else: eos_mask_idx = torch.argmax(position_ids * attention_mask, dim=-1) # (bsz,) # At the eos_mask_idx position of each sample, fill in the corresponding scores. # torch.arange(n_transition) generates [0,1,2,...,bsz-1] as indices for the batch dimension. token_level_scores[torch.arange(n_transition), eos_mask_idx] = scores # Only take the last response_length part of the sequence to get the token-level scores for the model's response part. token_level_scores = token_level_scores[:, -max_response_length:] # Form the final batch using TensorDict batch = TensorDict( { "prompts": batch_input_ids, "responses": batch_response_ids, "input_ids": batch_seq, # here input_ids become the whole sentences "attention_mask": attention_mask, "position_ids": position_ids, "is_drop_mask": is_drop_mask, "token_level_scores": token_level_scores.contiguous(), **( {"response_mask": response_mask} if self.trace_aggregator.get("level", "transition") == "trajectory" else {} ), }, # type: ignore batch_size=n_transition, ) data_proto = DataProto(batch=batch) data_metrics = { "training/reward": np.mean(list(finished_id_to_final_reward.values())), "training/n_rollouts": len(finished_id_to_final_reward), "training/n_rollouts_w_trace": len(finished_id_to_sample_info), "training/n_rollouts_w_reward": sample_with_reward_count, "training/n_truncated_triplets": n_trunc_sample_because_of_response, "training/n_triplets": n_transition, # log data, only for debug testing **( { "training/n_unmerged_rollouts": unmerged_count, # type: ignore "training/n_triplets_by_turn": len(response_per_turn_list), # type: ignore "training/avg_response_length_by_turn": np.mean(response_per_turn_list), # type: ignore "training/max_response_length_by_turn": np.max(response_per_turn_list), # type: ignore "training/min_response_length_by_turn": np.min(response_per_turn_list), # type: ignore } if self.trace_aggregator.get("level", "transition") == "trajectory" else {} ), **( { "training/template_mismatch_triplets": template_mismatch_count, # type: ignore "training/retoken_mismatch_triplets": retoken_mismatch_count, # type: ignore "training/others_mismatch_triplets": others_mismatch_count, # type: ignore "training/template_mismatch_ratio": template_mismatch_count / len(response_per_turn_list), # type: ignore "training/retoken_mismatch_ratio": retoken_mismatch_count / len(response_per_turn_list), # type: ignore "training/others_mismatch_ratio": others_mismatch_count / len(response_per_turn_list), # type: ignore } if self.trace_aggregator.get("level", "transition") == "trajectory" and self.trace_aggregator.get("debug", False) else {} ), } # Add non-tensor data for advantage calculation and logging data_proto.non_tensor_batch["data_id_list"] = np.array(data_id_list) # type: ignore data_proto.non_tensor_batch["rollout_id_list"] = np.array(rollout_id_list) # type: ignore if self.trace_aggregator.get("level", "transition") == "transition": data_proto.non_tensor_batch["turn_index_list"] = np.array(turn_index_list) # type: ignore return data_proto, data_metrics def clear_data_and_server(self): """Resets the internal state of the daemon for the next run.""" self.backend_llm_server_addresses = [] self._completed_rollouts_v0.clear() self._task_id_to_original_sample.clear() self._total_tasks_queued = 0 # For a true reset, the server's internal queues would also need clearing. # This implementation assumes that `set_up_data_and_server` is called # for each new run, effectively starting a fresh batch. def _fillna_reward(self, rollout: RolloutLegacy): if rollout.final_reward is None: if self.reward_fillna_value is not None: # type: ignore final_reward = self.reward_fillna_value else: raise ValueError(f"Reward is None for rollout {rollout.rollout_id}, please check the reward function.") else: final_reward = rollout.final_reward return final_reward ================================================ FILE: agentlightning/verl/dataset.py ================================================ # Copyright (c) Microsoft. All rights reserved. # type: ignore import torch from datasets import Dataset as HuggingFaceDataset from omegaconf import DictConfig from verl.utils.dataset.rl_dataset import RLHFDataset from agentlightning.types import Dataset __all__ = [ "AgentDataset", "LoadedDataset", ] class AgentDataset(RLHFDataset): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.filter_overlong_prompts = False def __getitem__(self, item): row_dict: dict = self.dataframe[item] # add index for each prompt index = row_dict.get("extra_info", {}).get("index", 0) row_dict["index"] = index # Workaround for data proto. At least one tensor is needed. row_dict["fake_ids"] = torch.ones(1, dtype=torch.int) return row_dict class LoadedDataset(AgentDataset): def __init__(self, dataset: Dataset): super().__init__([], None, DictConfig({})) # type: ignore dataset_copy = [dataset[i] for i in range(len(dataset))] self.dataframe = HuggingFaceDataset.from_list(dataset_copy) def _read_files_and_tokenize(self): pass ================================================ FILE: agentlightning/verl/entrypoint.py ================================================ # Copyright (c) Microsoft. All rights reserved. # pyright: reportUnknownVariableType=false # pyright: reportUnknownMemberType=false # pyright: reportUnknownArgumentType=false from __future__ import annotations from typing import TYPE_CHECKING, Any, Type import hydra import ray from ray.actor import ActorClass from verl.trainer.main_ppo import create_rl_sampler from verl.trainer.ppo.reward import load_reward_manager from agentlightning.adapter import TraceAdapter from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore from agentlightning.types import Dataset from .dataset import AgentDataset, LoadedDataset if TYPE_CHECKING: from .daemon import AgentModeDaemon from .trainer import AgentLightningTrainer __all__ = [ "main", "run_ppo", "TaskRunner", ] @hydra.main(config_path="pkg://agentlightning/verl", config_name="config", version_base=None) def main(config: Any): from .daemon import AgentModeDaemon from .trainer import AgentLightningTrainer run_ppo( config, train_dataset=None, val_dataset=None, store=None, llm_proxy=None, adapter=None, trainer_cls=AgentLightningTrainer, daemon_cls=AgentModeDaemon, ) def run_ppo( config: Any, train_dataset: Dataset[Any] | None, val_dataset: Dataset[Any] | None, store: LightningStore | None, llm_proxy: LLMProxy | None, adapter: TraceAdapter[Any] | None, trainer_cls: Type[AgentLightningTrainer], daemon_cls: Type[AgentModeDaemon], ) -> None: if not ray.is_initialized(): # this is for local ray cluster try: # verl >= 0.6.0 num_cpus = config.ray_kwargs.ray_init.num_cpus except AttributeError: # verl < 0.6.0 num_cpus = config.ray_init.num_cpus ray.init( runtime_env={ "env_vars": {"TOKENIZERS_PARALLELISM": "true", "NCCL_DEBUG": "WARN", "VLLM_LOGGING_LEVEL": "WARN"} }, num_cpus=num_cpus, ) runner = TaskRunner.remote() ray.get( runner.run.remote( # type: ignore config=config, train_dataset=train_dataset, val_dataset=val_dataset, store=store, llm_proxy=llm_proxy, adapter=adapter, trainer_cls=trainer_cls, daemon_cls=daemon_cls, ) ) @ray.remote(num_cpus=1) # please make sure main_task is not scheduled on head class TaskRunner: def run( self, config: Any, train_dataset: Dataset[Any] | None, val_dataset: Dataset[Any] | None, store: LightningStore | None, llm_proxy: LLMProxy | None, adapter: TraceAdapter[Any] | None, trainer_cls: Type[AgentLightningTrainer], daemon_cls: Type[AgentModeDaemon], ): # print initial config from pprint import pprint from omegaconf import OmegaConf from verl.utils.fs import copy_to_local pprint(OmegaConf.to_container(config, resolve=True)) # resolve=True will eval symbol values OmegaConf.resolve(config) # download the checkpoint from hdfs local_path = copy_to_local(config.actor_rollout_ref.model.path) # instantiate tokenizer from verl.utils.tokenizer import hf_processor, hf_tokenizer trust_remote_code = config.data.get("trust_remote_code", False) tokenizer = hf_tokenizer(local_path, trust_remote_code=trust_remote_code) processor = hf_processor(local_path, use_fast=True) # used for multimodal LLM, could be none # define worker classes if config.actor_rollout_ref.actor.strategy in ["fsdp", "fsdp2"]: assert config.critic.strategy in ["fsdp", "fsdp2"] from verl.single_controller.ray import RayWorkerGroup from verl.workers.fsdp_workers import ActorRolloutRefWorker, AsyncActorRolloutRefWorker, CriticWorker actor_rollout_cls = ( AsyncActorRolloutRefWorker if config.actor_rollout_ref.rollout.mode == "async" else ActorRolloutRefWorker ) ray_worker_group_cls = RayWorkerGroup elif config.actor_rollout_ref.actor.strategy == "megatron": assert config.actor_rollout_ref.actor.strategy == config.critic.strategy # FIXME: This import is outdated from verl.single_controller.ray.megatron import NVMegatronRayWorkerGroup # type: ignore from verl.workers.megatron_workers import ActorRolloutRefWorker, CriticWorker actor_rollout_cls = ActorRolloutRefWorker ray_worker_group_cls = NVMegatronRayWorkerGroup else: raise NotImplementedError from verl.trainer.ppo.ray_trainer import ResourcePoolManager try: # verl >= 0.6.0 from verl.trainer.ppo.utils import Role except ImportError: # Fallback for verl <= 0.5.0 from verl.trainer.ppo.ray_trainer import Role # type: ignore role_worker_mapping: dict[Role, ActorClass[Any]] = { Role.ActorRollout: ray.remote(actor_rollout_cls), Role.Critic: ray.remote(CriticWorker), } global_pool_id = "global_pool" resource_pool_spec = { global_pool_id: [config.trainer.n_gpus_per_node] * config.trainer.nnodes, } mapping = { Role.ActorRollout: global_pool_id, Role.Critic: global_pool_id, } # we should adopt a multi-source reward function here # - for rule-based rm, we directly call a reward score # - for model-based rm, we call a model # - for code related prompt, we send to a sandbox if there are test cases # - finally, we combine all the rewards together # - The reward type depends on the tag of the data if config.reward_model.enable: if config.reward_model.strategy in ["fsdp", "fsdp2"]: from verl.workers.fsdp_workers import RewardModelWorker elif config.reward_model.strategy == "megatron": from verl.workers.megatron_workers import RewardModelWorker else: raise NotImplementedError role_worker_mapping[Role.RewardModel] = ray.remote(RewardModelWorker) mapping[Role.RewardModel] = global_pool_id # use reference model if config.algorithm.use_kl_in_reward or config.actor_rollout_ref.actor.use_kl_loss: role_worker_mapping[Role.RefPolicy] = ray.remote(ActorRolloutRefWorker) mapping[Role.RefPolicy] = global_pool_id reward_fn = load_reward_manager( config, tokenizer, num_examine=0, **config.reward_model.get("reward_kwargs", {}) ) val_reward_fn = load_reward_manager( config, tokenizer, num_examine=1, **config.reward_model.get("reward_kwargs", {}) ) resource_pool_manager = ResourcePoolManager(resource_pool_spec=resource_pool_spec, mapping=mapping) from verl.utils.dataset.rl_dataset import collate_fn # Use our special dataset if train_dataset is None: train_dataset = AgentDataset( data_files=config.data.train_files, tokenizer=tokenizer, processor=processor, config=config.data, ) else: train_dataset = LoadedDataset(train_dataset) if val_dataset is None: val_dataset = AgentDataset( data_files=config.data.val_files, tokenizer=tokenizer, processor=processor, config=config.data, ) else: val_dataset = LoadedDataset(val_dataset) train_sampler = create_rl_sampler(config.data, train_dataset) trainer = trainer_cls( config=config, tokenizer=tokenizer, processor=processor, role_worker_mapping=role_worker_mapping, resource_pool_manager=resource_pool_manager, ray_worker_group_cls=ray_worker_group_cls, reward_fn=reward_fn, val_reward_fn=val_reward_fn, train_dataset=train_dataset, val_dataset=val_dataset, collate_fn=collate_fn, train_sampler=train_sampler, store=store, llm_proxy=llm_proxy, adapter=adapter, daemon_cls=daemon_cls, ) trainer.init_workers() trainer.fit() if __name__ == "__main__": main() ================================================ FILE: agentlightning/verl/trainer.py ================================================ # Copyright (c) Microsoft. All rights reserved. # type: ignore from __future__ import annotations import random from contextlib import contextmanager from copy import deepcopy from pprint import pprint from typing import Dict, Tuple, Type import numpy as np import torch import verl from codetiming import Timer from omegaconf import OmegaConf from tqdm import tqdm from verl import DataProto from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto from verl.trainer.ppo.core_algos import agg_loss from verl.trainer.ppo.metric_utils import ( _compute_response_info, compute_throughout_metrics, compute_timing_metrics, ) from verl.trainer.ppo.ray_trainer import ( AdvantageEstimator, RayPPOTrainer, apply_kl_penalty, compute_advantage, compute_response_mask, ) from verl.utils.metric import reduce_metrics from verl.utils.tracking import Tracking from agentlightning.adapter import TraceAdapter, TraceToTripletBase from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore from .daemon import AgentModeDaemon __all__ = [ "AgentLightningTrainer", ] @contextmanager def _timer(name: str, timing_raw: Dict[str, float]): with Timer(name=name, logger=None) as timer: yield if name not in timing_raw: timing_raw[name] = 0 timing_raw[name] += timer.last # This function is adapted from verl. # We introduce a new parameter `suffix` to distinguish between metrics computed # before and after AgentLightning’s post-processing. # - "Before" refers to raw reward and advantage values. # - "After" refers to values computed following post-processing, which involves: # (1) Dropping prompts that exceed the maximum allowed length. # (2) Adjusting the batch size to be a multiple of the mini PPO size. # Different suffixes are used to label these two stages accordingly. def compute_data_metrics(batch: DataProto, use_critic: bool = True, suffix: str = "") -> Dict[str, Any]: """ Computes various metrics from a batch of data for PPO training. This function calculates metrics related to scores, rewards, advantages, returns, values, and sequence lengths from a batch of data. It provides statistical information (mean, max, min) for each metric category. Args: batch: A DataProto object containing batch data with token-level scores, rewards, advantages, etc. use_critic: Whether to include critic-specific metrics. Defaults to True. Returns: A dictionary of metrics including: - critic/score/mean, max, min: Statistics about sequence scores - critic/rewards/mean, max, min: Statistics about sequence rewards - critic/advantages/mean, max, min: Statistics about advantages - critic/returns/mean, max, min: Statistics about returns - critic/values/mean, max, min: Statistics about critic values (if use_critic=True) - critic/vf_explained_var: Explained variance of the value function (if use_critic=True) - response_length/mean, max, min, clip_ratio: Statistics about response lengths - prompt_length/mean, max, min, clip_ratio: Statistics about prompt lengths """ sequence_score = batch.batch["token_level_scores"].sum(-1) sequence_reward = batch.batch["token_level_rewards"].sum(-1) advantages = batch.batch["advantages"] returns = batch.batch["returns"] max_response_length = batch.batch["responses"].shape[-1] prompt_mask = batch.batch["attention_mask"][:, :-max_response_length].bool() response_mask = batch.batch["attention_mask"][:, -max_response_length:].bool() max_prompt_length = prompt_mask.size(-1) response_info = _compute_response_info(batch) prompt_length = response_info["prompt_length"] response_length = response_info["response_length"] valid_adv = torch.masked_select(advantages, response_mask) valid_returns = torch.masked_select(returns, response_mask) if use_critic: values = batch.batch["values"] valid_values = torch.masked_select(values, response_mask) return_diff_var = torch.var(valid_returns - valid_values) return_var = torch.var(valid_returns) metrics = { # score "critic/score/mean" + suffix: torch.mean(sequence_score).detach().item(), "critic/score/max" + suffix: torch.max(sequence_score).detach().item(), "critic/score/min" + suffix: torch.min(sequence_score).detach().item(), # reward "critic/rewards/mean" + suffix: torch.mean(sequence_reward).detach().item(), "critic/rewards/max" + suffix: torch.max(sequence_reward).detach().item(), "critic/rewards/min" + suffix: torch.min(sequence_reward).detach().item(), # adv "critic/advantages/mean" + suffix: torch.mean(valid_adv).detach().item(), "critic/advantages/max" + suffix: torch.max(valid_adv).detach().item(), "critic/advantages/min" + suffix: torch.min(valid_adv).detach().item(), # returns "critic/returns/mean" + suffix: torch.mean(valid_returns).detach().item(), "critic/returns/max" + suffix: torch.max(valid_returns).detach().item(), "critic/returns/min" + suffix: torch.min(valid_returns).detach().item(), **( { # values "critic/values/mean" + suffix: torch.mean(valid_values).detach().item(), "critic/values/max" + suffix: torch.max(valid_values).detach().item(), "critic/values/min" + suffix: torch.min(valid_values).detach().item(), # vf explained var "critic/vf_explained_var" + suffix: (1.0 - return_diff_var / (return_var + 1e-5)).detach().item(), } if use_critic else {} ), # response length "response_length/mean" + suffix: torch.mean(response_length).detach().item(), "response_length/max" + suffix: torch.max(response_length).detach().item(), "response_length/min" + suffix: torch.min(response_length).detach().item(), "response_length/clip_ratio" + suffix: torch.mean(torch.eq(response_length, max_response_length).float()).detach().item(), # prompt length "prompt_length/mean" + suffix: torch.mean(prompt_length).detach().item(), "prompt_length/max" + suffix: torch.max(prompt_length).detach().item(), "prompt_length/min" + suffix: torch.min(prompt_length).detach().item(), "prompt_length/clip_ratio" + suffix: torch.mean(torch.eq(prompt_length, max_prompt_length).float()).detach().item(), } return metrics class AgentLightningTrainer(RayPPOTrainer): """ Specialized PPO trainer for agent-based reinforcement learning. This trainer is designed specifically for scenarios where the model interacts with external environments, tools, or APIs through an AgentLightningServer. It simplifies the training loop by removing the complex conditional logic present in the original RayPPOTrainer and focusing on the agent mode workflow. Key differences from RayPPOTrainer: 1. Uses AgentModeDaemon for server communication 2. Simplified data flow without pop/union operations 3. Direct batch processing through agent daemon 4. Streamlined validation using agent_mode validation """ def __init__( self, store: LightningStore | None, llm_proxy: LLMProxy | None, adapter: TraceAdapter | None, daemon_cls: Type[AgentModeDaemon], **kwargs, ): super().__init__(**kwargs) self.store = store self.llm_proxy = llm_proxy self.adapter = adapter self.daemon_cls = daemon_cls def _validate(self): assert len(self.val_dataloader) == 1, "Please set val_batch_size to None for better throughput." test_data = next(iter(self.val_dataloader)) test_batch = DataProto.from_single_dict(test_data) self.async_rollout_manager.wake_up() self.agent_mode_daemon.set_up_data_and_server( test_batch.non_tensor_batch, self.async_rollout_manager.server_addresses, is_train=False, ) self.agent_mode_daemon.run_until_all_finished() test_metrics = self.agent_mode_daemon.get_test_metrics() self.agent_mode_daemon.clear_data_and_server() self.async_rollout_manager.sleep() return test_metrics def _compute_reference_log_prob(self, batch: DataProto) -> DataProto: """Compute reference log probability using the correct worker based on LoRA configuration. In verl 0.6.0+, when LoRA is detected (indicated by ref_in_actor=True), the reference policy is computed by the actor rollout worker instead of a separate ref policy worker. This method handles both scenarios by checking the ref_in_actor flag. Note: verl sets ref_in_actor=True when it detects LoRA configuration (e.g., lora_rank > 0 or lora_adapter_path is set). Args: batch: The data batch to compute reference log probabilities for. Returns: DataProto with reference log probabilities added. Raises: RuntimeError: If the required worker is not available. """ if getattr(self, "ref_in_actor", False): actor_worker = getattr(self, "actor_rollout_wg", None) if actor_worker is None: raise RuntimeError("actor_rollout_wg is required when ref_in_actor is True.") return actor_worker.compute_ref_log_prob(batch) ref_worker = getattr(self, "ref_policy_wg", None) if ref_worker is None: raise RuntimeError( "Reference policy worker was not initialized. " "Ensure `use_reference_policy` is enabled and the VERL config exposes the ref worker." ) return ref_worker.compute_ref_log_prob(batch) def _train_step(self, batch_dict: dict) -> dict: # Isolate in a separate method to automatically recycle the variables before validation. batch: DataProto = DataProto.from_single_dict(batch_dict) metrics = {} timing_raw = {} with _timer("step", timing_raw): # When agent mode is enabled, we read the batch as it is. gen_batch = batch # generate a batch with _timer("gen", timing_raw): self.async_rollout_manager.wake_up() self.agent_mode_daemon.set_up_data_and_server( gen_batch.non_tensor_batch, self.async_rollout_manager.server_addresses ) self.agent_mode_daemon.run_until_all_finished() batch, agent_metrics = self.agent_mode_daemon.get_train_data_batch( max_prompt_length=( self.config.agentlightning.trace_aggregator.trajectory_max_prompt_length if self.config.agentlightning.trace_aggregator.level.startswith("trajectory") else self.config.data.max_prompt_length ), max_response_length=( self.config.agentlightning.trace_aggregator.trajectory_max_response_length if self.config.agentlightning.trace_aggregator.level.startswith("trajectory") else self.config.data.max_response_length ), device=gen_batch.batch["fake_ids"].device, global_steps=self.global_steps, ) metrics.update(agent_metrics) self.agent_mode_daemon.clear_data_and_server() self.async_rollout_manager.sleep() if self.config.algorithm.adv_estimator == AdvantageEstimator.REMAX: with _timer("gen_max", timing_raw): gen_baseline_batch = deepcopy(gen_batch) gen_baseline_batch.meta_info["do_sample"] = False gen_baseline_output = self.async_rollout_manager.generate_sequences(gen_baseline_batch) batch = batch.union(gen_baseline_output) reward_baseline_tensor = self.reward_fn(batch) reward_baseline_tensor = reward_baseline_tensor.sum(dim=-1) batch.pop(batch_keys=list(gen_baseline_output.batch.keys())) batch.batch["reward_baselines"] = reward_baseline_tensor del gen_baseline_batch, gen_baseline_output # uid is used for algorithm like GRPO, should be aligned to data id batch.non_tensor_batch["uid"] = batch.non_tensor_batch["data_id_list"] if "response_mask" not in batch.batch: batch.batch["response_mask"] = compute_response_mask(batch) # compute global_valid tokens batch.meta_info["global_token_num"] = torch.sum(batch.batch["attention_mask"], dim=-1).tolist() with _timer("reward", timing_raw): # compute reward model score if self.use_rm: reward_tensor = self.rm_wg.compute_rm_score(batch) batch = batch.union(reward_tensor) reward_extra_infos_dict = {} # for agent mode, pad the lengths to calculate old log prob, ref, and values batch, pad_size = pad_dataproto_to_divisor(batch, self.actor_rollout_wg.world_size) # recompute old_log_probs with _timer("old_log_prob", timing_raw): old_log_prob = self.actor_rollout_wg.compute_log_prob(batch) entropys = old_log_prob.batch["entropys"] response_masks = batch.batch["response_mask"] loss_agg_mode = self.config.actor_rollout_ref.actor.loss_agg_mode entropy_loss = agg_loss(loss_mat=entropys, loss_mask=response_masks, loss_agg_mode=loss_agg_mode) old_log_prob_metrics = {"actor/entropy_loss": entropy_loss.detach().item()} metrics.update(old_log_prob_metrics) old_log_prob.batch.pop("entropys") batch = batch.union(old_log_prob) if self.use_reference_policy: # compute reference log_prob with _timer("ref", timing_raw): ref_log_prob = self._compute_reference_log_prob(batch) batch = batch.union(ref_log_prob) # compute values if self.use_critic: with _timer("values", timing_raw): values = self.critic_wg.compute_values(batch) batch = batch.union(values) # for agent mode, unpad to calculate adv # it is important, as adv should be based on the raw traces batch = unpad_dataproto(batch, pad_size=pad_size) with _timer("adv", timing_raw): # if agent_mode is enabled, there is already token_level_scores # token_level_scores is not needed to compute here # compute rewards. apply_kl_penalty if available if self.config.algorithm.use_kl_in_reward: batch, kl_metrics = apply_kl_penalty( batch, kl_ctrl=self.kl_ctrl_in_reward, kl_penalty=self.config.algorithm.kl_penalty ) metrics.update(kl_metrics) else: batch.batch["token_level_rewards"] = batch.batch["token_level_scores"] # compute advantages, executed on the driver process norm_adv_by_std_in_grpo = self.config.algorithm.get( "norm_adv_by_std_in_grpo", True ) # GRPO adv normalization factor batch = compute_advantage( batch, adv_estimator=self.config.algorithm.adv_estimator, gamma=self.config.algorithm.gamma, lam=self.config.algorithm.lam, num_repeat=self.config.actor_rollout_ref.rollout.n, norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, config=self.config.algorithm, ) # Calculate the metrics before processing. Refer to the comments of function `compute_data_metrics` for details. metrics.update(compute_data_metrics(batch=batch, use_critic=self.use_critic, suffix="_before_processing")) # after advantages are assigned, we begin to drop (1) long prompt (2) floor to ppo minisize keep_indices = (~batch.batch["is_drop_mask"]).nonzero(as_tuple=True)[0] metrics["training/n_triplets_prompt_too_long"] = ( batch.batch["is_drop_mask"].shape[0] - keep_indices.shape[0] ) batch = batch[keep_indices] # next, round to minibatch size mini_batch_size = self.config.actor_rollout_ref.actor.ppo_mini_batch_size n_transition = len(batch) random_indices = list(range(n_transition)) random.shuffle(random_indices) batch.reorder(torch.tensor(random_indices).type(torch.int32)) n_remained_transition = n_transition // mini_batch_size * mini_batch_size batch = batch[list(range(n_remained_transition))] metrics["training/n_triplets_dropped_remainder"] = n_transition - n_remained_transition # Agent mode note: Change the order of balance batch; # 1. first calculate advantage # 2. then drop the samples (too long prompt & floor to ppo minisize) # 3. balance # balance the number of valid tokens on each dp rank. # Note that this breaks the order of data inside the batch. # Please take care when you implement group based adv computation such as GRPO and rloo if self.config.trainer.balance_batch: self._balance_batch(batch, metrics=metrics) # update critic if self.use_critic: with _timer("update_critic", timing_raw): critic_output = self.critic_wg.update_critic(batch) critic_output_metrics = reduce_metrics(critic_output.meta_info["metrics"]) metrics.update(critic_output_metrics) # implement critic warmup if self.config.trainer.critic_warmup <= self.global_steps: # update actor with _timer("update_actor", timing_raw): batch.meta_info["multi_turn"] = self.config.actor_rollout_ref.rollout.multi_turn.enable actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) # Log rollout generations if enabled rollout_data_dir = self.config.trainer.get("rollout_data_dir", None) if rollout_data_dir: with _timer("dump_rollout_generations", timing_raw): print(batch.batch.keys()) inputs = self.tokenizer.batch_decode(batch.batch["prompts"], skip_special_tokens=True) outputs = self.tokenizer.batch_decode(batch.batch["responses"], skip_special_tokens=True) scores = batch.batch["token_level_scores"].sum(-1).cpu().tolist() self._dump_generations( inputs=inputs, outputs=outputs, scores=scores, reward_extra_infos_dict=reward_extra_infos_dict, dump_path=rollout_data_dir, ) # compute training metrics metrics.update(compute_data_metrics(batch=batch, use_critic=self.use_critic, suffix="_after_processing")) metrics.update(compute_timing_metrics(batch=batch, timing_raw=timing_raw)) # TODO: implement actual tflpo and theoretical tflpo n_gpus = self.resource_pool_manager.get_n_gpus() metrics.update(compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus)) return metrics def fit(self): logger = Tracking( project_name=self.config.trainer.project_name, experiment_name=self.config.trainer.experiment_name, default_backend=self.config.trainer.logger, config=OmegaConf.to_container(self.config, resolve=True), ) self.global_steps = 0 # load checkpoint before doing anything self._load_checkpoint() assert self.async_rollout_mode, "If agent mode is enabled, async server must be enabled" if self.adapter is not None and not isinstance(self.adapter, TraceToTripletBase): raise ValueError("Adapter must be a TraceToTripletBase for currently VERL implementation.") verl_version = verl.__version__ if verl_version == "0.5.0": # Note (Zhiyuan): To avoid further patch into vllm async server, using the same sentence to get the naming here. # However, it is possible that verl updates the naming and causes incompatibility. # Reference: https://github.com/volcengine/verl/blob/5b5e09d9cc20625e436d01f69d9cc739ff681c54/verl/workers/rollout/vllm_rollout/vllm_async_server.py#L217 model = "/".join(self.config.actor_rollout_ref.model.path.split("/")[-2:]) else: # For other versions (e.g., 0.6.0), we use the full path to the model. model = self.config.actor_rollout_ref.model.path self.agent_mode_daemon = self.daemon_cls( self.config.agentlightning.port, self.config.actor_rollout_ref.rollout.n, train_information={ "model": model, "temperature": self.config.actor_rollout_ref.rollout.temperature, }, tokenizer=self.tokenizer, mini_batch_size=self.config.actor_rollout_ref.actor.ppo_mini_batch_size, pad_token_id=self.tokenizer.pad_token_id, mode="v1" if self.store is not None else "v0", store=self.store, llm_proxy=self.llm_proxy, adapter=self.adapter, processor=self.processor, # For Qwen2-VL mrope position_ids image_base_dir=getattr(self.config.data, "image_base_dir", None), trace_aggregator=self.config.agentlightning.trace_aggregator, ) self.agent_mode_daemon.start() # perform validation before training # currently, we only support validation using the reward_function. if self.val_reward_fn is not None and self.config.trainer.get("val_before_train", True): val_metrics = self._validate() assert val_metrics, f"{val_metrics=}" pprint(f"Initial validation metrics: {val_metrics}") logger.log(data=val_metrics, step=self.global_steps) if self.config.trainer.get("val_only", False): return # add tqdm progress_bar = tqdm(total=self.total_training_steps, initial=self.global_steps, desc="Training Progress") # we start from step 1 self.global_steps += 1 last_val_metrics = None for epoch in range(self.config.trainer.total_epochs): for batch_dict in self.train_dataloader: metrics = {} timing_raw = {} is_last_step = self.global_steps >= self.total_training_steps # train step metrics = self._train_step(batch_dict) # validate if ( self.val_reward_fn is not None and self.config.trainer.test_freq > 0 and (is_last_step or self.global_steps % self.config.trainer.test_freq == 0) ): with _timer("validate", timing_raw): val_metrics: dict = self._validate() if is_last_step: last_val_metrics = val_metrics metrics.update(val_metrics) if self.config.trainer.save_freq > 0 and ( is_last_step or self.global_steps % self.config.trainer.save_freq == 0 ): with _timer("save_checkpoint", timing_raw): self._save_checkpoint() # step metrics metrics.update( { "training/global_step": self.global_steps, "training/epoch": epoch, } ) # TODO: make a canonical logger that supports various backend logger.log(data=metrics, step=self.global_steps) if is_last_step: pprint(f"Final validation metrics: {last_val_metrics}") progress_bar.close() # This exit logic is to ensure a robust CI. pprint(f"Flush the logger...") del logger # Make sure the loggers are flushed and closed properly pprint(f"Training finished at step {self.global_steps}.") return progress_bar.update(1) self.global_steps += 1 ================================================ FILE: contrib/.gitignore ================================================ # Put contrib-related gitignore files here. # recipes/envs related recipes/envs/agl_envs/ recipes/envs/wandb/ ================================================ FILE: contrib/CODEOWNERS ================================================ # Put code owner definitions here. # Recipes recipes/search_r1 @SiyunZhao @JiahangXu ================================================ FILE: contrib/README.md ================================================ # Contrib Area This tree hosts experimental integrations, third-party recipes, and curated recipes that are not ready for the main `agentlightning/`, `examples/`, or `docs/` trees. Treat it as an incubator: keep contributions self-contained, clearly owned, and reproducible so downstream users can vendor them without guesswork. ## When to add something here - You are iterating on a runtime extension that would bloat the primary `agentlightning/` namespace. - You want to share a recipe that assembles existing components for a focused agent training or optimization workflow and needs more context than the main examples directory allows. - You need automation scripts or download helpers that will help the community but should not live under `scripts/` at the repo root. If a contribution starts depending on core release cadence, tight CI guarantees, or repo-wide infrastructure, talk to maintainers about graduating it out of `contrib/`. ## Directory map - `agentlightning/` — Namespace packages, utilities, and adapters that extend the published wheel. Place new code under `agentlightning/contrib//` so `import agentlightning.contrib.` works for downstream users. - `recipes/` — Task-focused example bundles that solve a specific problem and derive certain results. Each recipe belongs in its own directory with a README that documents usage, result reports, and ownership. - `scripts/` — Shared automation, dataset download steps, or reproducibility helpers that support the contrib modules above. When adding folders, document the intent in a local README, link to companion docs or examples, and update `CODEOWNERS` so future fixes reach the right reviewers quickly. Questions or proposals for new subtrees can be discussed in Discord, GitHub issues, or GitHub Discussions before opening a PR. For the canonical requirements and review checklist, see the “Agent-lightning Contrib” section of [`docs/community/contributing.md`](../docs/community/contributing.md). ================================================ FILE: contrib/agentlightning/contrib/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Namespace package for agentlightning.contrib. ================================================ FILE: contrib/agentlightning/contrib/adapter/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Namespace package for agentlightning.contrib.adapter. ================================================ FILE: contrib/agentlightning/contrib/adapter/agentos.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ FlightRecorderAdapter - Import Audit Logs to LightningStore ============================================================= Adapts Agent-OS Flight Recorder to Agent-Lightning store format. """ from __future__ import annotations import logging from datetime import datetime, timezone from typing import Any, Dict, List logger = logging.getLogger(__name__) class FlightRecorderAdapter: """ Import Agent-OS Flight Recorder logs to LightningStore. Example: >>> from agent_os import FlightRecorder >>> >>> recorder = FlightRecorder() >>> adapter = FlightRecorderAdapter(recorder) >>> >>> # Import to Lightning store >>> adapter.import_to_store(lightning_store) """ def __init__( self, flight_recorder: Any, *, trace_id_prefix: str = "agentos", ): """ Initialize adapter. Args: flight_recorder: Agent-OS FlightRecorder trace_id_prefix: Prefix for trace IDs """ self.recorder = flight_recorder self.trace_id_prefix = trace_id_prefix self._imported_count = 0 def _convert_entry(self, entry: Any, index: int) -> Dict[str, Any]: """Convert Flight Recorder entry to span format.""" entry_type = getattr(entry, "type", "unknown") timestamp = getattr(entry, "timestamp", datetime.now(timezone.utc)) agent_id = getattr(entry, "agent_id", "unknown") span = { "span_id": f"{self.trace_id_prefix}-{index}", "trace_id": f"{self.trace_id_prefix}-{agent_id}", "name": f"agent_os.{entry_type}", "start_time": timestamp.isoformat() if hasattr(timestamp, "isoformat") else str(timestamp), "attributes": { "agent_os.entry_type": entry_type, "agent_os.agent_id": agent_id, }, } # Add type-specific attributes if entry_type == "policy_check": span["attributes"].update( { "agent_os.policy_name": getattr(entry, "policy_name", "unknown"), "agent_os.policy_violated": getattr(entry, "violated", False), } ) elif entry_type == "signal": span["attributes"].update( { "agent_os.signal_type": getattr(entry, "signal", "unknown"), } ) return span def get_spans(self) -> List[Dict[str, Any]]: """Get all entries as spans.""" entries = [] if hasattr(self.recorder, "get_entries"): entries = self.recorder.get_entries() elif hasattr(self.recorder, "entries"): entries = self.recorder.entries return [self._convert_entry(e, i) for i, e in enumerate(entries)] def import_to_store(self, store: Any) -> int: """ Import spans to LightningStore. Args: store: LightningStore instance Returns: Number of spans imported """ spans = self.get_spans() for span in spans: try: if hasattr(store, "emit_span"): store.emit_span(span) elif hasattr(store, "add_span"): store.add_span(span) except Exception as e: logger.error(f"Failed to import span: {e}") self._imported_count += len(spans) logger.info(f"Imported {len(spans)} spans to LightningStore") return len(spans) def get_violation_summary(self) -> Dict[str, Any]: """Get summary of policy violations.""" spans = self.get_spans() violations = [s for s in spans if s["attributes"].get("agent_os.policy_violated", False)] return { "total_entries": len(spans), "total_violations": len(violations), "violation_rate": len(violations) / len(spans) if len(spans) > 0 else 0.0, } ================================================ FILE: contrib/agentlightning/contrib/adapter/triplet_group.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations from typing import Dict, List, Optional from agentlightning.adapter.triplet import TracerTraceToTriplet from agentlightning.types import Span, Triplet class TracerTraceToTripletGroup(TracerTraceToTriplet): """Convert tracer-emitted spans into triplet trajectories. Attributes: repair_hierarchy: When `True`, repair the span tree using [`TraceTree.repair_hierarchy()`][agentlightning.adapter.triplet.TraceTree.repair_hierarchy] before matching calls and rewards. llm_call_match: Regular expression pattern that selects LLM call span names. agent_match: Optional regular expression pattern for agent span names. When omitted, spans from any agent are considered. exclude_llm_call_in_reward: When `True`, ignore matches under reward spans while searching for rewards. reward_match: Strategy used to associate rewards with LLM calls. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _extract_span_groups(self, spans): def resolve_step_count(span, next_span, spans, index): """ Determine step_count for a given span using next_span or fallback search. """ # CASE A: If next_span exists and parent_id matches if next_span and span.parent_id == next_span.span_id: return next_span.attributes.get("step_count") # CASE B: Fallback — search forward for agentlightning.operation for s in spans[index + 1 :]: if s.name == "agentlightning.operation" and span.parent_id == s.span_id: return s.attributes.get("step_count") return None def extract_step_count_from_links(span): """ Extract step_count from agentlightning.link.* attributes. """ key = span.attributes.get("agentlightning.link.0.key_match") if key == "step_count": return span.attributes.get("agentlightning.link.0.value_match") return None span_groups = {} for i, span in enumerate(spans): next_span = spans[i + 1] if i + 1 < len(spans) else None step_count = None if span.name == "openai.chat.completion": step_count = resolve_step_count(span, next_span, spans, i) if step_count is None: continue step_count = str(step_count) span_groups.setdefault(step_count, {}) span_groups[step_count]["call_span"] = span elif span.name == "agentlightning.object": step_count = extract_step_count_from_links(span) if step_count is None: continue step_count = str(step_count) span_groups.setdefault(step_count, {}) span_groups[step_count]["object_span"] = span elif span.name == "agentlightning.annotation": step_count = extract_step_count_from_links(span) if step_count is None: continue step_count = str(step_count) span_groups.setdefault(step_count, {}) span_groups[step_count]["annotation_span"] = span return span_groups def adapt_group(self, source: Sequence[Span], /) -> List[Triplet]: span_groups = self._extract_span_groups(source) def token_ids(span: Optional[Span], key: str) -> list: return span.attributes.get(key, []) if span else [] def reward0(span: Optional[Span]) -> float: if not span: return 0.0 return float(span.attributes.get("agentlightning.reward.0.value", 0.0)) def reward1(span: Optional[Span]) -> Optional[float]: if not span: return 0.0 return float(span.attributes.get("agentlightning.reward.1.value", 0.0)) def message(span: Optional[Span]) -> Optional[str]: if not span: return "" return span.attributes.get("agentlightning.object.literal", "") triplets: List[Triplet] = [] for group in span_groups.values(): call_span = group.get("call_span") if not token_ids(call_span, "prompt_token_ids") and not token_ids(call_span, "response_token_ids"): continue object_span = group.get("object_span") annotation_span = group.get("annotation_span") request_id = group.get("request_id") triplets.append( Triplet( prompt={"token_ids": token_ids(call_span, "prompt_token_ids")}, response={"token_ids": token_ids(call_span, "response_token_ids")}, reward=reward0(annotation_span), metadata={ "response_id": request_id, "intrinsic_reward": reward1(annotation_span), "message": message(object_span), }, ) ) return triplets ================================================ FILE: contrib/agentlightning/contrib/agent/env_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import logging import os from typing import Any, Dict import numpy as np from add_instruction import add_chat_instruction, add_single_instruction from agl_envs import make_env_manager from autogen_agentchat.agents import AssistantAgent from autogen_core.models import ModelFamily from autogen_ext.models.openai import OpenAIChatCompletionClient from agentlightning import LLM, LitAgent, NamedResources, Rollout, configure_logger, emit_object, emit_reward, operation from agentlightning.utils.otel import make_link_attributes from contrib.recipes.envs.prompt_builder import HistoryPromptBuilder logger = configure_logger(name=__name__, level=logging.ERROR) class EnvAgent(LitAgent): def __init__(self, config, trained_agents: str | None = None) -> None: super().__init__(trained_agents=trained_agents) self.config = config self.env = None def _build_agent(self, llm: LLM, temperature: float): model_client = OpenAIChatCompletionClient( model=llm.model, base_url=llm.endpoint, api_key=os.environ.get("OPENAI_API_KEY", "token-abc123"), model_info={ "vision": False, "function_calling": True, "json_output": False, "family": ModelFamily.UNKNOWN, "structured_output": False, }, temperature=temperature, ) return AssistantAgent( name="envs", model_client=model_client, ) def _get_instructed_prompt(self, prompt, sep="\n\n"): """Return instructed observation based on prompt_type and captioner type.""" prompt_type = self.config.captioner.prompt_type cap_type = self.config.captioner.type if prompt_type == "chat": if cap_type == "cot": return add_chat_instruction(prompt, "cot", sep, self.config.env_name) elif cap_type == "naive": return add_chat_instruction(prompt, "naive", sep) elif prompt_type == "single": if cap_type == "cot": return add_single_instruction(prompt, "cot", sep, self.config.env_name) elif cap_type == "naive": return add_single_instruction(prompt, "naive", sep, self.config.env_name) raise ValueError(f"Unsupported prompt_type={prompt_type}, type={cap_type}") async def rollout_async( self, task: Dict[str, Any], resources: NamedResources, rollout: Rollout, ) -> float | None: rollout_id = rollout.rollout_id logger.info(f"[Rollout {rollout_id}] Task: {task}") format_penalty = float(self.config["format_penalty"]) reward_scale = float(self.config["reawrd_scale"]) # Setup agent llm: LLM = resources.get("main_llm") print("Training with model:", llm.model, "on endpoint:", llm.endpoint) self.agent = self._build_agent(llm, 1.0 if rollout.mode == "train" else 0.4) if "max_tokens" in self.config and self.config["max_tokens"] > -1: self.agent._model_client.max_tokens = self.config["max_tokens"] try: # Setup environment prompt_builder = HistoryPromptBuilder( max_history=self.config.captioner.max_history, prompt_type=self.config.captioner.prompt_type ) self.env = make_env_manager(self.config.env_name, task, self.config) env_obs, infos, available_actions_hint = self.env.reset() prompt_builder.init(self.env) prompt_builder.update_observation(env_obs) prompt_builder.update_admissible_actions(available_actions_hint) prompt = prompt_builder.get_prompt() episode_reward, done = 0.0, False step_count = 0 while not done: try: instructed_prompt = self._get_instructed_prompt(prompt) # Main agent step with operation(step_count=step_count): result = await self.agent._model_client.create(instructed_prompt) output = result.content logger.info(f"[LLM output]: {output}") except Exception as e: logger.error(f"[Rollout {rollout_id}] Error during training rollout: {e}", exc_info=True) break if self.config.log_env_obs: emit_object(env_obs, attributes=make_link_attributes({"step_count": str(step_count)})) env_obs, executed_action, is_valid, step_reward, terminated, truncated, info, available_actions_hint = ( self.env.step( output, use_reasoning=self.config.captioner.type == "cot", use_success_rate=self.config.use_success_rate, ) ) prompt_builder.update_step_count() prompt_builder.update_action(executed_action) prompt_builder.update_observation(env_obs) prompt_builder.update_admissible_actions(available_actions_hint) prompt = prompt_builder.get_prompt() if rollout.mode == "train": step_reward *= reward_scale if format_penalty != 0.0: emit_reward( { "extrinsic_reward": step_reward, "intrinsic_reward": 0.0 if is_valid else -1.0 * format_penalty, }, primary_key="extrinsic_reward", attributes=make_link_attributes({"step_count": str(step_count)}), ) else: emit_reward(step_reward, attributes=make_link_attributes({"step_count": str(step_count)})) episode_reward += float(step_reward) done = np.logical_or(terminated, truncated) step_count += 1 return episode_reward finally: if self.env is not None: self.env.close() ================================================ FILE: contrib/agentlightning/contrib/algorithm/env_verl/daemon.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import json import random import socket import threading import time import uuid from collections import defaultdict from collections.abc import Mapping from typing import Any, Dict, List, Literal, Optional, Tuple, cast import numpy as np import requests import torch from flask import Flask, Response, abort, request from tensordict import TensorDict from verl import DataProto from agentlightning import LLM, AgentLightningServer, NamedResources, RolloutLegacy from agentlightning.adapter.triplet import TraceToTripletBase from agentlightning.llm_proxy import LLMProxy, ModelConfig from agentlightning.reward import find_final_reward from agentlightning.store.base import LightningStore from agentlightning.types import EnqueueRolloutRequest, Rollout, RolloutConfig, Task from contrib.agentlightning.contrib.adapter.triplet_group import TracerTraceToTripletGroup __all__ = [ "AgentModeDaemon", "get_left_padded_ids_and_attention_mask", "get_right_padded_ids_and_attention_mask", ] def get_left_padded_ids_and_attention_mask( ids: List[int], max_length: int, pad_token_id: int ) -> Tuple[List[int], List[int]]: """ Left-pad (or truncate) a sequence of token IDs to a fixed length, and build the corresponding attention mask. Args: ids: the original list of token IDs. max_length: desired total length after padding/truncation. pad_token_id: ID to use for padding. Returns: padded_ids (any): list of length == max_length. attention_mask (any): list of same length: 1 for non-pad tokens, 0 for pads. """ seq_len = len(ids) if seq_len >= max_length: # too long → truncate from the left, keep the last max_length tokens trimmed = ids[-max_length:] attention_mask = [1] * max_length return trimmed, attention_mask # too short → pad on the left pad_len = max_length - seq_len padded_ids = [pad_token_id] * pad_len + ids attention_mask = [0] * pad_len + [1] * seq_len return padded_ids, attention_mask def get_right_padded_ids_and_attention_mask( ids: List[int], max_length: int, pad_token_id: int ) -> Tuple[List[int], List[int]]: """ Right-pad (or truncate) a sequence of token IDs to a fixed length, and build the corresponding attention mask. Args: ids: the original list of token IDs. max_length: desired total length after padding/truncation. pad_token_id: ID to use for padding. Returns: padded_ids (any): list of length == max_length. attention_mask (any): list of same length: 1 for non-pad tokens, 0 for pads. """ seq_len = len(ids) if seq_len >= max_length: # too long → truncate to the first max_length tokens trimmed = ids[:max_length] attention_mask = [1] * max_length return trimmed, attention_mask # too short → pad on the right pad_len = max_length - seq_len padded_ids = ids + [pad_token_id] * pad_len attention_mask = [1] * seq_len + [0] * pad_len return padded_ids, attention_mask def _find_available_port() -> int: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(("", 0)) return s.getsockname()[1] def _to_native(obj: Any) -> Any: """Convert data retrieved from Parquet to data usable in AGL server.""" # 1) Arrays -> list (then recurse) if isinstance(obj, np.ndarray): return _to_native(obj.tolist()) # 2) NumPy scalar types -> Python scalars if isinstance(obj, np.generic): return _to_native(obj.item()) # 3) Dict-like -> dict if isinstance(obj, Mapping): return {_to_native(k): _to_native(v) for k, v in obj.items()} # type: ignore # 4) Lists/Tuples/Sets -> list if isinstance(obj, (list, tuple, set)): return [_to_native(x) for x in obj] # type: ignore # 5) Anything else: leave as-is return obj class EnvAgentModeDaemon: """ AgentModeDaemon using the AgentLightningServer SDK. This class manages the server lifecycle, task queueing, and results retrieval, while also running a proxy server for LLM requests. It maintains the original interface for compatibility with the RayPPOTrainer. """ def __init__( self, port: Optional[int], train_rollout_n: int, train_information: Dict[str, Any], tokenizer: Any, mini_batch_size: int, pad_token_id: int, reward_fillna_value: float = 0.0, llm_timeout_seconds: float = 1200.0, mode: Literal["v0", "v1"] = "v1", llm_proxy: LLMProxy | None = None, store: LightningStore | None = None, adapter: TraceToTripletBase | None = None, ): self.mode = mode self.llm_timeout_seconds = llm_timeout_seconds # Server and Task Configuration if mode == "v0": assert port is not None self.server_port = port self.server = AgentLightningServer( host="0.0.0.0", port=self.server_port, task_timeout_seconds=self.llm_timeout_seconds ) self.proxy_port = _find_available_port() # Run proxy on a different port else: assert store is not None self.store = store if llm_proxy is None: self.llm_proxy = LLMProxy( port=_find_available_port(), model_list=[], store=store, ) else: # Reuse the existing LLM proxy (probably configured by user) self.llm_proxy = llm_proxy # if adapter is None: # self.adapter = TracerTraceToTripletGroup() # else: # # Reuse the one from trainer # self.adapter = adapter self.adapter = TracerTraceToTripletGroup() self._internal_loop: Optional[asyncio.AbstractEventLoop] = None self._internal_loop_thread = threading.Thread(target=self._internal_loop_runner, daemon=True) self._internal_loop_thread.start() # Training and Data Configuration self.train_rollout_n = train_rollout_n self.train_information = train_information self.mini_batch_size = mini_batch_size self.pad_token_id = pad_token_id self.tokenizer = tokenizer self.reward_fillna_value = reward_fillna_value # Internal State self.backend_llm_server_addresses: List[str] = [] self._total_tasks_queued = 0 self._completed_rollouts_v0: Dict[str, RolloutLegacy] = {} self._task_id_to_original_sample: Dict[str, Dict[str, Any]] = {} self._server_thread: Optional[threading.Thread] = None self._proxy_thread: Optional[threading.Thread] = None self.is_train = True def _internal_loop_runner(self): """Run the internal loop.""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) self._internal_loop = loop loop.run_forever() loop.close() def _start_proxy_server_v0(self): """ Initializes and runs a Flask-based proxy server in a separate thread. This proxy load-balances requests to the actual backend LLM servers. """ app = Flask(__name__) num_requests = 0 last_request_time = 0 @app.route("/v1/", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]) def proxy(path: str): # type: ignore if not self.backend_llm_server_addresses: abort(503, description="No backend LLM servers available.") # Randomly choose a backend server for load balancing target_server = random.choice(self.backend_llm_server_addresses) target_url = f"http://{target_server}/v1/{path}" # Copy client request headers, removing the Host header headers = {key: value for key, value in request.headers if key.lower() != "host"} # Log the request for debugging nonlocal num_requests, last_request_time current_time = time.time() num_requests += 1 if current_time - last_request_time > 60 or num_requests == 1 or num_requests % 100 == 0: print(f"Proxying {request.method} request to {target_server}. Request data: {request.get_data()}") last_request_time = current_time try: # Forward the request to the target backend resp = requests.request( method=request.method, url=target_url, headers=headers, params=request.args, # type: ignore data=request.get_data(), cookies=request.cookies, allow_redirects=False, timeout=self.llm_timeout_seconds, ) # Filter out hop-by-hop headers before returning the response excluded_headers = [ "content-encoding", "content-length", "transfer-encoding", "connection", "keep-alive", "proxy-authenticate", "proxy-authorization", "te", "trailers", "upgrade", ] response_headers = [ (name, value) for name, value in resp.raw.headers.items() if name.lower() not in excluded_headers ] if resp.status_code == 200: # NOTE: from Zhiyuan's code. # https://github.com/hzy46/verl_agent_mode/blob/2db65ea9858f645a914120357412a7540f8bd82d/verl/trainer/ppo/ray_trainer.py#L692-L711 # request_json = json.loads(request.get_data().decode("utf-8")) response_json = json.loads(resp.content.decode("utf-8")) # response_message = ChatCompletion(**response_json).choices[0].message.model_dump(exclude_unset=True, exclude_none=True) # tool_schemas = request_json.get("tools", None) # prompt_ids = self.tokenizer.apply_chat_template(request_json["messages"], tools=tool_schemas, add_generation_prompt=True, tokenize=True) # full_ids = self.tokenizer.apply_chat_template(request_json["messages"] + [response_message], tools=tool_schemas, add_generation_prompt=False, tokenize=True) # TBD: response_ids sometimes ends with "\n", shall we keep the extra "\n"? # sometimes it has some differences with the hacky method in the end, but this should align with ToolCompletionCallback # response_ids = full_ids[len(prompt_ids):] # NOTE (yuge): They are different. Don't know why. # assert response_json['prompt_token_ids'] == prompt_ids # patched_response_ids = response_json['response_token_ids'][0] # assert patched_response_ids == response_ids[:len(patched_response_ids)], f"{patched_response_ids} != {response_ids[:len(patched_response_ids)]}" # response_json['prompt_token_ids'] = prompt_ids # response_json['response_token_ids'] = [response_ids] replaced_return_content = json.dumps(response_json).encode("utf-8") return Response(replaced_return_content, status=resp.status_code, headers=response_headers) return Response(resp.content, resp.status_code, response_headers) except requests.exceptions.RequestException as e: abort(500, description=f"Error proxying request: {e}") def run_app(): app.run(host="0.0.0.0", port=self.proxy_port, threaded=True, debug=False) self._proxy_thread = threading.Thread(target=run_app, daemon=True) self._proxy_thread.start() print(f"Proxy server running on port {self.proxy_port}") async def _update_proxy_server_v1(self): model_name = self.train_information.get("model") if not model_name: raise ValueError("Model name is not set.") self.llm_proxy.update_model_list( [ ModelConfig( { "model_name": model_name, "litellm_params": { "model": "hosted_vllm/" + model_name, "api_base": f"http://{address}/v1/", }, } ) for address in self.backend_llm_server_addresses ], ) await self.llm_proxy.restart() def start(self): """Starts the main AgentLightningServer and the proxy server.""" if self.mode == "v0": def run_server(): """Run the AgentLightningServer in a separate thread.""" asyncio.run(self.server.run_forever()) self._server_thread = threading.Thread(target=run_server, daemon=True) self._server_thread.start() # Wait for the server's internal startup event to be set. print("Waiting for AgentLightningServer to start...") is_ready = self.server.startup_event.wait(timeout=20.0) # Wait up to 20s if not is_ready: raise RuntimeError("AgentLightningServer failed to start within the timeout period.") print(f"AgentLightningServer control plane running on port {self.server_port}") self._start_proxy_server_v0() else: # Agent lightning server is no longer needed; # Start proxy server in _async_set_up pass async def _async_set_up(self, data: Dict[str, Any], server_addresses: List[str], is_train: bool = True): """Async helper to set up data and resources on the server.""" self.clear_data_and_server() if server_addresses != self.backend_llm_server_addresses: self.backend_llm_server_addresses = server_addresses if self.mode == "v1" and not self.llm_proxy.is_running(): await self._update_proxy_server_v1() self.is_train = is_train # 1. Update resources on the server for clients to use if self.mode == "v0": llm_resource = LLM( endpoint=f"http://127.0.0.1:{self.proxy_port}/v1", model=self.train_information.get("model", "default-model"), sampling_parameters={ "temperature": self.train_information.get("temperature", 0.7 if is_train else 0.0) }, ) else: llm_resource = self.llm_proxy.as_resource( sampling_parameters={ "temperature": self.train_information.get("temperature", 0.7 if is_train else 0.0) }, ) resources: NamedResources = {"main_llm": llm_resource} if self.mode == "v0": resources_id = await self.server.update_resources(resources) else: resources_update = await self.store.add_resources(resources) resources_id = resources_update.resources_id # 2. Queue tasks for agents to process keys = list(data.keys()) num_samples = len(data[keys[0]]) rollouts_per_sample = self.train_rollout_n if is_train else 1 enqueue_rollout_requests: List[EnqueueRolloutRequest] = [] data_id_to_original_sample: Dict[str, Dict[str, Any]] = {} for i in range(num_samples): data_id = str(uuid.uuid4()) original_sample = {key: data[key][i] for key in keys} original_sample["data_id"] = data_id data_id_to_original_sample[data_id] = original_sample # For training, each sample is rolled out multiple times # Data ID is different from Rollout ID, as one data can have multiple rollouts. for _ in range(rollouts_per_sample): task_metadata = {"data_id": data_id, "is_train": is_train} if self.mode == "v0": # Queue immediately rollout_id = await self.server.queue_task( sample=_to_native(original_sample), mode="train" if is_train else "val", resources_id=resources_id, metadata=task_metadata, ) # Store original sample data to reconstruct batch information later self._task_id_to_original_sample[rollout_id] = original_sample self._total_tasks_queued += 1 else: # Collect tasks to enqueue in batch and queue them later enqueue_rollout_requests.append( EnqueueRolloutRequest( input=_to_native(original_sample), mode="train" if is_train else "val", resources_id=resources_id, config=RolloutConfig( unresponsive_seconds=self.llm_timeout_seconds, timeout_seconds=self.llm_timeout_seconds, ), metadata=task_metadata, ) ) if self.mode == "v1": # Enqueue all the tasks in a single batch rollouts = await self.store.enqueue_many_rollouts(enqueue_rollout_requests) self._task_id_to_original_sample.update( { # Recover the original data and store it for later use. rollout.rollout_id: data_id_to_original_sample[cast(Dict[str, Any], rollout.metadata)["data_id"]] for rollout in rollouts } ) self._total_tasks_queued += len(rollouts) def set_up_data_and_server(self, data: Dict[str, Any], server_addresses: List[str], is_train: bool = True): """Synchronous wrapper for setting up data and server resources.""" coro = self._async_set_up(data, server_addresses, is_train) if self.mode == "v0": if not self.server.loop or not self.server.startup_event.is_set(): raise RuntimeError("Server is not running or ready.") future = asyncio.run_coroutine_threadsafe(coro, self.server.loop) else: if self._internal_loop is None: raise RuntimeError("Internal loop is not running.") future = asyncio.run_coroutine_threadsafe(coro, self._internal_loop) try: future.result(timeout=60) # Wait for completion with a timeout except Exception as e: print(f"Failed to set up data on server: {e}") raise def _validate_data(self, rollout: RolloutLegacy): if rollout.final_reward is None: print( f"Warning: Reward is None for rollout {rollout.rollout_id}, will be auto-set to {self.reward_fillna_value}." ) if rollout.triplets is None: print(f"Warning: Triplet is None for rollout {rollout.rollout_id}.") elif len(rollout.triplets) == 0: print(f"Warning: Length of triplets is 0 for rollout {rollout.rollout_id}.") elif any(not r.response.get("token_ids", []) for r in rollout.triplets): print(f"Warning: Rollout {rollout.rollout_id} contains empty response: {rollout.triplets}") elif any(not r.prompt.get("token_ids", []) for r in rollout.triplets): print(f"Warning: Rollout {rollout.rollout_id} contains empty prompt: {rollout.triplets}") async def _validate_data_v1(self, rollout: Rollout) -> RolloutLegacy: """Convert Rollout to RolloutLegacy and validate. 1. Task: construct from Rollout 2. Triplets: obtained by querying spans and feeding into the adapter 3. Final reward: extracted from last triplet's reward, searching backwards if not found """ # Query spans for this rollout (latest attempt) spans = await self.store.query_spans(rollout.rollout_id, attempt_id="latest") final_reward = find_final_reward(spans) # Convert spans to triplets using the adapter if not spans: # No triplets found, will emit a warning later. triplets = [] else: # triplets = self.adapter.adapt(spans) triplets = self.adapter.adapt_group(spans) # # Extract final reward from triplets # final_reward: Optional[float] = None # if triplets: # # Search backwards through triplets for the first non-None reward # for triplet in reversed(triplets): # if triplet.reward is not None: # final_reward = triplet.reward # break # Construct the Task object from Rollout task = Task( rollout_id=rollout.rollout_id, input=rollout.input, mode=rollout.mode, resources_id=rollout.resources_id, metadata=rollout.metadata or {}, ) # Create the Rollout object (without trace and logs as per user's note) result_rollout = RolloutLegacy( rollout_id=rollout.rollout_id, task=task, final_reward=final_reward, triplets=triplets, metadata=rollout.metadata or {}, ) # Run the same validation as v0 self._validate_data(result_rollout) return result_rollout async def _async_run_until_finished(self, verbose: bool = True): """Async helper to wait for all tasks to complete.""" while len(self._completed_rollouts_v0) < self._total_tasks_queued: if self.mode == "v0": completed_batch = await self.server.retrieve_completed_rollouts() else: completed_batch = await self.store.wait_for_rollouts( rollout_ids=list(self._task_id_to_original_sample.keys()), timeout=0 ) for rollout in completed_batch: if rollout.rollout_id in self._completed_rollouts_v0: # Already processed, skip continue if isinstance(rollout, Rollout): rollout = await self._validate_data_v1(rollout) else: self._validate_data(rollout) if rollout.rollout_id not in self._task_id_to_original_sample: print(f"Warning: Received unknown rollout ID {rollout.rollout_id}, skipping.") else: self._completed_rollouts_v0[rollout.rollout_id] = rollout if verbose: print(f"Completed {len(self._completed_rollouts_v0)}/{self._total_tasks_queued} tasks...") await asyncio.sleep(5) print("All tasks finished.") def run_until_all_finished(self, verbose: bool = True): """Synchronously waits for all queued tasks to be completed and reported.""" if self._total_tasks_queued == 0: print("Warning: No tasks were queued.") return if self.mode == "v0": if not self.server.loop or not self.server.startup_event.is_set(): raise RuntimeError("Server is not running or ready.") loop = self.server.loop else: loop = self._internal_loop assert loop is not None coro = self._async_run_until_finished(verbose) future = asyncio.run_coroutine_threadsafe(coro, loop) try: future.result() # Wait indefinitely for all tasks to complete except Exception as e: print(f"Error while waiting for tasks to finish: {e}") raise def get_test_metrics(self): """Calculates and returns metrics for a validation run.""" assert not self.is_train, "This method should only be called during validation." assert len(self._completed_rollouts_v0) == self._total_tasks_queued sample_stat_list: List[Dict[str, Any]] = [] sample_stat_list_by_source: Dict[str, List[Dict[str, Any]]] = defaultdict( list ) # FIXME: Evaluate whether grouping stats by source is actually needed. for rollout_id, rollout in self._completed_rollouts_v0.items(): final_reward_raw: Optional[float] = rollout.final_reward final_reward = self._fillna_reward(rollout) if not rollout.triplets: print(f"Warning: No triplets found for test rollout {rollout.rollout_id}.") sample_stat_list.append({"reward": final_reward, "has_reward": final_reward_raw is not None}) continue response_length_list = [len(triplet.response.get("token_ids", [])) for triplet in rollout.triplets] if "data_source" in self._task_id_to_original_sample[rollout_id]: # When a test sample includes a 'data_source' field, record per-source statistics for test results. # TODO: This is a flawed design. We should have a better way to handle this. data_source = self._task_id_to_original_sample[rollout_id]["data_source"] sample_stat_list_by_source[data_source].append( { "sum_response_length": np.sum(response_length_list), "mean_response_length": np.mean(response_length_list) if response_length_list else 0, "turn_count": len(rollout.triplets), "reward": final_reward, "has_reward": final_reward_raw is not None, } ) sample_stat_list.append( { "sum_response_length": np.sum(response_length_list), "mean_response_length": np.mean(response_length_list) if response_length_list else 0, "turn_count": len(rollout.triplets), "reward": final_reward, "has_reward": final_reward_raw is not None, } ) metric_dict: Dict[str, Any] = {} stats_w_trace = [stat for stat in sample_stat_list if "sum_response_length" in stat] stats_w_trace_by_source = { data_source: [stat for stat in sample_stats if "sum_response_length" in stat] for data_source, sample_stats in sample_stat_list_by_source.items() } for data_source, sample_stats in sample_stat_list_by_source.items(): metric_dict.update( { f"val/{data_source}/n_rollouts": len(sample_stats), f"val/{data_source}/n_rollouts_w_trace": len(stats_w_trace_by_source[data_source]), f"val/{data_source}/n_rollouts_w_reward": len( [stat for stat in sample_stats if stat["has_reward"]] ), f"val/{data_source}/reward": np.mean( [stat["reward"] for stat in sample_stats] ), # each rollout must have a reward (fillna if missing) f"val/{data_source}/mean_response_length": np.mean( [stat["mean_response_length"] for stat in stats_w_trace_by_source[data_source]] ), f"val/{data_source}/sum_response_length": np.mean( [stat["sum_response_length"] for stat in stats_w_trace_by_source[data_source]] ), f"val/{data_source}/turn_count": np.mean( [stat["turn_count"] for stat in stats_w_trace_by_source[data_source]] ), } ) metric_dict.update( { "val/n_rollouts": len(sample_stat_list), "val/n_rollouts_w_trace": len(stats_w_trace), "val/n_rollouts_w_reward": len([stat for stat in sample_stat_list if stat["has_reward"]]), "val/reward": np.mean( [stat["reward"] for stat in sample_stat_list] ), # each rollout must have a reward (fillna if missing) "val/mean_response_length": np.mean([stat["mean_response_length"] for stat in stats_w_trace]), "val/sum_response_length": np.mean([stat["sum_response_length"] for stat in stats_w_trace]), "val/turn_count": np.mean([stat["turn_count"] for stat in stats_w_trace]), } ) return metric_dict def get_train_data_batch( self, max_prompt_length: int, max_response_length: int, device: torch.device, use_final_reward_as_step_reward: bool = True, use_intrinsic_reward: bool = False, is_gigpo: bool = False, ): """ Processes completed rollouts to generate a training data batch. This function reconstructs the logic from the original AgentModeDaemon, using data retrieved from the new server architecture. It handles padding, truncation, and tensor creation for the PPO training loop. """ assert self.is_train, "This method should only be called during training." assert len(self._completed_rollouts_v0) == self._total_tasks_queued # 1. Reconstruct the `finished_id_to_sample_info` structure from completed rollouts finished_id_to_sample_info: Dict[str, Dict[str, Any]] = {} finished_id_to_final_reward: Dict[str, float] = {} sample_with_reward_count = 0 for rollout_id, rollout in self._completed_rollouts_v0.items(): original_sample = self._task_id_to_original_sample[rollout_id] sample_with_reward_count += int(rollout.final_reward is not None) final_reward = self._fillna_reward(rollout) if not rollout.triplets: finished_id_to_final_reward[rollout_id] = final_reward print(f"Warning: No triplets found for training rollout {rollout.rollout_id}, skipping.") continue # The client should report triplets that contain prompt_ids and response_ids. # Example triplet.prompt: {"token_ids": [...]} # Example triplet.response: {"token_ids": [...]} # trace_list = [ # {"prompt_ids": t.prompt.get("token_ids", []), "response_ids": t.response.get("token_ids", [])} # for t in rollout.triplets # ] trace_list = [] for t in rollout.triplets: trace_dict = { "prompt_ids": t.prompt.get("token_ids", []), "response_ids": t.response.get("token_ids", []), "step_reward": t.reward, "step_intrinsic_reward": t.metadata.get("intrinsic_reward", 0.0), "message": t.metadata.get("message", ""), } trace_list.append(trace_dict) info = { "final_reward": final_reward, "trace_list": trace_list, "data_id": original_sample["data_id"], } finished_id_to_sample_info[rollout_id] = info finished_id_to_final_reward[rollout_id] = final_reward # # --- Data processing and tensor creation logic --- # Get all the reported data. # prompt_ids are left-padded. # response_ids are right-padded. # They are concatenated in the middle. # Discard handling: # - Those exceeding max_prompt_length will be marked for discard, but not # discarded here. They are only truncated and marked, to be discarded later. # This is for the correctness of the advantage calculation. # - The discard for the PPO mini-batch should also be handled this way. input_ids_list: List[List[int]] = [] input_attention_mask_list: List[List[int]] = [] response_ids_list: List[List[int]] = [] response_attention_mask_list: List[List[int]] = [] final_reward_list: List[float] = [] step_reward_list: List[float] = [] data_id_list: List[str] = [] rollout_id_list: List[str] = [] turn_index_list: List[int] = [] is_drop_list: List[bool] = [] n_trunc_sample_because_of_response = 0 # optional fields step_intrinsic_reward_list: List[float] = [] message_list: List[str] = [] for rollout_id, sample_info in finished_id_to_sample_info.items(): for turn_index, trace in enumerate(sample_info["trace_list"]): final_reward_list.append(sample_info["final_reward"]) step_reward_list.append(trace["step_reward"]) step_intrinsic_reward_list.append(trace["step_intrinsic_reward"]) message_list.append(trace["message"]) prompt_ids, response_ids = trace["prompt_ids"], trace["response_ids"] # Mark samples with prompts exceeding max_prompt_length to be dropped later if len(prompt_ids) > max_prompt_length: prompt_ids = prompt_ids[:max_prompt_length] is_drop_list.append(True) else: is_drop_list.append(False) # Truncate responses that exceed max_response_length if len(response_ids) > max_response_length: response_ids = response_ids[:max_response_length] n_trunc_sample_because_of_response += 1 # Pad prompts to the left and responses to the right one_input_ids, one_input_attention_mask = get_left_padded_ids_and_attention_mask( prompt_ids, max_prompt_length, self.pad_token_id ) one_response_ids, one_response_attention_mask = get_right_padded_ids_and_attention_mask( response_ids, max_response_length, self.pad_token_id ) input_ids_list.append(one_input_ids) input_attention_mask_list.append(one_input_attention_mask) response_ids_list.append(one_response_ids) response_attention_mask_list.append(one_response_attention_mask) data_id_list.append(sample_info["data_id"]) rollout_id_list.append(rollout_id) turn_index_list.append(turn_index) n_transition = len(input_ids_list) batch_input_ids = torch.LongTensor(input_ids_list).to(device) input_attention_mask = torch.LongTensor(input_attention_mask_list).to(device) batch_response_ids = torch.LongTensor(response_ids_list).to(device) response_attention_mask = torch.LongTensor(response_attention_mask_list).to(device) # Concatenate prompts and responses to form the full sequence batch_seq = torch.cat([batch_input_ids, batch_response_ids], dim=-1) attention_mask = torch.cat([input_attention_mask, response_attention_mask], dim=-1) position_ids = torch.clamp(torch.cumsum(attention_mask, dim=-1) - 1, min=0) is_drop_mask = torch.BoolTensor(is_drop_list).to(device) if use_final_reward_as_step_reward: scores = torch.tensor(final_reward_list, dtype=torch.float32).to(device) else: scores = torch.tensor(step_reward_list, dtype=torch.float32).to(device) # Create token-level scores by placing the final reward at the last token position token_level_scores = torch.zeros_like(attention_mask, dtype=scores.dtype) # At the eos_mask_idx position of each sample, fill in the corresponding scores. # torch.arange(n_transition) generates [0,1,2,...,bsz-1] as indices for the batch dimension. eos_mask_idx = torch.argmax(position_ids * attention_mask, dim=-1) # (bsz,) token_level_scores[torch.arange(n_transition), eos_mask_idx] = scores # Only take the last response_length part of the sequence to get the token-level scores for the model's response part. token_level_scores = token_level_scores[:, -max_response_length:] # Create token-level intrinsic rewards token_level_intrinsic_rewards = None if use_intrinsic_reward: step_intrinsic_reward_list = [0.0 if reward is None else reward for reward in step_intrinsic_reward_list] intrinsic_rewards = torch.tensor(step_intrinsic_reward_list, dtype=torch.float32).to(device) token_level_intrinsic_rewards = torch.zeros_like(attention_mask, dtype=intrinsic_rewards.dtype) token_level_intrinsic_rewards[torch.arange(n_transition), eos_mask_idx] = intrinsic_rewards token_level_intrinsic_rewards = token_level_intrinsic_rewards[:, -max_response_length:] # Form the final batch using TensorDict batch_dict = { "prompts": batch_input_ids, "responses": batch_response_ids, "input_ids": batch_seq, # here input_ids become the whole sentences "attention_mask": attention_mask, "position_ids": position_ids, "is_drop_mask": is_drop_mask, "token_level_scores": token_level_scores.contiguous(), } batch_dict["step_rewards"] = torch.tensor(np.array(step_reward_list), dtype=torch.float32).to(device) if use_intrinsic_reward: batch_dict["step_intrinsic_rewards"] = torch.tensor( np.array(step_intrinsic_reward_list), dtype=torch.float32 ).to(device) batch_dict["token_level_intrinsic_rewards"] = token_level_intrinsic_rewards.contiguous() batch = TensorDict(batch_dict, batch_size=n_transition) data_proto = DataProto(batch=batch) data_metrics = { "training/reward": np.mean(list(finished_id_to_final_reward.values())), "training/n_rollouts": len(finished_id_to_final_reward), "training/n_rollouts_w_trace": len(finished_id_to_sample_info), "training/n_rollouts_w_reward": sample_with_reward_count, "training/n_truncated_triplets": n_trunc_sample_because_of_response, "training/n_triplets": n_transition, } # Add non-tensor data for advantage calculation and logging data_proto.non_tensor_batch["data_id_list"] = np.array(data_id_list) # type: ignore data_proto.non_tensor_batch["rollout_id_list"] = np.array(rollout_id_list) # type: ignore data_proto.non_tensor_batch["turn_index_list"] = np.array(turn_index_list) # type: ignore data_proto.non_tensor_batch["step_rewards"] = np.array(step_reward_list) if is_gigpo: data_proto.non_tensor_batch["anchor_obs"] = np.array(message_list) return data_proto, data_metrics def clear_data_and_server(self): """Resets the internal state of the daemon for the next run.""" self.backend_llm_server_addresses = [] self._completed_rollouts_v0.clear() self._task_id_to_original_sample.clear() self._total_tasks_queued = 0 # For a true reset, the server's internal queues would also need clearing. # This implementation assumes that `set_up_data_and_server` is called # for each new run, effectively starting a fresh batch. def _fillna_reward(self, rollout: RolloutLegacy): if rollout.final_reward is None: if self.reward_fillna_value is not None: # type: ignore final_reward = self.reward_fillna_value else: raise ValueError(f"Reward is None for rollout {rollout.rollout_id}, please check the reward function.") else: final_reward = rollout.final_reward return final_reward ================================================ FILE: contrib/agentlightning/contrib/algorithm/env_verl/trainer.py ================================================ # Copyright (c) Microsoft. All rights reserved. # type: ignore from __future__ import annotations import random from contextlib import contextmanager from copy import deepcopy from pprint import pprint from typing import Dict, Tuple, Type import numpy as np import torch import verl from codetiming import Timer from omegaconf import OmegaConf from tqdm import tqdm from verl import DataProto from verl.protocol import pad_dataproto_to_divisor, unpad_dataproto from verl.trainer.ppo.core_algos import agg_loss from verl.trainer.ppo.metric_utils import ( _compute_response_info, compute_throughout_metrics, compute_timing_metrics, ) from verl.trainer.ppo.ray_trainer import ( AdvantageEstimator, RayPPOTrainer, apply_kl_penalty, compute_advantage, compute_response_mask, ) from verl.utils.metric import reduce_metrics from verl.utils.tracking import Tracking from agentlightning.adapter import TraceAdapter, TraceToTripletBase from agentlightning.llm_proxy import LLMProxy from agentlightning.store.base import LightningStore from .daemon import EnvAgentModeDaemon __all__ = [ "EnvAgentLightningTrainer", ] @contextmanager def _timer(name: str, timing_raw: Dict[str, float]): with Timer(name=name, logger=None) as timer: yield if name not in timing_raw: timing_raw[name] = 0 timing_raw[name] += timer.last # This function is adapted from verl. # We introduce a new parameter `suffix` to distinguish between metrics computed # before and after AgentLightning’s post-processing. # - "Before" refers to raw reward and advantage values. # - "After" refers to values computed following post-processing, which involves: # (1) Dropping prompts that exceed the maximum allowed length. # (2) Adjusting the batch size to be a multiple of the mini PPO size. # Different suffixes are used to label these two stages accordingly. def compute_data_metrics(batch: DataProto, use_critic: bool = True, suffix: str = "") -> Dict[str, Any]: """ Computes various metrics from a batch of data for PPO training. This function calculates metrics related to scores, rewards, advantages, returns, values, and sequence lengths from a batch of data. It provides statistical information (mean, max, min) for each metric category. Args: batch: A DataProto object containing batch data with token-level scores, rewards, advantages, etc. use_critic: Whether to include critic-specific metrics. Defaults to True. Returns: A dictionary of metrics including: - critic/score/mean, max, min: Statistics about sequence scores - critic/rewards/mean, max, min: Statistics about sequence rewards - critic/advantages/mean, max, min: Statistics about advantages - critic/returns/mean, max, min: Statistics about returns - critic/values/mean, max, min: Statistics about critic values (if use_critic=True) - critic/vf_explained_var: Explained variance of the value function (if use_critic=True) - response_length/mean, max, min, clip_ratio: Statistics about response lengths - prompt_length/mean, max, min, clip_ratio: Statistics about prompt lengths """ sequence_score = batch.batch["token_level_scores"].sum(-1) sequence_reward = batch.batch["token_level_rewards"].sum(-1) advantages = batch.batch["advantages"] returns = batch.batch["returns"] max_response_length = batch.batch["responses"].shape[-1] prompt_mask = batch.batch["attention_mask"][:, :-max_response_length].bool() response_mask = batch.batch["attention_mask"][:, -max_response_length:].bool() max_prompt_length = prompt_mask.size(-1) response_info = _compute_response_info(batch) prompt_length = response_info["prompt_length"] response_length = response_info["response_length"] valid_adv = torch.masked_select(advantages, response_mask) valid_returns = torch.masked_select(returns, response_mask) if use_critic: values = batch.batch["values"] valid_values = torch.masked_select(values, response_mask) return_diff_var = torch.var(valid_returns - valid_values) return_var = torch.var(valid_returns) metrics = { # score "critic/score/mean" + suffix: torch.mean(sequence_score).detach().item(), "critic/score/max" + suffix: torch.max(sequence_score).detach().item(), "critic/score/min" + suffix: torch.min(sequence_score).detach().item(), # reward "critic/rewards/mean" + suffix: torch.mean(sequence_reward).detach().item(), "critic/rewards/max" + suffix: torch.max(sequence_reward).detach().item(), "critic/rewards/min" + suffix: torch.min(sequence_reward).detach().item(), # adv "critic/advantages/mean" + suffix: torch.mean(valid_adv).detach().item(), "critic/advantages/max" + suffix: torch.max(valid_adv).detach().item(), "critic/advantages/min" + suffix: torch.min(valid_adv).detach().item(), # returns "critic/returns/mean" + suffix: torch.mean(valid_returns).detach().item(), "critic/returns/max" + suffix: torch.max(valid_returns).detach().item(), "critic/returns/min" + suffix: torch.min(valid_returns).detach().item(), **( { # values "critic/values/mean" + suffix: torch.mean(valid_values).detach().item(), "critic/values/max" + suffix: torch.max(valid_values).detach().item(), "critic/values/min" + suffix: torch.min(valid_values).detach().item(), # vf explained var "critic/vf_explained_var" + suffix: (1.0 - return_diff_var / (return_var + 1e-5)).detach().item(), } if use_critic else {} ), # response length "response_length/mean" + suffix: torch.mean(response_length).detach().item(), "response_length/max" + suffix: torch.max(response_length).detach().item(), "response_length/min" + suffix: torch.min(response_length).detach().item(), "response_length/clip_ratio" + suffix: torch.mean(torch.eq(response_length, max_response_length).float()).detach().item(), # prompt length "prompt_length/mean" + suffix: torch.mean(prompt_length).detach().item(), "prompt_length/max" + suffix: torch.max(prompt_length).detach().item(), "prompt_length/min" + suffix: torch.min(prompt_length).detach().item(), "prompt_length/clip_ratio" + suffix: torch.mean(torch.eq(prompt_length, max_prompt_length).float()).detach().item(), } return metrics class EnvAgentLightningTrainer(RayPPOTrainer): """ Specialized PPO trainer for agent-based reinforcement learning. This trainer is designed specifically for scenarios where the model interacts with external environments, tools, or APIs through an AgentLightningServer. It simplifies the training loop by removing the complex conditional logic present in the original RayPPOTrainer and focusing on the agent mode workflow. Key differences from RayPPOTrainer: 1. Uses AgentModeDaemon for server communication 2. Simplified data flow without pop/union operations 3. Direct batch processing through agent daemon 4. Streamlined validation using agent_mode validation """ def __init__( self, store: LightningStore | None, llm_proxy: LLMProxy | None, adapter: TraceAdapter | None, daemon_cls: Type[EnvAgentModeDaemon], **kwargs, ): super().__init__(**kwargs) self.store = store self.llm_proxy = llm_proxy self.adapter = adapter self.daemon_cls = daemon_cls def _validate(self): assert len(self.val_dataloader) == 1, "Please set val_batch_size to None for better throughput." test_data = next(iter(self.val_dataloader)) test_batch = DataProto.from_single_dict(test_data) self.async_rollout_manager.wake_up() self.agent_mode_daemon.set_up_data_and_server( test_batch.non_tensor_batch, self.async_rollout_manager.server_addresses, is_train=False, ) self.agent_mode_daemon.run_until_all_finished() test_metrics = self.agent_mode_daemon.get_test_metrics() self.agent_mode_daemon.clear_data_and_server() self.async_rollout_manager.sleep() return test_metrics def _compute_reference_log_prob(self, batch: DataProto) -> DataProto: """Compute reference log probability using the correct worker based on LoRA configuration. In verl 0.6.0+, when LoRA is detected (indicated by ref_in_actor=True), the reference policy is computed by the actor rollout worker instead of a separate ref policy worker. This method handles both scenarios by checking the ref_in_actor flag. Note: verl sets ref_in_actor=True when it detects LoRA configuration (e.g., lora_rank > 0 or lora_adapter_path is set). Args: batch: The data batch to compute reference log probabilities for. Returns: DataProto with reference log probabilities added. Raises: RuntimeError: If the required worker is not available. """ if getattr(self, "ref_in_actor", False): actor_worker = getattr(self, "actor_rollout_wg", None) if actor_worker is None: raise RuntimeError("actor_rollout_wg is required when ref_in_actor is True.") return actor_worker.compute_ref_log_prob(batch) ref_worker = getattr(self, "ref_policy_wg", None) if ref_worker is None: raise RuntimeError( "Reference policy worker was not initialized. " "Ensure `use_reference_policy` is enabled and the VERL config exposes the ref worker." ) return ref_worker.compute_ref_log_prob(batch) def _train_step(self, batch_dict: dict) -> dict: # Isolate in a separate method to automatically recycle the variables before validation. batch: DataProto = DataProto.from_single_dict(batch_dict) metrics = {} timing_raw = {} with _timer("step", timing_raw): # When agent mode is enabled, we read the batch as it is. gen_batch = batch # generate a batch with _timer("gen", timing_raw): self.async_rollout_manager.wake_up() self.agent_mode_daemon.set_up_data_and_server( gen_batch.non_tensor_batch, self.async_rollout_manager.server_addresses ) self.agent_mode_daemon.run_until_all_finished() batch, agent_metrics = self.agent_mode_daemon.get_train_data_batch( max_prompt_length=self.config.data.max_prompt_length, max_response_length=self.config.data.max_response_length, device=gen_batch.batch["fake_ids"].device, use_final_reward_as_step_reward=self.config.algorithm.use_final_reward_as_step_reward, use_intrinsic_reward=self.config.algorithm.use_intrinsic_reward, ) metrics.update(agent_metrics) self.agent_mode_daemon.clear_data_and_server() self.async_rollout_manager.sleep() if self.config.algorithm.adv_estimator == AdvantageEstimator.REMAX: with _timer("gen_max", timing_raw): gen_baseline_batch = deepcopy(gen_batch) gen_baseline_batch.meta_info["do_sample"] = False gen_baseline_output = self.async_rollout_manager.generate_sequences(gen_baseline_batch) batch = batch.union(gen_baseline_output) reward_baseline_tensor = self.reward_fn(batch) reward_baseline_tensor = reward_baseline_tensor.sum(dim=-1) batch.pop(batch_keys=list(gen_baseline_output.batch.keys())) batch.batch["reward_baselines"] = reward_baseline_tensor del gen_baseline_batch, gen_baseline_output # uid is used for algorithm like GRPO, should be aligned to data id batch.non_tensor_batch["uid"] = batch.non_tensor_batch["data_id_list"] batch.batch["response_mask"] = compute_response_mask(batch) # compute global_valid tokens batch.meta_info["global_token_num"] = torch.sum(batch.batch["attention_mask"], dim=-1).tolist() with _timer("reward", timing_raw): # compute reward model score if self.use_rm: reward_tensor = self.rm_wg.compute_rm_score(batch) batch = batch.union(reward_tensor) reward_extra_infos_dict = {} # for agent mode, pad the lengths to calculate old log prob, ref, and values batch, pad_size = pad_dataproto_to_divisor(batch, self.actor_rollout_wg.world_size) # recompute old_log_probs with _timer("old_log_prob", timing_raw): old_log_prob = self.actor_rollout_wg.compute_log_prob(batch) entropys = old_log_prob.batch["entropys"] response_masks = batch.batch["response_mask"] loss_agg_mode = self.config.actor_rollout_ref.actor.loss_agg_mode entropy_loss = agg_loss(loss_mat=entropys, loss_mask=response_masks, loss_agg_mode=loss_agg_mode) old_log_prob_metrics = {"actor/entropy_loss": entropy_loss.detach().item()} metrics.update(old_log_prob_metrics) old_log_prob.batch.pop("entropys") batch = batch.union(old_log_prob) if self.use_reference_policy: # compute reference log_prob with _timer("ref", timing_raw): ref_log_prob = self._compute_reference_log_prob(batch) batch = batch.union(ref_log_prob) # compute values if self.use_critic: with _timer("values", timing_raw): values = self.critic_wg.compute_values(batch) batch = batch.union(values) # for agent mode, unpad to calculate adv # it is important, as adv should be based on the raw traces batch = unpad_dataproto(batch, pad_size=pad_size) with _timer("adv", timing_raw): # if agent_mode is enabled, there is already token_level_scores # token_level_scores is not needed to compute here # compute rewards. apply_kl_penalty if available if self.config.algorithm.use_kl_in_reward: batch, kl_metrics = apply_kl_penalty( batch, kl_ctrl=self.kl_ctrl_in_reward, kl_penalty=self.config.algorithm.kl_penalty ) metrics.update(kl_metrics) else: if self.config.algorithm.use_intrinsic_reward: batch.batch["token_level_rewards"] = ( batch.batch["token_level_scores"] + batch.batch["token_level_intrinsic_rewards"] ) # (bs, seq_len) else: batch.batch["token_level_rewards"] = batch.batch["token_level_scores"] # compute advantages, executed on the driver process norm_adv_by_std_in_grpo = self.config.algorithm.get( "norm_adv_by_std_in_grpo", True ) # GRPO adv normalization factor batch = compute_advantage( batch, adv_estimator=self.config.algorithm.adv_estimator, gamma=self.config.algorithm.gamma, lam=self.config.algorithm.lam, num_repeat=self.config.actor_rollout_ref.rollout.n, norm_adv_by_std_in_grpo=norm_adv_by_std_in_grpo, config=self.config.algorithm, ) # Calculate the metrics before processing. Refer to the comments of function `compute_data_metrics` for details. metrics.update(compute_data_metrics(batch=batch, use_critic=self.use_critic, suffix="_before_processing")) # after advantages are assinged, we begin to drop (1) long prompt (2) floor to ppo minisize keep_indices = (~batch.batch["is_drop_mask"]).nonzero(as_tuple=True)[0] metrics["training/n_triplets_prompt_too_long"] = ( batch.batch["is_drop_mask"].shape[0] - keep_indices.shape[0] ) batch = batch[keep_indices] # next, round to minibatch size mini_batch_size = self.config.actor_rollout_ref.actor.ppo_mini_batch_size n_transition = len(batch) random_indices = list(range(n_transition)) random.shuffle(random_indices) batch.reorder(torch.tensor(random_indices).type(torch.int32)) n_remained_transition = n_transition // mini_batch_size * mini_batch_size batch = batch[list(range(n_remained_transition))] metrics["training/n_triplets_dropped_remainder"] = n_transition - n_remained_transition # Agent mode note: Change the order of balance batch; # 1. first calculate advantage # 2. then drop the samples (too long prompt & floor to ppo minisize) # 3. balance # balance the number of valid tokens on each dp rank. # Note that this breaks the order of data inside the batch. # Please take care when you implement group based adv computation such as GRPO and rloo if self.config.trainer.balance_batch: self._balance_batch(batch, metrics=metrics) # update critic if self.use_critic: with _timer("update_critic", timing_raw): critic_output = self.critic_wg.update_critic(batch) critic_output_metrics = reduce_metrics(critic_output.meta_info["metrics"]) metrics.update(critic_output_metrics) # implement critic warmup if self.config.trainer.critic_warmup <= self.global_steps: # update actor with _timer("update_actor", timing_raw): batch.meta_info["multi_turn"] = self.config.actor_rollout_ref.rollout.multi_turn.enable actor_output = self.actor_rollout_wg.update_actor(batch) actor_output_metrics = reduce_metrics(actor_output.meta_info["metrics"]) metrics.update(actor_output_metrics) # Log rollout generations if enabled rollout_data_dir = self.config.trainer.get("rollout_data_dir", None) if rollout_data_dir: with _timer("dump_rollout_generations", timing_raw): print(batch.batch.keys()) inputs = self.tokenizer.batch_decode(batch.batch["prompts"], skip_special_tokens=True) outputs = self.tokenizer.batch_decode(batch.batch["responses"], skip_special_tokens=True) scores = batch.batch["token_level_scores"].sum(-1).cpu().tolist() self._dump_generations( inputs=inputs, outputs=outputs, scores=scores, reward_extra_infos_dict=reward_extra_infos_dict, dump_path=rollout_data_dir, ) # compute training metrics metrics.update(compute_data_metrics(batch=batch, use_critic=self.use_critic, suffix="_after_processing")) metrics.update(compute_timing_metrics(batch=batch, timing_raw=timing_raw)) # TODO: implement actual tflpo and theoretical tflpo n_gpus = self.resource_pool_manager.get_n_gpus() metrics.update(compute_throughout_metrics(batch=batch, timing_raw=timing_raw, n_gpus=n_gpus)) return metrics def fit(self): logger = Tracking( project_name=self.config.trainer.project_name, experiment_name=self.config.trainer.experiment_name, default_backend=self.config.trainer.logger, config=OmegaConf.to_container(self.config, resolve=True), ) self.global_steps = 0 # load checkpoint before doing anything self._load_checkpoint() assert self.async_rollout_mode, "If agent mode is enabled, async server must be enabled" if self.adapter is not None and not isinstance(self.adapter, TraceToTripletBase): raise ValueError("Adapter must be a TraceToTripletBase for currently VERL implementation.") verl_version = verl.__version__ if verl_version == "0.5.0": # Note (Zhiyuan): To avoid further patch into vllm async server, using the same sentence to get the naming here. # However, it is possible that verl updates the naming and causes incompatibility. # Reference: https://github.com/volcengine/verl/blob/5b5e09d9cc20625e436d01f69d9cc739ff681c54/verl/workers/rollout/vllm_rollout/vllm_async_server.py#L217 model = "/".join(self.config.actor_rollout_ref.model.path.split("/")[-2:]) else: # For other versions (e.g., 0.6.0), we use the full path to the model. model = self.config.actor_rollout_ref.model.path self.agent_mode_daemon = self.daemon_cls( self.config.agentlightning.port, self.config.actor_rollout_ref.rollout.n, train_information={ "model": model, "temperature": self.config.actor_rollout_ref.rollout.temperature, }, tokenizer=self.tokenizer, mini_batch_size=self.config.actor_rollout_ref.actor.ppo_mini_batch_size, pad_token_id=self.tokenizer.pad_token_id, mode="v1" if self.store is not None else "v0", store=self.store, llm_proxy=self.llm_proxy, adapter=self.adapter, ) self.agent_mode_daemon.start() # perform validation before training # currently, we only support validation using the reward_function. if self.val_reward_fn is not None and self.config.trainer.get("val_before_train", True): val_metrics = self._validate() assert val_metrics, f"{val_metrics=}" pprint(f"Initial validation metrics: {val_metrics}") logger.log(data=val_metrics, step=self.global_steps) if self.config.trainer.get("val_only", False): return # add tqdm progress_bar = tqdm(total=self.total_training_steps, initial=self.global_steps, desc="Training Progress") # we start from step 1 self.global_steps += 1 last_val_metrics = None for epoch in range(self.config.trainer.total_epochs): for batch_dict in self.train_dataloader: metrics = {} timing_raw = {} is_last_step = self.global_steps >= self.total_training_steps # train step metrics = self._train_step(batch_dict) # validate if ( self.val_reward_fn is not None and self.config.trainer.test_freq > 0 and (is_last_step or self.global_steps % self.config.trainer.test_freq == 0) ): with _timer("validate", timing_raw): val_metrics: dict = self._validate() if is_last_step: last_val_metrics = val_metrics metrics.update(val_metrics) if self.config.trainer.save_freq > 0 and ( is_last_step or self.global_steps % self.config.trainer.save_freq == 0 ): with _timer("save_checkpoint", timing_raw): self._save_checkpoint() # step metrics metrics.update( { "training/global_step": self.global_steps, "training/epoch": epoch, } ) # TODO: make a canonical logger that supports various backend logger.log(data=metrics, step=self.global_steps) if is_last_step: pprint(f"Final validation metrics: {last_val_metrics}") progress_bar.close() # This exit logic is to ensure a robust CI. pprint(f"Flush the logger...") del logger # Make sure the loggers are flushed and closed properly pprint(f"Training finished at step {self.global_steps}.") return progress_bar.update(1) self.global_steps += 1 ================================================ FILE: contrib/agentlightning/contrib/reward/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Namespace package for agentlightning.contrib.reward. ================================================ FILE: contrib/agentlightning/contrib/reward/agentos.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ PolicyReward - Convert Policy Violations to RL Penalties ========================================================= Reward function that integrates Agent-OS governance. """ from __future__ import annotations import logging from typing import Any, Callable, Dict, Optional logger = logging.getLogger(__name__) class PolicyReward: """ Reward function that penalizes policy violations. Example: >>> from agent_os import KernelSpace >>> >>> kernel = KernelSpace(policy="strict") >>> reward_fn = PolicyReward(kernel, base_reward_fn=accuracy) >>> >>> reward = reward_fn(rollout) # Base reward - violation penalties """ def __init__( self, kernel: Any, *, base_reward_fn: Optional[Callable[[Any], float]] = None, critical_penalty: float = -100.0, high_penalty: float = -50.0, medium_penalty: float = -10.0, low_penalty: float = -1.0, clean_bonus: float = 5.0, ): """ Initialize policy-aware reward. Args: kernel: Agent-OS KernelSpace base_reward_fn: Base reward function critical_penalty: Penalty for critical violations high_penalty: Penalty for high violations medium_penalty: Penalty for medium violations low_penalty: Penalty for low violations clean_bonus: Bonus for clean execution """ self.kernel = kernel self.base_reward_fn = base_reward_fn or self._default_reward self.penalties = { "critical": critical_penalty, "high": high_penalty, "medium": medium_penalty, "low": low_penalty, } self.clean_bonus = clean_bonus self._total_rewards = 0 self._total_penalties = 0.0 def _default_reward(self, rollout: Any) -> float: """Default: 1.0 for success, 0.0 for failure.""" return 1.0 if getattr(rollout, "success", False) else 0.0 def __call__(self, rollout: Any, *, emit: bool = True) -> float: """ Calculate reward with policy penalties. Args: rollout: Rollout with violations attribute emit: Emit reward span Returns: Final reward """ base = self.base_reward_fn(rollout) violations = getattr(rollout, "violations", []) penalty = sum(self.penalties.get(v.severity, -10.0) for v in violations) reward = base + penalty if not violations: reward += self.clean_bonus self._total_rewards += 1 self._total_penalties += penalty if emit: self._emit_reward(reward, base, penalty, len(violations)) return reward def _emit_reward( self, final: float, base: float, penalty: float, violation_count: int, ) -> None: """Emit multi-dimensional reward.""" try: from agentlightning.emitter import emit_reward emit_reward( {"final": final, "base": base, "policy_penalty": penalty}, primary_key="final", attributes={"agent_os.violations": violation_count}, ) except ImportError: logger.debug( "agentlightning.emitter not available; skipping reward emission.", exc_info=True, ) def get_stats(self) -> Dict[str, float]: """Get reward statistics.""" total = self._total_rewards or 1 return { "total_rewards": self._total_rewards, "avg_penalty": self._total_penalties / total, } ================================================ FILE: contrib/agentlightning/contrib/runner/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Namespace package for agentlightning.contrib.runner. ================================================ FILE: contrib/agentlightning/contrib/runner/agentos.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ AgentOSRunner - Agent-Lightning Runner with Kernel Safety ========================================================== Wraps agent execution with Agent-OS kernel governance. """ from __future__ import annotations import logging from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Any, Generic, Optional, TypeVar logger = logging.getLogger(__name__) T_task = TypeVar("T_task") @dataclass class PolicyViolation: """Record of a policy violation.""" policy_name: str description: str severity: str blocked: bool timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc)) @property def penalty(self) -> float: """Calculate penalty based on severity. Returns: float: Negative penalty value, where more severe violations have larger negative magnitudes. """ penalties = { "critical": -100.0, "high": -50.0, "medium": -10.0, "low": -1.0, } return penalties.get(self.severity, -10.0) @dataclass class GovernedRollout: """Rollout with governance metadata. This dataclass wraps execution results with governance information. It is compatible with Agent-Lightning's Rollout interface - the `task_input`, `task_output`, and `success` fields provide the core rollout data, while `violations` adds governance-specific metadata. """ task_input: Any task_output: Any success: bool violations: list[PolicyViolation] = field(default_factory=list) @property def total_penalty(self) -> float: return sum(v.penalty for v in self.violations) class AgentOSRunner(Generic[T_task]): """ Agent-Lightning runner with Agent-OS kernel safety. This runner wraps agent execution in an Agent-OS kernel, enforcing policies and collecting violation data for RL training. Example: >>> from agent_os import KernelSpace >>> from agent_os.policies import SQLPolicy >>> >>> kernel = KernelSpace(policy=SQLPolicy()) >>> runner = AgentOSRunner(kernel) >>> >>> rollout = await runner.step(task) >>> print(f"Violations: {len(rollout.violations)}") """ def __init__( self, kernel: Any, *, fail_on_violation: bool = False, emit_violations: bool = True, ): """ Initialize the governed runner. Args: kernel: Agent-OS KernelSpace with loaded policies fail_on_violation: Raise exception on violation emit_violations: Emit violations as spans """ self.kernel = kernel self.fail_on_violation = fail_on_violation self.emit_violations = emit_violations self._violations: list[PolicyViolation] = [] self._total_rollouts = 0 self._total_violations = 0 # Worker attributes (set by init_worker) self.worker_id: Optional[int] = None self.store: Optional[Any] = None self._setup_hooks() def _setup_hooks(self) -> None: """Set up kernel hooks.""" on_violation = getattr(self.kernel, "on_policy_violation", None) if on_violation is None: logger.warning( "Kernel %r does not support policy violation hooks via 'on_policy_violation'.", self.kernel, ) return if not callable(on_violation): logger.warning( "Kernel attribute 'on_policy_violation' is not callable: %r", on_violation, ) return try: on_violation(self._handle_violation) except TypeError as exc: logger.warning( "Kernel.on_policy_violation has an incompatible signature: %s", exc, ) def _handle_violation( self, policy_name: str, description: str, severity: str, blocked: bool, ) -> None: """Handle a policy violation.""" violation = PolicyViolation( policy_name=policy_name, description=description, severity=severity, blocked=blocked, ) self._violations.append(violation) self._total_violations += 1 if self.emit_violations: self._emit_violation_span(violation) if self.fail_on_violation and blocked: raise PolicyViolationError(violation) def _emit_violation_span(self, violation: PolicyViolation) -> None: """Emit violation as Agent-Lightning span.""" try: from agentlightning.emitter import emit_annotation emit_annotation( { "agent_os.violation": True, "agent_os.policy": violation.policy_name, "agent_os.severity": violation.severity, "agent_os.blocked": violation.blocked, } ) except ImportError as exc: logger.debug( "agentlightning.emitter not available; skipping violation annotation: %s", exc, ) @property def agent(self) -> Any: """ Access the underlying agent. Raises: RuntimeError: If the agent has not been initialized via `init`. """ if not hasattr(self, "_agent"): raise RuntimeError("AgentOSRunner.agent accessed before `init` has been called.") return self._agent @agent.setter def agent(self, value: Any) -> None: """Set the underlying agent instance.""" self._agent = value def init(self, agent: Any, **kwargs: Any) -> None: """Initialize with agent.""" self.agent = agent def init_worker(self, worker_id: int, store: Any, **kwargs: Any) -> None: """Initialize worker.""" self.worker_id = worker_id self.store = store def teardown(self) -> None: """Release resources.""" pass def teardown_worker(self, worker_id: int) -> None: """Release worker resources.""" pass async def step( self, input: T_task, *, resources: Optional[Any] = None, mode: Optional[str] = None, event: Optional[Any] = None, ) -> GovernedRollout: """ Execute task with governance. Args: input: Task input resources: Optional resources mode: Rollout mode event: Stop signal Returns: GovernedRollout with results and violations """ self._violations = [] try: if hasattr(self.kernel, "execute_async"): logger.debug("AgentOSRunner: executing task via kernel.execute_async") result = await self.kernel.execute_async(self.agent, input) elif hasattr(self.kernel, "execute"): logger.debug("AgentOSRunner: executing task via kernel.execute") result = self.kernel.execute(self.agent, input) else: logger.error( "AgentOSRunner: kernel does not support 'execute_async' or 'execute'; " "governed execution is not possible." ) raise RuntimeError( "Kernel does not support governed execution (missing 'execute_async' and 'execute')." ) success = True except PolicyViolationError as e: # Record the policy violation and mark rollout as unsuccessful. self._violations.append(e.violation) result = None success = False self._total_rollouts += 1 return GovernedRollout( task_input=input, task_output=result, success=success, violations=self._violations.copy(), ) def get_stats(self) -> dict: """Get runner statistics.""" return { "total_rollouts": self._total_rollouts, "total_violations": self._total_violations, "violation_rate": (self._total_violations / self._total_rollouts if self._total_rollouts > 0 else 0.0), } class PolicyViolationError(Exception): """Raised when policy violation blocks execution.""" def __init__(self, violation: PolicyViolation): self.violation = violation super().__init__(f"Policy violation: {violation.description}") ================================================ FILE: contrib/recipes/agentos/README.md ================================================ # Agent-OS Integration for Agent-Lightning Kernel-level safety during AI agent training. ## Overview [Agent-OS](https://github.com/imran-siddique/agent-os) provides deterministic governance for AI agents. This integration enables: - **0% unpenalized policy violations** — All unsafe actions are detected and penalized - **Policy violations → RL penalties** — Agents learn to avoid unsafe behavior - **Complete audit trail** — From training to production ## Installation ```bash pip install agentlightning agent-os ``` ## Quick Start ```python from agentlightning import Trainer from agentlightning.contrib.runner.agentos import AgentOSRunner from agentlightning.contrib.reward.agentos import PolicyReward from agent_os import KernelSpace from agent_os.policies import SQLPolicy # Create governed kernel kernel = KernelSpace(policy=SQLPolicy( deny=["DROP", "DELETE"] )) # Wrap in Agent-OS runner runner = AgentOSRunner(kernel) # Train with policy-aware rewards trainer = Trainer( runner=runner, reward_fn=PolicyReward(kernel), algorithm="GRPO" ) trainer.train() ``` ## Components ### AgentOSRunner Wraps agent execution with kernel-level policy enforcement: ```python from agentlightning.contrib.runner.agentos import AgentOSRunner runner = AgentOSRunner( kernel, fail_on_violation=False, # Continue but penalize emit_violations=True, # Emit as spans ) ``` ### PolicyReward Converts policy violations to negative RL rewards: ```python from agentlightning.contrib.reward.agentos import PolicyReward reward_fn = PolicyReward( kernel, base_reward_fn=accuracy_reward, critical_penalty=-100.0, clean_bonus=5.0, ) ``` ### FlightRecorderAdapter Imports Agent-OS audit logs to LightningStore: ```python from agentlightning.contrib.adapter.agentos import FlightRecorderAdapter adapter = FlightRecorderAdapter(flight_recorder) adapter.import_to_store(lightning_store) ``` ## Benchmarks | Metric | Without Agent-OS | With Agent-OS | |--------|------------------|---------------| | Undetected Policy Violations | 12.3% | **0.0%** | | Task Accuracy | 76.4% | **79.2%** | *Note: "0% undetected violations" means all policy violations are caught and penalized, not that agents never attempt unsafe actions. Over training, agents learn to minimize violation attempts.* ## Documentation - [Agent-OS Documentation](https://imran-siddique.github.io/agent-os-docs/) - Integration guide: see project README or examples in this directory. ## License MIT ================================================ FILE: contrib/recipes/agentos/demo_governed_training.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ Agent-OS + Agent-Lightning End-to-End Demo ========================================== Demonstrates how to train an AI agent with kernel-level safety governance using Agent-OS policy enforcement and Agent-Lightning RL training. This script shows the full pipeline: 1. Define a governance policy (block dangerous SQL operations) 2. Create a governed runner that enforces the policy 3. Define a reward function that penalizes policy violations 4. Train the agent — it learns to avoid unsafe actions over time Usage: python demo_governed_training.py Requirements: pip install agentlightning agent-os-kernel """ from __future__ import annotations import logging logging.basicConfig(level=logging.INFO, format="%(name)s | %(message)s") logger = logging.getLogger("agentos-demo") def build_kernel(): """Create an Agent-OS kernel with SQL safety policy.""" try: from agent_os import KernelSpace except ImportError: logger.warning("agent-os-kernel not installed – using stub kernel") return _StubKernel() kernel = KernelSpace( policies={ "sql_safety": { "deny_patterns": ["DROP", "DELETE", "TRUNCATE", "ALTER"], "max_rows": 1000, } } ) logger.info("Agent-OS kernel created with SQL safety policy") return kernel def build_runner(kernel): """Wrap a runner with Agent-OS policy enforcement.""" try: from agentlightning.contrib.runner.agentos import AgentOSRunner runner = AgentOSRunner( kernel, fail_on_violation=False, # Continue but penalize emit_violations=True, # Emit as spans for observability ) logger.info("AgentOSRunner created (fail_on_violation=False)") return runner except ImportError: logger.warning("AgentOSRunner not available – using stub") return None def build_reward(kernel, base_reward_fn=None): """Create a reward function that penalizes policy violations.""" try: from agentlightning.contrib.reward.agentos import PolicyReward reward = PolicyReward( kernel, base_reward_fn=base_reward_fn, critical_penalty=-100.0, high_penalty=-50.0, medium_penalty=-10.0, low_penalty=-1.0, clean_bonus=5.0, ) logger.info("PolicyReward created (critical=-100, clean_bonus=+5)") return reward except ImportError: logger.warning("PolicyReward not available – using stub") return base_reward_fn def accuracy_reward(completions: list[str], references: list[str]) -> list[float]: """Simple accuracy reward: 1.0 for exact match, 0.0 otherwise.""" return [1.0 if pred.strip().lower() == ref.strip().lower() else 0.0 for pred, ref in zip(completions, references)] def demo_violation_detection(kernel): """Show that the kernel catches unsafe SQL operations.""" logger.info("--- Violation Detection Demo ---") test_queries = [ ("SELECT * FROM users WHERE id = 1", True), # Safe ("DROP TABLE users", False), # Blocked ("DELETE FROM orders WHERE id > 0", False), # Blocked ("SELECT name FROM products LIMIT 10", True), # Safe ("TRUNCATE TABLE logs", False), # Blocked ] for query, should_pass in test_queries: try: result = kernel.check_action("sql_query", {"query": query}) status = "✅ ALLOWED" if result.allowed else "🛑 BLOCKED" except Exception: # Stub kernel always allows status = "✅ ALLOWED (stub)" result = type("R", (), {"allowed": True})() expected = "should pass" if should_pass else "should block" logger.info(f" {status}: {query!r} ({expected})") def demo_training_loop(runner, reward_fn): """Simulate a training loop with governed execution.""" logger.info("--- Training Loop Demo ---") # Simulated training data prompts = [ "Find all active users", "Remove all test data", "Show revenue by month", "Drop the staging table", ] for epoch in range(1, 3): logger.info(f"Epoch {epoch}/2") for prompt in prompts: logger.info(f" Prompt: {prompt!r}") # In real training, the runner would execute the agent # and the reward function would score the output logger.info(" → Agent generates SQL → Runner enforces policy → Reward scored") logger.info("Training complete — agent learns to avoid policy violations over time") def demo_audit_trail(kernel): """Show the audit trail captured by Agent-OS.""" logger.info("--- Audit Trail Demo ---") try: from agentlightning.contrib.adapter.agentos import FlightRecorderAdapter recorder = getattr(kernel, "flight_recorder", None) if recorder: adapter = FlightRecorderAdapter(recorder) logger.info(f"Audit entries: {len(adapter.get_entries())}") else: logger.info("Flight recorder not available (stub kernel)") except ImportError: logger.info("FlightRecorderAdapter not available — skipping audit demo") def main(): """Run the full end-to-end demo.""" logger.info("=" * 60) logger.info("Agent-OS + Agent-Lightning End-to-End Demo") logger.info("=" * 60) # 1. Build the governance kernel kernel = build_kernel() # 2. Demonstrate violation detection demo_violation_detection(kernel) # 3. Build governed runner + reward runner = build_runner(kernel) reward_fn = build_reward(kernel, base_reward_fn=accuracy_reward) # 4. Simulate training loop demo_training_loop(runner, reward_fn) # 5. Show audit trail demo_audit_trail(kernel) logger.info("=" * 60) logger.info("Demo complete! In production, replace stubs with:") logger.info(" pip install agentlightning agent-os-kernel") logger.info("=" * 60) class _StubKernel: """Minimal stub for demo when agent-os is not installed.""" def check_action(self, action_type, params): blocked = any(kw in params.get("query", "").upper() for kw in ("DROP", "DELETE", "TRUNCATE", "ALTER")) return type("Result", (), {"allowed": not blocked})() if __name__ == "__main__": main() ================================================ FILE: contrib/recipes/envs/README.md ================================================ # Example of AGL Environments ## Overview This example implements agents across various environments within Agent Lightning. The example is designed to run on a single node with 8 GPUs, each having at least 40 GB of memory. This example depends on the simulation environments (e.g., ALFWorld, ScienceWorld) provided in the [agl-envs repository](https://github.com/agent-lightning/agl-envs). For more information about the supported environments, please refer to the [envs README](https://github.com/agent-lightning/agl-envs/README.md). ---   ## Included Files | File/Directory | Description | |----------------|-------------| | `config_env/` | Configuration for environment settings. For more information, please refer to the "Configure Your Environment Settings" section. | | `config_verl/` | Configuration for RL training with VerL | | `add_instruction.py` | Adding instructions to the agent’s input prompt to guide the format of the response | | `prompt_builder.py` | Managing conversation history and generating input prompts in multi-turn scenarios | | `train_env_agent.py` | RL training script | ---   ## Install Environments Run the following script once to install the enviornment and related AGL dependency: ```bash cd contrib/recipes/envs git clone https://github.com/agent-lightning/agl-envs mv agl-envs agl_envs # Install alfworld dependency bash agl_envs/setup/setup_alfworld.sh conda activate alfworld # Install scienceworld dependency bash agl_envs/setup/setup_sciworld.sh conda activate sciworld # Install AGL dependency bash install_agl.sh ``` > If you plan to use WandB for experiment tracking, log in to WandB before training. ---   ## Configure Your Environment Settings ### Captioner type (cot or naive) - cot: guide the agent to output its reasoning first, then take an action - naive: guide the agent to take an action directly, without outputting any reasoning ### Prompt type (chat or single) When performing multi-turn rollouts, the unit of the input prompt can be defined in two different ways. (1) **Trajectory-wise unit**: All interaction history up to the current step is accumulated in a chat format and directly used to construct the next input prompt. (2) **Turn-wise unit**: Only a subset of the interaction history is included for each turn. The prompt is reconstructed by combining the current turn’s state with selected past information, rather than using the full trajectory. ![prompt_type](./assets/prompt_type.png) You can use the `trajectory-wise unit` by setting `prompt_type` to `chat`, and the `turn-wise unit` by setting `prompt_type` to `single`. Currently, for ALFWorld, we only support the `single` mode, while for ScienceWorld, both `chat` and `single` modes are supported. We follow the single-mode prompt for ALFWorld from [verl-agent](https://github.com/langfengQ/verl-agent) and the single-mode prompt for ScienceWorld from [RLVMR](https://github.com/Tencent/digitalhuman/tree/main/RLVMR). Thank you to the authors of VERL-Agent and RLVMR for their valuable work. ---   ## Run RL Training (GRPO) ```bash # Run alfworld python3 train_env_agent.py --algorithm grpo --env alfworld # Run scienceworld single task task_num 0 python3 train_env_agent.py --algorithm grpo --env scienceworld --task_num 0 # Run scienceworld multi-task python3 train_env_agent.py --algorithm grpo --env scienceworld --task_num -1 ``` ================================================ FILE: contrib/recipes/envs/add_instruction.py ================================================ # Copyright (c) Microsoft. All rights reserved. import copy from autogen_core.models import UserMessage # Instruction text definitions COT_INSTRUCTION = """ Now it's your turn to take an action. You should first reason step-by-step about the current situation. This reasoning process MUST be enclosed within tags. Once you've finished your reasoning, you should choose an appropriate action for the current step and present it within tags. """.strip() NAIVE_INSTRUCTION = """ Please response with only one line with one sentence, following the possible action format shown above. No extra words are allowed. """.strip() # Mapping for instruction text types INSTRUCTION_MAP = { "cot": COT_INSTRUCTION, "naive": NAIVE_INSTRUCTION, } def _get_instruction(type: str, env_name: str = None): """ Retrieve an instruction string from INSTRUCTION_MAP based on the given type. Args: type (str): Instruction type key (e.g., "cot", "naive", "critic", "tip"). env_name (str, optional): Currently unused. Reserved for future environment-specific instruction handling. Returns: str: The corresponding instruction text. Raises: ValueError: If the given instruction type is not found in INSTRUCTION_MAP. """ if type in INSTRUCTION_MAP: return INSTRUCTION_MAP[type] else: raise ValueError(f"Unknown instruction type: {type}") def add_chat_instruction(prompt, type: str, sep: str = "\n\n", env_name: str = None): """ Append an instruction to the content of the last message in a chat-style prompt. This function does not modify the original prompt. Instead, it returns a deep-copied prompt list with the instruction appended. Args: prompt (list): A conversation history represented as a list of objects. Each object must have a `.content` attribute. type (str): Instruction type key (e.g., "cot", "naive", "critic", "tip"). sep (str, optional): Separator inserted between the existing content and the instruction. env_name (str, optional): Currently unused. Reserved for future use. Returns: list: A new prompt list with the instruction appended to the last message. """ new_prompt = copy.deepcopy(prompt) instruction = _get_instruction(type, env_name) new_prompt[-1].content += sep + instruction return new_prompt def add_single_instruction(prompt, type: str, sep: str = "\n\n", env_name: str = None): """ Append an instruction to a single prompt or a chat-style prompt. - If `prompt` is a string, the instruction is appended to the string. - If `prompt` is a list, the instruction is appended to the `.content` of the last message. Args: prompt (str or list): Either a single prompt string or a conversation history list whose elements have a `.content` attribute. type (str): Instruction type key (e.g., "cot", "naive", "critic", "tip"). sep (str, optional): Separator inserted between the existing content and the instruction. env_name (str, optional): Currently unused. Reserved for future use. Returns: str or list: The updated prompt with the instruction appended. Raises: TypeError: If `prompt` is neither a string nor a list. """ instruction = _get_instruction(type, env_name) if isinstance(prompt, str): return prompt + sep + instruction elif isinstance(prompt, list): new_prompt = copy.deepcopy(prompt) new_prompt[-1].content += sep + instruction return new_prompt else: raise TypeError("Prompt must be a string or a list of strings") ================================================ FILE: contrib/recipes/envs/config_env/alfworld.yaml ================================================ env_name: alfworld seed: 0 format_penalty: 0.1 binary_reward: False save_rollout: False log_env_obs: False reawrd_scale: 10.0 use_success_rate: False captioner: type: cot # naive or cot prompt_type: single # chat or single max_history: 2 alfworld_kwargs: max_steps: 50 ================================================ FILE: contrib/recipes/envs/config_env/scienceworld.yaml ================================================ env_name: scienceworld seed: 0 format_penalty: 0.1 binary_reward: False save_rollout: False log_env_obs: False # True for GiGPO reawrd_scale: 10.0 use_success_rate: True # only for scienceworld use_action_correction: False captioner: type: cot # naive or cot prompt_type: single # chat or single max_history: 2 ================================================ FILE: contrib/recipes/envs/config_verl/alfworld/grpo.yaml ================================================ # ========================== # Variable definitions # ========================== variables: NUM_GPUS: 2 MINI_BATCH_SIZE: 32 PER_GPU_BATCH_SIZE: 16 TENSOR_MODEL_PARALLEL_SIZE: 2 NUM_ROLLOUTS: 8 BASE_MODEL: Qwen/Qwen2.5-1.5B-Instruct PROJECT_NAME: AGL-Envs-ALFWorld TRIAL: ${oc.env:TRIAL,0} EXPERIMENT_NAME: grpo-alfworld-${variables.TRIAL} DATA_DIR: agl_envs/task_data/alfworld # ========================== # Main Config # ========================== agentlightning: port: 9999 algorithm: adv_estimator: grpo use_kl_in_reward: false use_final_reward_as_step_reward: true use_intrinsic_reward: true data: train_files: ${variables.DATA_DIR}/train.parquet val_files: ${variables.DATA_DIR}/test.parquet train_batch_size: 32 val_batch_size: 140 max_prompt_length: 2048 max_response_length: 512 truncation: error return_raw_chat: true actor_rollout_ref: rollout: tensor_model_parallel_size: ${variables.TENSOR_MODEL_PARALLEL_SIZE} n: ${variables.NUM_ROLLOUTS} log_prob_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} multi_turn: format: hermes name: vllm gpu_memory_utilization: 0.6 enable_chunked_prefill: false enforce_eager: false free_cache_engine: true val_kwargs: temperature: 0.4 do_sample: true actor: ppo_mini_batch_size: ${variables.MINI_BATCH_SIZE} ppo_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} optim: lr: 1.0e-6 use_kl_loss: true kl_loss_coef: 0.01 kl_loss_type: low_var_kl entropy_coeff: 0.001 fsdp_config: param_offload: false optimizer_offload: false ref: log_prob_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} fsdp_config: param_offload: true model: path: ${variables.BASE_MODEL} use_remove_padding: true enable_gradient_checkpointing: true trainer: n_gpus_per_node: ${variables.NUM_GPUS} val_before_train: false critic_warmup: 0 logger: - console - wandb project_name: ${variables.PROJECT_NAME} experiment_name: ${variables.EXPERIMENT_NAME} nnodes: 1 save_freq: 100 test_freq: 5 total_epochs: 200 ================================================ FILE: contrib/recipes/envs/config_verl/scienceworld/grpo.yaml ================================================ # ========================== # Variable definitions # ========================== variables: NUM_GPUS: 2 MINI_BATCH_SIZE: 32 PER_GPU_BATCH_SIZE: 16 TENSOR_MODEL_PARALLEL_SIZE: 2 NUM_ROLLOUTS: 8 BASE_MODEL: Qwen/Qwen2.5-1.5B-Instruct PROJECT_NAME: AGL-Envs-ScienceWorld TASK_NUM: ${oc.env:TASK_NUM,-1} TRIAL: ${oc.env:TRIAL,0} EXPERIMENT_NAME: grpo-sciworld-${variables.TRIAL} DATA_DIR: agl_envs/task_data/scienceworld/multi_data # ========================== # Main Config # ========================== agentlightning: port: 9999 algorithm: adv_estimator: grpo use_kl_in_reward: false use_final_reward_as_step_reward: true use_intrinsic_reward: true data: train_files: ${variables.DATA_DIR}/train.parquet val_files: ${variables.DATA_DIR}/test.parquet train_batch_size: 32 val_batch_size: 144 max_prompt_length: 6000 max_response_length: 1024 truncation: error return_raw_chat: true actor_rollout_ref: rollout: tensor_model_parallel_size: ${variables.TENSOR_MODEL_PARALLEL_SIZE} n: ${variables.NUM_ROLLOUTS} log_prob_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} multi_turn: format: hermes name: vllm gpu_memory_utilization: 0.6 enable_chunked_prefill: false enforce_eager: false free_cache_engine: true val_kwargs: temperature: 0.4 do_sample: true actor: ppo_mini_batch_size: ${variables.MINI_BATCH_SIZE} ppo_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} optim: lr: 1.0e-6 use_kl_loss: true kl_loss_coef: 0.01 kl_loss_type: low_var_kl entropy_coeff: 0.001 fsdp_config: param_offload: false optimizer_offload: false ref: log_prob_micro_batch_size_per_gpu: ${variables.PER_GPU_BATCH_SIZE} fsdp_config: param_offload: true model: path: ${variables.BASE_MODEL} use_remove_padding: true enable_gradient_checkpointing: true trainer: n_gpus_per_node: ${variables.NUM_GPUS} val_before_train: true critic_warmup: 0 logger: - console - wandb project_name: ${variables.PROJECT_NAME} experiment_name: ${variables.EXPERIMENT_NAME} nnodes: 1 save_freq: 100 test_freq: 5 total_epochs: 500 ================================================ FILE: contrib/recipes/envs/install_agl.sh ================================================ # This setup is based on CUDA 12.6 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126 pip install transformers==4.56.1 pip install wandb pip install vllm==0.10.2 pip install verl==0.5.0 pip install click==8.2.1 pip install --extra-index-url https://miropsota.github.io/torch_packages_builder flash_attn==2.8.3+pt2.8.0cu126 pip install 'openai-agents[litellm]'==0.2.9 pip install -U "autogen-agentchat" "autogen-ext[openai]" (cd ../../../ && pip install -e .[dev]) ================================================ FILE: contrib/recipes/envs/prompt_builder.py ================================================ # Copyright (c) Microsoft. All rights reserved. from typing import Optional from autogen_core.models import AssistantMessage, UserMessage class HistoryPromptBuilder: """ Builds prompts using a history of observations and actions. Supports two prompt styles: - chat: multi-turn user/assistant messages - single: a single formatted prompt with optional history """ def __init__(self, max_history: int = -1, prompt_type: str = "chat"): """ Args: max_history (int): Maximum number of past steps to include (-1 means unlimited). prompt_type (str): Prompt style ("chat" or "single"). """ self.max_history = max_history self.prompt_type = prompt_type self._events = [] self.admissible_actions = None self.step_count = 1 def update_step_count(self): """Increment the current step counter.""" self.step_count += 1 def update_instruction_prompt(self, instruction: str): """Set the instruction/system prompt used in chat mode.""" self.instruction = instruction def update_single_obs_template(self, single_obs_template_wo_his: str, single_obs_template: str): """ Set templates for single-prompt mode. Args: single_obs_template_wo_his (str): Template without history. single_obs_template (str): Template with history. """ self.single_obs_template_wo_his = single_obs_template_wo_his self.single_obs_template = single_obs_template def update_observation(self, obs: dict): """Append an observation to the event history.""" self._events.append( { "type": "observation", "text": obs, } ) def update_action(self, action: str): """Append an action to the event history.""" self._events.append( { "type": "action", "action": action, } ) def update_admissible_actions(self, admissible_actions): """Update the list of admissible actions for the current step.""" self.admissible_actions = admissible_actions def init(self, env): """ Initialize the prompt builder at the beginning of an episode. - Clears the event history - Loads prompt instructions or templates from the environment """ self._events.clear() if self.prompt_type == "chat": inst_prompt = env.get_instruction_prompt(info) self.update_instruction_prompt(inst_prompt) elif self.prompt_type == "single": template_wo_his, template = env.get_single_prompt_template() self.update_single_obs_template(template_wo_his, template) else: raise ValueError(f"Unsupported prompt_type: {self.prompt_type}") def get_chat_prompt(self): """ Construct a chat-style prompt from the event history. Returns: List[Message]: A sequence of User and Assistant messages. """ if self.max_history != -1: events = self._events[-(self.max_history * 2 + 1) :] else: events = self._events messages = [] for idx, event in enumerate(events): event_type = event.get("type") message = None if event_type == "observation": content = event.get("text", "") # Attach instruction prompt to the first observation if idx == 0 and self.instruction: content += "\n" + self.instruction message = UserMessage(source="user", content=content) elif event_type == "action": content = event.get("action", "") message = AssistantMessage(source="assistant", content=content) if message: messages.append(message) return messages def get_single_prompt(self): """ Construct a single formatted prompt using templates. Returns: List[Message]: A single User message. """ if self.max_history != -1: events = self._events[-(self.max_history * 2 + 1) :] else: events = self._events current_obs = events[-1]["text"] # Case 1: No history available if len(events) == 1: template = self.single_obs_template_wo_his kwargs = {"current_observation": current_obs} if "{admissible_actions}" in template: kwargs["admissible_actions"] = self.admissible_actions single_prompt = template.format(**kwargs) # Case 2: History exists else: template = self.single_obs_template history = "" obs_count = 0 for idx, event in enumerate(events): if events[idx]["type"] == "observation" and idx != len(events) - 1: next_event = events[idx + 1] history += f"[Observation {max(self.step_count-self.max_history+obs_count, 1)}: '{event['text']}', " history += ( f"Action {max(self.step_count-self.max_history+obs_count, 1)}: '{next_event['action']}']\n " ) obs_count += 1 kwargs = { "step_count": self.step_count - 1, "history_length": min(self.step_count - 1, self.max_history), "history": history, "current_step": self.step_count, "current_observation": current_obs, } if "{admissible_actions}" in template: kwargs["admissible_actions"] = self.admissible_actions single_prompt = template.format(**kwargs) return [UserMessage(source="user", content=single_prompt)] def get_prompt(self): """ Return the final prompt based on the configured prompt type. """ if self.prompt_type == "chat": prompt = self.get_chat_prompt() elif self.prompt_type == "single": prompt = self.get_single_prompt() return prompt ================================================ FILE: contrib/recipes/envs/train_env_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. import argparse import os import subprocess from omegaconf import OmegaConf from agentlightning import Trainer from agentlightning.algorithm.verl import VERL from contrib.agentlightning.contrib.algorithm.env_verl.daemon import EnvAgentModeDaemon from contrib.agentlightning.contrib.algorithm.env_verl.trainer import EnvAgentLightningTrainer def run_cmd(cmd): """Execute a shell command and print its output""" print(f"👉 Running: {cmd}") result = subprocess.run(cmd, shell=True, text=True, capture_output=True) if result.stdout: print(result.stdout) if result.stderr: print(result.stderr) return result def kill_process_on_port(port): result = subprocess.run(f"sudo lsof -t -i :{port}", shell=True, capture_output=True, text=True) pids = result.stdout.strip().split("\n") for pid in pids: if pid: print(f"🔪 Killing process {pid} on port {port}") subprocess.run(f"sudo kill -9 {pid}", shell=True) def train_val_dataset(cfg): """Load training and validation datasets from parquet files.""" from datasets import Dataset train_data = Dataset.from_parquet(cfg["data"]["train_files"]) val_data = Dataset.from_parquet(cfg["data"]["val_files"]) return train_data, val_data def get_config(path): cfg = OmegaConf.load(path) OmegaConf.resolve(cfg) if "variables" in cfg: del cfg["variables"] return cfg if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--env", type=str, default="scienceworld") parser.add_argument("--algorithm", type=str, default="grpo") parser.add_argument("--debug", action="store_true") parser.add_argument("--n_workers", type=int, default=64, help="Number of workers for training") parser.add_argument("--trial", type=int, default=0, help="Number of trials") parser.add_argument("--task_num", type=int, default=25, help="ScienceWorld Task number to inject as env var") parser.add_argument("--_background", action="store_true", help=argparse.SUPPRESS) args = parser.parse_args() # Restart Ray cluster cleanly kill_process_on_port(4747) run_cmd("pkill -f AgentLightning") run_cmd("ray stop") run_cmd("env RAY_DEBUG=legacy HYDRA_FULL_ERROR=1 VLLM_USE_V1=1 ray start --head --dashboard-host=0.0.0.0") # set environment variable before loading configs os.environ["TRIAL"] = str(args.trial) if args.env == "scienceworld": os.environ["TASK_NUM"] = str(args.task_num) # Load configs agent_config_path = f"config_env/{args.env}.yaml" if args.debug: trainer_config_path = f"config_verl/{args.env}/debug/{args.algorithm}.yaml" else: trainer_config_path = f"config_verl/{args.env}/{args.algorithm}.yaml" agent_config = get_config(agent_config_path) if "gigpo" in args.algorithm: agent_config.log_env_obs = True rl_training_config = get_config(trainer_config_path) # Load datasets train_dataset, val_dataset = train_val_dataset(rl_training_config) # Initialize agent from contrib.agentlightning.contrib.agent.env_agent import EnvAgent agent = EnvAgent(agent_config) # Initialize trainer and start training trainer = Trainer( algorithm=VERL( config=rl_training_config, trainer_cls=EnvAgentLightningTrainer, daemon_cls=EnvAgentModeDaemon, ), n_workers=args.n_workers, ) trainer.fit(agent, train_dataset, val_dataset=val_dataset) ================================================ FILE: contrib/recipes/search_r1/README.md ================================================ # Search-R1 Example ## Overview This example implements **Search R1** within Agent Lightning. It also serves as a demonstration of a **framework-free agent training pipeline**, showing how to run end-to-end RL training without relying on specialized frameworks. **It's tested and compatible with Agent-lightning v0.2.x**. The example is designed to run on a single node with 8 GPUs, each having at least 40 GB of memory. ## Included Files | File/Directory | Description | |----------------|-------------| | `data_process.sh` | Prepares the Wikipedia corpus, datasets, and `retriever` conda environment | | `retrieval_launch.sh` | Launches the retrieval service backed by the processed corpus | | `retrieval_server.py` | FastAPI server that powers document retrieval during training | | `search_r1_agent.py` | Agent-Lightning rollout script implementing the Search-R1 workflow | | `train_search_r1_agent.py` | RL training script that coordinates GRPO optimization | | `qa_em.py` | Exact-match evaluation utilities for validating model predictions | --- ## Prepare Data and Environment Run the following script once to prepare data and the retriever environment: ```bash bash data_process.sh ``` This script performs the following steps: * Creates a new conda environment named **`retriever`**. * Downloads the **Wikipedia data** used to build the retrieval database. * Downloads the **training and testing datasets**. * Stores all data under the newly created **`data/`** directory. The environment setup and data-processing logic are adapted from [PeterGriffinJin/Search-R1](https://github.com/PeterGriffinJin/Search-R1). --- ## Prepare Retrieval Server To start the retrieval server, run: ```bash bash retrieval_launch.sh ``` This script activates the previously created **`retriever`** environment and starts a **retrieval server** at `http://127.0.0.1:8000` using the downloaded Wikipedia data. The server receives user queries and returns a ranked list of retrieved text passages. The retrieval server implementation is based on `search_r1/search/retrieval_server.py`](https://github.com/PeterGriffinJin/Search-R1/blob/main/search_r1/search/retrieval_server.py). > ⚠️ **Note:** Keep the retrieval server running during training (for example, in a separate `tmux` session or terminal window). --- ## Run RL Training (GRPO) with Llama-3.2-3B-Instruct 1. **Start Ray** ```bash bash ../../scripts/restart_ray.sh ``` > If you plan to use WandB for experiment tracking, set the environment variable > `WANDB_API_KEY` before starting Ray. 2. **Start the Training Server** In another terminal, run: ```bash python train_search_r1_agent.py llama ``` This script starts the RL training. Each agent follows the Search-R1 workflow, retrieving information from the database and generating answers accordingly. --- ## Benchmark Results We evaluated Search-R1 across seven diverse question-answering benchmarks, covering both General QA (NQ, TriviaQA, PopQA) and complex multi-hop reasoning tasks (HotpotQA, 2WikiMultiHopQA, Musique, and Bamboogle). The following tables compare the performance of the original Search-R1 implementation and the Agent-Lightning version across various base models. | Model | Source | NQ | TriviaQA | PopQA | HotpotQA | 2Wiki | Musique | Bamboogle | | :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | **Qwen2.5-3B-Instruct** | **Search-R1 (Original)** | 34.1 | 54.5 | 37.8 | 32.4 | 31.9 | 10.3 | 26.4 | | | **Agent-Lightning** | **45.3** | **61.7** | **43.8** | **42.6** | **36.4** | **17.1** | **37.6** | | **Qwen2.5-7B-Instruct** | **Search-R1 (Original)** | 39.3 | 61.0 | 39.7 | 37.0 | 41.4 | 14.6 | 36.8 | | | **Agent-Lightning** | **46.5** | **65.9** | **46.8** | **43.7** | **46.2** | **20.3** | **47.2** | | **Llama-3.2-3B** | **Search-R1 (Reproduced)** | 26.3 | 49.0 | 23.0 | 21.6 | 27.3 | 4.5 | 9.7 | | | **Agent-Lightning** | **29.6** | **51.9** | **25.7** | **23.2** | **28.3** | **5.8** | 9.6 | ================================================ FILE: contrib/recipes/search_r1/data_process.sh ================================================ conda create -n retriever python=3.10 conda activate retriever # we recommend installing torch with conda for faiss-gpu conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.1 -c pytorch -c nvidia pip install transformers datasets pyserini ## install the gpu version faiss to guarantee efficient RL rollout conda install -c pytorch -c nvidia faiss-gpu=1.8.0 ## API function pip install uvicorn fastapi mkdir data cd data # download wiki data wget https://huggingface.co/datasets/PeterJinGo/wiki-18-corpus/resolve/main/wiki-18.jsonl.gz # download index data wget https://huggingface.co/datasets/PeterJinGo/wiki-18-e5-index/resolve/main/part_aa wget https://huggingface.co/datasets/PeterJinGo/wiki-18-e5-index/resolve/main/part_ab # download training dataset and testing dataset wget https://huggingface.co/datasets/PeterJinGo/nq_hotpotqa_train/resolve/main/train.parquet wget https://huggingface.co/datasets/PeterJinGo/nq_hotpotqa_train/resolve/main/test.parquet # process wiki data and index data cat part_* > e5_Flat.index gzip -d wiki-18.jsonl.gz cd .. ================================================ FILE: contrib/recipes/search_r1/qa_em.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Copyright 2024 Bytedance Ltd. and/or its affiliates # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import random import re import string from typing import Mapping, Optional, Sequence, Union def normalize_answer(s: str) -> str: """Lowercase, remove punctuation/articles, and normalize whitespace.""" def remove_articles(text: str) -> str: return re.sub(r"\b(a|an|the)\b", " ", text) def white_space_fix(text: str) -> str: return " ".join(text.split()) def remove_punc(text: str) -> str: exclude = set(string.punctuation) return "".join(ch for ch in text if ch not in exclude) def lower(text: str) -> str: return text.lower() return white_space_fix(remove_articles(remove_punc(lower(s)))) def em_check(prediction: str, golden_answers: Union[str, Sequence[str]]) -> int: if isinstance(golden_answers, str): golden_answers = [golden_answers] normalized_prediction = normalize_answer(prediction) score = 0 for golden_answer in golden_answers: golden_answer = normalize_answer(golden_answer) if golden_answer == normalized_prediction: score = 1 break return score def subem_check(prediction: str, golden_answers: Union[str, Sequence[str]]) -> int: if isinstance(golden_answers, str): golden_answers = [golden_answers] normalized_prediction = normalize_answer(prediction) score = 0 for golden_answer in golden_answers: golden_answer = normalize_answer(golden_answer) if golden_answer in normalized_prediction: score = 1 break return score def extract_solution(solution_str: str) -> Optional[str]: """Extract the last ... span from a solution string. Returns None if fewer than two such spans are present, to match original behavior. """ answer_pattern = r"(.*?)" match_iter = re.finditer(answer_pattern, solution_str, re.DOTALL) matches = list(match_iter) # If there are 0 or exactly 1 matches, return None if len(matches) == 0: return None # If there are 2 or more matches, return the last one return matches[-1].group(1).strip() def compute_score_em( solution_str: str, ground_truth: Union[str, Sequence[str]], method: str = "strict", format_score: float = 0.0, score: float = 1.0, ) -> float: """Scoring function for exact match (EM).""" answer = extract_solution(solution_str=solution_str) do_print = random.randint(1, 64) == 1 if do_print: print(f"--------------------------------") print(f"Golden answers: {ground_truth}") print(f"Extracted answer: {answer}") print(f"Solution string: {solution_str}") if answer is None: return 0.0 else: if em_check(answer, ground_truth): return score else: return format_score def compute_score_subem( solution_str: str, ground_truth: Mapping[str, Union[str, Sequence[str]]], method: str = "strict", format_score: float = 0.0, score: float = 1.0, ) -> float: """Scoring function for substring exact match (EM).""" answer = extract_solution(solution_str=solution_str) do_print = random.randint(1, 64) == 1 if do_print: print(f"--------------------------------") print(f"Golden answers: {ground_truth['target']}") print(f"Extracted answer: {answer}") print(f"Solution string: {solution_str}") if answer is None: return 0.0 else: if subem_check(answer, ground_truth["target"]): return score else: return format_score ================================================ FILE: contrib/recipes/search_r1/retrieval_launch.sh ================================================ conda activate retriever file_path=data index_file=$file_path/e5_Flat.index corpus_file=$file_path/wiki-18.jsonl retriever_name=e5 retriever_path=intfloat/e5-base-v2 python retrieval_server.py --index_path $index_file \ --corpus_path $corpus_file \ --topk 3 \ --retriever_name $retriever_name \ --retriever_model $retriever_path \ --faiss_gpu ================================================ FILE: contrib/recipes/search_r1/retrieval_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Copied and adapted from https://github.com/PeterGriffinJin/Search-R1/blob/main/search_r1/search/retrieval_server.py import argparse import json import warnings from typing import ( Any, Dict, List, Optional, Sequence, Tuple, Union, ) import datasets import faiss # type: ignore[reportMissingTypeStubs] import numpy as np import torch import uvicorn from fastapi import FastAPI from numpy.typing import NDArray from pydantic import BaseModel from tqdm import tqdm from transformers import AutoConfig, AutoModel, AutoTokenizer # ---- Small helpers / aliases Doc = Dict[str, Any] Docs = List[Doc] BatchDocs = List[Docs] Scores = List[float] BatchScores = List[Scores] def load_corpus(corpus_path: str) -> Any: corpus: Any = datasets.load_dataset("json", data_files=corpus_path, split="train", num_proc=4) # type: ignore return corpus def read_jsonl(file_path: str) -> List[Dict[str, Any]]: data: List[Dict[str, Any]] = [] with open(file_path, "r") as f: for line in f: data.append(json.loads(line)) return data def load_docs(corpus: Any, doc_idxs: Sequence[int]) -> Docs: results: Docs = [corpus[int(idx)] for idx in doc_idxs] return results def load_model(model_path: str, use_fp16: bool = False) -> Tuple[torch.nn.Module, Any]: # we call AutoConfig to ensure trust_remote_code init side-effects _model_config = AutoConfig.from_pretrained(model_path, trust_remote_code=True) # type: ignore model: torch.nn.Module = AutoModel.from_pretrained(model_path, trust_remote_code=True) # type: ignore model.eval() # type: ignore model.cuda() # type: ignore if use_fp16: model = model.half() # type: ignore tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=True, trust_remote_code=True) # type: ignore return model, tokenizer # type: ignore def pooling( pooler_output: torch.Tensor, last_hidden_state: torch.Tensor, attention_mask: Optional[torch.Tensor] = None, pooling_method: str = "mean", ) -> torch.Tensor: if pooling_method == "mean": assert attention_mask is not None, "attention_mask is required for mean pooling" last_hidden = last_hidden_state.masked_fill(~attention_mask[..., None].bool(), 0.0) return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None] elif pooling_method == "cls": return last_hidden_state[:, 0] elif pooling_method == "pooler": return pooler_output else: raise NotImplementedError("Pooling method not implemented!") class Encoder: def __init__( self, model_name: str, model_path: str, pooling_method: str, max_length: int, use_fp16: bool, ) -> None: self.model_name = model_name self.model_path = model_path self.pooling_method = pooling_method self.max_length = max_length self.use_fp16 = use_fp16 self.model, self.tokenizer = load_model(model_path=model_path, use_fp16=use_fp16) self.model.eval() @torch.no_grad() # type: ignore def encode(self, query_list: Union[List[str], str], is_query: bool = True) -> NDArray[np.float32]: # processing query for different encoders if isinstance(query_list, str): query_list = [query_list] if "e5" in self.model_name.lower(): if is_query: query_list = [f"query: {query}" for query in query_list] else: query_list = [f"passage: {query}" for query in query_list] if "bge" in self.model_name.lower(): if is_query: query_list = [ f"Represent this sentence for searching relevant passages: {query}" for query in query_list ] inputs: Dict[str, torch.Tensor] = self.tokenizer( query_list, max_length=self.max_length, padding=True, truncation=True, return_tensors="pt" ) # type: ignore[call-arg] inputs = {k: v.cuda() for k, v in inputs.items()} if "T5" in type(self.model).__name__: # T5-based retrieval model decoder_input_ids = torch.zeros((inputs["input_ids"].shape[0], 1), dtype=torch.long).to( inputs["input_ids"].device ) output = self.model(**inputs, decoder_input_ids=decoder_input_ids, return_dict=True) query_emb = output.last_hidden_state[:, 0, :] else: output = self.model(**inputs, return_dict=True) query_emb = pooling( output.pooler_output, output.last_hidden_state, inputs["attention_mask"], self.pooling_method, ) if "dpr" not in self.model_name.lower(): query_emb = torch.nn.functional.normalize(query_emb, dim=-1) query_np: NDArray[np.float32] = query_emb.detach().cpu().numpy().astype(np.float32, order="C") # type: ignore # cleanup del inputs, output torch.cuda.empty_cache() return query_np class Config: """ Minimal config class (simulating your argparse) Replace this with your real arguments or load them dynamically. """ def __init__( self, retrieval_method: str = "bm25", retrieval_topk: int = 10, index_path: str = "./index/bm25", corpus_path: str = "./data/corpus.jsonl", dataset_path: str = "./data", data_split: str = "train", faiss_gpu: bool = True, retrieval_model_path: str = "./model", retrieval_pooling_method: str = "mean", retrieval_query_max_length: int = 256, retrieval_use_fp16: bool = False, retrieval_batch_size: int = 128, ) -> None: self.retrieval_method = retrieval_method self.retrieval_topk = retrieval_topk self.index_path = index_path self.corpus_path = corpus_path self.dataset_path = dataset_path self.data_split = data_split self.faiss_gpu = faiss_gpu self.retrieval_model_path = retrieval_model_path self.retrieval_pooling_method = retrieval_pooling_method self.retrieval_query_max_length = retrieval_query_max_length self.retrieval_use_fp16 = retrieval_use_fp16 self.retrieval_batch_size = retrieval_batch_size class BaseRetriever: def __init__(self, config: Config) -> None: self.config = config self.retrieval_method: str = config.retrieval_method self.topk: int = config.retrieval_topk self.index_path: str = config.index_path self.corpus_path: str = config.corpus_path def _search(self, query: str, num: Optional[int], return_score: bool) -> Union[Docs, Tuple[Docs, Scores]]: raise NotImplementedError def _batch_search( self, query_list: List[str], num: Optional[int], return_score: bool ) -> Union[BatchDocs, Tuple[BatchDocs, BatchScores]]: raise NotImplementedError def search( self, query: str, num: Optional[int] = None, return_score: bool = False ) -> Union[Docs, Tuple[Docs, Scores]]: return self._search(query, num, return_score) def batch_search( self, query_list: List[str], num: Optional[int] = None, return_score: bool = False ) -> Union[BatchDocs, Tuple[BatchDocs, BatchScores]]: return self._batch_search(query_list, num, return_score) class BM25Retriever(BaseRetriever): def __init__(self, config: Config) -> None: super().__init__(config) # import locally to avoid hard dependency at import/type time try: from pyserini.search.lucene import LuceneSearcher # type: ignore except Exception: # pragma: no cover - typing convenience LuceneSearcher = Any # type: ignore[assignment] self.searcher: Any = LuceneSearcher(self.index_path) # type: ignore self.contain_doc: bool = self._check_contain_doc() if not self.contain_doc: self.corpus: Any = load_corpus(self.corpus_path) self.max_process_num: int = 8 def _check_contain_doc(self) -> bool: doc = self.searcher.doc(0) try: _ = doc.raw() return True except Exception: return False def _search( self, query: str, num: Optional[int] = None, return_score: bool = False ) -> Union[Docs, Tuple[Docs, Scores]]: k = self.topk if num is None else num hits: List[Any] = self.searcher.search(query, k) if len(hits) < 1: if return_score: return [], [] else: return [] scores: Scores = [float(hit.score) for hit in hits] if len(hits) < k: warnings.warn("Not enough documents retrieved!") else: hits = hits[:k] if self.contain_doc: all_contents: List[str] = [json.loads(self.searcher.doc(hit.docid).raw())["contents"] for hit in hits] results: Docs = [ { "title": content.split("\n")[0].strip('"'), "text": "\n".join(content.split("\n")[1:]), "contents": content, } for content in all_contents ] else: results = load_docs(self.corpus, [int(hit.docid) for hit in hits]) if return_score: return results, scores else: return results def _batch_search( self, query_list: List[str], num: Optional[int] = None, return_score: bool = False ) -> Union[BatchDocs, Tuple[BatchDocs, BatchScores]]: results: BatchDocs = [] scores: BatchScores = [] for query in query_list: item_result, item_score = self._search(query, num, True) # type: ignore[misc] results.append(item_result) # type: ignore[arg-type] scores.append(item_score) # type: ignore[arg-type] if return_score: return results, scores else: return results class DenseRetriever(BaseRetriever): def __init__(self, config: Config) -> None: super().__init__(config) index: Any = faiss.read_index(self.index_path) # type: ignore[no-untyped-call] if config.faiss_gpu: # Some faiss GPU helpers may be missing type stubs; treat as Any. co: Any = faiss.GpuMultipleClonerOptions() # type: ignore[attr-defined] co.useFloat16 = True co.shard = True index = faiss.index_cpu_to_all_gpus(index, co=co) # type: ignore[no-untyped-call] self.index: Any = index self.corpus: Any = load_corpus(self.corpus_path) self.encoder = Encoder( model_name=self.retrieval_method, model_path=config.retrieval_model_path, pooling_method=config.retrieval_pooling_method, max_length=config.retrieval_query_max_length, use_fp16=config.retrieval_use_fp16, ) self.topk = config.retrieval_topk self.batch_size = config.retrieval_batch_size def _search( self, query: str, num: Optional[int] = None, return_score: bool = False ) -> Union[Docs, Tuple[Docs, Scores]]: k = self.topk if num is None else num query_emb = self.encoder.encode(query) scores_np, idxs_np = self.index.search(query_emb, k=k) # type: ignore[no-untyped-call] idxs: Sequence[int] = list(map(int, idxs_np[0])) scores: Scores = [float(s) for s in scores_np[0]] results = load_docs(self.corpus, idxs) if return_score: return results, scores else: return results def _batch_search( self, query_list: List[str], num: Optional[int] = None, return_score: bool = False ) -> Union[BatchDocs, Tuple[BatchDocs, BatchScores]]: if isinstance(query_list, str): query_list = [query_list] k = self.topk if num is None else num results: BatchDocs = [] scores: BatchScores = [] for start_idx in tqdm(range(0, len(query_list), self.batch_size), desc="Retrieval process: "): query_batch = query_list[start_idx : start_idx + self.batch_size] batch_emb = self.encoder.encode(query_batch) batch_scores_np, batch_idxs_np = self.index.search(batch_emb, k=k) # type: ignore[no-untyped-call] batch_scores = batch_scores_np.tolist() batch_idxs = batch_idxs_np.tolist() # load_docs is not vectorized, but is a python list approach flat_idxs: List[int] = sum(batch_idxs, []) # type: ignore batch_results_flat = load_docs(self.corpus, flat_idxs) # chunk them back chunked: List[Docs] = [batch_results_flat[i * k : (i + 1) * k] for i in range(len(batch_idxs))] results.extend(chunked) scores.extend(batch_scores) del batch_emb, batch_scores, batch_idxs, query_batch, flat_idxs, batch_results_flat torch.cuda.empty_cache() if return_score: return results, scores else: return results def get_retriever(config: Config) -> BaseRetriever: if config.retrieval_method == "bm25": return BM25Retriever(config) else: return DenseRetriever(config) ##################################### # FastAPI server below ##################################### class QueryRequest(BaseModel): queries: List[str] topk: Optional[int] = None return_scores: bool = False app: FastAPI = FastAPI() # Globals created under __main__; keep typed placeholders for pyright config: Config # will be set in __main__ retriever: BaseRetriever # will be set in __main__ @app.post("/retrieve") def retrieve_endpoint(request: QueryRequest) -> Dict[str, Any]: """ Endpoint that accepts queries and performs retrieval. Input format: { "queries": ["What is Python?", "Tell me about neural networks."], "topk": 3, "return_scores": true } """ if not request.topk: request.topk = config.retrieval_topk # fallback to default # Perform batch retrieval search_out = retriever.batch_search( query_list=request.queries, num=int(request.topk), return_score=request.return_scores ) # Unpack depending on return_scores if request.return_scores: results, scores = search_out # type: ignore[misc] else: results = search_out # type: ignore[assignment] scores = None # Format response resp: List[Any] = [] for i, single_result in enumerate(results): # type: ignore[arg-type] if request.return_scores and scores is not None: combined: List[Dict[str, Any]] = [] for doc, score in zip(single_result, scores[i]): combined.append({"document": doc, "score": float(score)}) resp.append(combined) else: resp.append(single_result) return {"result": resp} if __name__ == "__main__": parser = argparse.ArgumentParser(description="Launch the local faiss retriever.") parser.add_argument( "--index_path", type=str, default="/home/peterjin/mnt/index/wiki-18/e5_Flat.index", help="Corpus indexing file." ) parser.add_argument( "--corpus_path", type=str, default="/home/peterjin/mnt/data/retrieval-corpus/wiki-18.jsonl", help="Local corpus file.", ) parser.add_argument("--topk", type=int, default=3, help="Number of retrieved passages for one query.") parser.add_argument("--retriever_name", type=str, default="e5", help="Name of the retriever model.") parser.add_argument( "--retriever_model", type=str, default="intfloat/e5-base-v2", help="Path of the retriever model." ) parser.add_argument("--faiss_gpu", action="store_true", help="Use GPU for computation") args = parser.parse_args() # 1) Build a config (could also parse from arguments). # In real usage, you'd parse your CLI arguments or environment variables. config = Config( retrieval_method=args.retriever_name, # or "dense" index_path=args.index_path, corpus_path=args.corpus_path, retrieval_topk=int(args.topk), faiss_gpu=bool(args.faiss_gpu), retrieval_model_path=args.retriever_model, retrieval_pooling_method="mean", retrieval_query_max_length=256, retrieval_use_fp16=True, retrieval_batch_size=512, ) # 2) Instantiate a global retriever so it is loaded once and reused. retriever = get_retriever(config) # 3) Launch the server. By default, it listens on http://127.0.0.1:8000 uvicorn.run(app, host="0.0.0.0", port=8000) ================================================ FILE: contrib/recipes/search_r1/search_r1_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import os import re import time from typing import Any, Dict, List, Optional, Tuple, TypedDict, cast import pandas as pd import requests from openai import OpenAI from qa_em import compute_score_em from agentlightning import LLM, LitAgent, NamedResources, Rollout, Trainer, configure_logger, setup_logging setup_logging() logger = configure_logger(name=__name__) # Copied and adapted from https://github.com/PeterGriffinJin/Search-R1/blob/main/scripts/data_process/nq_search.py INSTRUCTION_FORMAT = """Answer the given question. You must conduct reasoning inside and first every time you get new information. After reasoning, if you find you lack some knowledge, you can call a search engine by query and it will return the top searched results between and . You can search as many times as your want. If you find no further external knowledge needed, you can directly provide the answer inside and , without detailed illustrations. For example, Beijing . Question: """ class Document(TypedDict): contents: str class RetrievalItem(TypedDict): document: Document def eval(prediction: str, ground_truth: List[str]) -> float: reward_score = float(compute_score_em(prediction, ground_truth)) print(f"pred: {prediction} | {type(ground_truth)} gold_answer: {ground_truth} | res: {reward_score}") return reward_score def postprocess_response(response: str) -> str: """Process responses to stop at search operation or answer operation.""" if "" in response: response = response.split("")[0] + "" elif "" in response: response = response.split("")[0] + "" return response def extract_action(response: str) -> Tuple[Optional[str], str]: """Process (text-based) predictions from llm into actions and validity flags.""" pattern = r"<(search|answer)>(.*?)" match = re.search(pattern, response, re.DOTALL) if match: content = match.group(2).strip() # Return only the content inside the tags action: Optional[str] = match.group(1) else: content = "" action = None return action, content def execute_response(response: str, do_search: bool = True) -> str: """ Execute predictions across multiple environments. """ action, content = extract_action(response) if action == "answer": return "" elif action == "search": search_result = retrieve_doc(content) if do_search else "" return f"\n\n{search_result}\n\n" else: return ( "\nMy previous action is invalid. If I want to search, I should put the query between and . " "If I want to give the final answer, I should put the answer between and . Let me try again.\n" ) def retrieve_doc(query: str) -> str: payload: Dict[str, Any] = {"queries": [query], "topk": 3, "return_scores": True} response = requests.post("http://127.0.0.1:8000/retrieve", json=payload) response.raise_for_status() json_resp: Dict[str, Any] = cast(Dict[str, Any], response.json()) retrieval_result: List[RetrievalItem] = cast(List[RetrievalItem], json_resp["result"][0]) retrieval_result_str = passages2string(retrieval_result) return retrieval_result_str def passages2string(retrieval_result: List[RetrievalItem]) -> str: format_reference = "" for idx, doc_item in enumerate(list(retrieval_result)): content = doc_item["document"]["contents"] title = content.split("\n")[0] text = "\n".join(content.split("\n")[1:]) format_reference += f"Doc {idx+1}(Title: {title}) {text}\n" return format_reference def call_llm( llm_client: OpenAI, model_name: str, content: str, temperature: float = 1.0, max_tokens: int = 500, ) -> str: response = llm_client.chat.completions.create( model=model_name, messages=[{"role": "user", "content": content}], temperature=temperature, max_tokens=max_tokens, ) return response.choices[0].message.content or "" class SearchR1Agent(LitAgent[Dict[str, Any]]): def __init__( self, val_temperature: Optional[float] = 0.0, max_turns: int = 4, ) -> None: super().__init__() self.val_temperature = val_temperature self.data_dir = os.environ.get("VERL_SEARCHR1_DATA_DIR", "data") self.max_turns = max_turns def rollout( self, task: Dict[str, Any], resources: NamedResources, rollout: Rollout, ) -> float | None: prompt = INSTRUCTION_FORMAT + task["question"] answer_list: List[str] = cast(List[str], task["golden_answers"]) rollout_id = rollout.rollout_id logger.info(f"[Rollout {rollout_id}] Question: {task['question']}") logger.info(f"[Rollout {rollout_id}] Ground Truth: {answer_list}") start_time = time.time() llm: LLM = cast(LLM, resources["main_llm"]) client = OpenAI( base_url=llm.get_base_url(rollout_id, rollout.attempt.attempt_id), # type: ignore api_key=os.environ.get("OPENAI_API_KEY", "token-abc123"), ) if rollout.mode == "train": temperature = llm.sampling_parameters.get("temperature", 1.0) else: temperature = self.val_temperature if self.val_temperature is not None else 0.0 turn_id = 0 finished_flag = False rollout_content: str = "" try: while turn_id < self.max_turns and not finished_flag: turn_id += 1 turn_response = call_llm( client, llm.model, prompt + rollout_content, temperature=temperature, max_tokens=500 ) valid_turn_response = postprocess_response(turn_response) rollout_content += valid_turn_response turn_env_feedback = execute_response(valid_turn_response) if len(turn_env_feedback) == 0: finished_flag = True else: rollout_content += turn_env_feedback logger.info(f"TURN ID {turn_id} | RESP: {turn_response} | ENV FEEDBACK: {turn_env_feedback}") if not finished_flag: turn_response = call_llm( client, llm.model, prompt + rollout_content, temperature=temperature, max_tokens=500 ) rollout_content += turn_response logger.info(f"LAST TURN GENERATE | RESP: {turn_response}") except Exception as e: logger.exception(f"[Rollout {rollout_id}] Error during rollout: {e}") return None end_time_rollout = time.time() reward_score = eval(rollout_content, answer_list) logger.info("[Rollout %s] Reward: %s", rollout_id, reward_score) end_time_eval = time.time() logger.info("[Rollout %s] Time taken for rollout: %.2f seconds", rollout_id, end_time_rollout - start_time) logger.info( "[Rollout %s] Time taken for evaluation: %.2f seconds", rollout_id, end_time_eval - end_time_rollout ) logger.info( "question: {} answer: {} ground_truth: {} reward: {}".format( task["question"], rollout_content, answer_list, reward_score ) ) return reward_score def debug_search_r1_agent(): searchr1_dev_data_path = os.path.join(os.environ.get("VERL_SEARCHR1_DATA_DIR", "data"), "test.parquet") if not os.path.exists(searchr1_dev_data_path): raise FileNotFoundError(f"Search_R1 dev data file {searchr1_dev_data_path} does not exist.") df = pd.read_parquet(searchr1_dev_data_path).head(10) # type: ignore df = cast(List[Dict[str, Any]], df.to_dict(orient="records")) # type: ignore print("Debug data:", df) trainer = Trainer( n_workers=1, initial_resources={ "main_llm": LLM( endpoint=os.environ["OPENAI_API_BASE"], model="gpt-4.1-nano", sampling_parameters={"temperature": 0.0}, ) }, ) trainer.dev(SearchR1Agent(), df) if __name__ == "__main__": debug_search_r1_agent() ================================================ FILE: contrib/recipes/search_r1/train_search_r1_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import argparse import os from copy import deepcopy from datetime import datetime from typing import Any, Dict import pandas as pd from search_r1_agent import SearchR1Agent import agentlightning as agl RL_TRAINING_CONFIG: Dict[str, Any] = { "algorithm": { "adv_estimator": "grpo", "use_kl_in_reward": False, }, "data": { "train_files": "data/train.parquet", "val_files": "data/test.parquet", "train_batch_size": 512, "max_prompt_length": 6000, "max_response_length": 4096, "truncation": "error", }, "actor_rollout_ref": { "rollout": { "tensor_model_parallel_size": 1, "n": 5, "log_prob_micro_batch_size_per_gpu": 4, "multi_turn": {"format": "hermes"}, "name": "vllm", "gpu_memory_utilization": 0.5, "engine_kwargs": { "vllm": { "enable_auto_tool_choice": True, "tool_call_parser": "hermes", } }, }, "actor": { "ppo_mini_batch_size": 256, "ppo_micro_batch_size_per_gpu": 4, "optim": {"lr": 1e-6, "lr_warmup_steps_ratio": 0.95}, "use_kl_loss": True, "kl_loss_type": "low_var_kl", "kl_loss_coef": 0.001, "entropy_coeff": 0, "clip_ratio_low": 0.2, "clip_ratio_high": 0.3, "fsdp_config": { "param_offload": True, "optimizer_offload": True, }, }, "ref": { "log_prob_micro_batch_size_per_gpu": 4, "fsdp_config": {"param_offload": True}, }, "model": { "path": "Qwen/Qwen2.5-Coder-1.5B-Instruct", "use_remove_padding": True, "enable_gradient_checkpointing": True, }, }, "trainer": { "n_gpus_per_node": 8, "val_before_train": True, "critic_warmup": 0, "logger": ["console", "wandb"], "project_name": "AgentLightning", "experiment_name": "searchr1", "nnodes": 1, "test_freq": 10, "save_freq": 10, "total_epochs": 15, "total_training_steps": 300, "default_local_dir": "checkpoints/searchr1_checkpoints/", }, } def config_train_fast() -> Dict[str, Any]: """A fast training run for CI testing purposes.""" timestamp = datetime.now().strftime("%Y%m%d%H%M%S") EXPERIMENT_NAME = f"searchr1_{timestamp}" PROJECT_NAME = "AgentLightningCI" # Simulate writing to $GITHUB_OUTPUT if it’s set github_output = os.getenv("GITHUB_OUTPUT") if github_output: with open(github_output, "a") as f: f.write(f"project_name={PROJECT_NAME}\n") f.write(f"run_name={EXPERIMENT_NAME}\n") print("Set environment variables:") print(f"PROJECT_NAME={PROJECT_NAME}") print(f"EXPERIMENT_NAME={EXPERIMENT_NAME}") config = deepcopy(RL_TRAINING_CONFIG) config["actor_rollout_ref"]["rollout"]["gpu_memory_utilization"] = 0.6 config["actor_rollout_ref"]["model"]["path"] = "Qwen/Qwen2.5-Coder-0.5B-Instruct" config["data"]["val_files"] = "data/test_dev.parquet" config["trainer"]["total_epochs"] = 1 config["trainer"]["total_training_steps"] = 1 config["trainer"]["experiment_name"] = EXPERIMENT_NAME config["trainer"]["project_name"] = PROJECT_NAME config["trainer"]["test_freq"] = 1 return config def config_train_qwen() -> Dict[str, Any]: """A configuration for training with Qwen-2.5.""" config = deepcopy(RL_TRAINING_CONFIG) return config def config_train_llama() -> Dict[str, Any]: """A configuration for training with LLaMA-3.2-3B-Instruct. You will need a `HF_TOKEN` set to run with this config. """ config = deepcopy(RL_TRAINING_CONFIG) config["actor_rollout_ref"]["rollout"]["multi_turn"]["format"] = "llama3_json" config["actor_rollout_ref"]["rollout"]["engine_kwargs"]["vllm"]["tool_call_parser"] = "llama3_json" config["actor_rollout_ref"]["model"]["path"] = "meta-llama/Llama-3.2-3B-Instruct" return config def train(config: Dict[str, Any]) -> None: agent = SearchR1Agent() algorithm = agl.VERL(config) trainer = agl.Trainer(n_runners=32, algorithm=algorithm) train_data = pd.read_parquet(config["data"]["train_files"]).to_dict(orient="records") # type: ignore val_data = pd.read_parquet(config["data"]["val_files"]).to_dict(orient="records") # type: ignore trainer.fit(agent, train_dataset=train_data, val_dataset=val_data) # type: ignore def main() -> None: """Main function to parse arguments and run training.""" parser = argparse.ArgumentParser(description="Train a Search-R1 agent using different model configurations") parser.add_argument( "config", choices=["fast", "qwen", "llama"], help="Training configuration: 'fast' (CI testing), 'qwen' (Qwen-2.5-Coder-1.5B), 'llama' (LLaMA-3.2-3B-Instruct)", ) args = parser.parse_args() # Get the appropriate configuration config_functions = {"fast": config_train_fast, "qwen": config_train_qwen, "llama": config_train_llama} config = config_functions[args.config]() print(f"Starting training with '{args.config}' configuration...") train(config) if __name__ == "__main__": main() ================================================ FILE: contrib/recipes/webshop/.gitignore ================================================ node_modules/ .venv/ .next/ dist/ *.tsbuildinfo server/webshop/ # Log files from make train logs/ std_log.txt # Auto-generated by Next.js next-env.d.ts ================================================ FILE: contrib/recipes/webshop/Dockerfile ================================================ # Unified WebShop Training Image # # This Dockerfile creates a single image containing all components needed for # the WebShop training pipeline: # - WebShop Flask server (Python + Java for pyserini) # - Agent Lightning coordinator (Python + optional VERL for GPU) # - Headless runner (Node.js + pnpm) # # Build context must be the repository root: # docker build -f examples/vercel_ai_webshop/Dockerfile -t webshop-agl . # # For GPU training: # docker build -f examples/vercel_ai_webshop/Dockerfile --build-arg INSTALL_GPU=true -t webshop-agl-gpu . # # Run modes: # - Full stack: docker run webshop-agl scripts/run_stack.sh qwen # - WebShop only: docker run webshop-agl python server/webshop_server.py # - Runner only: docker run webshop-agl pnpm headless # Base image with CUDA support for GPU training FROM mcr.microsoft.com/azureml/openmpi5.0-cuda12.4-ubuntu22.04:latest # Build argument for GPU support ARG INSTALL_GPU=false # Environment variables ENV PYTHONUNBUFFERED=1 \ DEBIAN_FRONTEND=noninteractive \ JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64 \ PATH="/usr/lib/jvm/temurin-21-jdk-amd64/bin:${PATH}" WORKDIR /app # ============================================================================== # System Dependencies # ============================================================================== # Install system packages: # - Java 21 (Temurin) for pyserini search engine # - Node.js 20 for headless runner # - Git, curl, wget for general utilities RUN apt-get update && apt-get install -y --no-install-recommends \ git curl wget gnupg ca-certificates procps \ # Add Adoptium (Temurin) repository for Java 21 && mkdir -p /etc/apt/keyrings \ && wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor -o /etc/apt/keyrings/adoptium.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main" > /etc/apt/sources.list.d/adoptium.list \ # Add NodeSource repository for Node.js 20 && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ && apt-get update \ && apt-get install -y --no-install-recommends \ temurin-21-jdk \ nodejs \ # Install pnpm globally && npm install -g pnpm \ # Clean up && apt-get clean \ && rm -rf /var/lib/apt/lists/* # ============================================================================== # Python Dependencies # ============================================================================== # Copy Agent Lightning package files from repo root COPY pyproject.toml uv.lock README.md ./ COPY agentlightning/ ./agentlightning/ # Install Agent Lightning (with optional GPU extras) RUN pip install --no-cache-dir --upgrade pip wheel setuptools && \ if [ "$INSTALL_GPU" = "true" ]; then \ pip install --no-cache-dir -e ".[verl]" || pip install --no-cache-dir -e .; \ else \ pip install --no-cache-dir -e .; \ fi # Copy and install WebShop server requirements COPY examples/vercel_ai_webshop/server/requirements.txt ./server-requirements.txt RUN pip install --no-cache-dir -r server-requirements.txt && \ python -m spacy download en_core_web_sm # Copy and install AGL coordinator requirements COPY examples/vercel_ai_webshop/agl/requirements.txt ./agl-requirements.txt RUN pip install --no-cache-dir -r agl-requirements.txt # ============================================================================== # WebShop Setup # ============================================================================== # Clone WebShop repository RUN git clone --depth 1 https://github.com/princeton-nlp/WebShop.git /app/webshop # Install WebShop-specific dependencies RUN cd /app/webshop && \ pip install --no-cache-dir -r requirements.txt || \ pip install --no-cache-dir flask gym beautifulsoup4 rank_bm25 thefuzz numpy pandas tqdm ENV PYTHONPATH="/app/webshop:${PYTHONPATH}" # ============================================================================== # Node.js Dependencies # ============================================================================== # Copy package files and install dependencies COPY examples/vercel_ai_webshop/package.json examples/vercel_ai_webshop/pnpm-lock.yaml* ./ RUN pnpm install --frozen-lockfile || pnpm install # ============================================================================== # Application Code # ============================================================================== # Copy example source code COPY examples/vercel_ai_webshop/tsconfig.json ./ COPY examples/vercel_ai_webshop/src/ ./src/ COPY examples/vercel_ai_webshop/scripts/ ./scripts/ COPY examples/vercel_ai_webshop/agl/ ./agl/ COPY examples/vercel_ai_webshop/server/webshop_server.py ./server/webshop_server.py COPY examples/vercel_ai_webshop/server/docker-entrypoint.sh ./server/docker-entrypoint.sh # Make scripts executable RUN chmod +x scripts/*.sh server/docker-entrypoint.sh # ============================================================================== # Runtime Configuration # ============================================================================== # Default environment variables ENV AGENT_LIGHTNING_STORE_HOST=0.0.0.0 \ AGENT_LIGHTNING_STORE_PORT=4747 \ WEBSHOP_URL=http://127.0.0.1:3000 \ N_RUNNERS=1 # Expose ports # - 3000: WebShop server # - 4747: Agent Lightning Store EXPOSE 3000 4747 # Volume for WebShop dataset persistence VOLUME /app/webshop/data # Health check for the Store server HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:4747/v1/agl/health || exit 1 # Default: run full stack with qwen config CMD ["bash", "scripts/run_stack.sh", "qwen"] ================================================ FILE: contrib/recipes/webshop/Makefile ================================================ # WebShop Training Workflow # # Usage: # make setup # Initialize .env # make train # Run training stack (GPU) # make stop # Stop all services # # Azure ML: # make aml-setup # One-time AML setup (compute + environment) # make aml-train # Submit training job to Azure ML # make aml-logs # Stream logs from running AML job .PHONY: help setup build build-gpu train scale stop clean status \ aml-setup aml-compute aml-train aml-train-qwen aml-logs aml-status N ?= 1 # Azure ML defaults (override with environment variables) AML_RG ?= AML_WS ?= .DEFAULT_GOAL := help #============================================================================== # Help #============================================================================== help: ## Show this help message @echo "WebShop Agent - Commands" @echo "------------------------" @echo "" @echo "Setup:" @echo " make setup Create .env configuration" @echo " make build-gpu Build GPU Docker image" @echo "" @echo "Run:" @echo " make train Start Training Stack (single container, GPU)" @echo " make scale N=3 Set number of runners (default: 1)" @echo "" @echo "Manage:" @echo " make status Show container status" @echo " make stop Stop all services" @echo " make clean Stop and remove volumes" @echo "" @echo "Azure ML:" @echo " make aml-train Submit Qwen training job" @echo " make aml-compute Create AML compute cluster" @echo "" #============================================================================== # Setup #============================================================================== setup: ## Create .env configuration @if [ ! -f .env ]; then \ cp .env.example .env; \ echo "Created .env from .env.example"; \ echo "Please edit .env and add your OPENAI_API_KEY"; \ else \ echo ".env already exists"; \ fi build-gpu: ## Build GPU Docker image @echo "Building WebShop GPU image..." docker build -f Dockerfile --build-arg INSTALL_GPU=true -t webshop-agl-gpu ../.. @echo "Build complete." #============================================================================== # Run #============================================================================== train: setup ## Start Training Stack (GPU) @echo "Starting Training Stack (GPU)..." @echo " - WebShop: http://localhost:3000" @echo " - Coordinator: http://localhost:4747" @echo "" N_RUNNERS=$(N) docker compose --profile gpu up --build -d scale: ## Set number of runners (e.g., make scale N=3) @echo "To change runner count, stop and restart with N=$(N):" @echo " make stop && N=$(N) make train" @echo "" @echo "Or set N_RUNNERS=$(N) in your .env file" #============================================================================== # Azure ML #============================================================================== aml-compute: ## Create Azure ML compute cluster @echo "Creating Azure ML compute cluster..." az ml compute create -f aml/compute.yml -g $(AML_RG) -w $(AML_WS) || \ echo "Compute cluster may already exist (this is OK)" aml-train: ## Submit Qwen training job @echo "Submitting Qwen training job to Azure ML..." @echo "Note: Requires HF_TOKEN and WANDB_API_KEY environment variables" @cp .amlignore ../../../.amlignore && \ trap 'rm -f ../../../.amlignore' EXIT && \ az ml job create -f aml/jobs/webshop-qwen.yml --stream \ --set environment_variables.HF_TOKEN="$$HF_TOKEN" \ --set environment_variables.WANDB_API_KEY="$$WANDB_API_KEY" \ -g $(AML_RG) -w $(AML_WS) ================================================ FILE: contrib/recipes/webshop/README.md ================================================ # WebShop Example This example demonstrates how to train a Vercel AI SDK agent on the WebShop benchmark using Agent Lightning with reinforcement learning (VERL/GRPO). The training pipeline uses a headless TypeScript runner that executes agent rollouts and reports traces to the Agent Lightning coordinator. ## Requirements - Node.js 22+ and pnpm 10+ - Docker (recommended) OR Python 3.8+ with Java 17+ - GPU with 40GB+ VRAM (for VERL training) - HuggingFace token (`HF_TOKEN`) ## Quick Start The recommended way to run the training pipeline is with Docker, which starts all services with a single command. ```bash cd examples/vercel_ai_webshop # 1. Set up environment make setup # 2. Run GPU training (VERL manages the Qwen model via vLLM) make train ``` This starts: - **WebShop Server** (`:3000`) - Flask shopping environment - **Training Coordinator** (`:4747`) - Agent Lightning Store + VERL - **Headless Runners** - Poll for tasks and execute agent rollouts > **Note:** The first run downloads ~100MB of dataset files. This takes about 2 minutes but only happens once. ### Environment Variables | Variable | Description | Required | |----------|-------------|----------| | `HF_TOKEN` | HuggingFace token for model access | Yes | | `WANDB_API_KEY` | Weights & Biases API key for metrics | No | | `WEBSHOP_URL` | WebShop server URL | No (default: `http://localhost:3000`) | ## Included Files | File/Directory | Description | |----------------|-------------| | `agl/run_training.py` | Training coordinator entry point | | `agl/config.py` | VERL/GRPO configuration (model, epochs, batch sizes) | | `agl/tasks.py` | Task loading utilities (JSON, Parquet) | | `agl/generate_tasks.py` | Generate tasks from WebShop human instruction data | | `scripts/headless-runner.ts` | Headless rollout runner for training | | `scripts/run_stack.sh` | Stack orchestration script | | `src/agent/webshop-agent.ts` | ToolLoopAgent with Vercel AI SDK | | `src/environment/webshop-server.ts` | HTTP client for WebShop Flask server | | `src/utils/agentlightning/` | Store client, OpenTelemetry tracing, ProxyLLM utilities | | `server/` | Python WebShop backend | | `aml/` | Azure ML configuration files | ## Running Examples ### Training (Docker) ```bash # Start GPU training - VERL manages vLLM, no API key needed make train # Run with more runners N_RUNNERS=3 make train # Check container status make status # Stop all services make stop ``` ### Training (Manual) If you prefer to run services manually without Docker: **Terminal 1 - WebShop Server:** ```bash cd examples/vercel_ai_webshop docker compose up webshop --build ``` **Terminal 2 - Training Coordinator:** ```bash cd examples/vercel_ai_webshop/agl ./setup.sh # First time only source activate.sh python run_training.py qwen # Full training ``` **Terminal 3+ - Headless Runners:** ```bash cd examples/vercel_ai_webshop export AGENT_LIGHTNING_STORE_URL="http://localhost:4747" pnpm headless -- --worker-id runner-1 ``` ### Generating Tasks By default, training uses `sample_tasks.json` with 8 tasks. For full training, generate tasks from the WebShop dataset: ```bash # Generate all tasks (~12,000 tasks) python agl/generate_tasks.py # With custom options python agl/generate_tasks.py --output agl/webshop_tasks.json --max-tasks 1000 --shuffle # Train with generated tasks python agl/run_training.py qwen --tasks-file agl/webshop_tasks.json ``` ## Running on Azure ML The `aml/` directory contains Azure ML configuration for running training jobs in the cloud. The job runs all services in a single container on a GPU node. ### Prerequisites 1. Install Azure CLI with ML extension: ```bash az extension add -n ml az login ``` 2. Set environment variables: ```bash export AZURE_SUBSCRIPTION_ID="your-subscription-id" export HF_TOKEN="your-huggingface-token" export WANDB_API_KEY="your-wandb-api-key" ``` ### Submit Job ```bash # One-time setup (creates compute cluster) make aml-setup # Submit training job make aml-train # Stream logs make aml-logs # Check job status make aml-status ``` ### Using az ml CLI directly ```bash RG= WS= # Create compute cluster (one-time) az ml compute create -f aml/compute.yml -g $RG -w $WS # Submit job az ml job create -f aml/jobs/webshop-qwen.yml --stream \ --set environment_variables.HF_TOKEN="$HF_TOKEN" \ --set environment_variables.WANDB_API_KEY="$WANDB_API_KEY" \ -g $RG -w $WS # Stream logs az ml job stream -n -g $RG -w $WS ``` ### Customization ```bash # Change number of runners az ml job create -f aml/jobs/webshop-qwen.yml --stream \ --set environment_variables.N_RUNNERS=4 \ --set environment_variables.HF_TOKEN="$HF_TOKEN" \ -g $RG -w $WS # Use different compute az ml compute create --name my-gpu-cluster --size Standard_NC48ads_A100_v4 \ --min-instances 0 --max-instances 2 -g $RG -w $WS az ml job create -f aml/jobs/webshop-qwen.yml --set compute=azureml:my-gpu-cluster ... ``` ## Troubleshooting | Issue | Solution | |-------|----------| | `connect ECONNREFUSED` | Wait for service healthcheck or run `make status` | | Container `Exited (1)` | Check logs: `docker compose logs` | | Port 3000 in use | Set `WEBSHOP_URL=http://localhost:3001` in `.env` | | WebShop data download fails | Check network access; data downloads from Google Drive | | AML compute not starting | Check quota limits and VM availability in your region | | vLLM/flash-attn build errors | Ensure `VLLM_USE_V1=1` is set; check CUDA 12.6+ support | ## Related - [AI SDK Documentation](https://sdk.vercel.ai/docs) - [WebShop Benchmark](https://github.com/princeton-nlp/WebShop) - [Agent Lightning Docs](../../docs/) ================================================ FILE: contrib/recipes/webshop/agl/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Agent Lightning training configuration for WebShop agent.""" ================================================ FILE: contrib/recipes/webshop/agl/config.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Training configurations for the WebShop agent. This module provides training configurations for the WebShop agent using Agent Lightning. The configurations support external runner mode where the TypeScript/Vercel AI SDK agent executes rollouts while this script coordinates the training. Configurations: - 'fast': Lightweight config for CI testing (Qwen2.5-0.5B, 1 epoch) - 'qwen': Standard config (Qwen2.5-3B-Instruct, 50 epochs) - 'qwen_1_5b': Legacy smaller model (Qwen2.5-1.5B-Instruct) - 'qwen_7b': Larger model for best instruction following (Qwen2.5-7B-Instruct) """ from __future__ import annotations import os from copy import deepcopy from datetime import datetime from typing import Any, Dict, Tuple RL_TRAINING_CONFIG: Dict[str, Any] = { "algorithm": { "adv_estimator": "grpo", "use_kl_in_reward": False, }, "data": { "train_batch_size": 8, # Must be <= number of tasks (sample tasks = 8) "max_prompt_length": 4096, "max_response_length": 1024, "truncation": "error", }, "actor_rollout_ref": { "rollout": { "tensor_model_parallel_size": 1, "n": 4, "log_prob_micro_batch_size_per_gpu": 4, "multi_turn": {"format": "hermes"}, "name": "vllm", "gpu_memory_utilization": 0.8, "engine_kwargs": { "vllm": { "enable_auto_tool_choice": True, "tool_call_parser": "hermes", } }, }, "actor": { "ppo_mini_batch_size": 8, # Must be <= train_batch_size "ppo_micro_batch_size_per_gpu": 4, "optim": {"lr": 5e-6}, # Increased from 1e-6 for faster convergence "use_kl_loss": False, "kl_loss_coef": 0.0, "entropy_coeff": 0.01, # Added entropy bonus to encourage exploration "clip_ratio_low": 0.2, "clip_ratio_high": 0.3, "fsdp_config": { "param_offload": True, "optimizer_offload": True, }, }, "ref": { "log_prob_micro_batch_size_per_gpu": 8, "fsdp_config": {"param_offload": True}, }, "model": { # Qwen 3B model for better instruction following "path": "Qwen/Qwen2.5-3B-Instruct", "use_remove_padding": True, "enable_gradient_checkpointing": True, }, }, "trainer": { "n_gpus_per_node": 1, "val_before_train": True, "critic_warmup": 0, "logger": ["console", "wandb"], "project_name": "AgentLightning", "experiment_name": "webshop", "nnodes": 1, "test_freq": 32, "total_epochs": 50, }, } def _write_github_output(project_name: str, experiment_name: str) -> None: """Write experiment metadata to GitHub Actions output file if running in CI. This enables downstream workflow steps to reference the project/experiment names. Does nothing if GITHUB_OUTPUT environment variable is not set. """ github_output = os.getenv("GITHUB_OUTPUT") if github_output: with open(github_output, "a") as f: f.write(f"project_name={project_name}\n") f.write(f"run_name={experiment_name}\n") def _create_config( experiment_prefix: str, project_name: str = "AgentLightning", **overrides: Any, ) -> Tuple[Dict[str, Any], str, str]: """Create a training config from the base with timestamp and optional overrides. Args: experiment_prefix: Prefix for the experiment name (timestamp appended). project_name: W&B project name for tracking. **overrides: Nested key paths with values to override. Use double underscores to denote nesting (e.g., `trainer__total_epochs=1`). Returns: Tuple of (config dict, experiment_name, project_name). """ timestamp = datetime.now().strftime("%Y%m%d%H%M%S") experiment_name = f"{experiment_prefix}_{timestamp}" config = deepcopy(RL_TRAINING_CONFIG) config["trainer"]["experiment_name"] = experiment_name config["trainer"]["project_name"] = project_name # Apply overrides using double-underscore notation for nested keys for key, value in overrides.items(): parts = key.split("__") target = config for part in parts[:-1]: target = target[part] target[parts[-1]] = value return config, experiment_name, project_name def config_fast() -> Dict[str, Any]: """Fast training configuration for CI testing. Uses a smaller model (Qwen2.5-0.5B-Instruct) and minimal epochs for quick validation of the training pipeline. """ config, experiment_name, project_name = _create_config( experiment_prefix="webshop_fast", project_name="AgentLightningCI", actor_rollout_ref__model__path="Qwen/Qwen2.5-0.5B-Instruct", actor_rollout_ref__rollout__gpu_memory_utilization=0.6, trainer__total_epochs=1, trainer__total_training_steps=1, trainer__test_freq=1, ) _write_github_output(project_name, experiment_name) return config def config_qwen() -> Dict[str, Any]: """Standard Qwen training configuration. Uses Qwen2.5-3B-Instruct for full training runs with improved hyperparameters. """ config, _, _ = _create_config(experiment_prefix="webshop_qwen") return config def config_qwen_1_5b() -> Dict[str, Any]: """Legacy Qwen 1.5B configuration (smaller, faster). Use this for quick iterations or when GPU memory is limited. """ config, _, _ = _create_config( experiment_prefix="webshop_qwen1.5b", actor_rollout_ref__model__path="Qwen/Qwen2.5-1.5B-Instruct", actor_rollout_ref__rollout__gpu_memory_utilization=0.8, ) return config def config_qwen_7b() -> Dict[str, Any]: """Qwen 7B configuration for best instruction following. Uses the larger Qwen2.5-7B-Instruct model. Requires more GPU memory. """ config, _, _ = _create_config( experiment_prefix="webshop_qwen7b", actor_rollout_ref__model__path="Qwen/Qwen2.5-7B-Instruct", actor_rollout_ref__rollout__gpu_memory_utilization=0.9, ) return config ================================================ FILE: contrib/recipes/webshop/agl/generate_tasks.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Generate training tasks from WebShop product data. This script extracts training tasks from the WebShop human instruction dataset. It produces a JSON file compatible with the training pipeline's --tasks-file argument. Usage: cd examples/vercel_ai_webshop python agl/generate_tasks.py --output agl/webshop_tasks.json # With custom options: python agl/generate_tasks.py --output agl/webshop_tasks.json --max-tasks 500 --shuffle The output format matches sample_tasks.json: { "task_id": "ws_B09QKP7XQL_0", "instruction": "i'm looking for a blue wireless bluetooth headphones.", "target_attributes": { "attributes": ["wireless bluetooth"], "options": ["blue"] } } """ from __future__ import annotations import argparse import json import logging import random import sys from pathlib import Path from typing import Any logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") logger = logging.getLogger(__name__) # Default paths relative to this script's location SCRIPT_DIR = Path(__file__).parent WEBSHOP_DATA_DIR = SCRIPT_DIR.parent / "server" / "webshop" / "data" DEFAULT_HUMAN_INS_PATH = WEBSHOP_DATA_DIR / "items_human_ins.json" DEFAULT_OUTPUT_PATH = SCRIPT_DIR / "webshop_tasks.json" def load_human_instructions(filepath: Path) -> dict[str, list[dict[str, Any]]]: """Load human instructions from WebShop data. Args: filepath: Path to items_human_ins.json file. Returns: Dictionary mapping ASINs to lists of instruction records. """ logger.info(f"Loading human instructions from {filepath}") with open(filepath) as f: data = json.load(f) logger.info(f"Loaded instructions for {len(data)} products") return data def convert_to_training_task( asin: str, instruction_record: dict[str, Any], task_index: int, ) -> dict[str, Any]: """Convert a WebShop instruction record to training task format. Args: asin: Product ASIN. instruction_record: Instruction dict from items_human_ins.json. task_index: Index for unique task ID. Returns: Task dictionary compatible with training pipeline. """ instruction_text = instruction_record.get("instruction", "") instruction_attributes = instruction_record.get("instruction_attributes", []) instruction_options = instruction_record.get("instruction_options", []) return { "task_id": f"ws_{asin}_{task_index}", "instruction": instruction_text, "target_attributes": { "attributes": instruction_attributes, "options": instruction_options, }, "asin": asin, } def generate_tasks( human_instructions: dict[str, list[dict[str, Any]]], max_tasks: int | None = None, shuffle: bool = False, seed: int = 42, ) -> list[dict[str, Any]]: """Generate training tasks from human instruction data. Args: human_instructions: Dictionary mapping ASINs to instruction records. max_tasks: Maximum number of tasks to generate (None for all). shuffle: Whether to shuffle tasks before limiting. seed: Random seed for reproducibility when shuffling. Returns: List of training task dictionaries. """ tasks: list[dict[str, Any]] = [] task_index = 0 for asin, instruction_records in human_instructions.items(): for record in instruction_records: instruction = record.get("instruction", "") instruction_attrs = record.get("instruction_attributes", []) if not instruction or not instruction_attrs: continue task = convert_to_training_task(asin, record, task_index) tasks.append(task) task_index += 1 logger.info(f"Generated {len(tasks)} tasks from human instructions") if shuffle: logger.info(f"Shuffling tasks with seed {seed}") random.seed(seed) random.shuffle(tasks) if max_tasks is not None and len(tasks) > max_tasks: logger.info(f"Limiting to {max_tasks} tasks") tasks = tasks[:max_tasks] return tasks def main() -> int: """Main entry point for task generation.""" parser = argparse.ArgumentParser( description="Generate training tasks from WebShop human instruction data.", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=__doc__, ) parser.add_argument( "--input", type=Path, default=DEFAULT_HUMAN_INS_PATH, help=f"Path to items_human_ins.json (default: {DEFAULT_HUMAN_INS_PATH})", ) parser.add_argument( "--output", type=Path, default=DEFAULT_OUTPUT_PATH, help=f"Output path for generated tasks (default: {DEFAULT_OUTPUT_PATH})", ) parser.add_argument( "--max-tasks", type=int, default=None, help="Maximum number of tasks to generate (default: all)", ) parser.add_argument( "--shuffle", action="store_true", help="Shuffle tasks before limiting", ) parser.add_argument( "--seed", type=int, default=42, help="Random seed for shuffling (default: 42)", ) args = parser.parse_args() if not args.input.exists(): logger.error(f"Input file not found: {args.input}") logger.error("Run setup.sh to download the WebShop data first.") return 1 human_instructions = load_human_instructions(args.input) tasks = generate_tasks( human_instructions, max_tasks=args.max_tasks, shuffle=args.shuffle, seed=args.seed, ) if not tasks: logger.error("No valid tasks generated. Check input data.") return 1 args.output.parent.mkdir(parents=True, exist_ok=True) with open(args.output, "w") as f: json.dump(tasks, f, indent=2) logger.info(f"Wrote {len(tasks)} tasks to {args.output}") # Print summary statistics unique_asins = len(set(t["asin"] for t in tasks)) logger.info(f"Summary: {len(tasks)} tasks from {unique_asins} unique products") return 0 if __name__ == "__main__": sys.exit(main()) ================================================ FILE: contrib/recipes/webshop/agl/requirements.txt ================================================ # Agent Lightning Training Dependencies # Python 3.10+ required # # For GPU training: ./setup.sh (installs VERL extras) # Core dependency (installed from repo root by setup.sh) # agentlightning>=0.3.0 # Task loading pandas>=2.0.0 pyarrow>=14.0.0 # For parquet support # Logging and utilities rich>=13.0.0 tqdm>=4.64.0 ================================================ FILE: contrib/recipes/webshop/agl/run_training.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Train a WebShop agent using Agent Lightning with external runners. This script runs the training coordinator that: 1. Starts the Agent Lightning Store server 2. Enqueues rollouts for training 3. Waits for external runners (headless TypeScript or UI) to execute tasks 4. Collects traces and rewards for training The key difference from the Spider example is that this uses n_runners=0 (external runner mode) because the agent is implemented in TypeScript/Vercel AI SDK rather than Python. Task Loading: By default, this script auto-generates tasks from WebShop human instruction data (items_human_ins.json) if available. If not found, it falls back to sample tasks. Usage: python agl/run_training.py fast # Fast training for CI python agl/run_training.py qwen # Full Qwen training (auto-generates tasks) # Limit auto-generated tasks: python agl/run_training.py qwen --max-tasks 100 # Disable auto-generation: python agl/run_training.py qwen --no-auto-generate # With custom tasks file: python agl/run_training.py qwen --tasks-file data/tasks.json Prerequisites: 1. Start the Agent Lightning Store server (will be started automatically) 2. Start one or more headless runners: npm run headless -- --worker-id runner-1 3. Or use the interactive UI which will also report to the Store """ from __future__ import annotations import argparse import logging import os from pathlib import Path from typing import Any, Dict, List, Optional from config import config_fast, config_qwen from generate_tasks import generate_tasks, load_human_instructions from tasks import load_sample_tasks, load_tasks_from_file import agentlightning as agl from agentlightning import LitAgent from agentlightning.adapter.triplet import TracerTraceToTriplet from agentlightning.types import NamedResources, Rollout, RolloutRawResult # Paths where WebShop human instruction data may be found WEBSHOP_DATA_PATHS = [ Path(__file__).parent.parent / "server" / "webshop" / "data" / "items_human_ins.json", Path("/app/webshop/data/items_human_ins.json"), # Docker path ] # Vercel AI SDK produces spans with names like "ai.generateText", "ai.streamText", etc. # The default adapter matches "openai.chat.completion" which doesn't match these. # This pattern matches the AI SDK span names for LLM calls. VERCEL_AI_SDK_LLM_CALL_PATTERN = r"ai\.(generateText|streamText|generateObject)(\.do(Generate|Stream))?" def find_human_instructions_path() -> Path | None: """Find the items_human_ins.json file in known locations. Returns: Path to the file if found, None otherwise. """ for path in WEBSHOP_DATA_PATHS: if path.exists(): return path return None def auto_generate_tasks( max_tasks: int | None = None, shuffle: bool = True, seed: int = 42, ) -> list[Dict[str, Any]] | None: """Auto-generate tasks from WebShop human instruction data if available. Args: max_tasks: Maximum number of tasks to generate (None for all). shuffle: Whether to shuffle tasks before limiting. seed: Random seed for reproducibility when shuffling. Returns: List of generated tasks, or None if human instruction data not found. """ human_ins_path = find_human_instructions_path() if human_ins_path is None: return None logger.info(f"[PROGRESS] Auto-generating tasks from {human_ins_path}") human_instructions = load_human_instructions(human_ins_path) tasks = generate_tasks(human_instructions, max_tasks=max_tasks, shuffle=shuffle, seed=seed) logger.info(f"[PROGRESS] Generated {len(tasks)} tasks") return tasks class ExternalRunnerAgent(LitAgent[Dict[str, Any]]): """Placeholder agent that satisfies the Trainer API for external runner mode. In external runner mode (n_runners=0), the actual agent logic executes outside Python - typically in TypeScript/Node.js runners using the Vercel AI SDK. The Trainer API requires an agent object, so this placeholder fills that role while the Store server coordinates with external runners. This class should never have its `rollout` method invoked. If it is called, it indicates a configuration error (likely n_runners > 0 when it should be 0). """ def rollout(self, task: Dict[str, Any], resources: NamedResources, rollout: Rollout) -> RolloutRawResult: """Raise an error - external runners handle actual execution. Raises: RuntimeError: Always, since this method should never be called. """ raise RuntimeError( "ExternalRunnerAgent.rollout() was called, but this agent is meant " "for external runner mode (n_runners=0). Ensure your Trainer is " "configured with n_runners=0 for external runner workflows." ) logging.basicConfig( level=getattr(logging, os.environ.get("LOG_LEVEL", "DEBUG").upper(), logging.DEBUG), format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", force=True, ) logger = logging.getLogger(__name__) def train( config: Dict[str, Any], tasks: List[Dict[str, Any]], val_tasks: Optional[List[Dict[str, Any]]] = None, ) -> None: """Run training with external runner mode. Args: config: Training configuration dictionary. tasks: List of training tasks. val_tasks: Optional list of validation tasks. Defaults to first 10 training tasks. """ algorithm = agl.VERL(config) # Configure adapter to match span names from telemetry. # IMPORTANT: Pass adapter to Trainer, not algorithm.set_adapter() - the Trainer would overwrite it. # Match both LiteLLM spans (openai.chat.completion) and Vercel AI SDK spans. adapter = TracerTraceToTriplet(llm_call_match=r"(openai\.chat\.completion|" + VERCEL_AI_SDK_LLM_CALL_PATTERN + r")") # n_runners=0 means external runners will execute rollouts. # The Store server will be started and accept connections from: # - The headless TypeScript runner (scripts/headless-runner.ts) # - The interactive Next.js UI # server_host="0.0.0.0" binds to all interfaces so external runners can connect trainer = agl.Trainer( n_runners=0, # External runner mode algorithm=algorithm, adapter=adapter, strategy={"type": "cs", "main_process": "algorithm", "server_host": "0.0.0.0"}, ) # Placeholder agent - actual execution happens in external TypeScript runners agent = ExternalRunnerAgent() logger.info("[PROGRESS] Starting training coordinator in external runner mode...") logger.info("[PROGRESS] Store server will be available at the configured endpoint") logger.info(f"[PROGRESS] Enqueuing {len(tasks)} tasks for training") if val_tasks is None: val_tasks = tasks[:10] logger.warning( "No validation tasks provided; defaulting to first %d training tasks. " "Consider providing --val-tasks-file for proper validation.", len(val_tasks), ) logger.info(f"[PROGRESS] Using {len(val_tasks)} tasks for validation") # The trainer.fit() method will: # 1. Start the Store server # 2. Enqueue rollouts # 3. Wait for external runners to complete them # 4. Collect traces and update model trainer.fit( agent=agent, # Placeholder agent for external runner mode train_dataset=tasks, val_dataset=val_tasks, ) def main() -> None: """Parse arguments and run training.""" parser = argparse.ArgumentParser(description="Train WebShop agent with Agent Lightning (external runner mode)") parser.add_argument( "config", choices=["fast", "qwen"], help="Training configuration: 'fast' (CI testing), 'qwen' (full training)", ) parser.add_argument( "--tasks-file", type=str, help="Path to tasks file (JSON or Parquet). Defaults to sample tasks.", ) parser.add_argument( "--val-tasks-file", type=str, help="Path to validation tasks file. Defaults to first 10 training tasks.", ) parser.add_argument( "--max-tasks", type=int, default=None, help="Maximum number of tasks to use (applies to auto-generated tasks).", ) parser.add_argument( "--no-auto-generate", action="store_true", help="Disable auto-generation of tasks; use sample tasks if no --tasks-file provided.", ) args = parser.parse_args() # Load tasks if args.tasks_file: tasks = load_tasks_from_file(Path(args.tasks_file)) logger.info(f"[PROGRESS] Loaded {len(tasks)} tasks from {args.tasks_file}") elif args.no_auto_generate: tasks = load_sample_tasks() logger.info(f"[PROGRESS] Using {len(tasks)} sample tasks (auto-generation disabled)") else: # Try auto-generation first, fall back to sample tasks tasks = auto_generate_tasks(max_tasks=args.max_tasks, shuffle=True) if tasks is None: tasks = load_sample_tasks() logger.info(f"[PROGRESS] Using {len(tasks)} sample tasks (WebShop data not found)") else: logger.info(f"[PROGRESS] Auto-generated {len(tasks)} tasks from WebShop data") # Get config config_functions = { "fast": config_fast, "qwen": config_qwen, } config = config_functions[args.config]() # Load validation tasks val_tasks = None if args.val_tasks_file: val_tasks = load_tasks_from_file(Path(args.val_tasks_file)) logger.info(f"[PROGRESS] Loaded {len(val_tasks)} validation tasks from {args.val_tasks_file}") logger.info(f"[PROGRESS] Starting training with '{args.config}' configuration") train(config, tasks, val_tasks) if __name__ == "__main__": main() ================================================ FILE: contrib/recipes/webshop/agl/sample_tasks.json ================================================ [ { "task_id": "ws_001", "instruction": "I need a red cotton t-shirt for men, size large, under $30", "target_attributes": { "color": "red", "material": "cotton", "size": "L", "priceMax": 30 } }, { "task_id": "ws_002", "instruction": "Find me black running shorts for men, size medium, athletic style", "target_attributes": { "color": "black", "style": "athletic", "size": "M" } }, { "task_id": "ws_003", "instruction": "I'm looking for a gray fleece hoodie for women, size small", "target_attributes": { "color": "gray", "material": "fleece", "size": "S" } }, { "task_id": "ws_004", "instruction": "Find white canvas sneakers, size 9, preferably under $50", "target_attributes": { "color": "white", "material": "canvas", "size": "9", "priceMax": 50 } }, { "task_id": "ws_005", "instruction": "I need navy blue slim fit chino pants, waist 32, length 32", "target_attributes": { "color": "navy", "style": "slim fit", "waist": "32", "length": "32" } }, { "task_id": "ws_006", "instruction": "Looking for black yoga leggings for women, size medium", "target_attributes": { "color": "black", "style": "yoga", "size": "M" } }, { "task_id": "ws_007", "instruction": "Find a white organic cotton blouse for women, size medium", "target_attributes": { "color": "white", "material": "organic cotton", "size": "M" } }, { "task_id": "ws_008", "instruction": "I want a navy blue polo shirt for men, size XL, under $50", "target_attributes": { "color": "navy", "style": "polo", "size": "XL", "priceMax": 50 } } ] ================================================ FILE: contrib/recipes/webshop/agl/tasks.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Task loading utilities for WebShop training. This module provides utilities for loading WebShop tasks from various sources: - Sample tasks matching the TypeScript sample-tasks.ts - JSON files - Parquet files To generate a full task set from WebShop data, use `generate_tasks.py`: python agl/generate_tasks.py --output agl/webshop_tasks.json Then load in training: python agl/run_training.py qwen --tasks-file agl/webshop_tasks.json """ from __future__ import annotations import json from pathlib import Path from typing import Any, Dict, List, Optional try: import pandas as pd except ImportError: pd = None # type: ignore[assignment] # Default location for sample tasks file (same directory as this module) _SAMPLE_TASKS_FILE = Path(__file__).parent / "sample_tasks.json" def load_sample_tasks(path: Optional[Path] = None) -> List[Dict[str, Any]]: """Load sample tasks matching src/data/sample-tasks.ts. Args: path: Optional path to sample tasks JSON file. Defaults to `sample_tasks.json` in the same directory as this module. Returns: List of task dictionaries with task_id, instruction, and target_attributes. """ tasks_path = path or _SAMPLE_TASKS_FILE return load_tasks_from_file(tasks_path) def load_tasks_from_file(path: Path) -> List[Dict[str, Any]]: """Load tasks from a JSON or Parquet file. Args: path: Path to the tasks file (JSON or Parquet format). Returns: List of task dictionaries. Raises: ValueError: If the file format is not supported. ImportError: If loading Parquet but pandas is not installed. """ if path.suffix == ".json": with open(path) as f: return json.load(f) elif path.suffix == ".parquet": if pd is None: raise ImportError("pandas is required to load Parquet files. " "Install with: pip install pandas pyarrow") df = pd.read_parquet(path) # type: ignore[reportUnknownMemberType] return df.to_dict(orient="records") # type: ignore[return-value] else: raise ValueError(f"Unsupported file format: {path.suffix}. Use .json or .parquet") ================================================ FILE: contrib/recipes/webshop/agl/webshop_tasks.json ================================================ [ { "task_id": "ws_B09QKP7XQL_0", "instruction": "i'm looking for a blue wireless bluetooth headphones.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B09QKP7XQL" }, { "task_id": "ws_B08Y865MTQ_1", "instruction": "i need 12 inch blue hair extensions that are made from natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "blue", "12 inch (pack of 1)" ] }, "asin": "B08Y865MTQ" }, { "task_id": "ws_B01LOUY5M8_2", "instruction": "i'm looking for shampoo & conditioner sets for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B01LOUY5M8" }, { "task_id": "ws_B00BSY015G_3", "instruction": "iam looking a steel frame tempered glass drawing table & board colour black", "target_attributes": { "attributes": [ "tempered glass", "steel frame" ], "options": [ "black | clear glass" ] }, "asin": "B00BSY015G" }, { "task_id": "ws_B09QGV5PDZ_4", "instruction": "i need easy to use nurse scrub caps. pick light navy one.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "light navy" ] }, "asin": "B09QGV5PDZ" }, { "task_id": "ws_B09DK1P3X8_5", "instruction": "i need one travel bottle that is black and has an opener.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "1 pcs black & opener" ] }, "asin": "B09DK1P3X8" }, { "task_id": "ws_B097JZJTCK_6", "instruction": "i'm looking for vanity lights for dining room", "target_attributes": { "attributes": [ "vanity light", "dining room" ], "options": [] }, "asin": "B097JZJTCK" }, { "task_id": "ws_B07PT3T483_7", "instruction": "i'm looking for birthday cake toppers for party supplies. also choose 40 years cake topper one.", "target_attributes": { "attributes": [ "birthday cake", "party supplies" ], "options": [ "40 years cake topper" ] }, "asin": "B07PT3T483" }, { "task_id": "ws_B01HOMR4AU_8", "instruction": "i need a square shaped turquoise area rug that is easy to clean and is 8 by 8 feet.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "turquoise", "square", "8 ft 0 x 8 ft 0" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_9", "instruction": "find me a modern shag carpet. something in turquoise and around 8 feet on either side. i speficially want one that's easy to clean, and that's octagonal in shape if available.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "turquoise", "octagonal", "8 ft 0 x 8 ft 0 square" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_10", "instruction": "i am looking for a rectangular runner shaped area rug with easy clean. also choose snow white color and 3 ft 3 in x 3 ft 3 in size.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "snow white", "rectangular runner" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_11", "instruction": "i need an easy to clean 8x10' shag rug. it needs to be rectangular and navy blue.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "navy blue", "rectangular", "8 x 10 ft" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_12", "instruction": "i would like a 7 foot oval turquoise rug that is easy to spot clean.", "target_attributes": { "attributes": [ "easy clean", "spot clean" ], "options": [ "turquoise", "oval", "7 ft" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_13", "instruction": "show me an easy to clean square shaped terracotta rug with 2 ft 6 in x 10 ft measurement.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "terracotta", "square", "2 ft 6 in x 10 ft" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_14", "instruction": "i am looking for a spot cleanan round shape area rugs", "target_attributes": { "attributes": [ "spot clean" ], "options": [ "round" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B01HOMR4AU_15", "instruction": "i am looking a area rug soft easy clean in octagon shape size 7ft colour turquoise", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "turquoise", "octagon", "7 ft" ] }, "asin": "B01HOMR4AU" }, { "task_id": "ws_B091G8RGQY_16", "instruction": "i want a phone case which is easy to install and has a slim design. pick a japan kitty color.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "japan kitty" ] }, "asin": "B091G8RGQY" }, { "task_id": "ws_B00006BSTZ_17", "instruction": "i'm looking for optical zoom point & shoot digital cameras.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B00006BSTZ" }, { "task_id": "ws_B09QC6YYHV_18", "instruction": "i need a light grey bed frame that fits a king size bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "light grey", "queen" ] }, "asin": "B09QC6YYHV" }, { "task_id": "ws_B09PLBBQK5_19", "instruction": "i am looking for yuanl 2 pcs stainless steel tongue scraper to clear out the white, coated layer on your tongue or maintain better oral hygiene, this effective tongue scraper for adults and kids.", "target_attributes": { "attributes": [ "easy clean", "bpa free", "easy use", "high quality", "stainless steel", "bad breath" ], "options": [] }, "asin": "B09PLBBQK5" }, { "task_id": "ws_B001MKOKH6_20", "instruction": "i want a regular fit pea coat with button closure. i need it in black.", "target_attributes": { "attributes": [ "button closure", "regular fit" ], "options": [ "black" ] }, "asin": "B001MKOKH6" }, { "task_id": "ws_B082ZQ1H8W_21", "instruction": "i am looking for a cruelty free hair mask.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B082ZQ1H8W" }, { "task_id": "ws_B09RWQQ2JS_22", "instruction": "i'm furnished their house with inexpensive furniture with color green and size 90x4x45cm(35x16x18inch).", "target_attributes": { "attributes": [ "living room" ], "options": [ "green", "90x40x45cm(35x16x18inch)" ] }, "asin": "B09RWQQ2JS" }, { "task_id": "ws_B09H7JB6JZ_23", "instruction": "i'm looking for a water resistance smartwatch bands of tie dye color.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "tie dye" ] }, "asin": "B09H7JB6JZ" }, { "task_id": "ws_B09C2KVC5K_24", "instruction": "i'm looking for dental flossers which is easy to use and eliminates bad breath.", "target_attributes": { "attributes": [ "easy use", "bad breath" ], "options": [] }, "asin": "B09C2KVC5K" }, { "task_id": "ws_B09QRN8FQN_25", "instruction": "i am looking for a gluten free and low calorie sparkling spritz. pick something in coconut passion fruit flavor.", "target_attributes": { "attributes": [ "gluten free", "low calorie" ], "options": [ "coconut passion fruit" ] }, "asin": "B09QRN8FQN" }, { "task_id": "ws_B07D97VTXR_26", "instruction": "i am looking for sand gold nail art glitters which are long lasting and easy to apply. choose microfine 100g /3.5oz size.", "target_attributes": { "attributes": [ "easy apply", "long lasting" ], "options": [ "sand gold", "microfine - 100g | 3.5oz" ] }, "asin": "B07D97VTXR" }, { "task_id": "ws_B09F35WCV5_27", "instruction": "i want some casual gym workout pants that are green and come in an x-large.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "green", "x-large" ] }, "asin": "B09F35WCV5" }, { "task_id": "ws_B08WC7XBSL_28", "instruction": "i am looking for some memory foam sneakers in a size 7 that are black, white and red.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black | white | red", "7" ] }, "asin": "B08WC7XBSL" }, { "task_id": "ws_B097M7TXJD_29", "instruction": "i am looking for a pink lave closure sneaker.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "pink" ] }, "asin": "B097M7TXJD" }, { "task_id": "ws_B08846NCF7_30", "instruction": "i need a unisex clog made of vinyl acetate. pick a new mint color.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "new mint" ] }, "asin": "B08846NCF7" }, { "task_id": "ws_B09SBL979H_31", "instruction": "i am looking for loose fit cotton shirts for men with short sleeve in white color. medium size preferable.", "target_attributes": { "attributes": [ "loose fit", "short sleeve" ], "options": [ "white", "medium" ] }, "asin": "B09SBL979H" }, { "task_id": "ws_B09F64NG2P_32", "instruction": "i need some hair drying towels that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09F64NG2P" }, { "task_id": "ws_B09NBW8RDL_33", "instruction": "i want a home office chair that is white and easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "white" ] }, "asin": "B09NBW8RDL" }, { "task_id": "ws_B07N7NF4L7_34", "instruction": "i need a navy machine washable twin quilt set.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "navy", "twin" ] }, "asin": "B07N7NF4L7" }, { "task_id": "ws_B09DP1F6GK_35", "instruction": "i would like to buy a black case for iphone 13 pro max which has protection for two screen with tempered glass and which i can easily install myself.", "target_attributes": { "attributes": [ "easy install", "tempered glass" ], "options": [ "black - 13 pro" ] }, "asin": "B09DP1F6GK" }, { "task_id": "ws_B08DHL1YDL_36", "instruction": "find a yubikey 5c usb port security key", "target_attributes": { "attributes": [ "usb port" ], "options": [ "yubikey 5c" ] }, "asin": "B08DHL1YDL" }, { "task_id": "ws_B08SJ3V46M_37", "instruction": "i need a weather radio that has batteries included and is black.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "black" ] }, "asin": "B08SJ3V46M" }, { "task_id": "ws_B085312K1G_38", "instruction": "i need a alcohol and cruelty free perfume. pick the one with musk scent.", "target_attributes": { "attributes": [ "alcohol free", "cruelty free" ], "options": [ "musk" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_39", "instruction": "i want to found 0.1 fluid ounces of alcohol-free perfume oil with a woody scent.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "oud wood", "0.1 fl oz (pack of 1)" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_40", "instruction": "i am looking for a perfume oil in metal packing of 12 ml size which is alcohol free and lasts long.", "target_attributes": { "attributes": [ "alcohol free", "long lasting" ], "options": [ "12 ml - metal" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_41", "instruction": "i'm looking for alcohol free perfume with an oud wood scent.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "oud wood" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_42", "instruction": "i am looking for a perfume oil in metal packing of 12 ml size which is alcohol free and lasts long.", "target_attributes": { "attributes": [ "alcohol free", "long lasting" ], "options": [ "12 ml - metal" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_43", "instruction": "i'm looking for a 12 ml superior egyptian musk.", "target_attributes": { "attributes": [ "alcohol free", "cruelty free" ], "options": [ "vanilla musk", "12 ml" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B085312K1G_44", "instruction": "women's eau de parfum red musk paraben free crulty free long lasting size :12 ml", "target_attributes": { "attributes": [ "cruelty free", "paraben free", "long lasting" ], "options": [ "red musk", "12 ml" ] }, "asin": "B085312K1G" }, { "task_id": "ws_B09Q39KMH4_45", "instruction": "i am looking for medium long sleeves sleep & lounge sets.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09Q39KMH4" }, { "task_id": "ws_B096MJQPX3_46", "instruction": "i'm looking for a long lasting jar candles.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B096MJQPX3" }, { "task_id": "ws_B094XYRY4L_47", "instruction": "i need a quick drying skort with pockets. pick a dark grey one.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "dark grey" ] }, "asin": "B094XYRY4L" }, { "task_id": "ws_B00O3202EU_48", "instruction": "i want to find a gold floor lamp with a glass shade and a nickel finish that i can use for my living room.", "target_attributes": { "attributes": [ "nickel finish", "glass shade", "living room" ], "options": [ "gold" ] }, "asin": "B00O3202EU" }, { "task_id": "ws_B01MRH3SO3_49", "instruction": "i need a solid wood platform bed with wooden frame. pick something that is natural in color.", "target_attributes": { "attributes": [ "solid wood", "wood frame" ], "options": [ "natural" ] }, "asin": "B01MRH3SO3" }, { "task_id": "ws_B09Q33GJ91_50", "instruction": "i'd like to find a large purple maxi dress made of soft material.", "target_attributes": { "attributes": [ "soft material" ], "options": [ "e-purple", "large" ] }, "asin": "B09Q33GJ91" }, { "task_id": "ws_B091C8PXGR_51", "instruction": "i want an easy to use keyboard with number pad and usb port. i want it to be mint green in color.", "target_attributes": { "attributes": [ "easy use", "usb port" ], "options": [ "mint green" ] }, "asin": "B091C8PXGR" }, { "task_id": "ws_B07MZ2CLJY_52", "instruction": "i'm looking for underwater world backdrop with high resolution digital photography and light weight. also, choose 5*3ft one", "target_attributes": { "attributes": [ "light weight", "high resolution", "digital photography" ], "options": [ "5x3ft" ] }, "asin": "B07MZ2CLJY" }, { "task_id": "ws_B005HV4ETK_53", "instruction": "i am looking for x-large extra long t-shirts with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large extra long" ] }, "asin": "B005HV4ETK" }, { "task_id": "ws_B093K8W6MN_54", "instruction": "i am looking for a mesh laundry bag with a funny cartoon skull theme and is medium in size.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093K8W6MN" }, { "task_id": "ws_B0885RVZFB_55", "instruction": "i am looking for natural hair extensions. also, pick something in dark brown.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "2 clips-#613 bleach blonde" ] }, "asin": "B0885RVZFB" }, { "task_id": "ws_B09HNMR1FY_56", "instruction": "i want buy a easy use hair dye hair colouring spray colour should be purple", "target_attributes": { "attributes": [ "easy use", "hair dye" ], "options": [ "purple" ] }, "asin": "B09HNMR1FY" }, { "task_id": "ws_B077JGYFKM_57", "instruction": "i'm looking for 1 resealed bag of puffed snacks", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "1" ] }, "asin": "B077JGYFKM" }, { "task_id": "ws_B01N435KPR_58", "instruction": "i am looking for 30\"x16\"x1.5\", 3pcs wood frame posters & prints.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "30\"x16\"x1.5\", 3pcs" ] }, "asin": "B01N435KPR" }, { "task_id": "ws_B00CHTXLD0_59", "instruction": "i am looking for a dove anti persipirant deodorant for sensitive skin .choose 2.6 ounce (pack of 3).", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [ "2.6 ounce (pack of 3)" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_60", "instruction": "i am looking for some deodorant for sensitive skin that has a herbal scent and comes in a 12 pack.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "herbal", "2.6 ounce (pack of 12)" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_61", "instruction": "i am looking for sensitive skin powder", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "powder" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_62", "instruction": "i need a 2.6 ounce(pack of 4) anti-perspirant deodorant that is best for sensitive skin and comes with herbal scent.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [ "herbal", "2.6 ounce (pack of 4)" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_63", "instruction": "i am looking for original clean scent deodorant that is anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "original clean" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_64", "instruction": "i will like to have the dove anti-perspirant deodorant, sensitive skin 2.60 oz (pack of 12) with the herbal scent.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [ "herbal" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B00CHTXLD0_65", "instruction": "i need an anti perspirant unscented deodorant - 1.6 ounce (pack of 2)", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "unscented" ] }, "asin": "B00CHTXLD0" }, { "task_id": "ws_B091NDZ2JX_66", "instruction": "i'm looking for 2 dozen individually wrapped dessert gifts.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "2 dozen" ] }, "asin": "B091NDZ2JX" }, { "task_id": "ws_B091NDZ2JX_67", "instruction": "i am looking for 4 dozen individually wrapped gourmet cookies.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "4 dozen" ] }, "asin": "B091NDZ2JX" }, { "task_id": "ws_B01HPJOW3E_68", "instruction": "i am looking for easy to prepare and ready to eat quaker instant oatmeal breakfast cereal in coconut & caramel flavor.", "target_attributes": { "attributes": [ "easy prepare", "ready eat" ], "options": [ "coconut & caramel" ] }, "asin": "B01HPJOW3E" }, { "task_id": "ws_B00GJFRQMK_69", "instruction": "i need all natural ingredients gluten gree and vegan red hot sauce 12.5 ounce (pack of 3)", "target_attributes": { "attributes": [ "gluten free", "natural ingredients" ], "options": [ "hot" ] }, "asin": "B00GJFRQMK" }, { "task_id": "ws_B095JTF5DF_70", "instruction": "i'm looking for a night table with steel frame for living room. also, choose black colored one.", "target_attributes": { "attributes": [ "steel frame", "living room" ], "options": [ "black" ] }, "asin": "B095JTF5DF" }, { "task_id": "ws_B0037507EE_71", "instruction": "i am looking for wild caught tuna that is ranch flavored and comes in a pack of ten.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "ranch", "2.6 ounce (pack of 10)" ] }, "asin": "B0037507EE" }, { "task_id": "ws_B0037507EE_72", "instruction": "i'd like to find a 3-ounce package of ready-to-eat wild-caught tuna salad. the flavor needs to be herb and garlic.", "target_attributes": { "attributes": [ "ready eat", "wild caught" ], "options": [ "herb & garlic", "3 ounce (pack of 1)" ] }, "asin": "B0037507EE" }, { "task_id": "ws_B0037507EE_73", "instruction": "i want some ranch flavored tuna salad.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "ranch" ] }, "asin": "B0037507EE" }, { "task_id": "ws_B0037507EE_74", "instruction": "i am looking for starkist gluten free sweet & spicy tuna salad, 2.6 ounce (pack of 12)", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sweet & spicy", "2.6 ounce (pack of 12)" ] }, "asin": "B0037507EE" }, { "task_id": "ws_B0037507EE_75", "instruction": "i'm looking for a honey bbq tuna ready to eat 2.6 ounce", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "honey bbq", "2.6 ounce (pack of 24)" ] }, "asin": "B0037507EE" }, { "task_id": "ws_B08GK5LX3Q_76", "instruction": "i want to find a 100-foot long high-speed ethernet cable in an off-white color.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "morandi off-white", "100ft" ] }, "asin": "B08GK5LX3Q" }, { "task_id": "ws_B01LWKKHU4_77", "instruction": "i'm looking for master cables gold-plated", "target_attributes": { "attributes": [ "gold plated" ], "options": [] }, "asin": "B01LWKKHU4" }, { "task_id": "ws_B092V7C59N_78", "instruction": "i need a long lasting and high quality nail art kit. it should have all the basic colors.", "target_attributes": { "attributes": [ "long lasting", "high quality", "nail art" ], "options": [ "basic colors" ] }, "asin": "B092V7C59N" }, { "task_id": "ws_B07CBKK4CH_79", "instruction": "i am looking for a six pack of wasabi snack mix of mixed nuts.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "wasabi spicy snack mix", "6 ounce (6 pack)" ] }, "asin": "B07CBKK4CH" }, { "task_id": "ws_B07CBKK4CH_80", "instruction": "i am looking for a six pack of low sodium wasabi nuts.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "wasabi spicy snack mix", "7 ounce (6 pack)" ] }, "asin": "B07CBKK4CH" }, { "task_id": "ws_B09BLV58LQ_81", "instruction": "i'm looking for a over ear bluetooth headphones with stereo sound effect and long lasting battery.", "target_attributes": { "attributes": [ "long lasting", "stereo sound" ], "options": [] }, "asin": "B09BLV58LQ" }, { "task_id": "ws_B077J12XTH_82", "instruction": "i need an accent pillow that i can machine wash. get on that is coral blue and is 36\u201d x 36\u201d.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "coral blue", "36\" x 36\"" ] }, "asin": "B077J12XTH" }, { "task_id": "ws_B09J2G7DD1_83", "instruction": "i need some walking shoes that are non slip and come in a size 7.5.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "7.5" ] }, "asin": "B09J2G7DD1" }, { "task_id": "ws_B09H2V142R_84", "instruction": "i want a comfortable fit men's boxers. i am an x-large size.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "x-large" ] }, "asin": "B09H2V142R" }, { "task_id": "ws_B07DFTG99B_85", "instruction": "i am looking for a high performance quad core tower computer pc which is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "quad core" ], "options": [] }, "asin": "B07DFTG99B" }, { "task_id": "ws_B08DLL59WC_86", "instruction": "i want to find a height-adjustable desk chair in the color petal green.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "petal green" ] }, "asin": "B08DLL59WC" }, { "task_id": "ws_B08P1V6Z83_87", "instruction": "i am looking for a heavy duty and tempered glass screen case cover. choose a red one.", "target_attributes": { "attributes": [ "heavy duty", "tempered glass", "case cover", "glass screen" ], "options": [ "red" ] }, "asin": "B08P1V6Z83" }, { "task_id": "ws_B091JDTFHS_88", "instruction": "i need a hand painted vanity light. make sure it is 8.25x33x7 in dimensions.", "target_attributes": { "attributes": [ "hand painted", "vanity light" ], "options": [ "8.25x33.00x7.00" ] }, "asin": "B091JDTFHS" }, { "task_id": "ws_B0758BNGM8_89", "instruction": "i want an xx-small sized slim fit button down shirt with long sleeves. pick something in white.", "target_attributes": { "attributes": [ "slim fit", "long sleeve" ], "options": [ "7#white", "xx-small" ] }, "asin": "B0758BNGM8" }, { "task_id": "ws_B08PHWFM49_90", "instruction": "i am looking for a deep conditioner for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [] }, "asin": "B08PHWFM49" }, { "task_id": "ws_B08BCSFJNN_91", "instruction": "i need a carrying case which is light weight with a mesh pocket. pick a black one.", "target_attributes": { "attributes": [ "light weight", "carrying case" ], "options": [ "black" ] }, "asin": "B08BCSFJNN" }, { "task_id": "ws_B08S6LRJGQ_92", "instruction": "i'm looking for a wall art for living room with ready to hang wood frame which is easy to clean. also, choose art-003m one", "target_attributes": { "attributes": [ "ready hang", "easy clean", "wood frame", "living room" ], "options": [ "art-003m" ] }, "asin": "B08S6LRJGQ" }, { "task_id": "ws_B07MLHJ6SQ_93", "instruction": "i would like some medium brown hair extensions that are 22 inches.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown", "22 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_94", "instruction": "i am looking for a 16 inch hair extensions storage case.", "target_attributes": { "attributes": [ "storage case", "hair extensions" ], "options": [ "16 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_95", "instruction": "order me some twelve inch pink hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "pink", "12 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_96", "instruction": "i would like to buy some 24 inch grey hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "grey", "24 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_97", "instruction": "i want to find some portable 18-inch long hair extensions in the light brown color.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "light brown", "18 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_98", "instruction": "i am looking to buy grey-body wave, 18 inch hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "grey-body wave", "18 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_99", "instruction": "i am looking for a 16 inch hair extensions storage case.", "target_attributes": { "attributes": [ "storage case", "hair extensions" ], "options": [ "16 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_100", "instruction": "order me some twelve inch pink hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "pink", "12 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_101", "instruction": "i am looking for this product dustproof non woven portable storage case with wooden hanger for human hair extensions (pink) for dry hair .", "target_attributes": { "attributes": [ "storage case", "dry hair" ], "options": [ "purple" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B07MLHJ6SQ_102", "instruction": "i need to find a dust-proof storage case for my hair extensions that's at least 20 inches long.", "target_attributes": { "attributes": [ "storage case", "hair extensions" ], "options": [ "20 inch" ] }, "asin": "B07MLHJ6SQ" }, { "task_id": "ws_B0018P0330_103", "instruction": "i am looking for a denim man short regular fit machine wash size 34 regular colour steel black", "target_attributes": { "attributes": [ "machine wash", "regular fit" ], "options": [ "steel black", "34 regular" ] }, "asin": "B0018P0330" }, { "task_id": "ws_B097WYZMV6_104", "instruction": "i am looking for a high quality, travel size eau de parfum for women.", "target_attributes": { "attributes": [ "travel size", "high quality" ], "options": [] }, "asin": "B097WYZMV6" }, { "task_id": "ws_B097WYZMV6_105", "instruction": "i looking women's parfume travel size high quality long lasting scent: clinique happy heart impression", "target_attributes": { "attributes": [ "travel size", "high quality", "long lasting" ], "options": [ "clinique happy heart impression" ] }, "asin": "B097WYZMV6" }, { "task_id": "ws_B097WYZMV6_106", "instruction": "i'm looking for the marc jacobs daisy eau so fresh impression perfume in a travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "marc jacobs daisy eau so fresh impressio..." ] }, "asin": "B097WYZMV6" }, { "task_id": "ws_B097WYZMV6_107", "instruction": "i'm looking for alcohol free high quality scent. its contain travel sized.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "high quality" ], "options": [ "escada especially impression" ] }, "asin": "B097WYZMV6" }, { "task_id": "ws_B097WYZMV6_108", "instruction": "the flowers are chosen for their delicate fragrance hight quality and scent is amber romance perfume", "target_attributes": { "attributes": [ "high quality" ], "options": [ "amber romance perfume" ] }, "asin": "B097WYZMV6" }, { "task_id": "ws_B005KP473Q_109", "instruction": "i want a quick release tripod with bag. pick the 2 pack option.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "2-pack" ] }, "asin": "B005KP473Q" }, { "task_id": "ws_B097KHTHNR_110", "instruction": "i need an easy to clean exfoliating back scrubber. pick a pink one.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "pink", "exfoliating back scrubber" ] }, "asin": "B097KHTHNR" }, { "task_id": "ws_B09NKS7WX3_111", "instruction": "i need an easy carry hair ball trimmer for clothes. it should be green in color.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "green" ] }, "asin": "B09NKS7WX3" }, { "task_id": "ws_B07SHWM3BX_112", "instruction": "i am looking for a grey color day comfort golf shoes for men.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "grey" ] }, "asin": "B07SHWM3BX" }, { "task_id": "ws_B07SHWM3BX_113", "instruction": "i'm looking for tech response shoes by adidas in black size 11 for day comfort", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "black", "11", "tech response golf shoes" ] }, "asin": "B07SHWM3BX" }, { "task_id": "ws_B01LY8EQIP_114", "instruction": "i want a non diary snack with caramelized nuts. pick the 2 pound pack.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B01LY8EQIP" }, { "task_id": "ws_B0764GPB51_115", "instruction": "i need a plant based, soy free protein shake. pick the smooth vanilla flavor.", "target_attributes": { "attributes": [ "soy free", "plant based" ], "options": [ "smooth vanilla" ] }, "asin": "B0764GPB51" }, { "task_id": "ws_B092JJ1S24_116", "instruction": "i would like a desktop tower that has a core i5 processor with 16 gb ddr4 ram, and has 256gb of storage.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "16gb ddr4 ram, 256gb pcie ssd + 1tb hdd" ] }, "asin": "B092JJ1S24" }, { "task_id": "ws_B092JJ1S24_117", "instruction": "i would like a core i5 tower that has 64 gb of ram, and 3tb of storage.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "64gb ddr4 ram, 2tb pcie ssd + 1tb hdd" ] }, "asin": "B092JJ1S24" }, { "task_id": "ws_B09NM27BY6_118", "instruction": "i need a ready to hang portrait art of a dancing lady for the wall. pick one that is 20x20 inch.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "dancing lady", "20x20 inch" ] }, "asin": "B09NM27BY6" }, { "task_id": "ws_B07BCQ6ZCD_119", "instruction": "i'm looking for xx-large machine wash sleep & lounge sets.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "xx-large" ] }, "asin": "B07BCQ6ZCD" }, { "task_id": "ws_B07RWT729V_120", "instruction": "i want a water resistant carrying case for my hard drive. pick something in teal.", "target_attributes": { "attributes": [ "water resistant", "carrying case" ], "options": [ "teal" ] }, "asin": "B07RWT729V" }, { "task_id": "ws_B08NLC4MKF_121", "instruction": "i am looking for frozen meals that is grass fed and gluten free. i want it in beef variety pack flavor.", "target_attributes": { "attributes": [ "grass fed", "gluten free" ], "options": [ "beef variety pack" ] }, "asin": "B08NLC4MKF" }, { "task_id": "ws_B09NYH4HJY_122", "instruction": "i am looking for a blue high waist legging for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [] }, "asin": "B09NYH4HJY" }, { "task_id": "ws_B08F1V4JTR_123", "instruction": "i need high quality hair extensions that is 18 inches in length.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "18 inch" ] }, "asin": "B08F1V4JTR" }, { "task_id": "ws_B0843R2PHK_124", "instruction": "i'm looking for a 128 ounce (pack of 1) of shelf-stable, keto-friendly, and gluten-free almond milk.", "target_attributes": { "attributes": [ "keto friendly", "gluten free", "shelf stable" ], "options": [ "128 ounce (pack of 1)" ] }, "asin": "B0843R2PHK" }, { "task_id": "ws_B086FXMWDM_125", "instruction": "look for a caffeine and gluten free herbal drink. i like mixed berry flavor.", "target_attributes": { "attributes": [ "caffeine free", "gluten free" ], "options": [ "mixed berry" ] }, "asin": "B086FXMWDM" }, { "task_id": "ws_B088WG813M_126", "instruction": "i want a socialite scented floral fragrance that comes in travel size. make sure it is a cruelty free product.", "target_attributes": { "attributes": [ "cruelty free", "travel size" ], "options": [ "socialite" ] }, "asin": "B088WG813M" }, { "task_id": "ws_B005OPP2AY_127", "instruction": "i need a long lasting fragrance gift set for women.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B005OPP2AY" }, { "task_id": "ws_B005OPP2AY_128", "instruction": "i am interested in a long lasting perfume set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B005OPP2AY" }, { "task_id": "ws_B00JJYHPCY_129", "instruction": "get me some low carb sun dried tomatoes. it should have the flavor of plantain chips.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "plantain chips" ] }, "asin": "B00JJYHPCY" }, { "task_id": "ws_B00JJYHPCY_130", "instruction": "i need non gmo sundried tomatoes in a 32 oz container", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "32 ounce" ] }, "asin": "B00JJYHPCY" }, { "task_id": "ws_B091TKY6K7_131", "instruction": "find me a t shirt dress with ruffle sleeves and elastic closure. pick a green dress.", "target_attributes": { "attributes": [ "elastic closure" ], "options": [ "green" ] }, "asin": "B091TKY6K7" }, { "task_id": "ws_B09KM5FFBG_132", "instruction": "a double sided soft fleence cozy warm light weighted throw blanket also colour is yellow", "target_attributes": { "attributes": [ "double sided" ], "options": [ "k" ] }, "asin": "B09KM5FFBG" }, { "task_id": "ws_B097F83XBH_133", "instruction": "i need a golden color cupcake toppers for my wife's birth day party", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold" ] }, "asin": "B097F83XBH" }, { "task_id": "ws_B09HC7FPDC_134", "instruction": "i am looking for winter warm ankle boots for women. my size is 7.5.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "7.5" ] }, "asin": "B09HC7FPDC" }, { "task_id": "ws_B007JAY028_135", "instruction": "i would like a low sodium and sugar free grape drink in 10 pack boxes.", "target_attributes": { "attributes": [ "low sodium", "sugar free" ], "options": [] }, "asin": "B007JAY028" }, { "task_id": "ws_B099MXGC6W_136", "instruction": "i am looking for an iphone case that is wireless charging compatible and is rainbow colored.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "rainbow" ] }, "asin": "B099MXGC6W" }, { "task_id": "ws_B09QPP8J2M_137", "instruction": "i am looking for 6 pack of gluten free and low calorie green tea kelp noodles.", "target_attributes": { "attributes": [ "gluten free", "low calorie" ], "options": [ "green tea kelp noodles", "6 pack" ] }, "asin": "B09QPP8J2M" }, { "task_id": "ws_B08XVW565D_138", "instruction": "i am looking for a red-2pcs manual toothbrushes with oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "red-2pcs" ] }, "asin": "B08XVW565D" }, { "task_id": "ws_B078N8NCB9_139", "instruction": "i'm looking for a king-sized 8-inch mattress foundation with box springs.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "king", "8\" foundation" ] }, "asin": "B078N8NCB9" }, { "task_id": "ws_B01LPCLEWY_140", "instruction": "i am looking for a low carbohydrates protein bar with package of 12 counts.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "12 count" ] }, "asin": "B01LPCLEWY" }, { "task_id": "ws_B09K7FFJGJ_141", "instruction": "i need a screen protector that is easy to install and is 41mm in size.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "41 mm" ] }, "asin": "B09K7FFJGJ" }, { "task_id": "ws_B09HH5311B_142", "instruction": "i am looking for a size 9.5 casual walking shoes for men, which should have a unique design and should fit comfortably. i will prefer this to have a rubber sole which should be non slippery.", "target_attributes": { "attributes": [ "non slip", "rubber sole", "comfortable fit", "unique design" ], "options": [ "9.5" ] }, "asin": "B09HH5311B" }, { "task_id": "ws_B01N4QXNL5_143", "instruction": "i want to find a dining room wood counter height stool. also, choose the light cherry one.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "light cherry" ] }, "asin": "B01N4QXNL5" }, { "task_id": "ws_B09MV6XLSL_144", "instruction": "i'm looking for a 1 dozen nut free dessert gifts.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "1 dozen" ] }, "asin": "B09MV6XLSL" }, { "task_id": "ws_B000VYP4EW_145", "instruction": "i need a rich creamy chai tea that is spicy and gluten free. pick the tortoise green tea flavor.", "target_attributes": { "attributes": [ "rich creamy", "gluten free" ], "options": [ "tortoise green tea" ] }, "asin": "B000VYP4EW" }, { "task_id": "ws_B000VYP4EW_146", "instruction": "i am looking for gluten free chai, please choose orca spice flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "orca spice" ] }, "asin": "B000VYP4EW" }, { "task_id": "ws_B000VYP4EW_147", "instruction": "i would like a 11.9 ounce maple moose rich and creamy chai tea.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "maple moose", "11.9 ounce (pack of 1)" ] }, "asin": "B000VYP4EW" }, { "task_id": "ws_B089Z47324_148", "instruction": "i want a sugar free paddy syrup that is keto friendly. i like the macadamia nut flavor.", "target_attributes": { "attributes": [ "sugar free", "keto friendly" ], "options": [ "macadamia nut" ] }, "asin": "B089Z47324" }, { "task_id": "ws_B089Z47324_149", "instruction": "i am looking for sugar free madagascar vanilla flavored peppermint paddy syrup, 64 ounce (pack of 6)", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "madagascar vanilla", "64 ounce (pack of 6)" ] }, "asin": "B089Z47324" }, { "task_id": "ws_B089Z47324_150", "instruction": "i need davinci gourmet sugar-free cherry syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "cherry" ] }, "asin": "B089Z47324" }, { "task_id": "ws_B09HDTL3X9_151", "instruction": "i need an iphone case that is easy to install and use. i am looking for something in green marble gold.", "target_attributes": { "attributes": [ "easy install", "easy use" ], "options": [ "green marble gold" ] }, "asin": "B09HDTL3X9" }, { "task_id": "ws_B07MV93XNN_152", "instruction": "i am looking for a mid century wood end table lamb with usb charging port .", "target_attributes": { "attributes": [ "mid century" ], "options": [ "wood" ] }, "asin": "B07MV93XNN" }, { "task_id": "ws_B08Q7W5HZ9_153", "instruction": "i want to find a two-pack of white coaxial cables that are plated with gold.", "target_attributes": { "attributes": [ "gold plated", "coaxial cable" ], "options": [ "white", "2" ] }, "asin": "B08Q7W5HZ9" }, { "task_id": "ws_B09LCDCFNN_154", "instruction": "i need an easy to use breath freshener spray to eliminate bad breath. pick a white one.", "target_attributes": { "attributes": [ "easy use", "bad breath" ], "options": [ "white" ] }, "asin": "B09LCDCFNN" }, { "task_id": "ws_B000ILMQL2_155", "instruction": "i need a kosher certified popcorn seasoning that has kettle corn flavor. get the pack of 6 of 2.8 ounce each", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "kettle corn", "2.8 ounce (pack of 6)" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_156", "instruction": "i'm looking for gluten free it has high protein and it has health and it is easy to use.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cheesy jalapeno" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_157", "instruction": "i am looking for popcorn seasoning of popcorn salt flavor that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "popcorn salt" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_158", "instruction": "i want a gluten free popcorn seasoning that has a flavor of sour cream and onion.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sour cream & onion" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_159", "instruction": "i want gluten free kernel season's kettle corn popcorn seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "kettle-corn" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_160", "instruction": "looking for kosher certified butter popcorn salt also choose color butter", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "butter" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_161", "instruction": "i want gluten free kernel season's cheesy caramel corn seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cheesy caramel corn" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_162", "instruction": "i would like some butter flavored popcorn salt that comes in a four pack.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "butter", "3.75 ounce (pack of 6)" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_163", "instruction": "i want gluten free kernel season's chili lime popcorn seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chili lime" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_164", "instruction": "i need gluten free popcorn seasoning. make it the ranch flavored.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "ranch" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_165", "instruction": "i am looking kosher certified gluten free sour cream & onion flavor popcorn seasoning", "target_attributes": { "attributes": [ "kosher certified", "gluten free" ], "options": [ "sour cream & onion" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B000ILMQL2_166", "instruction": "i need gluten free kernel season's popcorn seasoning, sour cream & onion, 2.7 ounce (pack of 6).", "target_attributes": { "attributes": [ "gluten free", "0g trans" ], "options": [ "sour cream & onion", "2.7 ounce (pack of 6)" ] }, "asin": "B000ILMQL2" }, { "task_id": "ws_B09PHJHJXR_167", "instruction": "i want a red colour loose fit tee top blouse having long sleeve xx -large", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "red", "xx-large" ] }, "asin": "B09PHJHJXR" }, { "task_id": "ws_B09G78QM39_168", "instruction": "i am looking for chair provides optimal support throughout your workday with height adjustable and lumbar support of vari essential task chair in grey color.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "grey", "essential task chair" ] }, "asin": "B09G78QM39" }, { "task_id": "ws_B09G78QM39_169", "instruction": "i am looking for a black task chair which is height adjustable and has a good lumbar support.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "black", "task chair" ] }, "asin": "B09G78QM39" }, { "task_id": "ws_B08VFHCPBR_170", "instruction": "i want a twin size comforter for boys with a video game theme. pick a full size one.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "full" ] }, "asin": "B08VFHCPBR" }, { "task_id": "ws_B09CTBHCTM_171", "instruction": "i'm looking for an office file cabinet that's easy to assemble and has a lot of shelves for storage space.", "target_attributes": { "attributes": [ "easy assemble", "storage space" ], "options": [] }, "asin": "B09CTBHCTM" }, { "task_id": "ws_B09NKQYKV2_172", "instruction": "i'd like to buy a 7-inch 1024600 red tablet with a long lasting quad core processor.", "target_attributes": { "attributes": [ "long lasting", "quad core" ], "options": [ "red" ] }, "asin": "B09NKQYKV2" }, { "task_id": "ws_B09965PF36_173", "instruction": "i'm looking for women's open toe, slim fit high heels sandals with leather sole. also, choose size 8 with white colored one.", "target_attributes": { "attributes": [ "open toe", "slim fit", "leather sole" ], "options": [ "white", "8" ] }, "asin": "B09965PF36" }, { "task_id": "ws_B09MRFPDB3_174", "instruction": "i need new clear 1.5mm table pads that are easy to clean and are 20 by 72 inches.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "new clear 1.5mm", "20 x 72 inch" ] }, "asin": "B09MRFPDB3" }, { "task_id": "ws_B09MRFPDB3_175", "instruction": "i am looking for 42x60 inch plastic table cover for dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "42 x 60 inch" ] }, "asin": "B09MRFPDB3" }, { "task_id": "ws_B07CZ5QDDL_176", "instruction": "i need organic bay leaf that is 4 oz.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B07CZ5QDDL" }, { "task_id": "ws_B07CZ5QDDL_177", "instruction": "i would like a 12 ounce pack of whole fennel seeds that are certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "fennel seed whole", "12 ounce (pack of 1)" ] }, "asin": "B07CZ5QDDL" }, { "task_id": "ws_B083QDVTFW_178", "instruction": "i need a wall mounted table that can be folded. also, the dimensions should be 70x50x30 cm.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "70\u00d750\u00d730cm" ] }, "asin": "B083QDVTFW" }, { "task_id": "ws_B09L8H3BZL_179", "instruction": "i need a nail art pen which is easy to carry and comes in 12 colors. make sure it has gold and silver color too.", "target_attributes": { "attributes": [ "easy carry", "nail art" ], "options": [] }, "asin": "B09L8H3BZL" }, { "task_id": "ws_B089CP2VD9_180", "instruction": "i am looking for heavy duty coaxial cables that are 35 feet long.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "35ft" ] }, "asin": "B089CP2VD9" }, { "task_id": "ws_B074W2L1YN_181", "instruction": "i am looking fluoride free plant based natural ingredient coconut mint toothpaste size 5 oz", "target_attributes": { "attributes": [ "fluoride free", "plant based", "natural ingredients", "bad breath" ], "options": [ "coconut mint 5oz (3-pack)" ] }, "asin": "B074W2L1YN" }, { "task_id": "ws_B07HFLFLWS_182", "instruction": "i am looking for a king size headboards & footboards.", "target_attributes": { "attributes": [ "king size" ], "options": [ "king" ] }, "asin": "B07HFLFLWS" }, { "task_id": "ws_B07HFLFLWS_183", "instruction": "i want to find king size headboard, hanger style, in summer mix color for a double bedroom.", "target_attributes": { "attributes": [ "king size" ], "options": [ "summer mix" ] }, "asin": "B07HFLFLWS" }, { "task_id": "ws_B09QPN339F_184", "instruction": "i am looking for open toe sandals with an ankle strap. i want it in size 10.", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "10" ] }, "asin": "B09QPN339F" }, { "task_id": "ws_B08R5R1239_185", "instruction": "i'd like to find 22-inch long wavy hair extensions. the color needs to be ash blonde mixed with beach blonde.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "wavy ash blonde mixed bleach blonde #18&613", "22 inch (30 gram)" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_186", "instruction": "i'm looking for black hair double sided hair extensions need to buy.", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "wavy off black #1b" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_187", "instruction": "i am looking for a tape in hair extension human hair 16\u201d and it should be ash blonde -mixed bleach blonde.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "ash blonde mixed bleach blonde #18&613", "16 inch(100 gram)" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_188", "instruction": "i am looking for 12 inch double sided hair extensions. also pick a dark brown color.", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "dark brown #2", "12 inch(40 gram)" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_189", "instruction": "i am looking for dark brown human hair extensions with double sided tap.", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "wavy dark brown #2" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_190", "instruction": "i am looking for 22 inch seamless hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "22 inch(50 gram)" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B08R5R1239_191", "instruction": "i want to find hair extensions that are 12 inches long in a medium brown color.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown #4", "12 inch(80 gram)" ] }, "asin": "B08R5R1239" }, { "task_id": "ws_B005IYRY16_192", "instruction": "i would like some straight leg jeans that are ric and are in the size 46w by 29l.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "ric", "46w x 29l" ] }, "asin": "B005IYRY16" }, { "task_id": "ws_B09PNGYWZ4_193", "instruction": "i am looking for a 4x-large regular fit henley shirts for men.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "4x-large" ] }, "asin": "B09PNGYWZ4" }, { "task_id": "ws_B097WQNRSP_194", "instruction": "i am looking for long lasting , high quality spray of ca perfume impression which is alcohol free and easy to carry in purse or travel bag in handy all day long. jo malone velvet rose & oud impression preferable.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "high quality", "long lasting" ], "options": [ "jo malone velvet rose & oud impression" ] }, "asin": "B097WQNRSP" }, { "task_id": "ws_B097WQNRSP_195", "instruction": "i would like to buy a travel size bottle of gucci bamboo impression perfume.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "gucci bamboo impression" ] }, "asin": "B097WQNRSP" }, { "task_id": "ws_B097WQNRSP_196", "instruction": "i want to buy a christian dior eau sauvage perfume from 2017 that's alcohol-free and travel size.", "target_attributes": { "attributes": [ "travel size", "alcohol free" ], "options": [ "christian dior eau sauvage parfum 2017 i..." ] }, "asin": "B097WQNRSP" }, { "task_id": "ws_B098Q9HTDW_197", "instruction": "i want to find a 16.53 inch wall lamp featuring a brushed nickel finish.", "target_attributes": { "attributes": [ "wall mounted", "brushed nickel", "nickel finish" ], "options": [ "14w 3000k-nickel-d", "16.53 inches" ] }, "asin": "B098Q9HTDW" }, { "task_id": "ws_B00BM1WO7I_198", "instruction": "i'm looking for a alcohol free concealers & neutralizers of cacao color.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "cacao" ] }, "asin": "B00BM1WO7I" }, { "task_id": "ws_B00BM1WO7I_199", "instruction": "i am looking for honey color alcohol free creamy concealer", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "honey" ] }, "asin": "B00BM1WO7I" }, { "task_id": "ws_B08P65RN3T_200", "instruction": "i need loafers that are a size 12 and have a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "12" ] }, "asin": "B08P65RN3T" }, { "task_id": "ws_B08BMP61RP_201", "instruction": "find me a caffeine free and sugar free herbal tea bags 5 nos for good health", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B08BMP61RP" }, { "task_id": "ws_B0038U0XRE_202", "instruction": "find me a sulfate free shampoo for repairing my damaged hair.", "target_attributes": { "attributes": [ "sulfate free", "damaged hair" ], "options": [] }, "asin": "B0038U0XRE" }, { "task_id": "ws_B001NL3RVO_203", "instruction": "looking for a short shleev shirt sunsit colour button closure also size 2x", "target_attributes": { "attributes": [ "short sleeve", "button closure" ], "options": [ "sunlit", "2x" ] }, "asin": "B001NL3RVO" }, { "task_id": "ws_B095SZDXK8_204", "instruction": "i want an easy to use pillow speaker for my mp3 phone. it should be 3.5mm in size", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B095SZDXK8" }, { "task_id": "ws_B09PZ6TPFL_205", "instruction": "i am looking for a long lasting highlighters & luminizers. also choose the pattern 03#", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B09PZ6TPFL" }, { "task_id": "ws_B097M755ZT_206", "instruction": "help me buy an easy to use eyes mask that helps to reduce puffy dark circles. please select the red one.", "target_attributes": { "attributes": [ "easy use", "dark circles" ], "options": [ "red" ] }, "asin": "B097M755ZT" }, { "task_id": "ws_B09SG1DRMT_207", "instruction": "i'd like to find a toothpaste dispenser that is not only non-toxic, but also high quality.", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [ "a" ] }, "asin": "B09SG1DRMT" }, { "task_id": "ws_B0892JBZM9_208", "instruction": "i am looking for attractive ottoman is particularly strong and durable,breathable,odourless,acid-free,corrosion-resistant and long-lasting, easy to clean,and can be used in office entrances,living rooms,basements,bedrooms,offices,university dormitories,cafes,bars,hotels and other places xmzddz faux leather storage bench.comfortable seat size 80*45*40cm.", "target_attributes": { "attributes": [ "faux leather", "storage space" ], "options": [ "a", "80*45*40cm" ] }, "asin": "B0892JBZM9" }, { "task_id": "ws_B07SM7VKQJ_209", "instruction": "i need an easy to use pen drive with usb port. pick one that is 16 gb in capacity", "target_attributes": { "attributes": [ "easy use", "usb port" ], "options": [ "16gb" ] }, "asin": "B07SM7VKQJ" }, { "task_id": "ws_B0875WDVYH_210", "instruction": "can i get a super soft burgundy fleece cosy throw for a couch which is 50\u201dx60\u201d in size?", "target_attributes": { "attributes": [ "super soft" ], "options": [ "burgundy", "throw(50\"x60\")" ] }, "asin": "B0875WDVYH" }, { "task_id": "ws_B09K7YPLZD_211", "instruction": "i'm looking for a iphone 13 skateboard wood case with glass screen. also choose real walnut wood-13 pro for iphone 13 mini.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "real walnut wood - 13 pro", "iphone 13 mini" ] }, "asin": "B09K7YPLZD" }, { "task_id": "ws_B09K7YPLZD_212", "instruction": "i'm looking for colorful striped patterned protective cover for iphone 13.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "real skateboard wood - 13 mini" ] }, "asin": "B09K7YPLZD" }, { "task_id": "ws_B09CRBLP56_213", "instruction": "i am looking for a i7-7700 3.60ghz size of intel core i5 desktops.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "i7-7700 3.60ghz" ] }, "asin": "B09CRBLP56" }, { "task_id": "ws_B092VL4RC6_214", "instruction": "i need comfy casual loose elastic waist 2#multicolor pocketed shorts. its size should be 3x-large.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [] }, "asin": "B092VL4RC6" }, { "task_id": "ws_B09BPYBD11_215", "instruction": "i am looking for a professional white color hair salon rolling swivel chair", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "white" ] }, "asin": "B09BPYBD11" }, { "task_id": "ws_B01MRBAPTR_216", "instruction": "i'm looking for a hyaluronic acid serum which should be certified organic and cruelty free.", "target_attributes": { "attributes": [ "certified organic", "cruelty free", "hyaluronic acid" ], "options": [] }, "asin": "B01MRBAPTR" }, { "task_id": "ws_B000UGUQLM_217", "instruction": "i am looking for one oil free foundation in the shade n10 milk chocolate.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "n10 milk chocolate", "1 count" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B000UGUQLM_218", "instruction": "i am looking for a 1 fl oz oil free super-blendable liquid foundation.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B000UGUQLM_219", "instruction": "i am looking for a 1 fl oz oil free super-blendable liquid foundation.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B000UGUQLM_220", "instruction": "i'm looking for super-blendable liquid foundation that is oil free and for fine lines. also, it should be 1 fl oz.", "target_attributes": { "attributes": [ "oil free", "fine lines" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B000UGUQLM_221", "instruction": "i want a vanilla and oil free l'oreal paris true match liquid foundation.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "w2.5 vanilla" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B000UGUQLM_222", "instruction": "i would like a single perfect beige foundation that is oil free.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "w5.5 perfect beige", "1 count" ] }, "asin": "B000UGUQLM" }, { "task_id": "ws_B005X7IXTK_223", "instruction": "i need cruelty free deodorant that has a woody scent and is 1.6 oz.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "woody scent", "1.6 ounce (pack of 1)" ] }, "asin": "B005X7IXTK" }, { "task_id": "ws_B099WHJBXD_224", "instruction": "i need a hard drive carrying case bag that is light pink", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "light pink" ] }, "asin": "B099WHJBXD" }, { "task_id": "ws_B07V25G5GJ_225", "instruction": "i'm looking for a 2.82 ounce (pack of 12) non gmo bagel chips.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "2.82 ounce (pack of 12)" ] }, "asin": "B07V25G5GJ" }, { "task_id": "ws_B07V25G5GJ_226", "instruction": "i need some salty, non-gmo bagel crisps.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "salted" ] }, "asin": "B07V25G5GJ" }, { "task_id": "ws_B07WWX2ZWL_227", "instruction": "i would like a ready hang poster that has blue roads.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "blue roads" ] }, "asin": "B07WWX2ZWL" }, { "task_id": "ws_B07DFZ34RM_228", "instruction": "i'm looking for a earbud earphones with srereo sound effect. also choose black colored one.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black" ] }, "asin": "B07DFZ34RM" }, { "task_id": "ws_B092W4L2YB_229", "instruction": "i want a super soft throw blanket. i am looking for strawberry cow color.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "strawberry cow" ] }, "asin": "B092W4L2YB" }, { "task_id": "ws_B097J3P249_230", "instruction": "i need a height adjustable standing desk with steel frame. make it gray in color with an antique oak top.", "target_attributes": { "attributes": [ "height adjustable", "steel frame" ], "options": [ "grey frame | antique oak top" ] }, "asin": "B097J3P249" }, { "task_id": "ws_B089NS8VWF_231", "instruction": "i am looking for the bathroom mirror with lights is with full-sealing box , protects safety use in bathroom long lasting and easy to install sunzoom 24\"x36\" black framed led lighted bathroom mirror.size preferable hilton-2436.", "target_attributes": { "attributes": [ "wall mounted", "long lasting", "easy install" ], "options": [] }, "asin": "B089NS8VWF" }, { "task_id": "ws_B07GGXP2FC_232", "instruction": "i want to find a 34x72 inch round table protector that is 2 millimeters thick. it needs to be made of stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "round new clear 2mm", "34 x 72 inches" ] }, "asin": "B07GGXP2FC" }, { "task_id": "ws_B07GGXP2FC_233", "instruction": "i'm looking for heavy duty table pads made of stainless steel which is easy to clean. also, choose new version clear 1.5 mm pads with size 39.4* 94.5 inches.", "target_attributes": { "attributes": [ "heavy duty", "easy clean", "stainless steel" ], "options": [ "new version clear 1.5mm", "39.4 x 94.5 inches" ] }, "asin": "B07GGXP2FC" }, { "task_id": "ws_B07BC7NQ4R_234", "instruction": "i need dining room table pads that are 22 by 54 inches and are round new frosted.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "round new frosted 1.5mm", "22 x 54 inches" ] }, "asin": "B07BC7NQ4R" }, { "task_id": "ws_B07BC7NQ4R_235", "instruction": "i'm looking for a ostep decor custom table cover.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "round new frosted 2mm", "12 x 36 inches" ] }, "asin": "B07BC7NQ4R" }, { "task_id": "ws_B07BC7NQ4R_236", "instruction": "i would like a 44 by 108 inch round new clear table pad for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "round new clear 1.5mm", "44 x 108 inches" ] }, "asin": "B07BC7NQ4R" }, { "task_id": "ws_B093JXQPCM_237", "instruction": "i am looking for 42 | 44 | 45mm(s | m) smartwatch bands, compatible with apple.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "42 | 44 | 45mm(s | m)" ] }, "asin": "B093JXQPCM" }, { "task_id": "ws_B00T6HMVDW_238", "instruction": "i need a conditioner for dry hair that comes in 1.8 fl oz and will give me ultra volume.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "ultra-volume (papaya + tangerine butter)", "1.8 fl oz (pack of 1)" ] }, "asin": "B00T6HMVDW" }, { "task_id": "ws_B09M7C4726_239", "instruction": "i would like a dental pick that is yellow for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "yellow" ] }, "asin": "B09M7C4726" }, { "task_id": "ws_B08XXG9N1Q_240", "instruction": "i am looking a charging adpter fot fast charging jetpack 4g lte mobile hotspot", "target_attributes": { "attributes": [ "fast charging", "4g lte" ], "options": [] }, "asin": "B08XXG9N1Q" }, { "task_id": "ws_B07X6JL45J_241", "instruction": "i am looking for a power amplifier which is easy to use.", "target_attributes": { "attributes": [ "power amplifier", "easy use" ], "options": [] }, "asin": "B07X6JL45J" }, { "task_id": "ws_B078JKD43Y_242", "instruction": "a dining room table cover table protecter size 42 *90 inches can be clean easily", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "42 x 90 inches" ] }, "asin": "B078JKD43Y" }, { "task_id": "ws_B078JKD43Y_243", "instruction": "i am looking for a crystal clear 2mm table cover protector size 32x48 \u201c and it should easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "crystal clear 2mm", "32 x 48 inches" ] }, "asin": "B078JKD43Y" }, { "task_id": "ws_B078JKD43Y_244", "instruction": "i am looking for 48 x 60 inches size desk cover protector for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "48 x 60 inches" ] }, "asin": "B078JKD43Y" }, { "task_id": "ws_B09J8F5HSS_245", "instruction": "i need coasters that are easy to clean and come in a set of six with cup holders.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "set of 6 with cup holder" ] }, "asin": "B09J8F5HSS" }, { "task_id": "ws_B07D5MV2X3_246", "instruction": "i'm looking for a retractable stereo sound in -ear headphone which is compatible for apple iphone.", "target_attributes": { "attributes": [ "compatible apple", "stereo sound" ], "options": [] }, "asin": "B07D5MV2X3" }, { "task_id": "ws_B09584LKHV_247", "instruction": "get me a keto friendly and sugar free cereal that is also plant-based. i want the cinnamon toast and dark chocolate flavor.", "target_attributes": { "attributes": [ "keto friendly", "sugar free", "plant based" ], "options": [ "cinnamon toast & dark chocolate" ] }, "asin": "B09584LKHV" }, { "task_id": "ws_B09584LKHV_248", "instruction": "i need 9 ounce catalina crunch cinnamon toast & maple waffle cereal that is keto friendly.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "cinnamon toast & maple waffle", "9 ounce (pack of 1)" ] }, "asin": "B09584LKHV" }, { "task_id": "ws_B08KXZSVKS_249", "instruction": "i need soaps for dry skin that are made with argan oil.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "argan oil" ] }, "asin": "B08KXZSVKS" }, { "task_id": "ws_B09N6XZN52_250", "instruction": "i am looking for 1x cotton spandex yoga pants.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [] }, "asin": "B09N6XZN52" }, { "task_id": "ws_B07QMMYQ3N_251", "instruction": "i am looking for a easy install 4g band 5/13 signall booster", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [ "4g lte band 5 | 13" ] }, "asin": "B07QMMYQ3N" }, { "task_id": "ws_B000P22TIY_252", "instruction": "i am looking for a long lasting 3.38 fl oz (pack of 1) eau de toilette for men.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "3.38 fl oz (pack of 1)" ] }, "asin": "B000P22TIY" }, { "task_id": "ws_B000P22TIY_253", "instruction": "i would like a perfume that is long lasting and comes in a pack of two.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "3.4 fl oz (pack of 2)" ] }, "asin": "B000P22TIY" }, { "task_id": "ws_B000P22TIY_254", "instruction": "i want to buy a voyage-style, 3.38 fl oz men's perfume that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "3.38 fl oz (pack of 1)", "voyage" ] }, "asin": "B000P22TIY" }, { "task_id": "ws_B000P22TIY_255", "instruction": "i would like a long lasting 3.38 fluid out voyage perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "3.38 fl oz (pack of 1)", "3.4 fl oz voyage + 3.4 oz classic" ] }, "asin": "B000P22TIY" }, { "task_id": "ws_B000P22TIY_256", "instruction": "i would like a 1.6 fluid ounce bottle of voyage perfume that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "1.6 fl oz (pack of 1)", "voyage" ] }, "asin": "B000P22TIY" }, { "task_id": "ws_B09PVJ7ZZY_257", "instruction": "i am looking for a slim fit men's sweatpants. also, choose the y1-black", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "y1-black" ] }, "asin": "B09PVJ7ZZY" }, { "task_id": "ws_B09NLF9XPN_258", "instruction": "find some kosher certified, gluten free gummy candy. choose the blue raspberry color.", "target_attributes": { "attributes": [ "kosher certified", "gluten free" ], "options": [ "blue raspberry" ] }, "asin": "B09NLF9XPN" }, { "task_id": "ws_B09NLF9XPN_259", "instruction": "i need lemon flavored gummi candies that are gluten free. also, pick a kosher certified one.", "target_attributes": { "attributes": [ "kosher certified", "gluten free" ], "options": [ "lemon" ] }, "asin": "B09NLF9XPN" }, { "task_id": "ws_B094D32937_260", "instruction": "i am looking for pink elephant cupcake picks for birthday cake decorations.", "target_attributes": { "attributes": [ "birthday cake", "cupcake picks" ], "options": [ "pink" ] }, "asin": "B094D32937" }, { "task_id": "ws_B009G74E1O_261", "instruction": "i need 16 ounce gluten free bottle lorann cream cheese bakery emulsion over the butter-vanilla variety.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety", "16 ounce" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_262", "instruction": "i need 1 pound of pumpkin spice cream cheese bakery emulsion that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pumpkin spice", "1 pound (pack of 1)" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_263", "instruction": "i am looking for a gluten free buttery sweet bakery emulsion.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "buttery sweet dough" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_264", "instruction": "i am looking for a 4 fluid ounce cherry cream cheeset emulsion that is shelf stable and in a container that does not contain bpa.", "target_attributes": { "attributes": [ "bpa free", "shelf stable" ], "options": [ "cherry", "4 fl oz.." ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_265", "instruction": "i need 1 pound of pumpkin spice cream cheese bakery emulsion that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pumpkin spice", "1 pound (pack of 1)" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_266", "instruction": "looking for cream cheeset bakery emulsion that is gluten free and also choose size 4 fl oz", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "4 fl oz." ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_267", "instruction": "i am looking for imitation vanilla that is shelf stable and is 4 fl oz", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "4 fl oz\u2026" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_268", "instruction": "i am looking for bpa free, gluten free lorann cream cheeset with size : 1gallon", "target_attributes": { "attributes": [ "bpa free", "gluten free" ], "options": [ "1 gallon" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B009G74E1O_269", "instruction": "i want a bpa free and almond lorann cream cheeset bakery emulsion.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "almond" ] }, "asin": "B009G74E1O" }, { "task_id": "ws_B07K6315FW_270", "instruction": "i want to find 25 grams of iridescent purple edible glitter. it needs to be dairy free.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "purple iridescent", "25g" ] }, "asin": "B07K6315FW" }, { "task_id": "ws_B07K6315FW_271", "instruction": "i'd like to find 25 grams of edible maroon glitter that is kosher and nut-free.", "target_attributes": { "attributes": [ "kosher certified", "nut free" ], "options": [ "maroon red", "25g" ] }, "asin": "B07K6315FW" }, { "task_id": "ws_B07K6315FW_272", "instruction": "i need some bronze colored edible glitter for cocktails. it should be kosher certified and nut free.", "target_attributes": { "attributes": [ "kosher certified", "nut free" ], "options": [ "bronze" ] }, "asin": "B07K6315FW" }, { "task_id": "ws_B07MXZT9NL_273", "instruction": "i am looking for an 8 by 12 background that is for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "8x12ft(250x360cm)" ] }, "asin": "B07MXZT9NL" }, { "task_id": "ws_B09MKJVX9D_274", "instruction": "i want a long sleeved tunic top in small size. pick a hot pink one.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "09-hot pink", "small" ] }, "asin": "B09MKJVX9D" }, { "task_id": "ws_B09B6LMVR7_275", "instruction": "i am looking for super comfortable for walking dogs, road running, daily wear, casual, gym, training, light trekking, theme park travel, urban recreation, jogging in the road and path, basketball, cycling, workout, camping and other outdoor multisports or lite indoor exercise at home women's road running shoes in a4-khaki color. size 8.5 wide preferable.", "target_attributes": { "attributes": [ "slip resistant", "leather sole" ], "options": [ "a4-khaki", "8.5 wide" ] }, "asin": "B09B6LMVR7" }, { "task_id": "ws_B09B6LMVR7_276", "instruction": "i am looking for slip resistant women running shoes.please choose black one.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "a1-black" ] }, "asin": "B09B6LMVR7" }, { "task_id": "ws_B01N128GRV_277", "instruction": "i'm looking for ac power cord cable socket plug for sony cfd series with output protection and blu ray", "target_attributes": { "attributes": [ "output protection", "blu ray" ], "options": [] }, "asin": "B01N128GRV" }, { "task_id": "ws_B0812B8WXH_278", "instruction": "i'm looking for jar candles with soy way that is long lasting. also, choose illinois colored one.", "target_attributes": { "attributes": [ "long lasting", "soy wax", "living room" ], "options": [ "illinois" ] }, "asin": "B0812B8WXH" }, { "task_id": "ws_B09P89Z11V_279", "instruction": "find me a high performance cooling fan with usb port. pick me 1 pack.", "target_attributes": { "attributes": [ "high performance", "usb port" ], "options": [ "1 pack" ] }, "asin": "B09P89Z11V" }, { "task_id": "ws_B087Q9SSPR_280", "instruction": "i'm looking for 2 pcs detangling hair brush for natural hair. also it's color should be in green-black", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "green-black", "2 pcs" ] }, "asin": "B087Q9SSPR" }, { "task_id": "ws_B087Q9SSPR_281", "instruction": "i want a 3 pack of beige brushes for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "beige-beige", "3 count (pack of 1)" ] }, "asin": "B087Q9SSPR" }, { "task_id": "ws_B08FZYYTFZ_282", "instruction": "i am looking for basic solid army green t shirt top,super stretchy and silky fabric,soft and comfortable for spring,winter wear yobecho womens long sleeve scoop neck tops blouse in xx large size.", "target_attributes": { "attributes": [ "long sleeve", "everyday wear" ], "options": [ "army green", "xx-large" ] }, "asin": "B08FZYYTFZ" }, { "task_id": "ws_B08DJ7RZF3_283", "instruction": "i am looking for smell good,feel good,pay less,long last, travel size ca perfume impression of euphoria for women fragrance body oils alcohol-free. good to go, bottles fit in handbag or purse. convenient for travel. donna karan cashmere mist impression preferable.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "long lasting" ], "options": [ "donna karan cashmere mist impression" ] }, "asin": "B08DJ7RZF3" }, { "task_id": "ws_B08DJ7RZF3_284", "instruction": "looking for sandalwood dark intense perfume for women that is alchol free", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "sandalwood dark intense perfume" ] }, "asin": "B08DJ7RZF3" }, { "task_id": "ws_B08DJ7RZF3_285", "instruction": "i would like some viktor and rolf perfume that is travel sized.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "viktor & rolf spicebomb extreme impressi..." ] }, "asin": "B08DJ7RZF3" }, { "task_id": "ws_B08DJ7RZF3_286", "instruction": "i am interested in perfume oil that is cedarwood scented and travel sized", "target_attributes": { "attributes": [ "travel size" ], "options": [ "cedarwood perfume oil" ] }, "asin": "B08DJ7RZF3" }, { "task_id": "ws_B09PY8LYR6_287", "instruction": "i am looking for a long sleeve trench coat with pockets. pick a green one.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "zb1_green" ] }, "asin": "B09PY8LYR6" }, { "task_id": "ws_B06ZXSMRQY_288", "instruction": "i need a salmon slim fitting dress shirt that is in a size small.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "kmtsts0132-salmon2", "small" ] }, "asin": "B06ZXSMRQY" }, { "task_id": "ws_B074SQKP3T_289", "instruction": "i'm looking for a original non gmo margarita with natural ingredients.", "target_attributes": { "attributes": [ "non gmo", "natural ingredients" ], "options": [ "original" ] }, "asin": "B074SQKP3T" }, { "task_id": "ws_B09C91R8Q8_290", "instruction": "i am looking for 8 size flats with leather sole for women.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "8" ] }, "asin": "B09C91R8Q8" }, { "task_id": "ws_B09NPW7ZDF_291", "instruction": "i am looking for some valentine's day cupcake toppers.", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B09NPW7ZDF" }, { "task_id": "ws_B08723759H_292", "instruction": "i am looking high resolution high performance oneplus 8 cell phone having 256 gb storage capacity", "target_attributes": { "attributes": [ "high resolution", "high performance" ], "options": [ "256gb", "oneplus 8" ] }, "asin": "B08723759H" }, { "task_id": "ws_B09LC5FR69_293", "instruction": "i want a swivel desk chair with lumbar support and backrest. pick something in blue.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "blue-936" ] }, "asin": "B09LC5FR69" }, { "task_id": "ws_B09PG5W2RL_294", "instruction": "i am looking for a dark gray polo that is long sleeved and in a medium size.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "dark gray", "medium" ] }, "asin": "B09PG5W2RL" }, { "task_id": "ws_B09JJN66YM_295", "instruction": "i am looking a green tea shampoo have anti hair loss and for good hair growth moisturizing -for normal dry scalp", "target_attributes": { "attributes": [ "green tea", "hair growth", "hair loss" ], "options": [ "moisturizing(renewal) - for normal | dry scalp" ] }, "asin": "B09JJN66YM" }, { "task_id": "ws_B08R8TFHDG_296", "instruction": "i need a small size t-shirt for my wife. i would prefer classic fit with olive color", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "olive", "women", "small" ] }, "asin": "B08R8TFHDG" }, { "task_id": "ws_B08R8TFHDG_297", "instruction": "i'm looking for a classic fit women t-shirt with needle sleeve and star wars design. also, choose medium size white colored one.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit", "star wars" ], "options": [ "white", "women", "medium" ] }, "asin": "B08R8TFHDG" }, { "task_id": "ws_B01676307A_298", "instruction": "i see the 15 ounce size of chocolate cover", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "15 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_299", "instruction": "i would like a 8 ounce mom heart hand made sandwich.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "mom heart", "8 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_300", "instruction": "i would like a 8 ounce mom heart hand made sandwich.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "mom heart", "8 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_301", "instruction": "i am looking for hand crafted disney frozen licensed flavor cookies.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "disney frozen licensed" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_302", "instruction": "i am looking for wedding bride and groom flavor hand crafted cookies.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "wedding bride and groom" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_303", "instruction": "i'm looking for philadelphia candies covered oreo cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "happy birthday gift | dark chocolate" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_304", "instruction": "i am looking for an 8 ounce pack of chocolate covered cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_305", "instruction": "i'm locking for candies milk chocolate covered oreo cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_306", "instruction": "looking for chocolate covered oreo cookies that pack size 8 ounce (pack of 8)", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "8 ounce (pack of 8)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_307", "instruction": "i would like a 15 ounce package of blue stork it's a boy gift chocolate covered cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "blue stork it's a boy gift", "15 ounce (pack of 15)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_308", "instruction": "i need an 8 ounce pack of chocolate covered oreo cookies candies for a birthday gift.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "8 ounce (pack of 8)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_309", "instruction": "i want a 15 ounce pack of chocolate oreo cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "15 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B01676307A_310", "instruction": "i want some chocolate covered gift cookies for a birthday gift. pick the 15 ounce pack.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "15 ounce (pack of 1)" ] }, "asin": "B01676307A" }, { "task_id": "ws_B09QQQGXW3_311", "instruction": "i am looking for a one piece tummy control swimsuit that is small in size and the fabric should be cotton spandex.", "target_attributes": { "attributes": [ "tummy control", "cotton spandex" ], "options": [ "small" ] }, "asin": "B09QQQGXW3" }, { "task_id": "ws_B09BQ3QWXV_312", "instruction": "i need long sleeved pullover shirt for teenage girls. pick something in small size.", "target_attributes": { "attributes": [ "long sleeve", "teen girls" ], "options": [ "small" ] }, "asin": "B09BQ3QWXV" }, { "task_id": "ws_B000ILMQF8_313", "instruction": "i need some low sodium popcorn salt that is cheesy caramel corn in a pack of six.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "cheesy caramel corn", "2.6 ounce (pack of 6)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_314", "instruction": "can you find the gluten free caramel milk chocolate seasoning that comes in a pack of 6?", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "milk chocolate caramel", "3 ounce (pack of 6)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_315", "instruction": "i want low sodium popcorn salt that is frosted sugar cookie and comes in a pack of six.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "frosted sugar cookie", "3 ounce (pack of 6)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_316", "instruction": "i'm looking for popcorn seasoning that is gluten-free, low-sodium, cheddar-flavored.", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "cheddar-cheese" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_317", "instruction": "i would like a 2.7 ounce bottle of caramel hot chocolate popcorn salt that is low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "caramel hot chocolate", "2.7 ounce (pack of 6)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_318", "instruction": "i am looking for 2.85 ounce gluten free bacon cheddar flavored popcorn seasoning", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "2.85 ounce (pack of 1)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B000ILMQF8_319", "instruction": "i am interested in some low sodium popcorn salt that is cheddar flavored and 2.6 oz.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "cheddar-cheese", "2.6 ounce (pack of 1)" ] }, "asin": "B000ILMQF8" }, { "task_id": "ws_B08R7K5SPG_320", "instruction": "i would like a soft cotton spandex cargo pants with zipper pockets. pick the one with 28\" inseam.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "28\" inseam (petite)" ] }, "asin": "B08R7K5SPG" }, { "task_id": "ws_B08R7K5SPG_321", "instruction": "i need xx-large tall , charcoal color lightweight women's cotton spandex soft jogger pants with zipper", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "charcoal", "xx-large tall" ] }, "asin": "B08R7K5SPG" }, { "task_id": "ws_B089NSW5CS_322", "instruction": "i want ready to eat snacks with quality ingredients. pick one with salty cheese flavor.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "salty cheese flavor" ] }, "asin": "B089NSW5CS" }, { "task_id": "ws_B089LJDFNG_323", "instruction": "i want to find a high-definition spy camera that can detect motion.", "target_attributes": { "attributes": [ "high definition", "motion detection" ], "options": [] }, "asin": "B089LJDFNG" }, { "task_id": "ws_B06X99QGND_324", "instruction": "i want to find a fleece-lined women's jacket that features the san francisco 49ers. the color must be colt gray and i wear a size 3x.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "indianapolis colts, gray", "3x", "san francisco 49ers" ] }, "asin": "B06X99QGND" }, { "task_id": "ws_B06X99QGND_325", "instruction": "i would like a gray 2xl philadelphia eagles fleece lined jacket.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "kansas city chiefs, gray", "xx-large", "philadelphia eagles" ] }, "asin": "B06X99QGND" }, { "task_id": "ws_B06X99QGND_326", "instruction": "i am looking for a women's medium size gray fleece lined jacket.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "gray", "medium" ] }, "asin": "B06X99QGND" }, { "task_id": "ws_B06X99QGND_327", "instruction": "i need a baltimore ravens fleece lined jacket with imported zippers.", "target_attributes": { "attributes": [ "fleece lined", "imported zipper" ], "options": [ "baltimore ravens" ] }, "asin": "B06X99QGND" }, { "task_id": "ws_B000HDOOL6_328", "instruction": "i want a caffeine and sugar free chai latte powdered mix. it should be of vanilla flavor.", "target_attributes": { "attributes": [ "caffeine free", "sugar free" ], "options": [ "vanilla" ] }, "asin": "B000HDOOL6" }, { "task_id": "ws_B082SVLKCT_329", "instruction": "i want a 16 inch case cover with touch bar. pick a dark blue leather one.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "dark blue leather" ] }, "asin": "B082SVLKCT" }, { "task_id": "ws_B09P7Z3LCR_330", "instruction": "i am looking for a fast charging docking stations.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09P7Z3LCR" }, { "task_id": "ws_B07XJCZ817_331", "instruction": "i want a pair of faux fur slippers. pick a size between 10.5 and 11.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "faux raccoon fur original color" ] }, "asin": "B07XJCZ817" }, { "task_id": "ws_B09B7D8W1J_332", "instruction": "i need a slim fit active shirt that is brown and that is large.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "12-brown", "large" ] }, "asin": "B09B7D8W1J" }, { "task_id": "ws_B08JLQT4FX_333", "instruction": "i want to find a synthetic wig that features pink and black hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "pink&black" ] }, "asin": "B08JLQT4FX" }, { "task_id": "ws_B08MWQNPXF_334", "instruction": "i am interested in black and white fashion sneakers for everyday wear that come in a 6.5 size for women.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "black white", "6.5 women | 5 men" ] }, "asin": "B08MWQNPXF" }, { "task_id": "ws_B09Q2YMM14_335", "instruction": "i am in ineed of women quick drying small size yoga shorts with high waist and a-dark grey color", "target_attributes": { "attributes": [ "quick drying", "high waist" ], "options": [ "small" ] }, "asin": "B09Q2YMM14" }, { "task_id": "ws_B07S22PTB3_336", "instruction": "i am looking for a map 3 coloured make up travel bag which is easy to carry .", "target_attributes": { "attributes": [ "travel size", "easy carry" ], "options": [ "map 3" ] }, "asin": "B07S22PTB3" }, { "task_id": "ws_B01LZ2I7EZ_337", "instruction": "i want a non toxic mouthwash which is fluoride and alcohol free. pick a 2 pack 16 fluid ounces one.", "target_attributes": { "attributes": [ "non toxic", "fluoride free", "alcohol free" ], "options": [ "16 fl oz (pack of 2)" ] }, "asin": "B01LZ2I7EZ" }, { "task_id": "ws_B08D7JM1X2_338", "instruction": "get me some gluten free chips. look for the 3 flavor variety pack.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "3 flavor variety pack" ] }, "asin": "B08D7JM1X2" }, { "task_id": "ws_B00JD20DTO_339", "instruction": "find me a low sodium, sugar free, thickened coffee. i will need a pack of 24.", "target_attributes": { "attributes": [ "low sodium", "sugar free" ], "options": [ "pack of 24" ] }, "asin": "B00JD20DTO" }, { "task_id": "ws_B00JD20DTO_340", "instruction": "i want sugar free decaffeinated coffee that comes in an 8 fluid oz pack. it should have a mildly thick consistency.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "coffee decaf", "8 fl oz (pack of 1)", "mildly thick." ] }, "asin": "B00JD20DTO" }, { "task_id": "ws_B00JD20DTO_341", "instruction": "i want to find one 8.01 fluid ounce bottle of a decaf coffee-flavored drink. it can't have any sugar in it and i want it to have some honey.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "coffee decaf", "8.01 fl oz (pack of 1)", "honey" ] }, "asin": "B00JD20DTO" }, { "task_id": "ws_B09QL53Z3Q_342", "instruction": "i am lookinf for pink hair rollers for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "pink" ] }, "asin": "B09QL53Z3Q" }, { "task_id": "ws_B078WXXKV5_343", "instruction": "i need gluten free and low sodium seasoning which is all-purpose. make sure they are organic seasonings.", "target_attributes": { "attributes": [ "gluten free", "low sodium" ], "options": [ "organic seasonings" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_344", "instruction": "i am looking for a low sodium and gluten free seasoning. look for spice gift sets.", "target_attributes": { "attributes": [ "gluten free", "low sodium" ], "options": [ "spice gift sets" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_345", "instruction": "i am looking for gluten free spice gift sets that come in 3 ounces.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "spice gift sets", "3 ounce (pack of 1)" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_346", "instruction": "i'm looking for a 3 ounce, small food gift that is gluten free and is flavored everyday seasonings.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "everyday seasonings", "3 ounce (pack of 1)", "small - original flavor" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_347", "instruction": "i am looking for gluten free seasoning in organic", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "organic seasonings" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_348", "instruction": "i'm looking for low sodium, gluten free everyday seasonings, 2.01 ounce (pack of 1)", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "2.01 ounce (pack of 1)", "everyday seasonings" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_349", "instruction": "i am looking for a gluten free food seasoning set for my paleo diet. and i would prefer 2 ounce pack", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "paleo seasoning set", "2 ounce (pack of 1)" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B078WXXKV5_350", "instruction": "i'm looking for a four ounce low sodium paleo seasoning set.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "paleo seasoning set", "4 ounce (pack of 1)" ] }, "asin": "B078WXXKV5" }, { "task_id": "ws_B09QHKPGSX_351", "instruction": "i want nail clippers that are easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B09QHKPGSX" }, { "task_id": "ws_B07BZ4KQ1T_352", "instruction": "i am looking for delicious flavor starkist chicken creations, chicken salad, 2.6 oz pouch,pack of 12 which is soy free and gluten free easy to prepare, perfect fit for today\u2019s active lifestyle. buffalo style flavor preferable.", "target_attributes": { "attributes": [ "soy free", "ready eat", "gluten free" ], "options": [ "2.6 ounce (pack of 12)" ] }, "asin": "B07BZ4KQ1T" }, { "task_id": "ws_B07D9DMD1D_353", "instruction": "find me a running shoe that is regular fit and has a rubber outsole. pick a size 10 one.", "target_attributes": { "attributes": [ "rubber outsole", "regular fit" ], "options": [ "10" ] }, "asin": "B07D9DMD1D" }, { "task_id": "ws_B01DJH8K3Y_354", "instruction": "i need a 10 pound bag of sour watermelon slices that are non-dairy.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "sour watermelon slices", "10 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_355", "instruction": "i am looking for a large bag of chocolate covered raisins 3-4 pound bag.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "4 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_356", "instruction": "get me three pounds of white chocolate covered raisins. make sure they're non-dairy.", "target_attributes": { "attributes": [ "non dairy", "chocolate covered" ], "options": [ "white chocolate nonpareils", "3 pound (pack of 1)" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_357", "instruction": "i want to find a pound of chocolate covered peach hearts.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "peach hearts", "1 pound (pack of 1)" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_358", "instruction": "i am looking for chocolate covered raisins.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "chocolate covered raisins" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_359", "instruction": "i am looking for 10 pound bulk candy with chocolate covered raisins", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "10 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_360", "instruction": "i am looking for a non diary hard candy of gummy cherries flavour.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "gummy cherries" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_361", "instruction": "i'm looking for chocolate covered for gifted to someone.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "fini tornado tubereoos" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_362", "instruction": "i would like to order a pink chocolate confetti candy and should be non dairy.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "chocolate confetti - pink" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_363", "instruction": "i would like a three pound bag of hard candy that is chocolate covered", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "3 pound (pack of 1)" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_364", "instruction": "i would like a 9 pound bag of white chocolate covered nonpareils.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "white chocolate nonpareils", "9 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_365", "instruction": "i would like a 4 pound bag of chocolate covered eda's sugar free hard candy.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "eda's sugar free hard candy", "4 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_366", "instruction": "i'm looking for a 10 pound blend gelee chocolate covered with candy", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "blend gelee", "10 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_367", "instruction": "i'm looking for a non dairy, chocolate covered raisins. also, choose sampler size chocolate rocks- gray one", "target_attributes": { "attributes": [ "non dairy", "chocolate covered" ], "options": [ "chocolate rocks - gray", "*sampler size*" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_368", "instruction": "i would like hard candy that is in a gift box and is chocolate covered", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "gift box" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_369", "instruction": "i am looking for a chocolated covered candy having size 5 pound.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "5 pound" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_370", "instruction": "find non dairy candies.", "target_attributes": { "attributes": [ "non dairy" ], "options": [] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_371", "instruction": "i would like a pound of non dairy jelly filled strawberry gummies", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "jelly filled strawberry gummies", "1 pound (pack of 1)" ] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B01DJH8K3Y_372", "instruction": "may you give me a sour strawberry gummies by love of candy? *sampler size*pack please", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [] }, "asin": "B01DJH8K3Y" }, { "task_id": "ws_B08ZY474JW_373", "instruction": "i am looking for a women's vest that is padded and machine washable. pick an x-small size.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "x-small" ] }, "asin": "B08ZY474JW" }, { "task_id": "ws_B099MP2HQJ_374", "instruction": "i want a recliner sofa for my living room and it should have storage space.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [] }, "asin": "B099MP2HQJ" }, { "task_id": "ws_B07Y2WGPNV_375", "instruction": "i am looking a cotton spandex low rise men's briefs medium size colour should be black", "target_attributes": { "attributes": [ "low rise", "cotton spandex" ], "options": [ "black", "medium" ] }, "asin": "B07Y2WGPNV" }, { "task_id": "ws_B09H74TPKB_376", "instruction": "i'm looking for a black tempered glass smartwatch bands for men", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "black" ] }, "asin": "B09H74TPKB" }, { "task_id": "ws_B09H74TPKB_377", "instruction": "i'm looking for black tempered smart watches. the glass screen is perfectly look so nice.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [ "black" ] }, "asin": "B09H74TPKB" }, { "task_id": "ws_B000ILLX3Y_378", "instruction": "i am looking for a 2.6 ounce, pack of 1, low calorie popcorn seasoning.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "2.6 ounce (pack of 1)" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_379", "instruction": "i am looking for a 1 count of gluten free popcorn salt", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1 count" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_380", "instruction": "i would like some low calorie birthday cake flavor popcorn topping.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "birthday cake" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_381", "instruction": "i am looking for some gluten free parmesan garlic flavored popcorn seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "parmesan garlic" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_382", "instruction": "i am looking for kernel season's popcorn season in 2.85 ounce packs of 6.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "3.5 ounce (pack of 6)" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_383", "instruction": "i am looking for some gluten free kettle corn seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "kettle-corn" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_384", "instruction": "i am looking for a six pack of popcorn salt that has a rich and creamy white cheddar flavor.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "white cheddar", "2.7 ounce (pack of 6)" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_385", "instruction": "i am looking for popcorn seasoning in chili lime flavor, 2.6 ounce (pack of 1)", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "2.6 ounce (pack of 1)" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B000ILLX3Y_386", "instruction": "i need rich creamy popcorn seasoning in chili lime flavor. make sure that it is gluten free.", "target_attributes": { "attributes": [ "rich creamy", "gluten free" ], "options": [ "chili lime" ] }, "asin": "B000ILLX3Y" }, { "task_id": "ws_B076PK255Q_387", "instruction": "i want some snack bites that is gluten free and high protein. it should be beef flavored.", "target_attributes": { "attributes": [ "high protein", "gluten free" ], "options": [ "beef" ] }, "asin": "B076PK255Q" }, { "task_id": "ws_B011V56KTC_388", "instruction": "show me flip flops that are unisex and made of ethylene vinyl. i am a size 6.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "6 women | 6 men" ] }, "asin": "B011V56KTC" }, { "task_id": "ws_B011V56KTC_389", "instruction": "look for puma unisex epic v2 flip flop sandal in size 8 that is made of ethylene vinyl in sun kissed coral rosewater.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "sun kissed coral rosewater", "8" ] }, "asin": "B011V56KTC" }, { "task_id": "ws_B011V56KTC_390", "instruction": "i'm looking for a unisex flip flops in the brand of puma.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "puma black-high rise" ] }, "asin": "B011V56KTC" }, { "task_id": "ws_B011V56KTC_391", "instruction": "i want a size 4 uk light lavender cloud pink sandal made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "light lavender cloud pink", "4 uk" ] }, "asin": "B011V56KTC" }, { "task_id": "ws_B08BG5NDKY_392", "instruction": "i am looking for a fleece throw that is super soft to go in my living room. it should be shark colored.", "target_attributes": { "attributes": [ "super soft", "fleece throw", "living room" ], "options": [ "shark" ] }, "asin": "B08BG5NDKY" }, { "task_id": "ws_B087N9KJ89_393", "instruction": "i would like a high gloss coffee table.", "target_attributes": { "attributes": [ "high gloss" ], "options": [] }, "asin": "B087N9KJ89" }, { "task_id": "ws_B0957J68LT_394", "instruction": "i need a yellow home office chair that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "yellow" ] }, "asin": "B0957J68LT" }, { "task_id": "ws_B08GHHHWLP_395", "instruction": "i'm looking for a 39\"w x 72\"h roller shades for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "39\"w x 72\"h" ] }, "asin": "B08GHHHWLP" }, { "task_id": "ws_B078N3XL2D_396", "instruction": "i'm looking for a twin xl, fully assembled mattresses.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "twin xl" ] }, "asin": "B078N3XL2D" }, { "task_id": "ws_B01DVLB1I4_397", "instruction": "i want to find a 10-foot long usb cable with a usb port in rose gold color.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "rose gold" ] }, "asin": "B01DVLB1I4" }, { "task_id": "ws_B09MD8XBXB_398", "instruction": "i want a pair of memory foam slippers that are winter warm. i want it in red.", "target_attributes": { "attributes": [ "winter warm", "memory foam" ], "options": [ "red" ] }, "asin": "B09MD8XBXB" }, { "task_id": "ws_B09DCXCK2G_399", "instruction": "i'm looking for a professional makeup train storage case that has separate space for nail art materials and eye shadow palette.", "target_attributes": { "attributes": [ "storage case", "nail art", "eye shadow" ], "options": [] }, "asin": "B09DCXCK2G" }, { "task_id": "ws_B09PB819S6_400", "instruction": "i am looking for medical grade silicone scar removal sheets scar removal is reusable and completely washable. washing them renews their sticking ability, easy to use waterproof and very sticky. 1.6\u201d x 120\u201dsize preferable", "target_attributes": { "attributes": [ "clinically proven", "water resistant", "non toxic", "easy use" ], "options": [] }, "asin": "B09PB819S6" }, { "task_id": "ws_B09RP2P6CQ_401", "instruction": "i am looking for a loose fit large t-shirt in a gray color.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "llds-a053-gray", "large" ] }, "asin": "B09RP2P6CQ" }, { "task_id": "ws_B0010XRVR6_402", "instruction": "i would like a chicken broccoli rice mix that comes in a pack of 12 and is easy to prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken broccoli", "5.5 ounce (pack of 12)" ] }, "asin": "B0010XRVR6" }, { "task_id": "ws_B0010XRVR6_403", "instruction": "i am looking for knorr rice sides for a tasty rice side dish creamy chicken with no artificial flavors,easily prepare on the stove or in a microwave, goodness of a chicken flavored sauce. pack of 12 preferable.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken", "pack of 12" ] }, "asin": "B0010XRVR6" }, { "task_id": "ws_B0010XRVR6_404", "instruction": "i need some easy to prepare chicken broccoli meals.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken broccoli" ] }, "asin": "B0010XRVR6" }, { "task_id": "ws_B088MG2TWQ_405", "instruction": "i am looking for a core i5 tablet.", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B088MG2TWQ" }, { "task_id": "ws_B07QDVJC5F_406", "instruction": "i need long lasting bedtime spa candles", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "bedtime spa" ] }, "asin": "B07QDVJC5F" }, { "task_id": "ws_B07QDVJC5F_407", "instruction": "i would like a lead free amazon rainforest bracelet candle.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "amazon rainforest", "bracelet" ] }, "asin": "B07QDVJC5F" }, { "task_id": "ws_B07QDVJC5F_408", "instruction": "i want by a candle. pisces | zodiac star signs jewelry candle with necklace lead free inside ! scent vanilla lavender .", "target_attributes": { "attributes": [ "lead free" ], "options": [ "vanilla lavender" ] }, "asin": "B07QDVJC5F" }, { "task_id": "ws_B07MFYH5Y6_409", "instruction": "i want to find a pair of black and magnet colored men's hiking boots with rubber soles, they need to be in size 15.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | magnet", "15" ] }, "asin": "B07MFYH5Y6" }, { "task_id": "ws_B09Q2TD1V4_410", "instruction": "i am looking for a 11 women | 9.5 men shoes of rubber sole", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "11 women | 9.5 men" ] }, "asin": "B09Q2TD1V4" }, { "task_id": "ws_B09H2WLRW3_411", "instruction": "i need a high quality human hair. pick a straight 3 bundle with closure.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "straight 3 bundles with closure" ] }, "asin": "B09H2WLRW3" }, { "task_id": "ws_B09H2WLRW3_412", "instruction": "i need high quality hair extensions that are loose waves", "target_attributes": { "attributes": [ "high quality" ], "options": [ "loose wave 3 bundles with closure" ] }, "asin": "B09H2WLRW3" }, { "task_id": "ws_B08KFD77MF_413", "instruction": "i'm looking for a water resistant red on black cosmetic bags for women.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "red on black" ] }, "asin": "B08KFD77MF" }, { "task_id": "ws_B07TTJDVMS_414", "instruction": "i need a night stand with a width of 24 and height of 30. pick a white one.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B07TTJDVMS" }, { "task_id": "ws_B07GX4G5GQ_415", "instruction": "i search the vanity light including satin nickel", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "satin nickel" ] }, "asin": "B07GX4G5GQ" }, { "task_id": "ws_B01LW1R1QU_416", "instruction": "i am looking for a non gmo popcorn with simple ingredients.", "target_attributes": { "attributes": [ "non gmo", "simple ingredients" ], "options": [] }, "asin": "B01LW1R1QU" }, { "task_id": "ws_B09RQS6CLC_417", "instruction": "i want to find a small green lace pajama set for daily wear.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "g", "small" ] }, "asin": "B09RQS6CLC" }, { "task_id": "ws_B097J4D79Y_418", "instruction": "i'm looking for a optical zoom dome cameras.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B097J4D79Y" }, { "task_id": "ws_B07TSWKZ6Y_419", "instruction": "i need some hair cutting shears that are gold and six inches.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "gold", "6 inch" ] }, "asin": "B07TSWKZ6Y" }, { "task_id": "ws_B07TSWKZ6Y_420", "instruction": "i am looking for a pair of 6 inch stainless steel hair cutting scissors.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [ "6 inch" ] }, "asin": "B07TSWKZ6Y" }, { "task_id": "ws_B09Q38V92J_421", "instruction": "i am looking for a blue tie and dye printed small blouse with a unique design that is short sleeved for teen girls.", "target_attributes": { "attributes": [ "short sleeve", "unique design", "teen girls" ], "options": [ "0a94- blue", "small" ] }, "asin": "B09Q38V92J" }, { "task_id": "ws_B08295DTX4_422", "instruction": "i'm looking for a case cover hard shell cases of rock ash color.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "rock ash" ] }, "asin": "B08295DTX4" }, { "task_id": "ws_B074338PG3_423", "instruction": "i want to find a pack of nine low-carb cheese bites from trader joe's.", "target_attributes": { "attributes": [ "trader joe", "low carb" ], "options": [ "pack of 9" ] }, "asin": "B074338PG3" }, { "task_id": "ws_B00MFQJR60_424", "instruction": "i am looking for an easy care shirt. pick a soft black one.", "target_attributes": { "attributes": [ "easy care" ], "options": [ "soft black" ] }, "asin": "B00MFQJR60" }, { "task_id": "ws_B071DV6H98_425", "instruction": "i am looking for a gluten free peanut butter that comes in a vanilla flavor and is .85 oz.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vanilla sample", "0.85 ounce (pack of 1)" ] }, "asin": "B071DV6H98" }, { "task_id": "ws_B071DV6H98_426", "instruction": "i would like some non gmo peanut butter that is vanilla flavored and is 0.85 ounces", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "vanilla sample", "0.85 ounce (pack of 1)" ] }, "asin": "B071DV6H98" }, { "task_id": "ws_B071DV6H98_427", "instruction": "i'm looking for a multi-pack of original peanut butter powder in the 6.5 ounce size; it must suit my gluten-free diet.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "original", "6.5 ounce (pack of 6)" ] }, "asin": "B071DV6H98" }, { "task_id": "ws_B09QHJSCSJ_428", "instruction": "i need black flats in a size 9 that have arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black", "9" ] }, "asin": "B09QHJSCSJ" }, { "task_id": "ws_B09HCLN583_429", "instruction": "i want a non slip futon mattress which is soft and thick. i need it in 150*200 cm size.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "150*200cm" ] }, "asin": "B09HCLN583" }, { "task_id": "ws_B09P5LHPC4_430", "instruction": "i need a hair treatment detangler that comes in two bottles.", "target_attributes": { "attributes": [ "hair treatment" ], "options": [ "2 bottles" ] }, "asin": "B09P5LHPC4" }, { "task_id": "ws_B01MRNDYVF_431", "instruction": "i'm looking for a comfortable fit 38w x 30l jeans for men.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "38w x 30l" ] }, "asin": "B01MRNDYVF" }, { "task_id": "ws_B01MRNDYVF_432", "instruction": "i need a long lasting cowboy cut jeans that is slim fit.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "slim" ] }, "asin": "B01MRNDYVF" }, { "task_id": "ws_B01MRNDYVF_433", "instruction": "i am looking for a long lasting jean with comfortable fit in regular size. also choose smoky color and 28w x 30l size.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "smoke storm", "regular", "28w x 30l" ] }, "asin": "B01MRNDYVF" }, { "task_id": "ws_B087CM8ZJQ_434", "instruction": "i need a fast charging usb cable that is black and 6.6 feet long.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "black", "6.6ft" ] }, "asin": "B087CM8ZJQ" }, { "task_id": "ws_B087CM8ZJQ_435", "instruction": "i'm looking for gold plated grey usb cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "grey" ] }, "asin": "B087CM8ZJQ" }, { "task_id": "ws_B07KQNG859_436", "instruction": "l want a roasted almonds colour 4 count low carbo and sugar free chocolate", "target_attributes": { "attributes": [ "low carb", "sugar free" ], "options": [ "roasted almonds", "4 count (pack of 4)" ] }, "asin": "B07KQNG859" }, { "task_id": "ws_B00EQD8022_437", "instruction": "i am searching for a delicious dairy free unsweetened coconutmilk, 1 quart", "target_attributes": { "attributes": [ "dairy free" ], "options": [] }, "asin": "B00EQD8022" }, { "task_id": "ws_B01M183PGP_438", "instruction": "i need a bpa free bag that is purple with flowers.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "purple with black disc, floral labels" ] }, "asin": "B01M183PGP" }, { "task_id": "ws_B07T3RBK48_439", "instruction": "i need a classic fit t-shirt. pick the royal blue one.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "royal blue" ] }, "asin": "B07T3RBK48" }, { "task_id": "ws_B085DGY66W_440", "instruction": "i'm looking for a gluten free, non gmo vegetable powder refill pouch with organic winter squash. also, choose three beet flavor one.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "three beet" ] }, "asin": "B085DGY66W" }, { "task_id": "ws_B09PZ6KCQ2_441", "instruction": "i am looking for a x- large casual dresses with long sleeves", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large" ] }, "asin": "B09PZ6KCQ2" }, { "task_id": "ws_B09RPDTM1K_442", "instruction": "i want a small sexy pajama lingerie that is made of quality polyester. pick a yellow one.", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "yellow", "small" ] }, "asin": "B09RPDTM1K" }, { "task_id": "ws_B082WYL1FR_443", "instruction": "i am looking for a usb c female to usb male adapter made up of aluminum alloy also in purple color.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "purple" ] }, "asin": "B082WYL1FR" }, { "task_id": "ws_B091G46DJV_444", "instruction": "get me a wine tote that is bpa free and easy to use to hold wine bottles. pick something in swankey blue moon color.", "target_attributes": { "attributes": [ "bpa free", "easy use" ], "options": [ "swankey blue moon" ] }, "asin": "B091G46DJV" }, { "task_id": "ws_B09FYT7V8G_445", "instruction": "i need an ac adapter that has wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B09FYT7V8G" }, { "task_id": "ws_B076BYM91L_446", "instruction": "i would like some high protein jerky that is bbq and 8 ounces.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "bbq", "8 ounce" ] }, "asin": "B076BYM91L" }, { "task_id": "ws_B076BYM91L_447", "instruction": "i am looking for a 4 ounce pack of low fat turkey jerky with sweet heat flavor.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "sweet heat", "4 ounce" ] }, "asin": "B076BYM91L" }, { "task_id": "ws_B09729K3M4_448", "instruction": "i am looking for an easy clean computer desk that is white in color. pick a size 47\" desk.", "target_attributes": { "attributes": [ "white item", "easy clean" ], "options": [ "47\"" ] }, "asin": "B09729K3M4" }, { "task_id": "ws_B09729K3M4_449", "instruction": "i want a 39 inch easy to clean computer desk that is also heavy duty.", "target_attributes": { "attributes": [ "heavy duty", "easy clean" ], "options": [ "39\u2018\u2019" ] }, "asin": "B09729K3M4" }, { "task_id": "ws_B09KGGD8NN_450", "instruction": "i'm searching for a rechargeable plug play powerpoint presenter remote. also its color is green light one.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "x16" ] }, "asin": "B09KGGD8NN" }, { "task_id": "ws_B09P1QKG2T_451", "instruction": "i am looking for a glitters nail polish. also, choose the 04# color.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "04#" ] }, "asin": "B09P1QKG2T" }, { "task_id": "ws_B09P1QKG2T_452", "instruction": "i need a 05# nail powder pen for nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "05#" ] }, "asin": "B09P1QKG2T" }, { "task_id": "ws_B00005Q7DG_453", "instruction": "i'm looking for a digital camera with optical zoom lens and should have usb port.", "target_attributes": { "attributes": [ "optical zoom", "usb port" ], "options": [] }, "asin": "B00005Q7DG" }, { "task_id": "ws_B0000533G9_454", "instruction": "i need a cruelty free hand wash that is 8 ounces.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B0000533G9" }, { "task_id": "ws_B07N49M3J7_455", "instruction": "i want to find a 3-pack of grape-mango fruit leather buttons that are usda organic. the brand must be trader joe's.", "target_attributes": { "attributes": [ "trader joe", "usda organic" ], "options": [ "grape-mango", "3 pack" ] }, "asin": "B07N49M3J7" }, { "task_id": "ws_B07N49M3J7_456", "instruction": "trader joe want to buy an organic fruit with leather buttons and natural flavors (6 pack). also choose the mango and size is 12 pack.", "target_attributes": { "attributes": [ "trader joe", "usda organic", "natural flavors" ], "options": [ "mango", "12 pack" ] }, "asin": "B07N49M3J7" }, { "task_id": "ws_B07N49M3J7_457", "instruction": "i'm looking for gluten free that flavor was mango it looks so good.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "mango" ] }, "asin": "B07N49M3J7" }, { "task_id": "ws_B07N49M3J7_458", "instruction": "i\u2019m looking for a 6-pack of the trader joes fruit leather buttons; i like the natural strawberry-mango flavour.", "target_attributes": { "attributes": [ "trader joe", "natural flavors" ], "options": [ "6 pack" ] }, "asin": "B07N49M3J7" }, { "task_id": "ws_B01M4RU1G2_459", "instruction": "i need fruit snacks are that are both fat and gluten free.", "target_attributes": { "attributes": [ "fat free", "gluten free" ], "options": [] }, "asin": "B01M4RU1G2" }, { "task_id": "ws_B08S3S7Y6S_460", "instruction": "i am looking for 3.3 ft usb cables compatible with apple.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "3.3 ft" ] }, "asin": "B08S3S7Y6S" }, { "task_id": "ws_B09225PZDX_461", "instruction": "i'm looking for multicolor cupcake toppers with cupcake picks for baby shower.", "target_attributes": { "attributes": [ "cupcake picks", "baby shower" ], "options": [] }, "asin": "B09225PZDX" }, { "task_id": "ws_B01HFHK26C_462", "instruction": "i want a fully assembled file cabinet for home and office use. pick something in gray and black.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "gray black" ] }, "asin": "B01HFHK26C" }, { "task_id": "ws_B07Z4ZSKP4_463", "instruction": "i need a vinyl acetate narrow fit sandals with big buckle. i am a size 8.5.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "8.5" ] }, "asin": "B07Z4ZSKP4" }, { "task_id": "ws_B07Y848YHD_464", "instruction": "i am looking for gorgeous color black in the stainless steel metal watchband surface, the innovation design, looks more fashionable rabuzi band compatible for fitbit ionic band smartwatch.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black" ] }, "asin": "B07Y848YHD" }, { "task_id": "ws_B09Q2LHXS9_465", "instruction": "i am looking for fashion comfortable flats for women with the durable slip on outsole withlight weight lyhomean handmade women linen cotton slip on loafers in grey color. size 6.5 preferable.", "target_attributes": { "attributes": [ "light weight", "fashion design" ], "options": [ "grey", "6.5" ] }, "asin": "B09Q2LHXS9" }, { "task_id": "ws_B09LZ3B5CB_466", "instruction": "i am looking for a long lasting highly pigmented eye shadow for senstive skin", "target_attributes": { "attributes": [ "highly pigmented", "long lasting", "eye shadow", "sensitive skin" ], "options": [] }, "asin": "B09LZ3B5CB" }, { "task_id": "ws_B094Y4C2ZM_467", "instruction": "i'm looking for a #9 silver open toe women flat sandals, size-11", "target_attributes": { "attributes": [ "open toe" ], "options": [ "#9 silver", "11" ] }, "asin": "B094Y4C2ZM" }, { "task_id": "ws_B0848FR6YM_468", "instruction": "i am looking for a ready to use cocktail mixer that is authentic michelada mix and is 33.8 fl oz.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "authentic michelada mix", "33.81 fl oz (pack of 3)" ] }, "asin": "B0848FR6YM" }, { "task_id": "ws_B0848FR6YM_469", "instruction": "i am looking for a 16 fl oz cocktail mixer that is ready to use and is ginger lemonade flavored.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "skinny ginger lemonade mixer", "16 fl oz (pack of 1)" ] }, "asin": "B0848FR6YM" }, { "task_id": "ws_B0933HSCRS_470", "instruction": "i'm looking for a 18 inch double sided hair extensions", "target_attributes": { "attributes": [ "double sided" ], "options": [ "18 inch" ] }, "asin": "B0933HSCRS" }, { "task_id": "ws_B07C2DXQTP_471", "instruction": "i need some prewashed comfortable fit jeans that are relaxed and a size 36w by 31l", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "prewash", "relaxed", "36w x 31l" ] }, "asin": "B07C2DXQTP" }, { "task_id": "ws_B07C2DXQTP_472", "instruction": "i want banjo blue and machine washable wrangler cowboy cut jeans.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "banjo blue" ] }, "asin": "B07C2DXQTP" }, { "task_id": "ws_B07C2DXQTP_473", "instruction": "i want long lasting and slim wrangler mens cowboy jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "slim" ] }, "asin": "B07C2DXQTP" }, { "task_id": "ws_B07C2DXQTP_474", "instruction": "i want big & tall and comfortable fit wrangler mens cowboy cut jeans.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "big & tall" ] }, "asin": "B07C2DXQTP" }, { "task_id": "ws_B08Y917SDN_475", "instruction": "i want a long lasting shower gel gift set for sensitive skin. pick something with cherry blossom scent.", "target_attributes": { "attributes": [ "long lasting", "sensitive skin" ], "options": [] }, "asin": "B08Y917SDN" }, { "task_id": "ws_B007PY8M9A_476", "instruction": "i am looking for zero sugar sparkling water which is peach flovoured and should be 15.99 fl oz in size (pack of 12.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "peach", "15.99 fl oz (pack of 12)" ] }, "asin": "B007PY8M9A" }, { "task_id": "ws_B007PY8M9A_477", "instruction": "i would like a 12 pack of 16 fluid ounce bottles of zero sugar wild berry energy drinks.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "wild berry", "16 fl oz (pack of 12)" ] }, "asin": "B007PY8M9A" }, { "task_id": "ws_B07RPZHP79_478", "instruction": "i am looking for a .4 fl oz concealer that is good for dark circles and is in the shade 12.0 light sand.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "12.0 light sand (w)", "0.4 fl oz" ] }, "asin": "B07RPZHP79" }, { "task_id": "ws_B09NSF1Z7R_479", "instruction": "i am looking for blue high waist casual pants for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "blue" ] }, "asin": "B09NSF1Z7R" }, { "task_id": "ws_B09RMHDH39_480", "instruction": "i'm looking for a red hand washed tanks & camis for women.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "red" ] }, "asin": "B09RMHDH39" }, { "task_id": "ws_B00WBB0D4E_481", "instruction": "i'm looking for a cocktail mixer that is gluten free, nut free and has no artificial colors. also, choose wine freezer sangria with pack of 4.", "target_attributes": { "attributes": [ "nut free", "gluten free", "artificial colors" ], "options": [ "wine freezer sangria", "pack of 4" ] }, "asin": "B00WBB0D4E" }, { "task_id": "ws_B00WBB0D4E_482", "instruction": "i would like a non alcoholic eggnog mixer that comes in a four pack", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "eggnog", "pack of 4" ] }, "asin": "B00WBB0D4E" }, { "task_id": "ws_B07JKY5SJQ_483", "instruction": "i am looking for a medium adult sized unisex hoodie which is machine washable. pick the navy blue one.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy blue" ] }, "asin": "B07JKY5SJQ" }, { "task_id": "ws_B093ZNDMMS_484", "instruction": "i want a body wash that is dermatologist tested. it should have a cucumber and aloe scent.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "cucumber + aloe" ] }, "asin": "B093ZNDMMS" }, { "task_id": "ws_B01G5VEX3W_485", "instruction": "i want to find green tea lip gloss that comes in the color \"kiss me pink.\"", "target_attributes": { "attributes": [ "green tea" ], "options": [ "kiss me pink" ] }, "asin": "B01G5VEX3W" }, { "task_id": "ws_B08D9NK2TL_486", "instruction": "i am looking for itch relief balm for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "itch relief balm" ] }, "asin": "B08D9NK2TL" }, { "task_id": "ws_B08D9NK2TL_487", "instruction": "i am looking for a repairing cream sulfate free body washes for dry skin", "target_attributes": { "attributes": [ "sulfate free", "dry skin" ], "options": [ "repairing cream" ] }, "asin": "B08D9NK2TL" }, { "task_id": "ws_B00MRNQT8A_488", "instruction": "i would like three traditional vanity lights that are in a satin bronze finish.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "satin bronze finish", "three - light", "traditional" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_489", "instruction": "i'm looking for a three light vanity style light fixture that can hang on the wall and has chrome finish.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "chrome finish", "wall | bath sconce" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_490", "instruction": "i am looking for bronze finish chrome color vanity lights", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "chrome" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_491", "instruction": "i'm looking for a three light vanity style light fixture that can hang on the wall and has chrome finish.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "chrome finish", "wall | bath sconce" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_492", "instruction": "i would like a nine light vanity light wall sconce with chrome finish", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "chrome finish", "nine light", "wall | bath sconce" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_493", "instruction": "can i get some chandelier vanity lights with a bronze finish?", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "chandelier" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_494", "instruction": "i want to buy vanity lights which have bronze finish and the color of which is satin bronze, and with a size of nine light, while it's style should be mini-pendant.", "target_attributes": { "attributes": [ "bronze finish", "vanity light" ], "options": [ "satin bronze", "nine light", "mini-pendant" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_495", "instruction": "i need four contemporary vanity lights.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "four light", "contemporary" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_496", "instruction": "i want to get a three light, wall scone style vanity light that has a brushed nickel finish.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "brushed nickel finish", "three light", "wall | bath sconce" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B00MRNQT8A_497", "instruction": "i need to buy a vanity light in brushed nickel with two lights.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "brushed nickel", "two light" ] }, "asin": "B00MRNQT8A" }, { "task_id": "ws_B018ZL0820_498", "instruction": "i'd like to find a 2-pack of 16 ounce bags of chocolate covered cherries. ideally the flavors will be variety white and imperial.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "variety white & imperial", "16 ounce (pack of 2)" ] }, "asin": "B018ZL0820" }, { "task_id": "ws_B018ZL0820_499", "instruction": "i am looking a valentine day chocolate gift basket of imperial chocolate flavour size :8 ounce (pack of 2)", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [ "imperial chocolate", "8 ounce (pack of 2)" ] }, "asin": "B018ZL0820" }, { "task_id": "ws_B018ZL0820_500", "instruction": "i am looking for cherry republic brand chocolate covered cherries, 2 of the 8 ounce packages.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "8 ounce (pack of 2)" ] }, "asin": "B018ZL0820" }, { "task_id": "ws_B07C55SZW3_501", "instruction": "i looking a gluten free peanut butter dark chocolate", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peanut butter dark chocolate" ] }, "asin": "B07C55SZW3" }, { "task_id": "ws_B01N5T2UGJ_502", "instruction": "i'm looking for lumbar support adjustable height wheel chair without arms rest. also tan color one.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "tan" ] }, "asin": "B01N5T2UGJ" }, { "task_id": "ws_B07HQS5JN1_503", "instruction": "i need usb cables that have fast charging capabilities.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B07HQS5JN1" }, { "task_id": "ws_B07HQS5JN1_504", "instruction": "i would like to have a usb cable with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07HQS5JN1" }, { "task_id": "ws_B09K4WJ974_505", "instruction": "i am looking for a memory foam slipper that is suitable for 5-6 size leg . and i would go for white color", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "white", "5-6" ] }, "asin": "B09K4WJ974" }, { "task_id": "ws_B09JCBWVZV_506", "instruction": "i need a high power amplifier adapter for home audio.", "target_attributes": { "attributes": [ "power amplifier", "high power" ], "options": [ "amp-power adapter" ] }, "asin": "B09JCBWVZV" }, { "task_id": "ws_B09N72B4GK_507", "instruction": "i am looking for a height adjustable, steel frame desks & desk sets of blue color.", "target_attributes": { "attributes": [ "height adjustable", "steel frame" ], "options": [] }, "asin": "B09N72B4GK" }, { "task_id": "ws_B08NK4SHXY_508", "instruction": "i need a fluoride free toothpaste that ensures fresh breath and removes stain. pick a purple colored one.", "target_attributes": { "attributes": [ "fluoride free", "fresh breath" ], "options": [ "purple" ] }, "asin": "B08NK4SHXY" }, { "task_id": "ws_B00GYDBWD6_509", "instruction": "i am looking for some eye shadow in the midnight sky shade.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "midnight sky" ] }, "asin": "B00GYDBWD6" }, { "task_id": "ws_B07CQB2FZK_510", "instruction": "i will need a high speed coaxial cable made of aluminum alloy. pick the black one.", "target_attributes": { "attributes": [ "high speed", "aluminum alloy" ], "options": [ "dual - black" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_511", "instruction": "look for a high speed coaxial cable that is about 1 foot. three per pack would be nice.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1ft - 3 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_512", "instruction": "i want for a video cables a coaxial cable and aluminum alloy and to be a usa made trishield black", "target_attributes": { "attributes": [ "coaxial cable", "aluminum alloy" ], "options": [ "usa made trishield - black" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_513", "instruction": "i need a high speed coaxial cable that is 85 feet in size.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "85ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_514", "instruction": "i'm looking for 210ft of high speed rg-6 coaxial cable that is ready to bury with an orange weather boot.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "direct burial w | weather boot - orange", "210ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_515", "instruction": "i would like a three pack of 4 ft quad rg11 weather boot high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "quad rg11 aerial w | weather boot - black", "4ft - 3 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_516", "instruction": "look for a high speed coaxial cable that is about 1 foot. three per pack would be nice.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1ft - 3 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_517", "instruction": "can you find me a two pack coaxial cable that's high speed, made of aluminum alloy, and is 15 feet long?", "target_attributes": { "attributes": [ "high speed", "aluminum alloy" ], "options": [ "15ft - 2 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_518", "instruction": "i'm looking for coaxial cable for video accessories for electronics.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "burial 3ghz rg11, weather seal - orange" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_519", "instruction": "i'm looking for high speed net it has quashield-black material type.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "quadshield - black" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_520", "instruction": "i need to buy a twenty foot high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "20 ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_521", "instruction": "i am looking for 2 pack of 20ft long quadshield solid copper black color indoor and outdoor coaxial cable", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "quadshield solid copper - black", "20ft - 2 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_522", "instruction": "i am looking for a high speed coaxial cable that is 135 ft long.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "135ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_523", "instruction": "i'm looking for coaxial cable for video accessories it can intall at any", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "3ghz dual w | ground - black" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_524", "instruction": "i need a high speed coaxial cable that is 50ft.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "50 ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_525", "instruction": "i'm looking for 6ft - 3packs of high speed coaxial cable with aluminum alloy.", "target_attributes": { "attributes": [ "high speed", "coaxial cable", "aluminum alloy" ], "options": [ "6ft - 3 pack" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_526", "instruction": "i would like a 10 foot long copper coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "copper, weather boot - white", "10ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_527", "instruction": "buy a 20ft video cable that has aluminum alloy.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "20ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_528", "instruction": "i am looking for a high speed 150 ft coaxial cable", "target_attributes": { "attributes": [ "high speed" ], "options": [ "150 ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_529", "instruction": "i would like a 3 ft long copper coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "copper, weather boot - black", "3ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_530", "instruction": "i am looking for a 200ft coaxial cable black in color. indoor/outdoor use.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "3ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_531", "instruction": "i am looking for a 10 foot high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "10ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_532", "instruction": "i'm looking for a high speed 180 foot coaxial cable with a trishield nickel-plated fitting.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "trishield nickel-plated fitting -black", "180ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B07CQB2FZK_533", "instruction": "i would like a 200 foot long coaxial cable made of burial 3ghz rg6..", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "burial 3ghz rg6, directv fitting - orang...", "200ft" ] }, "asin": "B07CQB2FZK" }, { "task_id": "ws_B003Z4UKGM_534", "instruction": "i'm looking for a oil free cleansers for acne spot.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "acne spot" ] }, "asin": "B003Z4UKGM" }, { "task_id": "ws_B093YT5TL6_535", "instruction": "i want a laundry bag for my blouse and hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YT5TL6" }, { "task_id": "ws_B09KDLJV6C_536", "instruction": "i intrested natural flavors pure chocolate extract gluten free 8fl oz", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "pure chocolate extract", "8 fl oz (pack of 1)" ] }, "asin": "B09KDLJV6C" }, { "task_id": "ws_B00VBNQJLY_537", "instruction": "i'm looking for a sd card with h1080p hd resolution. also, choose single style 32 gb capacity.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "32gb", "single" ] }, "asin": "B00VBNQJLY" }, { "task_id": "ws_B00VBNQJLY_538", "instruction": "i would like a 25 pack of 256gig high speed sd cards.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "256gb", "25-pack" ] }, "asin": "B00VBNQJLY" }, { "task_id": "ws_B081DFZRPX_539", "instruction": "i am looking for a high performance usb flash drive. pick a gold one.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "gold" ] }, "asin": "B081DFZRPX" }, { "task_id": "ws_B085D4W8C7_540", "instruction": "i am looking for a wood finish posters for my living room. and i would go for 30 x 40 size", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "30 x 40" ] }, "asin": "B085D4W8C7" }, { "task_id": "ws_B085D4W8C7_541", "instruction": "i need a bubble bath sticker that is ready to hang.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "24 x 30" ] }, "asin": "B085D4W8C7" }, { "task_id": "ws_B00451W378_542", "instruction": "i would like a non-dairy coffee creamer that is the cinnamon vanilla cream flavor and that comes in a pack of three 150 single servings.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "cinnamon vanilla cream", "box of 150 singles (pack of 3)" ] }, "asin": "B00451W378" }, { "task_id": "ws_B07536HD18_543", "instruction": "i'm looking for a 19\" neck 38\" sleeve classic fit dress shirts for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "19\" neck 38\" sleeve" ] }, "asin": "B07536HD18" }, { "task_id": "ws_B07BGYT1WD_544", "instruction": "i need a non gmo salad topper with glazed pecans.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B07BGYT1WD" }, { "task_id": "ws_B07DFY4Z39_545", "instruction": "i want red shears that are stainless steel and are 5.5 inches long.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "red", "5.5 inches" ] }, "asin": "B07DFY4Z39" }, { "task_id": "ws_B08K756ZGR_546", "instruction": "i am looking for gold plated rca cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [] }, "asin": "B08K756ZGR" }, { "task_id": "ws_B08K756ZGR_547", "instruction": "i am looking for lightning to rca cable audio aux adapter, stereo y splitter adapter with gold plated and plug play", "target_attributes": { "attributes": [ "gold plated", "plug play", "easy use" ], "options": [] }, "asin": "B08K756ZGR" }, { "task_id": "ws_B09NC8PLND_548", "instruction": "i need a loose fit blouse that is green and in an xx-large.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "a-green", "xx-large" ] }, "asin": "B09NC8PLND" }, { "task_id": "ws_B0086GDPD4_549", "instruction": "i am looking for a 5x long sleeve casual button-down shirts for men.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "5x" ] }, "asin": "B0086GDPD4" }, { "task_id": "ws_B0086GDPD4_550", "instruction": "i am looking for medium size long sleeve orange color easy care shirt", "target_attributes": { "attributes": [ "easy care", "long sleeve" ], "options": [ "orange", "medium" ] }, "asin": "B0086GDPD4" }, { "task_id": "ws_B09NMRJZYL_551", "instruction": "i'm looking for a intel core i5 desktops with 32gb ram | 1tb ssd size.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "32gb ram | 1tb ssd" ] }, "asin": "B09NMRJZYL" }, { "task_id": "ws_B098TCLMH7_552", "instruction": "i want hair extensions that is easy to apply. the size should be 20 inches long.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "20 inch#" ] }, "asin": "B098TCLMH7" }, { "task_id": "ws_B003VTHYK6_553", "instruction": "i am looking for a 1000 count french vanilla coffee creamer that is non-dairy.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "french vanilla", "1000 count" ] }, "asin": "B003VTHYK6" }, { "task_id": "ws_B08R6Q7XBJ_554", "instruction": "i need stainless steel tongue cleaners to rid of bad breath.", "target_attributes": { "attributes": [ "stainless steel", "bad breath" ], "options": [] }, "asin": "B08R6Q7XBJ" }, { "task_id": "ws_B08WJ8BYXT_555", "instruction": "i would like to order a tom and jerry 4xlarge sweatshirt . the material should be royal blue polyester cotton.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "royal blue", "4x-large" ] }, "asin": "B08WJ8BYXT" }, { "task_id": "ws_B08LPBLZD4_556", "instruction": "i am looking for an 8 gb ram mini computer with 256 ssd with intel core and dual band wifi. also, pick one with a 1 tb hdd.", "target_attributes": { "attributes": [ "dual band", "intel core" ], "options": [ "8gb ram 256gb ssd 1tb hdd" ] }, "asin": "B08LPBLZD4" }, { "task_id": "ws_B08LPBLZD4_557", "instruction": "i need an intel core i7 desktop that has 32 gb of ram and 256 ssd.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7-8550u ddr4", "32gb ram+256gb ssd" ] }, "asin": "B08LPBLZD4" }, { "task_id": "ws_B08LPBLZD4_558", "instruction": "i want a baieyu mini computer with intel core i7-8550u ddr4.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7-8550u ddr4" ] }, "asin": "B08LPBLZD4" }, { "task_id": "ws_B08LPBLZD4_559", "instruction": "i am looking for dual band computer windows in 16gb ram 512 ssd", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B08LPBLZD4" }, { "task_id": "ws_B09SQ68L4N_560", "instruction": "i am looking for a teeth whitening toothbrush with silicone brush head. it should be in pink color.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "pink" ] }, "asin": "B09SQ68L4N" }, { "task_id": "ws_B09J98XC79_561", "instruction": "i need a peaky blinder season 1 poster mural which is 36x54in .should be in a wood frame and easy to hang.", "target_attributes": { "attributes": [ "ready hang", "wood frame" ], "options": [ "poster mural 36x54 in." ] }, "asin": "B09J98XC79" }, { "task_id": "ws_B08S6X7G8B_562", "instruction": "i want a tempered glass screen protector that is compatible with an apple ipad.", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [] }, "asin": "B08S6X7G8B" }, { "task_id": "ws_B098NB1V2X_563", "instruction": "i want purchase a long sleev daily wear hand wash denim short having elastic waist and colour should be blue 4", "target_attributes": { "attributes": [ "hand wash", "long sleeve", "elastic waist", "daily wear" ], "options": [ "blue 4" ] }, "asin": "B098NB1V2X" }, { "task_id": "ws_B09QQK4HHH_564", "instruction": "i need a 5x large tracksuit that is long sleeve and that is blue.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "3-blue", "5x-large" ] }, "asin": "B09QQK4HHH" }, { "task_id": "ws_B08LLBW8ZC_565", "instruction": "i am looking for one pack of dental picks for fresh breath that are in a citrus flavor.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [ "citrus", "1 pack" ] }, "asin": "B08LLBW8ZC" }, { "task_id": "ws_B095P581S3_566", "instruction": "i want to find a pair of blue women's walking shoes with memory foam in a size 8.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "z05-blue", "8" ] }, "asin": "B095P581S3" }, { "task_id": "ws_B09Q5XPMHB_567", "instruction": "i want faux fur slippers with arch support. choose the one that is red.", "target_attributes": { "attributes": [ "faux fur", "arch support" ], "options": [ "a-03 red" ] }, "asin": "B09Q5XPMHB" }, { "task_id": "ws_B08NWJHZDM_568", "instruction": "i am looking for a gift basket with margarita glasses and snacks.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08NWJHZDM" }, { "task_id": "ws_B0786DRRHQ_569", "instruction": "i need hair extensions that are 16 inches long in the color 27.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "27#", "16 inch" ] }, "asin": "B0786DRRHQ" }, { "task_id": "ws_B016OPV3GO_570", "instruction": "i need a soap that is for sensitive skin and that comes in a pack of two.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "5 ounce (pack of 2)" ] }, "asin": "B016OPV3GO" }, { "task_id": "ws_B09QCTSSMN_571", "instruction": "i'm looking for a men's red button down casual shirt that is a large slim fit.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "red", "large" ] }, "asin": "B09QCTSSMN" }, { "task_id": "ws_B09RJZ5RX7_572", "instruction": "i want to find a computer speakers that have a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B09RJZ5RX7" }, { "task_id": "ws_B09NXKWB92_573", "instruction": "i'm looking for long lasting clack teakwood jar candles.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "black teakwood" ] }, "asin": "B09NXKWB92" }, { "task_id": "ws_B07NGSSSJS_574", "instruction": "i need some toothpaste that is flouride free and is extra whitening natural mint", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "extra whitening natural mint" ] }, "asin": "B07NGSSSJS" }, { "task_id": "ws_B07NGSSSJS_575", "instruction": "i want to buy some fluoride free mixed berry flavored toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "natural mixed berry" ] }, "asin": "B07NGSSSJS" }, { "task_id": "ws_B08DVF4LF4_576", "instruction": "find me a coated steel laptop workstation desk with wood finish. it should be white.", "target_attributes": { "attributes": [ "white item", "coated steel", "wood finish" ], "options": [] }, "asin": "B08DVF4LF4" }, { "task_id": "ws_B09PD5YDC9_577", "instruction": "i'm looking for size medium men's boxer briefs with a comfortable fit. choose the multi color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "multi 2", "medium" ] }, "asin": "B09PD5YDC9" }, { "task_id": "ws_B08NPJ6Q94_578", "instruction": "i am looking for a 12 pack of gluten free almonds.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12 pack" ] }, "asin": "B08NPJ6Q94" }, { "task_id": "ws_B08PCJ5594_579", "instruction": "i am looking for a lemon scented candle made from soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "lemon" ] }, "asin": "B08PCJ5594" }, { "task_id": "ws_B08PB8643G_580", "instruction": "i am looking for bubble bee themed cupcake toppers for my daughter's birthday part decorations.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08PB8643G" }, { "task_id": "ws_B07SGR4RY9_581", "instruction": "i am looking for a wireless bluetooth earpads.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B07SGR4RY9" }, { "task_id": "ws_B08VVYNXYF_582", "instruction": "i am looking for 4 ounce (pack of 1) quality ingredients snack foods.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B08VVYNXYF" }, { "task_id": "ws_B09P3QC6DX_583", "instruction": "i'm looking for a high quality, easy to use shaving brush.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [] }, "asin": "B09P3QC6DX" }, { "task_id": "ws_B0816LBYLN_584", "instruction": "i want yellow pumps that have a rubber sole and are in a size 12.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "yellow", "12.5" ] }, "asin": "B0816LBYLN" }, { "task_id": "ws_B00267AETM_585", "instruction": "i'm looking for 8 ounce (pack of 1) oil for dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B00267AETM" }, { "task_id": "ws_B08WPLJG8N_586", "instruction": "i'm looking for gluten free herb.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B08WPLJG8N" }, { "task_id": "ws_B09Q1SBPL1_587", "instruction": "i am looking for a small short sleeves gaiters.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "small" ] }, "asin": "B09Q1SBPL1" }, { "task_id": "ws_B075CVJS1S_588", "instruction": "get me a perfume spray that has fine mist and is long lasting.", "target_attributes": { "attributes": [ "long lasting", "fine mist" ], "options": [] }, "asin": "B075CVJS1S" }, { "task_id": "ws_B09FKYM8D7_589", "instruction": "i am looking for a 84\"wx70\"h machine washable shower curtain sets with dark grey color.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "dark grey", "84\"wx70\"h" ] }, "asin": "B09FKYM8D7" }, { "task_id": "ws_B09QXFBJXL_590", "instruction": "i was looking for a loose fit sweatshirt that has short sleeves and chest pocket. i really like green color.", "target_attributes": { "attributes": [ "loose fit", "short sleeve" ], "options": [ "green" ] }, "asin": "B09QXFBJXL" }, { "task_id": "ws_B09N9YQZZ3_591", "instruction": "i am looking for white pull-out organizers with nickel finish and size must be 15\" wide.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [] }, "asin": "B09N9YQZZ3" }, { "task_id": "ws_B083R2DBPV_592", "instruction": "i need some gluten free and wild caught fish fillets in extra virgin olive oil. i will need a pack of 6 weighing 4.4 ounce.", "target_attributes": { "attributes": [ "wild caught", "gluten free" ], "options": [ "4.4 ounce (pack of 6)" ] }, "asin": "B083R2DBPV" }, { "task_id": "ws_B083R2DBPV_593", "instruction": "wild caught yellowtail fillets size: 4.4 ounce (pack of 12)", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "4.4 ounce (pack of 12)" ] }, "asin": "B083R2DBPV" }, { "task_id": "ws_B083R2DBPV_594", "instruction": "i'm looking for organic extra virgin olive oil.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "extra virgin olive oil", "4.4 ounce (pack of 1)" ] }, "asin": "B083R2DBPV" }, { "task_id": "ws_B083R2DBPV_595", "instruction": "i want to find wild caught sardine fillets packed in extra virgin olive oil. the tins should be 4.4 ounces each and i want a package of 12 tins.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "sardines evoo", "4.4 ounce (pack of 12)" ] }, "asin": "B083R2DBPV" }, { "task_id": "ws_B09FZL19KF_596", "instruction": "i am looking for the perfect girft of fruit and nuts", "target_attributes": { "attributes": [ "perfect gift" ], "options": [] }, "asin": "B09FZL19KF" }, { "task_id": "ws_B087V4J58N_597", "instruction": "i'm looking for a long lasting eau de toilette for women.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B087V4J58N" }, { "task_id": "ws_B07HHKYNX4_598", "instruction": "i need gmo free sesame seeds that come in 1.8 oz.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "1.8 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_599", "instruction": "i am looking for gmo free sesame seeds that are natural cinnamon flavor.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "natural cinnamon (indian) ground" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_600", "instruction": "i'm looking for gluten free it was contain high protein and it was healthy natural black mustard seed ground.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "natural black mustard seed ground" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_601", "instruction": "i am looking for a 0.8 ounce (pack of 1) gluten free sesame seeds", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "0.8 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_602", "instruction": "i am looking for chana masala seasoning that is gluten free", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "indian chat masala sesaoning spice" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_603", "instruction": "i need a three ounce package of ground cumin seeds that are gmo free.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "natural cumin seed ground", "3.1 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_604", "instruction": "i am looking for gluten free black rock salt made by himalayan . and i choose the 2.8 ounce pack with himalayan pink salt coarse grind", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "himalayan pink salt coarse grind", "2.8 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_605", "instruction": "i would like a 0.15 ounce pack of natural brown mustard seeds that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "natural brown mustard seed whole", "0.15 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_606", "instruction": "i'm looking for a himalayan black rock salt which is free from gmo and gluten. also, choose a pack of 1 weighting 0.8 ounce, natural turmeric minced whole.", "target_attributes": { "attributes": [ "gmo free", "gluten free" ], "options": [ "natural turmeric minced whole", "0.8 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B07HHKYNX4_607", "instruction": "i want to buy himalayan salt which is gmo free and has natural coriander seed ground flavor, and comes in pack of 1 of 0.8 ounces.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "natural coriander seed ground", "0.8 ounce (pack of 1)" ] }, "asin": "B07HHKYNX4" }, { "task_id": "ws_B0009XNWVC_608", "instruction": "i am looking for a paraben free lip gloss with vitamin e and aloe. choose the pink pearl one.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "pink pearl" ] }, "asin": "B0009XNWVC" }, { "task_id": "ws_B09KV4Y9J1_609", "instruction": "i am looking for a large tunic that is 2-pink and short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "2-pink", "large" ] }, "asin": "B09KV4Y9J1" }, { "task_id": "ws_B087GBBN1C_610", "instruction": "i looking gluten free italian ground sausage", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B087GBBN1C" }, { "task_id": "ws_B074FHTGJ3_611", "instruction": "i'm looking for 7 count (pack of 4) low sugar, low carb, & keto friendly candy & chocolate bars.", "target_attributes": { "attributes": [ "low sugar", "keto friendly", "low carb" ], "options": [ "7 count (pack of 4)" ] }, "asin": "B074FHTGJ3" }, { "task_id": "ws_B074FHTGJ3_612", "instruction": "i would like a box of 12 raspberry dream non-gmo chocolate bars.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "raspberry dream", "12 count (pack of 1)" ] }, "asin": "B074FHTGJ3" }, { "task_id": "ws_B074FHTGJ3_613", "instruction": "i would like a box of 12 raspberry dream non-gmo chocolate bars.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "raspberry dream", "12 count (pack of 1)" ] }, "asin": "B074FHTGJ3" }, { "task_id": "ws_B086PXHMSV_614", "instruction": "i need some eco friendly blackout curtains. it should be 52x45 inches in size.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "52x45in" ] }, "asin": "B086PXHMSV" }, { "task_id": "ws_B09MMCHHYP_615", "instruction": "i want a loose fit, long sleeved flannel shirt. i am xx-large in size.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "xx-large" ] }, "asin": "B09MMCHHYP" }, { "task_id": "ws_B07FD3Z753_616", "instruction": "i'd like to find a king-sized faux lather platform bed in the camel color.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "camel", "king", "bed" ] }, "asin": "B07FD3Z753" }, { "task_id": "ws_B07FD3Z753_617", "instruction": "i would like a king sized camel bed with metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "camel", "king", "bed" ] }, "asin": "B07FD3Z753" }, { "task_id": "ws_B07JFCQ32Z_618", "instruction": "i'm looking for a rubber plastic light weight 11colorful map case cover for (a1502 | a1425) macbook pro 13\" retina", "target_attributes": { "attributes": [ "light weight", "case cover" ], "options": [ "11colorful map", "(a1502 | a1425) macbook pro 13\" retina" ] }, "asin": "B07JFCQ32Z" }, { "task_id": "ws_B07JFCQ32Z_619", "instruction": "i need a light weight case cover compatible with macbook air in size a1706, a1708, a1989, a2159, mac pro 13\"2019|18. the color should be 11creative lamp.", "target_attributes": { "attributes": [ "light weight", "case cover" ], "options": [ "11creative lamp", "a1706 | a1708 | a1989 | a2159 mac pro 13\"2019 | 18" ] }, "asin": "B07JFCQ32Z" }, { "task_id": "ws_B07JFCQ32Z_620", "instruction": "i would like a a1706 good night giraffe light weight case for my laptop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "24 good night giraffe", "a1706 | a1708 | a1989 | a2159 mac pro 13\"2019 | 18" ] }, "asin": "B07JFCQ32Z" }, { "task_id": "ws_B09P1CF764_621", "instruction": "i need an easy use cocktail smoker kit for infusing cocktail, whiskey, wine, meat and salad", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09P1CF764" }, { "task_id": "ws_B09PH817FC_622", "instruction": "i want a solid wood cupboard with a modern design. pick a white one.", "target_attributes": { "attributes": [ "white finish", "solid wood" ], "options": [] }, "asin": "B09PH817FC" }, { "task_id": "ws_B09ST7RWVK_623", "instruction": "i am looking for a hair growth treatment in the color 3pc.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "3pc" ] }, "asin": "B09ST7RWVK" }, { "task_id": "ws_B09FY4NJ3J_624", "instruction": "can i get a hair salon spa beauty trolley which is easy to clean and of high quality?", "target_attributes": { "attributes": [ "high quality", "easy clean", "hair salon" ], "options": [] }, "asin": "B09FY4NJ3J" }, { "task_id": "ws_B08QVQ84FB_625", "instruction": "i need some wall mounted mirrors for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B08QVQ84FB" }, { "task_id": "ws_B01N97KZLN_626", "instruction": "i am looking for a comfertable fit 34w*331 jeans colour should be acron", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "acorn", "34w x 33l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_627", "instruction": "i'm looking for mens jeans that are slim but comfortable fitting, size 33w and 44l.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "slim", "33w x 44l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_628", "instruction": "i need slim fitting comfortable jeans that are woodburn color and in a size 31w by 40l.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "woodburn", "slim", "31w x 40l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_629", "instruction": "i am looking for rigid indigo comfortable fit men's wrangler jeans.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "rigid indigo" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_630", "instruction": "i am looking for big and tall wrangler cowboy cut, comfortable fit original jeans.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "big & tall" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_631", "instruction": "i'm looking for mens jeans that are slim but comfortable fitting, size 33w and 44l.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "slim", "33w x 44l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_632", "instruction": "i would like a pair of 44w x 30l slim fit lavon jeans that are long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "lavon", "slim", "44w x 30l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_633", "instruction": "looking for slim comfortable fit mens jean also choose colour black chocolate", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black chocolate", "slim" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B01N97KZLN_634", "instruction": "i am looking for wrangler mens 13mwz cowboy cut , comfortable fit (big & tall ) jean with size 30w x36i", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "big & tall", "30w x 36l" ] }, "asin": "B01N97KZLN" }, { "task_id": "ws_B094CXMSB6_635", "instruction": "i'm looking for a 1 pack of paraben free deodorant.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "1 pack" ] }, "asin": "B094CXMSB6" }, { "task_id": "ws_B07GVB34N6_636", "instruction": "i am looking for 22\u201dx 22 double sided throw pillow cases for my living room. choose multi 02 color.", "target_attributes": { "attributes": [ "double sided", "living room" ], "options": [ "multi 02", "22\"x22\"" ] }, "asin": "B07GVB34N6" }, { "task_id": "ws_B09DLB7W2D_637", "instruction": "i need gold cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold" ] }, "asin": "B09DLB7W2D" }, { "task_id": "ws_B09PYV6B4B_638", "instruction": "i am looking for a silver quad core tablets.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "silver" ] }, "asin": "B09PYV6B4B" }, { "task_id": "ws_B07G7G5C4V_639", "instruction": "i want some non gmo organic tomato powder. i will need a 1 pound packet.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07G7G5C4V" }, { "task_id": "ws_B07GRT6GPS_640", "instruction": "i am looking for peach coloured zebra roller blinds for my living room which are easy to install and should be w57xh55(inch) in size.", "target_attributes": { "attributes": [ "living room" ], "options": [ "03.peach", "w57 x h55 (inch)" ] }, "asin": "B07GRT6GPS" }, { "task_id": "ws_B07GRT6GPS_641", "instruction": "i need foiresoft basic, white color, w 28 x h 55 inch zebra roller blinds", "target_attributes": { "attributes": [ "easy install" ], "options": [ "01.white" ] }, "asin": "B07GRT6GPS" }, { "task_id": "ws_B09NY92KRC_642", "instruction": "i need long lasting tooth paste with natural ingredients to remove bad breath, pick a tooth whitening one.", "target_attributes": { "attributes": [ "long lasting", "natural ingredients", "bad breath" ], "options": [ "tooth whitening" ] }, "asin": "B09NY92KRC" }, { "task_id": "ws_B07Y2JQP93_643", "instruction": "i am looking for whitening face sheet mask which is dermatologically tested and alcohol free with natural ingredients .which is suitable for all skin types procure rosacare soothing sheet face mask pack of 1 gel preferable.", "target_attributes": { "attributes": [ "hyaluronic acid", "coconut oil", "natural ingredients" ], "options": [ "gel 1 pack" ] }, "asin": "B07Y2JQP93" }, { "task_id": "ws_B078Z151Y6_644", "instruction": "i want a solid wood platform bed with box spring. pick one in dark brown.", "target_attributes": { "attributes": [ "box spring", "solid wood" ], "options": [ "dark brown" ] }, "asin": "B078Z151Y6" }, { "task_id": "ws_B09MHKJHLB_645", "instruction": "i need a winter warm hoodie with long sleeves. it should be white in color.", "target_attributes": { "attributes": [ "winter warm", "long sleeve" ], "options": [ "white" ] }, "asin": "B09MHKJHLB" }, { "task_id": "ws_B09MHKJHLB_646", "instruction": "looking for a fleece hoodie oversized size x-large long sleeve for teen girls womens in brown", "target_attributes": { "attributes": [ "long sleeve", "teen girls" ], "options": [ "brown-e", "x-large" ] }, "asin": "B09MHKJHLB" }, { "task_id": "ws_B08N424KPN_647", "instruction": "i want to buy a birthday cake topper.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B08N424KPN" }, { "task_id": "ws_B082L5GRHS_648", "instruction": "i'm looking for a flat black vanity light that comes with glass shades.", "target_attributes": { "attributes": [ "vanity light", "glass shade" ], "options": [ "flat black", "1-light" ] }, "asin": "B082L5GRHS" }, { "task_id": "ws_B082934G44_649", "instruction": "i need a pink toddler bed that is height adjustable and is in the size 180x76-96 cm.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "pink", "180x76-96cm" ] }, "asin": "B082934G44" }, { "task_id": "ws_B082934G44_650", "instruction": "i'd like to find a pink crib safety barrier that features a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "pink" ] }, "asin": "B082934G44" }, { "task_id": "ws_B088219FP7_651", "instruction": "i'm looking for 3-wall vanity light.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "3-light" ] }, "asin": "B088219FP7" }, { "task_id": "ws_B07HHMNFP1_652", "instruction": "i need 1 pack of gluten free natural fennel seed ground that has natural garlic minced whole", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "0.4 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_653", "instruction": "i need a 1.9 oz jar of ground mustard seed that is gmo free.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "natural yellow mustard seed ground", "1.9 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_654", "instruction": "i want a 0.15 ounce bottle of gmo free himalayan pink salt with a medium grind.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "himalayan pink salt medium grind", "0.15 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_655", "instruction": "i am looking for gluten free organic bean chili rajma indian seasoning spice that is gmo free.", "target_attributes": { "attributes": [ "gmo free", "gluten free" ], "options": [ "organic bean chili rajma seasoning" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_656", "instruction": "i am looking for a gluten free fennel seed with no gmo. also choose natural mint leaf whole flavor and 2.4 ounce (pack of 1) size.", "target_attributes": { "attributes": [ "gmo free", "gluten free" ], "options": [ "natural mint leaf whole" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_657", "instruction": "i'm looking for a ground natural fennel seed which is free from bpa, gmo, fat and gluten. also choose a pack of 1 weighting 2.8 ounce with natural kebab seasoning one.", "target_attributes": { "attributes": [ "bpa free", "gmo free", "fat free", "gluten free" ], "options": [ "natural chicken kebab seasoning", "2.8 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_658", "instruction": "i would like a 1.7 ounce bottle of natural curry leaf spice that is gmo free.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "natural curry leaf powder ground", "1.7 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_659", "instruction": "i am interested in buying ground seeds which are gmo free, and fat free which have himalayan pink salt fine grind flavor and are in pack of 1 of 2.6 ounce.", "target_attributes": { "attributes": [ "gmo free", "fat free" ], "options": [ "himalayan pink salt fine grind", "2.6 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_660", "instruction": "i want a 2.6 ounce bottle of himalayan pink salt of a medium grind that is gmo free.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "himalayan pink salt medium grind", "2.6 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_661", "instruction": "i would like sesame seeds that are gluten free and ginger flavored as well as being .8 oz", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "natural ginger minced whole" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B07HHMNFP1_662", "instruction": "i am interested in gmo free sesame seeds that have indian rock sugar and are 2.8 ounces", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "indian rock sugar whole", "2.8 ounce (pack of 1)" ] }, "asin": "B07HHMNFP1" }, { "task_id": "ws_B09JCLQ293_663", "instruction": "i need a large log sleeve sweatshirt for daily use. i would prefer z08 red color", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "z08 red", "large" ] }, "asin": "B09JCLQ293" }, { "task_id": "ws_B09BJDLWDW_664", "instruction": "i want to buy a bed frame that requires assembly and is white and full size.", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "white (storage)", "full" ] }, "asin": "B09BJDLWDW" }, { "task_id": "ws_B0876Z82WY_665", "instruction": "i want to get a dye kit for my hair.", "target_attributes": { "attributes": [ "hair dye" ], "options": [] }, "asin": "B0876Z82WY" }, { "task_id": "ws_B09SD1SDDM_666", "instruction": "help me purchase a blue men's shorts that is machine washable and its size is 38.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue", "38" ] }, "asin": "B09SD1SDDM" }, { "task_id": "ws_B07SXSTQ6Y_667", "instruction": "i need some area rugs for the living room that are ivory and grey that are 2'3\" by 12'/", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory | grey", "2'3\" x 12'" ] }, "asin": "B07SXSTQ6Y" }, { "task_id": "ws_B096XLV4BH_668", "instruction": "i want to find a small, sky-blue summer dress that i can wear every day.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "e-1 sky blue", "small" ] }, "asin": "B096XLV4BH" }, { "task_id": "ws_B09JZ58VGS_669", "instruction": "i am trying wallscone light fixture i can use as a reading light in my living room. pick out one that is amber colored.", "target_attributes": { "attributes": [ "light fixture", "living room" ], "options": [] }, "asin": "B09JZ58VGS" }, { "task_id": "ws_B09QRXFB5Z_670", "instruction": "i am looking for a white classic fit tanks & camis for girl.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "white" ] }, "asin": "B09QRXFB5Z" }, { "task_id": "ws_B0872HMTXX_671", "instruction": "i need a sofa made of solid wood with memory foam. it should be graphite oxford weave in color.", "target_attributes": { "attributes": [ "memory foam", "solid wood" ], "options": [ "graphite oxford weave" ] }, "asin": "B0872HMTXX" }, { "task_id": "ws_B0872HMTXX_672", "instruction": "i am looking for a mid century chair that is a sectional loveseat and is a peppercorn linen weave color.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "peppercorn linen weave", "sectional loveseat" ] }, "asin": "B0872HMTXX" }, { "task_id": "ws_B09SP144VQ_673", "instruction": "i am looking for a type a color of binoculars and comes with high power.", "target_attributes": { "attributes": [ "high power" ], "options": [ "type a" ] }, "asin": "B09SP144VQ" }, { "task_id": "ws_B098NRQHJ6_674", "instruction": "i want a twin sized bunk bed with storage space. pick a white one with slide.", "target_attributes": { "attributes": [ "twin size", "white item", "storage space" ], "options": [ "white with slide" ] }, "asin": "B098NRQHJ6" }, { "task_id": "ws_B098NRQHJ6_675", "instruction": "i am looking for twin size twin over pull out bunk bed with trundle and drawers, also grey color with slide", "target_attributes": { "attributes": [ "twin size" ], "options": [ "grey with slide", "twin over pull out bunk bed" ] }, "asin": "B098NRQHJ6" }, { "task_id": "ws_B0987MNFM6_676", "instruction": "i want easy apply nail tips. i am looking for this particular color called l6041-1", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "l6041-1" ] }, "asin": "B0987MNFM6" }, { "task_id": "ws_B08P4CV11L_677", "instruction": "i need a 32 gb usb flash drive that is a pistol color.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "pistol a", "32gb" ] }, "asin": "B08P4CV11L" }, { "task_id": "ws_B083QQ6M99_678", "instruction": "i'm looking for cruelty free tan concealers & neutralizers.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "tan" ] }, "asin": "B083QQ6M99" }, { "task_id": "ws_B08GSR75ZG_679", "instruction": "i am looking for large causal top for women's with long sleeve and elastic closure with keep comfortable and fashionable in red tie-dye color of longyuan 2022 women's.", "target_attributes": { "attributes": [ "elastic closure", "long sleeve" ], "options": [ "red tie-dye", "large" ] }, "asin": "B08GSR75ZG" }, { "task_id": "ws_B084SZZP4J_680", "instruction": "i need a travel size and easy use denture storage box with mirror", "target_attributes": { "attributes": [ "travel size", "easy use" ], "options": [] }, "asin": "B084SZZP4J" }, { "task_id": "ws_B093YSCJDM_681", "instruction": "i am looking for travel laundry bag for underwear ,bra lingeries", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSCJDM" }, { "task_id": "ws_B08VGJ6XW8_682", "instruction": "i'm looking for machine washable twin size electric blanket.", "target_attributes": { "attributes": [ "twin size", "machine washable" ], "options": [ "twin" ] }, "asin": "B08VGJ6XW8" }, { "task_id": "ws_B09NKLMWL6_683", "instruction": "i'm looking for a daily wear, long sleeve with high waist night gown. also, choose medium sixe red colored one.", "target_attributes": { "attributes": [ "long sleeve", "high waist", "daily wear" ], "options": [ "red", "medium" ] }, "asin": "B09NKLMWL6" }, { "task_id": "ws_B08R7MQ6BH_684", "instruction": "i need glass bottles which are leak proof. pick a pack of 40.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [] }, "asin": "B08R7MQ6BH" }, { "task_id": "ws_B09CFXLLWM_685", "instruction": "i am looking for jungle powders freeze dried watermelon powder 3.5oz and also 5oz with gmo free", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "5oz" ] }, "asin": "B09CFXLLWM" }, { "task_id": "ws_B07S5Q2Y3B_686", "instruction": "i am looking for a certified organic body butters moisturizers for dry skin.", "target_attributes": { "attributes": [ "certified organic", "dry skin" ], "options": [] }, "asin": "B07S5Q2Y3B" }, { "task_id": "ws_B007JV7EUM_687", "instruction": "i'm looking for 1600 watt high power bass surround stereo sound component subwoffers.", "target_attributes": { "attributes": [ "high power", "stereo sound" ], "options": [ "1600 watts" ] }, "asin": "B007JV7EUM" }, { "task_id": "ws_B007JV7EUM_688", "instruction": "i would like a 15 inch 600 watt speaker with a 2 inch dual voice coil in stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "600 watts", "15-inch", "2-inch dual voice coil 4-ohm" ] }, "asin": "B007JV7EUM" }, { "task_id": "ws_B007JV7EUM_689", "instruction": "i am looking for a high powered 12 inch car subwoofer system.", "target_attributes": { "attributes": [ "high power" ], "options": [ "12-inch" ] }, "asin": "B007JV7EUM" }, { "task_id": "ws_B007JV7EUM_690", "instruction": "i would like a 15 inch 600 watt speaker with a 2 inch dual voice coil in stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "600 watts", "15-inch", "2-inch dual voice coil 4-ohm" ] }, "asin": "B007JV7EUM" }, { "task_id": "ws_B09FDPV25C_691", "instruction": "i need a i-blue color sleeved pullover sweater of 5x-large size. and it should be machine washable", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "i-blue", "5x-large" ] }, "asin": "B09FDPV25C" }, { "task_id": "ws_B08TVTGM12_692", "instruction": "i need a high gloss wall plate cover. pick a single toggle one.", "target_attributes": { "attributes": [ "high gloss" ], "options": [ "single toggle" ] }, "asin": "B08TVTGM12" }, { "task_id": "ws_B08QJLH4J5_693", "instruction": "i am looking for a wireless bluetooth speaker bundle. look for black color, please.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B08QJLH4J5" }, { "task_id": "ws_B09PYRDRR8_694", "instruction": "i'm looking for leather sole black color loafers pumps for women high chunky heels, size 8.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "black", "8" ] }, "asin": "B09PYRDRR8" }, { "task_id": "ws_B09QPRTV1M_695", "instruction": "i need straight leg and fleece lined chef pants. it should be gray in color.", "target_attributes": { "attributes": [ "straight leg", "fleece lined" ], "options": [ "gray" ] }, "asin": "B09QPRTV1M" }, { "task_id": "ws_B08V5JQV3W_696", "instruction": "i'm looking for wireless bluetooth clock radios. also, choose the grey one.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "gray" ] }, "asin": "B08V5JQV3W" }, { "task_id": "ws_B08J98S99V_697", "instruction": "i need an 27 piece set of lip glosses that are fragrance free.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "27 piece set" ] }, "asin": "B08J98S99V" }, { "task_id": "ws_B00HUCGPNC_698", "instruction": "i'm looking for a 12-ounce package of blueberry harvest granola clusters that are gluten free and high in protein.", "target_attributes": { "attributes": [ "gluten free", "high protein" ], "options": [ "blueberry harvest", "12 ounce (pack of 1)" ] }, "asin": "B00HUCGPNC" }, { "task_id": "ws_B00HUCGPNC_699", "instruction": "i need a non gmo and usda organic granola cereal. i like the honey nuts and cinnamon flavor.", "target_attributes": { "attributes": [ "non gmo", "usda organic" ], "options": [ "honey nuts and cinnamon" ] }, "asin": "B00HUCGPNC" }, { "task_id": "ws_B0924DW7YM_700", "instruction": "i am looking storage basket for living room having steel frame and can clean easily at large size", "target_attributes": { "attributes": [ "easy clean", "steel frame", "living room" ], "options": [ "l" ] }, "asin": "B0924DW7YM" }, { "task_id": "ws_B098DS4CJK_701", "instruction": "i am looking for high quality full lace black hair wigs for men suffering from hair loss. it should be \u201c7x9\u201d 120% light medium density.", "target_attributes": { "attributes": [ "high quality", "hair loss" ], "options": [ "7''x9''120% light medium density" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_702", "instruction": "i am looking for a high quality toupee 120 light medium density 6x8.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "6''x8' 120%light medium density" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_703", "instruction": "i am looking for a high quality lhc full french lace mens toupee european virgin human hair bleached knots hair systen, also color is 720# very light brown with 20% gray", "target_attributes": { "attributes": [ "high quality" ], "options": [ "720# very light brown with 20% gray" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_704", "instruction": "i'm looking for a 7''x9''100%light medium density hair extension with high quality and its color should be 240# darkest brown with 40% gray.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "7''x9''100%light medium density" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_705", "instruction": "i am looking for a high quality hair piece that is medium brown", "target_attributes": { "attributes": [ "high quality" ], "options": [ "440 medium brown with 40% gray" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_706", "instruction": "you will find this men's wig brand lhc, virgin human hair 550# medium light brown with 50% gray, high quality", "target_attributes": { "attributes": [ "high quality" ], "options": [ "550# medium light brown with 50% gray" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_707", "instruction": "i am looking for a 7''x10''100%light density high quality hairpieces", "target_attributes": { "attributes": [ "high quality" ], "options": [ "7''x10''100%light density" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_708", "instruction": "i want dark brown and high quality full french lace mens toupee.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "2# darkest brown" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B098DS4CJK_709", "instruction": "i would like a high quality hair piece that is medium brown.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "450# medium brown with 50% gray" ] }, "asin": "B098DS4CJK" }, { "task_id": "ws_B08HWT771K_710", "instruction": "i am looking for a silver galaxy watch 3 45mm sm r840 women bands which is easy to install and stainless steel.", "target_attributes": { "attributes": [ "easy install", "stainless steel" ], "options": [ "silver" ] }, "asin": "B08HWT771K" }, { "task_id": "ws_B01IH8KHMW_711", "instruction": "i am looking for low carb flavor syrup that comes in a six pack of 32 ounces.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "32 ounce (6 count)" ] }, "asin": "B01IH8KHMW" }, { "task_id": "ws_B08FJ464SN_712", "instruction": "i am looking for decorative cupcake picks for my party. pick red ones.", "target_attributes": { "attributes": [ "cupcake picks", "party supplies" ], "options": [ "as shown" ] }, "asin": "B08FJ464SN" }, { "task_id": "ws_B092MH5RFM_713", "instruction": "i need a double sided shower brush with long handle. pick something in pink.", "target_attributes": { "attributes": [ "double sided", "long handle" ], "options": [ "pink" ] }, "asin": "B092MH5RFM" }, { "task_id": "ws_B07GP8JXT5_714", "instruction": "i am looking for a high performance pink color on-ear headphones.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B07GP8JXT5" }, { "task_id": "ws_B0018C5KTU_715", "instruction": "i need some shoes that are peony colored with a rubber sole and are a size 6 for kids.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "peony", "6 big kid" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_716", "instruction": "i would like a 2.5 or 3.5 in the uk kids shoe with a rubber sole. can i also get them with a black zebra shimmer.", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "black zebra shimmer", "2.5 little kid", "3.5 uk" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_717", "instruction": "i would like some girls shoes that are in a size 7 and have a watermelon print.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "spanish villa watermelon palms print", "7" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_718", "instruction": "i want to find women's black canvas shoes in a size 9. the shoes must have rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black canvas", "9" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_719", "instruction": "i'm looking for tom's classic alpargata shoes with rubber soles, in the color cabernet glitter and size 11 toddler.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "cabernet glitter nkt", "11 toddler" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_720", "instruction": "i am looking for classic alpargata of pink color having rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "pink" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_721", "instruction": "i want to find a pair of silver toddlers' toms with rubber soles. they either need to be a size 10 for us sizing or a size 3.5 for uk sizing.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "silver", "10 toddler", "3.5 uk" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B0018C5KTU_722", "instruction": "i am looking for girl alpargata with rubber sole.please choose 10 size.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "10" ] }, "asin": "B0018C5KTU" }, { "task_id": "ws_B00FBCZCWS_723", "instruction": "i'm looking for gluten free 1.4 ounce (pack of 12) bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1.4 ounce (pack of 12)" ] }, "asin": "B00FBCZCWS" }, { "task_id": "ws_B00FBCZCWS_724", "instruction": "i need to buy some gluten-free snack bars that are blueberry vanilla and cashew flavored and come in a 60 count.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry vanilla & cashew", "60 count" ] }, "asin": "B00FBCZCWS" }, { "task_id": "ws_B00FBCZCWS_725", "instruction": "im looking for gluten free kind bars in the extra dark chocolate and sea salt flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "extra dark chocolate nuts & sea salt" ] }, "asin": "B00FBCZCWS" }, { "task_id": "ws_B09PRPZMBX_726", "instruction": "i need a long lasting blush in the color a.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "a" ] }, "asin": "B09PRPZMBX" }, { "task_id": "ws_B07GQMP765_727", "instruction": "i am looming for a bags & cases for eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B07GQMP765" }, { "task_id": "ws_B07KW3KCNV_728", "instruction": "hello! order for me caraway seed savory crisps which is sugar free, high protein content and keto friendly.", "target_attributes": { "attributes": [ "keto friendly", "high protein" ], "options": [ "caraway" ] }, "asin": "B07KW3KCNV" }, { "task_id": "ws_B07D6GFNG8_729", "instruction": "i want some grass fed and low carb jerky. make sure they are original beef sticks.", "target_attributes": { "attributes": [ "grass fed", "low carb" ], "options": [ "original beef sticks" ] }, "asin": "B07D6GFNG8" }, { "task_id": "ws_B08287C795_730", "instruction": "i'm looking for a high quality girls accessories and color should be frozen elsa.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "frozen elsa" ] }, "asin": "B08287C795" }, { "task_id": "ws_B08287C795_731", "instruction": "i would like some rose gold minnie ears", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "gold minnie" ] }, "asin": "B08287C795" }, { "task_id": "ws_B07RQ8FVQJ_732", "instruction": "i am looking for hands free headphones in the color mint.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "mint" ] }, "asin": "B07RQ8FVQJ" }, { "task_id": "ws_B00D5KS0DQ_733", "instruction": "i am looking for non gmo salmon that is ready to eat. pick a 1 pack size.", "target_attributes": { "attributes": [ "ready eat", "non gmo" ], "options": [ "1 pack" ] }, "asin": "B00D5KS0DQ" }, { "task_id": "ws_B06ZXZC8DQ_734", "instruction": "i need an alcohol free hair fragrance that is island vanilla scent.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "island vanilla - pack of 1" ] }, "asin": "B06ZXZC8DQ" }, { "task_id": "ws_B07ZZRTSKM_735", "instruction": "i need a long lasting fleece jacket in regular fit. it should be sea salt in color.", "target_attributes": { "attributes": [ "long lasting", "regular fit" ], "options": [ "dc - sea salt" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_736", "instruction": "i need a fleece jacket that is regular fit size 3x in the color of sea salt.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "dc - sea salt", "3x" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_737", "instruction": "i need a fleece jacket that is regular fit size 3x in the color of sea salt.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "dc - sea salt", "3x" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_738", "instruction": "i'm looking for women jacket for regular fit and classic fit.", "target_attributes": { "attributes": [ "long lasting", "quality materials", "regular fit", "classic fit" ], "options": [ "osu - black" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_739", "instruction": "i am looking for regular fit fleece women jacket. please select vivid purple color.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "cle - vivid purple" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_740", "instruction": "i'm looking for jacket classic fit for quality materials.", "target_attributes": { "attributes": [ "long lasting", "quality materials", "regular fit", "classic fit" ], "options": [ "ark - red velvet" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_741", "instruction": "i want a fleece jacket that is in regular fit and is long lasting. choose an x-small size.", "target_attributes": { "attributes": [ "long lasting", "regular fit" ], "options": [ "x-small" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B07ZZRTSKM_742", "instruction": "i would like a large navy penn state nittany lions fleece jacket made from quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "um - collegiate navy", "large", "penn state nittany lions" ] }, "asin": "B07ZZRTSKM" }, { "task_id": "ws_B00VVHZZHO_743", "instruction": "i need a three pack of heavy duty swivel clips for my phone.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "swivel clip 3 pack" ] }, "asin": "B00VVHZZHO" }, { "task_id": "ws_B00N8KT1J0_744", "instruction": "i'm looking for gluten free and low calorie tasty apple strawberry flavored apple sauce snacks- 3.2 ounce (pack of 4)", "target_attributes": { "attributes": [ "gluten free", "low calorie" ], "options": [ "apple strawberry" ] }, "asin": "B00N8KT1J0" }, { "task_id": "ws_B09JNXFRTF_745", "instruction": "i'm looking for blush palette that is easy to carry, long lasting and easy to apply. also, look for color a one", "target_attributes": { "attributes": [ "easy apply", "easy carry", "long lasting" ], "options": [ "a" ] }, "asin": "B09JNXFRTF" }, { "task_id": "ws_B09CGHW1CP_746", "instruction": "i am looking for 96\"w x 72\"h roller shades of gray color and it is east to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "gray", "96\"w x 72\"h" ] }, "asin": "B09CGHW1CP" }, { "task_id": "ws_B0894STBLG_747", "instruction": "i need matcha and green tea bags that are organics and are 36 count.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "matcha + green tea", "36 count (pack of 1)" ] }, "asin": "B0894STBLG" }, { "task_id": "ws_B0894STBLG_748", "instruction": "looking for iced tea bags pu'erh tea bags certified organic, flavor darjeeling, pack of 1 with 20 count", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "darjeeling", "20 count (pack of 1)", "iced tea bags" ] }, "asin": "B0894STBLG" }, { "task_id": "ws_B0894STBLG_749", "instruction": "(i need some usda certified organic green tea and matcha.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "matcha + green tea" ] }, "asin": "B0894STBLG" }, { "task_id": "ws_B0894STBLG_750", "instruction": "looking for iced tea bags pu'erh tea bags certified organic, flavor darjeeling, pack of 1 with 20 count", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "darjeeling", "20 count (pack of 1)", "iced tea bags" ] }, "asin": "B0894STBLG" }, { "task_id": "ws_B0894STBLG_751", "instruction": "i'm looking for certified organic for tea bags for peppermint leaf.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "peppermint leaf" ] }, "asin": "B0894STBLG" }, { "task_id": "ws_B07DY9LLR7_752", "instruction": "i want to find a set of 24 blue jars that are bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "blue", "24 jars" ] }, "asin": "B07DY9LLR7" }, { "task_id": "ws_B07DY9LLR7_753", "instruction": "i am looking for a blue leak proof bags & cases.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "blue" ] }, "asin": "B07DY9LLR7" }, { "task_id": "ws_B07DY9LLR7_754", "instruction": "i want bpa free and silver plastic container jars with black flat top lids.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "silver" ] }, "asin": "B07DY9LLR7" }, { "task_id": "ws_B078HW45S6_755", "instruction": "i want some low rise active shorts that are in a medium and are black charcoal colored.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "2pk - black charcoal", "medium" ] }, "asin": "B078HW45S6" }, { "task_id": "ws_B09PH3V5XV_756", "instruction": "i am looking for a x- large long fit hoodies & sweatshirts for daily wear.", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "x-large" ] }, "asin": "B09PH3V5XV" }, { "task_id": "ws_B08ZQC14PN_757", "instruction": "i'm looking for a portable wireless bluetooth speakers made of carbon fiber with long lasting battery.", "target_attributes": { "attributes": [ "long lasting", "carbon fiber", "wireless bluetooth" ], "options": [] }, "asin": "B08ZQC14PN" }, { "task_id": "ws_B07GRX4R2W_758", "instruction": "i want to find peach-colored roller blinds for my living room that are easy to install. they need to be 58 inches in width and 64 inches in height.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "03.peach", "w58 1 | 4 x h64 (inch)" ] }, "asin": "B07GRX4R2W" }, { "task_id": "ws_B07GRX4R2W_759", "instruction": "i need w28 x h64 pastel blue roller blinds that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "07.pastel_blue", "w28 x h64 (inch) custom" ] }, "asin": "B07GRX4R2W" }, { "task_id": "ws_B07GRX4R2W_760", "instruction": "i need w28 x h64 pastel blue roller blinds that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "07.pastel_blue", "w28 x h64 (inch) custom" ] }, "asin": "B07GRX4R2W" }, { "task_id": "ws_B01MZ1MKHK_761", "instruction": "i'd like to find a pair of sage and valencia colored men's hiking boots with rubber soles. i need them in a size 15.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "sage | valencia", "15 regular us" ] }, "asin": "B01MZ1MKHK" }, { "task_id": "ws_B06Y4585VQ_762", "instruction": "i want a ready to use storage basket that saves space. pick a large bronze colored one.", "target_attributes": { "attributes": [ "space saving", "ready use" ], "options": [ "bronze" ] }, "asin": "B06Y4585VQ" }, { "task_id": "ws_B07MWT9GKP_763", "instruction": "i want a comfortable fit cowboy cut jeans. it should be black in color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "shadow black" ] }, "asin": "B07MWT9GKP" }, { "task_id": "ws_B07MWT9GKP_764", "instruction": "i want long lasting wrangler mens smoke storm cowboy cut jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "smoke storm" ] }, "asin": "B07MWT9GKP" }, { "task_id": "ws_B07MWT9GKP_765", "instruction": "looking for jean which comfortable fit and colour must be dax", "target_attributes": { "attributes": [ "machine wash", "comfortable fit" ], "options": [ "dax" ] }, "asin": "B07MWT9GKP" }, { "task_id": "ws_B07MWT9GKP_766", "instruction": "i'm looking for original fit jeans for men.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "relaxed" ] }, "asin": "B07MWT9GKP" }, { "task_id": "ws_B07ZX3R5LS_767", "instruction": "i am looking for a pendant light to go in my dining room with dimmer switch.", "target_attributes": { "attributes": [ "pendant light", "dining room" ], "options": [] }, "asin": "B07ZX3R5LS" }, { "task_id": "ws_B099Z1R6SQ_768", "instruction": "find me an 8\" sized mattress with full gel memory. it should have a white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B099Z1R6SQ" }, { "task_id": "ws_B07YXW5M4L_769", "instruction": "i want a solid wood, ivory colored bar stool. look for a 26\" metal footrest.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "26\" metal footrest" ] }, "asin": "B07YXW5M4L" }, { "task_id": "ws_B088PL8Z6F_770", "instruction": "i would like some over the toilet storage space in the color style-13.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "style-13" ] }, "asin": "B088PL8Z6F" }, { "task_id": "ws_B07RKLJFYC_771", "instruction": "i need a square shaped area rug that is easy to clean. it should be in aqua color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "aqua", "square" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_772", "instruction": "i need a 10 foot rug for my living room. make sure it's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "10 ft" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_773", "instruction": "i am looking for an oval shaped easy to clean shag area rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "oval" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_774", "instruction": "i need a 10 foot rug for my living room. make sure it's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "10 ft" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_775", "instruction": "i'm looking for marine blue colored kitchen rugs for kitchen uses.", "target_attributes": { "attributes": [ "easy clean", "spot clean" ], "options": [ "marine blue" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_776", "instruction": "i am looking for area rugs that is of size 4 ft x 4 ft and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "4 ft x 4 ft" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B07RKLJFYC_777", "instruction": "i am looking for modern easy clean luxuriously soft round area rug of size 7 ft x 7 ft", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "round", "7 ft x 7 ft" ] }, "asin": "B07RKLJFYC" }, { "task_id": "ws_B09MVN8K1P_778", "instruction": "i need a hair styling comb.", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B09MVN8K1P" }, { "task_id": "ws_B07R9666W3_779", "instruction": "i'm looking for a machine washable men's shorts with classic fit stretchable fabric and has button closure. also, choose cool grey colored one", "target_attributes": { "attributes": [ "machine wash", "classic fit", "button closure" ], "options": [ "city grey | cool grey" ] }, "asin": "B07R9666W3" }, { "task_id": "ws_B01LW2NFZX_780", "instruction": "i'm looking for a tablet with usb support and support 4g lte.", "target_attributes": { "attributes": [ "usb port", "4g lte" ], "options": [] }, "asin": "B01LW2NFZX" }, { "task_id": "ws_B09M8H129Q_781", "instruction": "i want to find an xx-large black men's pullover made of soft, warm material.", "target_attributes": { "attributes": [ "winter warm", "soft material" ], "options": [ "e04#black", "xx-large" ] }, "asin": "B09M8H129Q" }, { "task_id": "ws_B000W5MWR2_782", "instruction": "i'm looking for a highly pigmented green body paint.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "green" ] }, "asin": "B000W5MWR2" }, { "task_id": "ws_B09SCXL1K4_783", "instruction": "i need open toe wedge sandals with ankle strap. pick a black one.", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "a11 - black" ] }, "asin": "B09SCXL1K4" }, { "task_id": "ws_B09M92PLHF_784", "instruction": "i am looking for 4 pounds (pack of 1) old fashioned hard candy.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "4 pounds (pack of 1)" ] }, "asin": "B09M92PLHF" }, { "task_id": "ws_B09M92PLHF_785", "instruction": "i need two pounds of strawberry hard candy that is individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "2 pounds (pack of 1)", "strawberry" ] }, "asin": "B09M92PLHF" }, { "task_id": "ws_B09GXZZHVD_786", "instruction": "i need a square table that is easy to clean and has a steel frame. the size should be 100*60*74", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "100*60*74gao" ] }, "asin": "B09GXZZHVD" }, { "task_id": "ws_B09GXZZHVD_787", "instruction": "i would like a 70*70*74gao ijia+zhumuwen6 table cloth that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "ijia+zhumuwen6", "70*70*74gao" ] }, "asin": "B09GXZZHVD" }, { "task_id": "ws_B07F33RYBG_788", "instruction": "i'm looking for a gluten free flavor syrups.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07F33RYBG" }, { "task_id": "ws_B09LGXJY5Q_789", "instruction": "i would like some super soft throw pillow covers that are baby green and come in pack of 2.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "baby green", "16\"x 16\", pack of 2" ] }, "asin": "B09LGXJY5Q" }, { "task_id": "ws_B00BCG0OB6_790", "instruction": "i am looking for no artificial flavors or preservatives and is non-gmo healthy snacks compatible with keto, vegan, vegetarian, gluten free and low carb diets, gimme\u2019s organic roasted seaweed superfood in teriyaki flavor. pack of 12 0.17 ounce preferable.", "target_attributes": { "attributes": [ "gluten free", "low carb" ], "options": [ "teriyaki", "0.17 ounce (pack of 12)" ] }, "asin": "B00BCG0OB6" }, { "task_id": "ws_B00VEELQOA_791", "instruction": "i am looking for a wireless bluetooth speakers.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B00VEELQOA" }, { "task_id": "ws_B09CDBTMS3_792", "instruction": "iam looking a leather sole day comfort men's construction boot color also 6\" sft toe wheat", "target_attributes": { "attributes": [ "day comfort", "leather sole" ], "options": [ "6\" soft toe wheat" ] }, "asin": "B09CDBTMS3" }, { "task_id": "ws_B00ASJKXSM_793", "instruction": "i'm looking for a whitewashed media chest with a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "ella - white wash", "media chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_794", "instruction": "i would like a sahara tan five drawer dresser made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "hearst - sahara tan", "5-drawer chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_795", "instruction": "i'm looking for wood finish bronze finish furniture the color was mckinney-espresso pine.", "target_attributes": { "attributes": [ "wood finish", "bronze finish", "solid wood" ], "options": [ "mckinney - espresso pine", "5-drawer sweater chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_796", "instruction": "i want paragon black solid wood", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "paragon - black" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_797", "instruction": "i'm looking for a solid wood dresser with bronze finish. also choose 4-drawer wardrobe chest with boho chic- white washed one.", "target_attributes": { "attributes": [ "bronze finish", "solid wood" ], "options": [ "boho chic - washed white", "4-drawer wardrobe chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_798", "instruction": "i need to buy a four drawer wardrobe with a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "4-drawer wardrobe chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B00ASJKXSM_799", "instruction": "i need to buy a five drawer dresser made out of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "5-drawer chest" ] }, "asin": "B00ASJKXSM" }, { "task_id": "ws_B08C9VSFX2_800", "instruction": "i need a high quality hairpiece for men with light density. it should be in 3# dark brown color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "3# dark brown" ] }, "asin": "B08C9VSFX2" }, { "task_id": "ws_B075K5TXCL_801", "instruction": "i want a dust proof keyboard skin which is really thin. it should fit my apple wired keyboard.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "for apple wired keyboard (mb110ll | b)" ] }, "asin": "B075K5TXCL" }, { "task_id": "ws_B075K5TXCL_802", "instruction": "i am looking for an ombre pink dust proof keyboard skin", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "ombre pink" ] }, "asin": "B075K5TXCL" }, { "task_id": "ws_B009RB1UNY_803", "instruction": "i want a hand crafted gift basket for a new baby arrival event.", "target_attributes": { "attributes": [ "hand crafted", "gift basket" ], "options": [] }, "asin": "B009RB1UNY" }, { "task_id": "ws_B076JLFJSX_804", "instruction": "find for me croc flip flops size 13 women with vinyl acetate material. also neo mint almost white in color.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "neo mint almost white", "13 women | 11 men" ] }, "asin": "B076JLFJSX" }, { "task_id": "ws_B076JLFJSX_805", "instruction": "i need some white vinyl flip flops in size 8 for women.", "target_attributes": { "attributes": [ "ethylene vinyl", "vinyl acetate" ], "options": [ "white", "8 women | 6 men" ] }, "asin": "B076JLFJSX" }, { "task_id": "ws_B093BMWTPG_806", "instruction": "i am looking for a x-large hoodies & sweatshirts quality of polyester.", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "x-large" ] }, "asin": "B093BMWTPG" }, { "task_id": "ws_B08FDCTL68_807", "instruction": "i am looking for a 46.5\" solid wood for ottomans and color should be dark gray.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "dark gray", "46.5\"" ] }, "asin": "B08FDCTL68" }, { "task_id": "ws_B09PDDZ17X_808", "instruction": "i want a teeth whitening toothpaste that removes plaque stains.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09PDDZ17X" }, { "task_id": "ws_B096H133FZ_809", "instruction": "i am looking for hair cutting scissors in a storage case and should made of stainless steel.", "target_attributes": { "attributes": [ "storage case", "stainless steel", "hair cutting" ], "options": [] }, "asin": "B096H133FZ" }, { "task_id": "ws_B07NY5HTB8_810", "instruction": "i'm looking for a stainless steel pair of tweezers for hair removal.", "target_attributes": { "attributes": [ "stainless steel", "hair removal" ], "options": [] }, "asin": "B07NY5HTB8" }, { "task_id": "ws_B01DN401DK_811", "instruction": "i need an oval soft rug that is easy to clean. also, it should be in eggplant purple color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "eggplant purple", "oval" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_812", "instruction": "i am looking for a square 10 by 13 ft area rug that is easy to clean. all white in color", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "snow white", "square", "10 x 13 ft" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_813", "instruction": "i need an easy to clean lilac rug in a rectangular runner shape.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "lilac", "rectangular runner" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_814", "instruction": "i want to find an oval-shaped plush rog that is 4 feet by 4 feet and ivory colored. it needs to be easy to spot clean.", "target_attributes": { "attributes": [ "easy clean", "spot clean" ], "options": [ "ivory", "oval", "4 ft 0 x 4 ft 0" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_815", "instruction": "i need a rectangular runner that is easy to clean. pick a cherry red one.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "cherry red", "rectangular runner" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_816", "instruction": "i'm looking for shag collection area modern spot clean oval shaped rug of size 8 ft x 11 ft", "target_attributes": { "attributes": [ "spot clean" ], "options": [ "oval", "8 ft x 11 ft" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_817", "instruction": "using cocoa it's easy clean to rectangular shape room", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "cocoa", "rectangular" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_818", "instruction": "i am looking for a 7 ft 0 x 7 ft 0 spot clean area rugs", "target_attributes": { "attributes": [ "spot clean" ], "options": [ "7 ft 0 x 7 ft 0" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_819", "instruction": "i'm looking for an easy-to-clean snow-white rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "snow white" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_820", "instruction": "i'm looking for a unique loom solo solid shag collection area.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "chocolate brown", "octagon", "8 ft x 11 ft" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_821", "instruction": "i need a easy clean solo solid modern round shaped snow white plush rug of 8 ft x 8 ft size", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "snow white", "round", "8 ft 0 x 8 ft 0" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_822", "instruction": "i am looking for an easy to clean ivory colored plush area rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "ivory" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_823", "instruction": "i am looking for an octagon shaped easy to clean plush area rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "octagon" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_824", "instruction": "i am looking for 5 ft easy clean sun yellow modern plush rug square shaped", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "tuscan sun yellow", "square", "5 ft" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_825", "instruction": "i am interested in buying modern rugs which are easy to clean, and are in aqua blue color, their shape should be rectangular runner and are of a size of 7 ft x 10 ft.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "aqua blue", "rectangular runner", "7 ft x 10 ft" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_826", "instruction": "i'm looking for a snow white colored oval area rug that is easy for me to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "snow white", "oval" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_827", "instruction": "i want to buy a unique lom solo easy to clean that is in taupe color with rectangular shape", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "taupe", "rectangular" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_828", "instruction": "i'm looking for jet black rug. the size should be around 6 x 10 ft and i want it to be very easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "jet black", "2 ft 6 x 10 ft 0" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B01DN401DK_829", "instruction": "i am looking for a slate blue plush rug that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "slate blue" ] }, "asin": "B01DN401DK" }, { "task_id": "ws_B09J8FXDK6_830", "instruction": "i'm looking for a optical zoom night vision binoculars & goggles.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B09J8FXDK6" }, { "task_id": "ws_B07BQ5B2B1_831", "instruction": "i need some caffeine free fruit juice. pick a pack of 12.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "16 fl oz (pack of 12)" ] }, "asin": "B07BQ5B2B1" }, { "task_id": "ws_B07BQ5B2B1_832", "instruction": "i need a 12 pack of caffeine free nantucket nectars pomegranate cherry juice.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "pomegranate cherry", "16 fl oz (pack of 12)" ] }, "asin": "B07BQ5B2B1" }, { "task_id": "ws_B099972W26_833", "instruction": "i am looking for standing baker's racks kitchen shelf which is superior strength and durability,with universal wheelswhich is easy to move it allow for easy positioning in the kitchen, multipurpose shelves rack in gold color preferable.", "target_attributes": { "attributes": [ "easy clean", "easy assemble", "storage space" ], "options": [ "gold" ] }, "asin": "B099972W26" }, { "task_id": "ws_B0924Y8CWX_834", "instruction": "i am looking for easy to prepare and easy to use shan kashmiri rogan josh recipe and seasoning mix 1.76 oz (50g) spice powder pack of 6 in murgh cholay flavor.", "target_attributes": { "attributes": [ "easy prepare", "easy use" ], "options": [ "pack of 6" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_835", "instruction": "i'm looking for meat and vegetable flavored seasoning mix -1.76 oz (pack of 6)", "target_attributes": { "attributes": [ "easy use" ], "options": [ "meat & vegetable", "1.76 ounce (pack of 6)" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_836", "instruction": "i'm looking for a pav bhaji flavored spice powder. choose the one that comes with pack of 4 and are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pav bhaji", "pack of 4" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_837", "instruction": "i'd like to buy a three pack of one point seventy-six ounce fenugreek seasonings. make sure they're easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "1.76 ounce (pack of 3)" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_838", "instruction": "i would like a 6 pack of 2.1 ounce easy to use and prepare chicken masala.", "target_attributes": { "attributes": [ "easy prepare", "easy use" ], "options": [ "chicken masala", "2.1 ounce (pack of 6)" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_839", "instruction": "i would like two packs of chicken white korma spices that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "chicken white korma", "pack of 2" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_840", "instruction": "i am looking for easy to prepare chana masala recipe.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chana masala" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_841", "instruction": "i need a six pack of fenugreek", "target_attributes": { "attributes": [ "easy use" ], "options": [ "1.76 ounce (pack of 6)" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_842", "instruction": "i need some indian spices that are easy to use for chana masala", "target_attributes": { "attributes": [ "easy use" ], "options": [ "chana masala" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B0924Y8CWX_843", "instruction": "i'm looking for shan kashmiri rogan josh recipe and seasoning mix 1.76 oz (50g) pack of 3 easy prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "pack of 3" ] }, "asin": "B0924Y8CWX" }, { "task_id": "ws_B09QGQW4JW_844", "instruction": "i am looking for ready use, birthday cake toppers with a golf theme.", "target_attributes": { "attributes": [ "ready use", "birthday cake" ], "options": [] }, "asin": "B09QGQW4JW" }, { "task_id": "ws_B01NAOQO2B_845", "instruction": "i want tropical moringa oil & honey daily moisturiser for my natural hair and that can used for hair treatment .pick 8 ounces.", "target_attributes": { "attributes": [ "natural hair", "hair treatment" ], "options": [] }, "asin": "B01NAOQO2B" }, { "task_id": "ws_B01ESX3G50_846", "instruction": "i need a fast charging cable with usb port for an ipad. pick one in gold.", "target_attributes": { "attributes": [ "fast charging", "usb port" ], "options": [ "gold" ] }, "asin": "B01ESX3G50" }, { "task_id": "ws_B09Q3NVJNM_847", "instruction": "i am looking for a gry engineered wood for living room.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "gry" ] }, "asin": "B09Q3NVJNM" }, { "task_id": "ws_B08JTT7HJZ_848", "instruction": "i need a mother of pearl and diamond shaped sparkle glitter that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "mother of pearl", "diamond shaped" ] }, "asin": "B08JTT7HJZ" }, { "task_id": "ws_B08JTT7HJZ_849", "instruction": "i need a mother of pearl and diamond shaped sparkle glitter that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "mother of pearl", "diamond shaped" ] }, "asin": "B08JTT7HJZ" }, { "task_id": "ws_B0919MJH8G_850", "instruction": "i am looking for a blue color wireless bluetooth mouse that is plug and play.", "target_attributes": { "attributes": [ "plug play", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B0919MJH8G" }, { "task_id": "ws_B0919MJH8G_851", "instruction": "i am looking for a blue color wireless bluetooth mouse that is plug and play.", "target_attributes": { "attributes": [ "plug play", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B0919MJH8G" }, { "task_id": "ws_B09SCWP1GS_852", "instruction": "i am looking for a 9 piece hair growth herbal spray.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "9pcs" ] }, "asin": "B09SCWP1GS" }, { "task_id": "ws_B09SCWP1GS_853", "instruction": "i am looking for a 9 piece hair growth herbal spray.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "9pcs" ] }, "asin": "B09SCWP1GS" }, { "task_id": "ws_B08BLFQXRV_854", "instruction": "buy a white henley with a slim fit.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "white" ] }, "asin": "B08BLFQXRV" }, { "task_id": "ws_B08BLFQXRV_855", "instruction": "buy a white henley with a slim fit.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "white" ] }, "asin": "B08BLFQXRV" }, { "task_id": "ws_B004JRHE8Q_856", "instruction": "i'm looking for a long lasting cologne by perry ellis.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004JRHE8Q" }, { "task_id": "ws_B004JRHE8Q_857", "instruction": "i'm looking for a long lasting cologne by perry ellis.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004JRHE8Q" }, { "task_id": "ws_B093VB1HSV_858", "instruction": "i need a variety pack of keto friendly and gluten free fudge mix.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [ "variety pack" ] }, "asin": "B093VB1HSV" }, { "task_id": "ws_B093VB1HSV_859", "instruction": "i need a variety pack of keto friendly and gluten free fudge mix.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [ "variety pack" ] }, "asin": "B093VB1HSV" }, { "task_id": "ws_B001MS6PO4_860", "instruction": "i am looking for a metallic gray coat rack that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "metallic gray | black" ] }, "asin": "B001MS6PO4" }, { "task_id": "ws_B001MS6PO4_861", "instruction": "i am looking for a metallic gray coat rack that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "metallic gray | black" ] }, "asin": "B001MS6PO4" }, { "task_id": "ws_B09JZ3Q2DD_862", "instruction": "i am looking for a fleece throw that is maroon and 50\" by 60\"", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "maroon", "throw(50\"x60\")" ] }, "asin": "B09JZ3Q2DD" }, { "task_id": "ws_B09JZ3Q2DD_863", "instruction": "i am looking for a fleece throw that is maroon and 50\" by 60\"", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "maroon", "throw(50\"x60\")" ] }, "asin": "B09JZ3Q2DD" }, { "task_id": "ws_B009M4M6NE_864", "instruction": "buy me some freeze dried bananas & strawberries.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bananas & strawberries" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_865", "instruction": "i want organic freeze-dried mangoes.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "mangoes" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_866", "instruction": "i want freeze-dried fruits, about 1.5 ounces should be enough. i like blueberries but i don't want anything with gmo.", "target_attributes": { "attributes": [ "non gmo", "freeze dried" ], "options": [ "1.5 ounce (pack of 1)" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_867", "instruction": "buy me a bag of low calorie, low fat mango strips.", "target_attributes": { "attributes": [ "low calorie", "fat free" ], "options": [ "mango strips", "bag" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_868", "instruction": "buy me some freeze dried bananas & strawberries.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bananas & strawberries" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_869", "instruction": "i want a bundle of freeze-dried strawberries & bananas beets", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "beets", "strawberries 1.2 ounce & bananas 2.5 oun...", "bundle" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_870", "instruction": "i am looking for a bag of freeze dried blueberries that are chocolate and banana slice flavored. make sure to pick a non gmo and plant based product.", "target_attributes": { "attributes": [ "non gmo", "freeze dried", "plant based" ], "options": [ "chocolate banana slices", "bag" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_871", "instruction": "i am looking for non gmo, low calorie and plant based organic foods which has flavor: strawberries & corn", "target_attributes": { "attributes": [ "non gmo", "low calorie", "plant based" ], "options": [ "strawberries + corn" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_872", "instruction": "i am looking for a 1.2 ounce (pack of 4) non gmo dried berries", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "1.2 ounce (pack of 4)" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_873", "instruction": "i want freeze dried low calorie fat free dried berries size:8 ounce", "target_attributes": { "attributes": [ "freeze dried", "low calorie", "fat free" ], "options": [ "8 ounce (pack of 1)", "bundle" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_874", "instruction": "i'm looking for a 1.2 ounce bag of freeze-dried strawberries and bananas; they must suit my low-calorie, fat-free diet.", "target_attributes": { "attributes": [ "low calorie", "fat free" ], "options": [ "strawberries + bananas", "1.2 ounce (pack of 1)", "bag" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_875", "instruction": "i would like some non gmo chocolate mango slices", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "chocolate mango slices" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_876", "instruction": "i need mango strips that are non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "mango strips" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_877", "instruction": "find fat free dried berries.", "target_attributes": { "attributes": [ "fat free" ], "options": [] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_878", "instruction": "i want a bag of natierra freeze dried strawberries + apples.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + apples" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B009M4M6NE_879", "instruction": "i would like some freeze dried chocolate mango slices that are in a bundle.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "chocolate mango slices", "bundle" ] }, "asin": "B009M4M6NE" }, { "task_id": "ws_B07D7SMMX1_880", "instruction": "can you find a navy blue men's cotton heather shirt in medium that has a heart made by a figure skater.", "target_attributes": { "attributes": [ "cotton heather" ], "options": [ "navy", "men", "medium" ] }, "asin": "B07D7SMMX1" }, { "task_id": "ws_B07D7SMMX1_881", "instruction": "can you find a navy blue men's cotton heather shirt in medium that has a heart made by a figure skater.", "target_attributes": { "attributes": [ "cotton heather" ], "options": [ "navy", "men", "medium" ] }, "asin": "B07D7SMMX1" }, { "task_id": "ws_B096X55VYR_882", "instruction": "i need tv antennas that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B096X55VYR" }, { "task_id": "ws_B096X55VYR_883", "instruction": "i need tv antennas that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B096X55VYR" }, { "task_id": "ws_B07JWC2624_884", "instruction": "i need to buy a casette recorder. get the one that in style \"convert player\" with included batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "convert player" ] }, "asin": "B07JWC2624" }, { "task_id": "ws_B07JWC2624_885", "instruction": "i need to buy a casette recorder. get the one that in style \"convert player\" with included batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "convert player" ] }, "asin": "B07JWC2624" }, { "task_id": "ws_B07C2DXR19_886", "instruction": "i need a pair of big and tall, long lasting, and comfortable wrangler jeans.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "big & tall" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_887", "instruction": "i'm looking for a comfortable pair of big and tall jeans.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "big & tall" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_888", "instruction": "i need a pair of big and tall, long lasting, and comfortable wrangler jeans.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "big & tall" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_889", "instruction": "i am looking for a comfortable fit jeans for men of tan color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "tan" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_890", "instruction": "i'm searching for a mustang island colored long lasting regular fit jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "regular" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_891", "instruction": "add to my list a wrangler mens cowboy cut relaxed jeans and should be a comfortable fit.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "relaxed" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_892", "instruction": "i would like some relaxed comfortable fit jeans", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "relaxed" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B07C2DXR19_893", "instruction": "i am looking for long lasting mens jeans of woodburn color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "woodburn" ] }, "asin": "B07C2DXR19" }, { "task_id": "ws_B099VCHJ2T_894", "instruction": "i need a nail polish carrying case.", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B099VCHJ2T" }, { "task_id": "ws_B099VCHJ2T_895", "instruction": "i need a nail polish carrying case.", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B099VCHJ2T" }, { "task_id": "ws_B09PRK9BS6_896", "instruction": "i am looking for a purple butt lifting thong for women.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "purple" ] }, "asin": "B09PRK9BS6" }, { "task_id": "ws_B09PRK9BS6_897", "instruction": "i am looking for a purple butt lifting thong for women.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "purple" ] }, "asin": "B09PRK9BS6" }, { "task_id": "ws_B00BXJCFR8_898", "instruction": "i am looking to purchase a light buff and cruelty free manufactured makeup.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "light buff" ] }, "asin": "B00BXJCFR8" }, { "task_id": "ws_B00BXJCFR8_899", "instruction": "i am looking to purchase a light buff and cruelty free manufactured makeup.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "light buff" ] }, "asin": "B00BXJCFR8" }, { "task_id": "ws_B09J1ZWZX1_900", "instruction": "i would like some gray heavy duty spa chairs that look like they belong in a hair salon.", "target_attributes": { "attributes": [ "heavy duty", "hair salon" ], "options": [ "gray 2" ] }, "asin": "B09J1ZWZX1" }, { "task_id": "ws_B09J1ZWZX1_901", "instruction": "i would like some gray heavy duty spa chairs that look like they belong in a hair salon.", "target_attributes": { "attributes": [ "heavy duty", "hair salon" ], "options": [ "gray 2" ] }, "asin": "B09J1ZWZX1" }, { "task_id": "ws_B005M4G23S_902", "instruction": "i am looking for organic blueberries.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "blueberries", "1 count (pack of 1)" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_903", "instruction": "i am looking for organic blueberries.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "blueberries", "1 count (pack of 1)" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_904", "instruction": "i am looking for freeze dried in bananas and strawberries", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bananas and strawberries" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_905", "instruction": "i'm looking for a plant based, freeze dried fruits which should be usda organic and free from fat and also low in calories. also, choose a pack of 8 which weighs 1.3 ounce bundle with strawberry and pineapple flavored one.", "target_attributes": { "attributes": [ "freeze dried", "usda organic", "low calorie", "fat free", "plant based" ], "options": [ "strawberries + pineapple", "1.3 ounce (pack of 8)", "bundle" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_906", "instruction": "i'm looking for a plant based, freeze dried usda organic fruits which should be free from fat and has low calories. also, choose a pack of 4 weights 0.7 ounce bundle with mango flavored one.", "target_attributes": { "attributes": [ "freeze dried", "usda organic", "low calorie", "fat free", "plant based" ], "options": [ "mango strips", "0.7 ounce (pack of 4)", "bundle" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_907", "instruction": "i want a bag of natierra freeze-dried pineapples.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bag" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_908", "instruction": "i'm looking for non-gmo freeze dried organic dried banana chips.", "target_attributes": { "attributes": [ "non gmo", "freeze dried", "usda organic" ], "options": [ "bananas and strawberries" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B005M4G23S_909", "instruction": "i want natierra freeze-dried strawberries and mangos.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + mangos" ] }, "asin": "B005M4G23S" }, { "task_id": "ws_B09S6RYMJ7_910", "instruction": "i need an exquisite pair of 63 inch long curtains that are also machine washable.", "target_attributes": { "attributes": [ "machine washable", "exquisite workmanship" ], "options": [ "rod pocket-w 31.5 l 63" ] }, "asin": "B09S6RYMJ7" }, { "task_id": "ws_B09S6RYMJ7_911", "instruction": "i need an exquisite pair of 63 inch long curtains that are also machine washable.", "target_attributes": { "attributes": [ "machine washable", "exquisite workmanship" ], "options": [ "rod pocket-w 31.5 l 63" ] }, "asin": "B09S6RYMJ7" }, { "task_id": "ws_B09S6RYMJ7_912", "instruction": "i want to buy some machine washable curtain panels and color b006c22. it needs to have a rod pocket and be size 36 width and 84 length.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "b006c22", "rod pocket-w 36 l 84" ] }, "asin": "B09S6RYMJ7" }, { "task_id": "ws_B09S6RYMJ7_913", "instruction": "i'm looking for some machine washable window coverings with a 31 and a half inch width. they should come in color \"b006c14.\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "b006c14", "rod pocket-w 31.5 l 63" ] }, "asin": "B09S6RYMJ7" }, { "task_id": "ws_B09S6RYMJ7_914", "instruction": "i would like a machine washable window treatment that is in the color b006c33", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "b006c33" ] }, "asin": "B09S6RYMJ7" }, { "task_id": "ws_B09QM85QH6_915", "instruction": "i am looking for white solid wood bunk beds with drawers.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "white" ] }, "asin": "B09QM85QH6" }, { "task_id": "ws_B09QM85QH6_916", "instruction": "i am looking for white solid wood bunk beds with drawers.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "white" ] }, "asin": "B09QM85QH6" }, { "task_id": "ws_B09QM85QH6_917", "instruction": "can you direct me to a bunk bed that's solid wood and comes in silver? thanks", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "silver", "metal triple bunk bed with desk and shel..." ] }, "asin": "B09QM85QH6" }, { "task_id": "ws_B07CQ96G4F_918", "instruction": "order a three pack of high speed coaxial cables, please.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "5ft - 3 pack" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_919", "instruction": "i would like a black 80 foot high speed coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "rg-59, bnc to bnc brass fitting - black", "80ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_920", "instruction": "i need a high speed 3 pack of coaxial cables", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10ft - 3 pack" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_921", "instruction": "i am looking for indoor outdoor rg-6 coaxial cable of aluminum alloy and size:95ft", "target_attributes": { "attributes": [ "coaxial cable", "aluminum alloy" ], "options": [ "95ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_922", "instruction": "i'm looking for a high-speed coaxial cable that's 15 feet long. it should have a plated fitting.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "burial 3ghz rg11 ni-plated fitting - ora...", "15 ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_923", "instruction": "i'm looking for black quadshield weather boot fitting tri-shield indoor outdoor rg-6 coaxial nickel plated brass connecter 75 ohm cable of size 150ft.", "target_attributes": { "attributes": [ "high speed", "coaxial cable", "aluminum alloy" ], "options": [ "quadshield weather boot fitting - black" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_924", "instruction": "i am looking for a 50ft coaxial cable that is black.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "usa made trishield - black", "50 ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_925", "instruction": "order a three pack of high speed coaxial cables, please.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "5ft - 3 pack" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_926", "instruction": "i'm looking for a 5ft high speed coaxial cable aluminum alloy and quadshield nickel plated fitting", "target_attributes": { "attributes": [ "high speed", "coaxial cable", "aluminum alloy" ], "options": [ "quadshield nickel plated fitting - white", "5 ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_927", "instruction": "i am looking for a 3ft high speed coaxial cable made up of aluminum alloy. i need 3 pack of it.", "target_attributes": { "attributes": [ "high speed", "coaxial cable", "aluminum alloy" ], "options": [ "3ft - 3 pack" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_928", "instruction": "i need a long trishield coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "240ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_929", "instruction": "i am looking for a 25 ft f-pin-coaxial tip coaxial cable", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "25 ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_930", "instruction": "i'm looking for coaxial code for video accessories it was easy to use.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "copper, nickel plated fitting - white" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_931", "instruction": "i am looking for a 75 ohm brass connector for coaxial cable nickel . i choose 39ft size cable made with copper", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "copper, at&t directv fitting - black", "390ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_932", "instruction": "i would like a 15 ft direct burial coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "direct burial - orange", "15ft - 2 pack" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_933", "instruction": "i am looking for a white coaxial cable made of quadshield nickel plated fitting and of high speed.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "quadshield nickel plated fitting - white" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_934", "instruction": "i need an 80 feet long coaxial cable that is high speed.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "80ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_935", "instruction": "i would like a 40 foot long trishield nickel plated coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "trishield nickel-plated fitting -white", "40ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_936", "instruction": "i am looking for 140 feet of high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "140ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_937", "instruction": "i am looking for an 85 foot coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "85ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_938", "instruction": "i want a 175ft white tri-shield rg-6 coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "dual - white", "175ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_939", "instruction": "i need a 230 foot sized high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "230ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_940", "instruction": "i need a 40ft high speed coaxial cable", "target_attributes": { "attributes": [ "high speed" ], "options": [ "40 ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_941", "instruction": "i need a 220 ft high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "220ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B07CQ96G4F_942", "instruction": "i am looking for 150ft trishield rg11 aerial messenger - black type coaxial cable aluminum alloy", "target_attributes": { "attributes": [ "coaxial cable", "aluminum alloy" ], "options": [ "trishield rg11 aerial messenger - black", "150ft" ] }, "asin": "B07CQ96G4F" }, { "task_id": "ws_B09HV27SXS_943", "instruction": "i'm looking for green color 24 pack merry christmas cupcake decorations for christmas party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "green" ] }, "asin": "B09HV27SXS" }, { "task_id": "ws_B09HV27SXS_944", "instruction": "i'm looking for green color 24 pack merry christmas cupcake decorations for christmas party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "green" ] }, "asin": "B09HV27SXS" }, { "task_id": "ws_B001B3RFK8_945", "instruction": "i need a 8 fl oz lemon tea tree shampoo that has natural ingredients,", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "lemon tea", "8 fl oz (pack of 2)" ] }, "asin": "B001B3RFK8" }, { "task_id": "ws_B001B3RFK8_946", "instruction": "i need a 8 fl oz lemon tea tree shampoo that has natural ingredients,", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "lemon tea", "8 fl oz (pack of 2)" ] }, "asin": "B001B3RFK8" }, { "task_id": "ws_B095TWK6H7_947", "instruction": "i'm looking for a set of makeup brushes in the color peaceful purple to help me with my eyeshadow makeup.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "peaceful purple" ] }, "asin": "B095TWK6H7" }, { "task_id": "ws_B095TWK6H7_948", "instruction": "i'm looking for a set of makeup brushes in the color peaceful purple to help me with my eyeshadow makeup.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "peaceful purple" ] }, "asin": "B095TWK6H7" }, { "task_id": "ws_B09B4CQMRP_949", "instruction": "i'm looking for a mid-century, white queen bed frame.", "target_attributes": { "attributes": [ "mid century", "white item" ], "options": [] }, "asin": "B09B4CQMRP" }, { "task_id": "ws_B09B4CQMRP_950", "instruction": "i'm looking for a mid-century, white queen bed frame.", "target_attributes": { "attributes": [ "mid century", "white item" ], "options": [] }, "asin": "B09B4CQMRP" }, { "task_id": "ws_B081B9RX7R_951", "instruction": "i would like navy fleece slippers that are machine washable and are xx-large.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "navy fleece", "xx-large" ] }, "asin": "B081B9RX7R" }, { "task_id": "ws_B081B9RX7R_952", "instruction": "i would like navy fleece slippers that are machine washable and are xx-large.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "navy fleece", "xx-large" ] }, "asin": "B081B9RX7R" }, { "task_id": "ws_B01FUI25OU_953", "instruction": "i am looking for a low fat strawberry flavored ultra-filtered milk.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "strawberry" ] }, "asin": "B01FUI25OU" }, { "task_id": "ws_B01FUI25OU_954", "instruction": "i am looking for a low fat strawberry flavored ultra-filtered milk.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "strawberry" ] }, "asin": "B01FUI25OU" }, { "task_id": "ws_B01FUI25OU_955", "instruction": "i am looking for a low fat and gluten free classic white flavoured milk.", "target_attributes": { "attributes": [ "low fat", "gluten free" ], "options": [ "classic white" ] }, "asin": "B01FUI25OU" }, { "task_id": "ws_B01FUI25OU_956", "instruction": "i'm looking for this brand : fairlife yup! low fat, ultra-filtered milk, rich chocolate flavor, all natural flavors), 14 fl oz, (pack of 4).", "target_attributes": { "attributes": [ "low fat" ], "options": [ "rich chocolate", "14 fl oz (pack of 4)" ] }, "asin": "B01FUI25OU" }, { "task_id": "ws_B07QJDJL8J_957", "instruction": "i would like a 7 pack of 1.23 ounce gluten free barbecue chips.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "barbecue", "1.23 ounce (pack of 7)" ] }, "asin": "B07QJDJL8J" }, { "task_id": "ws_B07QJDJL8J_958", "instruction": "i would like a 7 pack of 1.23 ounce gluten free barbecue chips.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "barbecue", "1.23 ounce (pack of 7)" ] }, "asin": "B07QJDJL8J" }, { "task_id": "ws_B06X9YWQT8_959", "instruction": "i am looking for a hot buttered rum cocktail, 12.7 fl oz (pack of 1) to present as perfect gift", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "hot buttered rum" ] }, "asin": "B06X9YWQT8" }, { "task_id": "ws_B06X9YWQT8_960", "instruction": "i am looking for a hot buttered rum cocktail, 12.7 fl oz (pack of 1) to present as perfect gift", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "hot buttered rum" ] }, "asin": "B06X9YWQT8" }, { "task_id": "ws_B06X9YWQT8_961", "instruction": "show me your concentrated drink mixes with natural ingredients, i'm looking for wild ginger flavor.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "wild ginger" ] }, "asin": "B06X9YWQT8" }, { "task_id": "ws_B078WFSCMN_962", "instruction": "i want nightsky vintage wash toad & co mission ridge pants with button closure in size 33w x 32l.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "nightsky vintage wash", "33w x 32l" ] }, "asin": "B078WFSCMN" }, { "task_id": "ws_B078WFSCMN_963", "instruction": "i want nightsky vintage wash toad & co mission ridge pants with button closure in size 33w x 32l.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "nightsky vintage wash", "33w x 32l" ] }, "asin": "B078WFSCMN" }, { "task_id": "ws_B01N3KGXB8_964", "instruction": "looking for one coloring beard with coconut oil and a real black color", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "pack of 3", "real black" ] }, "asin": "B01N3KGXB8" }, { "task_id": "ws_B01N3KGXB8_965", "instruction": "looking for one coloring beard with coconut oil and a real black color", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "pack of 3", "real black" ] }, "asin": "B01N3KGXB8" }, { "task_id": "ws_B08JYGZZ8C_966", "instruction": "i am looking for camo colored women's running shorts with an elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "camo" ] }, "asin": "B08JYGZZ8C" }, { "task_id": "ws_B08JYGZZ8C_967", "instruction": "i am looking for camo colored women's running shorts with an elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "camo" ] }, "asin": "B08JYGZZ8C" }, { "task_id": "ws_B07PPH74SH_968", "instruction": "i would like a six pack of 20 inch black mix light auburn high quality hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "faux straight-black mix light auburn", "20 inch (pack of 6)" ] }, "asin": "B07PPH74SH" }, { "task_id": "ws_B07PPH74SH_969", "instruction": "i would like a six pack of 20 inch black mix light auburn high quality hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "faux straight-black mix light auburn", "20 inch (pack of 6)" ] }, "asin": "B07PPH74SH" }, { "task_id": "ws_B009D5546S_970", "instruction": "i am looking for a single pack 6.6 ounce size low calorie chocolate.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "6.6 ounce (pack of 1)" ] }, "asin": "B009D5546S" }, { "task_id": "ws_B009D5546S_971", "instruction": "i am looking for a single pack 6.6 ounce size low calorie chocolate.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "6.6 ounce (pack of 1)" ] }, "asin": "B009D5546S" }, { "task_id": "ws_B09BF2F9ST_972", "instruction": "i am looking for 20 inch natural hair extensions with a scandinavian blonde color.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "#sb scandinavian blonde", "20 inch" ] }, "asin": "B09BF2F9ST" }, { "task_id": "ws_B09BF2F9ST_973", "instruction": "i am looking for 20 inch natural hair extensions with a scandinavian blonde color.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "#sb scandinavian blonde", "20 inch" ] }, "asin": "B09BF2F9ST" }, { "task_id": "ws_B09BF2F9ST_974", "instruction": "i am looking for a color: #27 hair extensions", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#27" ] }, "asin": "B09BF2F9ST" }, { "task_id": "ws_B07QRMS7PW_975", "instruction": "i'm looking for a pair of leather soled, memory foam loafers that are red and in a size 9.", "target_attributes": { "attributes": [ "leather sole", "memory foam" ], "options": [ "red", "9" ] }, "asin": "B07QRMS7PW" }, { "task_id": "ws_B07QRMS7PW_976", "instruction": "i'm looking for a pair of leather soled, memory foam loafers that are red and in a size 9.", "target_attributes": { "attributes": [ "leather sole", "memory foam" ], "options": [ "red", "9" ] }, "asin": "B07QRMS7PW" }, { "task_id": "ws_B09LLXSGSX_977", "instruction": "i'm looking for color a recliner chair for hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "a" ] }, "asin": "B09LLXSGSX" }, { "task_id": "ws_B09LLXSGSX_978", "instruction": "i'm looking for color a recliner chair for hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "a" ] }, "asin": "B09LLXSGSX" }, { "task_id": "ws_B09LLXSGSX_979", "instruction": "i need a hydraulic recliner barber chair for hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "a" ] }, "asin": "B09LLXSGSX" }, { "task_id": "ws_B007Y8YZHU_980", "instruction": "help me find some hand crafted gourmet crab stuffed mushrooms. i need about 36 appetizers.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B007Y8YZHU" }, { "task_id": "ws_B007Y8YZHU_981", "instruction": "help me find some hand crafted gourmet crab stuffed mushrooms. i need about 36 appetizers.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B007Y8YZHU" }, { "task_id": "ws_B09R1XKN1D_982", "instruction": "i am looking for wide leg pants that are pink in a size small.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "pink", "small" ] }, "asin": "B09R1XKN1D" }, { "task_id": "ws_B09R1XKN1D_983", "instruction": "i am looking for wide leg pants that are pink in a size small.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "pink", "small" ] }, "asin": "B09R1XKN1D" }, { "task_id": "ws_B08Z74Q2L7_984", "instruction": "i need a gingko light and 20\"x20\" pillow cover that is hand painted.", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "nudes (gingko light)", "20\"x20\"" ] }, "asin": "B08Z74Q2L7" }, { "task_id": "ws_B08Z74Q2L7_985", "instruction": "i need a gingko light and 20\"x20\" pillow cover that is hand painted.", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "nudes (gingko light)", "20\"x20\"" ] }, "asin": "B08Z74Q2L7" }, { "task_id": "ws_B0869KB734_986", "instruction": "i need a 52'' x 84'' x 2 panels window curtain for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52'' x 84'' x 2 panels" ] }, "asin": "B0869KB734" }, { "task_id": "ws_B0869KB734_987", "instruction": "i need a 52'' x 84'' x 2 panels window curtain for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52'' x 84'' x 2 panels" ] }, "asin": "B0869KB734" }, { "task_id": "ws_B08P4FQWS9_988", "instruction": "i am looking for an eco friendly bookcase that has four tiers.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "4-tier" ] }, "asin": "B08P4FQWS9" }, { "task_id": "ws_B08P4FQWS9_989", "instruction": "i am looking for an eco friendly bookcase that has four tiers.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "4-tier" ] }, "asin": "B08P4FQWS9" }, { "task_id": "ws_B09T2Y3MCL_990", "instruction": "i need large pink board shorts that are a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "03-pink", "large" ] }, "asin": "B09T2Y3MCL" }, { "task_id": "ws_B09T2Y3MCL_991", "instruction": "i need large pink board shorts that are a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "03-pink", "large" ] }, "asin": "B09T2Y3MCL" }, { "task_id": "ws_B003DNL9XI_992", "instruction": "i am looking for a caffeine free raspberry ice flavored drink mix.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "raspberry ice" ] }, "asin": "B003DNL9XI" }, { "task_id": "ws_B003DNL9XI_993", "instruction": "i am looking for a caffeine free raspberry ice flavored drink mix.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "raspberry ice" ] }, "asin": "B003DNL9XI" }, { "task_id": "ws_B09Q8LFXB7_994", "instruction": "i am interested in a pink high definition portable bluetooth speaker.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "pink" ] }, "asin": "B09Q8LFXB7" }, { "task_id": "ws_B09Q8LFXB7_995", "instruction": "i am interested in a pink high definition portable bluetooth speaker.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "pink" ] }, "asin": "B09Q8LFXB7" }, { "task_id": "ws_B06XGR5NDY_996", "instruction": "i'm looking for 36 ounce fragrance free camile beckman", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "36 ounce" ] }, "asin": "B06XGR5NDY" }, { "task_id": "ws_B06XGR5NDY_997", "instruction": "i'm looking for 36 ounce fragrance free camile beckman", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "36 ounce" ] }, "asin": "B06XGR5NDY" }, { "task_id": "ws_B06XGR5NDY_998", "instruction": "i'm looking for bathing free accessories for fragrance free.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "full relaxation" ] }, "asin": "B06XGR5NDY" }, { "task_id": "ws_B07VMKMY8G_999", "instruction": "i'm looking for rose gold hair dye in a 70 ml bottle.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "70 ml" ] }, "asin": "B07VMKMY8G" }, { "task_id": "ws_B07VMKMY8G_1000", "instruction": "i'm looking for rose gold hair dye in a 70 ml bottle.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "70 ml" ] }, "asin": "B07VMKMY8G" }, { "task_id": "ws_B09RVVYVPX_1001", "instruction": "i need a wall mounted floating tv stand.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "a" ] }, "asin": "B09RVVYVPX" }, { "task_id": "ws_B09RVVYVPX_1002", "instruction": "i need a wall mounted floating tv stand.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "a" ] }, "asin": "B09RVVYVPX" }, { "task_id": "ws_B07PMV8LZ3_1003", "instruction": "buy me a machine washable button down shirt in 3x large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "3x-large" ] }, "asin": "B07PMV8LZ3" }, { "task_id": "ws_B07PMV8LZ3_1004", "instruction": "buy me a machine washable button down shirt in 3x large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "3x-large" ] }, "asin": "B07PMV8LZ3" }, { "task_id": "ws_B09FXG949K_1005", "instruction": "i need some skin care tools for dark circles with xiuyan jade.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "xiuyan jade" ] }, "asin": "B09FXG949K" }, { "task_id": "ws_B09FXG949K_1006", "instruction": "i need some skin care tools for dark circles with xiuyan jade.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "xiuyan jade" ] }, "asin": "B09FXG949K" }, { "task_id": "ws_B075FCVZ9J_1007", "instruction": "i am looking for a table and chair set that is white and easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B075FCVZ9J" }, { "task_id": "ws_B075FCVZ9J_1008", "instruction": "i am looking for a table and chair set that is white and easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B075FCVZ9J" }, { "task_id": "ws_B08C7BGKF4_1009", "instruction": "i am looking for a sugar free energy drink of zero ultra flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "zero ultra" ] }, "asin": "B08C7BGKF4" }, { "task_id": "ws_B08C7BGKF4_1010", "instruction": "i am looking for a sugar free energy drink of zero ultra flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "zero ultra" ] }, "asin": "B08C7BGKF4" }, { "task_id": "ws_B000EP8D7I_1011", "instruction": "i'm looking for a pair of classic brown, long lasting boat shoes in a size 14 wide with a synthetic sole.", "target_attributes": { "attributes": [ "long lasting", "synthetic sole" ], "options": [ "classic brown", "14 wide" ] }, "asin": "B000EP8D7I" }, { "task_id": "ws_B000EP8D7I_1012", "instruction": "can you find me a pair of long lasting boat shoes with a synthetic sole? get the ones in a brown varsity color and in 8.5 x narrow.", "target_attributes": { "attributes": [ "long lasting", "synthetic sole" ], "options": [ "brown varsity", "8.5 x-narrow" ] }, "asin": "B000EP8D7I" }, { "task_id": "ws_B000EP8D7I_1013", "instruction": "i'm looking for a pair of classic brown, long lasting boat shoes in a size 14 wide with a synthetic sole.", "target_attributes": { "attributes": [ "long lasting", "synthetic sole" ], "options": [ "classic brown", "14 wide" ] }, "asin": "B000EP8D7I" }, { "task_id": "ws_B000EP8D7I_1014", "instruction": "i am looking for a long lasting shoe with synthetic sole in 8.5 wide. also choose navy or red.", "target_attributes": { "attributes": [ "long lasting", "synthetic sole" ], "options": [ "navy | red", "8.5 wide" ] }, "asin": "B000EP8D7I" }, { "task_id": "ws_B0186F92JU_1015", "instruction": "i am looking for a grain free granola cereal.", "target_attributes": { "attributes": [ "grain free" ], "options": [] }, "asin": "B0186F92JU" }, { "task_id": "ws_B0186F92JU_1016", "instruction": "i am looking for a grain free granola cereal.", "target_attributes": { "attributes": [ "grain free" ], "options": [] }, "asin": "B0186F92JU" }, { "task_id": "ws_B093YDG89M_1017", "instruction": "buy me a package of anti-aging masks.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B093YDG89M" }, { "task_id": "ws_B093YDG89M_1018", "instruction": "buy me a package of anti-aging masks.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B093YDG89M" }, { "task_id": "ws_B09447F7D9_1019", "instruction": "i need a yellow portable sound box that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "yellow" ] }, "asin": "B09447F7D9" }, { "task_id": "ws_B09447F7D9_1020", "instruction": "i need a yellow portable sound box that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "yellow" ] }, "asin": "B09447F7D9" }, { "task_id": "ws_B08JMB7JVC_1021", "instruction": "buy me a new flat-packed bed frame.", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B08JMB7JVC" }, { "task_id": "ws_B08JMB7JVC_1022", "instruction": "buy me a new flat-packed bed frame.", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B08JMB7JVC" }, { "task_id": "ws_B083236V15_1023", "instruction": "i am looking for an end table that is for the living room and is a whitewash color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "whitewash", "end table" ] }, "asin": "B083236V15" }, { "task_id": "ws_B083236V15_1024", "instruction": "i am looking for an end table that is for the living room and is a whitewash color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "whitewash", "end table" ] }, "asin": "B083236V15" }, { "task_id": "ws_B09QM2MNBQ_1025", "instruction": "i would like a extra small grayed jade workout shorts with pockets and a drawstring.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "grayed jade", "x-small" ] }, "asin": "B09QM2MNBQ" }, { "task_id": "ws_B09QM2MNBQ_1026", "instruction": "i would like a extra small grayed jade workout shorts with pockets and a drawstring.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "grayed jade", "x-small" ] }, "asin": "B09QM2MNBQ" }, { "task_id": "ws_B0734JNMSW_1027", "instruction": "i am looking for a copper eco friendly tongue scraper for bad breath.", "target_attributes": { "attributes": [ "eco friendly", "bad breath" ], "options": [ "copper" ] }, "asin": "B0734JNMSW" }, { "task_id": "ws_B0734JNMSW_1028", "instruction": "i am looking for a copper eco friendly tongue scraper for bad breath.", "target_attributes": { "attributes": [ "eco friendly", "bad breath" ], "options": [ "copper" ] }, "asin": "B0734JNMSW" }, { "task_id": "ws_B0866672GG_1029", "instruction": "i would like a 18 pack of peanut butter and jelly soy free nut bars.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "peanut butter & jelly", "18 pack" ] }, "asin": "B0866672GG" }, { "task_id": "ws_B0866672GG_1030", "instruction": "i would like a 18 pack of peanut butter and jelly soy free nut bars.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "peanut butter & jelly", "18 pack" ] }, "asin": "B0866672GG" }, { "task_id": "ws_B09DWZH78K_1031", "instruction": "i need sun canvas women's slip on sneakers in size 12 with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "sun canvas", "12" ] }, "asin": "B09DWZH78K" }, { "task_id": "ws_B09DWZH78K_1032", "instruction": "i need sun canvas women's slip on sneakers in size 12 with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "sun canvas", "12" ] }, "asin": "B09DWZH78K" }, { "task_id": "ws_B08V5JCL3Y_1033", "instruction": "i am looking for a small long sleeve t-shirt that is gray.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "003gray", "small" ] }, "asin": "B08V5JCL3Y" }, { "task_id": "ws_B08V5JCL3Y_1034", "instruction": "i am looking for a small long sleeve t-shirt that is gray.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "003gray", "small" ] }, "asin": "B08V5JCL3Y" }, { "task_id": "ws_B07TGF63QG_1035", "instruction": "i'm looking for a brown runner type rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown", "runner" ] }, "asin": "B07TGF63QG" }, { "task_id": "ws_B07TGF63QG_1036", "instruction": "i'm looking for a brown runner type rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown", "runner" ] }, "asin": "B07TGF63QG" }, { "task_id": "ws_B07TGF63QG_1037", "instruction": "i would like to buy a 7 by 9 foot round green rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green", "round", "7 ft. x 9 ft." ] }, "asin": "B07TGF63QG" }, { "task_id": "ws_B08L828DTL_1038", "instruction": "i am looking for a high performance digital subwoofer power amplifier board.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B08L828DTL" }, { "task_id": "ws_B08L828DTL_1039", "instruction": "i am looking for a high performance digital subwoofer power amplifier board.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B08L828DTL" }, { "task_id": "ws_B01NAER8CP_1040", "instruction": "i'd like to buy some cinnamon flavored nuts. look for nuts with zero trans fats, please.", "target_attributes": { "attributes": [ "0g trans" ], "options": [ "cinnamon" ] }, "asin": "B01NAER8CP" }, { "task_id": "ws_B01NAER8CP_1041", "instruction": "i'd like to buy some cinnamon flavored nuts. look for nuts with zero trans fats, please.", "target_attributes": { "attributes": [ "0g trans" ], "options": [ "cinnamon" ] }, "asin": "B01NAER8CP" }, { "task_id": "ws_B06XSDKRF9_1042", "instruction": "find me the soy free 3.5 ounce 4-pack of dang thai rice chips, and make sure they are the aged cheddar flavor. i also need the ones in the resealable bags.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "aged cheddar", "3.5 ounce (pack of 4)", "rice chips" ] }, "asin": "B06XSDKRF9" }, { "task_id": "ws_B06XSDKRF9_1043", "instruction": "find me the soy free 3.5 ounce 4-pack of dang thai rice chips, and make sure they are the aged cheddar flavor. i also need the ones in the resealable bags.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "aged cheddar", "3.5 ounce (pack of 4)", "rice chips" ] }, "asin": "B06XSDKRF9" }, { "task_id": "ws_B09DYH8RMQ_1044", "instruction": "go ahead and order that rhinestone top in small, with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09DYH8RMQ" }, { "task_id": "ws_B09DYH8RMQ_1045", "instruction": "go ahead and order that rhinestone top in small, with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09DYH8RMQ" }, { "task_id": "ws_B07GT9KYSX_1046", "instruction": "i would like a pink ottoman with a solid wooden frame.", "target_attributes": { "attributes": [ "wood frame", "solid wood" ], "options": [ "pink" ] }, "asin": "B07GT9KYSX" }, { "task_id": "ws_B07GT9KYSX_1047", "instruction": "i would like a pink ottoman with a solid wooden frame.", "target_attributes": { "attributes": [ "wood frame", "solid wood" ], "options": [ "pink" ] }, "asin": "B07GT9KYSX" }, { "task_id": "ws_B085BR7DM2_1048", "instruction": "i'd like to get wireless earphones that feature stereo sound. the color should be black.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "polish black" ] }, "asin": "B085BR7DM2" }, { "task_id": "ws_B085BR7DM2_1049", "instruction": "i'd like to get wireless earphones that feature stereo sound. the color should be black.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "polish black" ] }, "asin": "B085BR7DM2" }, { "task_id": "ws_B09CMHXFSP_1050", "instruction": "i want to find a black ergonomic office chair that's easy to assemble and offers lumbar support.", "target_attributes": { "attributes": [ "easy assemble", "lumbar support" ], "options": [ "black" ] }, "asin": "B09CMHXFSP" }, { "task_id": "ws_B09CMHXFSP_1051", "instruction": "i want to find a black ergonomic office chair that's easy to assemble and offers lumbar support.", "target_attributes": { "attributes": [ "easy assemble", "lumbar support" ], "options": [ "black" ] }, "asin": "B09CMHXFSP" }, { "task_id": "ws_B099DRXNQ1_1052", "instruction": "i need a fluoride free maternity toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B099DRXNQ1" }, { "task_id": "ws_B099DRXNQ1_1053", "instruction": "i need a fluoride free maternity toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B099DRXNQ1" }, { "task_id": "ws_B07VL1ZSDP_1054", "instruction": "i am looking for a black, easy to use gameboy case for an iphone.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "black" ] }, "asin": "B07VL1ZSDP" }, { "task_id": "ws_B07VL1ZSDP_1055", "instruction": "i am looking for a black, easy to use gameboy case for an iphone.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "black" ] }, "asin": "B07VL1ZSDP" }, { "task_id": "ws_B07VL1ZSDP_1056", "instruction": "i need easy use iphone 6p model phone", "target_attributes": { "attributes": [ "easy use" ], "options": [ "for iphone 6p | 7p | 8p" ] }, "asin": "B07VL1ZSDP" }, { "task_id": "ws_B01GQ5H8AW_1057", "instruction": "i need 5 ounce basil & garlic mary's gone crackers that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "basil & garlic", "5 ounce (pack of 1)" ] }, "asin": "B01GQ5H8AW" }, { "task_id": "ws_B01GQ5H8AW_1058", "instruction": "i need 5 ounce basil & garlic mary's gone crackers that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "basil & garlic", "5 ounce (pack of 1)" ] }, "asin": "B01GQ5H8AW" }, { "task_id": "ws_B0831K16NY_1059", "instruction": "i'm looking for a button down men's shirt with short sleeves and in the size of 3x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "3x-large" ] }, "asin": "B0831K16NY" }, { "task_id": "ws_B0831K16NY_1060", "instruction": "i'm looking for a button down men's shirt with short sleeves and in the size of 3x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "3x-large" ] }, "asin": "B0831K16NY" }, { "task_id": "ws_B09Q1RZXZ8_1061", "instruction": "buy me some light weight beige slippers.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "beige" ] }, "asin": "B09Q1RZXZ8" }, { "task_id": "ws_B09Q1RZXZ8_1062", "instruction": "buy me some light weight beige slippers.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "beige" ] }, "asin": "B09Q1RZXZ8" }, { "task_id": "ws_B09HKF2KQN_1063", "instruction": "i'm looking for a kids toothbrush for ages 6 to 12 that will help with teeth whitening and is easy to use.", "target_attributes": { "attributes": [ "teeth whitening", "easy use" ], "options": [ "aged 6-12" ] }, "asin": "B09HKF2KQN" }, { "task_id": "ws_B09HKF2KQN_1064", "instruction": "i'm looking for a kids toothbrush for ages 6 to 12 that will help with teeth whitening and is easy to use.", "target_attributes": { "attributes": [ "teeth whitening", "easy use" ], "options": [ "aged 6-12" ] }, "asin": "B09HKF2KQN" }, { "task_id": "ws_B09HKF2KQN_1065", "instruction": "i'm looking for teeth whitening for teen clesening for prevention of oral care.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "a14#blue" ] }, "asin": "B09HKF2KQN" }, { "task_id": "ws_B09HKF2KQN_1066", "instruction": "i want to find a white donut colored toothbrush that is suitable for kids aged 6-12 and easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "a36#white donut", "aged 6-12" ] }, "asin": "B09HKF2KQN" }, { "task_id": "ws_B08W533DQL_1067", "instruction": "i am looking for a light blue, pink, yellow or light green tooth cleaning tool that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "light blue, pink, yellow, light green" ] }, "asin": "B08W533DQL" }, { "task_id": "ws_B08W533DQL_1068", "instruction": "i need a purple braces brush that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "light blue, yellow, gray, purple" ] }, "asin": "B08W533DQL" }, { "task_id": "ws_B08W533DQL_1069", "instruction": "i am looking for a light blue, pink, yellow or light green tooth cleaning tool that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "light blue, pink, yellow, light green" ] }, "asin": "B08W533DQL" }, { "task_id": "ws_B09MH2SNS7_1070", "instruction": "i am interested in a wireless bluetooth clock radio that is red.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "red" ] }, "asin": "B09MH2SNS7" }, { "task_id": "ws_B09MH2SNS7_1071", "instruction": "i am interested in a wireless bluetooth clock radio that is red.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "red" ] }, "asin": "B09MH2SNS7" }, { "task_id": "ws_B00NVBWG98_1072", "instruction": "i am looking for a high quality strawberry blonde mix color hairpiece that is easy to use.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "strawberry blonde mix #27t613 g13b" ] }, "asin": "B00NVBWG98" }, { "task_id": "ws_B00NVBWG98_1073", "instruction": "i am looking for a high quality strawberry blonde mix color hairpiece that is easy to use.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "strawberry blonde mix #27t613 g13b" ] }, "asin": "B00NVBWG98" }, { "task_id": "ws_B09P68G3RX_1074", "instruction": "i'm looking for a size 5.5 women non slip running shoes.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "5.5 women | 3.5 men" ] }, "asin": "B09P68G3RX" }, { "task_id": "ws_B09P68G3RX_1075", "instruction": "i'm looking for a size 5.5 women non slip running shoes.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "5.5 women | 3.5 men" ] }, "asin": "B09P68G3RX" }, { "task_id": "ws_B0844NPZ65_1076", "instruction": "i need an easy to install walnut brown living skog mid-century tv stand for tv's up to 48 inches.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "walnut brown", "for tv's up to 48 inches" ] }, "asin": "B0844NPZ65" }, { "task_id": "ws_B0844NPZ65_1077", "instruction": "i need an easy to install walnut brown living skog mid-century tv stand for tv's up to 48 inches.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "walnut brown", "for tv's up to 48 inches" ] }, "asin": "B0844NPZ65" }, { "task_id": "ws_B07B6NM7Q2_1078", "instruction": "i am looking for a milk chocolate of 1 pound size in a single pack for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07B6NM7Q2" }, { "task_id": "ws_B07B6NM7Q2_1079", "instruction": "i am looking for a milk chocolate of 1 pound size in a single pack for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07B6NM7Q2" }, { "task_id": "ws_B087N61YT8_1080", "instruction": "i'm looking for a french vanilla zero calorie and zero sugarand flavor stevia energy", "target_attributes": { "attributes": [ "keto friendly", "zero sugar" ], "options": [ "stevia energy" ] }, "asin": "B087N61YT8" }, { "task_id": "ws_B087N61YT8_1081", "instruction": "i'm looking for a french vanilla zero calorie and zero sugarand flavor stevia energy", "target_attributes": { "attributes": [ "keto friendly", "zero sugar" ], "options": [ "stevia energy" ] }, "asin": "B087N61YT8" }, { "task_id": "ws_B09B2QWWX7_1082", "instruction": "i am interested in a brushed nickel light fixture that has two lights.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "brushed nickel", "2-light" ] }, "asin": "B09B2QWWX7" }, { "task_id": "ws_B09B2QWWX7_1083", "instruction": "i am interested in a brushed nickel light fixture that has two lights.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "brushed nickel", "2-light" ] }, "asin": "B09B2QWWX7" }, { "task_id": "ws_B096VFHGKX_1084", "instruction": "i need some nice synthetic hair extensions that are at least 14 inches long.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "14 inch" ] }, "asin": "B096VFHGKX" }, { "task_id": "ws_B096VFHGKX_1085", "instruction": "i need some nice synthetic hair extensions that are at least 14 inches long.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "14 inch" ] }, "asin": "B096VFHGKX" }, { "task_id": "ws_B096VFHGKX_1086", "instruction": "i am looking for 18 inch crochet synthetic hair for black women.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "18 inch" ] }, "asin": "B096VFHGKX" }, { "task_id": "ws_B013UKOWAA_1087", "instruction": "what deodorants do you have that are alcohol free and very long lasting?", "target_attributes": { "attributes": [ "alcohol free", "long lasting" ], "options": [] }, "asin": "B013UKOWAA" }, { "task_id": "ws_B013UKOWAA_1088", "instruction": "what deodorants do you have that are alcohol free and very long lasting?", "target_attributes": { "attributes": [ "alcohol free", "long lasting" ], "options": [] }, "asin": "B013UKOWAA" }, { "task_id": "ws_B075M661NC_1089", "instruction": "i neet 10 quantity of gold plated display port to vga adapter (male to female) compatible with any computer,laptop and projector", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10" ] }, "asin": "B075M661NC" }, { "task_id": "ws_B075M661NC_1090", "instruction": "i neet 10 quantity of gold plated display port to vga adapter (male to female) compatible with any computer,laptop and projector", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10" ] }, "asin": "B075M661NC" }, { "task_id": "ws_B01ENHMKTY_1091", "instruction": "i would like a 12 by 12 inch poster in three panels i can hang readily in my living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "12x12inchx3panles" ] }, "asin": "B01ENHMKTY" }, { "task_id": "ws_B01ENHMKTY_1092", "instruction": "i would like a 12 by 12 inch poster in three panels i can hang readily in my living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "12x12inchx3panles" ] }, "asin": "B01ENHMKTY" }, { "task_id": "ws_B07F81Q5F7_1093", "instruction": "i am looking for a queen sized multicolored mattress set.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "multi" ] }, "asin": "B07F81Q5F7" }, { "task_id": "ws_B07F81Q5F7_1094", "instruction": "i am looking for a queen sized multicolored mattress set.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "multi" ] }, "asin": "B07F81Q5F7" }, { "task_id": "ws_B07F81Q5F7_1095", "instruction": "i want to buy a king size box spring and 4-in foundation set in the color no.", "target_attributes": { "attributes": [ "king size", "box spring" ], "options": [ "no", "king", "4\" foundation" ] }, "asin": "B07F81Q5F7" }, { "task_id": "ws_B07F81Q5F7_1096", "instruction": "i would like a 8\" foundation split king size blue bed and box spring.", "target_attributes": { "attributes": [ "king size", "box spring" ], "options": [ "blue", "king", "8\" foundation split" ] }, "asin": "B07F81Q5F7" }, { "task_id": "ws_B07F81Q5F7_1097", "instruction": "i am in need of a king sized yellow box spring set", "target_attributes": { "attributes": [ "king size" ], "options": [ "yellow" ] }, "asin": "B07F81Q5F7" }, { "task_id": "ws_B08BLK4MYR_1098", "instruction": "i am looking for a travel tin kit of camouflage color and can be cleaned very easily.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "camouflage" ] }, "asin": "B08BLK4MYR" }, { "task_id": "ws_B08BLK4MYR_1099", "instruction": "i am looking for a travel tin kit of camouflage color and can be cleaned very easily.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "camouflage" ] }, "asin": "B08BLK4MYR" }, { "task_id": "ws_B09JFFKJP9_1100", "instruction": "i'm looking for a black heavy duty barber chair", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black" ] }, "asin": "B09JFFKJP9" }, { "task_id": "ws_B09JFFKJP9_1101", "instruction": "i'm looking for a black heavy duty barber chair", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black" ] }, "asin": "B09JFFKJP9" }, { "task_id": "ws_B08WPKFMV9_1102", "instruction": "i would like some low sodium spice gifts for some friends.", "target_attributes": { "attributes": [ "low sodium" ], "options": [] }, "asin": "B08WPKFMV9" }, { "task_id": "ws_B08WPKFMV9_1103", "instruction": "i would like some low sodium spice gifts for some friends.", "target_attributes": { "attributes": [ "low sodium" ], "options": [] }, "asin": "B08WPKFMV9" }, { "task_id": "ws_B09NXFP57R_1104", "instruction": "i want a pair of black, closed pointy toe sandals.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "a01 black" ] }, "asin": "B09NXFP57R" }, { "task_id": "ws_B09NXFP57R_1105", "instruction": "i want a pair of black, closed pointy toe sandals.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "a01 black" ] }, "asin": "B09NXFP57R" }, { "task_id": "ws_B09QM4936N_1106", "instruction": "i need a cosmetic bag for my nail polish. get the one in color eleven.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "color11" ] }, "asin": "B09QM4936N" }, { "task_id": "ws_B09QM4936N_1107", "instruction": "i need a cosmetic bag for my nail polish. get the one in color eleven.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "color11" ] }, "asin": "B09QM4936N" }, { "task_id": "ws_B09M6GNPYY_1108", "instruction": "i am looking for a natural black color high quality hair extension for women.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "natural black" ] }, "asin": "B09M6GNPYY" }, { "task_id": "ws_B09M6GNPYY_1109", "instruction": "i am looking for a natural black color high quality hair extension for women.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "natural black" ] }, "asin": "B09M6GNPYY" }, { "task_id": "ws_B07QH94GPK_1110", "instruction": "i am looking for surveillance video equipment that has motion detection and is 720p.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "4ch 720p no hdd" ] }, "asin": "B07QH94GPK" }, { "task_id": "ws_B07QH94GPK_1111", "instruction": "i am looking for surveillance video equipment that has motion detection and is 720p.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "4ch 720p no hdd" ] }, "asin": "B07QH94GPK" }, { "task_id": "ws_B085T9XX1V_1112", "instruction": "i need a chandelier for the dining room that has 12 lights.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "12 lights" ] }, "asin": "B085T9XX1V" }, { "task_id": "ws_B085T9XX1V_1113", "instruction": "i need a chandelier for the dining room that has 12 lights.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "12 lights" ] }, "asin": "B085T9XX1V" }, { "task_id": "ws_B07L6KQ7FW_1114", "instruction": "show me size seven running shoes with laces and rubber soles.", "target_attributes": { "attributes": [ "lace closure", "rubber sole" ], "options": [ "7" ] }, "asin": "B07L6KQ7FW" }, { "task_id": "ws_B07L6KQ7FW_1115", "instruction": "show me size seven running shoes with laces and rubber soles.", "target_attributes": { "attributes": [ "lace closure", "rubber sole" ], "options": [ "7" ] }, "asin": "B07L6KQ7FW" }, { "task_id": "ws_B08L9DKZ1Y_1116", "instruction": "i'm looking for a small gray long-sleeve t-shirt for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a grey", "small" ] }, "asin": "B08L9DKZ1Y" }, { "task_id": "ws_B08L9DKZ1Y_1117", "instruction": "i'm looking for a small gray long-sleeve t-shirt for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a grey", "small" ] }, "asin": "B08L9DKZ1Y" }, { "task_id": "ws_B09DYF1GSZ_1118", "instruction": "i need a 84inch wall mounted motorized projector screen that displays a 16:9 screen.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "16:9 screen", "84inch" ] }, "asin": "B09DYF1GSZ" }, { "task_id": "ws_B09DYF1GSZ_1119", "instruction": "i need a 84inch wall mounted motorized projector screen that displays a 16:9 screen.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "16:9 screen", "84inch" ] }, "asin": "B09DYF1GSZ" }, { "task_id": "ws_B08N2ZCC2K_1120", "instruction": "i am looking for a light grey faux leather loveseat.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "light grey" ] }, "asin": "B08N2ZCC2K" }, { "task_id": "ws_B08N2ZCC2K_1121", "instruction": "i am looking for a light grey faux leather loveseat.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "light grey" ] }, "asin": "B08N2ZCC2K" }, { "task_id": "ws_B09MM1R7VM_1122", "instruction": "i am looking for a tattoo machine that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09MM1R7VM" }, { "task_id": "ws_B09MM1R7VM_1123", "instruction": "i am looking for a tattoo machine that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09MM1R7VM" }, { "task_id": "ws_B0842V2TJH_1124", "instruction": "i am looking for a fluoride free foaming toothpaste with a cinnamon tea tree flavor.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "cinnamon tea tree" ] }, "asin": "B0842V2TJH" }, { "task_id": "ws_B0842V2TJH_1125", "instruction": "i am looking for a fluoride free foaming toothpaste with a cinnamon tea tree flavor.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "cinnamon tea tree" ] }, "asin": "B0842V2TJH" }, { "task_id": "ws_B08FX7T8Z4_1126", "instruction": "i need to order a game boy color. make sure that it's green and has stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "green" ] }, "asin": "B08FX7T8Z4" }, { "task_id": "ws_B08FX7T8Z4_1127", "instruction": "i need to order a game boy color. make sure that it's green and has stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "green" ] }, "asin": "B08FX7T8Z4" }, { "task_id": "ws_B07YWDVBM8_1128", "instruction": "i would like a pink face brush for my dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "pink" ] }, "asin": "B07YWDVBM8" }, { "task_id": "ws_B07YWDVBM8_1129", "instruction": "i would like a pink face brush for my dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "pink" ] }, "asin": "B07YWDVBM8" }, { "task_id": "ws_B09SXMWZJW_1130", "instruction": "i'd like to get sulfate free conditioner that promotes hair growth.", "target_attributes": { "attributes": [ "sulfate free", "hair growth" ], "options": [] }, "asin": "B09SXMWZJW" }, { "task_id": "ws_B09SXMWZJW_1131", "instruction": "i'd like to get sulfate free conditioner that promotes hair growth.", "target_attributes": { "attributes": [ "sulfate free", "hair growth" ], "options": [] }, "asin": "B09SXMWZJW" }, { "task_id": "ws_B09NLWZMDW_1132", "instruction": "looking for valentine's cupcake toppers for valentine day with pattern name in red", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "design 1 a red" ] }, "asin": "B09NLWZMDW" }, { "task_id": "ws_B09NLWZMDW_1133", "instruction": "looking for valentine's cupcake toppers for valentine day with pattern name in red", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "design 1 a red" ] }, "asin": "B09NLWZMDW" }, { "task_id": "ws_B09LHWT76V_1134", "instruction": "i am looking for a gold camera lens protector that has tempered glass for an iphone 13 pro or iphone pro max.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "gold" ] }, "asin": "B09LHWT76V" }, { "task_id": "ws_B09LHWT76V_1135", "instruction": "i am looking for a gold camera lens protector that has tempered glass for an iphone 13 pro or iphone pro max.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "gold" ] }, "asin": "B09LHWT76V" }, { "task_id": "ws_B07JG2QHHY_1136", "instruction": "i am looking for a lemon yellow airpod case cover compatible with apple airpods and do wireless charging.", "target_attributes": { "attributes": [ "compatible apple", "wireless charging" ], "options": [ "lemon yellow" ] }, "asin": "B07JG2QHHY" }, { "task_id": "ws_B07JG2QHHY_1137", "instruction": "i am looking for a lemon yellow airpod case cover compatible with apple airpods and do wireless charging.", "target_attributes": { "attributes": [ "compatible apple", "wireless charging" ], "options": [ "lemon yellow" ] }, "asin": "B07JG2QHHY" }, { "task_id": "ws_B09JGVKKP1_1138", "instruction": "i am looking for shelf baskets that are eco friendly and are 12.5\"l by 12\"w by 10\" h.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "12.5\"l x 12\"w x 10\"h" ] }, "asin": "B09JGVKKP1" }, { "task_id": "ws_B09JGVKKP1_1139", "instruction": "i am looking for shelf baskets that are eco friendly and are 12.5\"l by 12\"w by 10\" h.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "12.5\"l x 12\"w x 10\"h" ] }, "asin": "B09JGVKKP1" }, { "task_id": "ws_B01ECGBI76_1140", "instruction": "i'd like to view a pair of machine washable regular type denim jeans for men.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "regular" ] }, "asin": "B01ECGBI76" }, { "task_id": "ws_B01ECGBI76_1141", "instruction": "i'd like to view a pair of machine washable regular type denim jeans for men.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "regular" ] }, "asin": "B01ECGBI76" }, { "task_id": "ws_B01ECGBI76_1142", "instruction": "i would like a 62w by 34l big and tall pair of light indigo jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "good decisions - light indigo", "big & tall", "62w x 34l" ] }, "asin": "B01ECGBI76" }, { "task_id": "ws_B08T5Z2R23_1143", "instruction": "i need a bathroom vanity light that is easy to install.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [] }, "asin": "B08T5Z2R23" }, { "task_id": "ws_B08T5Z2R23_1144", "instruction": "i need a bathroom vanity light that is easy to install.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [] }, "asin": "B08T5Z2R23" }, { "task_id": "ws_B01N5WESTU_1145", "instruction": "i want to get a 6 pack of the tom's of maine fresh mint alcohol free mouth wash. i think they are 16 oz bottles.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "fresh mint", "16 ounce (pack of 6)" ] }, "asin": "B01N5WESTU" }, { "task_id": "ws_B01N5WESTU_1146", "instruction": "i want to get a 6 pack of the tom's of maine fresh mint alcohol free mouth wash. i think they are 16 oz bottles.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "fresh mint", "16 ounce (pack of 6)" ] }, "asin": "B01N5WESTU" }, { "task_id": "ws_B00LCBTNY0_1147", "instruction": "find caraway seeds for dietary fiber, need 1 pack with 8 ounce vegan food", "target_attributes": { "attributes": [ "dietary fiber" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B00LCBTNY0" }, { "task_id": "ws_B00LCBTNY0_1148", "instruction": "find caraway seeds for dietary fiber, need 1 pack with 8 ounce vegan food", "target_attributes": { "attributes": [ "dietary fiber" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B00LCBTNY0" }, { "task_id": "ws_B098DMXZK5_1149", "instruction": "i need white blackout cellular shades that are easy to install in size 70\"w x 36\"h.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "make up", "70\"w x 36\"h" ] }, "asin": "B098DMXZK5" }, { "task_id": "ws_B098DMXZK5_1150", "instruction": "i need white blackout cellular shades that are easy to install in size 70\"w x 36\"h.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "make up", "70\"w x 36\"h" ] }, "asin": "B098DMXZK5" }, { "task_id": "ws_B01IPYHLFY_1151", "instruction": "i would like a three pack of 4 fluid ounce green envy hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "green envy", "4 fl oz (pack of 3)" ] }, "asin": "B01IPYHLFY" }, { "task_id": "ws_B01IPYHLFY_1152", "instruction": "i would like a three pack of 4 fluid ounce green envy hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "green envy", "4 fl oz (pack of 3)" ] }, "asin": "B01IPYHLFY" }, { "task_id": "ws_B01IPYHLFY_1153", "instruction": "i'm looking for a manic panic ultra violet hair dye .", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "electric amethyst", "4 fl oz (pack of 3)" ] }, "asin": "B01IPYHLFY" }, { "task_id": "ws_B01IPYHLFY_1154", "instruction": "i want to find 3.99 fluid ounces of venus envy hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "venus envy", "3.99 fl oz (pack of 1)" ] }, "asin": "B01IPYHLFY" }, { "task_id": "ws_B09ST6VY7R_1155", "instruction": "i am looking for 2 piece long sleeve blue#b color swimwear for women. also x-large one", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue#b" ] }, "asin": "B09ST6VY7R" }, { "task_id": "ws_B09ST6VY7R_1156", "instruction": "i am looking for 2 piece long sleeve blue#b color swimwear for women. also x-large one", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue#b" ] }, "asin": "B09ST6VY7R" }, { "task_id": "ws_B09HWQ4H85_1157", "instruction": "i would like a hair brush that's good for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B09HWQ4H85" }, { "task_id": "ws_B09HWQ4H85_1158", "instruction": "i would like a hair brush that's good for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B09HWQ4H85" }, { "task_id": "ws_B07VHMVXYG_1159", "instruction": "i am looking for a certified organic, watermelon frose, lip balm moisturizer made from coconut oil.", "target_attributes": { "attributes": [ "certified organic", "coconut oil" ], "options": [ "watermelon fros\u00e9" ] }, "asin": "B07VHMVXYG" }, { "task_id": "ws_B07VHMVXYG_1160", "instruction": "i am looking for a certified organic, watermelon frose, lip balm moisturizer made from coconut oil.", "target_attributes": { "attributes": [ "certified organic", "coconut oil" ], "options": [ "watermelon fros\u00e9" ] }, "asin": "B07VHMVXYG" }, { "task_id": "ws_B00EV815GU_1161", "instruction": "i need a natural teeth whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B00EV815GU" }, { "task_id": "ws_B00EV815GU_1162", "instruction": "i need a natural teeth whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B00EV815GU" }, { "task_id": "ws_B09NGSLDXV_1163", "instruction": "i am looking for red storage benches that are made of engineered wood and are 90 by 40 by 45.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "red", "90x40x45cm(35x16x18inch)" ] }, "asin": "B09NGSLDXV" }, { "task_id": "ws_B09NGSLDXV_1164", "instruction": "i am looking for red storage benches that are made of engineered wood and are 90 by 40 by 45.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "red", "90x40x45cm(35x16x18inch)" ] }, "asin": "B09NGSLDXV" }, { "task_id": "ws_B09NGSLDXV_1165", "instruction": "i need to find a khaki-colored storage ottoman bench in either the \"pu\" or \"faux\" leather style.", "target_attributes": { "attributes": [ "pu leather", "faux leather" ], "options": [ "khaki" ] }, "asin": "B09NGSLDXV" }, { "task_id": "ws_B08N3BYNDN_1166", "instruction": "i want to buy an android smartphone. the camera should have optical zoom and it should have at least 128gb of space.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "128 gb" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1167", "instruction": "look for an eay to use android cell phone that has 128 gb.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "128 gb" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1168", "instruction": "i am looking for optical zoom samsung galaxy smartphone of style: s21 ultra + case black", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "s21 ultra + case black" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1169", "instruction": "i am looking for samsung galaxy smartphone with 256 gb memory and 3x optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "256gb" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1170", "instruction": "i want to find a phantom silver s21 android phone that has a camera with an optical zoom. it needs to be able to store 128 gigabytes of data and it should come with a case.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom silver", "128 gb", "s21 + case" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1171", "instruction": "i want to find a phantom black s21 android smartphone that's easy to use and has 128 gigabytes of storage space. ideally it will come with a black case.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "phantom black", "128gb", "s21 ultra + case - black" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1172", "instruction": "i want to find an unlocked pink s21 android phone that has a camera with an optical zoom feature. it needs to have 256 gigabytes of storage space and ideally it'll come with a black case.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom pink", "256gb", "s21 + case, black" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1173", "instruction": "i want to find a phantom gray colored samsung galaxy s21 phone with 256 gigabytes of storage space. the camera needs to have an optical zoom feature.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom gray", "256gb", "s21+" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1174", "instruction": "i want to buy an android smartphone. the camera should have optical zoom and it should have at least 128gb of space.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "128 gb" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1175", "instruction": "searching for a galaxy s21 ultra 5g factory unlocked android smartphone using 128gb, us version that is easy to use, either in color of phantom black or phantom silver with the added features of pro-grade camera, 8k video, and 108mp high resolution made by samsung.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "phantom black", "128gb" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1176", "instruction": "i am looking for a phantom pink samsung galaxy s21 ultra 5g unlocked phone with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom pink" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1177", "instruction": "i'm looking for optical zoom its for computer accessories for cell phones.", "target_attributes": { "attributes": [ "easy use", "optical zoom" ], "options": [ "phantom silver" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1178", "instruction": "i would like a violet colored phone that has optical zoom", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom violet" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1179", "instruction": "i want a phantom black samsung galaxy s21 with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "phantom black" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B08N3BYNDN_1180", "instruction": "i am looking for a samsung mobile with 512gb internal memory and phantom gray color which is for easy use. also choose s21 ultra + case black", "target_attributes": { "attributes": [ "easy use" ], "options": [ "phantom gray", "512gb", "s21 ultra + case black" ] }, "asin": "B08N3BYNDN" }, { "task_id": "ws_B082QHNGY4_1181", "instruction": "i am looking for a white fast charging usb wall charger for a samsung galaxy.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "white" ] }, "asin": "B082QHNGY4" }, { "task_id": "ws_B082QHNGY4_1182", "instruction": "i am looking for a white fast charging usb wall charger for a samsung galaxy.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "white" ] }, "asin": "B082QHNGY4" }, { "task_id": "ws_B09PL6LMFX_1183", "instruction": "i am looking for a 2bottle color floride free teeth whitening toothpaste.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening" ], "options": [ "2bottle" ] }, "asin": "B09PL6LMFX" }, { "task_id": "ws_B09PL6LMFX_1184", "instruction": "i am looking for a 2bottle color floride free teeth whitening toothpaste.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening" ], "options": [ "2bottle" ] }, "asin": "B09PL6LMFX" }, { "task_id": "ws_B0001W2XSO_1185", "instruction": "i need party bags of potato chips.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "reduced fat" ] }, "asin": "B0001W2XSO" }, { "task_id": "ws_B0001W2XSO_1186", "instruction": "i need party bags of potato chips.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "reduced fat" ] }, "asin": "B0001W2XSO" }, { "task_id": "ws_B0001W2XSO_1187", "instruction": "i would like some fat free potato chips that are salt and vinegar", "target_attributes": { "attributes": [ "fat free" ], "options": [ "sea salt and vinegar" ] }, "asin": "B0001W2XSO" }, { "task_id": "ws_B089M2WWHH_1188", "instruction": "i am looking for a bed with a steel frame and a twin xl memory foam mattress.", "target_attributes": { "attributes": [ "memory foam", "steel frame" ], "options": [ "twin xl" ] }, "asin": "B089M2WWHH" }, { "task_id": "ws_B089M2WWHH_1189", "instruction": "i am looking for a bed with a steel frame and a twin xl memory foam mattress.", "target_attributes": { "attributes": [ "memory foam", "steel frame" ], "options": [ "twin xl" ] }, "asin": "B089M2WWHH" }, { "task_id": "ws_B09JBMP1YR_1190", "instruction": "i am looking for a computer gaming chair that has lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [] }, "asin": "B09JBMP1YR" }, { "task_id": "ws_B09JBMP1YR_1191", "instruction": "i am looking for a computer gaming chair that has lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [] }, "asin": "B09JBMP1YR" }, { "task_id": "ws_B07JGP6BN3_1192", "instruction": "want a security camera system with high definition, motion detection and need to be dust proof", "target_attributes": { "attributes": [ "dust proof", "high definition", "motion detection" ], "options": [] }, "asin": "B07JGP6BN3" }, { "task_id": "ws_B07JGP6BN3_1193", "instruction": "want a security camera system with high definition, motion detection and need to be dust proof", "target_attributes": { "attributes": [ "dust proof", "high definition", "motion detection" ], "options": [] }, "asin": "B07JGP6BN3" }, { "task_id": "ws_B0979651TX_1194", "instruction": "i need white steel toe siilsaa sneakers for women in size 7.5.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "z03 white", "7.5" ] }, "asin": "B0979651TX" }, { "task_id": "ws_B0979651TX_1195", "instruction": "i need white steel toe siilsaa sneakers for women in size 7.5.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "z03 white", "7.5" ] }, "asin": "B0979651TX" }, { "task_id": "ws_B09HPMDHZK_1196", "instruction": "i am looking for silver cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "silver" ] }, "asin": "B09HPMDHZK" }, { "task_id": "ws_B09HPMDHZK_1197", "instruction": "i am looking for silver cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "silver" ] }, "asin": "B09HPMDHZK" }, { "task_id": "ws_B09HPMDHZK_1198", "instruction": "i need some pink cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pink" ] }, "asin": "B09HPMDHZK" }, { "task_id": "ws_B09129MGYK_1199", "instruction": "i am looking for a round, ivory colored ottoman for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory" ] }, "asin": "B09129MGYK" }, { "task_id": "ws_B09129MGYK_1200", "instruction": "i am looking for a round, ivory colored ottoman for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory" ] }, "asin": "B09129MGYK" }, { "task_id": "ws_B08NTSS463_1201", "instruction": "i want to buy some sandals. get the ones with the ankle straps, and buy them in moonstone, size six and a half.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "moonstone", "6.5" ] }, "asin": "B08NTSS463" }, { "task_id": "ws_B08NTSS463_1202", "instruction": "i want to buy some sandals. get the ones with the ankle straps, and buy them in moonstone, size six and a half.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "moonstone", "6.5" ] }, "asin": "B08NTSS463" }, { "task_id": "ws_B099K1KP3N_1203", "instruction": "looking for one bed for kids in grey color, size twin and of easy assemble in wood.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "grey(triangle)", "twin" ] }, "asin": "B099K1KP3N" }, { "task_id": "ws_B099K1KP3N_1204", "instruction": "looking for one bed for kids in grey color, size twin and of easy assemble in wood.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "grey(triangle)", "twin" ] }, "asin": "B099K1KP3N" }, { "task_id": "ws_B0786TZL82_1205", "instruction": "i want a low sodium spice mix that has himalyan salt.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "himalayan salt" ] }, "asin": "B0786TZL82" }, { "task_id": "ws_B0786TZL82_1206", "instruction": "i want a low sodium spice mix that has himalyan salt.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "himalayan salt" ] }, "asin": "B0786TZL82" }, { "task_id": "ws_B0786TZL82_1207", "instruction": "i would like a sweet and savory spices that are low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "sweet & savory" ] }, "asin": "B0786TZL82" }, { "task_id": "ws_B093L1QNPT_1208", "instruction": "i'm looking for a black, digital alarm clock that offers wireless bluetooth functionality.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B093L1QNPT" }, { "task_id": "ws_B093L1QNPT_1209", "instruction": "i'm looking for a black, digital alarm clock that offers wireless bluetooth functionality.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B093L1QNPT" }, { "task_id": "ws_B088K9PJQY_1210", "instruction": "find me cloths towel for exfoliating bath for sensitive skin 11.81 x 11.8 inch with yellow edge", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "11.81 x 11.8 inch", "yellow edge" ] }, "asin": "B088K9PJQY" }, { "task_id": "ws_B088K9PJQY_1211", "instruction": "find me cloths towel for exfoliating bath for sensitive skin 11.81 x 11.8 inch with yellow edge", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "11.81 x 11.8 inch", "yellow edge" ] }, "asin": "B088K9PJQY" }, { "task_id": "ws_B07BMF3FYB_1212", "instruction": "i am looking for sugar free unsweetened shredded coconut flakes with large flakes.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "unsweetened chips | large flakes" ] }, "asin": "B07BMF3FYB" }, { "task_id": "ws_B07BMF3FYB_1213", "instruction": "i am looking for sugar free unsweetened shredded coconut flakes with large flakes.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "unsweetened chips | large flakes" ] }, "asin": "B07BMF3FYB" }, { "task_id": "ws_B019MH122Q_1214", "instruction": "i'm looking for ten high-speed, gold-plated hdmi cables.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack" ] }, "asin": "B019MH122Q" }, { "task_id": "ws_B019MH122Q_1215", "instruction": "i'm looking for ten high-speed, gold-plated hdmi cables.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack" ] }, "asin": "B019MH122Q" }, { "task_id": "ws_B019MH122Q_1216", "instruction": "i need to buy some hdmi male to female cables. look for a pack of ten three foot cables that are high speed and gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "3 feet (3-pack)", "hdmi male to female" ] }, "asin": "B019MH122Q" }, { "task_id": "ws_B09BQ35B69_1217", "instruction": "i would like a pink size 5 high heel shoe with a rubber sole.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "pink", "5" ] }, "asin": "B09BQ35B69" }, { "task_id": "ws_B09BQ35B69_1218", "instruction": "i would like a pink size 5 high heel shoe with a rubber sole.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "pink", "5" ] }, "asin": "B09BQ35B69" }, { "task_id": "ws_B089JYCLBG_1219", "instruction": "i am looking for a pink leak proof bag.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "pink" ] }, "asin": "B089JYCLBG" }, { "task_id": "ws_B089JYCLBG_1220", "instruction": "i am looking for a pink leak proof bag.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "pink" ] }, "asin": "B089JYCLBG" }, { "task_id": "ws_B00CWTZ8UY_1221", "instruction": "get me a holiday variety pack of sugar free syrup, please.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar free syrup, holiday variety pack" ] }, "asin": "B00CWTZ8UY" }, { "task_id": "ws_B00CWTZ8UY_1222", "instruction": "get me a holiday variety pack of sugar free syrup, please.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar free syrup, holiday variety pack" ] }, "asin": "B00CWTZ8UY" }, { "task_id": "ws_B07PXGC1V2_1223", "instruction": "i am interested in a high protein snack pack.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B07PXGC1V2" }, { "task_id": "ws_B07PXGC1V2_1224", "instruction": "i am interested in a high protein snack pack.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B07PXGC1V2" }, { "task_id": "ws_B09DL8BGGW_1225", "instruction": "i need in dash navigation that is hands free.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B09DL8BGGW" }, { "task_id": "ws_B09DL8BGGW_1226", "instruction": "i need in dash navigation that is hands free.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B09DL8BGGW" }, { "task_id": "ws_B07QNF7GVB_1227", "instruction": "i'm looking for pink cruelty free himalayan salt water mouth rinse.", "target_attributes": { "attributes": [ "alcohol free", "cruelty free" ], "options": [] }, "asin": "B07QNF7GVB" }, { "task_id": "ws_B07QNF7GVB_1228", "instruction": "i'm looking for pink cruelty free himalayan salt water mouth rinse.", "target_attributes": { "attributes": [ "alcohol free", "cruelty free" ], "options": [] }, "asin": "B07QNF7GVB" }, { "task_id": "ws_B07Z19YMN4_1229", "instruction": "i am looking for a 15 pack of individually wrapped gourmet cookies with natural ingredients.", "target_attributes": { "attributes": [ "individually wrapped", "natural ingredients" ], "options": [ "15 count (pack of 3)" ] }, "asin": "B07Z19YMN4" }, { "task_id": "ws_B07Z19YMN4_1230", "instruction": "i am looking for a 15 pack of individually wrapped gourmet cookies with natural ingredients.", "target_attributes": { "attributes": [ "individually wrapped", "natural ingredients" ], "options": [ "15 count (pack of 3)" ] }, "asin": "B07Z19YMN4" }, { "task_id": "ws_B00XNUMYTY_1231", "instruction": "i need a non-dairy coffee creamer.", "target_attributes": { "attributes": [ "non dairy" ], "options": [] }, "asin": "B00XNUMYTY" }, { "task_id": "ws_B00XNUMYTY_1232", "instruction": "i need a non-dairy coffee creamer.", "target_attributes": { "attributes": [ "non dairy" ], "options": [] }, "asin": "B00XNUMYTY" }, { "task_id": "ws_B07G4HMCR1_1233", "instruction": "i am looking for a hair color of lime light color having argan oil in it.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "lime light" ] }, "asin": "B07G4HMCR1" }, { "task_id": "ws_B07G4HMCR1_1234", "instruction": "i am looking for a hair color of lime light color having argan oil in it.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "lime light" ] }, "asin": "B07G4HMCR1" }, { "task_id": "ws_B09MTPKW8N_1235", "instruction": "i need a blue tongue scraper for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "blue" ] }, "asin": "B09MTPKW8N" }, { "task_id": "ws_B09MTPKW8N_1236", "instruction": "i need a blue tongue scraper for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "blue" ] }, "asin": "B09MTPKW8N" }, { "task_id": "ws_B09MRKGG9Q_1237", "instruction": "i need a media player with aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B09MRKGG9Q" }, { "task_id": "ws_B09MRKGG9Q_1238", "instruction": "i need a media player with aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B09MRKGG9Q" }, { "task_id": "ws_B09MRKGG9Q_1239", "instruction": "find me a hdmi media players with aaa batteries for streaming", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B09MRKGG9Q" }, { "task_id": "ws_B096YP9W7J_1240", "instruction": "i would like a 6 pack of 10 ounce kashmir potatoes that are ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "kashmir potatoes", "10 ounce (pack of 6)" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B096YP9W7J_1241", "instruction": "i need some ready to eat delhi potato entrees.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "delhi potatoes" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B096YP9W7J_1242", "instruction": "i would like a 6 pack of 10 ounce kashmir potatoes that are ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "kashmir potatoes", "10 ounce (pack of 6)" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B096YP9W7J_1243", "instruction": "i need ready to eat gluten free kashmir potatoes that is suitable for the preparation of asian foods. and i would prefer a pack of one", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "10 ounce (pack of 1)" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B096YP9W7J_1244", "instruction": "i would like some lentils that are ready to eat", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "delhi lentil" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B096YP9W7J_1245", "instruction": "i would like a six pack of ready to eat entrees", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "10 ounce (pack of 6)" ] }, "asin": "B096YP9W7J" }, { "task_id": "ws_B09L1KZ8N2_1246", "instruction": "i would like a milky white chair that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "milk white -1" ] }, "asin": "B09L1KZ8N2" }, { "task_id": "ws_B09L1KZ8N2_1247", "instruction": "i would like a milky white chair that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "milk white -1" ] }, "asin": "B09L1KZ8N2" }, { "task_id": "ws_B07WYD5LPD_1248", "instruction": "i am looking for eye shadow that is a soft brass color.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "clear | soft brass" ] }, "asin": "B07WYD5LPD" }, { "task_id": "ws_B07WYD5LPD_1249", "instruction": "i am looking for eye shadow that is a soft brass color.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "clear | soft brass" ] }, "asin": "B07WYD5LPD" }, { "task_id": "ws_B07PRN1F5X_1250", "instruction": "i am looking for dried coconut that is gluten free", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07PRN1F5X" }, { "task_id": "ws_B07PRN1F5X_1251", "instruction": "i am looking for dried coconut that is gluten free", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07PRN1F5X" }, { "task_id": "ws_B07RX2753C_1252", "instruction": "i need a 30 pair pack of skin care masks for eyes and wrinkles.", "target_attributes": { "attributes": [ "anti aging", "dark circles" ], "options": [ "30 pairs gold" ] }, "asin": "B07RX2753C" }, { "task_id": "ws_B07RX2753C_1253", "instruction": "i need a 30 pair pack of skin care masks for eyes and wrinkles.", "target_attributes": { "attributes": [ "anti aging", "dark circles" ], "options": [ "30 pairs gold" ] }, "asin": "B07RX2753C" }, { "task_id": "ws_B07BN5LDJ5_1254", "instruction": "i'd like to buy about 12 ounces of fully cooked steak strips that are ready to eat.", "target_attributes": { "attributes": [ "fully cooked", "ready eat" ], "options": [ "12 ounce (pack of 1)" ] }, "asin": "B07BN5LDJ5" }, { "task_id": "ws_B07BN5LDJ5_1255", "instruction": "i'd like to buy about 12 ounces of fully cooked steak strips that are ready to eat.", "target_attributes": { "attributes": [ "fully cooked", "ready eat" ], "options": [ "12 ounce (pack of 1)" ] }, "asin": "B07BN5LDJ5" }, { "task_id": "ws_B07GXTPGVR_1256", "instruction": "i am looking for rubber sole shoes of light beige knit color.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "light beige knit" ] }, "asin": "B07GXTPGVR" }, { "task_id": "ws_B07GXTPGVR_1257", "instruction": "i am looking for rubber sole shoes of light beige knit color.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "light beige knit" ] }, "asin": "B07GXTPGVR" }, { "task_id": "ws_B09H7MFR68_1258", "instruction": "i want to buy some low-rise ankle booties. look for some in green and in a size seven and a half.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "green", "7.5" ] }, "asin": "B09H7MFR68" }, { "task_id": "ws_B09H7MFR68_1259", "instruction": "i want to buy some low-rise ankle booties. look for some in green and in a size seven and a half.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "green", "7.5" ] }, "asin": "B09H7MFR68" }, { "task_id": "ws_B09H7MFR68_1260", "instruction": "i'm looking for ankle boots for women and winter round toe solid color booties.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "grey" ] }, "asin": "B09H7MFR68" }, { "task_id": "ws_B07X63DQ2K_1261", "instruction": "i need khaki steel toe shoes in size 11 women.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "khaki", "11 women | 9 men" ] }, "asin": "B07X63DQ2K" }, { "task_id": "ws_B07X63DQ2K_1262", "instruction": "i need khaki steel toe shoes in size 11 women.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "khaki", "11 women | 9 men" ] }, "asin": "B07X63DQ2K" }, { "task_id": "ws_B0933K4XFG_1263", "instruction": "i need an amplifier that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B0933K4XFG" }, { "task_id": "ws_B0933K4XFG_1264", "instruction": "i need an amplifier that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B0933K4XFG" }, { "task_id": "ws_B082TNGSWD_1265", "instruction": "i am looking for a heavy duty 25 foot 7.6 meter toslink optical cable.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "25ft | 7.6m" ] }, "asin": "B082TNGSWD" }, { "task_id": "ws_B082TNGSWD_1266", "instruction": "i am looking for a heavy duty 25 foot 7.6 meter toslink optical cable.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "25ft | 7.6m" ] }, "asin": "B082TNGSWD" }, { "task_id": "ws_B09K3WM82N_1267", "instruction": "i need a faux fur white andeworld swivel barrel chair for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "faux fur white" ] }, "asin": "B09K3WM82N" }, { "task_id": "ws_B09K3WM82N_1268", "instruction": "i need a faux fur white andeworld swivel barrel chair for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "faux fur white" ] }, "asin": "B09K3WM82N" }, { "task_id": "ws_B07QKVNJTP_1269", "instruction": "i am looking for wine red maternity shorts with nylon spandex and pockets.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "wine red" ] }, "asin": "B07QKVNJTP" }, { "task_id": "ws_B07QKVNJTP_1270", "instruction": "i am looking for wine red maternity shorts with nylon spandex and pockets.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "wine red" ] }, "asin": "B07QKVNJTP" }, { "task_id": "ws_B07WK5PLPN_1271", "instruction": "i need a women's shower gel that is purple and long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07WK5PLPN" }, { "task_id": "ws_B07WK5PLPN_1272", "instruction": "i need a women's shower gel that is purple and long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07WK5PLPN" }, { "task_id": "ws_B07SBG7PZK_1273", "instruction": "i am looking for pez toy story 4 themed candy for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07SBG7PZK" }, { "task_id": "ws_B07SBG7PZK_1274", "instruction": "i am looking for pez toy story 4 themed candy for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07SBG7PZK" }, { "task_id": "ws_B001D0DMME_1275", "instruction": "i am looking for gluten free blueberry almond pecan flavor bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry almond pecan" ] }, "asin": "B001D0DMME" }, { "task_id": "ws_B001D0DMME_1276", "instruction": "i am looking for gluten free blueberry almond pecan flavor bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry almond pecan" ] }, "asin": "B001D0DMME" }, { "task_id": "ws_B083ZWKR6S_1277", "instruction": "looking for ultraboost adidas size 6.5 color black and rubber sole", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | black | gold metallic", "6.5" ] }, "asin": "B083ZWKR6S" }, { "task_id": "ws_B083ZWKR6S_1278", "instruction": "looking for ultraboost adidas size 6.5 color black and rubber sole", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | black | gold metallic", "6.5" ] }, "asin": "B083ZWKR6S" }, { "task_id": "ws_B083ZWKR6S_1279", "instruction": "i chose as a gift a black adidas originals men's ultraboost 12.5 with rubber sole. notify me so i can purchase today.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "core black | core black | grey six", "12.5" ] }, "asin": "B083ZWKR6S" }, { "task_id": "ws_B004BCT7G6_1280", "instruction": "buy me some lipstick in spicy mauve. get the one with argan oil in it.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "saucy mauve" ] }, "asin": "B004BCT7G6" }, { "task_id": "ws_B004BCT7G6_1281", "instruction": "buy me some lipstick in spicy mauve. get the one with argan oil in it.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "saucy mauve" ] }, "asin": "B004BCT7G6" }, { "task_id": "ws_B07MK3LBPR_1282", "instruction": "i'm looking for a maple bacon gluten free with natural flavor, flavor pure orange and size 2 fl oz 24 pack", "target_attributes": { "attributes": [ "gluten free", "natural flavors" ], "options": [ "pure orange", "2 fl oz (pack of 24)" ] }, "asin": "B07MK3LBPR" }, { "task_id": "ws_B07MK3LBPR_1283", "instruction": "i'm looking for a maple bacon gluten free with natural flavor, flavor pure orange and size 2 fl oz 24 pack", "target_attributes": { "attributes": [ "gluten free", "natural flavors" ], "options": [ "pure orange", "2 fl oz (pack of 24)" ] }, "asin": "B07MK3LBPR" }, { "task_id": "ws_B07MK3LBPR_1284", "instruction": "i'm looking for watkins red velvet 2fl oz (pack of 12) with natural flavors.", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "red velvet", "2 fl oz (pack of 12)" ] }, "asin": "B07MK3LBPR" }, { "task_id": "ws_B08DKK9VH6_1285", "instruction": "i am looking for a travel size fresh linens impression fragrance body oil.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "fresh linens impression" ] }, "asin": "B08DKK9VH6" }, { "task_id": "ws_B08DKK9VH6_1286", "instruction": "i would like a 15 ml travel size bottle of christian dior miss dior impression.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "christian dior miss dior impression", "0.5 fl oz | 15ml" ] }, "asin": "B08DKK9VH6" }, { "task_id": "ws_B08DKK9VH6_1287", "instruction": "i am looking for a travel size fresh linens impression fragrance body oil.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "fresh linens impression" ] }, "asin": "B08DKK9VH6" }, { "task_id": "ws_B08DKK9VH6_1288", "instruction": "i am looking for a long lasting eau de parfum sprayer in a 10 ml bottle.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "0.3 fl oz | 10ml" ] }, "asin": "B08DKK9VH6" }, { "task_id": "ws_B09SFQ6S8M_1289", "instruction": "i'm looking for women's square toe sandals that are non-slip and beige high heels.", "target_attributes": { "attributes": [ "anti slip", "high heel" ], "options": [ "a1 - beige" ] }, "asin": "B09SFQ6S8M" }, { "task_id": "ws_B09SFQ6S8M_1290", "instruction": "i'm looking for women's square toe sandals that are non-slip and beige high heels.", "target_attributes": { "attributes": [ "anti slip", "high heel" ], "options": [ "a1 - beige" ] }, "asin": "B09SFQ6S8M" }, { "task_id": "ws_B01N6T8JK9_1291", "instruction": "i am looking for a size 3 slim fit women's skinny jeans.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "3" ] }, "asin": "B01N6T8JK9" }, { "task_id": "ws_B01N6T8JK9_1292", "instruction": "i am looking for a size 3 slim fit women's skinny jeans.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "3" ] }, "asin": "B01N6T8JK9" }, { "task_id": "ws_B097HH78XG_1293", "instruction": "i am looking for size 9 women's fashion sneakers with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "9" ] }, "asin": "B097HH78XG" }, { "task_id": "ws_B097HH78XG_1294", "instruction": "i am looking for size 9 women's fashion sneakers with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "9" ] }, "asin": "B097HH78XG" }, { "task_id": "ws_B09NLRZBGM_1295", "instruction": "i am looking for a photography background that is lightweight in the color a16 and that is 7 by 5 ft", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a16", "7x5ft | 2.1x1.5m" ] }, "asin": "B09NLRZBGM" }, { "task_id": "ws_B09NLRZBGM_1296", "instruction": "i am looking for a photography background that is lightweight in the color a16 and that is 7 by 5 ft", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a16", "7x5ft | 2.1x1.5m" ] }, "asin": "B09NLRZBGM" }, { "task_id": "ws_B07MWSX8Z7_1297", "instruction": "i am looking for slim jeans that are granite color and machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "granite", "slim" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1298", "instruction": "i am looking for men's wrangler relaxed fit jeans that are straw colored.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "straw" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1299", "instruction": "i am looking for slim jeans that are granite color and machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "granite", "slim" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1300", "instruction": "i looking a comfertable fit regular machine wash men's jeans size 32w*36l color :crest", "target_attributes": { "attributes": [ "machine wash", "comfortable fit" ], "options": [ "crest", "32w x 36l" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1301", "instruction": "i am looking for slim fit men jean.it shoud be machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "slim" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1302", "instruction": "i am looking for a black chocolate colored relaxed fit boot cut jean. also, i would like the waist size and the length to be 34 and 31 respectively.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "black chocolate", "34w x 31l" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1303", "instruction": "i need regular mashine wash jeans that are granite colored and are a size 33w by 34l", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "granite", "regular", "33w x 34l" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MWSX8Z7_1304", "instruction": "i want a long lasting boot cut jean that has a relaxed fit. pick a gunter color one.", "target_attributes": { "attributes": [ "long lasting", "relaxed fit" ], "options": [ "gunter" ] }, "asin": "B07MWSX8Z7" }, { "task_id": "ws_B07MDMFDYW_1305", "instruction": "i'd like to buy a black touch up dye for covering up roots but with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "black" ] }, "asin": "B07MDMFDYW" }, { "task_id": "ws_B07MDMFDYW_1306", "instruction": "i'd like to buy a black touch up dye for covering up roots but with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "black" ] }, "asin": "B07MDMFDYW" }, { "task_id": "ws_B09B3KNP3S_1307", "instruction": "i am looking for a round modern end table having 40x55cm size and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "40x55cm" ] }, "asin": "B09B3KNP3S" }, { "task_id": "ws_B09B3KNP3S_1308", "instruction": "i am looking for a round modern end table having 40x55cm size and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "40x55cm" ] }, "asin": "B09B3KNP3S" }, { "task_id": "ws_B09PMKHQDK_1309", "instruction": "i am looking for a high definition video projector.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09PMKHQDK" }, { "task_id": "ws_B09PMKHQDK_1310", "instruction": "i am looking for a high definition video projector.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09PMKHQDK" }, { "task_id": "ws_B09SD9JBY2_1311", "instruction": "i need to buy some sandals with arch support in a women's eleven and a half wide.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "11.5 wide" ] }, "asin": "B09SD9JBY2" }, { "task_id": "ws_B09SD9JBY2_1312", "instruction": "i need to buy some sandals with arch support in a women's eleven and a half wide.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "11.5 wide" ] }, "asin": "B09SD9JBY2" }, { "task_id": "ws_B00FWPQB0G_1313", "instruction": "i am looking for a shoe rack of satin bronze mesh color that is steel coated.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "satin bronze mesh" ] }, "asin": "B00FWPQB0G" }, { "task_id": "ws_B00FWPQB0G_1314", "instruction": "i am looking for a shoe rack of satin bronze mesh color that is steel coated.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "satin bronze mesh" ] }, "asin": "B00FWPQB0G" }, { "task_id": "ws_B00FWPQB0G_1315", "instruction": "i am looking for espresso slat color storage shelf coated with steel.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "espresso slat" ] }, "asin": "B00FWPQB0G" }, { "task_id": "ws_B08SVZ6SDM_1316", "instruction": "i want to find a large pair of men's shorts with an elastic waistband. the color should be light khaki.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "h-light kaki", "large" ] }, "asin": "B08SVZ6SDM" }, { "task_id": "ws_B08SVZ6SDM_1317", "instruction": "i want to find a large pair of men's shorts with an elastic waistband. the color should be light khaki.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "h-light kaki", "large" ] }, "asin": "B08SVZ6SDM" }, { "task_id": "ws_B09NM4JZYL_1318", "instruction": "i need facial wax strips for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09NM4JZYL" }, { "task_id": "ws_B09NM4JZYL_1319", "instruction": "i need facial wax strips for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09NM4JZYL" }, { "task_id": "ws_B082MTPR2N_1320", "instruction": "i would like a 1 pound white chocolate covered bag of coffee bean.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "white chocolate", "1 pound (pack of 1)" ] }, "asin": "B082MTPR2N" }, { "task_id": "ws_B082MTPR2N_1321", "instruction": "i would like a 1 pound white chocolate covered bag of coffee bean.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "white chocolate", "1 pound (pack of 1)" ] }, "asin": "B082MTPR2N" }, { "task_id": "ws_B09RMHRGR9_1322", "instruction": "looking for triple bunkbeds in wood for kids with space saving in white and with a twin bunk bed with trundle and drawers", "target_attributes": { "attributes": [ "space saving" ], "options": [ "white", "twin bunk bed with trundle and drawers" ] }, "asin": "B09RMHRGR9" }, { "task_id": "ws_B09RMHRGR9_1323", "instruction": "looking for triple bunkbeds in wood for kids with space saving in white and with a twin bunk bed with trundle and drawers", "target_attributes": { "attributes": [ "space saving" ], "options": [ "white", "twin bunk bed with trundle and drawers" ] }, "asin": "B09RMHRGR9" }, { "task_id": "ws_B08SJR7KDF_1324", "instruction": "search a perfume body with long lasting and scent impression of love in white and a travel size", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "impression of love in white" ] }, "asin": "B08SJR7KDF" }, { "task_id": "ws_B08SJR7KDF_1325", "instruction": "search a perfume body with long lasting and scent impression of love in white and a travel size", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "impression of love in white" ] }, "asin": "B08SJR7KDF" }, { "task_id": "ws_B08F28K7VP_1326", "instruction": "looking for steel toe sneakers no slip with quality materials in green color 6.5 size for men", "target_attributes": { "attributes": [ "non slip", "quality materials" ], "options": [ "green", "8 women | 6.5 men" ] }, "asin": "B08F28K7VP" }, { "task_id": "ws_B08F28K7VP_1327", "instruction": "looking for steel toe sneakers no slip with quality materials in green color 6.5 size for men", "target_attributes": { "attributes": [ "non slip", "quality materials" ], "options": [ "green", "8 women | 6.5 men" ] }, "asin": "B08F28K7VP" }, { "task_id": "ws_B08PV5Y6J3_1328", "instruction": "i need a set of 15 bpa free and eco-friendly jars.", "target_attributes": { "attributes": [ "bpa free", "eco friendly" ], "options": [ "clear-15pcs" ] }, "asin": "B08PV5Y6J3" }, { "task_id": "ws_B08PV5Y6J3_1329", "instruction": "i need a set of 15 bpa free and eco-friendly jars.", "target_attributes": { "attributes": [ "bpa free", "eco friendly" ], "options": [ "clear-15pcs" ] }, "asin": "B08PV5Y6J3" }, { "task_id": "ws_B088FNFYPQ_1330", "instruction": "i'm looking for a surge protector that is black and offers usb ports.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B088FNFYPQ" }, { "task_id": "ws_B088FNFYPQ_1331", "instruction": "i'm looking for a surge protector that is black and offers usb ports.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B088FNFYPQ" }, { "task_id": "ws_B09MFM5LSW_1332", "instruction": "i want to buy a manual toothbrush for sensitive teeth that has a multicolored wave design on it.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "(white & black & pink & green) wave" ] }, "asin": "B09MFM5LSW" }, { "task_id": "ws_B09MFM5LSW_1333", "instruction": "i want to buy a manual toothbrush for sensitive teeth that has a multicolored wave design on it.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "(white & black & pink & green) wave" ] }, "asin": "B09MFM5LSW" }, { "task_id": "ws_B07Q5157HQ_1334", "instruction": "i am looking for a light weight underwater backdrop for a photo studio.", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B07Q5157HQ" }, { "task_id": "ws_B07Q5157HQ_1335", "instruction": "i am looking for a light weight underwater backdrop for a photo studio.", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B07Q5157HQ" }, { "task_id": "ws_B09BRF22MZ_1336", "instruction": "i'm looking for long lasting waterproof brow stamp shaping kits, preferably dark brown color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "dark brown" ] }, "asin": "B09BRF22MZ" }, { "task_id": "ws_B09BRF22MZ_1337", "instruction": "i'm looking for long lasting waterproof brow stamp shaping kits, preferably dark brown color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "dark brown" ] }, "asin": "B09BRF22MZ" }, { "task_id": "ws_B08DTHB7BV_1338", "instruction": "i am loojking for a aluminum alloy single microphone set having black and red color", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "black and red", "single microphone set" ] }, "asin": "B08DTHB7BV" }, { "task_id": "ws_B08DTHB7BV_1339", "instruction": "i am loojking for a aluminum alloy single microphone set having black and red color", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "black and red", "single microphone set" ] }, "asin": "B08DTHB7BV" }, { "task_id": "ws_B08DTHB7BV_1340", "instruction": "i would like a rose gold dual microphone set that comes with batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "rose gold", "dual microphone set" ] }, "asin": "B08DTHB7BV" }, { "task_id": "ws_B09PRGZM4D_1341", "instruction": "i need a fashionable zdfer polo with a slim fit in the green color.", "target_attributes": { "attributes": [ "slim fit", "fashion design" ], "options": [ "112-green" ] }, "asin": "B09PRGZM4D" }, { "task_id": "ws_B09PRGZM4D_1342", "instruction": "i need a fashionable zdfer polo with a slim fit in the green color.", "target_attributes": { "attributes": [ "slim fit", "fashion design" ], "options": [ "112-green" ] }, "asin": "B09PRGZM4D" }, { "task_id": "ws_B000N68ILE_1343", "instruction": "i'm looking to buy a high performance digital camera with optical zoom.", "target_attributes": { "attributes": [ "high performance", "optical zoom" ], "options": [] }, "asin": "B000N68ILE" }, { "task_id": "ws_B000N68ILE_1344", "instruction": "i'm looking to buy a high performance digital camera with optical zoom.", "target_attributes": { "attributes": [ "high performance", "optical zoom" ], "options": [] }, "asin": "B000N68ILE" }, { "task_id": "ws_B07L4KJXWL_1345", "instruction": "i need a barebone intel core computer system in an aluminum alloy case with an i7-8850h.", "target_attributes": { "attributes": [ "intel core", "aluminum alloy" ], "options": [ "cpu i7-8850h" ] }, "asin": "B07L4KJXWL" }, { "task_id": "ws_B07L4KJXWL_1346", "instruction": "i need a barebone intel core computer system in an aluminum alloy case with an i7-8850h.", "target_attributes": { "attributes": [ "intel core", "aluminum alloy" ], "options": [ "cpu i7-8850h" ] }, "asin": "B07L4KJXWL" }, { "task_id": "ws_B0723CL3ZJ_1347", "instruction": "i would like a hands free cd dvd car stereo reciever.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "single din cd | dvd av bluetooth" ] }, "asin": "B0723CL3ZJ" }, { "task_id": "ws_B0723CL3ZJ_1348", "instruction": "i would like a hands free cd dvd car stereo reciever.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "single din cd | dvd av bluetooth" ] }, "asin": "B0723CL3ZJ" }, { "task_id": "ws_B085Y48HZM_1349", "instruction": "i need some concealer for my dark circles that is in shade 03 natural", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "03.natural" ] }, "asin": "B085Y48HZM" }, { "task_id": "ws_B085Y48HZM_1350", "instruction": "i need some concealer for my dark circles that is in shade 03 natural", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "03.natural" ] }, "asin": "B085Y48HZM" }, { "task_id": "ws_B085Y48HZM_1351", "instruction": "i need a liquid concealer to fix my dark circles. pick a warm natural shade.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "a-04.warm natural" ] }, "asin": "B085Y48HZM" }, { "task_id": "ws_B06XPRNQ92_1352", "instruction": "i need a machine washable t-shirt that is pink and in a size medium.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pink", "medium" ] }, "asin": "B06XPRNQ92" }, { "task_id": "ws_B06XPRNQ92_1353", "instruction": "i need a machine washable t-shirt that is pink and in a size medium.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pink", "medium" ] }, "asin": "B06XPRNQ92" }, { "task_id": "ws_B09MCXRWD1_1354", "instruction": "i need an eco friendly window film that is multi color and the size 23.6\" x 59\".", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "multi-11105", "23.6\" x 59\" x 2 pcs" ] }, "asin": "B09MCXRWD1" }, { "task_id": "ws_B09MCXRWD1_1355", "instruction": "i need an eco friendly window film that is multi color and the size 23.6\" x 59\".", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "multi-11105", "23.6\" x 59\" x 2 pcs" ] }, "asin": "B09MCXRWD1" }, { "task_id": "ws_B07YNFJF3V_1356", "instruction": "i'd like to buy a ready to hang toilet paper holder for size 24 by 30 rolls.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "24x30" ] }, "asin": "B07YNFJF3V" }, { "task_id": "ws_B07YNFJF3V_1357", "instruction": "i'd like to buy a ready to hang toilet paper holder for size 24 by 30 rolls.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "24x30" ] }, "asin": "B07YNFJF3V" }, { "task_id": "ws_B07YNFJF3V_1358", "instruction": "i want a ready to hang wall plaque with a wood finish.", "target_attributes": { "attributes": [ "ready hang", "wood finish" ], "options": [ "wall plaque" ] }, "asin": "B07YNFJF3V" }, { "task_id": "ws_B087J3LZ87_1359", "instruction": "i'm looking for black color 1080p hd male to female converter adapter cable for laptop hdtv dvd.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "black" ] }, "asin": "B087J3LZ87" }, { "task_id": "ws_B087J3LZ87_1360", "instruction": "i'm looking for black color 1080p hd male to female converter adapter cable for laptop hdtv dvd.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "black" ] }, "asin": "B087J3LZ87" }, { "task_id": "ws_B0777L4NZW_1361", "instruction": "i am interested in machine washable throw pillow covers in a size 28\" by 28\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "28\" x 28\"" ] }, "asin": "B0777L4NZW" }, { "task_id": "ws_B0777L4NZW_1362", "instruction": "i am interested in machine washable throw pillow covers in a size 28\" by 28\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "28\" x 28\"" ] }, "asin": "B0777L4NZW" }, { "task_id": "ws_B00S5643SQ_1363", "instruction": "i'm looking for a 1.18 fluid ounce pack of oil free hydrating gel cream. i want the flavor to be sienna.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "sienna 10", "1.18 fl oz (pack of 1)" ] }, "asin": "B00S5643SQ" }, { "task_id": "ws_B00S5643SQ_1364", "instruction": "i'm looking for a 1.18 fluid ounce pack of oil free hydrating gel cream. i want the flavor to be sienna.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "sienna 10", "1.18 fl oz (pack of 1)" ] }, "asin": "B00S5643SQ" }, { "task_id": "ws_B09P6983SX_1365", "instruction": "i need a console table for the living room that is size 140 by 15 by 100 cm.", "target_attributes": { "attributes": [ "living room" ], "options": [ "140x15x100cm" ] }, "asin": "B09P6983SX" }, { "task_id": "ws_B09P6983SX_1366", "instruction": "i need a console table for the living room that is size 140 by 15 by 100 cm.", "target_attributes": { "attributes": [ "living room" ], "options": [ "140x15x100cm" ] }, "asin": "B09P6983SX" }, { "task_id": "ws_B09QMN5LD2_1367", "instruction": "i'm looking for a tempered glass protector that is easy to install.", "target_attributes": { "attributes": [ "easy install", "tempered glass" ], "options": [] }, "asin": "B09QMN5LD2" }, { "task_id": "ws_B09QMN5LD2_1368", "instruction": "i'm looking for a tempered glass protector that is easy to install.", "target_attributes": { "attributes": [ "easy install", "tempered glass" ], "options": [] }, "asin": "B09QMN5LD2" }, { "task_id": "ws_B07DVXMWHW_1369", "instruction": "i am looking for a high quality cosmetic bag of butterfly-1 color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "butterfly-1" ] }, "asin": "B07DVXMWHW" }, { "task_id": "ws_B07DVXMWHW_1370", "instruction": "i am looking for a high quality cosmetic bag of butterfly-1 color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "butterfly-1" ] }, "asin": "B07DVXMWHW" }, { "task_id": "ws_B099DFVXVR_1371", "instruction": "i'm interested in a variety pack of veggie snacks that offer vitamins, but not artificial flavors.", "target_attributes": { "attributes": [ "source vitamin", "artificial flavors" ], "options": [ "variety pack" ] }, "asin": "B099DFVXVR" }, { "task_id": "ws_B099DFVXVR_1372", "instruction": "i'm interested in a variety pack of veggie snacks that offer vitamins, but not artificial flavors.", "target_attributes": { "attributes": [ "source vitamin", "artificial flavors" ], "options": [ "variety pack" ] }, "asin": "B099DFVXVR" }, { "task_id": "ws_B09QHRCF6M_1373", "instruction": "i wuold like a purple 190 by 70cm round head linens for my beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "purple", "190*70cm round head" ] }, "asin": "B09QHRCF6M" }, { "task_id": "ws_B09QHRCF6M_1374", "instruction": "i wuold like a purple 190 by 70cm round head linens for my beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "purple", "190*70cm round head" ] }, "asin": "B09QHRCF6M" }, { "task_id": "ws_B07CR9T4FH_1375", "instruction": "i would like a 4g lte phone that's device only.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "device only" ] }, "asin": "B07CR9T4FH" }, { "task_id": "ws_B07CR9T4FH_1376", "instruction": "i would like a 4g lte phone that's device only.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "device only" ] }, "asin": "B07CR9T4FH" }, { "task_id": "ws_B09PYXZM6J_1377", "instruction": "i need a black wireless bluetooth soundbar.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09PYXZM6J" }, { "task_id": "ws_B09PYXZM6J_1378", "instruction": "i need a black wireless bluetooth soundbar.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09PYXZM6J" }, { "task_id": "ws_B09QSWJHJQ_1379", "instruction": "i'm looking for a tempered glass window covering film for privacy in my dining room. it should be 23.6in by 47.2in.", "target_attributes": { "attributes": [ "tempered glass", "dining room" ], "options": [ "(width\uff0923.6in x (length)47.2in" ] }, "asin": "B09QSWJHJQ" }, { "task_id": "ws_B09QSWJHJQ_1380", "instruction": "i'm looking for a tempered glass window covering film for privacy in my dining room. it should be 23.6in by 47.2in.", "target_attributes": { "attributes": [ "tempered glass", "dining room" ], "options": [ "(width\uff0923.6in x (length)47.2in" ] }, "asin": "B09QSWJHJQ" }, { "task_id": "ws_B0773TPF7M_1381", "instruction": "i want to get a 13-ounce pack of mega omega trail mix with no artificial ingredients.", "target_attributes": { "attributes": [ "artificial ingredients" ], "options": [ "mega omega", "13 ounce (pack of 1)" ] }, "asin": "B0773TPF7M" }, { "task_id": "ws_B0773TPF7M_1382", "instruction": "i want to get a 13-ounce pack of mega omega trail mix with no artificial ingredients.", "target_attributes": { "attributes": [ "artificial ingredients" ], "options": [ "mega omega", "13 ounce (pack of 1)" ] }, "asin": "B0773TPF7M" }, { "task_id": "ws_B01B384AZS_1383", "instruction": "i would like oxford shoes that are brown and size 11 x-wide with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown smooth", "11 x-wide" ] }, "asin": "B01B384AZS" }, { "task_id": "ws_B01B384AZS_1384", "instruction": "i would like oxford shoes that are brown and size 11 x-wide with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown smooth", "11 x-wide" ] }, "asin": "B01B384AZS" }, { "task_id": "ws_B09Q6BWQKW_1385", "instruction": "i need a kids u-shaped toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "f" ] }, "asin": "B09Q6BWQKW" }, { "task_id": "ws_B09Q6BWQKW_1386", "instruction": "i need a kids u-shaped toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "f" ] }, "asin": "B09Q6BWQKW" }, { "task_id": "ws_B09P78D1VH_1387", "instruction": "i am looking for a long sleeve mens hoodie pullover size x-large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large" ] }, "asin": "B09P78D1VH" }, { "task_id": "ws_B09P78D1VH_1388", "instruction": "i am looking for a long sleeve mens hoodie pullover size x-large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large" ] }, "asin": "B09P78D1VH" }, { "task_id": "ws_B09BVJ7T8M_1389", "instruction": "i need cupcake toppers for a birthday party that are in the color rg-50th", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "rg-50th" ] }, "asin": "B09BVJ7T8M" }, { "task_id": "ws_B09BVJ7T8M_1390", "instruction": "i need cupcake toppers for a birthday party that are in the color rg-50th", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "rg-50th" ] }, "asin": "B09BVJ7T8M" }, { "task_id": "ws_B075L8H2H5_1391", "instruction": "i need a california king mattress set that has a 4\" foundation", "target_attributes": { "attributes": [ "king size" ], "options": [ "california king", "4\" foundation" ] }, "asin": "B075L8H2H5" }, { "task_id": "ws_B075L8H2H5_1392", "instruction": "i need a california king mattress set that has a 4\" foundation", "target_attributes": { "attributes": [ "king size" ], "options": [ "california king", "4\" foundation" ] }, "asin": "B075L8H2H5" }, { "task_id": "ws_B09J18Q23T_1393", "instruction": "i'm interested in a table runner that is 72\"x16\"+13\"x19\"x4, easy to clean and machine washable.", "target_attributes": { "attributes": [ "machine washable", "easy clean" ], "options": [ "72\"x16\"+13\"x19\"x4" ] }, "asin": "B09J18Q23T" }, { "task_id": "ws_B09J18Q23T_1394", "instruction": "i'm interested in a table runner that is 72\"x16\"+13\"x19\"x4, easy to clean and machine washable.", "target_attributes": { "attributes": [ "machine washable", "easy clean" ], "options": [ "72\"x16\"+13\"x19\"x4" ] }, "asin": "B09J18Q23T" }, { "task_id": "ws_B00NQFJ42G_1395", "instruction": "i need jade johnny mbj women's casual comfy wide leg pants in size medium.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "wb750_jade", "medium" ] }, "asin": "B00NQFJ42G" }, { "task_id": "ws_B00NQFJ42G_1396", "instruction": "i need jade johnny mbj women's casual comfy wide leg pants in size medium.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "wb750_jade", "medium" ] }, "asin": "B00NQFJ42G" }, { "task_id": "ws_B09PH95SSN_1397", "instruction": "i would like a pair of c clippers for hair cutting.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "c" ] }, "asin": "B09PH95SSN" }, { "task_id": "ws_B09PH95SSN_1398", "instruction": "i would like a pair of c clippers for hair cutting.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "c" ] }, "asin": "B09PH95SSN" }, { "task_id": "ws_B0927GRTKG_1399", "instruction": "i am looking for easy install and ready hang kitchen artwork-04 with size s-(18x12inches)", "target_attributes": { "attributes": [ "ready hang", "easy install" ], "options": [ "kitchen artwork-04", "s-(18 x 12 inches)" ] }, "asin": "B0927GRTKG" }, { "task_id": "ws_B0927GRTKG_1400", "instruction": "i am looking for easy install and ready hang kitchen artwork-04 with size s-(18x12inches)", "target_attributes": { "attributes": [ "ready hang", "easy install" ], "options": [ "kitchen artwork-04", "s-(18 x 12 inches)" ] }, "asin": "B0927GRTKG" }, { "task_id": "ws_B09MR36WWT_1401", "instruction": "i'm looking for a desktop pc with an intel core i5 processor alongside 16 gb of ram and a 1 tb nvme ssd for storage.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "16gb ram + 1tb nvme ssd" ] }, "asin": "B09MR36WWT" }, { "task_id": "ws_B09MR36WWT_1402", "instruction": "i'm looking for a desktop pc with an intel core i5 processor alongside 16 gb of ram and a 1 tb nvme ssd for storage.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "16gb ram + 1tb nvme ssd" ] }, "asin": "B09MR36WWT" }, { "task_id": "ws_B00910O4YS_1403", "instruction": "i am looking for endurance crunch granola that comes in a pack of six and is non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "endurance crunch", "12 ounce (pack of 6)" ] }, "asin": "B00910O4YS" }, { "task_id": "ws_B00910O4YS_1404", "instruction": "i am looking for endurance crunch granola that comes in a pack of six and is non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "endurance crunch", "12 ounce (pack of 6)" ] }, "asin": "B00910O4YS" }, { "task_id": "ws_B00910O4YS_1405", "instruction": "i am looking for a 12 ounce (pack of 6) of baked fresh granola", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "12 ounce (pack of 6)" ] }, "asin": "B00910O4YS" }, { "task_id": "ws_B09M3XZKKL_1406", "instruction": "i would like a nightstand that is brown with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "brown8" ] }, "asin": "B09M3XZKKL" }, { "task_id": "ws_B09M3XZKKL_1407", "instruction": "i need a gray nightstand with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "grey3" ] }, "asin": "B09M3XZKKL" }, { "task_id": "ws_B09M3XZKKL_1408", "instruction": "i would like a nightstand that is brown with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "brown8" ] }, "asin": "B09M3XZKKL" }, { "task_id": "ws_B09M3XZKKL_1409", "instruction": "i need a gray nightstand with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "grey3" ] }, "asin": "B09M3XZKKL" }, { "task_id": "ws_B08QMXXJ82_1410", "instruction": "i need a red k22 phone case that comes with a tempered glass screen protector.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "kj-red" ] }, "asin": "B08QMXXJ82" }, { "task_id": "ws_B08QMXXJ82_1411", "instruction": "i need a red k22 phone case that comes with a tempered glass screen protector.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "kj-red" ] }, "asin": "B08QMXXJ82" }, { "task_id": "ws_B000MWFD3U_1412", "instruction": "i need to order a fully assembled tan chair.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "tan" ] }, "asin": "B000MWFD3U" }, { "task_id": "ws_B000MWFD3U_1413", "instruction": "i need to order a fully assembled tan chair.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "tan" ] }, "asin": "B000MWFD3U" }, { "task_id": "ws_B093WWHRLT_1414", "instruction": "i am looking for a high speed 50 foot 8k hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "50 ft", "8k" ] }, "asin": "B093WWHRLT" }, { "task_id": "ws_B093WWHRLT_1415", "instruction": "i am looking for a high speed 50 foot 8k hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "50 ft", "8k" ] }, "asin": "B093WWHRLT" }, { "task_id": "ws_B081YYPFDS_1416", "instruction": "i'm looking for a size 54w x 29l straight leg levi's men's jean.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "54w x 29l" ] }, "asin": "B081YYPFDS" }, { "task_id": "ws_B081YYPFDS_1417", "instruction": "i'm looking for a size 54w x 29l straight leg levi's men's jean.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "54w x 29l" ] }, "asin": "B081YYPFDS" }, { "task_id": "ws_B09M6W62XL_1418", "instruction": "i want to shop for a wooden bedframe in grey.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "grey" ] }, "asin": "B09M6W62XL" }, { "task_id": "ws_B09M6W62XL_1419", "instruction": "i want to shop for a wooden bedframe in grey.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "grey" ] }, "asin": "B09M6W62XL" }, { "task_id": "ws_B09M6W62XL_1420", "instruction": "i am looking for space saving bed with slide for kids without box spring.please choose black color.", "target_attributes": { "attributes": [ "space saving", "box spring" ], "options": [ "black 2" ] }, "asin": "B09M6W62XL" }, { "task_id": "ws_B09NDPP6PK_1421", "instruction": "i'm looking for a sandals with strap platform size 5 open toe in black", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z4 black", "5" ] }, "asin": "B09NDPP6PK" }, { "task_id": "ws_B09NDPP6PK_1422", "instruction": "i'm looking for a sandals with strap platform size 5 open toe in black", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z4 black", "5" ] }, "asin": "B09NDPP6PK" }, { "task_id": "ws_B09G9KPK18_1423", "instruction": "i am looking for men's size 13 work shoes with arch support and rubber soles.", "target_attributes": { "attributes": [ "arch support", "rubber sole" ], "options": [ "13" ] }, "asin": "B09G9KPK18" }, { "task_id": "ws_B09G9KPK18_1424", "instruction": "i am looking for men's size 13 work shoes with arch support and rubber soles.", "target_attributes": { "attributes": [ "arch support", "rubber sole" ], "options": [ "13" ] }, "asin": "B09G9KPK18" }, { "task_id": "ws_B08QDRBN5X_1425", "instruction": "i need a 9 ounce pack of chocolate peanut butter keto cereal that is grain free.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "chocolate peanut butter", "9 ounce (pack of 4)" ] }, "asin": "B08QDRBN5X" }, { "task_id": "ws_B08QDRBN5X_1426", "instruction": "i need a 9 ounce pack of chocolate peanut butter keto cereal that is grain free.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "chocolate peanut butter", "9 ounce (pack of 4)" ] }, "asin": "B08QDRBN5X" }, { "task_id": "ws_B0852K8KD7_1427", "instruction": "i am looking for a tripod that is compatible with apple and that is black and white.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "black | white" ] }, "asin": "B0852K8KD7" }, { "task_id": "ws_B0852K8KD7_1428", "instruction": "i am looking for a tripod that is compatible with apple and that is black and white.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "black | white" ] }, "asin": "B0852K8KD7" }, { "task_id": "ws_B08MX4RGBH_1429", "instruction": "i need to buy gray synthetic hair extensions. buy the six pack of eight inch extensions.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "m1b | gray#", "8 inch 6packs" ] }, "asin": "B08MX4RGBH" }, { "task_id": "ws_B08MX4RGBH_1430", "instruction": "i need to buy gray synthetic hair extensions. buy the six pack of eight inch extensions.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "m1b | gray#", "8 inch 6packs" ] }, "asin": "B08MX4RGBH" }, { "task_id": "ws_B097M88R9W_1431", "instruction": "i am looking for an adult daily wear hoodie sweatshirt size large-x-large.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "large-x-large" ] }, "asin": "B097M88R9W" }, { "task_id": "ws_B097M88R9W_1432", "instruction": "i am looking for an adult daily wear hoodie sweatshirt size large-x-large.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "large-x-large" ] }, "asin": "B097M88R9W" }, { "task_id": "ws_B00182JYZ6_1433", "instruction": "i am looking for a light cool brown easy to use hair color kit.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "6a light cool brown" ] }, "asin": "B00182JYZ6" }, { "task_id": "ws_B00182JYZ6_1434", "instruction": "i am looking for a light cool brown easy to use hair color kit.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "6a light cool brown" ] }, "asin": "B00182JYZ6" }, { "task_id": "ws_B00182JYZ6_1435", "instruction": "i want a one count pack of brown permanent hair color with coconut oil.", "target_attributes": { "attributes": [ "coconut oil", "permanent hair" ], "options": [ "6g vibrant light golden brown", "1 count (pack of 1)" ] }, "asin": "B00182JYZ6" }, { "task_id": "ws_B08FRM3HRG_1436", "instruction": "i'm looking for gluten-free almond flour cookies that contain flaxseed and sunflower seeds in a smoked barbecue cheedar flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "smoky bbq cheddar" ] }, "asin": "B08FRM3HRG" }, { "task_id": "ws_B08FRM3HRG_1437", "instruction": "i'm looking for gluten-free almond flour cookies that contain flaxseed and sunflower seeds in a smoked barbecue cheedar flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "smoky bbq cheddar" ] }, "asin": "B08FRM3HRG" }, { "task_id": "ws_B09G2X4GDX_1438", "instruction": "i am looking for a high performance 18 volt charger adapter for beats by dr dre.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B09G2X4GDX" }, { "task_id": "ws_B09G2X4GDX_1439", "instruction": "i am looking for a high performance 18 volt charger adapter for beats by dr dre.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B09G2X4GDX" }, { "task_id": "ws_B07CLKJ7ZC_1440", "instruction": "please get me an ac adapter with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07CLKJ7ZC" }, { "task_id": "ws_B07CLKJ7ZC_1441", "instruction": "please get me an ac adapter with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07CLKJ7ZC" }, { "task_id": "ws_B09KG8KSRT_1442", "instruction": "i need to buy a wall art print for my living room in a natural 16\" x 24\" x 3.", "target_attributes": { "attributes": [ "living room" ], "options": [ "16\" x 24\" x 3 panels natural" ] }, "asin": "B09KG8KSRT" }, { "task_id": "ws_B09KG8KSRT_1443", "instruction": "i need to buy a wall art print for my living room in a natural 16\" x 24\" x 3.", "target_attributes": { "attributes": [ "living room" ], "options": [ "16\" x 24\" x 3 panels natural" ] }, "asin": "B09KG8KSRT" }, { "task_id": "ws_B09LTWYH48_1444", "instruction": "i need a s20 tv sound bar that comes with a wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "s20" ] }, "asin": "B09LTWYH48" }, { "task_id": "ws_B09LTWYH48_1445", "instruction": "i need a s20 tv sound bar that comes with a wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "s20" ] }, "asin": "B09LTWYH48" }, { "task_id": "ws_B087GFN56C_1446", "instruction": "i am looking for wild caught, ready to eat sardines in a tomato sauce.", "target_attributes": { "attributes": [ "wild caught", "ready eat" ], "options": [ "tomato sauce" ] }, "asin": "B087GFN56C" }, { "task_id": "ws_B087GFN56C_1447", "instruction": "i am looking for wild caught, ready to eat sardines in a tomato sauce.", "target_attributes": { "attributes": [ "wild caught", "ready eat" ], "options": [ "tomato sauce" ] }, "asin": "B087GFN56C" }, { "task_id": "ws_B09M74RY5C_1448", "instruction": "i want to find pink horse-shaped cupcake toppers that i can use for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "pink" ] }, "asin": "B09M74RY5C" }, { "task_id": "ws_B09M74RY5C_1449", "instruction": "i want to find pink horse-shaped cupcake toppers that i can use for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "pink" ] }, "asin": "B09M74RY5C" }, { "task_id": "ws_B08T3QJJRT_1450", "instruction": "i am looking for some kosher chocolate bars that are 2 pounds.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B08T3QJJRT" }, { "task_id": "ws_B08T3QJJRT_1451", "instruction": "i am looking for some kosher chocolate bars that are 2 pounds.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B08T3QJJRT" }, { "task_id": "ws_B08YZ1XLGB_1452", "instruction": "looking for a coffee table with metal legs for living room rustic style", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [] }, "asin": "B08YZ1XLGB" }, { "task_id": "ws_B08YZ1XLGB_1453", "instruction": "looking for a coffee table with metal legs for living room rustic style", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [] }, "asin": "B08YZ1XLGB" }, { "task_id": "ws_B09QKFB7LL_1454", "instruction": "i am looking for a black color radio alarm clock having stereo sound and hands free.", "target_attributes": { "attributes": [ "hands free", "stereo sound" ], "options": [ "black" ] }, "asin": "B09QKFB7LL" }, { "task_id": "ws_B09QKFB7LL_1455", "instruction": "i am looking for a black color radio alarm clock having stereo sound and hands free.", "target_attributes": { "attributes": [ "hands free", "stereo sound" ], "options": [ "black" ] }, "asin": "B09QKFB7LL" }, { "task_id": "ws_B000BNG4VU_1456", "instruction": "i need long lasting honey beige face powder, pack of 1", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "honey beige", "pack of 1", "face powder" ] }, "asin": "B000BNG4VU" }, { "task_id": "ws_B000BNG4VU_1457", "instruction": "i need long lasting honey beige face powder, pack of 1", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "honey beige", "pack of 1", "face powder" ] }, "asin": "B000BNG4VU" }, { "task_id": "ws_B09JJX555S_1458", "instruction": "i am looking for a long sleeve men's pullover hoodie, size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09JJX555S" }, { "task_id": "ws_B09JJX555S_1459", "instruction": "i am looking for a long sleeve men's pullover hoodie, size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09JJX555S" }, { "task_id": "ws_B01K0PGUKI_1460", "instruction": "i need a theater sized pull-down projector screen.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "projector screen", "16:10, aspect ratio" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1461", "instruction": "i'm looking for a 109\" ultra hd projector screen that's easy to install. also, make it white.", "target_attributes": { "attributes": [ "ultra hd", "easy install" ], "options": [ "white | white", "109\"" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1462", "instruction": "i am looking for a pull down manual projector screen with aspect ratio 16:10 and ultra hd. also easy to install.", "target_attributes": { "attributes": [ "ultra hd", "easy install" ], "options": [ "16:10, aspect ratio" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1463", "instruction": "i need a theater sized pull-down projector screen.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "projector screen", "16:10, aspect ratio" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1464", "instruction": "i'm looking for ultra hd white color television because it looks so nice.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "white" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1465", "instruction": "i'm looking for a new screen for my projector. it should be very easy to install and white. i need a screen of at least 113 inches.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "white", "113\"" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1466", "instruction": "i am looking for a ultra hd projection screens of black color", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "black" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1467", "instruction": "i'm looking for a black manual projector screen easy to install of 142\" and 1:1 for project screen", "target_attributes": { "attributes": [ "easy install" ], "options": [ "black", "projector screen + 6\" white projector screen", "142\"", "1:1, apect ratio" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1468", "instruction": "i am looking for a ultra hd projection screen that is 80\"", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "80\"" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1469", "instruction": "i am looking for150\" white color 4:3, 4k ultra hd 3d ready projector screen", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "4:3, white", "projector screen", "150\"" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1470", "instruction": "i am looking for an ultra hd pull down projector screen that is 150\" at least? also, can i request black?", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "150\"" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B01K0PGUKI_1471", "instruction": "i'm looking for a 109-inch black manual projector screen that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "black", "projector screen + 6\" black projector screen", "109\"", "manual" ] }, "asin": "B01K0PGUKI" }, { "task_id": "ws_B074948P23_1472", "instruction": "i am looking for a classic fit pant of stone color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "stone" ] }, "asin": "B074948P23" }, { "task_id": "ws_B074948P23_1473", "instruction": "i am looking for a classic fit pant of stone color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "stone" ] }, "asin": "B074948P23" }, { "task_id": "ws_B00B041E0A_1474", "instruction": "i'm looking for a package of green tea mix that has low calories and is zero sugar. i would also like it in a 48 count package.", "target_attributes": { "attributes": [ "low calorie", "zero sugar" ], "options": [ "48 count" ] }, "asin": "B00B041E0A" }, { "task_id": "ws_B00B041E0A_1475", "instruction": "i'm looking for a package of green tea mix that has low calories and is zero sugar. i would also like it in a 48 count package.", "target_attributes": { "attributes": [ "low calorie", "zero sugar" ], "options": [ "48 count" ] }, "asin": "B00B041E0A" }, { "task_id": "ws_B00B041E0A_1476", "instruction": "i am looking for low calorie and zero sugar pomegranate green tea drink mix, 48 count", "target_attributes": { "attributes": [ "low calorie", "zero sugar" ], "options": [ "sugar-free pomegranate green tea", "48 count" ] }, "asin": "B00B041E0A" }, { "task_id": "ws_B00B041E0A_1477", "instruction": "i am looking for 72 packets of mango green tea that is low calorie", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "sugar-free peach mango green tea", "72 count" ] }, "asin": "B00B041E0A" }, { "task_id": "ws_B0034E5CWK_1478", "instruction": "i'm looking for 4.2 ounce gluten free matiz sardine.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "4.2 ounce (pack of 5)" ] }, "asin": "B0034E5CWK" }, { "task_id": "ws_B0034E5CWK_1479", "instruction": "i'm looking for 4.2 ounce gluten free matiz sardine.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "4.2 ounce (pack of 5)" ] }, "asin": "B0034E5CWK" }, { "task_id": "ws_B094JJ2J25_1480", "instruction": "i am looking for a furniture set with 6 inch bun legs and is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "6 inch bun legs" ] }, "asin": "B094JJ2J25" }, { "task_id": "ws_B094JJ2J25_1481", "instruction": "i am looking for a furniture set with 6 inch bun legs and is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "6 inch bun legs" ] }, "asin": "B094JJ2J25" }, { "task_id": "ws_B07DLS2MKT_1482", "instruction": "i need to find 20-60x80 monoculars for some bird watching action.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B07DLS2MKT" }, { "task_id": "ws_B07DLS2MKT_1483", "instruction": "i need to find 20-60x80 monoculars for some bird watching action.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B07DLS2MKT" }, { "task_id": "ws_B09FF1V6QJ_1484", "instruction": "i am looking for a brush set without a bag that is made from synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "style9 without bag" ] }, "asin": "B09FF1V6QJ" }, { "task_id": "ws_B09FF1V6QJ_1485", "instruction": "i am looking for a brush set without a bag that is made from synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "style9 without bag" ] }, "asin": "B09FF1V6QJ" }, { "task_id": "ws_B07XRQJ876_1486", "instruction": "i need storage cabinets for the living room that are white.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B07XRQJ876" }, { "task_id": "ws_B07XRQJ876_1487", "instruction": "i need storage cabinets for the living room that are white.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B07XRQJ876" }, { "task_id": "ws_B09HKDHMY6_1488", "instruction": "i am looking for a red buffet that is easy to assemble and is 14.96 by 11.81 by 27.76 inches.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "red", "14.96 x 11.81 x 27.76 inch" ] }, "asin": "B09HKDHMY6" }, { "task_id": "ws_B09HKDHMY6_1489", "instruction": "i am looking for a red buffet that is easy to assemble and is 14.96 by 11.81 by 27.76 inches.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "red", "14.96 x 11.81 x 27.76 inch" ] }, "asin": "B09HKDHMY6" }, { "task_id": "ws_B09HKDHMY6_1490", "instruction": "i want a blue storage cabinet end table for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue" ] }, "asin": "B09HKDHMY6" }, { "task_id": "ws_B07W1ZDHY9_1491", "instruction": "i would like a pair of black binoculars for bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [ "black-8x42" ] }, "asin": "B07W1ZDHY9" }, { "task_id": "ws_B07W1ZDHY9_1492", "instruction": "i would like a pair of black binoculars for bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [ "black-8x42" ] }, "asin": "B07W1ZDHY9" }, { "task_id": "ws_B09QXBN74Y_1493", "instruction": "i want to find a small purple tankini top that teen girls can wear.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "a6-purple", "small" ] }, "asin": "B09QXBN74Y" }, { "task_id": "ws_B09QXBN74Y_1494", "instruction": "i want to find a small purple tankini top that teen girls can wear.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "a6-purple", "small" ] }, "asin": "B09QXBN74Y" }, { "task_id": "ws_B09GLV1HTT_1495", "instruction": "i am looking for a chrome sputnik chandelier for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "chrome-2" ] }, "asin": "B09GLV1HTT" }, { "task_id": "ws_B09GLV1HTT_1496", "instruction": "i am interested in a contemporary style chandelier that is black.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "black" ] }, "asin": "B09GLV1HTT" }, { "task_id": "ws_B09GLV1HTT_1497", "instruction": "i am looking for a chrome sputnik chandelier for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "chrome-2" ] }, "asin": "B09GLV1HTT" }, { "task_id": "ws_B09GLV1HTT_1498", "instruction": "i am interested in a contemporary style chandelier that is black.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "black" ] }, "asin": "B09GLV1HTT" }, { "task_id": "ws_B09LYN1QM3_1499", "instruction": "i would like a charcoal ottoman that's button tufted.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "charcoal" ] }, "asin": "B09LYN1QM3" }, { "task_id": "ws_B09LYN1QM3_1500", "instruction": "i would like a charcoal ottoman that's button tufted.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "charcoal" ] }, "asin": "B09LYN1QM3" }, { "task_id": "ws_B08WYY37SB_1501", "instruction": "i need 1.75 ounces of tikkiya kabab fried fish seasoning mix that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "tikkiya kabab", "1.75 ounce" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1502", "instruction": "i want a 1.76 ounce pack of easy to prepare chicken tikka shan fried fish recipe and seasoning mix.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken tikka" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1503", "instruction": "i need 1.75 ounces of tikkiya kabab fried fish seasoning mix that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "tikkiya kabab", "1.75 ounce" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1504", "instruction": "i'm looking for fish recipe it was easy to prepare and flavor was tikka masala.", "target_attributes": { "attributes": [ "easy prepare", "easy use" ], "options": [ "tikka masala" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1505", "instruction": "i need an easy to use seasoning mix that has a bihari kabab flavor to it.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "bihari kabab" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1506", "instruction": "i am looking for spicy fried fish seasoning that is also suitable for vegetarians and easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "fried fish" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B08WYY37SB_1507", "instruction": "look for a 4.4 ounce three pack of shami kabab seasoning that's easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "shami kabab", "4.4 ounce (pack of 3)" ] }, "asin": "B08WYY37SB" }, { "task_id": "ws_B09NY4QFVG_1508", "instruction": "i am looking for a brown finished wood full size platform bed with box springs.", "target_attributes": { "attributes": [ "box spring" ], "options": [] }, "asin": "B09NY4QFVG" }, { "task_id": "ws_B09NY4QFVG_1509", "instruction": "i am looking for a brown finished wood full size platform bed with box springs.", "target_attributes": { "attributes": [ "box spring" ], "options": [] }, "asin": "B09NY4QFVG" }, { "task_id": "ws_B09J1GHX9D_1510", "instruction": "i'm looking for ladies shoes with a high heel that are open toed, i wear a size 7 and a half.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "7.5" ] }, "asin": "B09J1GHX9D" }, { "task_id": "ws_B09J1GHX9D_1511", "instruction": "i'm looking for ladies shoes with a high heel that are open toed, i wear a size 7 and a half.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "7.5" ] }, "asin": "B09J1GHX9D" }, { "task_id": "ws_B07HLTP65S_1512", "instruction": "i need a taco seasoning blend that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "taco seasoning blend" ] }, "asin": "B07HLTP65S" }, { "task_id": "ws_B07HLTP65S_1513", "instruction": "i need a taco seasoning blend that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "taco seasoning blend" ] }, "asin": "B07HLTP65S" }, { "task_id": "ws_B09Q8WCZ42_1514", "instruction": "i need green butt lifting yoga pants in size medium.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "green", "medium" ] }, "asin": "B09Q8WCZ42" }, { "task_id": "ws_B09Q8WCZ42_1515", "instruction": "i need green butt lifting yoga pants in size medium.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "green", "medium" ] }, "asin": "B09Q8WCZ42" }, { "task_id": "ws_B08BXMYCZL_1516", "instruction": "buy me a pair of extra small men's sweatpants with a drawstring closure.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "x-small" ] }, "asin": "B08BXMYCZL" }, { "task_id": "ws_B08BXMYCZL_1517", "instruction": "buy me a pair of extra small men's sweatpants with a drawstring closure.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "x-small" ] }, "asin": "B08BXMYCZL" }, { "task_id": "ws_B09P4PP87G_1518", "instruction": "i need a gray vanity bench with metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "b-gray" ] }, "asin": "B09P4PP87G" }, { "task_id": "ws_B09P4PP87G_1519", "instruction": "i'm looking for a snow white vanity stool that's 16.3 inches in diameter and 13 inches in height. it needs to have a contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "c-snow white", "16.3\" (dia) x 13.4\" (h)" ] }, "asin": "B09P4PP87G" }, { "task_id": "ws_B09P4PP87G_1520", "instruction": "i need a gray vanity bench with metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "b-gray" ] }, "asin": "B09P4PP87G" }, { "task_id": "ws_B09P4PP87G_1521", "instruction": "i need a vanity bench that is contemporary and white", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "b-white" ] }, "asin": "B09P4PP87G" }, { "task_id": "ws_B075VSBNQY_1522", "instruction": "i am looking for a mini pc with an intel core i7 with 8 gigabytes of ram, 32 gigabytes of optane memory and is tall.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7|tall|8gb ram|32gb optane memory|..." ] }, "asin": "B075VSBNQY" }, { "task_id": "ws_B075VSBNQY_1523", "instruction": "i am looking for a mini pc with an intel core i7 with 8 gigabytes of ram, 32 gigabytes of optane memory and is tall.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7|tall|8gb ram|32gb optane memory|..." ] }, "asin": "B075VSBNQY" }, { "task_id": "ws_B00D25IVVK_1524", "instruction": "i am looking for an oil-free eye makeup remover.", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B00D25IVVK" }, { "task_id": "ws_B00D25IVVK_1525", "instruction": "i am looking for an oil-free eye makeup remover.", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B00D25IVVK" }, { "task_id": "ws_B07GYLCLHV_1526", "instruction": "i am looking ofr a bag that is 1.7 oz and is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "50ml | 1.7 ounce" ] }, "asin": "B07GYLCLHV" }, { "task_id": "ws_B07GYLCLHV_1527", "instruction": "i am looking ofr a bag that is 1.7 oz and is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "50ml | 1.7 ounce" ] }, "asin": "B07GYLCLHV" }, { "task_id": "ws_B08HQ4563F_1528", "instruction": "i need pink gluten free edible glitter.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pink" ] }, "asin": "B08HQ4563F" }, { "task_id": "ws_B08HQ4563F_1529", "instruction": "i need pink gluten free edible glitter.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pink" ] }, "asin": "B08HQ4563F" }, { "task_id": "ws_B09CTCN6Z2_1530", "instruction": "i am looking for a stainless steel compact pocket makeup mirror.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09CTCN6Z2" }, { "task_id": "ws_B09CTCN6Z2_1531", "instruction": "i am looking for a stainless steel compact pocket makeup mirror.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09CTCN6Z2" }, { "task_id": "ws_B078HFD38S_1532", "instruction": "i am looking for a gray travel carry case that fits doss soundbox.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "gray" ] }, "asin": "B078HFD38S" }, { "task_id": "ws_B078HFD38S_1533", "instruction": "i am looking for a gray travel carry case that fits doss soundbox.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "gray" ] }, "asin": "B078HFD38S" }, { "task_id": "ws_B078HFD38S_1534", "instruction": "i need a wireless bluetooth speaker that is blue.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B078HFD38S" }, { "task_id": "ws_B08CNH461M_1535", "instruction": "what xx-large short sleeved t-shirts do you have that are loose fitting and for teen girls?", "target_attributes": { "attributes": [ "loose fit", "short sleeve", "teen girls" ], "options": [ "xx-large" ] }, "asin": "B08CNH461M" }, { "task_id": "ws_B08CNH461M_1536", "instruction": "what xx-large short sleeved t-shirts do you have that are loose fitting and for teen girls?", "target_attributes": { "attributes": [ "loose fit", "short sleeve", "teen girls" ], "options": [ "xx-large" ] }, "asin": "B08CNH461M" }, { "task_id": "ws_B08FZZ6D4Z_1537", "instruction": "order an office desk that's easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B08FZZ6D4Z" }, { "task_id": "ws_B08FZZ6D4Z_1538", "instruction": "order an office desk that's easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B08FZZ6D4Z" }, { "task_id": "ws_B08WJP82ZT_1539", "instruction": "i would like a blue unlocked galaxy a11 that is 128gb and has fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "blue", "128 gb", "galaxy a11", "unlocked" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1540", "instruction": "i need a blue phone with 4g lte and charges fast too.", "target_attributes": { "attributes": [ "fast charging", "4g lte" ], "options": [ "blue" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1541", "instruction": "i would like a blue unlocked galaxy a11 that is 128gb and has fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "blue", "128 gb", "galaxy a11", "unlocked" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1542", "instruction": "i am looking for 4g lte samsung galaxy a71 mobile.please choose black one.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "black", "galaxy a71" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1543", "instruction": "i want a fast charging smartphone with 64 gb memory storage capacity. pick a blue one.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "blue", "64 gb" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1544", "instruction": "i need a samsung phone that is blue and is fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "blue" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B08WJP82ZT_1545", "instruction": "i want a black galaxy a71 from simple mobile which has a 128 gb storage and supports fast charging and 4g lte.", "target_attributes": { "attributes": [ "fast charging", "4g lte" ], "options": [ "black", "128 gb", "galaxy a71", "simple mobile" ] }, "asin": "B08WJP82ZT" }, { "task_id": "ws_B074MK42SN_1546", "instruction": "i need a 26\" x 16\" and blue grey octopus pillow cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue grey", "26\" x 16\"" ] }, "asin": "B074MK42SN" }, { "task_id": "ws_B074MK42SN_1547", "instruction": "i need a 26\" x 16\" and blue grey octopus pillow cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue grey", "26\" x 16\"" ] }, "asin": "B074MK42SN" }, { "task_id": "ws_B07J5WR4RR_1548", "instruction": "i need a panasonic ag-ac30 full hd camcorder with a carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [] }, "asin": "B07J5WR4RR" }, { "task_id": "ws_B07J5WR4RR_1549", "instruction": "i need a panasonic ag-ac30 full hd camcorder with a carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [] }, "asin": "B07J5WR4RR" }, { "task_id": "ws_B01BINV9P2_1550", "instruction": "i'm looking for a magnetic phone mount for car with aluminum alloy and small size", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "small" ] }, "asin": "B01BINV9P2" }, { "task_id": "ws_B01BINV9P2_1551", "instruction": "i'm looking for a magnetic phone mount for car with aluminum alloy and small size", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "small" ] }, "asin": "B01BINV9P2" }, { "task_id": "ws_B08HJ6RG9S_1552", "instruction": "i'm looking for a pair of red, relaxed fit, pajama bottoms.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "red" ] }, "asin": "B08HJ6RG9S" }, { "task_id": "ws_B08HJ6RG9S_1553", "instruction": "i'm looking for a pair of red, relaxed fit, pajama bottoms.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "red" ] }, "asin": "B08HJ6RG9S" }, { "task_id": "ws_B08LH8B6VW_1554", "instruction": "i need water resistant snow boots that are smoky black and are in a size 6 women.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "smoky black", "6 women | 5 men" ] }, "asin": "B08LH8B6VW" }, { "task_id": "ws_B08LH8B6VW_1555", "instruction": "i need water resistant snow boots that are smoky black and are in a size 6 women.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "smoky black", "6 women | 5 men" ] }, "asin": "B08LH8B6VW" }, { "task_id": "ws_B099XD4G5B_1556", "instruction": "i am looking for white curtains that are a size 120\"w by 84\"l", "target_attributes": { "attributes": [ "white item" ], "options": [ "120\" w x 84\" l" ] }, "asin": "B099XD4G5B" }, { "task_id": "ws_B099XD4G5B_1557", "instruction": "i am looking for white curtains that are a size 120\"w by 84\"l", "target_attributes": { "attributes": [ "white item" ], "options": [ "120\" w x 84\" l" ] }, "asin": "B099XD4G5B" }, { "task_id": "ws_B08GGZVMHC_1558", "instruction": "i am looking for a coconut refresh flavor sports drink that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "coconut refresh" ] }, "asin": "B08GGZVMHC" }, { "task_id": "ws_B08GGZVMHC_1559", "instruction": "i am looking for a coconut refresh flavor sports drink that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "coconut refresh" ] }, "asin": "B08GGZVMHC" }, { "task_id": "ws_B09BDS8NN9_1560", "instruction": "i would like a two meter in diameter photo background that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "2m diameter" ] }, "asin": "B09BDS8NN9" }, { "task_id": "ws_B09BDS8NN9_1561", "instruction": "i would like a two meter in diameter photo background that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "2m diameter" ] }, "asin": "B09BDS8NN9" }, { "task_id": "ws_B001KW0CDC_1562", "instruction": "i am looking for a queen sized bed that is black.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "black" ] }, "asin": "B001KW0CDC" }, { "task_id": "ws_B001KW0CDC_1563", "instruction": "i am looking for a queen sized bed that is black.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "black" ] }, "asin": "B001KW0CDC" }, { "task_id": "ws_B09RNB4SVT_1564", "instruction": "get me a forty pack of old-fashioned popcorn.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "40" ] }, "asin": "B09RNB4SVT" }, { "task_id": "ws_B09RNB4SVT_1565", "instruction": "get me a forty pack of old-fashioned popcorn.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "40" ] }, "asin": "B09RNB4SVT" }, { "task_id": "ws_B07Q8VSCW2_1566", "instruction": "i am looking for a hair mask that will treat damaged hair.", "target_attributes": { "attributes": [ "hair treatment", "damaged hair" ], "options": [ "hair mask" ] }, "asin": "B07Q8VSCW2" }, { "task_id": "ws_B07Q8VSCW2_1567", "instruction": "i am looking for a hair mask that will treat damaged hair.", "target_attributes": { "attributes": [ "hair treatment", "damaged hair" ], "options": [ "hair mask" ] }, "asin": "B07Q8VSCW2" }, { "task_id": "ws_B08VJB28BL_1568", "instruction": "i am looking for an easy to clean jewelry box with 10 slots.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "10 slots" ] }, "asin": "B08VJB28BL" }, { "task_id": "ws_B08VJB28BL_1569", "instruction": "i am looking for an easy to clean jewelry box with 10 slots.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "10 slots" ] }, "asin": "B08VJB28BL" }, { "task_id": "ws_B01M7M9NXX_1570", "instruction": "i am looking for a beige twin sized bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "beige" ] }, "asin": "B01M7M9NXX" }, { "task_id": "ws_B01M7M9NXX_1571", "instruction": "i am looking for a beige twin sized bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "beige" ] }, "asin": "B01M7M9NXX" }, { "task_id": "ws_B08392XJPV_1572", "instruction": "i'm looking for a heather charcoal or electric blue machine washable athletic polo t-shirt. choose the ones that have short sleeves and in size large.", "target_attributes": { "attributes": [ "machine wash", "short sleeve" ], "options": [ "heather charcoal | electric\u00a0blue", "large" ] }, "asin": "B08392XJPV" }, { "task_id": "ws_B08392XJPV_1573", "instruction": "i'm looking for a heather charcoal or electric blue machine washable athletic polo t-shirt. choose the ones that have short sleeves and in size large.", "target_attributes": { "attributes": [ "machine wash", "short sleeve" ], "options": [ "heather charcoal | electric\u00a0blue", "large" ] }, "asin": "B08392XJPV" }, { "task_id": "ws_B07P1Y9C7J_1574", "instruction": "i'm looking for a high resolution digital film & photo scanner that is easy to use. choose the black ones that is 9.4 x 7.9 x 5.1 inch in size.", "target_attributes": { "attributes": [ "high resolution", "easy use" ], "options": [ "black", "9.4 x 7.9 x 5.1 inch" ] }, "asin": "B07P1Y9C7J" }, { "task_id": "ws_B07P1Y9C7J_1575", "instruction": "i'm looking for a high resolution digital film & photo scanner that is easy to use. choose the black ones that is 9.4 x 7.9 x 5.1 inch in size.", "target_attributes": { "attributes": [ "high resolution", "easy use" ], "options": [ "black", "9.4 x 7.9 x 5.1 inch" ] }, "asin": "B07P1Y9C7J" }, { "task_id": "ws_B08X9WLKV7_1576", "instruction": "i need a light fixture that has glass lampshades with a grain finish", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "glass lampshades with grain finish" ] }, "asin": "B08X9WLKV7" }, { "task_id": "ws_B08X9WLKV7_1577", "instruction": "i need a light fixture that has glass lampshades with a grain finish", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "glass lampshades with grain finish" ] }, "asin": "B08X9WLKV7" }, { "task_id": "ws_B09SNTWCK3_1578", "instruction": "i want to find a high-resolution mini body camera without a memory version.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "no memory version" ] }, "asin": "B09SNTWCK3" }, { "task_id": "ws_B09SNTWCK3_1579", "instruction": "i want to find a high-resolution mini body camera without a memory version.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "no memory version" ] }, "asin": "B09SNTWCK3" }, { "task_id": "ws_B09MRTX572_1580", "instruction": "i would like a high quality shower cap that is in a nautical dog pattern.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "dachshund sailors nautical dog pattern" ] }, "asin": "B09MRTX572" }, { "task_id": "ws_B09MRTX572_1581", "instruction": "i would like a high quality shower cap that is in a nautical dog pattern.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "dachshund sailors nautical dog pattern" ] }, "asin": "B09MRTX572" }, { "task_id": "ws_B0040O4ETU_1582", "instruction": "i would like a pack of butter cookies from trader joe.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B0040O4ETU" }, { "task_id": "ws_B0040O4ETU_1583", "instruction": "i would like a pack of butter cookies from trader joe.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B0040O4ETU" }, { "task_id": "ws_B09682W1GV_1584", "instruction": "i'm looking for a pair of stainless steel barber's scissors for cutting hair.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B09682W1GV" }, { "task_id": "ws_B09682W1GV_1585", "instruction": "i'm looking for a pair of stainless steel barber's scissors for cutting hair.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B09682W1GV" }, { "task_id": "ws_B00TO54PAI_1586", "instruction": "i am looking for a multigroom beard trimmer kit for my face.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "er-gb96-k" ] }, "asin": "B00TO54PAI" }, { "task_id": "ws_B00TO54PAI_1587", "instruction": "i am looking for a multigroom beard trimmer kit for my face.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "er-gb96-k" ] }, "asin": "B00TO54PAI" }, { "task_id": "ws_B08H5SYM1M_1588", "instruction": "i need a 6 ounce deep conditioner for dry hair that has rose oil and peach scent.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "rose oil + peach", "6 ounce (pack of 2)" ] }, "asin": "B08H5SYM1M" }, { "task_id": "ws_B08H5SYM1M_1589", "instruction": "i need a 6 ounce deep conditioner for dry hair that has rose oil and peach scent.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "rose oil + peach", "6 ounce (pack of 2)" ] }, "asin": "B08H5SYM1M" }, { "task_id": "ws_B08L5SZWW5_1590", "instruction": "i am looking for a light brown color hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "light brown" ] }, "asin": "B08L5SZWW5" }, { "task_id": "ws_B08L5SZWW5_1591", "instruction": "i am looking for a light brown color hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "light brown" ] }, "asin": "B08L5SZWW5" }, { "task_id": "ws_B09GFRJSKS_1592", "instruction": "i'm looking for a large sized sports bra that is comfortable to wear during the day.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "large" ] }, "asin": "B09GFRJSKS" }, { "task_id": "ws_B09GFRJSKS_1593", "instruction": "i'm looking for a large sized sports bra that is comfortable to wear during the day.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "large" ] }, "asin": "B09GFRJSKS" }, { "task_id": "ws_B000F5X2WI_1594", "instruction": "i'm looking for a pair of women's walking shoes that has a synthetic sole and is colored brown.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "brown" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B000F5X2WI_1595", "instruction": "i'm looking to buy some walking shoes in size 11 narrow that have a lace closure and are pink multicolored.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "pink multi", "11 n" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B000F5X2WI_1596", "instruction": "i'm looking for a pair of walking shoes in size 12 wide. choose the ones with synthetic sole and in navy-microfiber color.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "navy-microfiber", "12 wide" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B000F5X2WI_1597", "instruction": "i'm looking for a pair of women's walking shoes that has a synthetic sole and is colored brown.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "brown" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B000F5X2WI_1598", "instruction": "i am looking for a pair of women's parquet brown walking shoes with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "parquet brown" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B000F5X2WI_1599", "instruction": "i would like a pair of size 12.5 natural fabric walking shoes with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "natural fabric", "12.5" ] }, "asin": "B000F5X2WI" }, { "task_id": "ws_B07M7X7F2Q_1600", "instruction": "i am looking for a chocolate colored waterproof bootie for women that has memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "chocolate" ] }, "asin": "B07M7X7F2Q" }, { "task_id": "ws_B07M7X7F2Q_1601", "instruction": "i am looking for a chocolate colored waterproof bootie for women that has memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "chocolate" ] }, "asin": "B07M7X7F2Q" }, { "task_id": "ws_B09P77876R_1602", "instruction": "i'm looking for a long sleeved men's hoodie in the size of small.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09P77876R" }, { "task_id": "ws_B09P77876R_1603", "instruction": "i'm looking for a long sleeved men's hoodie in the size of small.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09P77876R" }, { "task_id": "ws_B005M4G4LI_1604", "instruction": "i am looking for an 8 ounce bag of freeze dried strawberries and bananas", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + bananas", "8 ounce (pack of 1)" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1605", "instruction": "i am interested in some bundled size freeze-dried strawberries.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bundle" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1606", "instruction": "i am looking for peas flavoured dried strawberries.and also choose gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peas" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1607", "instruction": "i want some freeze dried mangoes.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "mangoes" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1608", "instruction": "buy me some freeze dried mangoes. get the bundle.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "mangoes", "bundle" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1609", "instruction": "i am looking for an 8 ounce bag of freeze dried strawberries and bananas", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + bananas", "8 ounce (pack of 1)" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1610", "instruction": "i need a bundle of dried mangoes that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "bundle" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1611", "instruction": "please find freeze-dried strawberries + peas , gluten free & vegan made by natierra nature's organic", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "strawberries + peas" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1612", "instruction": "help me purchase 1 pack of bundle styled freeze-dried strawberries with mango flavor.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "mangoes", "2.5 ounce (pack of 1)", "bundle" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1613", "instruction": "i would like a gmo free 2.5 ounce pack of dried berries.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "2.5 ounce (pack of 1)" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1614", "instruction": "i'm looking for gluten free it has high protein it contains healthy.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "strawberries" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1615", "instruction": "i am looking for organic freeze dried blueberries that should be gluten free and vegan, 1.6 ounce (pack of 1)", "target_attributes": { "attributes": [ "freeze dried", "gluten free" ], "options": [ "blueberries", "1.6 ounce (pack of 1)" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1616", "instruction": "looking for freeze-dried strawberries that is gluten free also choose style bag", "target_attributes": { "attributes": [ "freeze dried", "gluten free" ], "options": [ "bag" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1617", "instruction": "i need natierra nature's organic freeze-dried strawberries.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1618", "instruction": "look for a bundle containing freeze dried strawberries and peas.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries 1.2 ounce & peas 2.2 ounce", "bundle" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B005M4G4LI_1619", "instruction": "am looking for organic freeze-dried strawberries that are gluten & vegan free in a 1.2 ounce package made by natierra nature in banana flavor.", "target_attributes": { "attributes": [ "freeze dried", "gluten free" ], "options": [ "bananas" ] }, "asin": "B005M4G4LI" }, { "task_id": "ws_B00GM4QXD6_1620", "instruction": "i am looking for a height adjustable faux leather barstool.", "target_attributes": { "attributes": [ "height adjustable", "faux leather" ], "options": [] }, "asin": "B00GM4QXD6" }, { "task_id": "ws_B00GM4QXD6_1621", "instruction": "i am looking for a height adjustable faux leather barstool.", "target_attributes": { "attributes": [ "height adjustable", "faux leather" ], "options": [] }, "asin": "B00GM4QXD6" }, { "task_id": "ws_B0131L2XA4_1622", "instruction": "i am looking for blue scrub bottoms that are made of polyester cotton and are a size 3x tall.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "caribbean blue", "3x tall" ] }, "asin": "B0131L2XA4" }, { "task_id": "ws_B0131L2XA4_1623", "instruction": "i am looking for blue scrub bottoms that are made of polyester cotton and are a size 3x tall.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "caribbean blue", "3x tall" ] }, "asin": "B0131L2XA4" }, { "task_id": "ws_B087LSFS6R_1624", "instruction": "i need a usb cable that is high speed and 32 ft.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "usb 3.0 - 32ft" ] }, "asin": "B087LSFS6R" }, { "task_id": "ws_B087LSFS6R_1625", "instruction": "i need a usb cable that is high speed and 32 ft.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "usb 3.0 - 32ft" ] }, "asin": "B087LSFS6R" }, { "task_id": "ws_B01HJWDQWA_1626", "instruction": "need a high speed hdmi cable 2 pack with 100 feet, male to female, pack of 10", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "100 feet (2-pack)", "hdmi male to female" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1627", "instruction": "i'm looking for 1.5 feet (10 pack) high speed hdmi cable male to male with ethernet black", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 pack", "1.5 feet (4-pack)", "hdmi male to male" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1628", "instruction": "i'm looking for a 10-pack, of gold-plated, high-speed hdmi male-to-male cables.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "hdmi male to male" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1629", "instruction": "need a high speed hdmi cable 2 pack with 100 feet, male to female, pack of 10", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "100 feet (2-pack)", "hdmi male to female" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1630", "instruction": "i am interested in buying a hdmi male to male ethernet cable which support blu ray streaming and about 1.5 feet in length and high speed communication.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "1.5 feet (single pack)", "hdmi male to male" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1631", "instruction": "i want a 2 pack of high speed hdmi male to male cables,", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B01HJWDQWA_1632", "instruction": "i'm looking for a 12 feet 4 pack high speed hdmi male to female cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "4 pack", "12 feet (single pack)", "hdmi male to female" ] }, "asin": "B01HJWDQWA" }, { "task_id": "ws_B005KIUP9I_1633", "instruction": "i would like a alcohol free fragrance.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B005KIUP9I" }, { "task_id": "ws_B005KIUP9I_1634", "instruction": "i am looking for a fragrance called tous baby cologne spray for kids. it is 3.4 oz and alcohol free.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B005KIUP9I" }, { "task_id": "ws_B005KIUP9I_1635", "instruction": "i would like a alcohol free fragrance.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B005KIUP9I" }, { "task_id": "ws_B08ZBDP1H3_1636", "instruction": "i am looking for a satin brass and frosted hallway light fixtures.", "target_attributes": { "attributes": [ "living room" ], "options": [ "satin brass | frosted" ] }, "asin": "B08ZBDP1H3" }, { "task_id": "ws_B08ZBDP1H3_1637", "instruction": "i am looking for a black glass shade for my living room", "target_attributes": { "attributes": [ "glass shade", "living room" ], "options": [ "black | clear" ] }, "asin": "B08ZBDP1H3" }, { "task_id": "ws_B08ZBDP1H3_1638", "instruction": "i'm trying to find 30 inch linear sconces for my living room with frosted glass shades. the sconces should come in brushed nickel and clear colors.", "target_attributes": { "attributes": [ "glass shade", "living room" ], "options": [ "30\" linear" ] }, "asin": "B08ZBDP1H3" }, { "task_id": "ws_B08ZBDP1H3_1639", "instruction": "i am looking for a satin brass and frosted hallway light fixtures.", "target_attributes": { "attributes": [ "living room" ], "options": [ "satin brass | frosted" ] }, "asin": "B08ZBDP1H3" }, { "task_id": "ws_B07JVMP4DH_1640", "instruction": "i am looking for a dead sea skin care mud mask that is cruelty free and contains aloe vera gel.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B07JVMP4DH" }, { "task_id": "ws_B07JVMP4DH_1641", "instruction": "i am looking for a dead sea skin care mud mask that is cruelty free and contains aloe vera gel.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B07JVMP4DH" }, { "task_id": "ws_B09QXGQMDG_1642", "instruction": "i would like a mint green size 6 dress that's light weight to wear.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "mint green", "6" ] }, "asin": "B09QXGQMDG" }, { "task_id": "ws_B09QXGQMDG_1643", "instruction": "i would like a mint green size 6 dress that's light weight to wear.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "mint green", "6" ] }, "asin": "B09QXGQMDG" }, { "task_id": "ws_B09R46FK8T_1644", "instruction": "i want a long sleeved brown shirt that is in a medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "b-brown", "medium" ] }, "asin": "B09R46FK8T" }, { "task_id": "ws_B09R46FK8T_1645", "instruction": "i want a long sleeved brown shirt that is in a medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "b-brown", "medium" ] }, "asin": "B09R46FK8T" }, { "task_id": "ws_B08RDHLCP2_1646", "instruction": "i'm looking for a color b quick release thumb screw tripod.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "b" ] }, "asin": "B08RDHLCP2" }, { "task_id": "ws_B08RDHLCP2_1647", "instruction": "i'm looking for a color b quick release thumb screw tripod.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "b" ] }, "asin": "B08RDHLCP2" }, { "task_id": "ws_B09N382RP7_1648", "instruction": "i need a new end table for the living room. get me a pink one.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink | white" ] }, "asin": "B09N382RP7" }, { "task_id": "ws_B09N382RP7_1649", "instruction": "i need a new end table for the living room. get me a pink one.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink | white" ] }, "asin": "B09N382RP7" }, { "task_id": "ws_B09N382RP7_1650", "instruction": "i'm looking for a 4-tier shelving unit and tv stand that is espresso and classic black color. also, it should have engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "espresso | black classic tube", "shelving unit + tv stands", "4-tier" ] }, "asin": "B09N382RP7" }, { "task_id": "ws_B09N382RP7_1651", "instruction": "i am looking for a engineered wood end table for living room in light blue color. also choose pattern of shelving unit + rack display shelf and 3-tier classic tube size.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "light blue | white", "3-tier classic tube" ] }, "asin": "B09N382RP7" }, { "task_id": "ws_B08Y8R82HM_1652", "instruction": "i am looking for a easy to use beige color shower cap.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "beige" ] }, "asin": "B08Y8R82HM" }, { "task_id": "ws_B08Y8R82HM_1653", "instruction": "i am looking for a easy to use beige color shower cap.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "beige" ] }, "asin": "B08Y8R82HM" }, { "task_id": "ws_B08T6B1KNH_1654", "instruction": "i am looking for s96 pro black android 10 octa-core ip68 fast charging phone", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "s96 pro black" ] }, "asin": "B08T6B1KNH" }, { "task_id": "ws_B08T6B1KNH_1655", "instruction": "i am looking for s96 pro black android 10 octa-core ip68 fast charging phone", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "s96 pro black" ] }, "asin": "B08T6B1KNH" }, { "task_id": "ws_B07HY8DHQ7_1656", "instruction": "i want a shampoo and conditioner set for damaged hair with coconut oil, size 32 oz 2 pack", "target_attributes": { "attributes": [ "coconut oil", "damaged hair" ], "options": [ "shampoo", "32 ounce, pack of 2" ] }, "asin": "B07HY8DHQ7" }, { "task_id": "ws_B07HY8DHQ7_1657", "instruction": "i want a shampoo and conditioner set for damaged hair with coconut oil, size 32 oz 2 pack", "target_attributes": { "attributes": [ "coconut oil", "damaged hair" ], "options": [ "shampoo", "32 ounce, pack of 2" ] }, "asin": "B07HY8DHQ7" }, { "task_id": "ws_B093SZ5P7Z_1658", "instruction": "i am looking for 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SZ5P7Z" }, { "task_id": "ws_B093SZ5P7Z_1659", "instruction": "i am looking for 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SZ5P7Z" }, { "task_id": "ws_B07D3SZWDS_1660", "instruction": "i'm looking for a pair of men's shoes made from rubber on the outside in the uk size six and half men's.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "6.5 m uk" ] }, "asin": "B07D3SZWDS" }, { "task_id": "ws_B07D3SZWDS_1661", "instruction": "i'm looking for a pair of men's shoes made from rubber on the outside in the uk size six and half men's.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "6.5 m uk" ] }, "asin": "B07D3SZWDS" }, { "task_id": "ws_B07D3SZWDS_1662", "instruction": "i am looking for rubber outsole men shoes. please choose white color.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "white (ftwr white | ftwr white | gum 3)" ] }, "asin": "B07D3SZWDS" }, { "task_id": "ws_B09QG9146D_1663", "instruction": "i'm looking for a leather phone wallet case compatible with the iphone 11 pro that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "for iphone 11 pro 5.8\"" ] }, "asin": "B09QG9146D" }, { "task_id": "ws_B09QG9146D_1664", "instruction": "i would like aa sea wave phone case of the iphone 6 that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "xs max-sea wave", "for iphone 6 | 6s | 7 | 8 plus 5.5\"" ] }, "asin": "B09QG9146D" }, { "task_id": "ws_B09QG9146D_1665", "instruction": "i'm looking for a leather phone wallet case compatible with the iphone 11 pro that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "for iphone 11 pro 5.8\"" ] }, "asin": "B09QG9146D" }, { "task_id": "ws_B09QG9146D_1666", "instruction": "i need an iphone x case with wireless charging in a butterfly color.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "x | xs-butterfly 1" ] }, "asin": "B09QG9146D" }, { "task_id": "ws_B08VDN1RP9_1667", "instruction": "i need an easy to carry travel bag for shampoo.", "target_attributes": { "attributes": [ "easy carry", "travel bottles" ], "options": [] }, "asin": "B08VDN1RP9" }, { "task_id": "ws_B08VDN1RP9_1668", "instruction": "i need an easy to carry travel bag for shampoo.", "target_attributes": { "attributes": [ "easy carry", "travel bottles" ], "options": [] }, "asin": "B08VDN1RP9" }, { "task_id": "ws_B083KPNYHF_1669", "instruction": "i'm looking for a security camera that has motion detection functionality.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B083KPNYHF" }, { "task_id": "ws_B083KPNYHF_1670", "instruction": "i'm looking for a security camera that has motion detection functionality.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B083KPNYHF" }, { "task_id": "ws_B07PKW544C_1671", "instruction": "i am looking for a 50 pack of white non-slip spa headbands.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "white 50pcs" ] }, "asin": "B07PKW544C" }, { "task_id": "ws_B07PKW544C_1672", "instruction": "i am looking for a 50 pack of white non-slip spa headbands.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "white 50pcs" ] }, "asin": "B07PKW544C" }, { "task_id": "ws_B09SZ5K381_1673", "instruction": "i am looking for teeth whitening toothpaste with a passion fruit flavor.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "passion fruit" ] }, "asin": "B09SZ5K381" }, { "task_id": "ws_B09SZ5K381_1674", "instruction": "i am looking for teeth whitening toothpaste with a passion fruit flavor.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "passion fruit" ] }, "asin": "B09SZ5K381" }, { "task_id": "ws_B09SZ5K381_1675", "instruction": "i would like some purple toothpaste that whitens teeth.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "purple" ] }, "asin": "B09SZ5K381" }, { "task_id": "ws_B004Z4PMFA_1676", "instruction": "i'm looking for a long lasting 3.3 oz edt spray for men.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004Z4PMFA" }, { "task_id": "ws_B004Z4PMFA_1677", "instruction": "i'm looking for a long lasting 3.3 oz edt spray for men.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004Z4PMFA" }, { "task_id": "ws_B01MSHHGFJ_1678", "instruction": "i need a wildlife novelty polyester cotton multi color sock which is suitable for women's 6-11", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "mulit color", "youth - 13, 1-5 | women's 6-11 | men's 5..." ] }, "asin": "B01MSHHGFJ" }, { "task_id": "ws_B01MSHHGFJ_1679", "instruction": "i need a wildlife novelty polyester cotton multi color sock which is suitable for women's 6-11", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "mulit color", "youth - 13, 1-5 | women's 6-11 | men's 5..." ] }, "asin": "B01MSHHGFJ" }, { "task_id": "ws_B09N7JTH4Q_1680", "instruction": "i want to find decorative, multi-colored vinyl dots for my living room windows. the size should be 17.7 inches by 23.6 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi-003976", "17.7wx23.6l-inch x2 pcs" ] }, "asin": "B09N7JTH4Q" }, { "task_id": "ws_B09N7JTH4Q_1681", "instruction": "i want to find decorative, multi-colored vinyl dots for my living room windows. the size should be 17.7 inches by 23.6 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi-003976", "17.7wx23.6l-inch x2 pcs" ] }, "asin": "B09N7JTH4Q" }, { "task_id": "ws_B077SFNTSC_1682", "instruction": "buy me ten pounds of low calorie coconut water.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "160 ounce - 10 pound" ] }, "asin": "B077SFNTSC" }, { "task_id": "ws_B077SFNTSC_1683", "instruction": "buy me ten pounds of low calorie coconut water.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "160 ounce - 10 pound" ] }, "asin": "B077SFNTSC" }, { "task_id": "ws_B09BNQLMMK_1684", "instruction": "i am looking for chocolate scent candles that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "chocolate" ] }, "asin": "B09BNQLMMK" }, { "task_id": "ws_B09BNQLMMK_1685", "instruction": "i am looking for chocolate scent candles that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "chocolate" ] }, "asin": "B09BNQLMMK" }, { "task_id": "ws_B09BNQLMMK_1686", "instruction": "i'm looking for soy wax for making candles.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "12 oz" ] }, "asin": "B09BNQLMMK" }, { "task_id": "ws_B09BNQLMMK_1687", "instruction": "i'm looking for spy wax it was making for candles.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "salted butterscotch", "12 oz" ] }, "asin": "B09BNQLMMK" }, { "task_id": "ws_B09BNQLMMK_1688", "instruction": "i want a 16 ounce happy new year candle made from soy.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "happy new year", "16 oz" ] }, "asin": "B09BNQLMMK" }, { "task_id": "ws_B09SDTNYLJ_1689", "instruction": "i am looking for a high quality round head 70x185cm spa bed cover.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "round head 70x185cm" ] }, "asin": "B09SDTNYLJ" }, { "task_id": "ws_B09SDTNYLJ_1690", "instruction": "i am looking for a high quality round head 70x185cm spa bed cover.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "round head 70x185cm" ] }, "asin": "B09SDTNYLJ" }, { "task_id": "ws_B081HZ4D87_1691", "instruction": "i am interested in a 15.6 inch laptop carrying case that is gray.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "gray", "15.6 inch" ] }, "asin": "B081HZ4D87" }, { "task_id": "ws_B081HZ4D87_1692", "instruction": "i am interested in a 15.6 inch laptop carrying case that is gray.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "gray", "15.6 inch" ] }, "asin": "B081HZ4D87" }, { "task_id": "ws_B081HZ4D87_1693", "instruction": "i am looking for a gray bags, cases & sleeves \u203a sleeves for carrying case", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "gray" ] }, "asin": "B081HZ4D87" }, { "task_id": "ws_B0863YM5B4_1694", "instruction": "i am looking for plastic refillable spray bottles that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B0863YM5B4" }, { "task_id": "ws_B0863YM5B4_1695", "instruction": "i am looking for plastic refillable spray bottles that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B0863YM5B4" }, { "task_id": "ws_B08344D945_1696", "instruction": "i need a 7 layer bookshelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "d", "7 layer" ] }, "asin": "B08344D945" }, { "task_id": "ws_B08344D945_1697", "instruction": "i need a 7 layer bookshelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "d", "7 layer" ] }, "asin": "B08344D945" }, { "task_id": "ws_B08K95TC4Q_1698", "instruction": "i'd like to buy a cellphone case for my iphone. i want a black one made out of carbon fiber.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "black" ] }, "asin": "B08K95TC4Q" }, { "task_id": "ws_B08K95TC4Q_1699", "instruction": "i'd like to buy a cellphone case for my iphone. i want a black one made out of carbon fiber.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "black" ] }, "asin": "B08K95TC4Q" }, { "task_id": "ws_B08K95TC4Q_1700", "instruction": "i'm looking for a carbon fiber iphone 11 case, preferably the red color.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "red" ] }, "asin": "B08K95TC4Q" }, { "task_id": "ws_B09MRVVWQ3_1701", "instruction": "i want to buy a tea-themed gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B09MRVVWQ3" }, { "task_id": "ws_B09MRVVWQ3_1702", "instruction": "i want to buy a tea-themed gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B09MRVVWQ3" }, { "task_id": "ws_B09QG4827R_1703", "instruction": "i'm looking for a size 40x30 inch super soft cute cartoon dinosaurs", "target_attributes": { "attributes": [ "super soft" ], "options": [ "40x30 inch xs for airplane | pet" ] }, "asin": "B09QG4827R" }, { "task_id": "ws_B09QG4827R_1704", "instruction": "i'm looking for a size 40x30 inch super soft cute cartoon dinosaurs", "target_attributes": { "attributes": [ "super soft" ], "options": [ "40x30 inch xs for airplane | pet" ] }, "asin": "B09QG4827R" }, { "task_id": "ws_B07THFBCJK_1705", "instruction": "i'm looking for a black noise cancelling wireless headphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black | yellow alcantara | black metal" ] }, "asin": "B07THFBCJK" }, { "task_id": "ws_B07THFBCJK_1706", "instruction": "i'm looking for a black noise cancelling wireless headphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black | yellow alcantara | black metal" ] }, "asin": "B07THFBCJK" }, { "task_id": "ws_B01IA961HI_1707", "instruction": "i'm looking for long-lasting anti-perspirant that is unscented.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B01IA961HI" }, { "task_id": "ws_B01IA961HI_1708", "instruction": "i'm looking for long-lasting anti-perspirant that is unscented.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B01IA961HI" }, { "task_id": "ws_B079WSQ7G5_1709", "instruction": "i want to buy a high performance s-video cable.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B079WSQ7G5" }, { "task_id": "ws_B079WSQ7G5_1710", "instruction": "i want to buy a high performance s-video cable.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B079WSQ7G5" }, { "task_id": "ws_B09F3N66K9_1711", "instruction": "i need a slim fit blouse that is a 4x large and is multicolored.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "96#multicolor", "4x-large" ] }, "asin": "B09F3N66K9" }, { "task_id": "ws_B09F3N66K9_1712", "instruction": "i need a slim fit blouse that is a 4x large and is multicolored.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "96#multicolor", "4x-large" ] }, "asin": "B09F3N66K9" }, { "task_id": "ws_B06XC5S67Z_1713", "instruction": "i need 300 alcohol free cleansing wipes", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "300 pcs" ] }, "asin": "B06XC5S67Z" }, { "task_id": "ws_B06XC5S67Z_1714", "instruction": "i need 300 alcohol free cleansing wipes", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "300 pcs" ] }, "asin": "B06XC5S67Z" }, { "task_id": "ws_B07C2DXSBQ_1715", "instruction": "i am looking for long lasting dusty navy original fit jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "dusty navy" ] }, "asin": "B07C2DXSBQ" }, { "task_id": "ws_B07C2DXSBQ_1716", "instruction": "i am looking for long lasting dusty navy original fit jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "dusty navy" ] }, "asin": "B07C2DXSBQ" }, { "task_id": "ws_B07C2DXSBQ_1717", "instruction": "i need slim comfortable fit jeans", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "slim" ] }, "asin": "B07C2DXSBQ" }, { "task_id": "ws_B07C2DXSBQ_1718", "instruction": "i need to shop for a comfortable fitting pair of jeans in the \"crest\" color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "crest" ] }, "asin": "B07C2DXSBQ" }, { "task_id": "ws_B09JGSN6ZN_1719", "instruction": "i need a 5 pound bag of birthday candy.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "5-pound" ] }, "asin": "B09JGSN6ZN" }, { "task_id": "ws_B09JGSN6ZN_1720", "instruction": "i need a 5 pound bag of birthday candy.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "5-pound" ] }, "asin": "B09JGSN6ZN" }, { "task_id": "ws_B00Q7N55AY_1721", "instruction": "i need a toasted brown wig that is made from natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "toasted brown" ] }, "asin": "B00Q7N55AY" }, { "task_id": "ws_B00Q7N55AY_1722", "instruction": "i need a toasted brown wig that is made from natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "toasted brown" ] }, "asin": "B00Q7N55AY" }, { "task_id": "ws_B09MH59735_1723", "instruction": "what face rollers do you have that are easy to use and for dry and sensitive skin? i would prefer it in blue.", "target_attributes": { "attributes": [ "easy use", "dry skin", "sensitive skin" ], "options": [ "blue" ] }, "asin": "B09MH59735" }, { "task_id": "ws_B09MH59735_1724", "instruction": "what face rollers do you have that are easy to use and for dry and sensitive skin? i would prefer it in blue.", "target_attributes": { "attributes": [ "easy use", "dry skin", "sensitive skin" ], "options": [ "blue" ] }, "asin": "B09MH59735" }, { "task_id": "ws_B09MH59735_1725", "instruction": "i need an easy to use red ice roller.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "red" ] }, "asin": "B09MH59735" }, { "task_id": "ws_B019WW2FBS_1726", "instruction": "i'm looking for a ceiling light fixture with a brushed nickel finish that would suit a dining room.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish", "light fixture", "dining room" ], "options": [ "brushed nickel", "ceiling fixture" ] }, "asin": "B019WW2FBS" }, { "task_id": "ws_B019WW2FBS_1727", "instruction": "i'm looking for a chrome wall light fixture with a brushed nickle finished.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish" ], "options": [ "chrome" ] }, "asin": "B019WW2FBS" }, { "task_id": "ws_B019WW2FBS_1728", "instruction": "i'm looking for a ceiling light fixture with a brushed nickel finish that would suit a dining room.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish", "light fixture", "dining room" ], "options": [ "brushed nickel", "ceiling fixture" ] }, "asin": "B019WW2FBS" }, { "task_id": "ws_B019WW2FBS_1729", "instruction": "i am looking for a light fixture that is satin brass.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "satin brass" ] }, "asin": "B019WW2FBS" }, { "task_id": "ws_B08SJBD8CQ_1730", "instruction": "i would like the tom ford cafe rose impression perfume that is in a travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "tom ford cafe rose impression" ] }, "asin": "B08SJBD8CQ" }, { "task_id": "ws_B08SJBD8CQ_1731", "instruction": "i would like the tom ford cafe rose impression perfume that is in a travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "tom ford cafe rose impression" ] }, "asin": "B08SJBD8CQ" }, { "task_id": "ws_B019IOF8PK_1732", "instruction": "i am looking for a gold plated high speed 75 foot hdmi cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "4 pack" ] }, "asin": "B019IOF8PK" }, { "task_id": "ws_B019IOF8PK_1733", "instruction": "i need a ten pack of high speed hdmi cables that are 3 feet long", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 pack", "3 feet (2 pack)" ] }, "asin": "B019IOF8PK" }, { "task_id": "ws_B019IOF8PK_1734", "instruction": "i want to find a package that contains two high speed hdmi cables that are each 100 feet long.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack", "100 feet (single pack)", "hdmi male to female" ] }, "asin": "B019IOF8PK" }, { "task_id": "ws_B019IOF8PK_1735", "instruction": "i am looking for a gold plated high speed 75 foot hdmi cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "4 pack" ] }, "asin": "B019IOF8PK" }, { "task_id": "ws_B094JVCT3S_1736", "instruction": "i need one 10\" computer monitor replacement power cord cable that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "power cord + cable - 10 feet", "10'", "1-pack" ] }, "asin": "B094JVCT3S" }, { "task_id": "ws_B094JVCT3S_1737", "instruction": "i need one 10\" computer monitor replacement power cord cable that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "power cord + cable - 10 feet", "10'", "1-pack" ] }, "asin": "B094JVCT3S" }, { "task_id": "ws_B08CDWWYZT_1738", "instruction": "i'm looking for mens underwear, low rise briefs size extra large.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "x-large" ] }, "asin": "B08CDWWYZT" }, { "task_id": "ws_B08CDWWYZT_1739", "instruction": "i'm looking for mens underwear, low rise briefs size extra large.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "x-large" ] }, "asin": "B08CDWWYZT" }, { "task_id": "ws_B09KGP4PTN_1740", "instruction": "i am looking for a 4 pack of mid century wood side end tables for my living room.", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [ "4-pack" ] }, "asin": "B09KGP4PTN" }, { "task_id": "ws_B09KGP4PTN_1741", "instruction": "i am looking for a 4 pack of mid century wood side end tables for my living room.", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [ "4-pack" ] }, "asin": "B09KGP4PTN" }, { "task_id": "ws_B07V2L16MB_1742", "instruction": "i need a cell phone case with the flash design and compatible with apple phones.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "the flash" ] }, "asin": "B07V2L16MB" }, { "task_id": "ws_B07V2L16MB_1743", "instruction": "i need a cell phone case with the flash design and compatible with apple phones.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "the flash" ] }, "asin": "B07V2L16MB" }, { "task_id": "ws_B07L6YH1L4_1744", "instruction": "i'm looking for butter pecan flavored coffee that is gluten free and comes in a pack of three 11 ounce packages.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "11 ounce (pack of 3)" ] }, "asin": "B07L6YH1L4" }, { "task_id": "ws_B07L6YH1L4_1745", "instruction": "i'm looking for butter pecan flavored coffee that is gluten free and comes in a pack of three 11 ounce packages.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "11 ounce (pack of 3)" ] }, "asin": "B07L6YH1L4" }, { "task_id": "ws_B09KRS2GPJ_1746", "instruction": "i'm hoping to find non-toxic false teeth that are made out of high quality soft silicone.", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [] }, "asin": "B09KRS2GPJ" }, { "task_id": "ws_B09KRS2GPJ_1747", "instruction": "i'm hoping to find non-toxic false teeth that are made out of high quality soft silicone.", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [] }, "asin": "B09KRS2GPJ" }, { "task_id": "ws_B07RP5TQB4_1748", "instruction": "help me find a 2 pack of stone grey faux leather throw pillows that are 18x18 inches.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "stone grey pack of 2" ] }, "asin": "B07RP5TQB4" }, { "task_id": "ws_B07RP5TQB4_1749", "instruction": "help me find a 2 pack of stone grey faux leather throw pillows that are 18x18 inches.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "stone grey pack of 2" ] }, "asin": "B07RP5TQB4" }, { "task_id": "ws_B086H3TL7M_1750", "instruction": "i am looking for a waterproof ricoh camera with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B086H3TL7M" }, { "task_id": "ws_B086H3TL7M_1751", "instruction": "i am looking for a waterproof ricoh camera with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B086H3TL7M" }, { "task_id": "ws_B09MLSM7Z5_1752", "instruction": "i am interested in a dust proof telescope.", "target_attributes": { "attributes": [ "dust proof" ], "options": [] }, "asin": "B09MLSM7Z5" }, { "task_id": "ws_B09MLSM7Z5_1753", "instruction": "i am interested in a dust proof telescope.", "target_attributes": { "attributes": [ "dust proof" ], "options": [] }, "asin": "B09MLSM7Z5" }, { "task_id": "ws_B08BNCVRJT_1754", "instruction": "i need 2 bottles of 8fl oz vermont maple salted bourbon caramel sauce that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vermont maple", "8 fl oz (pack of 2)" ] }, "asin": "B08BNCVRJT" }, { "task_id": "ws_B08BNCVRJT_1755", "instruction": "i need 2 bottles of 8fl oz vermont maple salted bourbon caramel sauce that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vermont maple", "8 fl oz (pack of 2)" ] }, "asin": "B08BNCVRJT" }, { "task_id": "ws_B098SLBBBC_1756", "instruction": "i'm looking for a refillable lipstick bottle that is easy to carry and non-toxic.", "target_attributes": { "attributes": [ "non toxic", "easy carry" ], "options": [] }, "asin": "B098SLBBBC" }, { "task_id": "ws_B098SLBBBC_1757", "instruction": "i'm looking for a refillable lipstick bottle that is easy to carry and non-toxic.", "target_attributes": { "attributes": [ "non toxic", "easy carry" ], "options": [] }, "asin": "B098SLBBBC" }, { "task_id": "ws_B08HZBXBV1_1758", "instruction": "i am looking for a black iphone 12 max case with wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "black 12 pro max" ] }, "asin": "B08HZBXBV1" }, { "task_id": "ws_B08HZBXBV1_1759", "instruction": "i am looking for a black iphone 12 max case with wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "black 12 pro max" ] }, "asin": "B08HZBXBV1" }, { "task_id": "ws_B08LMM4SSF_1760", "instruction": "i'm looking for soft bed sheets queen size for twin bed in warm taupe", "target_attributes": { "attributes": [ "queen size" ], "options": [ "warm taupe", "twin | twin xl" ] }, "asin": "B08LMM4SSF" }, { "task_id": "ws_B08LMM4SSF_1761", "instruction": "i'm looking for soft bed sheets queen size for twin bed in warm taupe", "target_attributes": { "attributes": [ "queen size" ], "options": [ "warm taupe", "twin | twin xl" ] }, "asin": "B08LMM4SSF" }, { "task_id": "ws_B09QLYFC3G_1762", "instruction": "i'm looking for an orange teeth whitening nhpro enamel care.", "target_attributes": { "attributes": [ "teeth whitening", "fresh breath" ], "options": [ "orange" ] }, "asin": "B09QLYFC3G" }, { "task_id": "ws_B09QLYFC3G_1763", "instruction": "i'm looking for an orange teeth whitening nhpro enamel care.", "target_attributes": { "attributes": [ "teeth whitening", "fresh breath" ], "options": [ "orange" ] }, "asin": "B09QLYFC3G" }, { "task_id": "ws_B084DSPNV5_1764", "instruction": "i would like some long lasting anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B084DSPNV5" }, { "task_id": "ws_B084DSPNV5_1765", "instruction": "i would like some long lasting anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B084DSPNV5" }, { "task_id": "ws_B09MCWDLRL_1766", "instruction": "buy me an easy to assemble sideboard for the dining room in antique white, please.", "target_attributes": { "attributes": [ "easy assemble", "dining room" ], "options": [ "antique white-5" ] }, "asin": "B09MCWDLRL" }, { "task_id": "ws_B09MCWDLRL_1767", "instruction": "buy me an easy to assemble sideboard for the dining room in antique white, please.", "target_attributes": { "attributes": [ "easy assemble", "dining room" ], "options": [ "antique white-5" ] }, "asin": "B09MCWDLRL" }, { "task_id": "ws_B09875CD94_1768", "instruction": "i am looking for black folding tables that are easy to clean and are 40 by 30.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "black", "40*30cm | 16*12in" ] }, "asin": "B09875CD94" }, { "task_id": "ws_B09875CD94_1769", "instruction": "i am looking for black folding tables that are easy to clean and are 40 by 30.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "black", "40*30cm | 16*12in" ] }, "asin": "B09875CD94" }, { "task_id": "ws_B09LK4G5G2_1770", "instruction": "what sweet and salty hazelnuts do you have that have no artificial flavors or colors?", "target_attributes": { "attributes": [ "artificial flavors", "artificial colors" ], "options": [ "sweet & salty hazelnuts" ] }, "asin": "B09LK4G5G2" }, { "task_id": "ws_B09LK4G5G2_1771", "instruction": "what sweet and salty hazelnuts do you have that have no artificial flavors or colors?", "target_attributes": { "attributes": [ "artificial flavors", "artificial colors" ], "options": [ "sweet & salty hazelnuts" ] }, "asin": "B09LK4G5G2" }, { "task_id": "ws_B09NF77VZ8_1772", "instruction": "i need a red t-shirt that has a classic fit in a size 2t for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "red", "men", "2t" ] }, "asin": "B09NF77VZ8" }, { "task_id": "ws_B09NF77VZ8_1773", "instruction": "i need a red t-shirt that has a classic fit in a size 2t for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "red", "men", "2t" ] }, "asin": "B09NF77VZ8" }, { "task_id": "ws_B09PDPSL8F_1774", "instruction": "i need 10 inch hair extensions that are a medium brown.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#p4 | 27 medium brown | dark blonde", "10 inch (pack of 1)" ] }, "asin": "B09PDPSL8F" }, { "task_id": "ws_B09PDPSL8F_1775", "instruction": "i need 10 inch hair extensions that are a medium brown.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#p4 | 27 medium brown | dark blonde", "10 inch (pack of 1)" ] }, "asin": "B09PDPSL8F" }, { "task_id": "ws_B08NK8K3RD_1776", "instruction": "i need a madecassoside and 1.69 fl oz of moisture gel cream for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "1.69 fl oz (pack of 1)", "madecassoside (2x strength)" ] }, "asin": "B08NK8K3RD" }, { "task_id": "ws_B08NK8K3RD_1777", "instruction": "i need a madecassoside and 1.69 fl oz of moisture gel cream for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "1.69 fl oz (pack of 1)", "madecassoside (2x strength)" ] }, "asin": "B08NK8K3RD" }, { "task_id": "ws_B01JA8TU58_1778", "instruction": "i want to find one red contemporary barstool that would be suitable for my dining room.", "target_attributes": { "attributes": [ "contemporary style", "dining room" ], "options": [ "red", "1 pack" ] }, "asin": "B01JA8TU58" }, { "task_id": "ws_B01JA8TU58_1779", "instruction": "i want to find one red contemporary barstool that would be suitable for my dining room.", "target_attributes": { "attributes": [ "contemporary style", "dining room" ], "options": [ "red", "1 pack" ] }, "asin": "B01JA8TU58" }, { "task_id": "ws_B007QFQJO8_1780", "instruction": "i need a xtreamer that plays blu ray discs.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B007QFQJO8" }, { "task_id": "ws_B007QFQJO8_1781", "instruction": "i need a xtreamer that plays blu ray discs.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B007QFQJO8" }, { "task_id": "ws_B07NDJHPMJ_1782", "instruction": "i'm looking for a 1 pound package of low calorie nacho cheese dip.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07NDJHPMJ" }, { "task_id": "ws_B07NDJHPMJ_1783", "instruction": "i'm looking for a 1 pound package of low calorie nacho cheese dip.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07NDJHPMJ" }, { "task_id": "ws_B08SSPPL58_1784", "instruction": "i am looking for size 10 regular fit adidas harden stepback 2.0 basketball shoes.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "10 women | 10 men" ] }, "asin": "B08SSPPL58" }, { "task_id": "ws_B08SSPPL58_1785", "instruction": "i am looking for size 10 regular fit adidas harden stepback 2.0 basketball shoes.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "10 women | 10 men" ] }, "asin": "B08SSPPL58" }, { "task_id": "ws_B09QQBHZTH_1786", "instruction": "i am looking for a blue, long lasting case for a galaxy s22 5g with wireless charging and tempered glass.", "target_attributes": { "attributes": [ "long lasting", "tempered glass", "wireless charging" ], "options": [ "blue" ] }, "asin": "B09QQBHZTH" }, { "task_id": "ws_B09QQBHZTH_1787", "instruction": "i am looking for a blue, long lasting case for a galaxy s22 5g with wireless charging and tempered glass.", "target_attributes": { "attributes": [ "long lasting", "tempered glass", "wireless charging" ], "options": [ "blue" ] }, "asin": "B09QQBHZTH" }, { "task_id": "ws_B08LTSPXHJ_1788", "instruction": "i'm looking for a skin & glow bundle gift set that is cruelty free and fragrance free.", "target_attributes": { "attributes": [ "cruelty free", "fragrance free" ], "options": [ "skin & glow bundle" ] }, "asin": "B08LTSPXHJ" }, { "task_id": "ws_B08LTSPXHJ_1789", "instruction": "i'm looking for a skin & glow bundle gift set that is cruelty free and fragrance free.", "target_attributes": { "attributes": [ "cruelty free", "fragrance free" ], "options": [ "skin & glow bundle" ] }, "asin": "B08LTSPXHJ" }, { "task_id": "ws_B09GVTRLYP_1790", "instruction": "i would like a 12\" x 16\" in three pieces blackleaf poster that's ready to hang in my living room.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "sd2-blackleaf-3", "12\" x 16\" x 3 pcs" ] }, "asin": "B09GVTRLYP" }, { "task_id": "ws_B09GVTRLYP_1791", "instruction": "i would like a 12\" x 16\" in three pieces blackleaf poster that's ready to hang in my living room.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "sd2-blackleaf-3", "12\" x 16\" x 3 pcs" ] }, "asin": "B09GVTRLYP" }, { "task_id": "ws_B07D6DKG5H_1792", "instruction": "get a 2 pack of all natural steak seasoning, please.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "2 pack" ] }, "asin": "B07D6DKG5H" }, { "task_id": "ws_B07D6DKG5H_1793", "instruction": "get a 2 pack of all natural steak seasoning, please.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "2 pack" ] }, "asin": "B07D6DKG5H" }, { "task_id": "ws_B09GPF89W1_1794", "instruction": "i need a kids toothbrush that is orange and good for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "orange" ] }, "asin": "B09GPF89W1" }, { "task_id": "ws_B09GPF89W1_1795", "instruction": "i need a kids toothbrush that is orange and good for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "orange" ] }, "asin": "B09GPF89W1" }, { "task_id": "ws_B07TKH5FP2_1796", "instruction": "i am looking for a classic fit heather blue color t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "heather blue" ] }, "asin": "B07TKH5FP2" }, { "task_id": "ws_B07TKH5FP2_1797", "instruction": "i am looking for a classic fit heather blue color t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "heather blue" ] }, "asin": "B07TKH5FP2" }, { "task_id": "ws_B09LCNBQT5_1798", "instruction": "i am looking for toothbrushes for children aged 6-12 that are pink and easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "a04#pink duck", "aged 6-12" ] }, "asin": "B09LCNBQT5" }, { "task_id": "ws_B09LCNBQT5_1799", "instruction": "i am looking for toothbrushes for children aged 6-12 that are pink and easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "a04#pink duck", "aged 6-12" ] }, "asin": "B09LCNBQT5" }, { "task_id": "ws_B07GN2JDRN_1800", "instruction": "i need to get the 3 pack of trader joe's gluten free falafel mix.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [ "pack of 3" ] }, "asin": "B07GN2JDRN" }, { "task_id": "ws_B07GN2JDRN_1801", "instruction": "i need to get the 3 pack of trader joe's gluten free falafel mix.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [ "pack of 3" ] }, "asin": "B07GN2JDRN" }, { "task_id": "ws_B09HQSGH1Z_1802", "instruction": "i would like a pink toothbrush that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B09HQSGH1Z" }, { "task_id": "ws_B09HQSGH1Z_1803", "instruction": "i would like a pink toothbrush that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B09HQSGH1Z" }, { "task_id": "ws_B07VQ6PG4T_1804", "instruction": "i need white rajlinen 100% blackout curtains in size w52\" x l54\" for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white", "w52\" x l54\"" ] }, "asin": "B07VQ6PG4T" }, { "task_id": "ws_B07VQ6PG4T_1805", "instruction": "i need white rajlinen 100% blackout curtains in size w52\" x l54\" for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white", "w52\" x l54\"" ] }, "asin": "B07VQ6PG4T" }, { "task_id": "ws_B08NR8DH4S_1806", "instruction": "i would like a 16 pack variety box of low sugar cookies.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "variety box", "16 count" ] }, "asin": "B08NR8DH4S" }, { "task_id": "ws_B08NR8DH4S_1807", "instruction": "i would like a 16 pack variety box of low sugar cookies.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "variety box", "16 count" ] }, "asin": "B08NR8DH4S" }, { "task_id": "ws_B01ETZ7KAE_1808", "instruction": "i am looking for semi-permanent hair color that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [] }, "asin": "B01ETZ7KAE" }, { "task_id": "ws_B01ETZ7KAE_1809", "instruction": "i am looking for semi-permanent hair color that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [] }, "asin": "B01ETZ7KAE" }, { "task_id": "ws_B07PXT3SLH_1810", "instruction": "i need a men's blue t-shirt that is compatible with the machine washer.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "royal blue", "men" ] }, "asin": "B07PXT3SLH" }, { "task_id": "ws_B07PXT3SLH_1811", "instruction": "i need a men's blue t-shirt that is compatible with the machine washer.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "royal blue", "men" ] }, "asin": "B07PXT3SLH" }, { "task_id": "ws_B07FXVCZMC_1812", "instruction": "looking for a ultra hd satellite, swmdish long mast, 4 piece", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "swmdish long mast", "4 piece" ] }, "asin": "B07FXVCZMC" }, { "task_id": "ws_B07FXVCZMC_1813", "instruction": "i am looking for one ultra hd satellite dish package that includes a coaxial cable and a low profile short mast.", "target_attributes": { "attributes": [ "ultra hd", "coaxial cable" ], "options": [ "1 piece" ] }, "asin": "B07FXVCZMC" }, { "task_id": "ws_B07FXVCZMC_1814", "instruction": "looking for a ultra hd satellite, swmdish long mast, 4 piece", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "swmdish long mast", "4 piece" ] }, "asin": "B07FXVCZMC" }, { "task_id": "ws_B07FXVCZMC_1815", "instruction": "i am looking for 2000 feet of ultra hd coaxial cable.", "target_attributes": { "attributes": [ "ultra hd", "coaxial cable" ], "options": [ "2000ft" ] }, "asin": "B07FXVCZMC" }, { "task_id": "ws_B0855G7TG4_1816", "instruction": "i need a meadow faux wrap midi dress in size 10 that is easy to dry clean.", "target_attributes": { "attributes": [ "dry clean" ], "options": [ "meadow", "10" ] }, "asin": "B0855G7TG4" }, { "task_id": "ws_B0855G7TG4_1817", "instruction": "i need a meadow faux wrap midi dress in size 10 that is easy to dry clean.", "target_attributes": { "attributes": [ "dry clean" ], "options": [ "meadow", "10" ] }, "asin": "B0855G7TG4" }, { "task_id": "ws_B09M41RMB2_1818", "instruction": "i would like a high quality blue face kit to help with fine lines and wrinkles.", "target_attributes": { "attributes": [ "high quality", "fine lines" ], "options": [ "blue" ] }, "asin": "B09M41RMB2" }, { "task_id": "ws_B09M41RMB2_1819", "instruction": "i would like a high quality blue face kit to help with fine lines and wrinkles.", "target_attributes": { "attributes": [ "high quality", "fine lines" ], "options": [ "blue" ] }, "asin": "B09M41RMB2" }, { "task_id": "ws_B007EP9APA_1820", "instruction": "i need a bottle of marc anthony argan oil.", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B007EP9APA" }, { "task_id": "ws_B007EP9APA_1821", "instruction": "i need a bottle of marc anthony argan oil.", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B007EP9APA" }, { "task_id": "ws_B01M2AR64E_1822", "instruction": "i need a ashley bolanburg display cabinet that requires assembly.", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B01M2AR64E" }, { "task_id": "ws_B01M2AR64E_1823", "instruction": "i need a ashley bolanburg display cabinet that requires assembly.", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B01M2AR64E" }, { "task_id": "ws_B09PYDY17D_1824", "instruction": "i'm interested in some machine-washable, men's x-large, low-rise briefs in black with an elastic waistband.", "target_attributes": { "attributes": [ "low rise", "machine wash", "elastic waistband" ], "options": [ "black", "x-large" ] }, "asin": "B09PYDY17D" }, { "task_id": "ws_B09PYDY17D_1825", "instruction": "i'm interested in some machine-washable, men's x-large, low-rise briefs in black with an elastic waistband.", "target_attributes": { "attributes": [ "low rise", "machine wash", "elastic waistband" ], "options": [ "black", "x-large" ] }, "asin": "B09PYDY17D" }, { "task_id": "ws_B01KGEL9KE_1826", "instruction": "i need a stainless steel adjustable barstool", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B01KGEL9KE" }, { "task_id": "ws_B01KGEL9KE_1827", "instruction": "i need a stainless steel adjustable barstool", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B01KGEL9KE" }, { "task_id": "ws_B07H2Z173V_1828", "instruction": "i would like a king size wine red pillowcase with exquisite workmanship.", "target_attributes": { "attributes": [ "exquisite workmanship" ], "options": [ "wine red", "king (20\" x 40\")" ] }, "asin": "B07H2Z173V" }, { "task_id": "ws_B07H2Z173V_1829", "instruction": "i would like a king size wine red pillowcase with exquisite workmanship.", "target_attributes": { "attributes": [ "exquisite workmanship" ], "options": [ "wine red", "king (20\" x 40\")" ] }, "asin": "B07H2Z173V" }, { "task_id": "ws_B00O12MBGO_1830", "instruction": "looking for freeze-dried raw flavor beef size 3.5 oz grain free", "target_attributes": { "attributes": [ "freeze dried", "grain free" ], "options": [ "beef", "3.5 ounce (pack of 1)" ] }, "asin": "B00O12MBGO" }, { "task_id": "ws_B00O12MBGO_1831", "instruction": "can you find me freeze dried, grain free dog food? i want the single pack in 3.5 ounces.", "target_attributes": { "attributes": [ "freeze dried", "grain free" ], "options": [ "3.5 ounce (pack of 1)" ] }, "asin": "B00O12MBGO" }, { "task_id": "ws_B00O12MBGO_1832", "instruction": "looking for freeze-dried raw flavor beef size 3.5 oz grain free", "target_attributes": { "attributes": [ "freeze dried", "grain free" ], "options": [ "beef", "3.5 ounce (pack of 1)" ] }, "asin": "B00O12MBGO" }, { "task_id": "ws_B00O12MBGO_1833", "instruction": "i want stella & chewy's freeze dried turkey.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "turkey" ] }, "asin": "B00O12MBGO" }, { "task_id": "ws_B08R7W464K_1834", "instruction": "i need a console table for the living room. look for one in oak brown.", "target_attributes": { "attributes": [ "living room" ], "options": [ "oak brown" ] }, "asin": "B08R7W464K" }, { "task_id": "ws_B08R7W464K_1835", "instruction": "i need a console table for the living room. look for one in oak brown.", "target_attributes": { "attributes": [ "living room" ], "options": [ "oak brown" ] }, "asin": "B08R7W464K" }, { "task_id": "ws_B08R7W464K_1836", "instruction": "i am looking for a console table with a wood finish that is acacia brown.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "acacia brown", "acacia brown" ] }, "asin": "B08R7W464K" }, { "task_id": "ws_B000JHHEOE_1837", "instruction": "get me some machine washable stonewash jeans.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "stonewash" ] }, "asin": "B000JHHEOE" }, { "task_id": "ws_B000JHHEOE_1838", "instruction": "get me some machine washable stonewash jeans.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "stonewash" ] }, "asin": "B000JHHEOE" }, { "task_id": "ws_B01FGHY04I_1839", "instruction": "i would like a beige rectangular rug that is 10' 0 x 13' 0 and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "rectangular 10' 0 x 13' 0" ] }, "asin": "B01FGHY04I" }, { "task_id": "ws_B01FGHY04I_1840", "instruction": "i would like a beige rectangular rug that is 10' 0 x 13' 0 and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "rectangular 10' 0 x 13' 0" ] }, "asin": "B01FGHY04I" }, { "task_id": "ws_B01138YJKY_1841", "instruction": "i need tan high heel booties in size 9.5", "target_attributes": { "attributes": [ "high heel" ], "options": [ "9.5" ] }, "asin": "B01138YJKY" }, { "task_id": "ws_B01138YJKY_1842", "instruction": "i need tan high heel booties in size 9.5", "target_attributes": { "attributes": [ "high heel" ], "options": [ "9.5" ] }, "asin": "B01138YJKY" }, { "task_id": "ws_B09KLN71KJ_1843", "instruction": "i am looking for wireless bluetooth headphones with touch control and a wireless charging case.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B09KLN71KJ" }, { "task_id": "ws_B09KLN71KJ_1844", "instruction": "i am looking for wireless bluetooth headphones with touch control and a wireless charging case.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B09KLN71KJ" }, { "task_id": "ws_B00JHD5FC4_1845", "instruction": "i am looking for black leather sole fashion sneakers that are in a size 5.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "black pulsar", "5" ] }, "asin": "B00JHD5FC4" }, { "task_id": "ws_B00JHD5FC4_1846", "instruction": "i am looking for some size 7.5 mens sneakers with a pewter colored rubber outside.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "pewter", "7.5" ] }, "asin": "B00JHD5FC4" }, { "task_id": "ws_B00JHD5FC4_1847", "instruction": "i am looking for black leather sole fashion sneakers that are in a size 5.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "black pulsar", "5" ] }, "asin": "B00JHD5FC4" }, { "task_id": "ws_B00JHD5FC4_1848", "instruction": "i would like a pair of grey size 6 sneakers with a rubber sole.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "grey", "6" ] }, "asin": "B00JHD5FC4" }, { "task_id": "ws_B09HKD9VNG_1849", "instruction": "i am looking for a mid century ottoman that is whiskey brown in color and is 16.5 inches.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "whiskey brown", "16.5inches" ] }, "asin": "B09HKD9VNG" }, { "task_id": "ws_B09HKD9VNG_1850", "instruction": "i am looking for a mid century ottoman that is whiskey brown in color and is 16.5 inches.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "whiskey brown", "16.5inches" ] }, "asin": "B09HKD9VNG" }, { "task_id": "ws_B07Y8RWHPF_1851", "instruction": "i need some non gmo, keto friendly ghee butter that is shelf stable.", "target_attributes": { "attributes": [ "non gmo", "shelf stable", "keto friendly" ], "options": [] }, "asin": "B07Y8RWHPF" }, { "task_id": "ws_B07Y8RWHPF_1852", "instruction": "i need some non gmo, keto friendly ghee butter that is shelf stable.", "target_attributes": { "attributes": [ "non gmo", "shelf stable", "keto friendly" ], "options": [] }, "asin": "B07Y8RWHPF" }, { "task_id": "ws_B083ZLXJKW_1853", "instruction": "i need hemp shower oil for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B083ZLXJKW" }, { "task_id": "ws_B083ZLXJKW_1854", "instruction": "i need hemp shower oil for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B083ZLXJKW" }, { "task_id": "ws_B083ZLXJKW_1855", "instruction": "i would like a body wash made of seed oil.", "target_attributes": { "attributes": [ "seed oil" ], "options": [] }, "asin": "B083ZLXJKW" }, { "task_id": "ws_B09MQ7ZZSZ_1856", "instruction": "i need bear head cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "head" ] }, "asin": "B09MQ7ZZSZ" }, { "task_id": "ws_B09MQ7ZZSZ_1857", "instruction": "i need bear head cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "head" ] }, "asin": "B09MQ7ZZSZ" }, { "task_id": "ws_B08K38RMW7_1858", "instruction": "i need a blue sherpa wool sweatshirt.", "target_attributes": { "attributes": [ "soft material" ], "options": [ "c-blue" ] }, "asin": "B08K38RMW7" }, { "task_id": "ws_B08K38RMW7_1859", "instruction": "i need a blue sherpa wool sweatshirt.", "target_attributes": { "attributes": [ "soft material" ], "options": [ "c-blue" ] }, "asin": "B08K38RMW7" }, { "task_id": "ws_B00DYGQZOC_1860", "instruction": "i'm looking for a wild caught chunk light tuna in sunflower oil. choose the ones that comes in 2.6 oz pack of 24.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "chunk light in sunflower oil", "2.6 ounce (pack of 24)" ] }, "asin": "B00DYGQZOC" }, { "task_id": "ws_B00DYGQZOC_1861", "instruction": "i'm looking for a wild caught chunk light tuna in sunflower oil. choose the ones that comes in 2.6 oz pack of 24.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "chunk light in sunflower oil", "2.6 ounce (pack of 24)" ] }, "asin": "B00DYGQZOC" }, { "task_id": "ws_B09Q3F2LB1_1862", "instruction": "i'd like to buy a small white jumpsuit with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "white", "small" ] }, "asin": "B09Q3F2LB1" }, { "task_id": "ws_B09Q3F2LB1_1863", "instruction": "i'd like to buy a small white jumpsuit with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "white", "small" ] }, "asin": "B09Q3F2LB1" }, { "task_id": "ws_B085DTCP31_1864", "instruction": "i need dog cupcake toppers for a dog party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "dog banner" ] }, "asin": "B085DTCP31" }, { "task_id": "ws_B085DTCP31_1865", "instruction": "i need dog cupcake toppers for a dog party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "dog banner" ] }, "asin": "B085DTCP31" }, { "task_id": "ws_B00AFYAXEO_1866", "instruction": "i am looking for extra strength exfoliator that handles dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "extra strength" ] }, "asin": "B00AFYAXEO" }, { "task_id": "ws_B00AFYAXEO_1867", "instruction": "i am looking for extra strength exfoliator that handles dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "extra strength" ] }, "asin": "B00AFYAXEO" }, { "task_id": "ws_B00PKHCA0Q_1868", "instruction": "i am looking for a faux leather grey color loveseat for living room", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "grey", "loveseat" ] }, "asin": "B00PKHCA0Q" }, { "task_id": "ws_B00PKHCA0Q_1869", "instruction": "i am looking for a faux leather grey color loveseat for living room", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "grey", "loveseat" ] }, "asin": "B00PKHCA0Q" }, { "task_id": "ws_B08PHFZNBY_1870", "instruction": "i am looking for individually wrapped bakery gifts.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B08PHFZNBY" }, { "task_id": "ws_B08PHFZNBY_1871", "instruction": "i am looking for individually wrapped bakery gifts.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B08PHFZNBY" }, { "task_id": "ws_B09L7QFVTQ_1872", "instruction": "i need a small red womens fleece jacket that is made of polyester spandex,", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "l-red", "small" ] }, "asin": "B09L7QFVTQ" }, { "task_id": "ws_B09L7QFVTQ_1873", "instruction": "i need a small red womens fleece jacket that is made of polyester spandex,", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "l-red", "small" ] }, "asin": "B09L7QFVTQ" }, { "task_id": "ws_B004LKAO2E_1874", "instruction": "i'm looking for 33.81 fl oz non-gmo gluten free monin raspberry syrup.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "33.81 fl oz (pack of 2)" ] }, "asin": "B004LKAO2E" }, { "task_id": "ws_B004LKAO2E_1875", "instruction": "i'm looking for 33.81 fl oz non-gmo gluten free monin raspberry syrup.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "33.81 fl oz (pack of 2)" ] }, "asin": "B004LKAO2E" }, { "task_id": "ws_B07L3PX14F_1876", "instruction": "i am looking for a white and black heavy duty steel frame computer desk.", "target_attributes": { "attributes": [ "heavy duty", "steel frame" ], "options": [ "white+black" ] }, "asin": "B07L3PX14F" }, { "task_id": "ws_B07L3PX14F_1877", "instruction": "i am looking for a white and black heavy duty steel frame computer desk.", "target_attributes": { "attributes": [ "heavy duty", "steel frame" ], "options": [ "white+black" ] }, "asin": "B07L3PX14F" }, { "task_id": "ws_B08G5RRKK6_1878", "instruction": "i am interested in a towel for drying hair that is pink.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "pink | palms" ] }, "asin": "B08G5RRKK6" }, { "task_id": "ws_B08G5RRKK6_1879", "instruction": "i am interested in a towel for drying hair that is pink.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "pink | palms" ] }, "asin": "B08G5RRKK6" }, { "task_id": "ws_B0971SBWGG_1880", "instruction": "i need to order some certified organic loose leaf tea.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "loose leaf" ] }, "asin": "B0971SBWGG" }, { "task_id": "ws_B0971SBWGG_1881", "instruction": "i'm looking for a six-count pack of loose-leaf white tea powder. it needs to be usda certified organic.", "target_attributes": { "attributes": [ "usda organic", "certified organic" ], "options": [ "white tea", "6 count (pack of 1)", "loose leaf" ] }, "asin": "B0971SBWGG" }, { "task_id": "ws_B0971SBWGG_1882", "instruction": "i need to order some certified organic loose leaf tea.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "loose leaf" ] }, "asin": "B0971SBWGG" }, { "task_id": "ws_B0971SBWGG_1883", "instruction": "i'm looking for certified usda organic black tea bags. i need a 20 count box.", "target_attributes": { "attributes": [ "usda organic", "certified organic" ], "options": [ "black tea (decaf)", "20 count (pack of 1)", "tea bags" ] }, "asin": "B0971SBWGG" }, { "task_id": "ws_B0971SBWGG_1884", "instruction": "i am looking for certified organic english breakfast tea bags.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "english breakfast", "tea bags" ] }, "asin": "B0971SBWGG" }, { "task_id": "ws_B06X9T6WLP_1885", "instruction": "i am looking for high quality dark red synthetic hair extensions.", "target_attributes": { "attributes": [ "high quality", "synthetic hair", "hair extensions" ], "options": [ "dark red" ] }, "asin": "B06X9T6WLP" }, { "task_id": "ws_B06X9T6WLP_1886", "instruction": "i am looking for high quality dark red synthetic hair extensions.", "target_attributes": { "attributes": [ "high quality", "synthetic hair", "hair extensions" ], "options": [ "dark red" ] }, "asin": "B06X9T6WLP" }, { "task_id": "ws_B08B7MYLXY_1887", "instruction": "looking for short lace boots for day comfort, fawn color, size 6.5", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "blanc | fawn", "6.5" ] }, "asin": "B08B7MYLXY" }, { "task_id": "ws_B08B7MYLXY_1888", "instruction": "looking for short lace boots for day comfort, fawn color, size 6.5", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "blanc | fawn", "6.5" ] }, "asin": "B08B7MYLXY" }, { "task_id": "ws_B085B29638_1889", "instruction": "i am interested in a variety pack of fruit snacks that are plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "variety pack (apple mango | apple strawberry)" ] }, "asin": "B085B29638" }, { "task_id": "ws_B085B29638_1890", "instruction": "i am interested in a variety pack of fruit snacks that are plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "variety pack (apple mango | apple strawberry)" ] }, "asin": "B085B29638" }, { "task_id": "ws_B08M569G16_1891", "instruction": "i need a pack of 18 white cheddar black pepper creole bean + nut snack mix that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "white cheddar black pepper", "1.25 ounce (pack of 18)" ] }, "asin": "B08M569G16" }, { "task_id": "ws_B08M569G16_1892", "instruction": "i need a pack of 18 white cheddar black pepper creole bean + nut snack mix that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "white cheddar black pepper", "1.25 ounce (pack of 18)" ] }, "asin": "B08M569G16" }, { "task_id": "ws_B08G8NCR8D_1893", "instruction": "i am looking for an easy to clean hair dyeing set with a mixing bowl.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B08G8NCR8D" }, { "task_id": "ws_B08G8NCR8D_1894", "instruction": "i am looking for an easy to clean hair dyeing set with a mixing bowl.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B08G8NCR8D" }, { "task_id": "ws_B08JZC6FZH_1895", "instruction": "i would like a 12 ounce cantina party mix with simple ingregients.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "cantina mix", "12 ounce (pack of 1)" ] }, "asin": "B08JZC6FZH" }, { "task_id": "ws_B08JZC6FZH_1896", "instruction": "i would like a 12 ounce cantina party mix with simple ingregients.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "cantina mix", "12 ounce (pack of 1)" ] }, "asin": "B08JZC6FZH" }, { "task_id": "ws_B08BFJLHDK_1897", "instruction": "i am looking for machine washable sweatsuits that are pink and in an xx-large.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "3147 pink star", "xx-large" ] }, "asin": "B08BFJLHDK" }, { "task_id": "ws_B08BFJLHDK_1898", "instruction": "i am looking for machine washable sweatsuits that are pink and in an xx-large.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "3147 pink star", "xx-large" ] }, "asin": "B08BFJLHDK" }, { "task_id": "ws_B095CP9GD9_1899", "instruction": "i need a skincare product that will help with the dark circles under my eyes.", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B095CP9GD9" }, { "task_id": "ws_B095CP9GD9_1900", "instruction": "i need a skincare product that will help with the dark circles under my eyes.", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B095CP9GD9" }, { "task_id": "ws_B07YK94TDJ_1901", "instruction": "i need an outdoor tv cover to dustproof a 51 inch television.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "52 inch" ] }, "asin": "B07YK94TDJ" }, { "task_id": "ws_B07YK94TDJ_1902", "instruction": "i need an outdoor tv cover to dustproof a 51 inch television.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "52 inch" ] }, "asin": "B07YK94TDJ" }, { "task_id": "ws_B07YK94TDJ_1903", "instruction": "i'm looking for a outdoor tv cover with 72 inch, need to be dust proof and black color", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "black", "72 inch" ] }, "asin": "B07YK94TDJ" }, { "task_id": "ws_B07YK94TDJ_1904", "instruction": "i'm looking for a heavy duty, dust proof tv screen protectors which is easy to install. also, choose 46 inch camel colored one.", "target_attributes": { "attributes": [ "dust proof", "heavy duty", "easy install" ], "options": [ "camel", "46 inch" ] }, "asin": "B07YK94TDJ" }, { "task_id": "ws_B09NZJSMQS_1905", "instruction": "i am looking for a high quality hair removal wax bottle.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09NZJSMQS" }, { "task_id": "ws_B09NZJSMQS_1906", "instruction": "i am looking for a high quality hair removal wax bottle.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09NZJSMQS" }, { "task_id": "ws_B079NY8BF3_1907", "instruction": "i'm looking to buy a body wash that has tea tree oil as an ingredient that would work well for sensitive skin.", "target_attributes": { "attributes": [ "tea tree", "sensitive skin" ], "options": [] }, "asin": "B079NY8BF3" }, { "task_id": "ws_B079NY8BF3_1908", "instruction": "i'm looking to buy a body wash that has tea tree oil as an ingredient that would work well for sensitive skin.", "target_attributes": { "attributes": [ "tea tree", "sensitive skin" ], "options": [] }, "asin": "B079NY8BF3" }, { "task_id": "ws_B07B3VCT7X_1909", "instruction": "i need a bulk pack of 100 disposable toothbrushes for oral hygeine.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "100 pack" ] }, "asin": "B07B3VCT7X" }, { "task_id": "ws_B07B3VCT7X_1910", "instruction": "i need a bulk pack of 100 disposable toothbrushes for oral hygeine.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "100 pack" ] }, "asin": "B07B3VCT7X" }, { "task_id": "ws_B09D39L8P8_1911", "instruction": "i would like a gold tongue cleaner for my oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "gold" ] }, "asin": "B09D39L8P8" }, { "task_id": "ws_B09D39L8P8_1912", "instruction": "i would like a gold tongue cleaner for my oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "gold" ] }, "asin": "B09D39L8P8" }, { "task_id": "ws_B08T76YM9K_1913", "instruction": "i'm looking for a hair salon stool that offers height adjustment and is the color blue.", "target_attributes": { "attributes": [ "height adjustable", "hair salon" ], "options": [ "blue" ] }, "asin": "B08T76YM9K" }, { "task_id": "ws_B08T76YM9K_1914", "instruction": "i'm looking for a hair salon stool that offers height adjustment and is the color blue.", "target_attributes": { "attributes": [ "height adjustable", "hair salon" ], "options": [ "blue" ] }, "asin": "B08T76YM9K" }, { "task_id": "ws_B08GJH2XWJ_1915", "instruction": "i would like a 5\" x 5\" square cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "5\" x 5\" square" ] }, "asin": "B08GJH2XWJ" }, { "task_id": "ws_B08GJH2XWJ_1916", "instruction": "i would like a 5\" x 5\" square cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "5\" x 5\" square" ] }, "asin": "B08GJH2XWJ" }, { "task_id": "ws_B09S5YDXS2_1917", "instruction": "i need to buy a pair of swimming trunks in 3x large. make sure they can be washed on the cold cycle.", "target_attributes": { "attributes": [ "wash cold" ], "options": [ "3x-large" ] }, "asin": "B09S5YDXS2" }, { "task_id": "ws_B09S5YDXS2_1918", "instruction": "i need to buy a pair of swimming trunks in 3x large. make sure they can be washed on the cold cycle.", "target_attributes": { "attributes": [ "wash cold" ], "options": [ "3x-large" ] }, "asin": "B09S5YDXS2" }, { "task_id": "ws_B08XY8L3KN_1919", "instruction": "i need a light wash mid rise slim leg jeans that comes with button closure in size 27 for women.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "light wash soc174", "27" ] }, "asin": "B08XY8L3KN" }, { "task_id": "ws_B08XY8L3KN_1920", "instruction": "i need a light wash mid rise slim leg jeans that comes with button closure in size 27 for women.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "light wash soc174", "27" ] }, "asin": "B08XY8L3KN" }, { "task_id": "ws_B08XY8L3KN_1921", "instruction": "i need a jeans with button closure.", "target_attributes": { "attributes": [ "button closure" ], "options": [] }, "asin": "B08XY8L3KN" }, { "task_id": "ws_B01GE2ZO2G_1922", "instruction": "i'm looking for a tongue scraper that is stainless steel and helps me keep fresh breath.", "target_attributes": { "attributes": [ "stainless steel", "fresh breath" ], "options": [] }, "asin": "B01GE2ZO2G" }, { "task_id": "ws_B01GE2ZO2G_1923", "instruction": "i'm looking for a tongue scraper that is stainless steel and helps me keep fresh breath.", "target_attributes": { "attributes": [ "stainless steel", "fresh breath" ], "options": [] }, "asin": "B01GE2ZO2G" }, { "task_id": "ws_B000HJ6TT0_1924", "instruction": "i am interested in a six inch red candle that is made of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "red", "6 in" ] }, "asin": "B000HJ6TT0" }, { "task_id": "ws_B000HJ6TT0_1925", "instruction": "i am interested in a six inch red candle that is made of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "red", "6 in" ] }, "asin": "B000HJ6TT0" }, { "task_id": "ws_B00NB8OJAA_1926", "instruction": "i need a blue portable bluetooth speaker that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "party blue" ] }, "asin": "B00NB8OJAA" }, { "task_id": "ws_B00NB8OJAA_1927", "instruction": "i need a blue portable bluetooth speaker that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "party blue" ] }, "asin": "B00NB8OJAA" }, { "task_id": "ws_B00J8U0J4A_1928", "instruction": "i am looking for a living room set with two armchairs that are gray in color and mid century style.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "expectation gray", "two armchairs" ] }, "asin": "B00J8U0J4A" }, { "task_id": "ws_B00J8U0J4A_1929", "instruction": "i am looking for a living room set with two armchairs that are gray in color and mid century style.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "expectation gray", "two armchairs" ] }, "asin": "B00J8U0J4A" }, { "task_id": "ws_B00J8U0J4A_1930", "instruction": "mid century leather two armchair set", "target_attributes": { "attributes": [ "mid century" ], "options": [ "armchair and sofa" ] }, "asin": "B00J8U0J4A" }, { "task_id": "ws_B08QMC9G4J_1931", "instruction": "i am looking for smartwatch bands that are nude in color and are compatible with apple.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "nude color" ] }, "asin": "B08QMC9G4J" }, { "task_id": "ws_B08QMC9G4J_1932", "instruction": "i am looking for smartwatch bands that are nude in color and are compatible with apple.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "nude color" ] }, "asin": "B08QMC9G4J" }, { "task_id": "ws_B078N6ZHXP_1933", "instruction": "i would like a full size classic 8\" split foundation mattress and box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "classic collection", "full", "8\" split foundation" ] }, "asin": "B078N6ZHXP" }, { "task_id": "ws_B078N6ZHXP_1934", "instruction": "i would like a full size classic 8\" split foundation mattress and box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "classic collection", "full", "8\" split foundation" ] }, "asin": "B078N6ZHXP" }, { "task_id": "ws_B09PT81KY2_1935", "instruction": "i want to find a desktop computer that features ryz 5 pro 3400ge, 32 gigabytes of storage space and 500 gigabytes on the ssd card. it needs to have a quad core processor.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "ryz 5 pro 3400ge | 32gb | 500gb ssd" ] }, "asin": "B09PT81KY2" }, { "task_id": "ws_B09PT81KY2_1936", "instruction": "i want to find a desktop computer that features ryz 5 pro 3400ge, 32 gigabytes of storage space and 500 gigabytes on the ssd card. it needs to have a quad core processor.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "ryz 5 pro 3400ge | 32gb | 500gb ssd" ] }, "asin": "B09PT81KY2" }, { "task_id": "ws_B08THK9ZSB_1937", "instruction": "i need vintage beauty salon chairs.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "a" ] }, "asin": "B08THK9ZSB" }, { "task_id": "ws_B08THK9ZSB_1938", "instruction": "i need vintage beauty salon chairs.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "a" ] }, "asin": "B08THK9ZSB" }, { "task_id": "ws_B0816448FQ_1939", "instruction": "i am looking for a white feather color large makeup bag which is water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "white feather" ] }, "asin": "B0816448FQ" }, { "task_id": "ws_B0816448FQ_1940", "instruction": "i am looking for a white feather color large makeup bag which is water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "white feather" ] }, "asin": "B0816448FQ" }, { "task_id": "ws_B098W775RF_1941", "instruction": "i need a pink blossom colored carrying case for my cell phone.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "pink cherry blossom" ] }, "asin": "B098W775RF" }, { "task_id": "ws_B098W775RF_1942", "instruction": "i need a pink blossom colored carrying case for my cell phone.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "pink cherry blossom" ] }, "asin": "B098W775RF" }, { "task_id": "ws_B07GPM973V_1943", "instruction": "find a sneaker for men with outsole rubber and rubber sole size 4 color in black or white", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "black | white", "4" ] }, "asin": "B07GPM973V" }, { "task_id": "ws_B07GPM973V_1944", "instruction": "find a sneaker for men with outsole rubber and rubber sole size 4 color in black or white", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "black | white", "4" ] }, "asin": "B07GPM973V" }, { "task_id": "ws_B01GS3NXSI_1945", "instruction": "i am interested in a round area rug that is turquoise and ivory and 6 ft by 7 ft long.", "target_attributes": { "attributes": [ "living room" ], "options": [ "turquoise | ivory", "round", "6 ft 7 in x 6 ft 7 in" ] }, "asin": "B01GS3NXSI" }, { "task_id": "ws_B01GS3NXSI_1946", "instruction": "i am interested in a round area rug that is turquoise and ivory and 6 ft by 7 ft long.", "target_attributes": { "attributes": [ "living room" ], "options": [ "turquoise | ivory", "round", "6 ft 7 in x 6 ft 7 in" ] }, "asin": "B01GS3NXSI" }, { "task_id": "ws_B07P1CYG3D_1947", "instruction": "i need a white coated steel stockpile 3-drawer mobile file cabinet.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "white | orange" ] }, "asin": "B07P1CYG3D" }, { "task_id": "ws_B07P1CYG3D_1948", "instruction": "i need a white coated steel stockpile 3-drawer mobile file cabinet.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "white | orange" ] }, "asin": "B07P1CYG3D" }, { "task_id": "ws_B09PYHJ249_1949", "instruction": "i am looking for dark blue color womens jeans having high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "dark blue" ] }, "asin": "B09PYHJ249" }, { "task_id": "ws_B09PYHJ249_1950", "instruction": "i am looking for dark blue color womens jeans having high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "dark blue" ] }, "asin": "B09PYHJ249" }, { "task_id": "ws_B0978DR561_1951", "instruction": "i want to find one messy synthetic hair bun piece in a light auburn color.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "15# light auburn", "1 pcs" ] }, "asin": "B0978DR561" }, { "task_id": "ws_B0978DR561_1952", "instruction": "i want to find one messy synthetic hair bun piece in a light auburn color.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "15# light auburn", "1 pcs" ] }, "asin": "B0978DR561" }, { "task_id": "ws_B00778CGU0_1953", "instruction": "i am looking for hand crafted snack gifts.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B00778CGU0" }, { "task_id": "ws_B00778CGU0_1954", "instruction": "i am looking for hand crafted snack gifts.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B00778CGU0" }, { "task_id": "ws_B01N0YGEQT_1955", "instruction": "i need a powerlite 1785w projector that projects 1080p hd.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "powerlite 1785w" ] }, "asin": "B01N0YGEQT" }, { "task_id": "ws_B01N0YGEQT_1956", "instruction": "i need a powerlite 1785w projector that projects 1080p hd.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "powerlite 1785w" ] }, "asin": "B01N0YGEQT" }, { "task_id": "ws_B09D77KB16_1957", "instruction": "i want a highly pigmented lip gloss that is in the color r901", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "r901" ] }, "asin": "B09D77KB16" }, { "task_id": "ws_B09D77KB16_1958", "instruction": "i want a highly pigmented lip gloss that is in the color r901", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "r901" ] }, "asin": "B09D77KB16" }, { "task_id": "ws_B07VSZG1W3_1959", "instruction": "i need an indoor ultra hd antenna with an amplifier.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "indoor smartpass amplified antenna6" ] }, "asin": "B07VSZG1W3" }, { "task_id": "ws_B07VSZG1W3_1960", "instruction": "i need an indoor ultra hd antenna with an amplifier.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "indoor smartpass amplified antenna6" ] }, "asin": "B07VSZG1W3" }, { "task_id": "ws_B07XC7GVRK_1961", "instruction": "i need a lenovo chromebook with intel core i3-8130u.", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B07XC7GVRK" }, { "task_id": "ws_B07XC7GVRK_1962", "instruction": "i need a lenovo chromebook with intel core i3-8130u.", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B07XC7GVRK" }, { "task_id": "ws_B08VJ6V1VM_1963", "instruction": "i'm looking for a topper for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B08VJ6V1VM" }, { "task_id": "ws_B08VJ6V1VM_1964", "instruction": "i'm looking for a topper for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B08VJ6V1VM" }, { "task_id": "ws_B09MTYJ85J_1965", "instruction": "i need a cell phone signal booster that is compatible with 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09MTYJ85J" }, { "task_id": "ws_B09MTYJ85J_1966", "instruction": "i need a cell phone signal booster that is compatible with 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09MTYJ85J" }, { "task_id": "ws_B09B9SSMQH_1967", "instruction": "get me some black sneakers in size five and a half. make sure they're made out of high-quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "black", "5.5" ] }, "asin": "B09B9SSMQH" }, { "task_id": "ws_B09B9SSMQH_1968", "instruction": "get me some black sneakers in size five and a half. make sure they're made out of high-quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "black", "5.5" ] }, "asin": "B09B9SSMQH" }, { "task_id": "ws_B098XWSF8B_1969", "instruction": "i would like a pair of blue medium sized shorts with a elastic waist.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "blue", "medium" ] }, "asin": "B098XWSF8B" }, { "task_id": "ws_B098XWSF8B_1970", "instruction": "i would like a pair of blue medium sized shorts with a elastic waist.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "blue", "medium" ] }, "asin": "B098XWSF8B" }, { "task_id": "ws_B08DWNRVBS_1971", "instruction": "i am looking for a clothes rack of 22-inch size that is heavy duty and saves space.", "target_attributes": { "attributes": [ "heavy duty", "space saving" ], "options": [ "22-inch" ] }, "asin": "B08DWNRVBS" }, { "task_id": "ws_B08DWNRVBS_1972", "instruction": "i am looking for a clothes rack of 22-inch size that is heavy duty and saves space.", "target_attributes": { "attributes": [ "heavy duty", "space saving" ], "options": [ "22-inch" ] }, "asin": "B08DWNRVBS" }, { "task_id": "ws_B089NSX3FR_1973", "instruction": "i would like some green size 36 shorts that are good for my gym workout.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "#17 green", "36" ] }, "asin": "B089NSX3FR" }, { "task_id": "ws_B089NSX3FR_1974", "instruction": "i would like some green size 36 shorts that are good for my gym workout.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "#17 green", "36" ] }, "asin": "B089NSX3FR" }, { "task_id": "ws_B084NVN1J6_1975", "instruction": "i need roasted coffee beans that are dairy free and cinnamon bun flavored.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "cinnamon bun" ] }, "asin": "B084NVN1J6" }, { "task_id": "ws_B084NVN1J6_1976", "instruction": "i would like a 12 oz package of whole bean coffee beans that are keto friendly.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "cookies 'n dreams", "12 oz whole bean coffee" ] }, "asin": "B084NVN1J6" }, { "task_id": "ws_B084NVN1J6_1977", "instruction": "i need roasted coffee beans that are dairy free and cinnamon bun flavored.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "cinnamon bun" ] }, "asin": "B084NVN1J6" }, { "task_id": "ws_B07GJN7V8R_1978", "instruction": "i am looking for a artisan gold color flipflop having rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "artisan gold" ] }, "asin": "B07GJN7V8R" }, { "task_id": "ws_B07GJN7V8R_1979", "instruction": "i am looking for a artisan gold color flipflop having rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "artisan gold" ] }, "asin": "B07GJN7V8R" }, { "task_id": "ws_B08P4SH2NQ_1980", "instruction": "i need a usb video game capture card for my usb port.", "target_attributes": { "attributes": [ "plug play", "usb port" ], "options": [] }, "asin": "B08P4SH2NQ" }, { "task_id": "ws_B08P4SH2NQ_1981", "instruction": "i need a usb video game capture card for my usb port.", "target_attributes": { "attributes": [ "plug play", "usb port" ], "options": [] }, "asin": "B08P4SH2NQ" }, { "task_id": "ws_B00G4F22L0_1982", "instruction": "i'm looking for a pair of classic fit silver gray scrub bottoms in large petite with an elastic waistband and drawstring closure.", "target_attributes": { "attributes": [ "elastic waistband", "drawstring closure", "classic fit" ], "options": [ "silver gray", "large petite" ] }, "asin": "B00G4F22L0" }, { "task_id": "ws_B00G4F22L0_1983", "instruction": "i'm looking for a pair of classic fit silver gray scrub bottoms in large petite with an elastic waistband and drawstring closure.", "target_attributes": { "attributes": [ "elastic waistband", "drawstring closure", "classic fit" ], "options": [ "silver gray", "large petite" ] }, "asin": "B00G4F22L0" }, { "task_id": "ws_B084R2JGMM_1984", "instruction": "i'm looking for a 6-pack of salted caramel & dark chocolate nut bars with low sugar and simple ingredients.", "target_attributes": { "attributes": [ "low sugar", "simple ingredients" ], "options": [ "salted caramel & dark chocolate nut", "6 bars" ] }, "asin": "B084R2JGMM" }, { "task_id": "ws_B084R2JGMM_1985", "instruction": "i'm looking for a 6-pack of salted caramel & dark chocolate nut bars with low sugar and simple ingredients.", "target_attributes": { "attributes": [ "low sugar", "simple ingredients" ], "options": [ "salted caramel & dark chocolate nut", "6 bars" ] }, "asin": "B084R2JGMM" }, { "task_id": "ws_B084R2JGMM_1986", "instruction": "i would like 6 bars of low sugar chocolates", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "6 bars" ] }, "asin": "B084R2JGMM" }, { "task_id": "ws_B084R2JGMM_1987", "instruction": "get me a dark chocolate and chilli almond snack bar that is low in sugar.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "dark chocolate chili almond" ] }, "asin": "B084R2JGMM" }, { "task_id": "ws_B00EXW2FLI_1988", "instruction": "i want to find long-lasting eau de toilette from chanel.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00EXW2FLI" }, { "task_id": "ws_B00EXW2FLI_1989", "instruction": "i want to find long-lasting eau de toilette from chanel.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00EXW2FLI" }, { "task_id": "ws_B001EWEP40_1990", "instruction": "i am looking for a powder fresh mitchum anti-perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "powder fresh" ] }, "asin": "B001EWEP40" }, { "task_id": "ws_B001EWEP40_1991", "instruction": "i am looking for a powder fresh mitchum anti-perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "powder fresh" ] }, "asin": "B001EWEP40" }, { "task_id": "ws_B07G9PNW3X_1992", "instruction": "i need a 64 fl oz sugar free bottle of peach chipotle davinci gourmet cake batter syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "peach chipotle", "64 fl oz (pack of 1)" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07G9PNW3X_1993", "instruction": "i need a 64 fl oz sugar free bottle of peach chipotle davinci gourmet cake batter syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "peach chipotle", "64 fl oz (pack of 1)" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07G9PNW3X_1994", "instruction": "i want sugar free davinci black cherry cake batter syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "black cherry" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07G9PNW3X_1995", "instruction": "i would like a 64 fluid ounce bottle of sugar free pina colada cocktail flavored syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "pina colada cocktail", "64 fl oz (pack of 1)" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07G9PNW3X_1996", "instruction": "i would like a 14.1 ounce of toasted hazelnut syrup that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "toasted hazelnut", "14.1 ounce (pack of 1)" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07G9PNW3X_1997", "instruction": "i need a 3 pound (pack of 1) cane sugar syrup which has natural flavour and is sugar free.", "target_attributes": { "attributes": [ "sugar free", "natural flavors" ], "options": [ "cane sugar", "3 pound (pack of 1)" ] }, "asin": "B07G9PNW3X" }, { "task_id": "ws_B07XCJ6CYY_1998", "instruction": "i need a classic fit and dark heather fish aquarium t-shirt in size 2t for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "dark heather", "men", "2t" ] }, "asin": "B07XCJ6CYY" }, { "task_id": "ws_B07XCJ6CYY_1999", "instruction": "i need a classic fit and dark heather fish aquarium t-shirt in size 2t for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "dark heather", "men", "2t" ] }, "asin": "B07XCJ6CYY" }, { "task_id": "ws_B07DLY278V_2000", "instruction": "i am interested in hand crafted hors d'oeuvres", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B07DLY278V" }, { "task_id": "ws_B07DLY278V_2001", "instruction": "i'm looking for hand-crafted hors d'oeurves.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B07DLY278V" }, { "task_id": "ws_B07DLY278V_2002", "instruction": "i am interested in hand crafted hors d'oeuvres", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B07DLY278V" }, { "task_id": "ws_B08W9KZSCX_2003", "instruction": "i'm looking for extra large high waist leggings that are hand washable and fleece lined.", "target_attributes": { "attributes": [ "fleece lined", "hand wash", "high waist" ], "options": [ "x-large" ] }, "asin": "B08W9KZSCX" }, { "task_id": "ws_B08W9KZSCX_2004", "instruction": "i'm looking for extra large high waist leggings that are hand washable and fleece lined.", "target_attributes": { "attributes": [ "fleece lined", "hand wash", "high waist" ], "options": [ "x-large" ] }, "asin": "B08W9KZSCX" }, { "task_id": "ws_B07DYTDCGD_2005", "instruction": "i need a regular fit machine wash nike gym t-shrit.", "target_attributes": { "attributes": [ "machine wash", "regular fit" ], "options": [ "gym red | white" ] }, "asin": "B07DYTDCGD" }, { "task_id": "ws_B07DYTDCGD_2006", "instruction": "i need a regular fit machine wash nike gym t-shrit.", "target_attributes": { "attributes": [ "machine wash", "regular fit" ], "options": [ "gym red | white" ] }, "asin": "B07DYTDCGD" }, { "task_id": "ws_B07RYRG19Z_2007", "instruction": "i am looking for a medium sized toiletry bag that is denim purple and water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "denim purple", "medium (pack of 1)" ] }, "asin": "B07RYRG19Z" }, { "task_id": "ws_B07RYRG19Z_2008", "instruction": "i am looking for a medium size travel bag that is water resistant and denim grey in color.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "medium (pack of 1)" ] }, "asin": "B07RYRG19Z" }, { "task_id": "ws_B07RYRG19Z_2009", "instruction": "i am looking for a medium sized toiletry bag that is denim purple and water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "denim purple", "medium (pack of 1)" ] }, "asin": "B07RYRG19Z" }, { "task_id": "ws_B07RYRG19Z_2010", "instruction": "i would like a black toiletry bag that is water resistant and a medium size.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "black", "medium" ] }, "asin": "B07RYRG19Z" }, { "task_id": "ws_B00A3IFR5C_2011", "instruction": "i'm interested in some banana hemp cereal that is dairy - and gluten-free.", "target_attributes": { "attributes": [ "non dairy", "gluten free" ], "options": [ "banana hemp" ] }, "asin": "B00A3IFR5C" }, { "task_id": "ws_B00A3IFR5C_2012", "instruction": "i'm interested in some banana hemp cereal that is dairy - and gluten-free.", "target_attributes": { "attributes": [ "non dairy", "gluten free" ], "options": [ "banana hemp" ] }, "asin": "B00A3IFR5C" }, { "task_id": "ws_B08QTR1Y67_2013", "instruction": "i'm looking for a sky blue ring holder for my smartphone, if possible with wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "sky blue" ] }, "asin": "B08QTR1Y67" }, { "task_id": "ws_B08QTR1Y67_2014", "instruction": "i'm looking for a sky blue ring holder for my smartphone, if possible with wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "sky blue" ] }, "asin": "B08QTR1Y67" }, { "task_id": "ws_B07SBX416H_2015", "instruction": "i want a nikon coolpix a1000 compact digital camera with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B07SBX416H" }, { "task_id": "ws_B07SBX416H_2016", "instruction": "i want a nikon coolpix a1000 compact digital camera with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B07SBX416H" }, { "task_id": "ws_B078HYPVTQ_2017", "instruction": "i want to buy some wall sconces with a dark bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "dark bronze" ] }, "asin": "B078HYPVTQ" }, { "task_id": "ws_B078HYPVTQ_2018", "instruction": "i want to buy some wall sconces with a dark bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "dark bronze" ] }, "asin": "B078HYPVTQ" }, { "task_id": "ws_B078HYPVTQ_2019", "instruction": "globe electric wall sconce 65931 williamsburg 1 light, dark bronze, dark wood finish details, easy to install.i need you to find it in color: dark bronze with gold category", "target_attributes": { "attributes": [ "easy install", "wood finish" ], "options": [ "dark bronze with gold" ] }, "asin": "B078HYPVTQ" }, { "task_id": "ws_B09M3NG396_2020", "instruction": "i would like a pair of medium navy blue gym shorts that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy blue", "medium" ] }, "asin": "B09M3NG396" }, { "task_id": "ws_B09M3NG396_2021", "instruction": "i would like a pair of medium navy blue gym shorts that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy blue", "medium" ] }, "asin": "B09M3NG396" }, { "task_id": "ws_B09H6KRM8Q_2022", "instruction": "i'm looking for hair removal with non toxic product and with eco friendly beauty salon", "target_attributes": { "attributes": [ "eco friendly", "non toxic", "hair removal" ], "options": [] }, "asin": "B09H6KRM8Q" }, { "task_id": "ws_B09SQ4CSH5_2023", "instruction": "i'm looking for a bathing suit for plus size women that is quick drying that comes in xx-large and the color black, if possible.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "black", "xx-large" ] }, "asin": "B09SQ4CSH5" }, { "task_id": "ws_B00719X032_2024", "instruction": "i'm looking for a 2-pack of moisture-wicking black and oxford sweatpants in size medium with an elastic waistband.", "target_attributes": { "attributes": [ "moisture wicking", "elastic waistband" ], "options": [ "medium", "2 pack" ] }, "asin": "B00719X032" }, { "task_id": "ws_B09CYH13HB_2025", "instruction": "i want a set of 2 coffee bar stools which has height adjust ability in it.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [] }, "asin": "B09CYH13HB" }, { "task_id": "ws_B01L9JSCR8_2026", "instruction": "i'm interested in certified organic lip scrub to remove dead skin made from natural ingredients and must be cruelty-free.", "target_attributes": { "attributes": [ "cruelty free", "certified organic", "natural ingredients", "dead skin" ], "options": [] }, "asin": "B01L9JSCR8" }, { "task_id": "ws_B072Q7L2FP_2027", "instruction": "i want to buy window drapes for my living room that are machine washable. also, pick size: 108\" x 108\".", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "108\" x 108\"" ] }, "asin": "B072Q7L2FP" }, { "task_id": "ws_B01K5FNMPY_2028", "instruction": "can you please help me to find men's fleece jogger pant of 3x size which has elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "3x" ] }, "asin": "B01K5FNMPY" }, { "task_id": "ws_B01JFYGXAM_2029", "instruction": "i'm looking for easy to use shinning pearl smudging eye shadow stick that's 1.4g. also, choose the reddish pink one.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B01JFYGXAM" }, { "task_id": "ws_B01JFYGXAM_2030", "instruction": "i want a eye shadow stick", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B01JFYGXAM" }, { "task_id": "ws_B09CFY8RMK_2031", "instruction": "i'm looking for hair styling beauty & personal care and it will be easy to use and safe use", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B09CFY8RMK" }, { "task_id": "ws_B096RZ5DXK_2032", "instruction": "i'm looking for a high quality pink or blue denture bath case that is non-toxic.", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [ "blue", "pink" ] }, "asin": "B096RZ5DXK" }, { "task_id": "ws_B09KHH2274_2033", "instruction": "i'm looking for a large men's trench coat classic notched collar that have double breasted wool blend pea coat turn-down collar jacket. also, choose the black one.", "target_attributes": { "attributes": [ "slim fit", "daily wear" ], "options": [ "black", "a-black", "x-large", "large" ] }, "asin": "B09KHH2274" }, { "task_id": "ws_B09CZ939HD_2034", "instruction": "i'm interested in black walking shoes in size 6.5 that features memory foam and good arch support.", "target_attributes": { "attributes": [ "arch support", "memory foam" ], "options": [ "6.5", "black" ] }, "asin": "B09CZ939HD" }, { "task_id": "ws_B07Q1MXLGL_2035", "instruction": "i'm looking for cotton spandex and buying options to include in large size", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "large" ] }, "asin": "B07Q1MXLGL" }, { "task_id": "ws_B09R9YFH84_2036", "instruction": "i am looking for nuccbbly ladies camisole pajamas nightwear lingerie top shorts sleepwear", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "small", "x-large", "purple", "red", "blue" ] }, "asin": "B09R9YFH84" }, { "task_id": "ws_B0797KQ21Y_2037", "instruction": "i am looking for a t-shirt with funny bigfoot yeti asaquatch for fit type: men in the color of slate with large size.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "men", "slate", "large" ] }, "asin": "B0797KQ21Y" }, { "task_id": "ws_B09GRT76VP_2038", "instruction": "i'm interested in knee high socks for teen girls in hot pink or light blue.", "target_attributes": { "attributes": [ "knee high", "teen girls" ], "options": [ "hot pink", "light blue" ] }, "asin": "B09GRT76VP" }, { "task_id": "ws_B09RSSC2D5_2039", "instruction": "i want a short sleeved slim fit casual shirt in white and size large.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "white", "large" ] }, "asin": "B09RSSC2D5" }, { "task_id": "ws_B0119FXTOS_2040", "instruction": "i need a dove bodywash suitable for senstive skin and must be plant based product.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "sensitive skin" ] }, "asin": "B0119FXTOS" }, { "task_id": "ws_B09M8286VM_2041", "instruction": "i trying to find a apple 7 watch screen protector with high defintion.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09M8286VM" }, { "task_id": "ws_B09K7CDLL8_2042", "instruction": "i'm looking for a console table for the living room with a solid wood frame that can double as a storage unit.", "target_attributes": { "attributes": [ "wood frame", "solid wood", "storage unit", "living room" ], "options": [] }, "asin": "B09K7CDLL8" }, { "task_id": "ws_B07KC694D4_2043", "instruction": "i'm looking for strong box spring beds and i take dark gray color with king size beds", "target_attributes": { "attributes": [ "box spring" ], "options": [ "dark gray", "king" ] }, "asin": "B07KC694D4" }, { "task_id": "ws_B09KTNXLPX_2044", "instruction": "i'm looking for home & kitchen furniture with height adjustable in living room", "target_attributes": { "attributes": [ "height adjustable", "living room" ], "options": [] }, "asin": "B09KTNXLPX" }, { "task_id": "ws_B0771L6DB1_2045", "instruction": "i'm working for light fixture of tools & home improvement with color black", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "black" ] }, "asin": "B0771L6DB1" }, { "task_id": "ws_B09CV7BZLX_2046", "instruction": "i'm interested in some low-carb, high protein jerky with zero sugar and no artificial flavors.", "target_attributes": { "attributes": [ "high protein", "low carb", "artificial flavors", "zero sugar" ], "options": [] }, "asin": "B09CV7BZLX" }, { "task_id": "ws_B09F9BRYBW_2047", "instruction": "i'm looking for a green, x-large flannel with button closure that can be machine washed.", "target_attributes": { "attributes": [ "machine wash", "button closure" ], "options": [ "x-large", "green" ] }, "asin": "B09F9BRYBW" }, { "task_id": "ws_B09D7KPP6X_2048", "instruction": "i'd like to purchase a pink or black wig storage bag for hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "black", "pink" ] }, "asin": "B09D7KPP6X" }, { "task_id": "ws_B09QXGQZ7J_2049", "instruction": "i'd like to purchase a red or black short-sleeved jumpsuit in size medium with an elastic closure.", "target_attributes": { "attributes": [ "short sleeve", "elastic closure" ], "options": [ "a black", "a red", "medium" ] }, "asin": "B09QXGQZ7J" }, { "task_id": "ws_B08LKFM7T5_2050", "instruction": "the glitter mascara wands make me look pretty, pink is the one to go with.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "pink" ] }, "asin": "B08LKFM7T5" }, { "task_id": "ws_B09J4VCNY5_2051", "instruction": "i'm looking for a long-lasting living room set made of a wood frame and faux leather with generous lumbar support.", "target_attributes": { "attributes": [ "long lasting", "lumbar support", "faux leather", "wood frame", "living room" ], "options": [] }, "asin": "B09J4VCNY5" }, { "task_id": "ws_B00VQTIZ7O_2052", "instruction": "i want some flouride free toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B00VQTIZ7O" }, { "task_id": "ws_B01K55WVMO_2053", "instruction": "i would like to buy a high speed point and shoot digital camera with a carrying case.", "target_attributes": { "attributes": [ "high speed", "carrying case" ], "options": [] }, "asin": "B01K55WVMO" }, { "task_id": "ws_B07X57RFW3_2054", "instruction": "i would like a officially licensed large black men's t-shirt made of heather cotton.", "target_attributes": { "attributes": [ "officially licensed", "heathers cotton", "cotton heather" ], "options": [ "black", "men", "large" ] }, "asin": "B07X57RFW3" }, { "task_id": "ws_B06XS1WCSN_2055", "instruction": "i'm looking for a 150 foot plug play hdmi cable.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "150ft" ] }, "asin": "B06XS1WCSN" }, { "task_id": "ws_B09B1B1DZ3_2056", "instruction": "i am looking for size 12 sneakers that are black and have a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black mono 1 arano", "12" ] }, "asin": "B09B1B1DZ3" }, { "task_id": "ws_B0176XTVTY_2057", "instruction": "i'm looking for a plant based pancake mix which should be gluten freeand also non gmo with simple ingredients. also, choose pack of 3, 12 ounce almond flour pumpkin flavoured one.", "target_attributes": { "attributes": [ "gluten free", "plant based", "non gmo", "simple ingredients" ], "options": [ "almond flour pumpkin", "12 ounce (pack of 3)" ] }, "asin": "B0176XTVTY" }, { "task_id": "ws_B0176XTVTY_2058", "instruction": "i am looking for a gluten free almond flour pancake mix that has simple ingredients.", "target_attributes": { "attributes": [ "gluten free", "simple ingredients" ], "options": [ "almond flour original" ] }, "asin": "B0176XTVTY" }, { "task_id": "ws_B097NFT33B_2059", "instruction": "i need a black dress with an imported zipper.", "target_attributes": { "attributes": [ "imported zipper" ], "options": [ "black" ] }, "asin": "B097NFT33B" }, { "task_id": "ws_B00ESXQVAI_2060", "instruction": "i want to have ahi tuna jerky -lemon salt flavour made in usa , wild caught and packed in resealable bag.", "target_attributes": { "attributes": [ "wild caught", "resealable bag" ], "options": [ "ahi tuna \u2013 lemon salt" ] }, "asin": "B00ESXQVAI" }, { "task_id": "ws_B00ESXQVAI_2061", "instruction": "i would like to buy a wild caught 1.75 ounce honey glazed ahi tuna in a resealable bag.", "target_attributes": { "attributes": [ "wild caught", "resealable bag" ], "options": [ "ahi tuna \u2013 honey glazed", "1.75 ounce (pack of 1)" ] }, "asin": "B00ESXQVAI" }, { "task_id": "ws_B00ESXQVAI_2062", "instruction": "i'm looking for some wild caught tuna jerky. can you get me the one that comes in a 1.75 ounce pack?", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "1.75 ounce (pack of 1)" ] }, "asin": "B00ESXQVAI" }, { "task_id": "ws_B07P7NH7FP_2063", "instruction": "i am really looking for a coaxial cable that is 3 meters long.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "3m | 10 feet" ] }, "asin": "B07P7NH7FP" }, { "task_id": "ws_B08BYWCYBW_2064", "instruction": "i'd like to find a personalized compact mirror that's easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B08BYWCYBW" }, { "task_id": "ws_B08H279VBZ_2065", "instruction": "i would like to get a heavy duty brown spa stool that looks like it comes right from the beauty salon.", "target_attributes": { "attributes": [ "heavy duty", "beauty salon" ], "options": [ "brown" ] }, "asin": "B08H279VBZ" }, { "task_id": "ws_B01HLEAJJE_2066", "instruction": "i am looking for plant based chocolate chip cookies that have peanut butter and come in a pack of 16.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "peanut butter", "4 ounce (pack of 16)" ] }, "asin": "B01HLEAJJE" }, { "task_id": "ws_B01HLEAJJE_2067", "instruction": "i need snickerdoodle cookies that are plant based and are part of a starter pack", "target_attributes": { "attributes": [ "plant based" ], "options": [ "snickerdoodle", "starter pack" ] }, "asin": "B01HLEAJJE" }, { "task_id": "ws_B01HLEAJJE_2068", "instruction": "i want a non gmo lenny & larry's the complete cookie starter pack.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "complete cookie starter pack" ] }, "asin": "B01HLEAJJE" }, { "task_id": "ws_B00NLLUMOE_2069", "instruction": "i would like a cal king sized with extra deep pockets beige and white striped sheet and pillow case set.", "target_attributes": { "attributes": [ "white item" ], "options": [ "striped \u2013 beige", "extra deep pocket - cal king size" ] }, "asin": "B00NLLUMOE" }, { "task_id": "ws_B00NLLUMOE_2070", "instruction": "i am looking for queen size pillowcases that are in the color persimmon.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "persimmon" ] }, "asin": "B00NLLUMOE" }, { "task_id": "ws_B00NLLUMOE_2071", "instruction": "can you get me a queen sized pillowcase set in lavender?", "target_attributes": { "attributes": [ "queen size" ], "options": [ "lavender" ] }, "asin": "B00NLLUMOE" }, { "task_id": "ws_B00NLLUMOE_2072", "instruction": "i am looking for a bed sheet for a queen size bed. also choose laced sky blue color.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "laced sky blue" ] }, "asin": "B00NLLUMOE" }, { "task_id": "ws_B08RDH5JZ3_2073", "instruction": "i need a printed backdrop for digital photography that is 3 by 5 feet.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 15", "3x5 ft" ] }, "asin": "B08RDH5JZ3" }, { "task_id": "ws_B08RDH5JZ3_2074", "instruction": "i am looking for a printed backdrop 07 colored lightweight backgrounds for digital photography. also, choose a 5x7 ft size.", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "printed backdrop 07", "5x7 ft" ] }, "asin": "B08RDH5JZ3" }, { "task_id": "ws_B08RDH5JZ3_2075", "instruction": "i'm looking for vinyl digital photography with more art work.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 01" ] }, "asin": "B08RDH5JZ3" }, { "task_id": "ws_B01HSFN3QM_2076", "instruction": "i am looking for some dining room barstools that are gray vinyl and have a gold base.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "gray vinyl", "gold base" ] }, "asin": "B01HSFN3QM" }, { "task_id": "ws_B083BL6W3V_2077", "instruction": "i am looking for a double sided home office desk.", "target_attributes": { "attributes": [ "double sided" ], "options": [] }, "asin": "B083BL6W3V" }, { "task_id": "ws_B0953JW5CQ_2078", "instruction": "i would like to buy a x-large purple cardigan that i can hand wash in the sink.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "purple", "x-large" ] }, "asin": "B0953JW5CQ" }, { "task_id": "ws_B08SQHTMPR_2079", "instruction": "i am looking for a kahuna colored capri pant that has a relaxed fit and is in a size 20 plus.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "kahuna", "20 plus" ] }, "asin": "B08SQHTMPR" }, { "task_id": "ws_B01N1IZEXC_2080", "instruction": "i want some relaxed jeans that are a comfortable fit in a size 46w by 34l and are in the color victoria", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "victoria", "relaxed", "46w x 34l" ] }, "asin": "B01N1IZEXC" }, { "task_id": "ws_B09B2SJZZF_2081", "instruction": "i would like super soft throw pillows in the color frydek alocasia obsidian.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "frydek alocasia obsidian" ] }, "asin": "B09B2SJZZF" }, { "task_id": "ws_B07DZ3PKYT_2082", "instruction": "i would like a 3 pack of classic long lasting soap that's cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "classics", "5.8 ounce (pack of 3)" ] }, "asin": "B07DZ3PKYT" }, { "task_id": "ws_B09RSFNQL6_2083", "instruction": "i am looking for some light weight boxers that are multicolored and in a large size", "target_attributes": { "attributes": [ "light weight" ], "options": [ "b multicolor", "large" ] }, "asin": "B09RSFNQL6" }, { "task_id": "ws_B09PV6XG98_2084", "instruction": "i need cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09PV6XG98" }, { "task_id": "ws_B07ZHMJDG8_2085", "instruction": "i would like to buy a travel size cicaronic variety pack that comes with nourishing hyaluronic acid.", "target_attributes": { "attributes": [ "travel size", "hyaluronic acid" ], "options": [ "cicaronic variety pack", "vitaronic (nourishing)" ] }, "asin": "B07ZHMJDG8" }, { "task_id": "ws_B07ZHMJDG8_2086", "instruction": "i am looking for cream hyaluronic acid in peptaronic cream", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "peptaronic cream" ] }, "asin": "B07ZHMJDG8" }, { "task_id": "ws_B078XRDP54_2087", "instruction": "i'm looking for a medium sized loose fit tank top. also, look for tie dye navy one", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "tie dye navy", "medium" ] }, "asin": "B078XRDP54" }, { "task_id": "ws_B098K1NFFM_2088", "instruction": "i am looking for a grey box spring bed that is a twin size.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "grey", "twin" ] }, "asin": "B098K1NFFM" }, { "task_id": "ws_B09MTTT87L_2089", "instruction": "i am looking for a christmas top that is long sleeved and is a size small.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "snk-xmas tops a151-pink", "small" ] }, "asin": "B09MTTT87L" }, { "task_id": "ws_B09SF1XHMM_2090", "instruction": "i'm looking for black closed toe women's sandals.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "a3 - black" ] }, "asin": "B09SF1XHMM" }, { "task_id": "ws_B09SF1XHMM_2091", "instruction": "i need some black ankle strap flats that are in a size 9 wide.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "a11 - black", "9 wide" ] }, "asin": "B09SF1XHMM" }, { "task_id": "ws_B095BNV8FY_2092", "instruction": "i am looking for living room throws that are a rose color and are in 50\" by 60\".", "target_attributes": { "attributes": [ "living room" ], "options": [ "rose2", "50\"x60\"" ] }, "asin": "B095BNV8FY" }, { "task_id": "ws_B07GDS8XRQ_2093", "instruction": "i would like an oil free foundation in the shade 175 natural ochre that is one ounce.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "175 natural ochre", "1.0 fluid ounce" ] }, "asin": "B07GDS8XRQ" }, { "task_id": "ws_B07GDS8XRQ_2094", "instruction": "i want to get to get long lasting foundation that is in color 380 rich ginger.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "380 rich ginger" ] }, "asin": "B07GDS8XRQ" }, { "task_id": "ws_B07GDS8XRQ_2095", "instruction": "i need shell colored and oil free revlon colorstay liquid foundation makeup.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "285 shell" ] }, "asin": "B07GDS8XRQ" }, { "task_id": "ws_B0127XRALY_2096", "instruction": "i would like some bath salts that are for sensitive skin and that are eucalyptus.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "eucalyptus" ] }, "asin": "B0127XRALY" }, { "task_id": "ws_B07XZ8MDQ5_2097", "instruction": "i would like a loose fit tunic that is lavender in the size 6x.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "lavender", "6x" ] }, "asin": "B07XZ8MDQ5" }, { "task_id": "ws_B081376463_2098", "instruction": "i need glitter cupcake picks in rose gold for my daughter's birthday party.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "rose gold" ] }, "asin": "B081376463" }, { "task_id": "ws_B082KWFV79_2099", "instruction": "i need a high quality skin care tool.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B082KWFV79" }, { "task_id": "ws_B0794RJW4K_2100", "instruction": "i'm looking for a certified refurbished hd 8 tablet with quad core processor. also, choose 32 gb storage capacity, yellow colored one with 1 year of amazon kids+ subscription.", "target_attributes": { "attributes": [ "certified refurbished", "quad core" ], "options": [ "yellow", "32 gb" ] }, "asin": "B0794RJW4K" }, { "task_id": "ws_B09NTKVL5J_2101", "instruction": "i would like a b-pink bomber jacket that has a relaxed fit and is a size small.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "b-pink", "small" ] }, "asin": "B09NTKVL5J" }, { "task_id": "ws_B09D8RX28J_2102", "instruction": "i'm looking for a long lasting silver laptop.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "silver" ] }, "asin": "B09D8RX28J" }, { "task_id": "ws_B07D5ZJFQV_2103", "instruction": "i am looking for gluten free popcorn in an 8 pack that is a savory variety pack", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "savory variety pack", "0.9 ounce (pack of 8)" ] }, "asin": "B07D5ZJFQV" }, { "task_id": "ws_B09M8L7G7V_2104", "instruction": "i would like to get a four drawer linen night stand with a lot of storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "linen", "4 teir (4-drawer)" ] }, "asin": "B09M8L7G7V" }, { "task_id": "ws_B074NMGP2P_2105", "instruction": "i would like to buy a blu ray ac adapter.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B074NMGP2P" }, { "task_id": "ws_B074NMGP2P_2106", "instruction": "i'm looking for ac adapter with blu ray and has output protection.", "target_attributes": { "attributes": [ "output protection", "blu ray" ], "options": [] }, "asin": "B074NMGP2P" }, { "task_id": "ws_B074NMGP2P_2107", "instruction": "i am interested in ac adapters with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B074NMGP2P" }, { "task_id": "ws_B09C5HBXNS_2108", "instruction": "i need a living room end table that is 20.91 by 24 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "20x9.1x24 inch" ] }, "asin": "B09C5HBXNS" }, { "task_id": "ws_B00IS5V1SE_2109", "instruction": "i'm looking for 8.12 fluid ounces of sulfate-free shampoo that helps prevent hair loss.", "target_attributes": { "attributes": [ "sulfate free", "hair loss" ], "options": [ "8.12 fl oz (pack of 1)" ] }, "asin": "B00IS5V1SE" }, { "task_id": "ws_B074K2BYWX_2110", "instruction": "i am looking for some hair pins that are rose gold.", "target_attributes": { "attributes": [ "rose gold" ], "options": [] }, "asin": "B074K2BYWX" }, { "task_id": "ws_B09Q2TDFWV_2111", "instruction": "i am looking for a blue and green bluetooth wireless ps3 controller with a charger cable.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "blue+green" ] }, "asin": "B09Q2TDFWV" }, { "task_id": "ws_B0722SK15V_2112", "instruction": "i would like a 18 x24 nero black mirror that can be mounted on my bathroom wall.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "nero black", "glass size 18x24" ] }, "asin": "B0722SK15V" }, { "task_id": "ws_B09CQ1X43J_2113", "instruction": "i want to find an led light strip that also features a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B09CQ1X43J" }, { "task_id": "ws_B07CRKFF9C_2114", "instruction": "i would like to get some portable bluetooth speakers with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B07CRKFF9C" }, { "task_id": "ws_B0823W298C_2115", "instruction": "i am looking for a bookcase that is made of engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [] }, "asin": "B0823W298C" }, { "task_id": "ws_B008KM9BW8_2116", "instruction": "i want to buy a hair brush for dry hair that is small size.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "small (pack of 1)" ] }, "asin": "B008KM9BW8" }, { "task_id": "ws_B09MZQV3QB_2117", "instruction": "i'm trying to find a 30-count package of strawberry beet snack bars that my toddler would love. the bars must be nut and dairy free.", "target_attributes": { "attributes": [ "nut free", "dairy free" ], "options": [ "strawberry beet", "30 count" ] }, "asin": "B09MZQV3QB" }, { "task_id": "ws_B07Z5H7CYX_2118", "instruction": "i would like to buy to some fat free non gmo original beef jerky.", "target_attributes": { "attributes": [ "non gmo", "fat free" ], "options": [ "beef - original" ] }, "asin": "B07Z5H7CYX" }, { "task_id": "ws_B07Z5H7CYX_2119", "instruction": "i would like a bag of original beef jerky that is non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "beef - original" ] }, "asin": "B07Z5H7CYX" }, { "task_id": "ws_B09PTZYPDZ_2120", "instruction": "i would like to buy a a34 colored 9x6 foot photo background that's light weight to move.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a34", "9x6ft | 2.7x1.8m" ] }, "asin": "B09PTZYPDZ" }, { "task_id": "ws_B08VF32TK7_2121", "instruction": "i would like to buy three chairs for my dining room that i can assemble at home.", "target_attributes": { "attributes": [ "assembly required", "dining room" ], "options": [ "3" ] }, "asin": "B08VF32TK7" }, { "task_id": "ws_B08QFZ7L6X_2122", "instruction": "i would like to buy a bronze table lamp for my living room.", "target_attributes": { "attributes": [ "bronze finish", "living room" ], "options": [] }, "asin": "B08QFZ7L6X" }, { "task_id": "ws_B08VJ2JV5S_2123", "instruction": "i need teeth whitening strips that are a size 1.2 by 1.5 mm.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "size1.2-1.5mm" ] }, "asin": "B08VJ2JV5S" }, { "task_id": "ws_B0839MQ8Y8_2124", "instruction": "i need a quad core white tablet that has 64gb of storage.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "white", "64 gb" ] }, "asin": "B0839MQ8Y8" }, { "task_id": "ws_B07VS7S6NN_2125", "instruction": "i need anti slip sneakers that are leopard in a size 7.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "leopard", "7" ] }, "asin": "B07VS7S6NN" }, { "task_id": "ws_B099J3NKC3_2126", "instruction": "i'm looking for some hair cutting shears.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "6\" thinning" ] }, "asin": "B099J3NKC3" }, { "task_id": "ws_B07QH7TX43_2127", "instruction": "i am looking for dried strawberries and pineapple that are organic", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "strawberries + pineapple" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2128", "instruction": "i want to buy some dried strawberries with corn. get the twelve pack bundle of 1.2 ounce bags. make sure it's low calorie, usda organic, and non-gmo.", "target_attributes": { "attributes": [ "non gmo", "usda organic", "low calorie" ], "options": [ "strawberries + corn", "1.2 ounce (pack of 12)", "bundle" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2129", "instruction": "i want some dried bananas and strawberries. make sure they're usda organic.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "bananas and strawberries" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2130", "instruction": "i want low calories usda organic", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "mangoes" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2131", "instruction": "i would like a bundle of 1.2 ounce bag of usda organic pomegranate arils.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "pomegranate arils", "1.2 ounce (pack of 12)", "bundle" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2132", "instruction": "i want a bundle of non gmo natierra organic dried mango cheeks.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "bundle" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B07QH7TX43_2133", "instruction": "look for this snack natierra organic dried strawberries + pomegranate arils, low calorie if is possible.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "strawberries + pomegranate arils" ] }, "asin": "B07QH7TX43" }, { "task_id": "ws_B08V8VJF6L_2134", "instruction": "i would like to get a 8 + 256 gig quad core desktop mini computer.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "j4125 | 8gb+256gb" ] }, "asin": "B08V8VJF6L" }, { "task_id": "ws_B08V8VJF6L_2135", "instruction": "i am looking for dual band desktops in size j4125", "target_attributes": { "attributes": [ "dual band" ], "options": [ "j4125 | 8gb+256gb" ] }, "asin": "B08V8VJF6L" }, { "task_id": "ws_B074SQXBPW_2136", "instruction": "i would like to get a 25.36 ounce passion fruit syrup made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "passion fruit", "25.36 fl oz (pack of 1)" ] }, "asin": "B074SQXBPW" }, { "task_id": "ws_B074SQXBPW_2137", "instruction": "i would like a 25.4 fluid ounce bottle of hot butter rum syrup made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "hot buttered rum", "25.4 fl oz (pack of 1)" ] }, "asin": "B074SQXBPW" }, { "task_id": "ws_B074SQXBPW_2138", "instruction": "i need a 25.4 fl oz paradise blend flavor syrup that has natural ingredients", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "paradise blend", "25.4 fl oz (pack of 1)" ] }, "asin": "B074SQXBPW" }, { "task_id": "ws_B07NNWGJMY_2139", "instruction": "i'm looking for a wood frame dining chair with solid wood legs.", "target_attributes": { "attributes": [ "wood frame", "solid wood" ], "options": [ "dining side chair" ] }, "asin": "B07NNWGJMY" }, { "task_id": "ws_B00IAYFD0K_2140", "instruction": "i'm looking for a high speed compact card for the usb reader.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "cfexpress + usb reader" ] }, "asin": "B00IAYFD0K" }, { "task_id": "ws_B09S9Z9CNN_2141", "instruction": "i need a nail drill for dead skin that comes in a size c.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "nail drill bits set 2", "c" ] }, "asin": "B09S9Z9CNN" }, { "task_id": "ws_B093FZ2SGF_2142", "instruction": "i am looking for some ready to eat jerky that is very hot and comes in a ten pack.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "new thick & juicy extremely hot beef jerky", "10 pack" ] }, "asin": "B093FZ2SGF" }, { "task_id": "ws_B093FZ2SGF_2143", "instruction": "i would like a pack of spicy sriracha bacon jerky that is ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "spicy sriracha bacon jerky", "1 pack" ] }, "asin": "B093FZ2SGF" }, { "task_id": "ws_B09QFJY8N1_2144", "instruction": "i'd like a stainless steel piercing kit.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09QFJY8N1" }, { "task_id": "ws_B07RLVXV5B_2145", "instruction": "i am looking for a headphones case that is apple compatible and is navy blue colored.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "a-navy blue" ] }, "asin": "B07RLVXV5B" }, { "task_id": "ws_B075TGSSSS_2146", "instruction": "i am looking for a pack of six one ounce vegetable crisps that are plant based and cheddar flavor.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "cheddar cheese", "1 ounce (pack of 6)" ] }, "asin": "B075TGSSSS" }, { "task_id": "ws_B094N33C2S_2147", "instruction": "i want to buy cupcake toppers that are for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B094N33C2S" }, { "task_id": "ws_B08597FCCC_2148", "instruction": "i would like to buy a heavy duty gray carrying case for my x box controller.", "target_attributes": { "attributes": [ "heavy duty", "carrying case" ], "options": [ "grey" ] }, "asin": "B08597FCCC" }, { "task_id": "ws_B09Q23Z72W_2149", "instruction": "i'm looking for a mid century coffee table for my living room.", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [] }, "asin": "B09Q23Z72W" }, { "task_id": "ws_B083J8SQD2_2150", "instruction": "i'm looking for a burgundy colored small men's tank top with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "burgundy", "small" ] }, "asin": "B083J8SQD2" }, { "task_id": "ws_B071Y1WJK5_2151", "instruction": "i would like to have two of a fine mist long lasting beauty case.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "fine mist", "pack of 2" ] }, "asin": "B071Y1WJK5" }, { "task_id": "ws_B096P4161Q_2152", "instruction": "i need a fast charging 10 foot charger for my car that is in the color tarnish.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "tarnish", "10foot" ] }, "asin": "B096P4161Q" }, { "task_id": "ws_B08ZMH7PM3_2153", "instruction": "i need a freezed dried meal kit that is veggie chili.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "f.d.z #14 veggie chili" ] }, "asin": "B08ZMH7PM3" }, { "task_id": "ws_B001A7IJA0_2154", "instruction": "i want to get some straight leg jeans in 36 waist and 32 length. the color needs to be medium stone washed with an art deco stitch back pocket embroidery.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "medium stone wash with art deco stitch back pocket embroidery", "36w x 32l" ] }, "asin": "B001A7IJA0" }, { "task_id": "ws_B001A7IJA0_2155", "instruction": "i am looking for a straight leg jean. i prefer it to be blue.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "blue" ] }, "asin": "B001A7IJA0" }, { "task_id": "ws_B09NMFCSV8_2156", "instruction": "i need a tempered glass window film two pack in the color 91768059675860000 and 23.6 in by 23.6 in", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "917680596758560000", "(width\uff0923.6in x (length)23.6in x 2pcs" ] }, "asin": "B09NMFCSV8" }, { "task_id": "ws_B096KGGKQ5_2157", "instruction": "i am looking for a case for my smartwatch that is tempered glass and pink rose gold in a 41 mm size.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "pinkroseglod | redroseglod", "41mm" ] }, "asin": "B096KGGKQ5" }, { "task_id": "ws_B00CA6X50Y_2158", "instruction": "i'm looking for a straight leg men's jeans made of cotton spandex material with button closure. also choose big and tall, 443 * 32l with shooting star one.", "target_attributes": { "attributes": [ "straight leg", "button closure", "cotton spandex" ], "options": [ "shooting star", "big & tall", "44w x 32l" ] }, "asin": "B00CA6X50Y" }, { "task_id": "ws_B07CCHTLJD_2159", "instruction": "i am looking for a variety pack of dairy free granola bars that are 48 in count.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "variety pack", "48 count (pack of 1)" ] }, "asin": "B07CCHTLJD" }, { "task_id": "ws_B07TB2PQP8_2160", "instruction": "i am looking for a background for photography that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B07TB2PQP8" }, { "task_id": "ws_B08XM81S7M_2161", "instruction": "i want to find a 2-pack of achar recipe seasoning mix that's easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "achar recipe", "pack of 2" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2162", "instruction": "i am interested in a kashmiri indian seasoning that is easy to prepare and only 2.1 ounces.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "kashmiri rogan josh", "2.1 ounce (pack of 4)" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2163", "instruction": "i am looking for a 3.5 ounce hot and spicy pickle seasoning mix that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "3.5 ounce" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2164", "instruction": "i want 100g shan achar easy prepare paya flavor spice powder", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "paya" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2165", "instruction": "i am looking for spice powder of liver curry flavor that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "liver curry" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2166", "instruction": "i need traditional ready to use pickle . and i choose a pack of 6", "target_attributes": { "attributes": [ "easy use" ], "options": [ "1.75 ounce (pack of 6)" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2167", "instruction": "find an easy to prepare chicken masala seasoning.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken masala" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2168", "instruction": "look for a four pack of white karahi spice mix that's easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "chicken white karahi", "pack of 4" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B08XM81S7M_2169", "instruction": "i need an easy to prepare stew mix that comes in a six pack.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "stew | dopiaza", "3.52 ounce (pack of 6)" ] }, "asin": "B08XM81S7M" }, { "task_id": "ws_B09ND1WX3G_2170", "instruction": "i would like to buy size 8.5 grey faux fur loafers.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "grey", "8.5" ] }, "asin": "B09ND1WX3G" }, { "task_id": "ws_B09QPXLJ31_2171", "instruction": "i would like a 60x40x43cm solid wood ottoman for my living room.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "60x40x43cm" ] }, "asin": "B09QPXLJ31" }, { "task_id": "ws_B083YZ99PM_2172", "instruction": "i need blue golf shoes made of vinyl that are in a size 8.5 wide.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "navy", "8.5 wide" ] }, "asin": "B083YZ99PM" }, { "task_id": "ws_B089GYNB54_2173", "instruction": "i would like a large grey shorts made of cotton spandex for working out.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "066 gray", "large" ] }, "asin": "B089GYNB54" }, { "task_id": "ws_B077D5N474_2174", "instruction": "i'm looking for fur lined vinyl slippers.", "target_attributes": { "attributes": [ "ethylene vinyl", "vinyl acetate", "faux fur" ], "options": [ "9.5 women | 8 men" ] }, "asin": "B077D5N474" }, { "task_id": "ws_B07P5C5GTS_2175", "instruction": "i need a polyester cotton polo shirt in size 6x-large. find me a blue one with a gray stripe.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "12129# blue (with gray stripe)", "6x-large" ] }, "asin": "B07P5C5GTS" }, { "task_id": "ws_B08SW27HGH_2176", "instruction": "i am looking for a silver tablet that is lightweight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "silver" ] }, "asin": "B08SW27HGH" }, { "task_id": "ws_B08LF3LZCH_2177", "instruction": "i would like to buy some wild caught sardines.", "target_attributes": { "attributes": [ "wild caught" ], "options": [] }, "asin": "B08LF3LZCH" }, { "task_id": "ws_B08LF3LZCH_2178", "instruction": "i want sugar free gluten free seafood sardines wild caught", "target_attributes": { "attributes": [ "wild caught", "sugar free", "gluten free" ], "options": [] }, "asin": "B08LF3LZCH" }, { "task_id": "ws_B099HSFGQP_2179", "instruction": "find me a white bookshelf that requires assembly.", "target_attributes": { "attributes": [ "assembly required", "white finish" ], "options": [] }, "asin": "B099HSFGQP" }, { "task_id": "ws_B08QHT5RMH_2180", "instruction": "i need some power dental flossers that are for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [] }, "asin": "B08QHT5RMH" }, { "task_id": "ws_B07CTRSKXB_2181", "instruction": "i want a rich protein bar.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B07CTRSKXB" }, { "task_id": "ws_B088GVPJBB_2182", "instruction": "i want to buy some pink wireless bluetooth speakers that can switch between pairing and aux by the call button.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "pink-switch between \"bluetooth pairing\"&\"aux-in\" mode by \"call\" button" ] }, "asin": "B088GVPJBB" }, { "task_id": "ws_B09BJR3LQ2_2183", "instruction": "i want to find a 4-pack of energy drinks that are gluten free and have no artificial colors.", "target_attributes": { "attributes": [ "gluten free", "artificial colors" ], "options": [ "pack of 4" ] }, "asin": "B09BJR3LQ2" }, { "task_id": "ws_B09BJR3LQ2_2184", "instruction": "i am looking for a pack of 4 energy drinks with vitamins, that is also gluten free", "target_attributes": { "attributes": [ "gluten free", "source vitamin" ], "options": [ "pack of 4" ] }, "asin": "B09BJR3LQ2" }, { "task_id": "ws_B00DQ2B8UA_2185", "instruction": "i would like to see over the ear headphones with batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B00DQ2B8UA" }, { "task_id": "ws_B0183RU25O_2186", "instruction": "i want an easy to use instant beverage mix in hazelnut flavor, just one pound.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "hazelnut", "1 pound (pack of 6)" ] }, "asin": "B0183RU25O" }, { "task_id": "ws_B0183RU25O_2187", "instruction": "i looking easy use rich creamy instant coffee double mocha flavor ,14 ounce", "target_attributes": { "attributes": [ "rich creamy", "easy use" ], "options": [ "double mocha", "14 ounce (pack of 1)" ] }, "asin": "B0183RU25O" }, { "task_id": "ws_B078FBVJ7H_2188", "instruction": "i would like to get some women's size 13 vinyl acetate clogs with blossoms.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "blossom", "13 b(m) us women | 11 d(m) us men" ] }, "asin": "B078FBVJ7H" }, { "task_id": "ws_B078FBVJ7H_2189", "instruction": "i would like a pair of pomegranate women's size 4 clogs made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "pomegranate", "4 women | 2 men" ] }, "asin": "B078FBVJ7H" }, { "task_id": "ws_B08731VV8F_2190", "instruction": "i would like to buy a heather slate pebble weave loveseat with a solid wood frame.", "target_attributes": { "attributes": [ "solid wood", "wood frame" ], "options": [ "heathered slate pebble weave", "loveseat" ] }, "asin": "B08731VV8F" }, { "task_id": "ws_B0977H69D1_2191", "instruction": "i want a variety pack of jerkey ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "variety pack" ] }, "asin": "B0977H69D1" }, { "task_id": "ws_B0977H69D1_2192", "instruction": "i am looking for a 3.25 ounce (pack of 3) of protein serving jerky", "target_attributes": { "attributes": [ "protein serving" ], "options": [ "3.25 ounce (pack of 3)" ] }, "asin": "B0977H69D1" }, { "task_id": "ws_B09R4FW2HP_2193", "instruction": "i would like to get some extra large light blue high waisted jeans with a loose fit.", "target_attributes": { "attributes": [ "loose fit", "high waist" ], "options": [ "a2-light blue", "x-large" ] }, "asin": "B09R4FW2HP" }, { "task_id": "ws_B00I5ELBA6_2194", "instruction": "i would like to buy a black glider and ottoman set that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "black | light gray" ] }, "asin": "B00I5ELBA6" }, { "task_id": "ws_B01MYDIBAC_2195", "instruction": "buy as many kay's chips as possible when of the ones with french vanilla flavors drops the price drops", "target_attributes": { "attributes": [ "low fat", "natural flavors" ], "options": [ "french vanilla", "9.5 ounces (pack of 6)" ] }, "asin": "B01MYDIBAC" }, { "task_id": "ws_B01MYDIBAC_2196", "instruction": "i am looking for a 1.2 ounce (pack of 6) gluten-free, low fat chips & crisps", "target_attributes": { "attributes": [ "gluten free", "low fat" ], "options": [ "1.2 ounce (pack of 6)" ] }, "asin": "B01MYDIBAC" }, { "task_id": "ws_B08R7PRV85_2197", "instruction": "i need a leak proof bag that is black.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "black" ] }, "asin": "B08R7PRV85" }, { "task_id": "ws_B005CGOMZQ_2198", "instruction": "i am looking for some flats with memory foam in a size nine and the color picante.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "picante", "9" ] }, "asin": "B005CGOMZQ" }, { "task_id": "ws_B01M1VI9W8_2199", "instruction": "i would like to buy some size 16 rubber sole work shoes.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "16" ] }, "asin": "B01M1VI9W8" }, { "task_id": "ws_B07NVB9ZC4_2200", "instruction": "i would like to get some l5036 nail tips that are easy to put on.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "l5036" ] }, "asin": "B07NVB9ZC4" }, { "task_id": "ws_B01APTZH1W_2201", "instruction": "i would like to get a paraben free oil moisturizer.", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B01APTZH1W" }, { "task_id": "ws_B07Z9VGZMH_2202", "instruction": "i would like to get some orange wireless bluetooth speakers.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "orange" ] }, "asin": "B07Z9VGZMH" }, { "task_id": "ws_B09DSXCB6D_2203", "instruction": "i would like to buy a size 42 white smartwatch band that works with my apple watch.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "white | black | navy bule", "42 | 44mm s | m" ] }, "asin": "B09DSXCB6D" }, { "task_id": "ws_B09DSXCB6D_2204", "instruction": "i need an apple compatible smart watch band in blue, green, and red.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "bule | green | red" ] }, "asin": "B09DSXCB6D" }, { "task_id": "ws_B08JTLCT5C_2205", "instruction": "i want to find a blue home office chair that's easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "a-type blue" ] }, "asin": "B08JTLCT5C" }, { "task_id": "ws_B092PRRNXL_2206", "instruction": "i would like to buy a four pack of medium machine washable boxer briefs.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "4-pack(n1168)02", "medium" ] }, "asin": "B092PRRNXL" }, { "task_id": "ws_B09PZ4VF7K_2207", "instruction": "i would like a toothbrush that works well with sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09PZ4VF7K" }, { "task_id": "ws_B08GYF3H6N_2208", "instruction": "i need an old fashioned rope sausage without gluten.", "target_attributes": { "attributes": [ "old fashioned", "gluten free" ], "options": [ "old world style" ] }, "asin": "B08GYF3H6N" }, { "task_id": "ws_B08GYF3H6N_2209", "instruction": "i want keto friendly old world kielbasa rope sausage.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "old world style" ] }, "asin": "B08GYF3H6N" }, { "task_id": "ws_B07P67D59M_2210", "instruction": "i'm looking for some non-gmo pistachios.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B07P67D59M" }, { "task_id": "ws_B09SGZ536L_2211", "instruction": "i would like a slim fit khaki tank top that is in a size medium.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "khaki", "medium" ] }, "asin": "B09SGZ536L" }, { "task_id": "ws_B07QG5DKTF_2212", "instruction": "i would like to get some 29 x 12 galatic machine washable denim shorts.", "target_attributes": { "attributes": [ "machine washable", "machine wash" ], "options": [ "galactic", "29w x 12l" ] }, "asin": "B07QG5DKTF" }, { "task_id": "ws_B0948XCDCJ_2213", "instruction": "i would like to get some medium grey shorts that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "4# gray", "medium" ] }, "asin": "B0948XCDCJ" }, { "task_id": "ws_B08W3HQNKF_2214", "instruction": "i'm looking for a blue hair brush for removing hair danfruss..", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "blue" ] }, "asin": "B08W3HQNKF" }, { "task_id": "ws_B09Q57MYVF_2215", "instruction": "i would like to buy a high gloss walnut entertainment center for a 51 inch tv that has a lot of storage space.", "target_attributes": { "attributes": [ "high gloss", "storage space" ], "options": [ "walnet,black", "51inch" ] }, "asin": "B09Q57MYVF" }, { "task_id": "ws_B00ODEW87C_2216", "instruction": "i am looking for icelandic yogurt that is rich and creamy.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [] }, "asin": "B00ODEW87C" }, { "task_id": "ws_B08BNGNKW7_2217", "instruction": "i would like a 5 shelf oak bookcase and mount for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "oak | black", "bookcase + mount", "5-shelf" ] }, "asin": "B08BNGNKW7" }, { "task_id": "ws_B08BNGNKW7_2218", "instruction": "nathan james theo 3 shelf white bookcase, open wall industrial shelving unit, engineered wood for my living room, find it at a discounted price", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "3-shelf" ] }, "asin": "B08BNGNKW7" }, { "task_id": "ws_B0817MVS98_2219", "instruction": "i need puffed snacks that are grain free in a spicy salsa flavor and come in a 24 pack.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "spicy salsa", "1.5 ounce (pack of 24)" ] }, "asin": "B0817MVS98" }, { "task_id": "ws_B099KWKY36_2220", "instruction": "i would like a citrus yao conditioner made with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "conditioner", "citrus yao" ] }, "asin": "B099KWKY36" }, { "task_id": "ws_B09RG13J2N_2221", "instruction": "i would like to buy 2 pounds of milk chocolate hershey's with almonds for valentine's day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "hershey's milk chocolate with almonds", "2 pound" ] }, "asin": "B09RG13J2N" }, { "task_id": "ws_B09RG13J2N_2222", "instruction": "i want 5 pound valentine day special kosher certified hershey's special dark chocolate", "target_attributes": { "attributes": [ "kosher certified", "valentine day" ], "options": [ "5 pound" ] }, "asin": "B09RG13J2N" }, { "task_id": "ws_B07QC8LFQP_2223", "instruction": "i would like some teeth whitening strips that are a grape flavor.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "grape" ] }, "asin": "B07QC8LFQP" }, { "task_id": "ws_B073TYNJG4_2224", "instruction": "i am looking for a vinyl home office chair that has lumbar support and has a mesh back with synchro-tilt.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "mesh back | vinyl", "sychro-tilt w | seat slider" ] }, "asin": "B073TYNJG4" }, { "task_id": "ws_B07GRQCRJG_2225", "instruction": "i am looking for a grey faux leather sofa.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "grey", "sofa" ] }, "asin": "B07GRQCRJG" }, { "task_id": "ws_B09KRCZLXP_2226", "instruction": "i want to find a set of two vanity lights with glass shades.", "target_attributes": { "attributes": [ "vanity light", "glass shade" ], "options": [ "2 light" ] }, "asin": "B09KRCZLXP" }, { "task_id": "ws_B08RCVK9NF_2227", "instruction": "i want to see the non-alcoholic drink options that are made of natural ingredients.", "target_attributes": { "attributes": [ "non alcoholic", "natural ingredients" ], "options": [] }, "asin": "B08RCVK9NF" }, { "task_id": "ws_B08RCVK9NF_2228", "instruction": "i am looking for natural ingredients brewing", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B08RCVK9NF" }, { "task_id": "ws_B08TLKFL5B_2229", "instruction": "i need a baby throw that is multicolored and super soft.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 44", "baby" ] }, "asin": "B08TLKFL5B" }, { "task_id": "ws_B0828Q5FJR_2230", "instruction": "i'm looking for a wood framed mounted shark.", "target_attributes": { "attributes": [ "ready hang", "wood frame" ], "options": [ "shark" ] }, "asin": "B0828Q5FJR" }, { "task_id": "ws_B07QH2YM12_2231", "instruction": "i need an argan oil moisturizer that is 8 ounces and is the scent desert date.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "desert date", "8 ounce (pack of 1)" ] }, "asin": "B07QH2YM12" }, { "task_id": "ws_B07QH2YM12_2232", "instruction": "i'm looking for all natural and organic moringa oil with anti aging vitamin a and e, 4 ounce", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "moringa", "4 ounce" ] }, "asin": "B07QH2YM12" }, { "task_id": "ws_B07QH2YM12_2233", "instruction": "i would like a 2 fluid ounce bottle of tamanu argan oil for damaged hair.", "target_attributes": { "attributes": [ "argan oil", "damaged hair" ], "options": [ "tamanu", "2 fl oz (pack of 1)" ] }, "asin": "B07QH2YM12" }, { "task_id": "ws_B09PVCWL4W_2234", "instruction": "i would like a 100 inch 16:9 protection screen that's easy to put on.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "100 inch 16:9" ] }, "asin": "B09PVCWL4W" }, { "task_id": "ws_B07FXR9NMK_2235", "instruction": "i need some gluten free nori.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07FXR9NMK" }, { "task_id": "ws_B075BL7XR4_2236", "instruction": "i would like to buy some unsweetened hazelnut dairy and gluten free milk.", "target_attributes": { "attributes": [ "dairy free", "gluten free" ], "options": [ "unsweetened hazelnut - original" ] }, "asin": "B075BL7XR4" }, { "task_id": "ws_B09CMHXWWM_2237", "instruction": "i need a black brush set for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "black" ] }, "asin": "B09CMHXWWM" }, { "task_id": "ws_B095WZDZN8_2238", "instruction": "i would like to get a heavy duty office desk with a coated steel frame.", "target_attributes": { "attributes": [ "heavy duty", "coated steel", "steel frame" ], "options": [] }, "asin": "B095WZDZN8" }, { "task_id": "ws_B0968TLTS8_2239", "instruction": "i'm looking for a 10-pack of pepperoni and cheese pizzas that contain 0 grams of trans fat.", "target_attributes": { "attributes": [ "0g trans" ], "options": [ "pepperoni & cheese", "10 pack" ] }, "asin": "B0968TLTS8" }, { "task_id": "ws_B09SYKQ2DH_2240", "instruction": "i would like to buy a 90x200 cm pink futon mattress with memory foam for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink", "90x200cm" ] }, "asin": "B09SYKQ2DH" }, { "task_id": "ws_B089KQRQCC_2241", "instruction": "i would like a dual band ac adapter with output protection.", "target_attributes": { "attributes": [ "output protection", "dual band" ], "options": [] }, "asin": "B089KQRQCC" }, { "task_id": "ws_B086W378KL_2242", "instruction": "i really need a hair comb for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B086W378KL" }, { "task_id": "ws_B081D9PS49_2243", "instruction": "i am looking for a lychee energy drink that has no sugar.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "lilikoi lychee" ] }, "asin": "B081D9PS49" }, { "task_id": "ws_B00DR5H364_2244", "instruction": "i am looking for remote triggers that come with batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B00DR5H364" }, { "task_id": "ws_B089Z3T8G6_2245", "instruction": "i am looking for sugar free flavor syrups that come in a three pack and are amaretto.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "amaretto", "25.4 ounce (pack of 3)" ] }, "asin": "B089Z3T8G6" }, { "task_id": "ws_B089Z3T8G6_2246", "instruction": "i am looking for a sugar free irish creme syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "irish cream" ] }, "asin": "B089Z3T8G6" }, { "task_id": "ws_B09MKBHSR5_2247", "instruction": "i am looking for a black and gold bag that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "black+gold" ] }, "asin": "B09MKBHSR5" }, { "task_id": "ws_B08WKGZ4SW_2248", "instruction": "i'm looing for an asphalt colored youth extra-large t-shirt that's machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "asphalt", "youth", "x-large" ] }, "asin": "B08WKGZ4SW" }, { "task_id": "ws_B08WWSD4R8_2249", "instruction": "i would like a heavy duty wall outlet.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "outlet" ] }, "asin": "B08WWSD4R8" }, { "task_id": "ws_B09JRWRMW6_2250", "instruction": "i am looking for a jacket for daily wear that is a blue and in a size small.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "a#blue", "small" ] }, "asin": "B09JRWRMW6" }, { "task_id": "ws_B09DCTKR8Z_2251", "instruction": "i need a light red area rug for the living room that is a 4 by 6.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light red", "4x6" ] }, "asin": "B09DCTKR8Z" }, { "task_id": "ws_B07XZ4QL11_2252", "instruction": "i would like to get a 35 x 12 canvas print of manhattan, new york to hang in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "new york #08", "35\"wx12\"h canvas print" ] }, "asin": "B07XZ4QL11" }, { "task_id": "ws_B08YXLGT4S_2253", "instruction": "i would like to buy some high quality long lasting eyeliner.", "target_attributes": { "attributes": [ "long lasting", "high quality" ], "options": [] }, "asin": "B08YXLGT4S" }, { "task_id": "ws_B096FVMNDK_2254", "instruction": "i want to get some massage linens that are easy to clean and color 4 and 70x190 cm", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "4", "70x190cm" ] }, "asin": "B096FVMNDK" }, { "task_id": "ws_B09Q8VZFVT_2255", "instruction": "i want to find a pair of blue hiking shoes for men with both arch support and memory foam. the shoes need to be a size 13.", "target_attributes": { "attributes": [ "arch support", "memory foam" ], "options": [ "blue b", "13" ] }, "asin": "B09Q8VZFVT" }, { "task_id": "ws_B09Q8VZFVT_2256", "instruction": "i need running shoes that are dark grey with arch support and are in a size 13.5", "target_attributes": { "attributes": [ "arch support" ], "options": [ "dark gray", "13.5" ] }, "asin": "B09Q8VZFVT" }, { "task_id": "ws_B08KH4B9C1_2257", "instruction": "i am looking for sand gold nail art that is 0.35 oz", "target_attributes": { "attributes": [ "nail art" ], "options": [ "sand gold", "super chunky - 10g | 0.35oz sample" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2258", "instruction": "i am looking for some super chunky nail art gllitter that is peach colored.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "fluorescent peach", "super chunky - 10g | 0.35oz sample" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2259", "instruction": "get me the ten gram sample sized body glitter, but only if it hasn't been tested on animals, please.", "target_attributes": { "attributes": [ "animal testing" ], "options": [ "super chunky - 10g | 0.35oz sample" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2260", "instruction": "i want glitter for body make up for nail art decoration size 10 g color bronze holographic", "target_attributes": { "attributes": [ "nail art" ], "options": [ "bronze brown holographic", "extra chunky - 10g | 0.35oz sample" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2261", "instruction": "i am looking for rose gold colored glitter for nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "rose gold" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2262", "instruction": "i need a 3.5 oz jar of pink nail art glitter.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "fluorescent pink", "microfine - 100g | 3.5oz" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B08KH4B9C1_2263", "instruction": "i'd like to find 3.5 ounces of ultrafine, fluorescent yellow glitter for my nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "fluorescent yellow", "ultrafine - 100g | 3.5oz" ] }, "asin": "B08KH4B9C1" }, { "task_id": "ws_B07BZ17VH4_2264", "instruction": "i would like lactose free coffee drinks that are mocha and come in a four pack.", "target_attributes": { "attributes": [ "lactose free" ], "options": [ "mocha", "9 fl oz (pack of 4)" ] }, "asin": "B07BZ17VH4" }, { "task_id": "ws_B07ZTX18ZJ_2265", "instruction": "i'm looking for a 3 pound pack of individually wrapped snickers candy bars that i can hand out on valentine's day.", "target_attributes": { "attributes": [ "individually wrapped", "valentine day" ], "options": [ "3 pound (pack of 1)" ] }, "asin": "B07ZTX18ZJ" }, { "task_id": "ws_B07ZTX18ZJ_2266", "instruction": "i'm looking for a 1-pound pack of individually wrapped candy bars for a birthday party or valentines day in a resealable bag.", "target_attributes": { "attributes": [ "individually wrapped", "resealable bag", "valentine day", "birthday party" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07ZTX18ZJ" }, { "task_id": "ws_B082QDKRCP_2267", "instruction": "i would like a living room sofa chair in cognanc leather", "target_attributes": { "attributes": [ "living room" ], "options": [ "cognac leather", "sofa" ] }, "asin": "B082QDKRCP" }, { "task_id": "ws_B09PRCHC48_2268", "instruction": "there's a hands free car stereo receiver with 2g+32g.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "v3por 2g+32g" ] }, "asin": "B09PRCHC48" }, { "task_id": "ws_B07X31F54M_2269", "instruction": "i'm looking for a brozers which is alcohol free and paraben free used for sensitive skin.", "target_attributes": { "attributes": [ "alcohol free", "paraben free", "sensitive skin" ], "options": [] }, "asin": "B07X31F54M" }, { "task_id": "ws_B08G6NFGTW_2270", "instruction": "i am looking for x-large pajama bottoms that have a drawstring.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "x-large" ] }, "asin": "B08G6NFGTW" }, { "task_id": "ws_B07XYH1P1Z_2271", "instruction": "i am looking for a queen size white bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "oak country | white" ] }, "asin": "B07XYH1P1Z" }, { "task_id": "ws_B00J51MCPQ_2272", "instruction": "i want to find a 3-count pack of 4-ounce deodorant sprays that are certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "4 ounce, 3 count" ] }, "asin": "B00J51MCPQ" }, { "task_id": "ws_B00KDWJY8E_2273", "instruction": "i want to check out the techni mobili l-shaped desks that are made of coated steel.", "target_attributes": { "attributes": [ "coated steel" ], "options": [] }, "asin": "B00KDWJY8E" }, { "task_id": "ws_B072LD256N_2274", "instruction": "i am looking for a 10pcs rose gold brush set.", "target_attributes": { "attributes": [ "rose gold" ], "options": [] }, "asin": "B072LD256N" }, { "task_id": "ws_B0019RDLZE_2275", "instruction": "find me a wall sconce with a nickel finish and a glass shade.", "target_attributes": { "attributes": [ "nickel finish", "glass shade" ], "options": [] }, "asin": "B0019RDLZE" }, { "task_id": "ws_B0759B3WYP_2276", "instruction": "i am looking for a mid century couch.", "target_attributes": { "attributes": [ "mid century" ], "options": [] }, "asin": "B0759B3WYP" }, { "task_id": "ws_B09P4YQZVM_2277", "instruction": "i would like a size 8.5 sneakers with a highly fashionable white and blue floral design.", "target_attributes": { "attributes": [ "fashion design" ], "options": [ "white and blue flowers", "8.5" ] }, "asin": "B09P4YQZVM" }, { "task_id": "ws_B097BHDYZD_2278", "instruction": "i'm looking to buy some gold vanity lights with two lights on it.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "gold", "2-light" ] }, "asin": "B097BHDYZD" }, { "task_id": "ws_B086TVW3PM_2279", "instruction": "i need a bottle of fresh breath mouth wash for bad breath and oral hygeine.", "target_attributes": { "attributes": [ "fresh breath", "bad breath", "oral hygiene" ], "options": [] }, "asin": "B086TVW3PM" }, { "task_id": "ws_B01MG1FQBW_2280", "instruction": "i'm looking for a high density memory foam mattress in full size.", "target_attributes": { "attributes": [ "high density", "memory foam" ], "options": [ "full" ] }, "asin": "B01MG1FQBW" }, { "task_id": "ws_B08N6MLMDT_2281", "instruction": "i need a space saving ottoman that is brown and 15 by 15 by 15 inches.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "brown color", "15 x 15 x 15 inch" ] }, "asin": "B08N6MLMDT" }, { "task_id": "ws_B087N4G883_2282", "instruction": "i am looking for a pack of candy that has natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "1 pack" ] }, "asin": "B087N4G883" }, { "task_id": "ws_B087N4G883_2283", "instruction": "can you find me some turkish delights that have natural ingredients and are for valentines day. get the 2 pack.", "target_attributes": { "attributes": [ "natural ingredients", "valentine day" ], "options": [ "2 pack" ] }, "asin": "B087N4G883" }, { "task_id": "ws_B087N4G883_2284", "instruction": "i would like three bags of natural pineapple candy.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "pineapple, pistachios- 7 oz", "3 pack" ] }, "asin": "B087N4G883" }, { "task_id": "ws_B09DY8ZXTQ_2285", "instruction": "i am looking for black stainless steel wristbands.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black" ] }, "asin": "B09DY8ZXTQ" }, { "task_id": "ws_B00F3KP7T6_2286", "instruction": "i am looking for one case of vegetable patties that are fully cooked.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "vegetable", "1 case" ] }, "asin": "B00F3KP7T6" }, { "task_id": "ws_B00F3KP7T6_2287", "instruction": "i am looking for a 1 case of fully cooked baked patties", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "1 case" ] }, "asin": "B00F3KP7T6" }, { "task_id": "ws_B00F3KP7T6_2288", "instruction": "i am looking fully cooked spicy beef patties 50 count", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "spicy beef", "50 count" ] }, "asin": "B00F3KP7T6" }, { "task_id": "ws_B00F3KP7T6_2289", "instruction": "i want fully cooked mild beef patties size 12 count", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "mild beef", "12 count (pack of 1)" ] }, "asin": "B00F3KP7T6" }, { "task_id": "ws_B077H41BP7_2290", "instruction": "i am looking for light weight wall speakers that are 8' carbon fiber and have a center channel.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "8\" carbon fiber", "center channel" ] }, "asin": "B077H41BP7" }, { "task_id": "ws_B091G44S71_2291", "instruction": "i need 16 ounces of an oil free moisturizer that works on dry skin, it should be white not tinted.", "target_attributes": { "attributes": [ "oil free", "dry skin" ], "options": [ "white", "16 ounce" ] }, "asin": "B091G44S71" }, { "task_id": "ws_B089W3JQC5_2292", "instruction": "i would like a 16 ram with a 10th ddr4 core i5 high def mini desktop.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "10th ddr4 core i5-10210u", "16gb ram ddr4 256gb m.2 ssd 1tb hdd" ] }, "asin": "B089W3JQC5" }, { "task_id": "ws_B089W3JQC5_2293", "instruction": "i am interested in acquiring mini desktop with high definition and dual band, and also have ddr4 core i5 8250u, and 32gb ram ddr4 512gb m.2 ssd 1tb hdd", "target_attributes": { "attributes": [ "dual band", "high definition" ], "options": [ "newly ddr4 core i5 8250u", "32gb ram ddr4 512gb m.2 ssd 1tb hdd" ] }, "asin": "B089W3JQC5" }, { "task_id": "ws_B089W3JQC5_2294", "instruction": "i need a dual band 10th gen desktop that is a core i5", "target_attributes": { "attributes": [ "dual band" ], "options": [ "10th ddr4 core i5-10210u" ] }, "asin": "B089W3JQC5" }, { "task_id": "ws_B073H2QQKK_2295", "instruction": "i am looking for throw pillow covers that are machine washable in yellow white and are 26\" by 16\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "yellow white", "26\" x 16\"" ] }, "asin": "B073H2QQKK" }, { "task_id": "ws_B073H2QQKK_2296", "instruction": "i'm looking for machine washable pillows scarlet color.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "scarlet" ] }, "asin": "B073H2QQKK" }, { "task_id": "ws_B0034Q8FJK_2297", "instruction": "i need some hair dye that is shocking blue and is 4 ounces.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "shocking blue", "4 fl oz (pack of 1)" ] }, "asin": "B0034Q8FJK" }, { "task_id": "ws_B0034Q8FJK_2298", "instruction": "i am looking for classic raven colored hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "raven" ] }, "asin": "B0034Q8FJK" }, { "task_id": "ws_B01460C2I2_2299", "instruction": "i am looking for grey hair extensions that are 22 inches long.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#grey", "22 inch" ] }, "asin": "B01460C2I2" }, { "task_id": "ws_B01460C2I2_2300", "instruction": "i'm shopping for number 4, medium brown hair extensions that i can use for hair styling. they should be about 14 inches long.", "target_attributes": { "attributes": [ "hair extensions", "hair styling" ], "options": [ "#4 medium brown", "14 inch" ] }, "asin": "B01460C2I2" }, { "task_id": "ws_B01460C2I2_2301", "instruction": "i am looking for a 20 inch hair clip for my wife. and i would prefer the #4t27 medium brown ombre dark blonde", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#4t27 medium brown ombre dark blonde", "20 inch" ] }, "asin": "B01460C2I2" }, { "task_id": "ws_B01460C2I2_2302", "instruction": "i am looking for hair extensions that are human hair and double weft 20 inch.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "12 inch" ] }, "asin": "B01460C2I2" }, { "task_id": "ws_B09HZRJNJJ_2303", "instruction": "i'm looking for a slim fit , high waist women formal dress made of light weight good quality polyester material. also, choose medium size red colored one.", "target_attributes": { "attributes": [ "light weight", "slim fit", "quality polyester", "high waist" ], "options": [ "a-red", "medium" ] }, "asin": "B09HZRJNJJ" }, { "task_id": "ws_B09CGZC5ZV_2304", "instruction": "i would like an aluminum alloy tripod.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B09CGZC5ZV" }, { "task_id": "ws_B09LQW6JKF_2305", "instruction": "i am looking for silver birthday cake toppers.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "silver" ] }, "asin": "B09LQW6JKF" }, { "task_id": "ws_B07WPZ3YDD_2306", "instruction": "i need a tablet that has a 1080p hd resolution.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B07WPZ3YDD" }, { "task_id": "ws_B08XXGZNXP_2307", "instruction": "i'm looking for a lip and hand care gift set that is plant based and cruelty free.", "target_attributes": { "attributes": [ "plant based", "cruelty free" ], "options": [ "lip&hand care gift set (agave+untamed nature)" ] }, "asin": "B08XXGZNXP" }, { "task_id": "ws_B083W3Q9Q4_2308", "instruction": "i need hair extensions that are a medium brown and that come in two pieces that are an updo.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown(8#)", "2pcs tousled updo" ] }, "asin": "B083W3Q9Q4" }, { "task_id": "ws_B083W3Q9Q4_2309", "instruction": "i want 2pcs of tousled updo hair extensions. it should be easy to apply.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "2pcs tousled updo" ] }, "asin": "B083W3Q9Q4" }, { "task_id": "ws_B00ADR6M2U_2310", "instruction": "i'm looking for sulfate and paraben free conditioner.", "target_attributes": { "attributes": [ "sulfate free", "paraben free" ], "options": [] }, "asin": "B00ADR6M2U" }, { "task_id": "ws_B096DSH2VL_2311", "instruction": "i am looking for an eye balm face moisturizer for my dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "eye balm" ] }, "asin": "B096DSH2VL" }, { "task_id": "ws_B075MNJ4PS_2312", "instruction": "i need a button tufted couch preferably in emerald color.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "emerald" ] }, "asin": "B075MNJ4PS" }, { "task_id": "ws_B0839CS5BV_2313", "instruction": "i would like to get a size 7 white loafer with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "t-white", "7" ] }, "asin": "B0839CS5BV" }, { "task_id": "ws_B0839CS5BV_2314", "instruction": "i would like to buy casual work shoes with a rubber sole and of size 8.5", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "8.5" ] }, "asin": "B0839CS5BV" }, { "task_id": "ws_B07B3RL5DY_2315", "instruction": "i would like a 30 count of gmo free banana trail mix.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "bananas for chocolate", "30 count" ] }, "asin": "B07B3RL5DY" }, { "task_id": "ws_B07BBW6X2L_2316", "instruction": "i want to find sugar free shortbread cookies that are ready to eat.", "target_attributes": { "attributes": [ "sugar free", "ready eat" ], "options": [] }, "asin": "B07BBW6X2L" }, { "task_id": "ws_B07BMBKNF4_2317", "instruction": "i want a natural lip bam contain vagan oil containt", "target_attributes": { "attributes": [ "coconut oil", "seed oil" ], "options": [ "coral pink \"allison\"" ] }, "asin": "B07BMBKNF4" }, { "task_id": "ws_B07238WLLT_2318", "instruction": "i would like to get a six pack of low calorie energy drinks.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "6 count" ] }, "asin": "B07238WLLT" }, { "task_id": "ws_B019EQIFHA_2319", "instruction": "i want to find a pack of 3 three-ounce bags of sweet and hot, ready-to-eat beef jerky.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "sweet & hot", "3 ounce (pack of 3)" ] }, "asin": "B019EQIFHA" }, { "task_id": "ws_B019EQIFHA_2320", "instruction": "i want ready to eat bridgford sweet baby ray's original 99% fat free honey barbecue beef jerky.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "original 99% fat free" ] }, "asin": "B019EQIFHA" }, { "task_id": "ws_B00RJEU3L6_2321", "instruction": "i want buy 11 ounce, gluten free ,protein serving tuna also fresh", "target_attributes": { "attributes": [ "protein serving", "gluten free" ], "options": [ "11 ounce (pack of 12)" ] }, "asin": "B00RJEU3L6" }, { "task_id": "ws_B00RJEU3L6_2322", "instruction": "i need some wild caught, hickory smoked tuna.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "hickory smoked" ] }, "asin": "B00RJEU3L6" }, { "task_id": "ws_B00RJEU3L6_2323", "instruction": "i want a gluten free starkist tuna variety pack.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety pack" ] }, "asin": "B00RJEU3L6" }, { "task_id": "ws_B09PNH7BSN_2324", "instruction": "i ned a height adjustable pink office chair.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "pink" ] }, "asin": "B09PNH7BSN" }, { "task_id": "ws_B09PVJTPVS_2325", "instruction": "i'm looking for a yellow casual sports blazer.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "yellow" ] }, "asin": "B09PVJTPVS" }, { "task_id": "ws_B083FLYWSW_2326", "instruction": "i would like to get a women's large pink heather cotton t-shirt.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "pink", "women", "large" ] }, "asin": "B083FLYWSW" }, { "task_id": "ws_B09H5X7PG1_2327", "instruction": "i would like an 8 pack of waffles of two different flavors that are easy to prepare", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "8 - pack (2 flavors, 4 boxes of each)" ] }, "asin": "B09H5X7PG1" }, { "task_id": "ws_B07CPRKX3M_2328", "instruction": "i'm looking for a facial scrub that has both anti aging properties and helps with fine lines.", "target_attributes": { "attributes": [ "anti aging", "fine lines" ], "options": [] }, "asin": "B07CPRKX3M" }, { "task_id": "ws_B017QFA02Y_2329", "instruction": "i am looking for a black bikini that has an elastic waistband and is in a size small.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "black, honey almond, nymph's thigh, speakeasy, white, grey heather", "small" ] }, "asin": "B017QFA02Y" }, { "task_id": "ws_B09SYXW2PB_2330", "instruction": "i would like a easy to use carrying case for my camera.", "target_attributes": { "attributes": [ "easy use", "carrying case" ], "options": [] }, "asin": "B09SYXW2PB" }, { "task_id": "ws_B09KNB2SVM_2331", "instruction": "i would like to get a high def hdmi to vga adapter that works with blu ray.", "target_attributes": { "attributes": [ "blu ray", "high definition" ], "options": [] }, "asin": "B09KNB2SVM" }, { "task_id": "ws_B079NFMV97_2332", "instruction": "i would like to get some argan oil to treat my damaged hair.", "target_attributes": { "attributes": [ "argan oil", "hair treatment", "damaged hair" ], "options": [] }, "asin": "B079NFMV97" }, { "task_id": "ws_B01GSGDV1Y_2333", "instruction": "i am looking for non gmo sesame pretzels that come in a 12 pack.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sesame", "7.2 ounce (pack of 12)" ] }, "asin": "B01GSGDV1Y" }, { "task_id": "ws_B07Y3X6GW7_2334", "instruction": "i would like to get a heather blue cotton t shirt for my youth size 2t child.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "heather blue", "youth", "2t" ] }, "asin": "B07Y3X6GW7" }, { "task_id": "ws_B07Y972SSM_2335", "instruction": "i would like a fully cooked cut of spiced meat.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B07Y972SSM" }, { "task_id": "ws_B091J1F94T_2336", "instruction": "i would like to get a black noise cancelling headset to play video games.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black" ] }, "asin": "B091J1F94T" }, { "task_id": "ws_B08CKZTB12_2337", "instruction": "i need some metallic pumps that have a rubber sole and are in an 8.5 wide.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "metallic synthetic combination", "8.5 wide" ] }, "asin": "B08CKZTB12" }, { "task_id": "ws_B08LDM11F4_2338", "instruction": "i need a wall mounted mirror in the color d.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "d" ] }, "asin": "B08LDM11F4" }, { "task_id": "ws_B09NBZ2VGX_2339", "instruction": "i would like to buy a red radio with wireless bluetooth and stereo sound.", "target_attributes": { "attributes": [ "wireless bluetooth", "stereo sound" ], "options": [ "red" ] }, "asin": "B09NBZ2VGX" }, { "task_id": "ws_B07QNDGM8H_2340", "instruction": "i am looking for a height adjustable office chair in white gold.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "white | gold" ] }, "asin": "B07QNDGM8H" }, { "task_id": "ws_B003Q4TWF6_2341", "instruction": "can you find some chai tea that is both sugar and caffeine free? i need 3 pounds of it.", "target_attributes": { "attributes": [ "sugar free", "caffeine free" ], "options": [ "sugar free", "3 pound" ] }, "asin": "B003Q4TWF6" }, { "task_id": "ws_B003Q4TWF6_2342", "instruction": "i would like a 3 pound box of original sugar free tea.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "original", "3 pound" ] }, "asin": "B003Q4TWF6" }, { "task_id": "ws_B095HPJFM6_2343", "instruction": "i would like to get some size 6.5 yellow non slip flip flops.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "0 # yellow", "6.5" ] }, "asin": "B095HPJFM6" }, { "task_id": "ws_B095HPJFM6_2344", "instruction": "i would like a pair of size 7 black sandals that are non slip.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "6 # black", "7" ] }, "asin": "B095HPJFM6" }, { "task_id": "ws_B0891SX6XN_2345", "instruction": "i want to find an intel core i5-10400f desktop pc that i can use to play games on. it needs to be omen 25l and configured with nvidia rtx 3090.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "nvidia rtx 3090", "omen 25l", "intel i5-10400f" ] }, "asin": "B0891SX6XN" }, { "task_id": "ws_B0891SX6XN_2346", "instruction": "i am looking for desktop pc having intel core processor with nvidia rtx 3080 configuration.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "nvidia rtx 3080" ] }, "asin": "B0891SX6XN" }, { "task_id": "ws_B072J9SPMR_2347", "instruction": "i am looking for professional airbrush foundation made by photo finish in the color of primer. believe it is 1.0 ounce found in the beauty & personal care section. should say water resistant, fragrance and oil free.", "target_attributes": { "attributes": [ "oil free", "fragrance free", "water resistant" ], "options": [ "primer" ] }, "asin": "B072J9SPMR" }, { "task_id": "ws_B072J9SPMR_2348", "instruction": "i want a medium matte and oil free professional airbrush foundation makeup.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "medium matte" ] }, "asin": "B072J9SPMR" }, { "task_id": "ws_B072J9SPMR_2349", "instruction": "i need a medium colored matte foundation that's oil and fragrance free. make sure it hasn't been tested on animals. i want the one ounce bottle.", "target_attributes": { "attributes": [ "animal testing", "oil free", "fragrance free" ], "options": [ "medium matte", "1 fl oz" ] }, "asin": "B072J9SPMR" }, { "task_id": "ws_B0919TK46H_2350", "instruction": "i'm looking for a 13.3 inch carrying case for my laptop.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "13.3-inch" ] }, "asin": "B0919TK46H" }, { "task_id": "ws_B00WFDK8L6_2351", "instruction": "i am looking for a 12 count package of pomegranate fruit bars that do not have nuts or dairy in them.", "target_attributes": { "attributes": [ "nut free", "dairy free" ], "options": [ "pomegranate", "12 count (pack of 1)" ] }, "asin": "B00WFDK8L6" }, { "task_id": "ws_B00WFDK8L6_2352", "instruction": "i am looking for a gluten free fig flavored snack bar.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "fig" ] }, "asin": "B00WFDK8L6" }, { "task_id": "ws_B00RBU6JMU_2353", "instruction": "i would like a size 11 navy fashionable shoe with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "navy | gray", "11" ] }, "asin": "B00RBU6JMU" }, { "task_id": "ws_B09C85PRKX_2354", "instruction": "i would like to get a medium black long sleeve hoodie that's pretty loose.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black loose", "medium" ] }, "asin": "B09C85PRKX" }, { "task_id": "ws_B07R9M1GJM_2355", "instruction": "i need basic nylon high waist pants that are xx-large with a 37 inch inseam.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "basic nylon_heathernavy", "xx-large | 37\" inseam" ] }, "asin": "B07R9M1GJM" }, { "task_id": "ws_B07R9M1GJM_2356", "instruction": "i would like a large heather gray pair of high waisted yoga pants.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "basic cotton_heathergray(1)", "large | 37\" inseam" ] }, "asin": "B07R9M1GJM" }, { "task_id": "ws_B073QZJZVG_2357", "instruction": "i'm looking for a ware resistant flip flop sandal made of rubber outsole and rubber sole. also choose navy blue colored sandals with size 10-11, and special size of 3.5-4.5.", "target_attributes": { "attributes": [ "water resistant", "rubber outsole", "rubber sole" ], "options": [ "blue (navy | silver)", "10-11", "3.5-4.5" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B073QZJZVG_2358", "instruction": "i am looking for water resistant and rubber sole type havaianas women's slim little birds flip flop sandal also color is light lilac and size is 8.", "target_attributes": { "attributes": [ "water resistant", "rubber sole" ], "options": [ "light lilac", "8" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B073QZJZVG_2359", "instruction": "i am looking for a women's little bird (slim) flip flop/sandal with a rubber outsole in the color blueblue, and a size 4 | 5 uk (or special size type 8 made by havaianas.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "blueblue)", "4 | 5 uk", "8" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B073QZJZVG_2360", "instruction": "i want a pair of size 3 type 10 gold sandgrey lightgolden flip flops with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "gold sandgrey lightgolden 2719", "3-4", "9-10" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B073QZJZVG_2361", "instruction": "i need water resistant flip flops that are a size 10 little kid", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "10 little kid" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B073QZJZVG_2362", "instruction": "i want navy and water resistant havaianas women's flip flop sandals.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "blue(navy blue)" ] }, "asin": "B073QZJZVG" }, { "task_id": "ws_B07Q73Y6BY_2363", "instruction": "i need some vanity lights that are clear glass", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B07Q73Y6BY" }, { "task_id": "ws_B09F6C3XGC_2364", "instruction": "i am looking for an iphone case that is easy to install and is metallic gun metal.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "metallic gun metal" ] }, "asin": "B09F6C3XGC" }, { "task_id": "ws_B0861SJPCV_2365", "instruction": "i want to find one pack of freeze-dried, shelf-stable s'mores cookies made with quality ingredients.", "target_attributes": { "attributes": [ "freeze dried", "shelf stable", "quality ingredients" ], "options": [ "1 pack" ] }, "asin": "B0861SJPCV" }, { "task_id": "ws_B08R6X3BPF_2366", "instruction": "i need high quality size 23 makeup brushes.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "23" ] }, "asin": "B08R6X3BPF" }, { "task_id": "ws_B092KX93Z9_2367", "instruction": "i would like to get a 1080p hd camera with a carrying case.", "target_attributes": { "attributes": [ "1080p hd", "carrying case" ], "options": [] }, "asin": "B092KX93Z9" }, { "task_id": "ws_B015NBTAOW_2368", "instruction": "i am looking for a plug and play red mouse.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "red" ] }, "asin": "B015NBTAOW" }, { "task_id": "ws_B001TSK3AY_2369", "instruction": "i am looking for an anti-perspirant", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B001TSK3AY" }, { "task_id": "ws_B09PG6YSMS_2370", "instruction": "i need a long lasting cell phone that is 128 gb.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "128gb" ] }, "asin": "B09PG6YSMS" }, { "task_id": "ws_B01B9A3U6A_2371", "instruction": "i need a living room area rug thare is silver and blue and is a 9' square.", "target_attributes": { "attributes": [ "living room" ], "options": [ "silver | blue", "9' square" ] }, "asin": "B01B9A3U6A" }, { "task_id": "ws_B00KSLX4AO_2372", "instruction": "i would like a high performance outdoor speaker.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B00KSLX4AO" }, { "task_id": "ws_B07J4ZKB44_2373", "instruction": "i need a glass shade that is chrome colored.", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "chrome" ] }, "asin": "B07J4ZKB44" }, { "task_id": "ws_B0010NYC3M_2374", "instruction": "can i get a 4 fluid ounce bottle of violet night hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "violet night", "4 fl oz (pack of 1)" ] }, "asin": "B0010NYC3M" }, { "task_id": "ws_B08169JG35_2375", "instruction": "i would like to buy a 14 inch rose gold throw pillow cover for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "rose gold", "14 inch (pack of 1)" ] }, "asin": "B08169JG35" }, { "task_id": "ws_B08169JG35_2376", "instruction": "i need a 14 inch pillow cover that fits for my sofa in living room. and please select the peach pink one", "target_attributes": { "attributes": [ "living room" ], "options": [ "peach pink", "14 inch (pack of 1)" ] }, "asin": "B08169JG35" }, { "task_id": "ws_B09MWDNSJL_2377", "instruction": "i would like to buy a high quality hair regrowth treatment made from natural ingredients.", "target_attributes": { "attributes": [ "high quality", "natural ingredients", "hair growth" ], "options": [] }, "asin": "B09MWDNSJL" }, { "task_id": "ws_B09KNWQ36B_2378", "instruction": "i would like to buy some lotion for my dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B09KNWQ36B" }, { "task_id": "ws_B07GF3B95T_2379", "instruction": "i need 14 inch hair extensions that are a medium brown to dark blonde.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown to dark blonde", "14 inch" ] }, "asin": "B07GF3B95T" }, { "task_id": "ws_B08KHN1MPZ_2380", "instruction": "i'm looking to get some fluorescent purple nail art glitter.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "fluorescent purple" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B08KHN1MPZ_2381", "instruction": "i'm looking for body make up for skin care accessories.", "target_attributes": { "attributes": [ "animal testing", "easy use", "nail art" ], "options": [ "rose gold holographic" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B08KHN1MPZ_2382", "instruction": "i am looking for arts craft turquoise blue nails.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "turquoise blue" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B08KHN1MPZ_2383", "instruction": "i am looking for a fluorescent pink color microfine body glitter which is animal tested and cruelty free.", "target_attributes": { "attributes": [ "animal testing", "cruelty free" ], "options": [ "fluorescent pink" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B08KHN1MPZ_2384", "instruction": "i am looking for a turquoise blue color of body glitter nail art", "target_attributes": { "attributes": [ "nail art" ], "options": [ "turquoise blue" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B08KHN1MPZ_2385", "instruction": "i am looking for a gold body glitter for nail art", "target_attributes": { "attributes": [ "nail art" ], "options": [ "fine - 100g | 3.5oz" ] }, "asin": "B08KHN1MPZ" }, { "task_id": "ws_B07V2NTJCD_2386", "instruction": "i am looking for a floor lamp that has a bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [] }, "asin": "B07V2NTJCD" }, { "task_id": "ws_B09FJW2L94_2387", "instruction": "i need a hard shell case cover for my macbook 12 retina that is sosuke and ponyo colored.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "sosuke & ponyo", "a1534 (macbook 12 retina)" ] }, "asin": "B09FJW2L94" }, { "task_id": "ws_B09FJW2L94_2388", "instruction": "i am looking for a a2442(pro 14\" 2021 m1 pro | max touch id) size of hard shell cases over.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "a2442(pro 14\" 2021 m1 pro | max touch id)" ] }, "asin": "B09FJW2L94" }, { "task_id": "ws_B09FJW2L94_2389", "instruction": "i'm looking for computer accessories for bag and cases its easy to use.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "retro pattern" ] }, "asin": "B09FJW2L94" }, { "task_id": "ws_B09FJW2L94_2390", "instruction": "i'm looking for a non-slip laptop case with a color that has animal colors.", "target_attributes": { "attributes": [ "non slip", "case cover" ], "options": [ "animal" ] }, "asin": "B09FJW2L94" }, { "task_id": "ws_B09FJW2L94_2391", "instruction": "i want a pink marble bandless case cover that is compatible with macbook pros.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "pink marble" ] }, "asin": "B09FJW2L94" }, { "task_id": "ws_B07MHYH619_2392", "instruction": "i am interested in some noise cancelling earbud headphones.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B07MHYH619" }, { "task_id": "ws_B09GNQF1TF_2393", "instruction": "i am looking for a steel frame that is light pink and for a full sized bed.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "light pink", "full" ] }, "asin": "B09GNQF1TF" }, { "task_id": "ws_B08BXJJSH5_2394", "instruction": "i need a gold storage case.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "gold" ] }, "asin": "B08BXJJSH5" }, { "task_id": "ws_B09DCZHF6S_2395", "instruction": "i am looking for a green home office chair that is height adjustable.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "green" ] }, "asin": "B09DCZHF6S" }, { "task_id": "ws_B09HGC3QTJ_2396", "instruction": "i need a lightweight sweatshirt that is grey and in a small.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "08 # gray", "small" ] }, "asin": "B09HGC3QTJ" }, { "task_id": "ws_B07NM2XSDC_2397", "instruction": "i would like to get two assorted non-gmo powdered cheeses.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "2 piece assortment" ] }, "asin": "B07NM2XSDC" }, { "task_id": "ws_B01MUEYBDN_2398", "instruction": "i am looking for comfortable fit sneakers that are in a size 4.5 and are black and white chambray.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black | white chambray", "4.5" ] }, "asin": "B01MUEYBDN" }, { "task_id": "ws_B01GCGKI3O_2399", "instruction": "i want to buy a single 3ft black hdmi cable that works with my 4k high definition tv.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "black", "3ft", "single" ] }, "asin": "B01GCGKI3O" }, { "task_id": "ws_B095HQCQMK_2400", "instruction": "i am looking for a sweater that is machine washable in an xx-large and is in the color 22.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "22", "xx-large" ] }, "asin": "B095HQCQMK" }, { "task_id": "ws_B09PG8G4G8_2401", "instruction": "i want to find an oral patch that i can use to control bad breath odor.", "target_attributes": { "attributes": [ "bad breath" ], "options": [] }, "asin": "B09PG8G4G8" }, { "task_id": "ws_B07GYZZBRK_2402", "instruction": "i would like a cupcake topper that would be appropriate for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B07GYZZBRK" }, { "task_id": "ws_B07RL3B6BC_2403", "instruction": "i would like a grey bed made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey" ] }, "asin": "B07RL3B6BC" }, { "task_id": "ws_B08LQSCBCW_2404", "instruction": "i would like a core i5 desktop that has 8gb of ram and an ssd of 256gb.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "8gb ram | 256gb ssd" ] }, "asin": "B08LQSCBCW" }, { "task_id": "ws_B09LY9SRXN_2405", "instruction": "i am looking for a light weight hard shell case that is 14 inches and is in the color yellow tansy.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "14inch-yellow tansy" ] }, "asin": "B09LY9SRXN" }, { "task_id": "ws_B083RYJT6M_2406", "instruction": "i am looking for a paleo seasoning set that is 2.5 ounces and is low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "paleo seasoning set", "2.5 ounce (pack of 1)" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2407", "instruction": "i am looking for gluten free paleo seasoning food .", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "paleo seasoning set" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2408", "instruction": "i want to find low sodium everyday seasoning that i can use, in both a 2 ounce bottle and a 2.5 ounce bottle.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "everyday seasonings", "2 ounce (pack of 1)", "2.5 ounce (pack of 1)" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2409", "instruction": "hello ! i need paleo everyday seasonings powder which is gluten free and has low sodium.", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "everyday seasonings" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2410", "instruction": "i am searching for low sodium food, gluten free everyday seasonings, 2.5 ounce (pack of 1)", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "everyday seasonings", "2.5 ounce (pack of 1)" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2411", "instruction": "i want a 1.5 pound box of 2 ounce paleo seasoning bottles that are low sodium..", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "paleo seasoning set", "2 ounce (pack of 1)", "1.5 pound (pack of 1)" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B083RYJT6M_2412", "instruction": "i need everyday seasoning in a 4 piece assortment pack which should have low sodium and is gluten free.", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "everyday seasonings", "4 piece assortment" ] }, "asin": "B083RYJT6M" }, { "task_id": "ws_B09SP83RFP_2413", "instruction": "i would like to buy some hair growth treatments made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "hair growth" ], "options": [] }, "asin": "B09SP83RFP" }, { "task_id": "ws_B09SKGVDWZ_2414", "instruction": "i am looking for tempered glass screen protectors for the iphone 12 mini.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "iphone 12 mini" ] }, "asin": "B09SKGVDWZ" }, { "task_id": "ws_B00PNMFH80_2415", "instruction": "i am looking for fruit snacks that are fat free.", "target_attributes": { "attributes": [ "fat free" ], "options": [] }, "asin": "B00PNMFH80" }, { "task_id": "ws_B0815YKZSP_2416", "instruction": "i would like to buy some orange office chairs that have great lumbar support..", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "orange" ] }, "asin": "B0815YKZSP" }, { "task_id": "ws_B008XDPCQI_2417", "instruction": "i'm looking for a rich and creamy crab, clam, and corn chowder bisque. choose the ones that comes in 10.5 oz canes of 6.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "10.5 ounce (pack of 6)", "clam and corn chowder" ] }, "asin": "B008XDPCQI" }, { "task_id": "ws_B008XDPCQI_2418", "instruction": "i am purchasing for rich creamy type bar harbor soup bisque crab also size is 10.5 ounce", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "10.5 ounce (pack of 6)" ] }, "asin": "B008XDPCQI" }, { "task_id": "ws_B008XDPCQI_2419", "instruction": "i'm looking for bar harbor soup crab.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "10.5 ounce (pack of 1)" ] }, "asin": "B008XDPCQI" }, { "task_id": "ws_B008XDPCQI_2420", "instruction": "i need a good doup bisque that's hand crafted. select the manhatten clam chowder variety.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "manhatten clam chowder" ] }, "asin": "B008XDPCQI" }, { "task_id": "ws_B0868DCGK3_2421", "instruction": "i would like to buy a three pack of fine combs good for styling dry hair.", "target_attributes": { "attributes": [ "hair styling", "dry hair" ], "options": [ "3 pack(fine comb)" ] }, "asin": "B0868DCGK3" }, { "task_id": "ws_B09PBR8NS9_2422", "instruction": "i would like to buy some colorful medium long sleeve pajamas from quality fabrics that i can wear every day.", "target_attributes": { "attributes": [ "long sleeve", "quality materials", "daily wear" ], "options": [ "a4-colorful", "medium" ] }, "asin": "B09PBR8NS9" }, { "task_id": "ws_B09C3SD83Q_2423", "instruction": "i want a cruelty free lip gloss that is in shimmy glossy and comes in a pack of 8.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "(shimmer glossy, 8pcs-b)" ] }, "asin": "B09C3SD83Q" }, { "task_id": "ws_B08R95Z7BF_2424", "instruction": "i want to find a strawberry scented foot peel mask that has argan oil as a key ingredient.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "strawberry" ] }, "asin": "B08R95Z7BF" }, { "task_id": "ws_B00IQCRTXU_2425", "instruction": "i need a compact flaschard that is high speed and has a 512gb capacity.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "512gb" ] }, "asin": "B00IQCRTXU" }, { "task_id": "ws_B00IQCRTXU_2426", "instruction": "i am looking for a high speed compactflash card with128gb 2 -pack capacity. also choose cfexpress + usb reader style.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "128gb 2-pack", "cfexpress + usb reader" ] }, "asin": "B00IQCRTXU" }, { "task_id": "ws_B09RFM8Q7G_2427", "instruction": "i want to find a yellow manual toothbrush suitable for 7-14 year old kids with sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "yellow-f", "7-14 year" ] }, "asin": "B09RFM8Q7G" }, { "task_id": "ws_B09QQ16D9H_2428", "instruction": "i'd like to find a green toothbrush suitable for 7-12 year old kids with sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "green#6", "7-12 year old" ] }, "asin": "B09QQ16D9H" }, { "task_id": "ws_B09QQ16D9H_2429", "instruction": "i would like a red tooth brush for my 7 -12 year old's sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "red#3", "7-12 year old" ] }, "asin": "B09QQ16D9H" }, { "task_id": "ws_B09QQ16D9H_2430", "instruction": "i'm looking for a easy to use manual toothbrush for sensitive teeth. also choose 7-12 year old kids usable blue colored one.", "target_attributes": { "attributes": [ "easy use", "sensitive teeth" ], "options": [ "blue#2", "7-12 year old" ] }, "asin": "B09QQ16D9H" }, { "task_id": "ws_B09QQ16D9H_2431", "instruction": "i need to find an easy to use toothbrush for a seven year old. look for a yellow one.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "yellow#2", "7-14 year old" ] }, "asin": "B09QQ16D9H" }, { "task_id": "ws_B002OEPJK6_2432", "instruction": "i'm looking for a black colored king sized bed with night stand and chest made of engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "black", "king", "bed | night stand & chest" ] }, "asin": "B002OEPJK6" }, { "task_id": "ws_B09LVV68PS_2433", "instruction": "i need a usb flash drive that can carry 512gb and is in the style of istorage miscrosd card and datashur sd drive", "target_attributes": { "attributes": [ "usb port" ], "options": [ "512gb", "datashur sd drive + istorage microsd card" ] }, "asin": "B09LVV68PS" }, { "task_id": "ws_B09LVV68PS_2434", "instruction": "i would like a 3 pack of istorage 0gb microsd cards that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "0gb", "istorage microsd card | 3 pack" ] }, "asin": "B09LVV68PS" }, { "task_id": "ws_B07CG6N4K7_2435", "instruction": "i would like to get some size 10 red pumps with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black-red", "10" ] }, "asin": "B07CG6N4K7" }, { "task_id": "ws_B07JX7QM8G_2436", "instruction": "i'm looking for a high performance paint contrast projector.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "projection paint contrast" ] }, "asin": "B07JX7QM8G" }, { "task_id": "ws_B08FXNWKYV_2437", "instruction": "i want to get some photo studio backgrounds that are dust proof and for high resolution.", "target_attributes": { "attributes": [ "dust proof", "high resolution" ], "options": [] }, "asin": "B08FXNWKYV" }, { "task_id": "ws_B09D2ZKB99_2438", "instruction": "i would like to buy a 16 x 36 inch round clear table pad for my dining room table that's easy to clean.", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "round new clear", "16x36 inch" ] }, "asin": "B09D2ZKB99" }, { "task_id": "ws_B01FTZYWJK_2439", "instruction": "find me a carbon fiber tripod stand.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B01FTZYWJK" }, { "task_id": "ws_B093CXPS8D_2440", "instruction": "i need an led video light that is l6000a. some batteries would be nice.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "l6000a" ] }, "asin": "B093CXPS8D" }, { "task_id": "ws_B093CXPS8D_2441", "instruction": "i need an easy to use warm light for photography", "target_attributes": { "attributes": [ "easy use" ], "options": [ "white + warm light for photography" ] }, "asin": "B093CXPS8D" }, { "task_id": "ws_B001VNGOAA_2442", "instruction": "i need one pound of kosher echinacea.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B001VNGOAA" }, { "task_id": "ws_B098XC1XZP_2443", "instruction": "i need a long sleeved hoodie that is an xx-large and is in the color gray.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "s-aa-gray", "xx-large" ] }, "asin": "B098XC1XZP" }, { "task_id": "ws_B07MG55SJB_2444", "instruction": "i need a protective ac output cable cord.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07MG55SJB" }, { "task_id": "ws_B07MG55SJB_2445", "instruction": "i would like a ac adapter with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07MG55SJB" }, { "task_id": "ws_B085T9CWGD_2446", "instruction": "i would like to get some 20 mm c-0.10 made from high quality materials false lashes.", "target_attributes": { "attributes": [ "high quality", "quality materials" ], "options": [ "c-0.10", "20-25 mm" ] }, "asin": "B085T9CWGD" }, { "task_id": "ws_B09854W487_2447", "instruction": "i'm looking for a 6-count pack of birthday cake flavored donuts that are keto friendly.", "target_attributes": { "attributes": [ "keto friendly", "birthday cake" ], "options": [ "birthday cake", "6 count" ] }, "asin": "B09854W487" }, { "task_id": "ws_B09RF8CHQK_2448", "instruction": "i would like to buy a medium blue short sleeve t-shirt appropriate for a teenage girl.", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "a03-blue", "medium" ] }, "asin": "B09RF8CHQK" }, { "task_id": "ws_B092CP85HK_2449", "instruction": "i need a long lasting white eye shadow.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "white 1" ] }, "asin": "B092CP85HK" }, { "task_id": "ws_B00A74HZN4_2450", "instruction": "i want some chincilla 29w x 32l regular straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "chinchilla - soft washed twill", "regular", "29w x 32l" ] }, "asin": "B00A74HZN4" }, { "task_id": "ws_B00A74HZN4_2451", "instruction": "i am looking for levi's 514 straight fit jeans for men with straight legs and a regular fit.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "regular" ] }, "asin": "B00A74HZN4" }, { "task_id": "ws_B084C23QZD_2452", "instruction": "i'm looking for a pair of ivory-colored noise-cancelling headphones.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "ivory" ] }, "asin": "B084C23QZD" }, { "task_id": "ws_B084C23QZD_2453", "instruction": "i want a on-ear headphone with noise cancelling", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B084C23QZD" }, { "task_id": "ws_B08BDLWRG8_2454", "instruction": "i would like to buy a pack of 6 individually wrapped cookie gift basket.", "target_attributes": { "attributes": [ "individually wrapped", "gift basket" ], "options": [ "6" ] }, "asin": "B08BDLWRG8" }, { "task_id": "ws_B09RJ4T8FR_2455", "instruction": "i would like to buy a large black short short sleeve polo shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "black", "large" ] }, "asin": "B09RJ4T8FR" }, { "task_id": "ws_B08888J18H_2456", "instruction": "i need sneakers that have a rubber sole and are a grey blue color in a size 7.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "grey_blue", "7" ] }, "asin": "B08888J18H" }, { "task_id": "ws_B01HJW7AHC_2457", "instruction": "i want to buy a two pack of high-speed gold-plated hdmi cables.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "2 pack" ] }, "asin": "B01HJW7AHC" }, { "task_id": "ws_B09JKCX4WH_2458", "instruction": "keego window blinds will they block out all the sun light or will there be cracks?", "target_attributes": { "attributes": [ "easy install" ], "options": [ "white - blackout" ] }, "asin": "B09JKCX4WH" }, { "task_id": "ws_B00P1Q5JHW_2459", "instruction": "i want to find 5.3 ounces of plant-based organic hair dye in a dark chocolate color.", "target_attributes": { "attributes": [ "plant based", "hair dye" ], "options": [ "dark chocolate", "5.3 ounce (pack of 1)" ] }, "asin": "B00P1Q5JHW" }, { "task_id": "ws_B07V6HF7QF_2460", "instruction": "i would like a stainless steel coaxial car speaker.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B07V6HF7QF" }, { "task_id": "ws_B07L43RN73_2461", "instruction": "find me 1 bar of orange blossom honey soap that is made with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "orange blossom honey", "6 ounce (pack of 1)" ] }, "asin": "B07L43RN73" }, { "task_id": "ws_B09FZNQ75H_2462", "instruction": "i would like to get a perfect fruit gift basket.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [] }, "asin": "B09FZNQ75H" }, { "task_id": "ws_B08M4FR5D7_2463", "instruction": "i need a king sized bed that has metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "king" ] }, "asin": "B08M4FR5D7" }, { "task_id": "ws_B09L6YPVT9_2464", "instruction": "i would like a cosmetic bag for my eye shadow decorated with a lot of lip prints.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "many lip prints" ] }, "asin": "B09L6YPVT9" }, { "task_id": "ws_B08NP6WYKN_2465", "instruction": "i would like a yellow 42mm band for a apple watch that is easy to put on.", "target_attributes": { "attributes": [ "compatible apple", "easy install" ], "options": [ "yellow", "42mm | 44mm | 45mm-s" ] }, "asin": "B08NP6WYKN" }, { "task_id": "ws_B08NP6WYKN_2466", "instruction": "i would like a midnight blue 38 mm applewatch band.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "midnight blue", "38mm | 40mm | 41mm-s" ] }, "asin": "B08NP6WYKN" }, { "task_id": "ws_B007FAOW5M_2467", "instruction": "i would like a tinted moisturizer that is made for dry skin and is in the color annapurna.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "annapurna - medium with a neutral peachy undertone" ] }, "asin": "B007FAOW5M" }, { "task_id": "ws_B007FAOW5M_2468", "instruction": "i need a tinted moisturizer that is effective for dry skin . and choose the annapurna - medium with a neutral peachy undertone", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "annapurna - medium with a neutral peachy undertone" ] }, "asin": "B007FAOW5M" }, { "task_id": "ws_B07DXHRNFS_2469", "instruction": "i would like to buy some size 36 orange elastic waist flat front shorts.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "orange", "36" ] }, "asin": "B07DXHRNFS" }, { "task_id": "ws_B08X6K9XN3_2470", "instruction": "i'm looking for a non slip trekking shoes with rubber outsole and should be moisture wicking. also choose black colored with size 14 for women", "target_attributes": { "attributes": [ "moisture wicking", "rubber outsole" ], "options": [ "black", "14 women | 13 men" ] }, "asin": "B08X6K9XN3" }, { "task_id": "ws_B00BJY64KG_2471", "instruction": "i need a standard 23\" by 52\" green toddler bed that is heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "green", "standard (23\" x 52\")" ] }, "asin": "B00BJY64KG" }, { "task_id": "ws_B00BJY64KG_2472", "instruction": "i want to find a space-saving yellow naptime cot for toddlers. it should come in a standard size and i don't want it to come with sheets.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "yellow", "cot + bookshelf", "standard (23\" x 52\")", "without sheets" ] }, "asin": "B00BJY64KG" }, { "task_id": "ws_B00BJY64KG_2473", "instruction": "i need to buy a heavy duty daycare sleeping cot. find one in red without sheets.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "red", "without sheets" ] }, "asin": "B00BJY64KG" }, { "task_id": "ws_B07QMFTT6J_2474", "instruction": "i am looking for an original dry skin moisturizer that comes in a three pack.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "original", "3 pack" ] }, "asin": "B07QMFTT6J" }, { "task_id": "ws_B07QMFTT6J_2475", "instruction": "i would like a two pack of cruelty free lip balm in orange.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "outrageous orange", "2 pack" ] }, "asin": "B07QMFTT6J" }, { "task_id": "ws_B09JKW21YF_2476", "instruction": "i would like to buy a 12x16 inch white poster that has a solid wood frame and easy to install in my living room.", "target_attributes": { "attributes": [ "easy install", "wood frame", "solid wood", "living room" ], "options": [ "white 4", "12x16 inch" ] }, "asin": "B09JKW21YF" }, { "task_id": "ws_B07PR9D43Q_2477", "instruction": "i would like yellow flats that have memory foam that are a size 9.5.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "yellow", "9.5" ] }, "asin": "B07PR9D43Q" }, { "task_id": "ws_B01HJWAMKE_2478", "instruction": "i'm looking for a high speed hdmi male to male cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to male" ] }, "asin": "B01HJWAMKE" }, { "task_id": "ws_B01HJWAMKE_2479", "instruction": "i want to find a 10-pack of male-to-female hdmi cables that are 20 feet long and plated with gold.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10 pack", "20 feet (single pack)", "hdmi male to female" ] }, "asin": "B01HJWAMKE" }, { "task_id": "ws_B01HJWAMKE_2480", "instruction": "i want a high speed hdmi cable male to female.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to female" ] }, "asin": "B01HJWAMKE" }, { "task_id": "ws_B08X216Z6H_2481", "instruction": "i would like to get a high quality black white lotion pump case.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "black bottle", "white lotion pump" ] }, "asin": "B08X216Z6H" }, { "task_id": "ws_B07KP1M97Z_2482", "instruction": "i would like to get a refurbished printer.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07KP1M97Z" }, { "task_id": "ws_B00CWTZ8SQ_2483", "instruction": "i need sugar free flavor syrup for soda that is 25.4 fl oz.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar free syrup, variety pack, soda fla...", "25.4 fl oz (pack of 1)" ] }, "asin": "B00CWTZ8SQ" }, { "task_id": "ws_B00CWTZ8SQ_2484", "instruction": "i\u2019m looking for a large multi-pack of sweetener that contains no sugar; please pick the blue raspberry flavour.", "target_attributes": { "attributes": [ "sugar free", "zero sugar" ], "options": [ "sugar free blue raspberry" ] }, "asin": "B00CWTZ8SQ" }, { "task_id": "ws_B07J6SVGKY_2485", "instruction": "i would like to get a 16 x 24 inch poster with a ready to hang white frame.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "16 in x 24 in", "white frame" ] }, "asin": "B07J6SVGKY" }, { "task_id": "ws_B07XT6GKWV_2486", "instruction": "i need an intel core i3 cpu pc that has 16gb of ram and 24gb of ssd space.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "cpu i3 8145u", "16g ram 240g ssd" ] }, "asin": "B07XT6GKWV" }, { "task_id": "ws_B005W0LRUA_2487", "instruction": "i would like to buy a small cyan bra that i can hand wash in the sink.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "cyan blue", "small" ] }, "asin": "B005W0LRUA" }, { "task_id": "ws_B004EMLLXU_2488", "instruction": "i would like to buy a 6 pack of 15 ounce fat free oyster sauce.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "oyster", "15 ounce (pack of 6)" ] }, "asin": "B004EMLLXU" }, { "task_id": "ws_B07MXCYKLX_2489", "instruction": "i would like a cosmetics bag that is water resistant and pineapple colored.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "pineapple 1" ] }, "asin": "B07MXCYKLX" }, { "task_id": "ws_B087BHY3D3_2490", "instruction": "i would like six individually wrapped dessert gifts.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "6" ] }, "asin": "B087BHY3D3" }, { "task_id": "ws_B00VEJ6GHM_2491", "instruction": "i would like a 48 pack of 5 ounce wild caught albacore in water tuna.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "albacore in water", "5 ounce (pack of 48)" ] }, "asin": "B00VEJ6GHM" }, { "task_id": "ws_B07KQHV9SF_2492", "instruction": "i would like thierry mugler angel impression in a travel size bottle.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "thierry mugler angel impression" ] }, "asin": "B07KQHV9SF" }, { "task_id": "ws_B098933HD8_2493", "instruction": "i want to find date-sweetened pancake mix that is gluten free and includes only simple ingredients.", "target_attributes": { "attributes": [ "gluten free", "simple ingredients" ], "options": [] }, "asin": "B098933HD8" }, { "task_id": "ws_B009JBFLH8_2494", "instruction": "i am looking for a dome camera that has motion detection and is hd 360 degree.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "hd 360-degree" ] }, "asin": "B009JBFLH8" }, { "task_id": "ws_B09DT9G2FR_2495", "instruction": "find me a long handled body brush that is double sided.", "target_attributes": { "attributes": [ "double sided", "long handle" ], "options": [] }, "asin": "B09DT9G2FR" }, { "task_id": "ws_B004VMGTY4_2496", "instruction": "i am looking for a sensitive night cream that does not have a fragrance.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "sensitive night cream" ] }, "asin": "B004VMGTY4" }, { "task_id": "ws_B00N2JMYKU_2497", "instruction": "i am looking for a castor oil with tee tree oils for black natural hair that can stimulate follicles and hair growth . it should be 4 ounce.", "target_attributes": { "attributes": [ "natural hair", "hair growth" ], "options": [ "4 ounce" ] }, "asin": "B00N2JMYKU" }, { "task_id": "ws_B09NQDV4N8_2498", "instruction": "i would like to buy a white floor lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B09NQDV4N8" }, { "task_id": "ws_B083ZJ87W2_2499", "instruction": "i need an alarm clock that is mint colored and has batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "mint" ] }, "asin": "B083ZJ87W2" }, { "task_id": "ws_B083ZJ87W2_2500", "instruction": "seeking to find a mini reversible travel lcd alarm clock-radio controlled touch sensor light using aaa batteries included in color white or pink that is made by lexon flip plus.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [ "white" ] }, "asin": "B083ZJ87W2" }, { "task_id": "ws_B08S741NQG_2501", "instruction": "i would like to buy some greeley size 28 slim fit jeans.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "greeley", "28" ] }, "asin": "B08S741NQG" }, { "task_id": "ws_B006M5SG5I_2502", "instruction": "i am looking for 12 cookies that are in a gift basket and are cherry flavored with white chips.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "cherry w | white chips", "12 count (pack of 1)" ] }, "asin": "B006M5SG5I" }, { "task_id": "ws_B006M5SG5I_2503", "instruction": "i am looking for a perfect gift of cookies having flavor name assorted flavors.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "assorted flavors" ] }, "asin": "B006M5SG5I" }, { "task_id": "ws_B09BQRRRHZ_2504", "instruction": "i want to find a black car charger with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B09BQRRRHZ" }, { "task_id": "ws_B082NNKT5C_2505", "instruction": "i am looking for a classic candle that has soy wax", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "classic candle" ] }, "asin": "B082NNKT5C" }, { "task_id": "ws_B07MZ3Z2TY_2506", "instruction": "i need a lightweight photography background that is 8 by 6 feet.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "8x6ft" ] }, "asin": "B07MZ3Z2TY" }, { "task_id": "ws_B088DS3SP9_2507", "instruction": "i would like a pair of high quality hair clippers.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B088DS3SP9" }, { "task_id": "ws_B09F3HQV85_2508", "instruction": "i need a lake blue colored storage bench that is made of faux leather and is 60.40.42cm.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "lake blue", "60.40.42cm" ] }, "asin": "B09F3HQV85" }, { "task_id": "ws_B07CRVWTWP_2509", "instruction": "i would like to get a queen pink linen daybed with a wood frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "pink linen", "queen", "daybed and trundle" ] }, "asin": "B07CRVWTWP" }, { "task_id": "ws_B07QJ3GS1G_2510", "instruction": "i would like a water resistant usb flash drive that has 32 gb of storage and is a05 color.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "a05", "32gb" ] }, "asin": "B07QJ3GS1G" }, { "task_id": "ws_B0978P7D27_2511", "instruction": "i need a case for my phone that is turquoise and has wireless charging capabilities.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "turquoise" ] }, "asin": "B0978P7D27" }, { "task_id": "ws_B07DPG7MV4_2512", "instruction": "i am looking for some pants with an elastic waist that are x-small size and are khaki colored.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "khaki-10", "x-small | 29\" inseam" ] }, "asin": "B07DPG7MV4" }, { "task_id": "ws_B071L2B6BN_2513", "instruction": "i'm looking for a sofa table with wood finish for the living room.", "target_attributes": { "attributes": [ "wood finish", "living room" ], "options": [] }, "asin": "B071L2B6BN" }, { "task_id": "ws_B07J3Y6LVY_2514", "instruction": "i'm looking for a tempered glass cell phone case.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "crystal ab-12 pro max" ] }, "asin": "B07J3Y6LVY" }, { "task_id": "ws_B086QNNL78_2515", "instruction": "i am looking for some cookies that are plant based and peanut butter flavor, and would like a pack of 16.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "peanut butter", "4 ounce (pack of 16)" ] }, "asin": "B086QNNL78" }, { "task_id": "ws_B00HJXD7EM_2516", "instruction": "i would like to buy a six pack of 12 ounce apricot dairy free bake mix.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "apricot", "12 ounce (pack of 6)" ] }, "asin": "B00HJXD7EM" }, { "task_id": "ws_B00HJXD7EM_2517", "instruction": "i am looking for freshly baked nut free kosher cookie pastry which is 12ounce in size.", "target_attributes": { "attributes": [ "baked fresh", "nut free" ], "options": [ "12 ounce (pack of 6)" ] }, "asin": "B00HJXD7EM" }, { "task_id": "ws_B00HJXD7EM_2518", "instruction": "i would like a 12 ounce strawberry baking mix that is nut free.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "strawberry", "12 ounce (pack of 2)" ] }, "asin": "B00HJXD7EM" }, { "task_id": "ws_B09RHSP5K6_2519", "instruction": "i would like to buy some size 7.5 gold high heeled shoes with a ankle strap.", "target_attributes": { "attributes": [ "ankle strap", "high heel" ], "options": [ "gold", "7.5 wide" ] }, "asin": "B09RHSP5K6" }, { "task_id": "ws_B09DYSRQLC_2520", "instruction": "i'm looking for some gluten free jelly with black sesames.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "black sesame 1 kg" ] }, "asin": "B09DYSRQLC" }, { "task_id": "ws_B09DYSRQLC_2521", "instruction": "i want a peanut butter with date spread that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peanut butter with dates" ] }, "asin": "B09DYSRQLC" }, { "task_id": "ws_B004VWL39A_2522", "instruction": "i am looking for steel toe shoes for men that are a size 8.5 wide.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "8.5 wide" ] }, "asin": "B004VWL39A" }, { "task_id": "ws_B09FF3KS1F_2523", "instruction": "i need matte black pumps that have a rubber sole and that are in a us size 6.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "matteblk", "us6.5" ] }, "asin": "B09FF3KS1F" }, { "task_id": "ws_B09GM6TS1F_2524", "instruction": "i would like a linen 33x31x33 centimeter ottoman for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "e(linen)", "33x31x33cm(13x12x13inch)" ] }, "asin": "B09GM6TS1F" }, { "task_id": "ws_B09R46MB1Y_2525", "instruction": "i want a size 8 pink high heeled shoe with a ankle strap.", "target_attributes": { "attributes": [ "high heel", "ankle strap" ], "options": [ "a-1 pink", "8" ] }, "asin": "B09R46MB1Y" }, { "task_id": "ws_B09HMMH7F4_2526", "instruction": "i would like to get some second 5 sand long lasting foundation made from seed oil.", "target_attributes": { "attributes": [ "long lasting", "seed oil" ], "options": [ "5 sand", "2nd" ] }, "asin": "B09HMMH7F4" }, { "task_id": "ws_B09M6Z6S7H_2527", "instruction": "i'm looking for a smart watch bands which is compatible for apple and easy to install. also choose black-red colored one.", "target_attributes": { "attributes": [ "compatible apple", "easy install" ], "options": [ "black-red" ] }, "asin": "B09M6Z6S7H" }, { "task_id": "ws_B0977MNS6P_2528", "instruction": "i need a king size bedroom set with a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "king bed a468c" ] }, "asin": "B0977MNS6P" }, { "task_id": "ws_B0977MNS6P_2529", "instruction": "i'm looking for bedroom furniture with wood finish. choose ones that come in queen size and color of a475c.", "target_attributes": { "attributes": [ "queen size", "wood finish" ], "options": [ "queen bed a475c" ] }, "asin": "B0977MNS6P" }, { "task_id": "ws_B07ZJBGV5M_2530", "instruction": "i would like to get some 52'' x 63'' x 2 christmas panels for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "christmas-091zse7297", "52'' x 63'' x 2 panels" ] }, "asin": "B07ZJBGV5M" }, { "task_id": "ws_B09824ZV3X_2531", "instruction": "i need some toppers for cupcakes that are good for a birthday party and are gold.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold" ] }, "asin": "B09824ZV3X" }, { "task_id": "ws_B096BD6LP6_2532", "instruction": "i need a long lasting box spring set in a queen size with an 8\" foundation.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "queen", "8\" foundation" ] }, "asin": "B096BD6LP6" }, { "task_id": "ws_B09J2J3HBD_2533", "instruction": "i'm looking for a loose fit and machine washable women's christmas t-shirt. i'm looking for a large blue t-shirt.", "target_attributes": { "attributes": [ "loose fit", "machine wash" ], "options": [ "blue", "large" ] }, "asin": "B09J2J3HBD" }, { "task_id": "ws_B095NZBRT1_2534", "instruction": "i need a pack of 2 apple compatible fast chargers in white.", "target_attributes": { "attributes": [ "compatible apple", "fast charging" ], "options": [ "white 2pack" ] }, "asin": "B095NZBRT1" }, { "task_id": "ws_B07B69784T_2535", "instruction": "i would like some curtains for my living room that are blue orange and are 108\" by 90\".", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue orange", "108\" x 90\"" ] }, "asin": "B07B69784T" }, { "task_id": "ws_B0924MY197_2536", "instruction": "i want to find a 5-piece nail art set with a variety of polishes.", "target_attributes": { "attributes": [ "nail art", "nail polish" ], "options": [] }, "asin": "B0924MY197" }, { "task_id": "ws_B07QWWB6FN_2537", "instruction": "i'm looking for a pair of water resistant brown pants.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "nomad brown\uff08convertible\uff09" ] }, "asin": "B07QWWB6FN" }, { "task_id": "ws_B09HPNLRGS_2538", "instruction": "i'd like to find gold cupcake toppers that i can use for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold" ] }, "asin": "B09HPNLRGS" }, { "task_id": "ws_B09HPNLRGS_2539", "instruction": "i'm looking for a 24 pack of rose gold cupcake picks for my upcoming baby shower.", "target_attributes": { "attributes": [ "baby shower", "cupcake picks" ], "options": [ "rose gold" ] }, "asin": "B09HPNLRGS" }, { "task_id": "ws_B09HPNLRGS_2540", "instruction": "i need to buy some pink cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "pink" ] }, "asin": "B09HPNLRGS" }, { "task_id": "ws_B07MHYPFZG_2541", "instruction": "i want to buy a small ponytail made up of synthetic hair, colour 6tr. thanks.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "6tr" ] }, "asin": "B07MHYPFZG" }, { "task_id": "ws_B07XYG5JF2_2542", "instruction": "i want to find a 6-count pack of thyme leaf tea bags that are usda certified organic.", "target_attributes": { "attributes": [ "usda organic", "certified organic" ], "options": [ "6 count (pack of 1)", "iced tea bags" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2543", "instruction": "i am looking for organic india tea bags . it should be usda organic certified.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "tea bags" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2544", "instruction": "i want certified organic irish breakfast iced tea bags in the 1 pound pack, and they need to be mint flavor. they are also by fgo and blended in the usa.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "mint", "1 pound (pack of 1)", "iced tea bags" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2545", "instruction": "i'd like to order some darjeeling tea. make sure it's certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "darjeeling" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2546", "instruction": "i'm looking for certified organic it is easy to use and it is for grocery.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "matcha" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2547", "instruction": "i would like 36 packets of black tea bags that are usda certified organic.", "target_attributes": { "attributes": [ "usda organic", "certified organic" ], "options": [ "black tea (decaf)", "36 count (pack of 1)", "tea bags" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2548", "instruction": "i want usda organic black tea bags.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "black tea (decaf)" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B07XYG5JF2_2549", "instruction": "i want to find 1 lb of organic breakfast tea bags in raspberry flavor.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "raspberry", "1 pound (pack of 1)" ] }, "asin": "B07XYG5JF2" }, { "task_id": "ws_B09KS5F3SB_2550", "instruction": "i want to find a black king-sized mattress foundation that is 4 inches in width. it needs to come fully assembled already.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "black", "king", "4\" foundation" ] }, "asin": "B09KS5F3SB" }, { "task_id": "ws_B09KS5F3SB_2551", "instruction": "i need a fully assembled black box spring set that is queen sized.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "black", "queen" ] }, "asin": "B09KS5F3SB" }, { "task_id": "ws_B07D3643N8_2552", "instruction": "i would like to buy some size 30 dark blue 405 slim fit jeans.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "dark blue 405", "30" ] }, "asin": "B07D3643N8" }, { "task_id": "ws_B09KRB8Q1R_2553", "instruction": "i need an xx-large tunic that is made of polyester spandex.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "multicolor 2 plaid", "xx-large" ] }, "asin": "B09KRB8Q1R" }, { "task_id": "ws_B09KRB8Q1R_2554", "instruction": "i want a xx-large st. jubileens women roll-up plaid shirt that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "xx-large" ] }, "asin": "B09KRB8Q1R" }, { "task_id": "ws_B08P3D184H_2555", "instruction": "i would like some blue noise cancelling headphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "blue" ] }, "asin": "B08P3D184H" }, { "task_id": "ws_B09NSCYLMZ_2556", "instruction": "will you find me a long sleeve sweater in dark blue? size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "e9-eark blue", "medium" ] }, "asin": "B09NSCYLMZ" }, { "task_id": "ws_B09HSG4ZB7_2557", "instruction": "i'm looking for a teeth whitening toothpaste with natural ingredients that gives fresh breath and used for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening", "natural ingredients", "fresh breath", "sensitive teeth" ], "options": [] }, "asin": "B09HSG4ZB7" }, { "task_id": "ws_B07Z84PP57_2558", "instruction": "i would like to get a 10 inch sea salt and ginger jar candle for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "sea salt & ginger", "10 in" ] }, "asin": "B07Z84PP57" }, { "task_id": "ws_B07Z84PP57_2559", "instruction": "i am looking for a teal scented soy wax jar candle for my living room. also, choose the size 15 oz.", "target_attributes": { "attributes": [ "soy wax", "living room" ], "options": [ "teal", "15 oz" ] }, "asin": "B07Z84PP57" }, { "task_id": "ws_B09QCZ8X76_2560", "instruction": "i am looking for open toe sandals in z3 black that are size 6.5-7.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z3 black", "6.5-7" ] }, "asin": "B09QCZ8X76" }, { "task_id": "ws_B09NLRJ6Q5_2561", "instruction": "i would like to get a a1 10 x 10 ft high def photo background.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "a1", "10x10ft | 3x3m" ] }, "asin": "B09NLRJ6Q5" }, { "task_id": "ws_B087D7HNNF_2562", "instruction": "i'm looking for a can of wild caught sardines in tomato sauce.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "tomato sauce" ] }, "asin": "B087D7HNNF" }, { "task_id": "ws_B08XMJBYTV_2563", "instruction": "i am looking for a gray body brush that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "gray" ] }, "asin": "B08XMJBYTV" }, { "task_id": "ws_B08LD1TTF1_2564", "instruction": "i need a high power sound bar that is black.", "target_attributes": { "attributes": [ "high power" ], "options": [ "black" ] }, "asin": "B08LD1TTF1" }, { "task_id": "ws_B095KC38LG_2565", "instruction": "i am looking for a green table lamp for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green2" ] }, "asin": "B095KC38LG" }, { "task_id": "ws_B09B3PWGPX_2566", "instruction": "i am looking for white day comfort walking shoes that are in a size 8.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "white", "8" ] }, "asin": "B09B3PWGPX" }, { "task_id": "ws_B09LD3LKCN_2567", "instruction": "i'm looking for a mini 11th gen core i7-11700 desktop pc. it needs to have a usb port and 64 gigabytes of storage space on the ram.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "11th gen core i7-11700", "64gb ram 1tb ssd+2tb hdd" ] }, "asin": "B09LD3LKCN" }, { "task_id": "ws_B09LD3LKCN_2568", "instruction": "i'm looking for a desktop computer with the following configuration: 16gb ram 1tb ssd and a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "16gb ram 1tb ssd" ] }, "asin": "B09LD3LKCN" }, { "task_id": "ws_B09LD3LKCN_2569", "instruction": "i'm looking for a mini desktop pc with windows 11, double display 4k resolution.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "amd ryzen 7 3700u" ] }, "asin": "B09LD3LKCN" }, { "task_id": "ws_B09KX93DS7_2570", "instruction": "i would like some pink noise cancelling earbuds that work with my iphone.", "target_attributes": { "attributes": [ "noise cancelling", "compatible apple" ], "options": [ "pink" ] }, "asin": "B09KX93DS7" }, { "task_id": "ws_B08S77S42N_2571", "instruction": "i need a light weight printed backdrop to use with digital photography. it should be 8 by 12 feet in size.", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "printed backdrop 02", "8x12 ft" ] }, "asin": "B08S77S42N" }, { "task_id": "ws_B08S77S42N_2572", "instruction": "i am looking for a 6 foot by 9 foot light weight vinyl backdrop with different size fish motifs.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "6x9 ft" ] }, "asin": "B08S77S42N" }, { "task_id": "ws_B078MZPZ8K_2573", "instruction": "i want to get a bundle of freeze dried pineapples that are 8 oz.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "pineapples", "8 ounce (pack of 6)", "bundle" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2574", "instruction": "i want to buy a bag of organic, chocolate covered, freeze dried strawberry slices, vegan ones please.", "target_attributes": { "attributes": [ "freeze dried", "chocolate covered", "usda organic" ], "options": [ "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2575", "instruction": "find me freeze dried chocolate covered strawberries and mango, need a bag with 2.5 ounce", "target_attributes": { "attributes": [ "freeze dried", "chocolate covered" ], "options": [ "strawberries + mangos", "2.5 ounce (pack of 1)", "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2576", "instruction": "i am looking for a bundle of freeze dried fruits", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bundle" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2577", "instruction": "i need a bag of freeze dried strawberries.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + pineapple" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2578", "instruction": "i want natierra freeze dried strawberry slices.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries 1.2 ounce & peas 2.2 ounce" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2579", "instruction": "i would like non gmo mango slices", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "chocolate mango slices" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2580", "instruction": "i'm looking for a usda organic freeze dried fruits which should be covered in chocolate. also, choose a pack of 1 weighing 1.5 ounce bag with pomegranate arils flavored one.", "target_attributes": { "attributes": [ "freeze dried", "chocolate covered", "usda organic" ], "options": [ "pomegranate arils", "1.5 ounce (pack of 1)", "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2581", "instruction": "i am looking for a bag of chocolate covered strawberry slices.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2582", "instruction": "i'm looking for freeze dried chocolate covered dried fruit with bananas and strawberries flavor in a 1 ounce sized bag.", "target_attributes": { "attributes": [ "freeze dried", "chocolate covered" ], "options": [ "bananas and strawberries", "1 ounce (pack of 1)", "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2583", "instruction": "i am looking for a bag of usda organic freeze dried chocolate covered strawberry slices.", "target_attributes": { "attributes": [ "freeze dried", "chocolate covered", "usda organic" ], "options": [ "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2584", "instruction": "i would like a bag of chocolate covered streawberries and blueberries.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "strawberries + blueberries", "bag" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B078MZPZ8K_2585", "instruction": "i want to buy a bundle of freeze dried mangoes and strawberries. they should be organic and non-gmo.", "target_attributes": { "attributes": [ "freeze dried", "non gmo", "usda organic" ], "options": [ "strawberries 1.2 ounce & mangoes 1.5 oun...", "bundle" ] }, "asin": "B078MZPZ8K" }, { "task_id": "ws_B07BGHK1VQ_2586", "instruction": "i would like a high performance black tablet that has a 9.7 inch screen.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "black", "9.7\"" ] }, "asin": "B07BGHK1VQ" }, { "task_id": "ws_B09FP3Y42D_2587", "instruction": "i'm looking for a height adjustable with pendant light chandelier for living room and dining room. also, choose 8008pl-10light in size.", "target_attributes": { "attributes": [ "height adjustable", "pendant light", "dining room", "living room" ], "options": [ "8008pl-10light" ] }, "asin": "B09FP3Y42D" }, { "task_id": "ws_B094QNTTH2_2588", "instruction": "i need a stainless steel watch with a blue camo top.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "blue camo" ] }, "asin": "B094QNTTH2" }, { "task_id": "ws_B094QNTTH2_2589", "instruction": "i am looking for a painted stainless steel 20mm replacement watch band.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "paint" ] }, "asin": "B094QNTTH2" }, { "task_id": "ws_B002LMBBLW_2590", "instruction": "i would like a cruelty-free coconut scented shampoo.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "coconut" ] }, "asin": "B002LMBBLW" }, { "task_id": "ws_B086DKSHQ4_2591", "instruction": "i need a blink outdoor camera kit that has motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "2 camera kit", "blink outdoor" ] }, "asin": "B086DKSHQ4" }, { "task_id": "ws_B095JSFQKN_2592", "instruction": "i need a four piece shower cap that is for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "4pcs style a" ] }, "asin": "B095JSFQKN" }, { "task_id": "ws_B09PV9L7P8_2593", "instruction": "i would like to buy some easy to install pendant lights for my living room.", "target_attributes": { "attributes": [ "easy install", "pendant light", "living room" ], "options": [] }, "asin": "B09PV9L7P8" }, { "task_id": "ws_B000SKP2B4_2594", "instruction": "i'm looking for some keto friendly peas and beans.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [] }, "asin": "B000SKP2B4" }, { "task_id": "ws_B0794J9TBP_2595", "instruction": "i would like a big fit new cranberry 16.5 neck and 35-35 sleeve shirt that i can take care of in the washing machine.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "new cranberry", "big fit", "16.5\" neck 35\"-36\" sleeve" ] }, "asin": "B0794J9TBP" }, { "task_id": "ws_B072YYHYGB_2596", "instruction": "find me a brushed nickel wall sconce.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [] }, "asin": "B072YYHYGB" }, { "task_id": "ws_B00Y3C225M_2597", "instruction": "i would like a 12 ounce bag of automatic drip coffee beans that are also gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12 ounce (pack of 1)", "automatic drip" ] }, "asin": "B00Y3C225M" }, { "task_id": "ws_B085ZFZZGD_2598", "instruction": "i want to find a silver gray bluetooth projector that has blu ray.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "silver grey" ] }, "asin": "B085ZFZZGD" }, { "task_id": "ws_B09PR5QRN1_2599", "instruction": "i would like a slim fit t-shirt that is xx-large and is the color blue2.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "blue2", "xx-large" ] }, "asin": "B09PR5QRN1" }, { "task_id": "ws_B091KJDJD3_2600", "instruction": "i am looking a 8.5-9 woman non slip thick sole bathroom slipper with open toe also colour should be blue", "target_attributes": { "attributes": [ "non slip", "open toe" ], "options": [ "navy", "8.5-9 women | 7-8 men" ] }, "asin": "B091KJDJD3" }, { "task_id": "ws_B07QW31DK1_2601", "instruction": "i'd like to find 3 pairs of navy socks that are made of nylon spandex.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "3 pairs of navy" ] }, "asin": "B07QW31DK1" }, { "task_id": "ws_B08M9CK173_2602", "instruction": "i need a ottoman for my living room in a primary color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "primary color" ] }, "asin": "B08M9CK173" }, { "task_id": "ws_B000R2Z6AA_2603", "instruction": "i would like some spaghetti that is kosher.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [] }, "asin": "B000R2Z6AA" }, { "task_id": "ws_B08PKQ1ZVR_2604", "instruction": "i am looking for a purple high definition tablet.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "purple" ] }, "asin": "B08PKQ1ZVR" }, { "task_id": "ws_B099521SST_2605", "instruction": "i would like to get a 16 gig black tablet with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black", "1+16g" ] }, "asin": "B099521SST" }, { "task_id": "ws_B081F733F9_2606", "instruction": "i want to get a three pack of lead free tea light candles.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "(3-pack)" ] }, "asin": "B081F733F9" }, { "task_id": "ws_B09JLPBSCS_2607", "instruction": "i am looking for a storage case in the color 1", "target_attributes": { "attributes": [ "storage case" ], "options": [ "#1.0" ] }, "asin": "B09JLPBSCS" }, { "task_id": "ws_B08M3LT2X4_2608", "instruction": "i need a height adjustable blue office chair.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "blue" ] }, "asin": "B08M3LT2X4" }, { "task_id": "ws_B000IB0FGU_2609", "instruction": "i am looking for an antiperspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B000IB0FGU" }, { "task_id": "ws_B08LDH87YJ_2610", "instruction": "i am looking for esay appluing extra shine and long lasting cosmetics in kit 1 color.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "kit 1" ] }, "asin": "B08LDH87YJ" }, { "task_id": "ws_B0751MZBGL_2611", "instruction": "i need some gluten and dairy free fruit snacks.", "target_attributes": { "attributes": [ "gluten free", "dairy free" ], "options": [ "fruit variety pack" ] }, "asin": "B0751MZBGL" }, { "task_id": "ws_B004D8Q9YG_2612", "instruction": "i would like a wine cabinet that's more in a contemporary modern style.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [] }, "asin": "B004D8Q9YG" }, { "task_id": "ws_B09SZP2LTP_2613", "instruction": "i would like to buy a dual band repeater able to work with high speed internet.", "target_attributes": { "attributes": [ "dual band", "high speed" ], "options": [] }, "asin": "B09SZP2LTP" }, { "task_id": "ws_B016S52L2U_2614", "instruction": "find me a zero sugar grape flavored water.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "grape" ] }, "asin": "B016S52L2U" }, { "task_id": "ws_B07HWLYSP6_2615", "instruction": "i would get to get a women's large cranberry t-shirt made from cotton heather .", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "cranberry", "women", "large" ] }, "asin": "B07HWLYSP6" }, { "task_id": "ws_B00478A1TG_2616", "instruction": "i would like to buy some size 5 mocha birkibuc slides with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "mocha birkibuc", "5" ] }, "asin": "B00478A1TG" }, { "task_id": "ws_B09MLWWLXG_2617", "instruction": "i am looking for a manual toothbrush that is for sensitive teeth and is in the color f.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09MLWWLXG" }, { "task_id": "ws_B07CT9LC6Y_2618", "instruction": "i would like a living room wall lamp that is in antique silver and has one light.", "target_attributes": { "attributes": [ "living room" ], "options": [ "antique silver", "1-light" ] }, "asin": "B07CT9LC6Y" }, { "task_id": "ws_B09LCKWKQM_2619", "instruction": "i need a desk for my home office that is easy to assemble and is white.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B09LCKWKQM" }, { "task_id": "ws_B08TVTQ8N6_2620", "instruction": "i am looking for heavy duto wall plates that are an outlet combo.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "rocker | outlet combo" ] }, "asin": "B08TVTQ8N6" }, { "task_id": "ws_B000VWKILI_2621", "instruction": "i want a two pack of hair dye that is in the shade 8rb medium reddish blonde.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "8rb medium reddish blonde", "1 count (pack of 2)" ] }, "asin": "B000VWKILI" }, { "task_id": "ws_B08TLX32NB_2622", "instruction": "i am looking for an orange bag that is easy to carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "orange" ] }, "asin": "B08TLX32NB" }, { "task_id": "ws_B078SJV72L_2623", "instruction": "i would like to get a r9 b75+core pentium g2020 with 16 gigs of ram and a intel core i5 processer router.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "r9 b75+intel pentium g2020", "16g ram 512g ssd" ] }, "asin": "B078SJV72L" }, { "task_id": "ws_B078SJV72L_2624", "instruction": ", i want a router pc core i5 with intel core support 8g ram 128g ssd 1 tb hdd", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "8g ram 128g ssd 1tb hdd" ] }, "asin": "B078SJV72L" }, { "task_id": "ws_B078SJV72L_2625", "instruction": "i'm looking for a router for i5 inter core processor. also, choose 8g ram, 128g ssd and 1td hdd with intel i3 3220, r9 b75 one.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "r9 b75+intel i3 3220", "8g ram 128g ssd 1tb hdd" ] }, "asin": "B078SJV72L" }, { "task_id": "ws_B078SJV72L_2626", "instruction": "i need a router that has 8gb of ram and 240 ssd", "target_attributes": { "attributes": [ "core i5" ], "options": [ "8g ram 240g ssd" ] }, "asin": "B078SJV72L" }, { "task_id": "ws_B078SJV72L_2627", "instruction": "i need an intel core router with 8g ram and 512g ssd.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "8g ram 512g ssd" ] }, "asin": "B078SJV72L" }, { "task_id": "ws_B093KC44SM_2628", "instruction": "i would like a wallet that can be washed in my laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KC44SM" }, { "task_id": "ws_B0736R9BM2_2629", "instruction": "i am looking for gold noise cancelling headphones.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "gold" ] }, "asin": "B0736R9BM2" }, { "task_id": "ws_B09LM7FRS4_2630", "instruction": "i am looking for large leggings that are butt lifting in fog grey.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "fog grey", "large" ] }, "asin": "B09LM7FRS4" }, { "task_id": "ws_B07GGWRRGM_2631", "instruction": "i'm looking for a gold professional hair styling barber gown.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "gold" ] }, "asin": "B07GGWRRGM" }, { "task_id": "ws_B014KZL3II_2632", "instruction": "could you get me listerine toothpaste that takes care of bad breath?", "target_attributes": { "attributes": [ "bad breath" ], "options": [] }, "asin": "B014KZL3II" }, { "task_id": "ws_B01G8DYX96_2633", "instruction": "i'm looking for a ready to hag wall art for dining room and living room. also, choose 3 pcs/set 16*24 inch*3 framed with beach colored one.", "target_attributes": { "attributes": [ "ready hang", "dining room", "living room" ], "options": [ "beach three 12x16inchx3", "3 pcs | set 16x24inchx3 framed" ] }, "asin": "B01G8DYX96" }, { "task_id": "ws_B00GDIMCKE_2634", "instruction": "i am looking for individually wrapped chocolate bars.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B00GDIMCKE" }, { "task_id": "ws_B079R9R7LJ_2635", "instruction": "i need a pack of variety ranch nacho flavorings with low sodium and natural ingredients.", "target_attributes": { "attributes": [ "low sodium", "natural ingredients" ], "options": [ "2 pk - ranch, nacho" ] }, "asin": "B079R9R7LJ" }, { "task_id": "ws_B07MDZS3JB_2636", "instruction": "i need to buy some oils that are gluten free and keto friendly.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [] }, "asin": "B07MDZS3JB" }, { "task_id": "ws_B097RGWN48_2637", "instruction": "i would like to buy some high power binoculars that are good for bird watching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B097RGWN48" }, { "task_id": "ws_B08P3HZZ7Z_2638", "instruction": "i'm looking for a unique designed, daily wear boxer briefs with elastic waistband. also choose medium size with waistband-stars flag printed one.", "target_attributes": { "attributes": [ "unique design", "elastic waistband", "daily wear" ], "options": [ "waistband-stars flag", "medium" ] }, "asin": "B08P3HZZ7Z" }, { "task_id": "ws_B01BHCERTO_2639", "instruction": "i am looking for some maternity skin care that has natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B01BHCERTO" }, { "task_id": "ws_B091CXV8PL_2640", "instruction": "i would like some cupcake toppers that would good at both a birthday party and a baby shower.", "target_attributes": { "attributes": [ "baby shower", "birthday party" ], "options": [] }, "asin": "B091CXV8PL" }, { "task_id": "ws_B08V59PYQC_2641", "instruction": "i need a home office desk chair that is green and made of pu leather", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "green,chrome" ] }, "asin": "B08V59PYQC" }, { "task_id": "ws_B08HLZG1L5_2642", "instruction": "i need a light, short sleeve v-neck shirt in wine red.", "target_attributes": { "attributes": [ "light weight", "short sleeve" ], "options": [ "v-short-wine red" ] }, "asin": "B08HLZG1L5" }, { "task_id": "ws_B09KBVFNTZ_2643", "instruction": "i would like a medium sized long sleeved buttons up polyester cardigan that is able to be machined washed. if they have one in khaki, that'd be great.", "target_attributes": { "attributes": [ "machine wash", "quality polyester", "long sleeve", "button closure" ], "options": [ "khaki", "medium" ] }, "asin": "B09KBVFNTZ" }, { "task_id": "ws_B00ECU8IAI_2644", "instruction": "i would like a wall lamp with a nickel finish.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [] }, "asin": "B00ECU8IAI" }, { "task_id": "ws_B015D7BLWK_2645", "instruction": "i need a high speed usb flash drive that is 32 gb", "target_attributes": { "attributes": [ "high speed" ], "options": [ "32gb" ] }, "asin": "B015D7BLWK" }, { "task_id": "ws_B07NQLC9KN_2646", "instruction": "i would like to get a 5 pack of 4 ounce tea tree soap.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "4 ounce (pack of 5)" ] }, "asin": "B07NQLC9KN" }, { "task_id": "ws_B09GXZJLB1_2647", "instruction": "i am looking for light blonde hair extensions that are 18 inches long.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "ba#16 | 22 light blonde highlighted golden blonde", "18 inch" ] }, "asin": "B09GXZJLB1" }, { "task_id": "ws_B0892HTXP7_2648", "instruction": "i want to buy a faux leather ottoman that are 80 by 45 by 40 cm.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "80*45*40cm" ] }, "asin": "B0892HTXP7" }, { "task_id": "ws_B09K5CDZQN_2649", "instruction": "i need pendant lights that are a size a18", "target_attributes": { "attributes": [ "pendant light" ], "options": [ "a18" ] }, "asin": "B09K5CDZQN" }, { "task_id": "ws_B09FKCTDPS_2650", "instruction": "i'm trying to find an 8 oz bag of sprinkles for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "8 oz" ] }, "asin": "B09FKCTDPS" }, { "task_id": "ws_B096FF85FB_2651", "instruction": "i would like a twin sizes grey bed made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey", "twin" ] }, "asin": "B096FF85FB" }, { "task_id": "ws_B0082JO8SG_2652", "instruction": "get me a solid wood king bed with a box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "king" ] }, "asin": "B0082JO8SG" }, { "task_id": "ws_B0836N74PN_2653", "instruction": "i am looking for a high quality hair brush.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B0836N74PN" }, { "task_id": "ws_B09NSBPS7F_2654", "instruction": "i would like to buy small blue toothbrushes for my toddler's sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "blue", "small(age1-8)" ] }, "asin": "B09NSBPS7F" }, { "task_id": "ws_B09NKN53K1_2655", "instruction": "i am looking for black power amplifier speakerphones.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "black" ] }, "asin": "B09NKN53K1" }, { "task_id": "ws_B08QJ9BDSJ_2656", "instruction": "i would like to buy a black stainless steel heavy duty file cabinet with two drawers.", "target_attributes": { "attributes": [ "heavy duty", "stainless steel" ], "options": [ "black", "2 drawers" ] }, "asin": "B08QJ9BDSJ" }, { "task_id": "ws_B078SX7N2Z_2657", "instruction": "i want to purchase from men's clothing a pair of men's retro jeans with the relaxed fit and boot cut. needs to be long lasting, comfortable fitting and in a relaxed fit. must be a size 35 waist and 36 long in rockdale color.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit", "relaxed fit" ], "options": [ "rockdale", "35w x 36l" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2658", "instruction": "i would like a pair of 32w x 33l rocky top regular fit jeans that are long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "rocky top", "regular", "32w x 33l" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2659", "instruction": "i would like a pair of bryson slim fit jeans with a comfortable relaxed fit. my size is 30w x 34l", "target_attributes": { "attributes": [ "comfortable fit", "relaxed fit" ], "options": [ "bryson", "slim", "30w x 34l" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2660", "instruction": "i need men's boot cut jeans that has a relaxed fit. it should be 36 wide and 30 long.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "36w x 30l" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2661", "instruction": "i would like comfortable fit jeans in the lakeport color", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "lakeport" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2662", "instruction": "i am looking for a pair of long lasting placid blue men's jeans.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "placid blue" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B078SX7N2Z_2663", "instruction": "i want to find men's jeans with a relaxed, big and tall fit. the jeans should be in size 34 and have an antique wash.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "antique wash", "big & tall", "34" ] }, "asin": "B078SX7N2Z" }, { "task_id": "ws_B084TJLG4C_2664", "instruction": "i would like to buy a 70 by 70 inch pattern 4 table cloth that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "pattern04", "70\"x70\"(diameter 178cm)" ] }, "asin": "B084TJLG4C" }, { "task_id": "ws_B087CYM49L_2665", "instruction": "i would like to get a 24 pack of 7.5 ounce bottles of non-gmo classic tonic.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "classic tonic", "7.5 fl oz (pack of 24)" ] }, "asin": "B087CYM49L" }, { "task_id": "ws_B082NWZD2B_2666", "instruction": "i need a cosmetic bag for my nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B082NWZD2B" }, { "task_id": "ws_B089LP3TJD_2667", "instruction": "i am looking for an alcohol free mouthwash", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B089LP3TJD" }, { "task_id": "ws_B08Y3XH857_2668", "instruction": "i would like to buy a valentine's day party bag with 60 chocolate individually wrapped candies.", "target_attributes": { "attributes": [ "individually wrapped", "valentine day" ], "options": [] }, "asin": "B08Y3XH857" }, { "task_id": "ws_B09CGV29FK_2669", "instruction": "i need a high quality pink toiletry bag.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pink" ] }, "asin": "B09CGV29FK" }, { "task_id": "ws_B08KSRV6RX_2670", "instruction": "i would like a travel size 0.27 fluid ounce of lanvin eclat d'arpege impression perfume.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "lanvin eclat d'arpege impression", "0.27 fl oz (pack of 1)" ] }, "asin": "B08KSRV6RX" }, { "task_id": "ws_B08KSRV6RX_2671", "instruction": "i need a travel size perfume with a frederic malle scent.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "frederic malle music for a while impress..." ] }, "asin": "B08KSRV6RX" }, { "task_id": "ws_B08KSRV6RX_2672", "instruction": "i am looking for a travel sized bottle of chanel number 5.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "chanel no:5 eau premiere impression" ] }, "asin": "B08KSRV6RX" }, { "task_id": "ws_B08KSRV6RX_2673", "instruction": "show me a high quality long lasting travel size christian dior ambre nuit impression perfume in 5ml size.", "target_attributes": { "attributes": [ "travel size", "long lasting", "high quality" ], "options": [ "christian dior ambre nuit impression", "0.17 fl oz | 5ml" ] }, "asin": "B08KSRV6RX" }, { "task_id": "ws_B08WKC5NQV_2674", "instruction": "i need a table that is easy to assemble and that is honey pine", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "02 honey pine" ] }, "asin": "B08WKC5NQV" }, { "task_id": "ws_B0071K49JA_2675", "instruction": "i am looking for a light fixture that is brushed nickel.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "brushed nickel" ] }, "asin": "B0071K49JA" }, { "task_id": "ws_B08NDPZBLK_2676", "instruction": "i am looking for solid wood chairs in a dusty pink color", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "dusty pink" ] }, "asin": "B08NDPZBLK" }, { "task_id": "ws_B08L6LR44Q_2677", "instruction": "i would like a kronos phone case that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "kronos" ] }, "asin": "B08L6LR44Q" }, { "task_id": "ws_B00B1H8VMU_2678", "instruction": "i need an original orzo that is low carb and is 1.3 pounds.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "original", "1.3 pound (pack of 1)" ] }, "asin": "B00B1H8VMU" }, { "task_id": "ws_B076B52CFD_2679", "instruction": "i am looking for low fat jalapeno jerky that is 4 ounces.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "jalapeno", "4 ounce (pack of 1)" ] }, "asin": "B076B52CFD" }, { "task_id": "ws_B076B52CFD_2680", "instruction": "get me some triple dog dare jerky. it should be high in protein and low in fat.", "target_attributes": { "attributes": [ "low fat", "high protein" ], "options": [ "triple dog dare" ] }, "asin": "B076B52CFD" }, { "task_id": "ws_B076B52CFD_2681", "instruction": "i am looking for low fat in honey chipotle bbg", "target_attributes": { "attributes": [ "low fat" ], "options": [ "honey chipotle bbq" ] }, "asin": "B076B52CFD" }, { "task_id": "ws_B07SSJQ7VK_2682", "instruction": "i would like to buy a 2'3\" x 22' green rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green | ivory", "2'3\" x 22'" ] }, "asin": "B07SSJQ7VK" }, { "task_id": "ws_B07SSJQ7VK_2683", "instruction": "i need an area rug for the dining room that is 3ft by 5ft and is ivory and brown.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "ivory | brown", "3' x 5'" ] }, "asin": "B07SSJQ7VK" }, { "task_id": "ws_B09J14SLPH_2684", "instruction": "i need a men's size 13 and a half casual walking show with a rubber sole, and it needs to fit comfortably. i want a unique design like a turtle or elephant doodle.", "target_attributes": { "attributes": [ "rubber sole", "comfortable fit", "unique design" ], "options": [ "13.5" ] }, "asin": "B09J14SLPH" }, { "task_id": "ws_B096ZZXGSQ_2685", "instruction": "i need a button down shirt with a long sleeve for a evereday wear medium size with v neck", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B096ZZXGSQ" }, { "task_id": "ws_B08DTWTKTY_2686", "instruction": "i am looking for a bathroom light with farmhouse vanity light", "target_attributes": { "attributes": [ "bronze finish", "vanity light", "light fixture" ], "options": [] }, "asin": "B08DTWTKTY" }, { "task_id": "ws_B08LYHHYJ8_2687", "instruction": "i want to find some hair growth oil that can treat dry and damaged hair. it must have long-lasting effects.", "target_attributes": { "attributes": [ "long lasting", "damaged hair", "dry hair" ], "options": [] }, "asin": "B08LYHHYJ8" }, { "task_id": "ws_B07TSMXFSZ_2688", "instruction": "i am looking for a vidaxl sheesham wood dining table of light brown color with coated steel for dining room.", "target_attributes": { "attributes": [ "coated steel", "dining room" ], "options": [ "light brown" ] }, "asin": "B07TSMXFSZ" }, { "task_id": "ws_B08QDRTNCS_2689", "instruction": "i'm looking for a sound bar that fits a honda 2016-2022 with a pioneer 5 utv", "target_attributes": { "attributes": [ "high power", "plug play" ], "options": [] }, "asin": "B08QDRTNCS" }, { "task_id": "ws_B073H4R7V8_2690", "instruction": "i'm looking for a 2 ounce bag of kool ranch kale chips that are non-gmo and gluten free.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "kool ranch", "2 ounce (pack of 1)" ] }, "asin": "B073H4R7V8" }, { "task_id": "ws_B071GVXG5C_2691", "instruction": "i'm looking for a deep conditioning hair mask for dry hair that contains argan oil.", "target_attributes": { "attributes": [ "argan oil", "dry hair" ], "options": [] }, "asin": "B071GVXG5C" }, { "task_id": "ws_B09PF39V68_2692", "instruction": "i want to get a box of chocolates that's handcrafted and a gift set.", "target_attributes": { "attributes": [ "hand crafted", "gift set" ], "options": [] }, "asin": "B09PF39V68" }, { "task_id": "ws_B01FRP21K4_2693", "instruction": "i'm looking for low sodium tuna fish in a 6.3 ounce container , preferably in a 6 pack . please also select the ones that have been flavored with tomato & olives.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "tomato & olives", "6.3 ounce (pack of 6)" ] }, "asin": "B01FRP21K4" }, { "task_id": "ws_B01FRP21K4_2694", "instruction": "i would like some wild caught tuna fish that is a jalapeno flavor.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "jalapeno" ] }, "asin": "B01FRP21K4" }, { "task_id": "ws_B07Y7XTHCT_2695", "instruction": "i would to have 12 piece cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07Y7XTHCT" }, { "task_id": "ws_B07Y7XTHCT_2696", "instruction": "i am looking for a trolls themed cupcake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "trolls" ] }, "asin": "B07Y7XTHCT" }, { "task_id": "ws_B07Y7XTHCT_2697", "instruction": "i would like some toy cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "toy" ] }, "asin": "B07Y7XTHCT" }, { "task_id": "ws_B00RXUKSSO_2698", "instruction": "i want a contemporary style solid wood fabric ottoman colour should be light grey", "target_attributes": { "attributes": [ "contemporary style", "solid wood" ], "options": [ "light gray" ] }, "asin": "B00RXUKSSO" }, { "task_id": "ws_B00RXUKSSO_2699", "instruction": "look for chairs that have a contemporary style and come in azure.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "azure" ] }, "asin": "B00RXUKSSO" }, { "task_id": "ws_B00RXUKSSO_2700", "instruction": "i would like a mid century oatmeal sofa ottoman made with solid wood.", "target_attributes": { "attributes": [ "mid century", "solid wood" ], "options": [ "oatmeal", "sofa" ] }, "asin": "B00RXUKSSO" }, { "task_id": "ws_B00RXUKSSO_2701", "instruction": "i need a mid-century ottoman that's upholstered in oatmeal fabric.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "oatmeal" ] }, "asin": "B00RXUKSSO" }, { "task_id": "ws_B08Y6T1TYN_2702", "instruction": "i am looking super soft speed sports car fleece throw blanket for boys girls extreme sports theme plush blanket cool tie dye decor fuzzy blanket for sofa bed couch for living room.", "target_attributes": { "attributes": [ "super soft", "fleece throw", "living room" ], "options": [ "throw" ] }, "asin": "B08Y6T1TYN" }, { "task_id": "ws_B093YSPPVX_2703", "instruction": "set of 3 blouse hosiery normal-1, tradional-1, modern-1including matching clothes.", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093YSPPVX" }, { "task_id": "ws_B005OLG5XG_2704", "instruction": "i just ran out of my foundation. i need you to buy me another one. make sure it is the mehron brand, is cruelty free, and oh! make sure it is the small one. i think it is .75 ounce size.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "0.75 ounce" ] }, "asin": "B005OLG5XG" }, { "task_id": "ws_B091GQTPT5_2705", "instruction": "i am looking for some colorful life canvas art for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "colorful life" ] }, "asin": "B091GQTPT5" }, { "task_id": "ws_B09B7GFR12_2706", "instruction": "find light weight running shoes that can be worn for general outdoor activities and on hiking trails. my size is 40 m eu and i want the color to be 8-4 red.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "8-4 red", "40 m eu" ] }, "asin": "B09B7GFR12" }, { "task_id": "ws_B09B7GFR12_2707", "instruction": "i am looking for some lightweight hiking shoes that are yellow and a size 39m", "target_attributes": { "attributes": [ "light weight" ], "options": [ "8-4 gray yellow40", "39 m eu" ] }, "asin": "B09B7GFR12" }, { "task_id": "ws_B07CJL35KV_2708", "instruction": "i am looking for sea salt body skin scrub consisting of natural ingredients with pack size of 3.4 fl oz.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "3.4 fl oz (pack of 1)" ] }, "asin": "B07CJL35KV" }, { "task_id": "ws_B00GJBI1GY_2709", "instruction": "i want to purchase a machine washable maroon-colored long sleeve men's t-shirt. my size is 3x-large.", "target_attributes": { "attributes": [ "machine wash", "long sleeve" ], "options": [ "maroon | cardinal(2 pack)", "3x-large" ] }, "asin": "B00GJBI1GY" }, { "task_id": "ws_B00GJBI1GY_2710", "instruction": "i am looking for irish-gold color men's t-shirt having long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "irish-gold" ] }, "asin": "B00GJBI1GY" }, { "task_id": "ws_B09P1CWJTM_2711", "instruction": "i am looking for a water flosser and toothbrush combo in one, specifically one that is clinically proven to help with bad breath.", "target_attributes": { "attributes": [ "clinically proven", "bad breath" ], "options": [] }, "asin": "B09P1CWJTM" }, { "task_id": "ws_B0829QW29B_2712", "instruction": "i want to get a fruit snack pack from the bare baked company. it should be both fat free and coconut flavored. i also prefer the 16-pack of the 0.53 ounce size.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "coconut" ] }, "asin": "B0829QW29B" }, { "task_id": "ws_B078HYQQBD_2713", "instruction": "i am looking for silicone body scrubber for sink care massage", "target_attributes": { "attributes": [ "easy clean", "sensitive skin" ], "options": [ "light blue+green", "1st generation" ] }, "asin": "B078HYQQBD" }, { "task_id": "ws_B078HYQQBD_2714", "instruction": "i want to find a gray-colored body scrubber that i can use on sensitive skin. if you can find me something that's second generation that would be helpful.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "gray" ] }, "asin": "B078HYQQBD" }, { "task_id": "ws_B093J2HCY5_2715", "instruction": "could you find me a cruelty and paraben free fragrance? i'm hoping to find one with the sofia isabel scent.", "target_attributes": { "attributes": [ "paraben free", "cruelty free" ], "options": [ "sofia isabel" ] }, "asin": "B093J2HCY5" }, { "task_id": "ws_B094HWX388_2716", "instruction": "i am looking for a camera lens protector case in silver color for samsung mobile , also easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "silver" ] }, "asin": "B094HWX388" }, { "task_id": "ws_B07QL5DZ3W_2717", "instruction": "i am looking for a high quality healifty dental floss oral tooth brush kit which is easy to carry.", "target_attributes": { "attributes": [ "easy carry", "high quality" ], "options": [] }, "asin": "B07QL5DZ3W" }, { "task_id": "ws_B01N8WV4EQ_2718", "instruction": "i'm looking for an easy to use roofull external cd dvd +/-rw drive usb 3.0 protable usb dvd/cd rom burner optical drive player reader writer for windows carrying case in silver.", "target_attributes": { "attributes": [ "easy use", "carrying case" ], "options": [ "silver" ] }, "asin": "B01N8WV4EQ" }, { "task_id": "ws_B08ZHGYXZ2_2719", "instruction": "i'm looking for a shampoo paraben free and a conditioner same as shampoo", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "conditioner" ] }, "asin": "B08ZHGYXZ2" }, { "task_id": "ws_B09R3XL9WW_2720", "instruction": "can you find me a hair growth serum that is made from natural ingredients, that will aid in hair growth and also aid in restoring damaged hair to it's healthiest state. i would like one individually-sized package.", "target_attributes": { "attributes": [ "natural ingredients", "hair growth", "damaged hair" ], "options": [] }, "asin": "B09R3XL9WW" }, { "task_id": "ws_B09MFR5LBR_2721", "instruction": "i need a long lasting eyebrow shaping kit for brown eyebrows.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "light brown" ] }, "asin": "B09MFR5LBR" }, { "task_id": "ws_B09Q963B2M_2722", "instruction": "i'm looking for medium sized workout and yoga leggings or tights in green, with butt lifting and high waist.", "target_attributes": { "attributes": [ "butt lifting", "high waist" ], "options": [ "green", "medium" ] }, "asin": "B09Q963B2M" }, { "task_id": "ws_B06XQXG52M_2723", "instruction": "i'm looking for fine mist body spray the bottle continues the warm of water.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "body spray" ] }, "asin": "B06XQXG52M" }, { "task_id": "ws_B06XQXG52M_2724", "instruction": "i'm looking for fine mist body spray fragrance it produces continues stream of water.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "8 fl oz green tea & pear + 8 fl oz periw...", "body spray" ] }, "asin": "B06XQXG52M" }, { "task_id": "ws_B09Q15T1R5_2725", "instruction": "can you help me find a st. patrick's day themed cupcake topper? i need a shamrock design, and 24-60 of them.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "24pcs" ] }, "asin": "B09Q15T1R5" }, { "task_id": "ws_B097CBRG67_2726", "instruction": "i want to purchase dental tools and equipment's such as oral care dental tools, tarter scraper , professional dental picks, plaque remover, dentist pick stainless steel design as tarter scraper", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "tarter scraper" ] }, "asin": "B097CBRG67" }, { "task_id": "ws_B07TMFCFF5_2727", "instruction": "i have choose size 38 to high heel for the summer", "target_attributes": { "attributes": [ "high heel" ], "options": [ "38" ] }, "asin": "B07TMFCFF5" }, { "task_id": "ws_B093KY48TK_2728", "instruction": "i need a wood sculpture or a statue of a casual woman for home, living room, or wine cabinet.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B093KY48TK" }, { "task_id": "ws_B00E4MJ0A6_2729", "instruction": "i am looking to buy a fragrance free deodrant. it would be great if it comes in a pack of 12.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "2.25 ounce (pack of 12)" ] }, "asin": "B00E4MJ0A6" }, { "task_id": "ws_B077ZKVC9C_2730", "instruction": "i am looking for white color reebok men's sneaker with rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "white | light solid grey" ] }, "asin": "B077ZKVC9C" }, { "task_id": "ws_B09P59GGXN_2731", "instruction": "i'm looking for a pair of women's high heel with closed toe. i want pink and in size 9.", "target_attributes": { "attributes": [ "closed toe", "high heel" ], "options": [ "pink", "9" ] }, "asin": "B09P59GGXN" }, { "task_id": "ws_B09RKHSBSC_2732", "instruction": "i am searching for some men's briefs but something fun. maybe you could find some with some elephants on them. i want them to be red and a large in size. also, it is important for convenience that they be machine washable as well.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "red", "large" ] }, "asin": "B09RKHSBSC" }, { "task_id": "ws_B08149X85L_2733", "instruction": "i am looking for a nacho flavored tortilla chip dip, preferably in a grain free version.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "nacho" ] }, "asin": "B08149X85L" }, { "task_id": "ws_B08149X85L_2734", "instruction": "i'm looking for a siete chip tortilla", "target_attributes": { "attributes": [ "grain free" ], "options": [ "no salt", "5 ounce (pack of 6)" ] }, "asin": "B08149X85L" }, { "task_id": "ws_B09C6NCGWZ_2735", "instruction": "i'm looking for a desktop computer with intel core i5 processor which includes of 8gb ram, 512gb nvme ssd + 500gb hdd", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "8gb ram | 512gb nvme ssd + 500gb hdd" ] }, "asin": "B09C6NCGWZ" }, { "task_id": "ws_B00CWTT73I_2736", "instruction": "i want a french vanilla flavor lactose free coffee creamer ,16 fl oz", "target_attributes": { "attributes": [ "lactose free" ], "options": [ "french vanilla", "16 fl oz (pack of 1)" ] }, "asin": "B00CWTT73I" }, { "task_id": "ws_B08W2JDWQZ_2737", "instruction": "i want you to buy me a vanity light which should have 4 led lights, i prefer it to be black and it should be dimmable.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "dimmable-black", "4-light" ] }, "asin": "B08W2JDWQZ" }, { "task_id": "ws_B09MTCCBLK_2738", "instruction": "i want a large tracksuit with long sleeves for my gym workout. get it in gray.", "target_attributes": { "attributes": [ "long sleeve", "gym workout" ], "options": [ "06 gray", "large" ] }, "asin": "B09MTCCBLK" }, { "task_id": "ws_B09C5XB6NL_2739", "instruction": "i am looking lightweight non slip breathable runner shoe for woman size-37 i", "target_attributes": { "attributes": [ "non slip" ], "options": [ "37 i" ] }, "asin": "B09C5XB6NL" }, { "task_id": "ws_B09GBKX685_2740", "instruction": "i'm looking for a 4g-lte blue 16gb unlocked alcatel 1 5in quad core", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "blue", "16gb" ] }, "asin": "B09GBKX685" }, { "task_id": "ws_B095HHW5BM_2741", "instruction": "i am looking for a pendant light with a merlin's beard color that is easy to install.", "target_attributes": { "attributes": [ "easy install", "pendant light" ], "options": [ "merlin's beard" ] }, "asin": "B095HHW5BM" }, { "task_id": "ws_B082DKQGRR_2742", "instruction": "i am looking for a de-stressing/calming tea that is sugar free, decaf, gluten free, non-gmo, and includes 20 bags.", "target_attributes": { "attributes": [ "sugar free", "non gmo", "caffeine free", "gluten free" ], "options": [ "calming" ] }, "asin": "B082DKQGRR" }, { "task_id": "ws_B003I567W4_2743", "instruction": "place order for a pack of 12 blue diamond almonds that is gluten free and has the pecan flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pecan" ] }, "asin": "B003I567W4" }, { "task_id": "ws_B08R9Y462N_2744", "instruction": "i am looking for a powerful, double sided, silicone back scrubber in the color orange.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "orange" ] }, "asin": "B08R9Y462N" }, { "task_id": "ws_B01MT5PQ9L_2745", "instruction": "i'm looking for a car amp/speaker combo with 8 gauge amp wiring kit with four 450 watt kickers cs series with 2 way car coaxials and a 4 channel bluetooth amp included.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B01MT5PQ9L" }, { "task_id": "ws_B07B2W2Z5Z_2746", "instruction": "i am looking for a cotton sheet set for a light blue king size bed", "target_attributes": { "attributes": [ "king size" ], "options": [ "b. light blue" ] }, "asin": "B07B2W2Z5Z" }, { "task_id": "ws_B07B2W2Z5Z_2747", "instruction": "i would like a moon rock gray standard sized pillow case that long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "i. moon rock grey", "standard pillowcases" ] }, "asin": "B07B2W2Z5Z" }, { "task_id": "ws_B083GRHCNT_2748", "instruction": "i'd like to some lands' end men's 11 inches chino shorts that i can machine wash. the size i'm looking for is a 38 regular.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "38 regular" ] }, "asin": "B083GRHCNT" }, { "task_id": "ws_B00VB1WWB2_2749", "instruction": "i am looking for some fat free snacks size of 2.85", "target_attributes": { "attributes": [ "fat free" ], "options": [ "2.85 ounce (pack of 4)" ] }, "asin": "B00VB1WWB2" }, { "task_id": "ws_B07Z84DVDG_2750", "instruction": "i am looking for a teal scented jar candle, it should be white in color and at least 10inch long.", "target_attributes": { "attributes": [ "white item" ], "options": [ "teal", "10 in" ] }, "asin": "B07Z84DVDG" }, { "task_id": "ws_B07Z84DVDG_2751", "instruction": "i am looking for a 15oz white jar candles", "target_attributes": { "attributes": [ "white item" ], "options": [ "15 oz" ] }, "asin": "B07Z84DVDG" }, { "task_id": "ws_B09BKKFY87_2752", "instruction": "i'm looking for mens sport casual thong sandals, open toe, and better color black .", "target_attributes": { "attributes": [ "open toe" ], "options": [ "3#black" ] }, "asin": "B09BKKFY87" }, { "task_id": "ws_B07V3GG42F_2753", "instruction": "get me a low fat bacon jerky. make sure it is of maple flavour.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "maple" ] }, "asin": "B07V3GG42F" }, { "task_id": "ws_B000T5QN5M_2754", "instruction": "i'm looking for a 1 fl oz package high quality, long-lasting liquid foundation with spf that is oil-free. also, choose shade 460 - macadamia", "target_attributes": { "attributes": [ "oil free", "long lasting", "high quality" ], "options": [ "460 macadamia", "1 fl oz (pack of 1)" ] }, "asin": "B000T5QN5M" }, { "task_id": "ws_B000T5QN5M_2755", "instruction": "colorstay makeup for normal/dry skin which is oil free and in 1.0 fluid ounce", "target_attributes": { "attributes": [ "oil free", "high quality", "dry skin" ], "options": [ "1.0 fluid ounce" ] }, "asin": "B000T5QN5M" }, { "task_id": "ws_B07F282LLM_2756", "instruction": "i want to find a pair of green camo size 40w x 34l slim-fit men\u2019s cargo pants", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "green, camo", "40w x 34l" ] }, "asin": "B07F282LLM" }, { "task_id": "ws_B07F282LLM_2757", "instruction": "men's slim-fit stretch cargo pant in dark khaki brown color with size 32wx34i and button closure suitable for machine wash", "target_attributes": { "attributes": [ "machine wash", "button closure" ], "options": [ "dark khaki brown", "32w x 34l" ] }, "asin": "B07F282LLM" }, { "task_id": "ws_B00ZEBG8CY_2758", "instruction": "low sodium pink salt", "target_attributes": { "attributes": [ "low sodium" ], "options": [] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2759", "instruction": "i need some gluten free special diet seasonings.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "special diet seasonings" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2760", "instruction": "buy me a twenty ounce pack of low-sodium everyday seasonings.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "everyday seasonings", "20 ounce (pack of 1)" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2761", "instruction": "i'm looking for a gluten free all purpose seasoning with himalayan pink salt that is mow in sodium and has no artificial colors. also, choose a pack of 1 weighing 4 ounce in standard size lifestyle pack for everyday seasoning one.", "target_attributes": { "attributes": [ "gluten free", "low sodium", "artificial colors" ], "options": [ "everyday seasonings", "4 ounce (pack of 1)", "lifestyle pack - standard size" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2762", "instruction": "i'm looking for gluten free high protein organic products to buy a groceries shop.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "organic seasonings", "2 ounce (pack of 1)" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2763", "instruction": "i am looking for a gluten free paleo seasoning salt set. i need a pack of 1 containing 20 ounce.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "paleo seasoning set", "20 ounce (pack of 1)" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2764", "instruction": "i would like a standard size three ounce spice gift set that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "spice gift sets", "3 ounce (pack of 1)", "lifestyle pack - standard size" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2765", "instruction": "i would like a pound of 2.01 ounce everyday seasoning bottles that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "everyday seasonings", "1 pound (pack of 1)", "2.01 ounce (pack of 1)" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2766", "instruction": "i am looking for a everyday seasonings flavor of gluten free food & beverage gifts", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "everyday seasonings" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2767", "instruction": "i am interested in some low sodium organic seasonings", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "organic seasonings" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B00ZEBG8CY_2768", "instruction": "i want low sodium paleo powder spice gift sets.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "spice gift sets" ] }, "asin": "B00ZEBG8CY" }, { "task_id": "ws_B093BD5L3T_2769", "instruction": "hello, i'm looking for a decently sized (preferably 80-83cm) bookshelf for my living room and is eco-friendly? thanks", "target_attributes": { "attributes": [ "eco friendly", "storage unit", "living room" ], "options": [ "80*83cm" ] }, "asin": "B093BD5L3T" }, { "task_id": "ws_B09KNNNSB8_2770", "instruction": "i would like to check out size 6 pink open toe fashionable high heeled shoes. would like them also to have a non-slip rubber sole for comfort.", "target_attributes": { "attributes": [ "open toe", "non slip", "fashion design", "high heel", "rubber sole" ], "options": [ "pink", "6" ] }, "asin": "B09KNNNSB8" }, { "task_id": "ws_B09P175BGR_2771", "instruction": "photography studio vintage house corridor a 16 10x10ft/3x3m features: high resolution size 7x5ft l 2.1x1.5m", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "a38" ] }, "asin": "B09P175BGR" }, { "task_id": "ws_B09PDVSSV2_2772", "instruction": "blue color simayixx baby toothbrush made of silicone.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "blue1" ] }, "asin": "B09PDVSSV2" }, { "task_id": "ws_B09NMXFPQV_2773", "instruction": "i need an extra-large multi-colored set of machine-washable men's pajamas with an elastic waistband.", "target_attributes": { "attributes": [ "machine wash", "elastic waistband" ], "options": [ "multi 3", "x-large" ] }, "asin": "B09NMXFPQV" }, { "task_id": "ws_B09MCFKM8J_2774", "instruction": "i'm looking for a easy to clean table linens for the dining room in a valentine's day", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "valentine's dayidt8658" ] }, "asin": "B09MCFKM8J" }, { "task_id": "ws_B07CSRYF9K_2775", "instruction": "500pcs by a box portable makeup facial soft cotton pads soft hypoallergenic and lint free cotton wipes for applying lotion removing face makeup eye makeup and nail polish", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B07CSRYF9K" }, { "task_id": "ws_B07QNS56JS_2776", "instruction": "i am looking for natural magnesium gel deodorant for muscles aches and pains", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "coconut" ] }, "asin": "B07QNS56JS" }, { "task_id": "ws_B07Z5XL9G2_2777", "instruction": "search for a 10 foot, apple mfi certified, usb c fast charging lightning cable that is grey.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "grey", "10ft" ] }, "asin": "B07Z5XL9G2" }, { "task_id": "ws_B07Z5XL9G2_2778", "instruction": "i want a grey fast charging usb c to lightning cable.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "grey" ] }, "asin": "B07Z5XL9G2" }, { "task_id": "ws_B08Z89WJL1_2779", "instruction": "i want a silver color pillow shams set for king and queen size 20 by 30 inches.", "target_attributes": { "attributes": [ "king size" ], "options": [ "silver", "queen 20\" x 30\"" ] }, "asin": "B08Z89WJL1" }, { "task_id": "ws_B086YLCFHH_2780", "instruction": "i'm looking for some hair extensions. i want ones that are a medium brown shade.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown" ] }, "asin": "B086YLCFHH" }, { "task_id": "ws_B08LL72999_2781", "instruction": "i am looking for an ottoman that gives me storage space, and would look nice in my living room. prefer black in color.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "black" ] }, "asin": "B08LL72999" }, { "task_id": "ws_B08N7WFY1K_2782", "instruction": "i would like to buy a 5.3fl oz bottle of shampoo that is certified cruelty free, please.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "5.3 fl oz (pack of 1)" ] }, "asin": "B08N7WFY1K" }, { "task_id": "ws_B092VKXNZV_2783", "instruction": "i would like a purple phone case that's compatible with an iphone 13 pro that has tempered glass and wireless charging.", "target_attributes": { "attributes": [ "tempered glass", "wireless charging" ], "options": [ "purple", "for iphone 13 pro" ] }, "asin": "B092VKXNZV" }, { "task_id": "ws_B08HJ1YQP5_2784", "instruction": "i am looking for high quality hair tie and ponytail holder which is used for hair styling for women and girls.", "target_attributes": { "attributes": [ "high quality", "hair styling" ], "options": [] }, "asin": "B08HJ1YQP5" }, { "task_id": "ws_B083TV2LD4_2785", "instruction": "i want a decorative wine rack ornament for living room wine cabinate", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B083TV2LD4" }, { "task_id": "ws_B09BN9QC14_2786", "instruction": "i am looking for a nice faux leather couch sofa bed with metal legs for my living room. i want the black one.", "target_attributes": { "attributes": [ "faux leather", "metal legs", "living room" ], "options": [ "black" ] }, "asin": "B09BN9QC14" }, { "task_id": "ws_B00NC2HKQK_2787", "instruction": "i am looking for a 2 ft 3 in (10 ft) rugs and pads for my living room that is more beautiful for my dining room also. and i choose dark grey color.", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "dark grey" ] }, "asin": "B00NC2HKQK" }, { "task_id": "ws_B08H58MZNQ_2788", "instruction": "i am looking for an inexpensive tv stand for our 60 inch tv with huge storage space and that should be in ashland pine color", "target_attributes": { "attributes": [ "storage space" ], "options": [ "ashland pine" ] }, "asin": "B08H58MZNQ" }, { "task_id": "ws_B087R97MM2_2789", "instruction": "i am looking for a convertible noisecancelling wireless headset", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "headset", "convertible" ] }, "asin": "B087R97MM2" }, { "task_id": "ws_B004PFUQR8_2790", "instruction": "i'm looking for a certified organic lip balm that is plant based. please find a green tea flavor.", "target_attributes": { "attributes": [ "certified organic", "plant based" ], "options": [ "green tea" ] }, "asin": "B004PFUQR8" }, { "task_id": "ws_B08WTTMFBY_2791", "instruction": "i am looking for a caffeine free fruit tea with natural flavours of mango and passion fruit with pack size of 8 ounce.", "target_attributes": { "attributes": [ "caffeine free", "natural flavors" ], "options": [ "mango-passion fruit", "8 ounce" ] }, "asin": "B08WTTMFBY" }, { "task_id": "ws_B08WTTMFBY_2792", "instruction": "i am looking for a 1 pound quality ingredients of herbal tea", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "1 pound" ] }, "asin": "B08WTTMFBY" }, { "task_id": "ws_B078N5GNJ3_2793", "instruction": "i am looking for long sleeve shirt with 100 percent cotton, it should be washable in machine and particularly solid paper white color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "paper white - solid" ] }, "asin": "B078N5GNJ3" }, { "task_id": "ws_B09FVY55TZ_2794", "instruction": "i'm looking for a non-toxic concealer than contains argan oil, with rich color.", "target_attributes": { "attributes": [ "non toxic", "argan oil" ], "options": [ "rich" ] }, "asin": "B09FVY55TZ" }, { "task_id": "ws_B08VHJ7QQJ_2795", "instruction": "i am looking for a valentine day gift basket for women from assortments & variety gifts category.", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [] }, "asin": "B08VHJ7QQJ" }, { "task_id": "ws_B08KWLZ3FJ_2796", "instruction": "i want to buy 1 dagostino handmade pasta pack of 3 12oz old fashioned rotini from the pasta and noodles for dinner tonight.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "rotini", "12 ounce (pack of 3)" ] }, "asin": "B08KWLZ3FJ" }, { "task_id": "ws_B0767DXJST_2797", "instruction": "toroton dummy security camera in red colour.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B0767DXJST" }, { "task_id": "ws_B08WY87NG5_2798", "instruction": "i want long curly synthetic hair wig 26\" colour darkest brown", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "2 darkest brown" ] }, "asin": "B08WY87NG5" }, { "task_id": "ws_B07WWHQ5TV_2799", "instruction": "i need white cheddar corn puffs from trader joe's,", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B07WWHQ5TV" }, { "task_id": "ws_B002NEPRJA_2800", "instruction": "i looking a hair growth treatment based on tea tree suitable with coconut oil", "target_attributes": { "attributes": [ "tea tree", "coconut oil" ], "options": [] }, "asin": "B002NEPRJA" }, { "task_id": "ws_B08DHXZF2P_2801", "instruction": "im looking for a travel sized long lasting scent from tom ford. preferably from the jasmine musk impression line.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "tom ford jasmine musk impression" ] }, "asin": "B08DHXZF2P" }, { "task_id": "ws_B08DY392W9_2802", "instruction": "i'm looking for a t-rex birthday cake for a birthday party.", "target_attributes": { "attributes": [ "birthday cake", "birthday party" ], "options": [] }, "asin": "B08DY392W9" }, { "task_id": "ws_B07YN7MB5X_2803", "instruction": "open amazon and get labena eye patches to moisturize the dark circules in large size and blue color", "target_attributes": { "attributes": [ "great gift" ], "options": [] }, "asin": "B07YN7MB5X" }, { "task_id": "ws_B09G1CYSWP_2804", "instruction": "i am looking for the king size laojee chunky knit throw blanket in red.", "target_attributes": { "attributes": [ "king size" ], "options": [ "black" ] }, "asin": "B09G1CYSWP" }, { "task_id": "ws_B09MJ7XSNB_2805", "instruction": "i am looking island lights pendant light fixture colour black", "target_attributes": { "attributes": [ "light fixture", "pendant light" ], "options": [ "black" ] }, "asin": "B09MJ7XSNB" }, { "task_id": "ws_B09Q8WCN78_2806", "instruction": "i'm looking for a soft and luxury cot", "target_attributes": { "attributes": [ "tummy control" ], "options": [ "blue" ] }, "asin": "B09Q8WCN78" }, { "task_id": "ws_B01N52Z39P_2807", "instruction": "i'm looking for a high speed and high definition laptop", "target_attributes": { "attributes": [ "high speed", "high definition" ], "options": [] }, "asin": "B01N52Z39P" }, { "task_id": "ws_B07K75LPVL_2808", "instruction": "i am looking for long-sleeved, polyester cotton, matching christmas dresses for my size 11-12 years daughter and i.", "target_attributes": { "attributes": [ "long sleeve", "polyester cotton" ], "options": [ "11-12 years" ] }, "asin": "B07K75LPVL" }, { "task_id": "ws_B01NBF0HI3_2809", "instruction": "i'm looking for a 2 pack speex dp to hdmi cable. also, choose the gold plated option.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10ft\uff082-pack\uff09" ] }, "asin": "B01NBF0HI3" }, { "task_id": "ws_B01NBF0HI3_2810", "instruction": "i need a 10ft 4k hdmi cable that is 1080p hd and is gold plated.", "target_attributes": { "attributes": [ "gold plated", "1080p hd" ], "options": [ "10ft 4k" ] }, "asin": "B01NBF0HI3" }, { "task_id": "ws_B09MKQM8S7_2811", "instruction": "i want to get a desktop tower with tempered glass. it also needs to be 8 gb ddr3 ram and 1 tb hdd.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "8gb ddr3 ram, 1tb hdd" ] }, "asin": "B09MKQM8S7" }, { "task_id": "ws_B004C0I8ZS_2812", "instruction": "i am looking for hair dye for permanent hair and choose 4 dark brown color in size 1 count pack of 3", "target_attributes": { "attributes": [ "permanent hair", "hair dye" ], "options": [ "4 dark brown", "1 count (pack of 3)" ] }, "asin": "B004C0I8ZS" }, { "task_id": "ws_B07MGXZRS3_2813", "instruction": "i'm looking for a rfiver swivel wood tv stand on wheels with a height adjustable for 32 65 inch flat screen tvs and shoud have a storage space with tempered glass style", "target_attributes": { "attributes": [ "height adjustable", "storage space" ], "options": [ "tempered glass" ] }, "asin": "B07MGXZRS3" }, { "task_id": "ws_B091D87QMM_2814", "instruction": "i'm looking for lead free luxury scented candle which last for 25+ hours, it should be in tin voyager.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "voyager", "25+ hour" ] }, "asin": "B091D87QMM" }, { "task_id": "ws_B09S8SV4PM_2815", "instruction": "i looking open toe knee high pump colour shoud be black", "target_attributes": { "attributes": [ "knee high", "open toe" ], "options": [ "sandals shoes a02- black" ] }, "asin": "B09S8SV4PM" }, { "task_id": "ws_B08FY3WDDJ_2816", "instruction": "i want to purchase synthetic hair topper that are 18 inch long and have 4 clips of dark blonde hair with bangs.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "4 clips-dark blonde w | bangs", "18 inch" ] }, "asin": "B08FY3WDDJ" }, { "task_id": "ws_B08FY3WDDJ_2817", "instruction": "i'm looking for synthetic hair care for hair loss .", "target_attributes": { "attributes": [ "synthetic hair", "hair loss" ], "options": [] }, "asin": "B08FY3WDDJ" }, { "task_id": "ws_B07TYJ6RK6_2818", "instruction": "please, look for a couple table lamps for my living room, elegant and finished in wood. also look if a black hardback shade model is available.", "target_attributes": { "attributes": [ "wood finish", "living room" ], "options": [ "black hardback shade" ] }, "asin": "B07TYJ6RK6" }, { "task_id": "ws_B09NN9FK8H_2819", "instruction": "i want a cordless noise-cancelling phone system with volume control and dual keypad. pick the black one.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black", "dual keypad" ] }, "asin": "B09NN9FK8H" }, { "task_id": "ws_B09NN9FK8H_2820", "instruction": "i want to get a computer headset with noise cancelling and hands free accessibility. get the silver one.", "target_attributes": { "attributes": [ "noise cancelling", "hands free" ], "options": [ "silver" ] }, "asin": "B09NN9FK8H" }, { "task_id": "ws_B09NN9FK8H_2821", "instruction": "i am looking for a black | silver color noise cancelling audio & video accessories.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black | silver" ] }, "asin": "B09NN9FK8H" }, { "task_id": "ws_B09NN9FK8H_2822", "instruction": "i would like some black phone system and a size 4 handset with a dual keypad for my computer. it also needs to be noise cancelling.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black | silver", "phone system + accessory", "4 handsets", "dual keypad + link2cell" ] }, "asin": "B09NN9FK8H" }, { "task_id": "ws_B09NN9FK8H_2823", "instruction": "i would like to find noise cancelling headphones, preferably bluetooth. find a silver pair, please.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "silver" ] }, "asin": "B09NN9FK8H" }, { "task_id": "ws_B096NJBMNT_2824", "instruction": "for my daily wear .i am looking for a daily casual and long sleeve woman shirt in brown color with small size.", "target_attributes": { "attributes": [ "daily casual", "long sleeve", "daily wear" ], "options": [ "brown", "small" ] }, "asin": "B096NJBMNT" }, { "task_id": "ws_B07424S7NM_2825", "instruction": "i\u2019m looking for a men\u2019s mesh long sleeve shirt in medium. i prefer white as the color and it must be machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "white", "medium" ] }, "asin": "B07424S7NM" }, { "task_id": "ws_B00VGE809C_2826", "instruction": "i'm looking for a hair treatment product that will repair my damaged hair.", "target_attributes": { "attributes": [ "hair treatment", "damaged hair" ], "options": [] }, "asin": "B00VGE809C" }, { "task_id": "ws_B07M5RPW13_2827", "instruction": "i would like to buy size 7.5 walking shoes for men which are machine washable and have a rubber sole, as for the color i prefer to have them khaki.", "target_attributes": { "attributes": [ "machine washable", "rubber sole" ], "options": [ "khaki", "7.5" ] }, "asin": "B07M5RPW13" }, { "task_id": "ws_B07Z44WYGC_2828", "instruction": "i'm looking for a salted caramel syrup to mix with water. i want it to have natural flavors and i want an item over 20 oz.", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "25.4 fl oz. (pack of 4)" ] }, "asin": "B07Z44WYGC" }, { "task_id": "ws_B07Z44WYGC_2829", "instruction": "i need a pack of gmo free caramel syrup in cane sugar flavor", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "cane sugar", "25.4 fl oz (pack of 1)" ] }, "asin": "B07Z44WYGC" }, { "task_id": "ws_B073Q7RGCS_2830", "instruction": "i'm looking for an easy to install bronze shower curtain rod.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "bronze" ] }, "asin": "B073Q7RGCS" }, { "task_id": "ws_B073Q7RGCS_2831", "instruction": "i want an easy to install amazon basics tension curtain rod made from nickel.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "nickel" ] }, "asin": "B073Q7RGCS" }, { "task_id": "ws_B073Q7RGCS_2832", "instruction": "i am looking for shower curtain rods that are nickel.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "nickel" ] }, "asin": "B073Q7RGCS" }, { "task_id": "ws_B073Q7RGCS_2833", "instruction": "i am looking for a black curtain rod that is 54\"-90\" in size and easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "black", "54-90\"" ] }, "asin": "B073Q7RGCS" }, { "task_id": "ws_B073Q7RGCS_2834", "instruction": "i want an easy to install curtain rod with a white finish. make it 36-62\" in size.", "target_attributes": { "attributes": [ "easy install", "white finish" ], "options": [ "36-62\"" ] }, "asin": "B073Q7RGCS" }, { "task_id": "ws_B096G78S2Y_2835", "instruction": "i'm looking for a product compatible with apple watch se series 6 5 4 3 2 1 40mm 44mm 42mm 38mm leopard/floral hard with tempered glass screen protector cover resistant. also, choose the flowered color", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "flower" ] }, "asin": "B096G78S2Y" }, { "task_id": "ws_B07YDWSKJK_2836", "instruction": "i'm looking for a black color hair dye that is a pack of 3.5 ounce which is easy to use/apply.", "target_attributes": { "attributes": [ "easy apply", "easy use", "hair dye" ], "options": [ "10 black", "3.5 ounce (pack of 1)" ] }, "asin": "B07YDWSKJK" }, { "task_id": "ws_B07YDWSKJK_2837", "instruction": "i would like three light golden blonde boxes of hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "93 light golden blonde", "1 count (pack of 3)" ] }, "asin": "B07YDWSKJK" }, { "task_id": "ws_B07D33WVG4_2838", "instruction": "i'm looking for a flannel fleece blanket for a bed that is super soft and also light purple.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "light purple" ] }, "asin": "B07D33WVG4" }, { "task_id": "ws_B09NMVT3VD_2839", "instruction": "i am looking a easy assemble space saving ottomas having storage space for living room brown color size - 60x36x36cm(24x14x14inch)", "target_attributes": { "attributes": [ "space saving", "easy assemble", "storage space", "living room" ], "options": [ "brown" ] }, "asin": "B09NMVT3VD" }, { "task_id": "ws_B07D6G7P76_2840", "instruction": "i am looking for a food and beverage gift basket having item low carbo high protine grain free", "target_attributes": { "attributes": [ "grain free", "high protein", "low carb", "gift basket" ], "options": [] }, "asin": "B07D6G7P76" }, { "task_id": "ws_B07R4T3ZWN_2841", "instruction": "i am looking for a busy raising ballers softball tank top for mom that is 100% cotton heather that can be washed in a washing machine.should be large in size and dark in colour.", "target_attributes": { "attributes": [ "machine wash", "cotton heather" ], "options": [ "dark heather", "large" ] }, "asin": "B07R4T3ZWN" }, { "task_id": "ws_B078NGY37Y_2842", "instruction": "i need a king size box spring mattress with an 8\" split foundation with a frame", "target_attributes": { "attributes": [ "box spring" ], "options": [ "king size", "8\" split foundation with frame" ] }, "asin": "B078NGY37Y" }, { "task_id": "ws_B00GUY6GH6_2843", "instruction": "i need you to find some handcrafted driving mocs that are comfortable for every day wear. i need size 8", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "8" ] }, "asin": "B00GUY6GH6" }, { "task_id": "ws_B003VTHY74_2844", "instruction": "i am looking a box of non dairy coffee creamer singles. go ahead and get a 50 count box of vanilla.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "vanilla", "box of 50 singles" ] }, "asin": "B003VTHY74" }, { "task_id": "ws_B003VTHY74_2845", "instruction": "i looking cafe mocha flavor non dairy gluten free lactose free coffee creamer box of 180 singles", "target_attributes": { "attributes": [ "non dairy", "lactose free", "gluten free" ], "options": [ "cafe mocha" ] }, "asin": "B003VTHY74" }, { "task_id": "ws_B003VTHY74_2846", "instruction": "i need a box of 360 singles vanilla caramel nestle coffee and shelf stable.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "vanilla caramel", "box of 360 singles" ] }, "asin": "B003VTHY74" }, { "task_id": "ws_B08NC68N41_2847", "instruction": "i'm looking for 45mm stainless steel galaxy watch 3. also the mystic bronze color is preferable.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "mystic bronze", "45mm | 46mm" ] }, "asin": "B08NC68N41" }, { "task_id": "ws_B08MBM3RNB_2848", "instruction": "i want a blue 100 cm x 70 cm ready to hang print to hang on my living room wall.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "blue1-10" ] }, "asin": "B08MBM3RNB" }, { "task_id": "ws_B09C8VJ55X_2849", "instruction": "i would like to buy a 12-pack of low sugar oatmeal cups that are high in protein.", "target_attributes": { "attributes": [ "high protein", "low sugar" ], "options": [ "12-pack" ] }, "asin": "B09C8VJ55X" }, { "task_id": "ws_B09HC1X1N2_2850", "instruction": "i am looking for a hidden camera for surveillance. i want something hd with at least 1080p", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B09HC1X1N2" }, { "task_id": "ws_B07CHVLRLZ_2851", "instruction": "i am looking for best toothpaste for my sensitive teeth", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "natural chocolate" ] }, "asin": "B07CHVLRLZ" }, { "task_id": "ws_B07CHVLRLZ_2852", "instruction": "i am looking for a fluoride free toothpaste for sensitive teeth of natural mixed berry flavour.", "target_attributes": { "attributes": [ "fluoride free", "sensitive teeth" ], "options": [ "natural mixed berry" ] }, "asin": "B07CHVLRLZ" }, { "task_id": "ws_B07Z9MSKY2_2853", "instruction": "i am looking for a portable surge protector power strip that is easy to carry. the surge protector should have a usb port with fast charge capability.", "target_attributes": { "attributes": [ "easy carry", "usb port" ], "options": [] }, "asin": "B07Z9MSKY2" }, { "task_id": "ws_B07R63J13M_2854", "instruction": "i am looking to purchase a short sleeved, button down shirt for my husband. i need something in size 3x, perhaps in black.", "target_attributes": { "attributes": [ "day comfort", "regular fit", "short sleeve", "button closure" ], "options": [ "black", "3x" ] }, "asin": "B07R63J13M" }, { "task_id": "ws_B09RV2KXB4_2855", "instruction": "i want to buy long sleeve daily wear clothing of 95% cotton, 5% polyester particularly in black color.", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "black_c008", "xx-large" ] }, "asin": "B09RV2KXB4" }, { "task_id": "ws_B08QDSM2SM_2856", "instruction": "i am looking for a dust proof speaker system for my motorcycle with high power.", "target_attributes": { "attributes": [ "dust proof", "high power" ], "options": [] }, "asin": "B08QDSM2SM" }, { "task_id": "ws_B091D6252Y_2857", "instruction": "i'm searching for oil hair growth. i would like one with black rice and peppermint.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B091D6252Y" }, { "task_id": "ws_B08J2MWLR3_2858", "instruction": "i'm looking for a black color super soft bedroom rug size 8 feet x 10 feet rectangular in shape and it should be anti-slip.", "target_attributes": { "attributes": [ "super soft" ], "options": [] }, "asin": "B08J2MWLR3" }, { "task_id": "ws_B01LZSM2RW_2859", "instruction": "i'm choosing the kamik women's momentum with their snow boot which include faux fur attribute. also, the color charcoal ii and the size 6.5 wide.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "charcoal ii", "6.5 wide" ] }, "asin": "B01LZSM2RW" }, { "task_id": "ws_B0921FPJND_2860", "instruction": "i'm looking for a two pack of 5 calorie, non-alcoholic margarita mix. i want 24.5 ounce bottles.", "target_attributes": { "attributes": [ "non alcoholic", "low calorie" ], "options": [ "5 calorie margarita" ] }, "asin": "B0921FPJND" }, { "task_id": "ws_B01N1K5RCF_2861", "instruction": "i need an eli mason old fashioned cocktail mixer of 20 fl oz in size", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "20 fl oz (pack of 2)" ] }, "asin": "B01N1K5RCF" }, { "task_id": "ws_B01N1K5RCF_2862", "instruction": "i am looking to buy old fashioned and naturally-flavored bitters that come in a pack of two.", "target_attributes": { "attributes": [ "old fashioned", "natural ingredients" ], "options": [ "10 fl oz (pack of 2)" ] }, "asin": "B01N1K5RCF" }, { "task_id": "ws_B07XG695XV_2863", "instruction": "i am looking for mumumi foldable stool that can be carried for fishing travel, mountaineering camping adventure outing outdoor as well as indoor uses for domestic purpose. red color preferable", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "red" ] }, "asin": "B07XG695XV" }, { "task_id": "ws_B09NMDB4D9_2864", "instruction": "i need a large size slimfit t shirt for men and blouse with short sleeve and crew neck for women for the occassion of valentine's day. color preferred is white.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "12 white", "large" ] }, "asin": "B09NMDB4D9" }, { "task_id": "ws_B08MB5WC38_2865", "instruction": "i want to buy a high definition projector that also has a version for a 5.7 inch phone.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "5.7 inches phone version (720p play mobi..." ] }, "asin": "B08MB5WC38" }, { "task_id": "ws_B09D9DH7YM_2866", "instruction": "i want buy a leakage proof travel size bag case size -30 ml, 50 ml, 100 ml", "target_attributes": { "attributes": [ "leak proof", "travel size" ], "options": [] }, "asin": "B09D9DH7YM" }, { "task_id": "ws_B07BGFTQ4Z_2867", "instruction": "i'm looking for an apple macbook that has an i5 processor and an ssd of at least 128gb, renewed looks nice too.", "target_attributes": { "attributes": [ "certified refurbished", "core i5" ], "options": [] }, "asin": "B07BGFTQ4Z" }, { "task_id": "ws_B09JSQ3FBZ_2868", "instruction": "i'm looking for a halloweenboo and a x small long sleeve and should be for a daily wear and comfortable", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "halloweenboo", "x-small" ] }, "asin": "B09JSQ3FBZ" }, { "task_id": "ws_B0015KBM0Q_2869", "instruction": "i want to find a long lasting perfume for women. if possible, can you get something that is 2 ounces?", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "2 fl oz" ] }, "asin": "B0015KBM0Q" }, { "task_id": "ws_B09LVG9WWJ_2870", "instruction": "i'm looking for a front and rear dual 1080p dash cam with night vision and motion detection that is easy to install.", "target_attributes": { "attributes": [ "easy install", "motion detection" ], "options": [] }, "asin": "B09LVG9WWJ" }, { "task_id": "ws_B085M7NQM4_2871", "instruction": "i'd like to get some sugar free cake toppers, preferably ones that are a mutin color.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "mutin" ] }, "asin": "B085M7NQM4" }, { "task_id": "ws_B095Z5V1HT_2872", "instruction": "i'm looking for a sugarolly - big flavored cotton candy sized box (15) for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "sugarolly - big", "box (15)" ] }, "asin": "B095Z5V1HT" }, { "task_id": "ws_B095Z5V1HT_2873", "instruction": "i would like a lemon cube sugarolloy candy for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "sugarolly cup - lemon", "cube (7)" ] }, "asin": "B095Z5V1HT" }, { "task_id": "ws_B08D3VKKCB_2874", "instruction": "i am looking to purchase bpa free containers with lids to use for storing beauty products and kitchen items. a 24 pack would suffice.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "24" ] }, "asin": "B08D3VKKCB" }, { "task_id": "ws_B07MDV3XQJ_2875", "instruction": "i'm looking for organic gluten free fruit and vegetable sticks that are made of real fruit. i would like the variety flavor.", "target_attributes": { "attributes": [ "gluten free", "real fruit" ], "options": [ "variety (mango & apple)" ] }, "asin": "B07MDV3XQJ" }, { "task_id": "ws_B07MDV3XQJ_2876", "instruction": "i would like a variety box of 0,6 ounce packs of fruit snacks made with real fruit.", "target_attributes": { "attributes": [ "artificial colors" ], "options": [ "variety (4 flavors)", "kid\u2019s 0.6 ounce (value pack) - 6 boxes o..." ] }, "asin": "B07MDV3XQJ" }, { "task_id": "ws_B08HLPQ8YB_2877", "instruction": "find an light brown organic hair dye that is also usda certified organic and is also cruelty free.", "target_attributes": { "attributes": [ "certified organic", "cruelty free", "hair dye" ], "options": [] }, "asin": "B08HLPQ8YB" }, { "task_id": "ws_B07VPD4BB8_2878", "instruction": "i'm looking for a security home camera to see the motion detection at 5 pm", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "5mp" ] }, "asin": "B07VPD4BB8" }, { "task_id": "ws_B00RKNNGUQ_2879", "instruction": "i'm looking for a canon power shot sx610 hs with optical zoom and black colour", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "black" ] }, "asin": "B00RKNNGUQ" }, { "task_id": "ws_B0007SMLUM_2880", "instruction": "please select a 1 pound, certified organic sea salt shaker in the flavor triple blend flakes.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "triple blend flakes", "1 pound (pack of 1)" ] }, "asin": "B0007SMLUM" }, { "task_id": "ws_B08SSG514G_2881", "instruction": "i am looking for samsung galaxy tab s7 with the features like 12.4-inch in size, mystic navy color, 128gb wi-fi bluetooth s pen fast-charging usb-c port, android tablet", "target_attributes": { "attributes": [ "fast charging", "usb port" ], "options": [ "s7 tablet + keyboard" ] }, "asin": "B08SSG514G" }, { "task_id": "ws_B08SSG514G_2882", "instruction": "i want a 512gb samsung galaxy tab s7 with usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "512gb" ] }, "asin": "B08SSG514G" }, { "task_id": "ws_B08FKXJ8N3_2883", "instruction": "i'm looking for a slip resistant sneaker suitable for working in a kitchen, and i want it with a rubber sole, and in size 12.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "12 wide" ] }, "asin": "B08FKXJ8N3" }, { "task_id": "ws_B08DBGLFZC_2884", "instruction": "please find a dell inspiron i3880 desktop pc with 1t hardrive in black. an i5 10th generation intel processor is preferred.", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B08DBGLFZC" }, { "task_id": "ws_B09M9JM4DY_2885", "instruction": "i want a 15 cupcake toppers for a birthday and to be decorated with rose and gold", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "rose gold 100th" ] }, "asin": "B09M9JM4DY" }, { "task_id": "ws_B09NDFLVKC_2886", "instruction": "i'm looking for water resistant telescope for bird watching.", "target_attributes": { "attributes": [ "water resistant", "bird watching" ], "options": [] }, "asin": "B09NDFLVKC" }, { "task_id": "ws_B00C2LBGI0_2887", "instruction": "i'm looking for an xx-large plus elastic closure pants for women. the color can be steel.", "target_attributes": { "attributes": [ "elastic closure" ], "options": [ "steel", "xx-large plus" ] }, "asin": "B00C2LBGI0" }, { "task_id": "ws_B09N1HSDV2_2888", "instruction": "i'm looking for a large t-shirt style dress with long sleeves. i'd like one that is loose fitting and gold in color.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "gold", "large" ] }, "asin": "B09N1HSDV2" }, { "task_id": "ws_B017NWL3I0_2889", "instruction": "can you get a squeeze snack that is gluten free and non gmo, blackberry bliss.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "blackberry bliss" ] }, "asin": "B017NWL3I0" }, { "task_id": "ws_B07MQT5S5D_2890", "instruction": "i'm looking for ready to hang wall art with dimension 12*12 inches 3 pcs for living room. also look for red rose one.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "red rose", "12x12inches*3pcs" ] }, "asin": "B07MQT5S5D" }, { "task_id": "ws_B08QGP2NWQ_2891", "instruction": "i am looking for quick release black color tripods", "target_attributes": { "attributes": [ "quick release" ], "options": [ "black" ] }, "asin": "B08QGP2NWQ" }, { "task_id": "ws_B07XVRZR4P_2892", "instruction": "i am looking for odelia vintage bohemian area living room and dining room in navy sky blue", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "navy | sky blue" ] }, "asin": "B07XVRZR4P" }, { "task_id": "ws_B07XVRZR4P_2893", "instruction": "get me a nine by twelve and a half foot easy clean rug for my dining room. look for the garnet color.", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "garnet | navy", "9' x 12'6\"" ] }, "asin": "B07XVRZR4P" }, { "task_id": "ws_B07XVRZR4P_2894", "instruction": "i am looking for a sky blue easy to clean vintage area rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "navy | sky blue" ] }, "asin": "B07XVRZR4P" }, { "task_id": "ws_B0738H72SJ_2895", "instruction": "i'm looking for refillable purple spray bottles with fine mist settings.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "purple with white cap" ] }, "asin": "B0738H72SJ" }, { "task_id": "ws_B0738H72SJ_2896", "instruction": "i would like a bpa free green bag", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "green with black cap" ] }, "asin": "B0738H72SJ" }, { "task_id": "ws_B0746SNMQD_2897", "instruction": "i want unscented sunscreen lotion for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "unscented sunscreen" ] }, "asin": "B0746SNMQD" }, { "task_id": "ws_B08KWLTT6P_2898", "instruction": "i am looking for natural ingredients handmade pasta linguine of size : 1 pound (pack of 5)", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "1 pound (pack of 5)" ] }, "asin": "B08KWLTT6P" }, { "task_id": "ws_B08KWLTT6P_2899", "instruction": "i want old fashioned dagostino alligator cut pasta.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "alligator cut" ] }, "asin": "B08KWLTT6P" }, { "task_id": "ws_B01N5QBRPK_2900", "instruction": "i am looking for living room in celosia orange", "target_attributes": { "attributes": [ "living room" ], "options": [ "celosia orange" ] }, "asin": "B01N5QBRPK" }, { "task_id": "ws_B06XTF4ZWS_2901", "instruction": "find a chair for home office with memory foam seat", "target_attributes": { "attributes": [ "memory foam" ], "options": [] }, "asin": "B06XTF4ZWS" }, { "task_id": "ws_B097F9L5TQ_2902", "instruction": "i am searching for black color cupcake toppers for the birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "black" ] }, "asin": "B097F9L5TQ" }, { "task_id": "ws_B08937VJLZ_2903", "instruction": "i need plastic hair masks for my hair salon", "target_attributes": { "attributes": [ "hair salon" ], "options": [] }, "asin": "B08937VJLZ" }, { "task_id": "ws_B09P3F2FJC_2904", "instruction": "i want to buy mini projector which is high definition and is of q2 pink color", "target_attributes": { "attributes": [ "high definition" ], "options": [ "q2 pink" ] }, "asin": "B09P3F2FJC" }, { "task_id": "ws_B08RG81CT6_2905", "instruction": "i want a coat rack with white finish", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B08RG81CT6" }, { "task_id": "ws_B096FWZTSM_2906", "instruction": "i would like a white mirror for hair cutting.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "white(without led)" ] }, "asin": "B096FWZTSM" }, { "task_id": "ws_B09NC2ZXDT_2907", "instruction": "i am looking for daily wear pink color lounge", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "a24 pink" ] }, "asin": "B09NC2ZXDT" }, { "task_id": "ws_B08YN43PXK_2908", "instruction": "i am looking for water resistant bone flower pants", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "bone flower style 5.1" ] }, "asin": "B08YN43PXK" }, { "task_id": "ws_B06Y96MXJV_2909", "instruction": "i am looking for gluten free foodie spices", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "foodie gift" ] }, "asin": "B06Y96MXJV" }, { "task_id": "ws_B06Y96MXJV_2910", "instruction": "i need gluten free vegetarian smoked peppered bacon - 4 ounce (pack of 2)", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vegetarian smoked", "4 ounce (pack of 2)" ] }, "asin": "B06Y96MXJV" }, { "task_id": "ws_B07WW8XWXC_2911", "instruction": "i am looking for 0.81 ounce (pack of 80) of gluten free chewy bar with flavored dark chocolate cherry cashew", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "dark chocolate cherry cashew", "0.81 ounce (pack of 80)" ] }, "asin": "B07WW8XWXC" }, { "task_id": "ws_B07Y2STMKS_2912", "instruction": "i am looking for dust proof pink color headphones", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "a-light pink" ] }, "asin": "B07Y2STMKS" }, { "task_id": "ws_B06XHVZDKF_2913", "instruction": "i am looking for a eye mask sheet for dark circles. also choose 120 count size.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "120 count" ] }, "asin": "B06XHVZDKF" }, { "task_id": "ws_B06XHVZDKF_2914", "instruction": "i want to find a package of 10 eye masks that treat dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "10 pair (pack of 1)" ] }, "asin": "B06XHVZDKF" }, { "task_id": "ws_B01GS1QRQK_2915", "instruction": "i want a grey safavieh evoke rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey | ivory" ] }, "asin": "B01GS1QRQK" }, { "task_id": "ws_B01GS1QRQK_2916", "instruction": "i am interested in buying area rug for dining room which is in black or grey color, and is in shape of runner, while the size should be 4 ft x 6 ft", "target_attributes": { "attributes": [ "dining room" ], "options": [ "black | grey", "runner", "4 ft x 6 ft" ] }, "asin": "B01GS1QRQK" }, { "task_id": "ws_B01GS1QRQK_2917", "instruction": "i am looking for a square area rug that is grey and ivory and measures 2 feet by 2 inch by 17 feet.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey | ivory", "square", "2 ft 2 in x 17 ft" ] }, "asin": "B01GS1QRQK" }, { "task_id": "ws_B01GS1QRQK_2918", "instruction": "i am looking for a blue runner rug that is 8 x 10 ft and would work in either my living or dining room.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "blue | ivory", "runner", "8 ft x 10 ft" ] }, "asin": "B01GS1QRQK" }, { "task_id": "ws_B09PSJ2X8W_2919", "instruction": "i am seraching for energy drink with natural berry flavors which was low in calorie and sugar - 4 packet - drink mix", "target_attributes": { "attributes": [ "low sugar", "low calorie", "natural flavors" ], "options": [ "mixed berry", "4 pack" ] }, "asin": "B09PSJ2X8W" }, { "task_id": "ws_B07JFRBHB8_2920", "instruction": "i'm looking for a black hair styling product that is made from natural ingredients and easy to use.", "target_attributes": { "attributes": [ "easy use", "natural ingredients", "hair styling" ], "options": [ "black" ] }, "asin": "B07JFRBHB8" }, { "task_id": "ws_B07GF22SG5_2921", "instruction": "i am looking for grass fed and gluten free pure indian foods madras curry", "target_attributes": { "attributes": [ "grass fed", "gluten free" ], "options": [] }, "asin": "B07GF22SG5" }, { "task_id": "ws_B0855C9FMW_2922", "instruction": "easy application hair filling in black and brown color", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "black | dark brown" ] }, "asin": "B0855C9FMW" }, { "task_id": "ws_B0761VXK2D_2923", "instruction": "i am interested in buying makeup brush which is of high quality and is rose gold.", "target_attributes": { "attributes": [ "high quality", "rose gold" ], "options": [] }, "asin": "B0761VXK2D" }, { "task_id": "ws_B075G2D96J_2924", "instruction": "i am looking for machine washable and with printing technology of ambesonne popstar party throw pillow cushion cover with size 20\"x20\"", "target_attributes": { "attributes": [ "machine washable", "printing technology" ], "options": [ "20\" x 20\"" ] }, "asin": "B075G2D96J" }, { "task_id": "ws_B088F55SJJ_2925", "instruction": "i am looking for a 9x6 ft universe background digital photography which is easy to carry.", "target_attributes": { "attributes": [ "easy carry", "digital photography" ], "options": [ "9x6ft" ] }, "asin": "B088F55SJJ" }, { "task_id": "ws_B07PSM5F54_2926", "instruction": "i would like a button tufted ottoman.", "target_attributes": { "attributes": [ "button tufted" ], "options": [] }, "asin": "B07PSM5F54" }, { "task_id": "ws_B07Q7PT467_2927", "instruction": "i am looking for star wars navy color cute cartoon style graphic hoodie of unisex small size", "target_attributes": { "attributes": [ "star wars" ], "options": [ "navy", "unisex small" ] }, "asin": "B07Q7PT467" }, { "task_id": "ws_B08GL6R84G_2928", "instruction": "i am looking for a eco friendly floating shelves made up of solid wood. also choose bourbon color and 48\" l x 6\"d size.", "target_attributes": { "attributes": [ "eco friendly", "solid wood" ], "options": [ "bourbon", "48\"l x 6\"d" ] }, "asin": "B08GL6R84G" }, { "task_id": "ws_B085ZLFSYB_2929", "instruction": "i would like to buy a computer which is quad core", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B085ZLFSYB" }, { "task_id": "ws_B07BQ36L48_2930", "instruction": "i would like a six boxes of 20 individually wrapped caffeine free tea.", "target_attributes": { "attributes": [ "caffeine free", "individually wrapped" ], "options": [ "20 count (pack of 6)" ] }, "asin": "B07BQ36L48" }, { "task_id": "ws_B093LMVJCG_2931", "instruction": "i'm looking for a wireless, hands free bluetooth speaker.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B093LMVJCG" }, { "task_id": "ws_B08659G11H_2932", "instruction": "i am looking for gluten free, non gmo and dietary fiber organic green banana flour with size: 1 pound (pack of 2)", "target_attributes": { "attributes": [ "gluten free", "non gmo", "dietary fiber" ], "options": [ "1 pound (pack of 2)" ] }, "asin": "B08659G11H" }, { "task_id": "ws_B003VBA33E_2933", "instruction": "i'm looking for a gold plated coaxial cable. also, choose 3ft, white colored one.", "target_attributes": { "attributes": [ "gold plated", "coaxial cable" ], "options": [ "white", "3ft" ] }, "asin": "B003VBA33E" }, { "task_id": "ws_B07XCJMSVS_2934", "instruction": "i'm looking for an extra large, navy blue women's cardigan with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "navy blue", "x-large" ] }, "asin": "B07XCJMSVS" }, { "task_id": "ws_B09GBMYCQ8_2935", "instruction": "i am looking for quad core mxq pro 5g android 10.1 tv box ram 2gb rom 16gb h.265 hd 3d", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B09GBMYCQ8" }, { "task_id": "ws_B00FGINOZ4_2936", "instruction": "i'm looking for an 8 ounce bag of chocolate covered sandwich cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2937", "instruction": "i'm looking for cholate covered cookies for valentines day to gifted for my partner.", "target_attributes": { "attributes": [ "chocolate covered", "valentine day" ], "options": [ "15 ounce (pack of 1)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2938", "instruction": "i would like to find a valentines day gift with chocolate included. a pack sounds ideal", "target_attributes": { "attributes": [ "chocolate covered", "valentine day", "perfect gift" ], "options": [ "8 ounce (pack of 8)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2939", "instruction": "i would like a 8 ounce thanksgiving assortment that's a great gift.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "thanksgiving assortment | dark chocolate", "8 ounce (pack of 1)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2940", "instruction": "i want a 15 ounce sized chocolate covered cookies. it is for a valentine's day gift.", "target_attributes": { "attributes": [ "chocolate covered", "valentine day" ], "options": [ "15 ounce (pack of 15)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2941", "instruction": "i'm looking for a perfect gift for valentines day that should be covered in chocolate. also, choose a pack of 1 weighing 8 ounce, easter cross with flower designed one.", "target_attributes": { "attributes": [ "chocolate covered", "valentine day", "perfect gift" ], "options": [ "easter cross with flower", "8 ounce (pack of 1)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B00FGINOZ4_2942", "instruction": "i'm looking for a perfect gift for valentine day that should be covered in chocolate. also, choose a pack of 1 weighing 1.87 pounds, easter faces assortment designed one.", "target_attributes": { "attributes": [ "chocolate covered", "valentine day", "perfect gift" ], "options": [ "easter faces assortment", "1.87 pound (pack of 1)" ] }, "asin": "B00FGINOZ4" }, { "task_id": "ws_B07DW7TM71_2943", "instruction": "i am looking for ethylene vinyl dr.martens women's nartilla sandal of size:10", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "10" ] }, "asin": "B07DW7TM71" }, { "task_id": "ws_B01MT0PETV_2944", "instruction": "i want shade sails made with stainless steel", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B01MT0PETV" }, { "task_id": "ws_B09FQDJ3L7_2945", "instruction": "i want a sunset solawave 4-in-1 facial wand and serum bundle for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "sunset" ] }, "asin": "B09FQDJ3L7" }, { "task_id": "ws_B0953Q9DVP_2946", "instruction": "i would like a pink cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday cake", "birthday party" ], "options": [ "pink" ] }, "asin": "B0953Q9DVP" }, { "task_id": "ws_B09GFQZXNX_2947", "instruction": "i'm interested in a wireless bluetooth alarm clock that offers stereo sound.", "target_attributes": { "attributes": [ "wireless bluetooth", "stereo sound" ], "options": [] }, "asin": "B09GFQZXNX" }, { "task_id": "ws_B09FZLYK3H_2948", "instruction": "i am looking for easy to use nut gifts", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09FZLYK3H" }, { "task_id": "ws_B09FYRTQ5G_2949", "instruction": "i am looking for a long lasting eye mask for dark circles with cruelty free.", "target_attributes": { "attributes": [ "cruelty free", "sulfate free", "long lasting", "dark circles" ], "options": [] }, "asin": "B09FYRTQ5G" }, { "task_id": "ws_B088KLGCHX_2950", "instruction": "i am looking for anti-aging rose quartz face roller", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B088KLGCHX" }, { "task_id": "ws_B01KMDWKD4_2951", "instruction": "find a gluten free popcorn salt", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B01KMDWKD4" }, { "task_id": "ws_B0925SHCWK_2952", "instruction": "i need 2 packs of 10.6 inch 30w dimmable bi-color soft light panel with batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B0925SHCWK" }, { "task_id": "ws_B09KVF53B4_2953", "instruction": "i am in need of khaki color, x-large size hooded fleece lined sweatshirts for men", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "khaki", "x-large" ] }, "asin": "B09KVF53B4" }, { "task_id": "ws_B09KVF53B4_2954", "instruction": "i'm looking for a camouflage white and gray, fleece-lined hoodie for daily wear in a size 3x-large that is machine washable.", "target_attributes": { "attributes": [ "fleece lined", "machine wash", "daily wear" ], "options": [ "camouflage white gray", "3x-large" ] }, "asin": "B09KVF53B4" }, { "task_id": "ws_B08RHNKL28_2955", "instruction": "i am looking for a long sleeve sleepwear for a man with high waist. also choose light gray color and xx-large size.", "target_attributes": { "attributes": [ "long sleeve", "elastic waist" ], "options": [ "b-light gray", "xx-large" ] }, "asin": "B08RHNKL28" }, { "task_id": "ws_B08RHNKL28_2956", "instruction": "i am looking for men\u2019s pajamas with contrast color also choose size x large", "target_attributes": { "attributes": [ "contrast color" ], "options": [ "x-large" ] }, "asin": "B08RHNKL28" }, { "task_id": "ws_B09QFW7H9D_2957", "instruction": "i am looking a high resolution easy install and easy use 60x usb microphone", "target_attributes": { "attributes": [ "high resolution", "easy install", "easy use" ], "options": [ "a" ] }, "asin": "B09QFW7H9D" }, { "task_id": "ws_B07KBJNGT6_2958", "instruction": "i'm looking for a kosher certified premium salt which is free from gluten. also, choose mediterranean flake one.", "target_attributes": { "attributes": [ "kosher certified", "gluten free" ], "options": [ "mediterranean flake" ] }, "asin": "B07KBJNGT6" }, { "task_id": "ws_B0794RHPZD_2959", "instruction": "i'm looking for a yellow hands-free tablet.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "canary yellow" ] }, "asin": "B0794RHPZD" }, { "task_id": "ws_B07MCCDZ62_2960", "instruction": "i'm looking for a cruelty free certified bronzer which is fragrance free. also choose palm beach ready one.", "target_attributes": { "attributes": [ "fragrance free", "cruelty free" ], "options": [ "1- palm beach ready" ] }, "asin": "B07MCCDZ62" }, { "task_id": "ws_B011DJ19MY_2961", "instruction": "i am looking for soft toe work shoe slip resistant in 10.5", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "10.5" ] }, "asin": "B011DJ19MY" }, { "task_id": "ws_B07FBGWTHN_2962", "instruction": "i need hiking shoes in a size 10 that have a lace closure", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "10" ] }, "asin": "B07FBGWTHN" }, { "task_id": "ws_B09CTMG7S4_2963", "instruction": "i need 6ft red color usb fast charging led lightning cables -1 pack", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "red", "6ft" ] }, "asin": "B09CTMG7S4" }, { "task_id": "ws_B086HHD7JD_2964", "instruction": "i want to buy high waist yoga pants whcih are in azec - black color and are in large size", "target_attributes": { "attributes": [ "high waist" ], "options": [ "aztec - black", "large" ] }, "asin": "B086HHD7JD" }, { "task_id": "ws_B01CH9LTFG_2965", "instruction": "i would like to buy face moisturizer suitable for women which is cruelty free and serves for anti aging", "target_attributes": { "attributes": [ "anti aging", "cruelty free" ], "options": [] }, "asin": "B01CH9LTFG" }, { "task_id": "ws_B09QX7NSN4_2966", "instruction": "i want buy an external hard drive hdd 0.2tb which for pc, mac, desktop, laptop, macbook, chromebook, xbox one, xbox 360 (2tb, silver). it is covered with aluminum alloy. also, i choose the b-red color.", "target_attributes": { "attributes": [ "plug play", "aluminum alloy" ], "options": [ "b-red" ] }, "asin": "B09QX7NSN4" }, { "task_id": "ws_B002HKHLDK_2967", "instruction": "i'm looking for a 2-pack of 12-feet hdmi male-to-female gold-plated cables designed for high speed data transfers.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "2 pack", "12 feet (10-pack)", "hdmi male to female" ] }, "asin": "B002HKHLDK" }, { "task_id": "ws_B09PD7CP9J_2968", "instruction": "i am looking fort a travel size skincare kit with tea tree toner.", "target_attributes": { "attributes": [ "travel size", "tea tree" ], "options": [] }, "asin": "B09PD7CP9J" }, { "task_id": "ws_B00T8I56FY_2969", "instruction": "i looking for blueberry nut free in raspberry", "target_attributes": { "attributes": [ "nut free" ], "options": [ "raspberry" ] }, "asin": "B00T8I56FY" }, { "task_id": "ws_B00T8I56FY_2970", "instruction": "i'm looking for 6 pack of strawberry with nut free", "target_attributes": { "attributes": [ "nut free" ], "options": [ "strawberry", "6 pack" ] }, "asin": "B00T8I56FY" }, { "task_id": "ws_B00T8I56FY_2971", "instruction": "i am looking for a 12 ounce (pack of 3) of nut free baking mixes", "target_attributes": { "attributes": [ "nut free" ], "options": [ "12 ounce (pack of 3)" ] }, "asin": "B00T8I56FY" }, { "task_id": "ws_B01IQX5E7G_2972", "instruction": "i need 24 count, long-lasting alkaline battery", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "24 count" ] }, "asin": "B01IQX5E7G" }, { "task_id": "ws_B07R4D5B4V_2973", "instruction": "i am looking for high performance jelly fish color smartwatch", "target_attributes": { "attributes": [ "high performance" ], "options": [ "colorful jellyfish" ] }, "asin": "B07R4D5B4V" }, { "task_id": "ws_B00CNWY1YY_2974", "instruction": "i want a microdermabrasion face mask with anti aging properties", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B00CNWY1YY" }, { "task_id": "ws_B09CQ9T9NH_2975", "instruction": "i want to buy sandals for women which have closed toe, and rubber sole, i want them to be a-wine color, and of 4.5 size", "target_attributes": { "attributes": [ "closed toe", "rubber sole" ], "options": [ "a-wine", "4.5" ] }, "asin": "B09CQ9T9NH" }, { "task_id": "ws_B019IOIS8Y_2976", "instruction": "i am looking for 40 feet high speed cables", "target_attributes": { "attributes": [ "high speed" ], "options": [ "40 feet (single pack)" ] }, "asin": "B019IOIS8Y" }, { "task_id": "ws_B019IOIS8Y_2977", "instruction": "i'm looking for video accessories and it was high speed need to buy it.", "target_attributes": { "attributes": [ "high speed", "blu ray" ], "options": [ "3 pack" ] }, "asin": "B019IOIS8Y" }, { "task_id": "ws_B019IOIS8Y_2978", "instruction": "i'm looking for high speed hdmi cable with ethernet signal booster.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "75 feet (2-pack)" ] }, "asin": "B019IOIS8Y" }, { "task_id": "ws_B08HXC8TYW_2979", "instruction": "i am looking for gluten free turmeric chai", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "golden turmeric chai latte" ] }, "asin": "B08HXC8TYW" }, { "task_id": "ws_B07DTFWCN3_2980", "instruction": "i would like to buy water shoes which are anti slip and are in black color while the size should be 11.5 for women and 9.5 for men", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "black", "11.5 women | 9.5 men" ] }, "asin": "B07DTFWCN3" }, { "task_id": "ws_B07LBMY1DC_2981", "instruction": "looking for machine washable pillow covers for couch bed also choose colour dark blue", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "dark blue" ] }, "asin": "B07LBMY1DC" }, { "task_id": "ws_B010647EJO_2982", "instruction": "i am looking for acqua di gio for men impression", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B010647EJO" }, { "task_id": "ws_B09BNNQWKL_2983", "instruction": "i need a easy to assemble white colored desk for home office", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "natural and white" ] }, "asin": "B09BNNQWKL" }, { "task_id": "ws_B0882WCN5W_2984", "instruction": "i would like to buy mid calf boots which have synthetic sole, and are in insignia blue color, as for the size i want them 10", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "insignia blue", "10" ] }, "asin": "B0882WCN5W" }, { "task_id": "ws_B073P2DNTD_2985", "instruction": "i'm looking for a mid century style table lamp", "target_attributes": { "attributes": [ "mid century" ], "options": [ "table lamp" ] }, "asin": "B073P2DNTD" }, { "task_id": "ws_B08F3KZGW9_2986", "instruction": "kit 3 machine washable elastic nylon boxer panties", "target_attributes": { "attributes": [ "machine wash", "nylon spandex" ], "options": [] }, "asin": "B08F3KZGW9" }, { "task_id": "ws_B081VY6GGL_2987", "instruction": "i am interested in buying bar stools which have metal legs, are in blue colors, and have a size of 45cm", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "blue", "45cm" ] }, "asin": "B081VY6GGL" }, { "task_id": "ws_B08VJ83DF3_2988", "instruction": "i'm looking for 22 inch long hair extensions having dark auturn brown color (pack of 1)", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#33 dark auturn brown", "22 inch (pack of 1)" ] }, "asin": "B08VJ83DF3" }, { "task_id": "ws_B08VJ83DF3_2989", "instruction": "i want to buy hair extension tape which i can easily apply and can fit to natural hair, it's color should be dark brown to chocolate brown, and the size i am interested in should be 22 inch (pack of 1).", "target_attributes": { "attributes": [ "easy apply", "natural hair" ], "options": [ "t#2 | 4 dark brown to chocolate brown", "22 inch (pack of 1)" ] }, "asin": "B08VJ83DF3" }, { "task_id": "ws_B08VJ83DF3_2990", "instruction": "i'm looking for a easy to apply hair extensions which looks like natural hair. also, choose a pack of 1, 16 inch with #33 dark auturn brown colored one", "target_attributes": { "attributes": [ "easy apply", "hair extensions", "natural hair" ], "options": [ "#33 dark auturn brown", "16 inch (pack of 1)" ] }, "asin": "B08VJ83DF3" }, { "task_id": "ws_B095RK71N7_2991", "instruction": "i want a 1080hd a dome surveillance camera with motion detection", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B095RK71N7" }, { "task_id": "ws_B081SSB2NF_2992", "instruction": "i would like some 22 inch ombre brown synthetic hair extensions.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "ombre brown", "22 inch" ] }, "asin": "B081SSB2NF" }, { "task_id": "ws_B00QGWLZGY_2993", "instruction": "i need 5 litre of quality ingredients contained roasted pecan oil bottle for cooking", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "pecan", "5 l", "bottle" ] }, "asin": "B00QGWLZGY" }, { "task_id": "ws_B07B32DCCQ_2994", "instruction": "i'm interested in a pack of 4, 3.17 ounce lightly salted, but unsweetened coconut chips that are non-gmo and gluten-free.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "lightly salted, unsweetened", "3.17 ounce (pack of 4)" ] }, "asin": "B07B32DCCQ" }, { "task_id": "ws_B084D93KC7_2995", "instruction": "i want to buy crisps which are low carb and sugar free", "target_attributes": { "attributes": [ "low carb", "sugar free" ], "options": [] }, "asin": "B084D93KC7" }, { "task_id": "ws_B08N4GNPRP_2996", "instruction": "i am looking for soft fuzzy blanket super soft in multi 49", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 49" ] }, "asin": "B08N4GNPRP" }, { "task_id": "ws_B011W4CTM4_2997", "instruction": "i want jeans with button closure", "target_attributes": { "attributes": [ "button closure" ], "options": [] }, "asin": "B011W4CTM4" }, { "task_id": "ws_B01AWMAC4O_2998", "instruction": "i'm looking for a easy to carry essential oil roller for coconut oil. also choose coconut scented one.", "target_attributes": { "attributes": [ "easy carry", "coconut oil" ], "options": [ "coconut" ] }, "asin": "B01AWMAC4O" }, { "task_id": "ws_B00GHMP7JE_2999", "instruction": "i am looking for brushed nickel pegandrail oak coat rack of size: 41\"x3.5\" with 8 hooks", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "41\" x 3.5\" with 8 hooks" ] }, "asin": "B00GHMP7JE" }, { "task_id": "ws_B09FYGVF24_3000", "instruction": "find a dress suitable for hand wash", "target_attributes": { "attributes": [ "hand wash" ], "options": [] }, "asin": "B09FYGVF24" }, { "task_id": "ws_B08K8WHB7K_3001", "instruction": "i am looking for super soft in multi 18", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 18" ] }, "asin": "B08K8WHB7K" }, { "task_id": "ws_B08DDKLPS5_3002", "instruction": "i am looking for long lasting 14 color pressed powder palette of color: fiesta all day", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "fiesta all day" ] }, "asin": "B08DDKLPS5" }, { "task_id": "ws_B004PYF11U_3003", "instruction": "i want a gluten free packaged meal", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B004PYF11U" }, { "task_id": "ws_B093T17GH1_3004", "instruction": "i want a set of 2 mesh laundry bags with a pink flamingo dress with roses design.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093T17GH1" }, { "task_id": "ws_B09P82Y1MB_3005", "instruction": "i am looking for a purple daycare teacher tshirt made of heather cotton and should be a classic fit.", "target_attributes": { "attributes": [ "cotton heather", "classic fit" ], "options": [ "purple" ] }, "asin": "B09P82Y1MB" }, { "task_id": "ws_B07RKVY1KG_3006", "instruction": "i am looking for men suits slim fit with button closure of size: 50", "target_attributes": { "attributes": [ "button closure" ], "options": [ "50" ] }, "asin": "B07RKVY1KG" }, { "task_id": "ws_B07BDQ5GJQ_3007", "instruction": "i am looking for sensodyne toothpaste in sensitive teeth", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B07BDQ5GJQ" }, { "task_id": "ws_B09F374PTJ_3008", "instruction": "i am looking for non slip pink color shoes", "target_attributes": { "attributes": [ "non slip" ], "options": [ "pink" ] }, "asin": "B09F374PTJ" }, { "task_id": "ws_B018UJLIOE_3009", "instruction": "i need shoe mounts made with aluminium alloy", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B018UJLIOE" }, { "task_id": "ws_B09KGJQQ4B_3010", "instruction": "i would like to buy cell phone signal booster which has high speed", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B09KGJQQ4B" }, { "task_id": "ws_B07MFPHSNH_3011", "instruction": "i'm looking for a three piece, wall mounted, stainless steel spice rack.", "target_attributes": { "attributes": [ "wall mounted", "stainless steel" ], "options": [] }, "asin": "B07MFPHSNH" }, { "task_id": "ws_B086DJ4TF4_3012", "instruction": "i want a 5 pack of amber glass fine mist spray bottles.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "5 pack" ] }, "asin": "B086DJ4TF4" }, { "task_id": "ws_B09JBL4FQG_3013", "instruction": "i am looking for a camera lens protector for iphone 13 made up of aluminum alloy. also choose pink color.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "pink" ] }, "asin": "B09JBL4FQG" }, { "task_id": "ws_B082QWR677_3014", "instruction": "i am interested in buying clips for hair which are of high quality and rose gold, while the style should be the kiss", "target_attributes": { "attributes": [ "high quality", "rose gold" ], "options": [ "the kiss" ] }, "asin": "B082QWR677" }, { "task_id": "ws_B0947LFNGB_3015", "instruction": "i am looking for hand lotion cruelty free in lemongrass & ginger", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "lemongrass & ginger" ] }, "asin": "B0947LFNGB" }, { "task_id": "ws_B088722H6W_3016", "instruction": "i am looking for day comport shoe in pure grey color", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "pure grey | white white" ] }, "asin": "B088722H6W" }, { "task_id": "ws_B074MHWYWF_3017", "instruction": "i am looking for low sugar drink mixes in paloma flavor", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "paloma" ] }, "asin": "B074MHWYWF" }, { "task_id": "ws_B074MHWYWF_3018", "instruction": "i need a bloody mary flavored cocktail mix that is low on sugar.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "bloody mary" ] }, "asin": "B074MHWYWF" }, { "task_id": "ws_B083K4LXVJ_3019", "instruction": "i am looking for black color machine wash d shirt", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "black" ] }, "asin": "B083K4LXVJ" }, { "task_id": "ws_B07L45DLCS_3020", "instruction": "i am looking for plant based 2.3 ounce", "target_attributes": { "attributes": [ "plant based" ], "options": [ "2.3 ounce" ] }, "asin": "B07L45DLCS" }, { "task_id": "ws_B097KXCWP7_3021", "instruction": "i am looking for easy to install home decor products in blackout color", "target_attributes": { "attributes": [ "easy install" ], "options": [ "cordless bottom up-blackout-creamy" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B097KXCWP7_3022", "instruction": "i want to buy shades which are easy to install and have a color of cordless bottom up-blackout-white and with a size of 23\"w x 66\"h", "target_attributes": { "attributes": [ "easy install" ], "options": [ "cordless bottom up-blackout-white", "23\"w x 66\"h" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B097KXCWP7_3023", "instruction": "i am looking for a white item 40\"w x 48\"h size of home d\u00e9cor products", "target_attributes": { "attributes": [ "white item" ], "options": [ "40\"w x 48\"h" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B097KXCWP7_3024", "instruction": "i am looking for an easy to install blackout blinds for my kitchen. make sure it is white and has a cordless bottom up feature.", "target_attributes": { "attributes": [ "white item", "easy install" ], "options": [ "cordless bottom up-blackout-gray" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B097KXCWP7_3025", "instruction": "i'm looking for cordless bottom up-blackout-white window blinds that are easy to install and are 55\"w x 56\"h.", "target_attributes": { "attributes": [ "white item", "easy install" ], "options": [ "cordless bottom up-blackout-white", "55\"w x 56\"h" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B097KXCWP7_3026", "instruction": "i want to find white blackout shades that are 66 inches in width and 66 inches in height. they need to be easy to install.", "target_attributes": { "attributes": [ "white item", "easy install" ], "options": [ "cordless bottom up-blackout-white", "66\"w x 66\"h" ] }, "asin": "B097KXCWP7" }, { "task_id": "ws_B01HJWARWW_3027", "instruction": "i am looking for a male to male style gold plated high speed hdmi cable. also, choose 10 feet length.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 feet (10-pack)", "hdmi male to male" ] }, "asin": "B01HJWARWW" }, { "task_id": "ws_B08313YQTH_3028", "instruction": "i am interested in buying gaming controllers which are non slip and can be carried by case", "target_attributes": { "attributes": [ "non slip", "carrying case" ], "options": [] }, "asin": "B08313YQTH" }, { "task_id": "ws_B09964628J_3029", "instruction": "i need bar stool and table set", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B09964628J" }, { "task_id": "ws_B08LVJ2JXY_3030", "instruction": "i'm looking for a women's v-neck tunic with a relaxed fit in the size of large.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "large" ] }, "asin": "B08LVJ2JXY" }, { "task_id": "ws_B08GL27RXJ_3031", "instruction": "i want a 15 pack of volume and nourish conditioner for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "15 pack", "volume & nourish" ] }, "asin": "B08GL27RXJ" }, { "task_id": "ws_B09DGRX9H8_3032", "instruction": "i am looking for brittle color organic chocolate", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "nutcracker brittle" ] }, "asin": "B09DGRX9H8" }, { "task_id": "ws_B09DGRX9H8_3033", "instruction": "i want a non gmo soy free certified organic gift pack of candy and chocolate bar of holiday variety pack size :3 ounce", "target_attributes": { "attributes": [ "soy free", "certified organic", "non gmo" ], "options": [ "holiday variety pack", "3 ounce (pack of 12)" ] }, "asin": "B09DGRX9H8" }, { "task_id": "ws_B09FQ19M1N_3034", "instruction": "i'm looking for brown color upholstered faux leather footrest stool for living room, its size should be 100x42x45cm", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "brown", "100x42x45cm" ] }, "asin": "B09FQ19M1N" }, { "task_id": "ws_B08L3NP2X4_3035", "instruction": "i need a amplifier with stereo sound", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B08L3NP2X4" }, { "task_id": "ws_B07WNPT6ZD_3036", "instruction": "i am interested in sandals which have arch support are in tan color and have a size of 11", "target_attributes": { "attributes": [ "arch support" ], "options": [ "tan", "11" ] }, "asin": "B07WNPT6ZD" }, { "task_id": "ws_B08KJHKDWP_3037", "instruction": "i would like to buy mixed nuts which are non gmo, and have a roasted crunchy mix flavor while the size should be 2 pound.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "roasted crunchy mix", "2 pound" ] }, "asin": "B08KJHKDWP" }, { "task_id": "ws_B07RT28DLG_3038", "instruction": "i want a super soft jay franco disney minnie mouse twin bed set.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "twin" ] }, "asin": "B07RT28DLG" }, { "task_id": "ws_B0872TSFCL_3039", "instruction": "i need a vanity light with clear glass", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B0872TSFCL" }, { "task_id": "ws_B09CDN7QBP_3040", "instruction": "i'm looking for an easy to install pink chair for the living room that offers lumbar support and is height adjustable.", "target_attributes": { "attributes": [ "height adjustable", "easy install", "lumbar support", "living room" ], "options": [ "pink" ] }, "asin": "B09CDN7QBP" }, { "task_id": "ws_B08L98TC39_3041", "instruction": "i need 0.5m long fast charging hdmi male charger cord splitter adapter", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "0.5m" ] }, "asin": "B08L98TC39" }, { "task_id": "ws_B09PZ6SWCX_3042", "instruction": "i am looking for quick release underwater photography", "target_attributes": { "attributes": [ "quick release" ], "options": [] }, "asin": "B09PZ6SWCX" }, { "task_id": "ws_B09JWC3T93_3043", "instruction": "i'm looking for a high quality salon and spa desk chair with adjustable rolling swivel stool chair for a beauty salon. also choose pulley styled black colored one.", "target_attributes": { "attributes": [ "high quality", "beauty salon" ], "options": [ "black", "pulley style" ] }, "asin": "B09JWC3T93" }, { "task_id": "ws_B07YF6DVNJ_3044", "instruction": "i am looking for argan oil", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B07YF6DVNJ" }, { "task_id": "ws_B07P8B13MC_3045", "instruction": "i am looking a anti aging eyes gels for removing dark circles under eyes", "target_attributes": { "attributes": [ "anti aging", "dark circles" ], "options": [] }, "asin": "B07P8B13MC" }, { "task_id": "ws_B09PD5H65X_3046", "instruction": "i am looking for pink color short sleeve t shirts", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "a3-pink" ] }, "asin": "B09PD5H65X" }, { "task_id": "ws_B07Y26SPZK_3047", "instruction": "find high quality toothpaste", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B07Y26SPZK" }, { "task_id": "ws_B082ZSX8W8_3048", "instruction": "i am looking for a chocolate covered dates for perfect gift. also choose assorted container one.", "target_attributes": { "attributes": [ "chocolate covered", "perfect gift" ], "options": [ "assorted container" ] }, "asin": "B082ZSX8W8" }, { "task_id": "ws_B01DTGF6WI_3049", "instruction": "i want a medium sized t-shirt with long sleeves", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B01DTGF6WI" }, { "task_id": "ws_B07Q55YDF5_3050", "instruction": "i need a high quality hair extension", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [] }, "asin": "B07Q55YDF5" }, { "task_id": "ws_B08B1MCFKL_3051", "instruction": "i am looking for dark denim color ethylene vinyl ultra train of size 10, 3rd generation for men", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "dark denim | red orange", "10" ] }, "asin": "B08B1MCFKL" }, { "task_id": "ws_B07SRYMNXF_3052", "instruction": "i want a black folding chair with a steel frame", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "black" ] }, "asin": "B07SRYMNXF" }, { "task_id": "ws_B08STYKF65_3053", "instruction": "i'm looking for a fruit snacks that is in freeze dried form of a real fruit.", "target_attributes": { "attributes": [ "freeze dried", "real fruit" ], "options": [] }, "asin": "B08STYKF65" }, { "task_id": "ws_B071SF41Y9_3054", "instruction": "find a tablet with a core i5 processor", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B071SF41Y9" }, { "task_id": "ws_B00BBWBOQA_3055", "instruction": "i am looking for poly-cotton in digital blue", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "digital blue" ] }, "asin": "B00BBWBOQA" }, { "task_id": "ws_B093WNLZ67_3056", "instruction": "i am looking for blackout brown color roller shades", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout brown 3911" ] }, "asin": "B093WNLZ67" }, { "task_id": "ws_B093WNLZ67_3057", "instruction": "i'm looking for make a decor products for living room. the color blackout light grey.", "target_attributes": { "attributes": [ "high density", "living room" ], "options": [ "blackout light grey 3908" ] }, "asin": "B093WNLZ67" }, { "task_id": "ws_B093WNLZ67_3058", "instruction": "i would like a 20 wide by 72 tall blackout beige roller shade for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout beige 3902", "20\"w x 72\"h" ] }, "asin": "B093WNLZ67" }, { "task_id": "ws_B093WNLZ67_3059", "instruction": "i want to find blackout baby blue window shades for my living room that are 23 inches in width and 64 inches in height.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout baby blue 3913", "23\"w x 64\"h" ] }, "asin": "B093WNLZ67" }, { "task_id": "ws_B093WNLZ67_3060", "instruction": "i want blackout brown roller shades for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout brown 3911" ] }, "asin": "B093WNLZ67" }, { "task_id": "ws_B086Z2BPKJ_3061", "instruction": "i am looking for crazy monkey baking with low sodium and natural ingredients of size 7.5 ounce", "target_attributes": { "attributes": [ "low sodium", "natural ingredients" ], "options": [ "7.5 ounce" ] }, "asin": "B086Z2BPKJ" }, { "task_id": "ws_B07H5VF96G_3062", "instruction": "i am looking for high performance refurbished hp laserjet m3035xs m3035 cc477a laser printer", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B07H5VF96G" }, { "task_id": "ws_B000AOFVZK_3063", "instruction": "i'm looking for a high speed digital camera with optical zoom lens and should include batteries.", "target_attributes": { "attributes": [ "batteries included", "high speed", "optical zoom" ], "options": [] }, "asin": "B000AOFVZK" }, { "task_id": "ws_B07DJB31RD_3064", "instruction": "i am looking for a ballet flat with rubber sole for comfortable fit. also choose silver white color and 6.5 in size.", "target_attributes": { "attributes": [ "comfortable fit", "rubber sole" ], "options": [ "silver silver white c0434", "6.5" ] }, "asin": "B07DJB31RD" }, { "task_id": "ws_B0971VV99P_3065", "instruction": "i'm looking for strawberry lemonade that is free of caffeine and sugar.", "target_attributes": { "attributes": [ "caffeine free", "sugar free" ], "options": [ "strawberry lemonade" ] }, "asin": "B0971VV99P" }, { "task_id": "ws_B0971VV99P_3066", "instruction": "pink lemonade flavored juice drink mix, please. it needs to be sugar-free and caffeine-free.", "target_attributes": { "attributes": [ "caffeine free", "sugar free" ], "options": [ "pink lemonade" ] }, "asin": "B0971VV99P" }, { "task_id": "ws_B083WDX378_3067", "instruction": "i want a mini desktop with intel core i5 4200u", "target_attributes": { "attributes": [ "intel core" ], "options": [ "cpu i5 4200u" ] }, "asin": "B083WDX378" }, { "task_id": "ws_B077TYBD6X_3068", "instruction": "i need a table lamp with bronze finish for my living room", "target_attributes": { "attributes": [ "bronze finish" ], "options": [] }, "asin": "B077TYBD6X" }, { "task_id": "ws_B09NCTZNG8_3069", "instruction": "i want a slim fit jeans", "target_attributes": { "attributes": [ "slim fit" ], "options": [] }, "asin": "B09NCTZNG8" }, { "task_id": "ws_B0745LSBN9_3070", "instruction": "i am interested in buying area rugs which are suitable for living room, have chocolate color, and the site of 2.6 ft. x 10ft.", "target_attributes": { "attributes": [ "living room" ], "options": [ "chocolate", "2.6 ft. x 10 ft." ] }, "asin": "B0745LSBN9" }, { "task_id": "ws_B0745LSBN9_3071", "instruction": "i need a chocolate covered runner rug for the living room that is 9 by 12 ft", "target_attributes": { "attributes": [ "living room" ], "options": [ "a chocolate", "runner", "9 ft x 12 ft" ] }, "asin": "B0745LSBN9" }, { "task_id": "ws_B09MCT2C4B_3072", "instruction": "i am looking for dining room in grey adjustable swivel barstools-2", "target_attributes": { "attributes": [ "dining room" ], "options": [ "grey", "adjustable swivel barstools-2" ] }, "asin": "B09MCT2C4B" }, { "task_id": "ws_B07SGZ4QM8_3073", "instruction": "i want a neon pink tank top suitable for machine wash", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "neon pink" ] }, "asin": "B07SGZ4QM8" }, { "task_id": "ws_B0979KBDV4_3074", "instruction": "i need a shirt with regular fit", "target_attributes": { "attributes": [ "regular fit" ], "options": [] }, "asin": "B0979KBDV4" }, { "task_id": "ws_B072R2Z7RH_3075", "instruction": "i would like bottle of pink sprinkles for a birthday cake.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pink" ] }, "asin": "B072R2Z7RH" }, { "task_id": "ws_B071CPPYMC_3076", "instruction": "i would like a wirefree pink amethyst 36c bra that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "wirefree - pink amethyst", "wirefree", "36c" ] }, "asin": "B071CPPYMC" }, { "task_id": "ws_B071CPPYMC_3077", "instruction": "i am interested in buying a back smoothing bra which is machine washable in size 38c.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "38c" ] }, "asin": "B071CPPYMC" }, { "task_id": "ws_B09B3DZ96H_3078", "instruction": "i need heavy duty beauty salon reclining hair chair", "target_attributes": { "attributes": [ "heavy duty", "beauty salon" ], "options": [] }, "asin": "B09B3DZ96H" }, { "task_id": "ws_B07NFDBYQQ_3079", "instruction": "i'm looking for sugar free premium assorted chocolate bar with crunchy almonds (1.76 oz)", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "premium assorted chocolate" ] }, "asin": "B07NFDBYQQ" }, { "task_id": "ws_B07NFDBYQQ_3080", "instruction": "i am looking for keto friendly chocolate bar containing crunchy almonds of 1.76 oz.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "crunchy almonds (1.76 oz)" ] }, "asin": "B07NFDBYQQ" }, { "task_id": "ws_B08T1RX1NZ_3081", "instruction": "i'm looking for a brown button down shirt with long sleeves.", "target_attributes": { "attributes": [ "button closure", "long sleeve" ], "options": [ "brown" ] }, "asin": "B08T1RX1NZ" }, { "task_id": "ws_B07SH9R9PW_3082", "instruction": "i am looking for bpa free lavender lip care kit", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "lavender" ] }, "asin": "B07SH9R9PW" }, { "task_id": "ws_B07ZQT6SZQ_3083", "instruction": "i want grey dearfoams memory foam clogs.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "medium grey" ] }, "asin": "B07ZQT6SZQ" }, { "task_id": "ws_B08LDBFKMS_3084", "instruction": "i want pink cupcake toppers for my baby shower", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "pink" ] }, "asin": "B08LDBFKMS" }, { "task_id": "ws_B09NMRVMZV_3085", "instruction": "i am looking for long lasting cool water candles", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "cool water" ] }, "asin": "B09NMRVMZV" }, { "task_id": "ws_B07GWJ8P6D_3086", "instruction": "i want a black colored eco friendly curtain for my living room", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "black" ] }, "asin": "B07GWJ8P6D" }, { "task_id": "ws_B0030ZRS98_3087", "instruction": "i need a 13 oz package of wax for hair removal", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "13 ounce (pack of 1)" ] }, "asin": "B0030ZRS98" }, { "task_id": "ws_B0030ZRS98_3088", "instruction": "i need a 13 ounce lavender cr\u00e8me hair removal wax by gigi.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "lavender cr\u00e8me", "13 ounce (pack of 1)" ] }, "asin": "B0030ZRS98" }, { "task_id": "ws_B09312YTQH_3089", "instruction": "i am looking for 3 pack easy clean natural skin massager for face", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09312YTQH" }, { "task_id": "ws_B0832VZGX1_3090", "instruction": "i am looking for a makeup pouch with high quality. also choose wine red color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "wine red" ] }, "asin": "B0832VZGX1" }, { "task_id": "ws_B0758FXDS7_3091", "instruction": "i would like a 14 ounce bag of roasted almonds and other nuts that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "roasted almonds,cashew,peanuts", "14 ounce (pack of 6)" ] }, "asin": "B0758FXDS7" }, { "task_id": "ws_B07NPHN1HH_3092", "instruction": "i am looking for grey color rugs for dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "grey | gold" ] }, "asin": "B07NPHN1HH" }, { "task_id": "ws_B07NPHN1HH_3093", "instruction": "i would like a grey area rug that is for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey | green" ] }, "asin": "B07NPHN1HH" }, { "task_id": "ws_B091GV5PLL_3094", "instruction": "i want a blue berry baking soda press toothpaste for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "blue berry" ] }, "asin": "B091GV5PLL" }, { "task_id": "ws_B01ND0ZZQI_3095", "instruction": "i am searching for long lasting refreshing, light fragrance mist for women", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B01ND0ZZQI" }, { "task_id": "ws_B00IOTPVS0_3096", "instruction": "i am looking for gluten free cookies", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cookies & cream" ] }, "asin": "B00IOTPVS0" }, { "task_id": "ws_B005IHVZHW_3097", "instruction": "i'm looking for a clinically proven topical solution for hair regrowth treatments which should be easy to apply and also promotes hair growth and reduces hair loss.", "target_attributes": { "attributes": [ "clinically proven", "easy apply", "hair growth", "hair loss" ], "options": [] }, "asin": "B005IHVZHW" }, { "task_id": "ws_B09QMS7YZD_3098", "instruction": "i am looking for a twin size bed with easy assemble made up of steel frame. also choose black color and twin-over-twin bunk beds style.", "target_attributes": { "attributes": [ "twin size", "easy assemble", "steel frame" ], "options": [] }, "asin": "B09QMS7YZD" }, { "task_id": "ws_B08YRWB3TR_3099", "instruction": "chair with adjustable height, backrest and lumbar support.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [] }, "asin": "B08YRWB3TR" }, { "task_id": "ws_B08CZPZF17_3100", "instruction": "i would like to buy computer desk which has steel frame and is in black color while it's size is large", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "black", "large" ] }, "asin": "B08CZPZF17" }, { "task_id": "ws_B08783WFTL_3101", "instruction": "i want individually wrapped candy & chocolate assortment for baby shower", "target_attributes": { "attributes": [ "individually wrapped", "baby shower" ], "options": [] }, "asin": "B08783WFTL" }, { "task_id": "ws_B09Q6579W5_3102", "instruction": "i am looking for colorful stereo wireless bluetooth easy use in g2", "target_attributes": { "attributes": [ "easy use", "wireless bluetooth" ], "options": [ "g2" ] }, "asin": "B09Q6579W5" }, { "task_id": "ws_B09PJXZBSQ_3103", "instruction": "i would like a #4 bath sponge that is non toxic and easy to keep clean.", "target_attributes": { "attributes": [ "non toxic", "easy clean" ], "options": [ "4" ] }, "asin": "B09PJXZBSQ" }, { "task_id": "ws_B08G155272_3104", "instruction": "i would like a rectangular coffee table made of steel.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "rectangle" ] }, "asin": "B08G155272" }, { "task_id": "ws_B06X973HJ3_3105", "instruction": "i am looking for gluten free cookies", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B06X973HJ3" }, { "task_id": "ws_B07MWML5S1_3106", "instruction": "i am looking for comfortable fit slim jeans", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [] }, "asin": "B07MWML5S1" }, { "task_id": "ws_B07MWML5S1_3107", "instruction": "i want to buy a pair of machine washable jeans with a 33 inch waist and a 30 inch length. they should come in a \"granite\" color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "granite", "33w x 30l" ] }, "asin": "B07MWML5S1" }, { "task_id": "ws_B07MWML5S1_3108", "instruction": "i want to find a pair of cowboy cut jeans with a relaxed, comfortable fit. the jeans need to be 31 inches in width and 38 inches in length.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "relaxed", "31w x 38l" ] }, "asin": "B07MWML5S1" }, { "task_id": "ws_B07MWML5S1_3109", "instruction": "i want a big & tall machine washable wrangler mens cowboy jeans.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "big & tall" ] }, "asin": "B07MWML5S1" }, { "task_id": "ws_B01N97KVM8_3110", "instruction": "i am looking for a pair of long lasting men's wrangler cowboy cut jeans that are machine washable.", "target_attributes": { "attributes": [ "long lasting", "machine wash" ], "options": [ "relaxed" ] }, "asin": "B01N97KVM8" }, { "task_id": "ws_B01N97KVM8_3111", "instruction": "i have a request for you. men's wrangler 13mwz cowboy cut original fit jean, comfortable fit. i hope you find this gift for my boyfriend who has a birthday the size is size: 38w x 29l, and the color atlanta. i look forward to your return as soon as possible.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "atlanta", "38w x 29l" ] }, "asin": "B01N97KVM8" }, { "task_id": "ws_B000HJB2NS_3112", "instruction": "i would like a 6 inch long white soy candle.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "white", "6 in" ] }, "asin": "B000HJB2NS" }, { "task_id": "ws_B000HJB2NS_3113", "instruction": "i'm looking for a lead free colonial candle made of soy wax for living room. also choose 10 in limoncello colored one", "target_attributes": { "attributes": [ "lead free", "soy wax", "living room" ], "options": [ "limoncello", "10 in" ] }, "asin": "B000HJB2NS" }, { "task_id": "ws_B09MPNDRSJ_3114", "instruction": "i am in need of 20 pcs high quality black color crown dreadlock hair jewelry for women braid", "target_attributes": { "attributes": [ "high quality" ], "options": [ "b" ] }, "asin": "B09MPNDRSJ" }, { "task_id": "ws_B084SK7GGV_3115", "instruction": "i am looking for along lasting t-shirt for a adult with quality material which washable in machine. also choose depaul- navy color and x-large size.", "target_attributes": { "attributes": [ "long lasting", "machine wash", "quality materials" ], "options": [ "depaul - navy", "x-large" ] }, "asin": "B084SK7GGV" }, { "task_id": "ws_B09B2VF4RD_3116", "instruction": "i want 1 solawave renew complex serum for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "pack of 1" ] }, "asin": "B09B2VF4RD" }, { "task_id": "ws_B09FQ8TN1L_3117", "instruction": "i am looking for birthday party cupcake toppers, decorations supplies of pattern name : gold 30", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 30" ] }, "asin": "B09FQ8TN1L" }, { "task_id": "ws_B09KV97TW2_3118", "instruction": "i would like a cowlop 52 by 84 inch window panel for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "cowlop9951", "52x84in" ] }, "asin": "B09KV97TW2" }, { "task_id": "ws_B075V2MJ9F_3119", "instruction": "i am looking for studio photography digital photography in grey", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "grey" ] }, "asin": "B075V2MJ9F" }, { "task_id": "ws_B071D7Z9YN_3120", "instruction": "i am looking for a rubber sole clog shoe with arc support. also choose 9.5 size.", "target_attributes": { "attributes": [ "rubber sole", "arch support" ], "options": [ "9.5" ] }, "asin": "B071D7Z9YN" }, { "task_id": "ws_B08TG8KFQQ_3121", "instruction": "i want a white geak compatible with apple watch case.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "white | rosegold" ] }, "asin": "B08TG8KFQQ" }, { "task_id": "ws_B001NQWDLO_3122", "instruction": "i need to get some sulfate free hair spray", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "spray" ] }, "asin": "B001NQWDLO" }, { "task_id": "ws_B07XVQSGKP_3123", "instruction": "i'm looking for a white tv tray table that can help save me space.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "white" ] }, "asin": "B07XVQSGKP" }, { "task_id": "ws_B08SQBV1F9_3124", "instruction": "i am looking for gluten free plant based cerals", "target_attributes": { "attributes": [ "plant based", "gluten free" ], "options": [ "8 ounce (3 count)" ] }, "asin": "B08SQBV1F9" }, { "task_id": "ws_B08SCFN6ZG_3125", "instruction": "i'm looking for freeze dried gluten free sliced strawberries and fresh vegetables", "target_attributes": { "attributes": [ "freeze dried", "gluten free" ], "options": [ "sliced strawberries" ] }, "asin": "B08SCFN6ZG" }, { "task_id": "ws_B08P8SLTLP_3126", "instruction": "i want a god for my best friend who sent me my son father's day t-shirt with classic fit and needle sleeve. also, i choose size 4t and cranberry color.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit" ], "options": [ "cranberry", "4t" ] }, "asin": "B08P8SLTLP" }, { "task_id": "ws_B0773QFLQG_3127", "instruction": "i am in need of high protein gluten free jaipur millet & lentil, 2.3 ounce (pack of 8)", "target_attributes": { "attributes": [ "high protein", "gluten free" ], "options": [ "jaipur millet & lentil", "2.3 ounce (pack of 8)" ] }, "asin": "B0773QFLQG" }, { "task_id": "ws_B07C881V3Z_3128", "instruction": "i need a easy to apply temporary tattoo", "target_attributes": { "attributes": [ "easy apply" ], "options": [] }, "asin": "B07C881V3Z" }, { "task_id": "ws_B003VMVL0M_3129", "instruction": "looking for rich creamy cocoa classics also choose flavor raspberry", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "raspberry" ] }, "asin": "B003VMVL0M" }, { "task_id": "ws_B003VMVL0M_3130", "instruction": "i am looking for a 1.25 ounce (pack of 36) of rich creamy cocoa", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "1.25 ounce (pack of 36)" ] }, "asin": "B003VMVL0M" }, { "task_id": "ws_B08YJN9S26_3131", "instruction": "i'm looking for a contemporary designed, hand painted vase for living room and should be made of eco friendly materials. also, choose medium sunburst colored one.", "target_attributes": { "attributes": [ "hand painted", "eco friendly", "contemporary design", "living room" ], "options": [ "sunburst (medium)" ] }, "asin": "B08YJN9S26" }, { "task_id": "ws_B0922HT4PV_3132", "instruction": "i need a ottoman made from solid color", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B0922HT4PV" }, { "task_id": "ws_B08BFPDQ8R_3133", "instruction": "i want a easy to carry mirror", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B08BFPDQ8R" }, { "task_id": "ws_B08BFPDQ8R_3134", "instruction": "looking for rose gold travel purse mirror easy to carry also choose colour unicorn", "target_attributes": { "attributes": [ "easy carry", "rose gold" ], "options": [ "unicorn" ] }, "asin": "B08BFPDQ8R" }, { "task_id": "ws_B07WRSP8FH_3135", "instruction": "i'm looking for a pokemon toothbrush", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [] }, "asin": "B07WRSP8FH" }, { "task_id": "ws_B09RWVJZF7_3136", "instruction": "i'm looking for a slim fit women's jumpsuits with long sleeve. also, choose large, 001-hot pink one.", "target_attributes": { "attributes": [ "slim fit", "long sleeve" ], "options": [ "001-hot pink", "large" ] }, "asin": "B09RWVJZF7" }, { "task_id": "ws_B086ZGK88G_3137", "instruction": "i'm looking for 20 inch double sided tape hair extensions of balayage color", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "balayage#8 | 60", "20 inch" ] }, "asin": "B086ZGK88G" }, { "task_id": "ws_B08NZD172N_3138", "instruction": "i want a 10ft micro usb fast charging cable.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B08NZD172N" }, { "task_id": "ws_B09CMKK5BN_3139", "instruction": "i'm looking for a blue wall-mounted, spacing-saving console shelf for the living room.", "target_attributes": { "attributes": [ "wall mounted", "space saving", "living room" ], "options": [ "blue" ] }, "asin": "B09CMKK5BN" }, { "task_id": "ws_B09Q93MT44_3140", "instruction": "i'm looking for x-large yellow high-waisted tights that provide butt lifting and tummy control.", "target_attributes": { "attributes": [ "butt lifting", "tummy control", "high waist" ], "options": [ "yellow", "x-large" ] }, "asin": "B09Q93MT44" }, { "task_id": "ws_B08NWBT9T1_3141", "instruction": "i am looking for sugar free, soy free, high protein and non gmo keto bread crumbs plain of size: 2 count(pack of 2)", "target_attributes": { "attributes": [ "sugar free", "soy free", "high protein", "non gmo" ], "options": [ "2 count (pack of 2)" ] }, "asin": "B08NWBT9T1" }, { "task_id": "ws_B09KNDLCXN_3142", "instruction": "find a easy to install vanity light", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09KNDLCXN" }, { "task_id": "ws_B08H5898QC_3143", "instruction": "i want a television stand with storage space", "target_attributes": { "attributes": [ "storage space" ], "options": [] }, "asin": "B08H5898QC" }, { "task_id": "ws_B093YTB1SH_3144", "instruction": "i'm looking for a vintage laundry bag for blouse hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YTB1SH" }, { "task_id": "ws_B09DTK5SR5_3145", "instruction": "i need black colored shoes with arch support", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black" ] }, "asin": "B09DTK5SR5" }, { "task_id": "ws_B09PHS56TB_3146", "instruction": "find a high quality makeup brush", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09PHS56TB" }, { "task_id": "ws_B08QFHCD4P_3147", "instruction": "i am looking for memory foam dinosaur color slipppers", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "dinosaur-x-92" ] }, "asin": "B08QFHCD4P" }, { "task_id": "ws_B084TVJR42_3148", "instruction": "i have a kamiao printed tablecloth live laugh love which have a cartoon style line art figures stars, cubes, circles, hearts with multicolor round tablecloth which is an eco friendly and easy to clean. also, i have the size 36x36 and pattern19 color.", "target_attributes": { "attributes": [ "super soft", "eco friendly", "easy clean" ], "options": [ "pattern19", "36\"x36\"(diameter 92cm)" ] }, "asin": "B084TVJR42" }, { "task_id": "ws_B098SV868M_3149", "instruction": "i am looking for an easy to install battery storage case with the batteries included.", "target_attributes": { "attributes": [ "batteries included", "easy install" ], "options": [] }, "asin": "B098SV868M" }, { "task_id": "ws_B07WF9N78Y_3150", "instruction": "i am looking for outlook sneaker rubber sole in navy light blue", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "navy | light blue" ] }, "asin": "B07WF9N78Y" }, { "task_id": "ws_B0030ZRS8Y_3151", "instruction": "i am looking for a cruelty free soft wax for a sensitive skin. also choose tea tree oil wax 14 oz and 5 ounce ( pack of 1 ) size.", "target_attributes": { "attributes": [ "cruelty free", "sensitive skin" ], "options": [ "tea tree oil wax 14 oz", "5 ounce (pack of 1)" ] }, "asin": "B0030ZRS8Y" }, { "task_id": "ws_B07PMLZN14_3152", "instruction": "i am looking for anti aging masks in artemisia color", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "artemisia" ] }, "asin": "B07PMLZN14" }, { "task_id": "ws_B094ZN66Z5_3153", "instruction": "i am looking for", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "black white" ] }, "asin": "B094ZN66Z5" }, { "task_id": "ws_B09KX9TV4F_3154", "instruction": "i want chinese new year good luck cake picks.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "good luck" ] }, "asin": "B09KX9TV4F" }, { "task_id": "ws_B093K5MLRX_3155", "instruction": "i need a wallet that goes with my blouse", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093K5MLRX" }, { "task_id": "ws_B08N5DXTFQ_3156", "instruction": "i am looking for a eco friendly horoscope candle with soy wax. also choose sagittarius one", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [ "sagittarius" ] }, "asin": "B08N5DXTFQ" }, { "task_id": "ws_B08DJ6D8X5_3157", "instruction": "i am looking for alcohol free perfumes for galloway impression", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "perfums de marly galloway impression" ] }, "asin": "B08DJ6D8X5" }, { "task_id": "ws_B08RL96WH2_3158", "instruction": "i want non gmo freeze dried fruit and vegetables carrot flavor 1.5 ounce (pack of 1)", "target_attributes": { "attributes": [ "freeze dried", "non gmo" ], "options": [ "carrot", "1.5 ounce (pack of 1)" ] }, "asin": "B08RL96WH2" }, { "task_id": "ws_B08J6H6BKJ_3159", "instruction": "find a black remote with batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "black" ] }, "asin": "B08J6H6BKJ" }, { "task_id": "ws_B09K8D4JRX_3160", "instruction": "i am looking a hyaluronic acid deep conditioner for hair treatment of dry har to improve smoothness", "target_attributes": { "attributes": [ "hyaluronic acid", "hair treatment", "dry hair" ], "options": [] }, "asin": "B09K8D4JRX" }, { "task_id": "ws_B09DL9TQ6R_3161", "instruction": "i am looking for birthday party , cupcake picks of pattern name: pattern 5", "target_attributes": { "attributes": [ "birthday party", "cupcake picks" ], "options": [ "pattern 5" ] }, "asin": "B09DL9TQ6R" }, { "task_id": "ws_B09DL9TQ6R_3162", "instruction": "i am looking for cupcake toppers for a birthday party. also, i prefer the pattern 2 over others.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pattern 2" ] }, "asin": "B09DL9TQ6R" }, { "task_id": "ws_B08NJGPH9M_3163", "instruction": "i would like to buy blanket, which is super soft, and is of multi 20 color, and king size", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 20", "king" ] }, "asin": "B08NJGPH9M" }, { "task_id": "ws_B09D3MFKF6_3164", "instruction": "i want a super soft fleece thrown for living for room size 50\"*40\"", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "50\"x40\"" ] }, "asin": "B09D3MFKF6" }, { "task_id": "ws_B07Z9918BC_3165", "instruction": "i am looking a space saving easy to assamble sofa table for lliving room", "target_attributes": { "attributes": [ "space saving", "easy assemble", "living room" ], "options": [] }, "asin": "B07Z9918BC" }, { "task_id": "ws_B01HEXEHWC_3166", "instruction": "i want tangerine colored crocs made with vinyl acetate for kids.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "tangerine" ] }, "asin": "B01HEXEHWC" }, { "task_id": "ws_B01HEXEHWC_3167", "instruction": "i am looking for candy pink and black toddler clogs with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "candy pink | black" ] }, "asin": "B01HEXEHWC" }, { "task_id": "ws_B01HEXEHWC_3168", "instruction": "i am looking for a 5 toddler size vinyl acetate of clogs & mules", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "5 toddler" ] }, "asin": "B01HEXEHWC" }, { "task_id": "ws_B01HEXEHWC_3169", "instruction": "i am looking for vinyl acetate clog for child.please choose army green color.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "army green" ] }, "asin": "B01HEXEHWC" }, { "task_id": "ws_B01HEXEHWC_3170", "instruction": "i need bright cobalt clogs that are made of vinyl and are a size 5 toddler.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "bright cobalt", "5 toddler" ] }, "asin": "B01HEXEHWC" }, { "task_id": "ws_B07V9MQWZQ_3171", "instruction": "i want a screen protector made with tempered glass", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B07V9MQWZQ" }, { "task_id": "ws_B08BRGF84C_3172", "instruction": "universal remote control with battery included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B08BRGF84C" }, { "task_id": "ws_B079B3266S_3173", "instruction": "i want 36 jars of a rose gold bpa free makeup bottles.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "rose gold", "36 jars" ] }, "asin": "B079B3266S" }, { "task_id": "ws_B079B3266S_3174", "instruction": "i need 36 beauticom 60 gram leak proof plastic jars with white lids. i want them in amber.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "amber", "36 jars" ] }, "asin": "B079B3266S" }, { "task_id": "ws_B079B3266S_3175", "instruction": "travel storage white color leak proof for makeup cosmetic lotion scrubs creams oil size 12 jar", "target_attributes": { "attributes": [ "leak proof" ], "options": [] }, "asin": "B079B3266S" }, { "task_id": "ws_B079B3266S_3176", "instruction": "i need a leak proof, bpa free cosmetic bag that can fit 12 jars inside. look for a pink one.", "target_attributes": { "attributes": [ "leak proof", "bpa free" ], "options": [ "pink", "12 jars" ] }, "asin": "B079B3266S" }, { "task_id": "ws_B09T3PYRH9_3177", "instruction": "i am looking for gold color high definition tablets", "target_attributes": { "attributes": [ "high definition" ], "options": [ "gold" ] }, "asin": "B09T3PYRH9" }, { "task_id": "ws_B092VMNRC1_3178", "instruction": "i'm interested in a rose gold makeup mirror that is double-sided and easy to carry.", "target_attributes": { "attributes": [ "double sided", "easy carry", "rose gold" ], "options": [] }, "asin": "B092VMNRC1" }, { "task_id": "ws_B07NB11WCT_3179", "instruction": "i want a sound bar with stereo sound", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B07NB11WCT" }, { "task_id": "ws_B07NB11WCT_3180", "instruction": "i want a stereo sound soundbar+wireless subwoofer home theater system.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B07NB11WCT" }, { "task_id": "ws_B08NSX1MM6_3181", "instruction": "i am looking for hair salon trolley, of color silver 27.5\"-43 height", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "silver" ] }, "asin": "B08NSX1MM6" }, { "task_id": "ws_B09NMJR882_3182", "instruction": "find a moisturizer with natural ingredients for dead skin", "target_attributes": { "attributes": [ "natural ingredients", "dead skin" ], "options": [] }, "asin": "B09NMJR882" }, { "task_id": "ws_B00LR7CO04_3183", "instruction": "i'm looking for a everyday wear chukka with rubber outsole. also choose 11.5-d with 11 wide bomber colored one.", "target_attributes": { "attributes": [ "rubber outsole", "everyday wear" ], "options": [ "bomber | bomber", "11 wide", "11.5-d" ] }, "asin": "B00LR7CO04" }, { "task_id": "ws_B00LR7CO04_3184", "instruction": "i want a pair of extra wide rubber chukka shoes.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "8 wide" ] }, "asin": "B00LR7CO04" }, { "task_id": "ws_B00LR7CO04_3185", "instruction": "my order is : a pair of twisted x men's chukka riding mocs - handmade riding mocs in full grain leather with special size 14-d. let me know if you can find it in bombe/neon orange. i'm also looking for a rubber sole", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "bomber | neon orange", "14-d" ] }, "asin": "B00LR7CO04" }, { "task_id": "ws_B00LR7CO04_3186", "instruction": "i am looking for a pair of men's size 10 everyday wear mocs.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "10" ] }, "asin": "B00LR7CO04" }, { "task_id": "ws_B079KCFTZ9_3187", "instruction": "i need a remote control for my blue-ray", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B079KCFTZ9" }, { "task_id": "ws_B08ZXXJL6N_3188", "instruction": "i am looking for quad core 128gb emmc mini computer with windows 10 pro of size : intel n4020 4gb|128gb", "target_attributes": { "attributes": [ "quad core" ], "options": [ "intel n4020 4gb | 128gb" ] }, "asin": "B08ZXXJL6N" }, { "task_id": "ws_B08LBMXBNF_3189", "instruction": "i am in need of matte screen protector tempered glass for iphone 12 pro max (6.7\")", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "6.7\"" ] }, "asin": "B08LBMXBNF" }, { "task_id": "ws_B09RB2JZ6D_3190", "instruction": "i am looking for a portable high-power wireless bluetooth speaker. also choose gray color.", "target_attributes": { "attributes": [ "high power" ], "options": [ "gray" ] }, "asin": "B09RB2JZ6D" }, { "task_id": "ws_B09RB2JZ6D_3191", "instruction": "i need a black wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09RB2JZ6D" }, { "task_id": "ws_B092JFXKLS_3192", "instruction": "i am looking for daily wear shorts in dark blue color", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "dark blue" ] }, "asin": "B092JFXKLS" }, { "task_id": "ws_B08RXZFJCB_3193", "instruction": "i am looking for a short for a pregnant woman with high waist and able to do quick drying. also choose dark purple color and x-large size.", "target_attributes": { "attributes": [ "quick drying", "high waist" ], "options": [ "2pcs - black + dark purple", "x-large" ] }, "asin": "B08RXZFJCB" }, { "task_id": "ws_B08R92G3DR_3194", "instruction": "i am looking for a light weight photography backdrop for a digital photography. also choose printed backdrop 11 color and 5x7 size.", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "printed backdrop 11", "5x7 ft" ] }, "asin": "B08R92G3DR" }, { "task_id": "ws_B08R92G3DR_3195", "instruction": "i need a printed backdrop for digital photography that is 7 by 10 ft", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 03", "7x10 ft" ] }, "asin": "B08R92G3DR" }, { "task_id": "ws_B098R1LMGC_3196", "instruction": "i want baralonly non slip slippers in size 9.5 for men.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "9.5-10" ] }, "asin": "B098R1LMGC" }, { "task_id": "ws_B09B27HLGV_3197", "instruction": "i am looking for a sweater with long sleeve also able to quick drying. also choose black kids 05 color and 4-5t size.", "target_attributes": { "attributes": [ "quick drying", "long sleeve" ], "options": [ "black kids 05", "4-5t" ] }, "asin": "B09B27HLGV" }, { "task_id": "ws_B08XK4R9TH_3198", "instruction": "i want vanity lights made with brushed nickel.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "brushed nickel" ] }, "asin": "B08XK4R9TH" }, { "task_id": "ws_B01NAQTN1T_3199", "instruction": "i am looking for fresh breath tooth paste", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B01NAQTN1T" }, { "task_id": "ws_B0936DMW9S_3200", "instruction": "i am looking for long lasting, non toxic glossy nail polish of color : tuscany", "target_attributes": { "attributes": [ "non toxic", "long lasting" ], "options": [ "tuscany" ] }, "asin": "B0936DMW9S" }, { "task_id": "ws_B086PCKRBV_3201", "instruction": "i am looking for easy assemble white color beds", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B086PCKRBV" }, { "task_id": "ws_B08BHB6GMK_3202", "instruction": "find a 0.8 ounce fruit snack pack made from simple ingredients", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "0.8 ounce (pack of 8)" ] }, "asin": "B08BHB6GMK" }, { "task_id": "ws_B09MT7WSBJ_3203", "instruction": "i am looking for 2 pieces of machine wash large size adult nightgown pajama sleep sets", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "multi 9", "large" ] }, "asin": "B09MT7WSBJ" }, { "task_id": "ws_B09GNY9N38_3204", "instruction": "i want a xx-large shegnsi plus size womens high waist trench coat.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "xx-large" ] }, "asin": "B09GNY9N38" }, { "task_id": "ws_B08B5ML5YF_3205", "instruction": "i am interested in buying wall art which is suitable for dining room, has color of artwork-26 and with a size of 32\"wx16\"hx1pcs", "target_attributes": { "attributes": [ "dining room" ], "options": [ "artwork-26", "32\"wx16\"hx1pcs" ] }, "asin": "B08B5ML5YF" }, { "task_id": "ws_B00JKUPP74_3206", "instruction": "i am looking for digital camera high resolution in white", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "white" ] }, "asin": "B00JKUPP74" }, { "task_id": "ws_B07K8STW37_3207", "instruction": "i'm looking for a pair of low rise boyfriend jeans in antic charcoal. i need a 28 waist and 32 length.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "antic charcoal", "28w x 32l" ] }, "asin": "B07K8STW37" }, { "task_id": "ws_B09P4RK8LY_3208", "instruction": "i'm looking for a white nightstand with a 1 shelf storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "white" ] }, "asin": "B09P4RK8LY" }, { "task_id": "ws_B093KGC7RW_3209", "instruction": "i am looking for in travel laundry bag", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KGC7RW" }, { "task_id": "ws_B08BR4HCPV_3210", "instruction": "i'm looking for a easy to assemble showcase cabinet with good storage space and has tempered glass countertop. also choose 47.2\"h * 15.7\" w sized one.", "target_attributes": { "attributes": [ "easy assemble", "tempered glass", "storage space" ], "options": [ "47.2\u201dh x 15.7\u201dw" ] }, "asin": "B08BR4HCPV" }, { "task_id": "ws_B09L1JYY7R_3211", "instruction": "i am interested in buying pullover for women which is machine washable and have women christmas gifts-a153-khaki color, and of size 3x-large", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "women christmas gifts-a153-khaki", "3x-large" ] }, "asin": "B09L1JYY7R" }, { "task_id": "ws_B000MICPWQ_3212", "instruction": "i want a campbell's soup that has vitamins and are made of chicken & star shaped pasta.", "target_attributes": { "attributes": [ "source vitamin" ], "options": [ "chicken & star shaped pasta" ] }, "asin": "B000MICPWQ" }, { "task_id": "ws_B079YDY7P2_3213", "instruction": "i want a high performance ps4.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B079YDY7P2" }, { "task_id": "ws_B09S6STSTZ_3214", "instruction": "i want a high quality dental floss to improve my oral hygiene", "target_attributes": { "attributes": [ "high quality", "oral hygiene" ], "options": [] }, "asin": "B09S6STSTZ" }, { "task_id": "ws_B07Y64XJ33_3215", "instruction": "i want a 16x16 painting for my living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "16x16 inches*4pcs" ] }, "asin": "B07Y64XJ33" }, { "task_id": "ws_B01HU10MSG_3216", "instruction": "i want a shilo dark chocolate wig made from natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "darkchocolate" ] }, "asin": "B01HU10MSG" }, { "task_id": "ws_B07SZ9Q7WF_3217", "instruction": "i'm looking for a machine washable, classic fit tank tops made of heathers cotton and has needle sleeve. also, choose women's small, red colored one", "target_attributes": { "attributes": [ "machine wash", "heathers cotton", "needle sleeve", "classic fit" ], "options": [ "red", "women", "small" ] }, "asin": "B07SZ9Q7WF" }, { "task_id": "ws_B000AMUL9S_3218", "instruction": "need a projection screen that is ultra hd and is easy to install. i'm looking for black/white version with 113\" size. aspect ratio needs to be 1:1 and pattern is projector screen + 6\" white screen.", "target_attributes": { "attributes": [ "ultra hd", "easy install" ], "options": [ "black | white", "projector screen + 6\" white projector screen", "113\"", "1:1, apect ratio" ] }, "asin": "B000AMUL9S" }, { "task_id": "ws_B000AMUL9S_3219", "instruction": "i would like a black 84\" projection screen with a 16:9 ultra hd aspect ratio.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "black | white", "projector screen", "84\"", "16:9, aspect ratio" ] }, "asin": "B000AMUL9S" }, { "task_id": "ws_B000AMUL9S_3220", "instruction": "i am looking for 150\" white color 4k ultra hd 3d ready projector screen", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "black | white", "150\"" ] }, "asin": "B000AMUL9S" }, { "task_id": "ws_B000AMUL9S_3221", "instruction": "i am looking for projector screens of size 106\" that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "106\"" ] }, "asin": "B000AMUL9S" }, { "task_id": "ws_B000AMUL9S_3222", "instruction": "i'm looking for a easy to install ultra hd manual projector screen in size 136 inch. choose the ones that come in color white.", "target_attributes": { "attributes": [ "ultra hd", "easy install" ], "options": [ "white", "projector screen + 6\" white projector screen", "136\"", "manual" ] }, "asin": "B000AMUL9S" }, { "task_id": "ws_B09SNPM6XX_3223", "instruction": "dermatologically tested waterproof eyeliner", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [] }, "asin": "B09SNPM6XX" }, { "task_id": "ws_B074D96PLL_3224", "instruction": "i am searching for fluoride free toothpaste scented with coconut chamomile, 4.2 oz", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "coconut chamomile" ] }, "asin": "B074D96PLL" }, { "task_id": "ws_B08LW5QSR4_3225", "instruction": "i am interested in buying machine washable throws which are in magenta green color and the size should be 60\" x 80\" for adults.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "magenta green", "60\" x 80\" for adults" ] }, "asin": "B08LW5QSR4" }, { "task_id": "ws_B08L3868VD_3226", "instruction": "i want a stainless steel minkissy eyebrow trimming tool.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B08L3868VD" }, { "task_id": "ws_B098F2FPS1_3227", "instruction": "i would like a pair of size 8.5 black sandals with a open toe.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black", "8.5" ] }, "asin": "B098F2FPS1" }, { "task_id": "ws_B09MQLXKX2_3228", "instruction": "i need a a31 light weight background", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a31" ] }, "asin": "B09MQLXKX2" }, { "task_id": "ws_B09FJS23PM_3229", "instruction": "i am in need of insulated wine tumbler and natural soy wax candles -4 packs", "target_attributes": { "attributes": [ "soy wax" ], "options": [] }, "asin": "B09FJS23PM" }, { "task_id": "ws_B08KSR21TM_3230", "instruction": "i'm looking for travel size men's perfume in a 0.27 fl oz bottle size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "0.27 fl oz (pack of 1)" ] }, "asin": "B08KSR21TM" }, { "task_id": "ws_B08KSR21TM_3231", "instruction": "i am looking for a refillable perfume sprayer for travelling purposes. look for an 8 ml size.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B08KSR21TM" }, { "task_id": "ws_B08KSR21TM_3232", "instruction": "i'm looking for fragrance for travel size and its for long lasting and need to buy it.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "chanel chance impression" ] }, "asin": "B08KSR21TM" }, { "task_id": "ws_B08KSR21TM_3233", "instruction": "azzaro wanted gil impression perfume travel size refillable and quality should be high", "target_attributes": { "attributes": [ "travel size", "high quality" ], "options": [] }, "asin": "B08KSR21TM" }, { "task_id": "ws_B08R6NCZ95_3234", "instruction": "i am looking for a gluten free snacking avocado with non gmo.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [] }, "asin": "B08R6NCZ95" }, { "task_id": "ws_B08NT3YW86_3235", "instruction": "i'm looking for an aluminum alloy, ultra hd hdmi cable that is designed for plug and play.", "target_attributes": { "attributes": [ "ultra hd", "plug play", "aluminum alloy" ], "options": [] }, "asin": "B08NT3YW86" }, { "task_id": "ws_B0017645AM_3236", "instruction": "i am looking for gold plated video cables", "target_attributes": { "attributes": [ "gold plated" ], "options": [] }, "asin": "B0017645AM" }, { "task_id": "ws_B09SLPNPJ2_3237", "instruction": "i am looking for women fashion sneakers with anti slip, steel toe, high heel, memory foam of size :10", "target_attributes": { "attributes": [ "anti slip", "steel toe", "high heel", "memory foam" ], "options": [ "10" ] }, "asin": "B09SLPNPJ2" }, { "task_id": "ws_B07X7M89C2_3238", "instruction": "i'm looking for a high performance and high definition bluetooth speakers with stereo sound effect. also, choose golden colored one.", "target_attributes": { "attributes": [ "high performance", "high definition", "stereo sound", "wireless bluetooth" ], "options": [ "golden" ] }, "asin": "B07X7M89C2" }, { "task_id": "ws_B0741RSZTQ_3239", "instruction": "i wanna purchase quadshield black color 50ft coaxial cable for broadband internet connection", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "quadshield - black" ] }, "asin": "B0741RSZTQ" }, { "task_id": "ws_B09KT3S2HF_3240", "instruction": "i am looking for white color high power speaker", "target_attributes": { "attributes": [ "high power" ], "options": [ "white" ] }, "asin": "B09KT3S2HF" }, { "task_id": "ws_B07WYFCZH7_3241", "instruction": "i am looking for super soft fastupda fleece throw blanket of size (50\"x80\")", "target_attributes": { "attributes": [ "super soft" ], "options": [ "50\" x 80\"" ] }, "asin": "B07WYFCZH7" }, { "task_id": "ws_B09C7NSC1K_3242", "instruction": "i am looking a cosmetic display cases for lipstick eyeshadow highliter blushes brushes", "target_attributes": { "attributes": [ "storage case", "eye shadow" ], "options": [] }, "asin": "B09C7NSC1K" }, { "task_id": "ws_B08SBZPV6D_3243", "instruction": "i want to buy famous tik-tok leggings, yoga pants for women which have high waist tummy control booty bubble and hip lifting with running tights. which is the size x-small and a-red color.", "target_attributes": { "attributes": [ "butt lifting", "tummy control", "high waist" ], "options": [ "a-red", "x-small" ] }, "asin": "B08SBZPV6D" }, { "task_id": "ws_B09LHDGJ4G_3244", "instruction": "i am in need of large sized wine color long sleeve shirts for women", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z04-wine", "large" ] }, "asin": "B09LHDGJ4G" }, { "task_id": "ws_B09MCMWHHR_3245", "instruction": "i am looking for eco friendly water ripple multicolor glass window film of size : 17.7\"x47.2\"x2pcs", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "17.7\" x 47.2\" x 2 pcs" ] }, "asin": "B09MCMWHHR" }, { "task_id": "ws_B098D2ZY3J_3246", "instruction": "i am interested in buying a cookies which can be perfect gift, and the flavor of which is of donut", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "donut" ] }, "asin": "B098D2ZY3J" }, { "task_id": "ws_B094CG6VJF_3247", "instruction": "i would like a white 42 by 72 inch window panel for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white", "42''wx72''l" ] }, "asin": "B094CG6VJF" }, { "task_id": "ws_B09NNKB863_3248", "instruction": "i am looking for photo background high resolution in 15*10ft", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "15x10ft" ] }, "asin": "B09NNKB863" }, { "task_id": "ws_B09NNKB863_3249", "instruction": "i need a six by four foot backdrop for digital photography. it should be high resolution and light weight.", "target_attributes": { "attributes": [ "light weight", "high resolution", "digital photography" ], "options": [ "6x4ft" ] }, "asin": "B09NNKB863" }, { "task_id": "ws_B09BZWDPYR_3250", "instruction": "i want notmilk chocolate plant-based milk.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B09BZWDPYR" }, { "task_id": "ws_B08P5Y825J_3251", "instruction": "i want a book case made from solid to use as a decoration in my living room", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [] }, "asin": "B08P5Y825J" }, { "task_id": "ws_B09FZ9X3S1_3252", "instruction": "i am looking for a cat paw pink kid\u2019s toothbrush that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "cat paw,pink" ] }, "asin": "B09FZ9X3S1" }, { "task_id": "ws_B093D82CN7_3253", "instruction": "i want machine washable pajamas", "target_attributes": { "attributes": [ "machine washable" ], "options": [] }, "asin": "B093D82CN7" }, { "task_id": "ws_B07PHVWYYY_3254", "instruction": "i am looking for a tampered glass screen protector which is bubble free.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [] }, "asin": "B07PHVWYYY" }, { "task_id": "ws_B07SQ6846S_3255", "instruction": "i would like to buy a pencil backdrop which is of high resolution, it is easy carry, and has a size of 6x4ft-vinyl", "target_attributes": { "attributes": [ "high resolution", "easy carry" ], "options": [ "6x4ft-vinyl" ] }, "asin": "B07SQ6846S" }, { "task_id": "ws_B09GLVLL82_3256", "instruction": "i need 17 pcs of space saving porcelain ceramic tea sets", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B09GLVLL82" }, { "task_id": "ws_B09Q28265S_3257", "instruction": "i am seraching for eco friendly candles and clean cotton holders for my home & kitchen.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "clean cotton" ] }, "asin": "B09Q28265S" }, { "task_id": "ws_B09Q28265S_3258", "instruction": "i want a autumn spice jar candle that is eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "autumn spice" ] }, "asin": "B09Q28265S" }, { "task_id": "ws_B093YRM6FL_3259", "instruction": "i want a set of 2 mesh laundry bags with green leaves design.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YRM6FL" }, { "task_id": "ws_B08XH5G5DG_3260", "instruction": "i am looking for non gmo, nut free, gluten free and real fruit , all natural fruit snacks with flaovr name : passion fruit power pals", "target_attributes": { "attributes": [ "gluten free", "non gmo", "nut free", "real fruit" ], "options": [ "passion fruit power pals" ] }, "asin": "B08XH5G5DG" }, { "task_id": "ws_B09MMYY1WG_3261", "instruction": "find a toothpaste with natural ingredients", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B09MMYY1WG" }, { "task_id": "ws_B09MMYY1WG_3262", "instruction": "i would like a color a toothpaste made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "a" ] }, "asin": "B09MMYY1WG" }, { "task_id": "ws_B08BSWZJ4G_3263", "instruction": "i am looking for ready eat in coconut & kale", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "coconut & kale" ] }, "asin": "B08BSWZJ4G" }, { "task_id": "ws_B073JBV926_3264", "instruction": "i am looking for ivory color rugs for dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "ivory | gold" ] }, "asin": "B073JBV926" }, { "task_id": "ws_B073JBV926_3265", "instruction": "i need a living room rug that is gold and ivory in the shape of a square.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold | ivory", "square" ] }, "asin": "B073JBV926" }, { "task_id": "ws_B073JBV926_3266", "instruction": "i am looking for rectangular shaped dark grey color entryway plush thick area rug of size 2 ft 3 in x 6 ft for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark grey | ivory", "2 ft 3 in x 6 ft" ] }, "asin": "B073JBV926" }, { "task_id": "ws_B08N52H4T2_3267", "instruction": "i am looking for super soft multi color duvet cover sets", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 20" ] }, "asin": "B08N52H4T2" }, { "task_id": "ws_B08N52H4T2_3268", "instruction": "i'm looking for a super soft leopard pattern duvet with multi 3 colors. king and queen size please thanks.", "target_attributes": { "attributes": [ "super soft", "king size" ], "options": [ "multi 3", "queen" ] }, "asin": "B08N52H4T2" }, { "task_id": "ws_B07DVTNWND_3269", "instruction": "i am looking a gift set of jams and jellies gluten free variety-favorites size 1.25 pound", "target_attributes": { "attributes": [ "gluten free", "gift set" ], "options": [ "variety - favorites", "1.25 pound (pack of 2)" ] }, "asin": "B07DVTNWND" }, { "task_id": "ws_B09QGL58LF_3270", "instruction": "complete, easy-to-carry orthodontic storage case", "target_attributes": { "attributes": [ "easy carry", "storage case" ], "options": [] }, "asin": "B09QGL58LF" }, { "task_id": "ws_B082LK92B2_3271", "instruction": "i want to buy hair color which is dermatologist test, is oil free, and is of dark chocolate color", "target_attributes": { "attributes": [ "dermatologist tested", "oil free" ], "options": [ "dark chocolate" ] }, "asin": "B082LK92B2" }, { "task_id": "ws_B09913B3WZ_3272", "instruction": "i'm looking for a 32 ounce package of gluten free almond flour.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "32 ounce" ] }, "asin": "B09913B3WZ" }, { "task_id": "ws_B08GCJYF4M_3273", "instruction": "i'm looking for a mini desktop pc with an intel core i7-9750h processor.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7-9750h" ] }, "asin": "B08GCJYF4M" }, { "task_id": "ws_B08GCJYF4M_3274", "instruction": "i am looking for a windows 10 pro mini computer with an intel core i7-10750h, 32 gigabytes of ram, a 256 gigabyte ssd and gigabyte ethernet.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7-10750h" ] }, "asin": "B08GCJYF4M" }, { "task_id": "ws_B08GCJYF4M_3275", "instruction": "i need an intel core i7 mini computer.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i7-7820hk ddr4" ] }, "asin": "B08GCJYF4M" }, { "task_id": "ws_B08GCJYF4M_3276", "instruction": "i need a dual band computer with intel core, 64 gb ram and 1tb ssd.", "target_attributes": { "attributes": [ "dual band", "intel core" ], "options": [ "64gb ram+1tb ssd" ] }, "asin": "B08GCJYF4M" }, { "task_id": "ws_B09J8B4HF8_3277", "instruction": "i am looking for a high quality glossy pink nail polish storage case that is easy to clean.", "target_attributes": { "attributes": [ "easy clean", "high quality", "storage case", "nail polish" ], "options": [ "glossy pink" ] }, "asin": "B09J8B4HF8" }, { "task_id": "ws_B07BQJ4ZY3_3278", "instruction": "i am looking for gluten free cinnamon crisps", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cinnamon crisps" ] }, "asin": "B07BQJ4ZY3" }, { "task_id": "ws_B08Z43RZH5_3279", "instruction": "i am looking for a portable wireless bluetooth speaker with high performance. also choose green color.", "target_attributes": { "attributes": [ "high performance", "wireless bluetooth" ], "options": [ "green" ] }, "asin": "B08Z43RZH5" }, { "task_id": "ws_B097NMV9LS_3280", "instruction": "i want a gentle facial cleanser for acne prone & sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "gentle facial cleanser for acne-prone & sensitive skin" ] }, "asin": "B097NMV9LS" }, { "task_id": "ws_B097NMV9LS_3281", "instruction": "i'm interested in calming gel acne facial moisturizer for sensitive skin that is oil-free and not tested on animals.", "target_attributes": { "attributes": [ "oil free", "animal testing", "sensitive skin" ], "options": [ "calming gel acne facial moisturizer" ] }, "asin": "B097NMV9LS" }, { "task_id": "ws_B07MTNSZRG_3282", "instruction": "i am looking for red color short sleeve shirts", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "red" ] }, "asin": "B07MTNSZRG" }, { "task_id": "ws_B0195UTJ48_3283", "instruction": "i'm looking for a toothpaste that clears bad breath and gives fresh breath.", "target_attributes": { "attributes": [ "fresh breath", "bad breath" ], "options": [] }, "asin": "B0195UTJ48" }, { "task_id": "ws_B07N8JDZ1R_3284", "instruction": "i want a light gray oliver king size arched tufted platform bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "light gray" ] }, "asin": "B07N8JDZ1R" }, { "task_id": "ws_B07N8JDZ1R_3285", "instruction": "i would like a queen sized black bed with a box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "black", "queen" ] }, "asin": "B07N8JDZ1R" }, { "task_id": "ws_B099RNR9YY_3286", "instruction": "i am looking for fuzzy sandals open toe fox fur slippers in khaki", "target_attributes": { "attributes": [ "open toe" ], "options": [ "khaki" ] }, "asin": "B099RNR9YY" }, { "task_id": "ws_B086BLTNF6_3287", "instruction": "i want a easy to clean bag", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B086BLTNF6" }, { "task_id": "ws_B07CYJ5RR8_3288", "instruction": "find cookies made with high fructose", "target_attributes": { "attributes": [ "high fructose" ], "options": [] }, "asin": "B07CYJ5RR8" }, { "task_id": "ws_B07CYJ5RR8_3289", "instruction": "i would like a six pack of 34.92 ounce non-gmo cookies.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "vanilla", "34.92 oz (pack of 6)" ] }, "asin": "B07CYJ5RR8" }, { "task_id": "ws_B08XVVWBZB_3290", "instruction": "i am looking for pink color hair removal razors", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "pink" ] }, "asin": "B08XVVWBZB" }, { "task_id": "ws_B087R7CNGV_3291", "instruction": "i am looking for easy to install video player", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B087R7CNGV" }, { "task_id": "ws_B096ZHCL38_3292", "instruction": "i want cake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B096ZHCL38" }, { "task_id": "ws_B087WVQBY1_3293", "instruction": "i am looking for gluten free doodles wavy corn chips, 1.37 ounce (pack of 36)", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1.37 ounce (pack of 36)" ] }, "asin": "B087WVQBY1" }, { "task_id": "ws_B07N7C3NY4_3294", "instruction": "i'm looking for a high waist boxer brief for men made of stretchable polyester spandex fabric. also choose x-large style 1.", "target_attributes": { "attributes": [ "stretch fabric", "high waist", "polyester spandex" ], "options": [ "style 1", "x-large" ] }, "asin": "B07N7C3NY4" }, { "task_id": "ws_B08KPDBL5H_3295", "instruction": "find a lactose free cake topper", "target_attributes": { "attributes": [ "lactose free" ], "options": [] }, "asin": "B08KPDBL5H" }, { "task_id": "ws_B08KPDBL5H_3296", "instruction": "i am looking to purchase a dollar-patterned cake topper that has to be lactose and dairy free.", "target_attributes": { "attributes": [ "lactose free", "dairy free" ], "options": [ "new dollar" ] }, "asin": "B08KPDBL5H" }, { "task_id": "ws_B018RMJD3M_3297", "instruction": "i am looking for a coconut oil for hair growth. also choose 8 fl oz ( pack 1)", "target_attributes": { "attributes": [ "coconut oil", "hair growth" ], "options": [ "8 fl oz (pack of 1)" ] }, "asin": "B018RMJD3M" }, { "task_id": "ws_B072J9W4R9_3298", "instruction": "i want a vanguard veo 2 204ab black carbon fiber tripod.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B072J9W4R9" }, { "task_id": "ws_B000GG0BPW_3299", "instruction": "i want six boxes of earl grey decaf with 20 individually wrapper bags.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "earl grey decaf", "20 count (pack of 6)" ] }, "asin": "B000GG0BPW" }, { "task_id": "ws_B074LBXWK5_3300", "instruction": "i am looking for high quality pink color bags", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pink" ] }, "asin": "B074LBXWK5" }, { "task_id": "ws_B074LBXWK5_3301", "instruction": "i need a bpa free bag that is blue", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "blue" ] }, "asin": "B074LBXWK5" }, { "task_id": "ws_B09GSSDYVV_3302", "instruction": "carbamide peroxide whitening pen, easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09GSSDYVV" }, { "task_id": "ws_B06XRXHKBN_3303", "instruction": "i am looking for machine washable ambesonne ocean kitchen curtains of color : green yellow", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "green yellow" ] }, "asin": "B06XRXHKBN" }, { "task_id": "ws_B097Q8F6C4_3304", "instruction": "i want a easy to use eyeshadow", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B097Q8F6C4" }, { "task_id": "ws_B09LSBCVQT_3305", "instruction": "i would like a brown dining set that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "brown" ] }, "asin": "B09LSBCVQT" }, { "task_id": "ws_B01BY04QIG_3306", "instruction": "i would like ten 100 ft long gold plated hdmi male male cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "hdmi male-male", "10 pack", "100ft" ] }, "asin": "B01BY04QIG" }, { "task_id": "ws_B01BY04QIG_3307", "instruction": "look for 100ft high speed hdmi cable male to male with ethernet black (50 feet/15.2 meters). show me the price .", "target_attributes": { "attributes": [ "high speed" ], "options": [ "100ft" ] }, "asin": "B01BY04QIG" }, { "task_id": "ws_B09LV4XQ28_3308", "instruction": "find a leak proof bag", "target_attributes": { "attributes": [ "leak proof" ], "options": [] }, "asin": "B09LV4XQ28" }, { "task_id": "ws_B09LV4XQ28_3309", "instruction": "i'm looking for white colored travel bottles easy to carry.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "white marble" ] }, "asin": "B09LV4XQ28" }, { "task_id": "ws_B09LV4XQ28_3310", "instruction": "i'm looking for light weighted travel bottles and the color was pink bottles.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "pink topaz" ] }, "asin": "B09LV4XQ28" }, { "task_id": "ws_B09LV4XQ28_3311", "instruction": "i want a s'well 12 oz travel bottle set.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "12 oz" ] }, "asin": "B09LV4XQ28" }, { "task_id": "ws_B09LV4XQ28_3312", "instruction": "i want a leak proof and blonde s'well travel bottle set.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "blonde wood" ] }, "asin": "B09LV4XQ28" }, { "task_id": "ws_B0041VVEWW_3313", "instruction": "i am looking for birkenstock gizeh synthetic sole in navy oiled leather", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "navy oiled leather" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B0041VVEWW_3314", "instruction": "i like synthetic sole in graceful antique lace", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "graceful antique lace" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B0041VVEWW_3315", "instruction": "i'm looking for birkenstock gizeh.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "sandcastle nubuck" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B0041VVEWW_3316", "instruction": "i need some taupe flip flops that have arch support", "target_attributes": { "attributes": [ "arch support" ], "options": [ "taupe" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B0041VVEWW_3317", "instruction": "i need 5 size synthetic sole brown color gizeh sandals", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "5" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B0041VVEWW_3318", "instruction": "i would like a size 5 narrow tobacco brown flip flops with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "tabacco brown", "5-5.5 narrow" ] }, "asin": "B0041VVEWW" }, { "task_id": "ws_B087YVBDT5_3319", "instruction": "i am looking for non gmo, gluten free and artificial colors o2 oxygenated recovery drink with flavor name: lemon lime", "target_attributes": { "attributes": [ "non gmo", "gluten free", "artificial colors" ], "options": [ "lemon lime" ] }, "asin": "B087YVBDT5" }, { "task_id": "ws_B08TKLPXSB_3320", "instruction": "i am looking for a slip loafer with vinyl acetate. also choose dark khaki suede color and 7 narrow size.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "dark khaki suede" ] }, "asin": "B08TKLPXSB" }, { "task_id": "ws_B098D1Z5HM_3321", "instruction": "i need sugar free low carb, barbecue flavored marinade for meats, 102 ounce (pack of 3)", "target_attributes": { "attributes": [ "low carb", "sugar free" ], "options": [ "barbecue", "102 ounce (pack of 3)" ] }, "asin": "B098D1Z5HM" }, { "task_id": "ws_B098D1Z5HM_3322", "instruction": "i am looking for low carb, sugar free barbecue marinade in the 18 ounce size.", "target_attributes": { "attributes": [ "low carb", "sugar free" ], "options": [ "barbecue", "18 ounce" ] }, "asin": "B098D1Z5HM" }, { "task_id": "ws_B07Q38NGLJ_3323", "instruction": "i am looking for gluten free, non gmo and soy free b.fine foods snack mix with size: 4 ounce (pack of 3)", "target_attributes": { "attributes": [ "gluten free", "non gmo", "soy free" ], "options": [ "4 ounce (pack of 3)" ] }, "asin": "B07Q38NGLJ" }, { "task_id": "ws_B08QTQZYFV_3324", "instruction": "i want a bagel made from high quality ingredients", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [] }, "asin": "B08QTQZYFV" }, { "task_id": "ws_B09BJ2H8FP_3325", "instruction": "i am looking for black color hair dye", "target_attributes": { "attributes": [ "hair dye" ], "options": [] }, "asin": "B09BJ2H8FP" }, { "task_id": "ws_B09PV3LHTQ_3326", "instruction": "i need a a23 colored light weight background", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a23" ] }, "asin": "B09PV3LHTQ" }, { "task_id": "ws_B093KFVZZT_3327", "instruction": "purse set for washing blouse and underwear bra and panties", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093KFVZZT" }, { "task_id": "ws_B0868CP39L_3328", "instruction": "i am looking a long lasting hair cutting kits for hair salon color :sugur skull and flower", "target_attributes": { "attributes": [ "long lasting", "hair salon", "hair cutting" ], "options": [ "sugar skull and flowers" ] }, "asin": "B0868CP39L" }, { "task_id": "ws_B09SZM3FZP_3329", "instruction": "i am interested in buying shampoo for hair treatment.", "target_attributes": { "attributes": [ "hair treatment" ], "options": [] }, "asin": "B09SZM3FZP" }, { "task_id": "ws_B09NYG6X57_3330", "instruction": "i am looking for long lasting and nail polish cute blushs makecup palettes of color:c", "target_attributes": { "attributes": [ "long lasting", "nail polish" ], "options": [ "c" ] }, "asin": "B09NYG6X57" }, { "task_id": "ws_B08NFDW21H_3331", "instruction": "i want a bpa free autobrush brush head replacement for kids.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "kids" ] }, "asin": "B08NFDW21H" }, { "task_id": "ws_B08CR8WHD9_3332", "instruction": "i want a dual band beelink u59 mini pc with u59 8+256g.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "u59 8+256g" ] }, "asin": "B08CR8WHD9" }, { "task_id": "ws_B086Q83NQP_3333", "instruction": "i want a gluten free cake snack", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B086Q83NQP" }, { "task_id": "ws_B07JH1CRTB_3334", "instruction": "i want a gluten free gourmet popcorn", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07JH1CRTB" }, { "task_id": "ws_B01I4WNGM4_3335", "instruction": "i am interested in buying hdmi adapter cable which is compatible with apple, and is of white color while the size should be 6ft", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "white 1080p", "6ft" ] }, "asin": "B01I4WNGM4" }, { "task_id": "ws_B081XFTW4K_3336", "instruction": "i am looking for ready to eat peanut butter and jelly", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "peanut butter & jelly" ] }, "asin": "B081XFTW4K" }, { "task_id": "ws_B00LMHD160_3337", "instruction": "i want a low carb cake", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B00LMHD160" }, { "task_id": "ws_B09KGR7K6Q_3338", "instruction": "i am looking for a grey bunk bed with slats made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey" ] }, "asin": "B09KGR7K6Q" }, { "task_id": "ws_B096XF18FL_3339", "instruction": "i am looking for ultra hd surveillance dvr kits", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B096XF18FL" }, { "task_id": "ws_B00JWJEYCU_3340", "instruction": "i want a red ergonomic office chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red" ] }, "asin": "B00JWJEYCU" }, { "task_id": "ws_B09KBD72NV_3341", "instruction": "i'm looking for a plant based, non-dairy milk maker. also choose white milkmade with 6 storage glass one.", "target_attributes": { "attributes": [ "non dairy", "plant based" ], "options": [ "white milkmade with 6 storage glass cara..." ] }, "asin": "B09KBD72NV" }, { "task_id": "ws_B097CC8FNN_3342", "instruction": "i am looking for oral hygiene dental tools of design: set of 4", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "set of 4 (dental hygiene kit)" ] }, "asin": "B097CC8FNN" }, { "task_id": "ws_B09423373K_3343", "instruction": "i am looking for oily skin to instantly remove excess oil & shine in easy use", "target_attributes": { "attributes": [ "oil free", "easy use" ], "options": [] }, "asin": "B09423373K" }, { "task_id": "ws_B09DYK18MN_3344", "instruction": "find boots with arch support", "target_attributes": { "attributes": [ "arch support" ], "options": [] }, "asin": "B09DYK18MN" }, { "task_id": "ws_B07PWVF9W8_3345", "instruction": "i want to buy dual usb 3.0 male to usb 3.0 female auxiliary which is fast charging and is square dual usb 3.0", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "square dual usb3.0" ] }, "asin": "B07PWVF9W8" }, { "task_id": "ws_B09NNXGPDN_3346", "instruction": "i am looking for a cupcake topper for a birthday party. also choose gold with 35th pattern name.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 35th" ] }, "asin": "B09NNXGPDN" }, { "task_id": "ws_B0915MFNJ5_3347", "instruction": "i'm looking for a daily casual wear gym shorts with elastic waistband for men. also, choose small, army green colored one.", "target_attributes": { "attributes": [ "daily casual", "elastic waistband" ], "options": [ "army green", "small" ] }, "asin": "B0915MFNJ5" }, { "task_id": "ws_B07ZJBRDYC_3348", "instruction": "i'm looking for eco friendly window curtain panels for living room and dining room. also, choose 27.5\" * 39\" *2 panels with christmas-049zse9572 colored one.", "target_attributes": { "attributes": [ "eco friendly", "living room", "dining room" ], "options": [ "christmas-049zse9572", "27.5'' x 39'' x 2 panels" ] }, "asin": "B07ZJBRDYC" }, { "task_id": "ws_B0969ZRVJP_3349", "instruction": "i'm looking for personalized photo and name flip flops that are non slip and have memory foam. also, i need them in black.", "target_attributes": { "attributes": [ "non slip", "memory foam" ], "options": [ "black" ] }, "asin": "B0969ZRVJP" }, { "task_id": "ws_B08C2FVNQ9_3350", "instruction": "i am looking for an easy to use hair dye that is natural and coffee colored.", "target_attributes": { "attributes": [ "easy use", "hair dye" ], "options": [ "coffee" ] }, "asin": "B08C2FVNQ9" }, { "task_id": "ws_B07KZSKGCX_3351", "instruction": "i am looking for a certified refurbished inkjet printer.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07KZSKGCX" }, { "task_id": "ws_B07KRTFSD2_3352", "instruction": "i'm searching for natural permanent hair dye , 6g light golden brown color, 1 count", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "1 count" ] }, "asin": "B07KRTFSD2" }, { "task_id": "ws_B09N8PQHRK_3353", "instruction": "i need high quality perm rod curlers for natural hair styling. pick one in orange color.", "target_attributes": { "attributes": [ "high quality", "hair styling", "natural hair" ], "options": [ "orange color" ] }, "asin": "B09N8PQHRK" }, { "task_id": "ws_B09N8PQHRK_3354", "instruction": "i would like a 0.28 inch gray hair rollers for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "gray color", "0.28 inch" ] }, "asin": "B09N8PQHRK" }, { "task_id": "ws_B09B94Q73Z_3355", "instruction": "i would like to search for a tennis fashioned women running sneakers in black color preferably with ankle strap.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "z3-black" ] }, "asin": "B09B94Q73Z" }, { "task_id": "ws_B07HPBFS5S_3356", "instruction": "i'm looking for some easy to use body paint. get the one in rose gold.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "rose gold" ] }, "asin": "B07HPBFS5S" }, { "task_id": "ws_B093GK3SS8_3357", "instruction": "i need dusty pink mid century bar stools that don't have open backs.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "dusty pink", "no open back" ] }, "asin": "B093GK3SS8" }, { "task_id": "ws_B09NRZ5KGB_3358", "instruction": "i'm looking for a heavy duty queen sized bed frame in a rustic brown color.", "target_attributes": { "attributes": [ "queen size", "heavy duty" ], "options": [ "rustic brown" ] }, "asin": "B09NRZ5KGB" }, { "task_id": "ws_B00GJ782FI_3359", "instruction": "i am looking for high quality nail polish of fijji color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "fiji" ] }, "asin": "B00GJ782FI" }, { "task_id": "ws_B097T1434V_3360", "instruction": "can you find me a pair of men's slippers with memory foam and rubber soles? i want the ones that are khaki and either 10.5 or 11.", "target_attributes": { "attributes": [ "memory foam", "rubber sole" ], "options": [ "khaki", "10.5-11" ] }, "asin": "B097T1434V" }, { "task_id": "ws_B098NCCPPC_3361", "instruction": "i am looking for a clear glass shade, vanity light with black and brushed nickel finish.", "target_attributes": { "attributes": [ "glass shade", "nickel finish", "brushed nickel", "vanity light", "clear glass" ], "options": [ "black and brushed nickel" ] }, "asin": "B098NCCPPC" }, { "task_id": "ws_B08J5QX1WS_3362", "instruction": "i'm looking for a lactose free and gluten free nutrition bar. i want to get the one that is available in the 24 count.", "target_attributes": { "attributes": [ "lactose free", "gluten free" ], "options": [ "24 count (3 packs of 8)" ] }, "asin": "B08J5QX1WS" }, { "task_id": "ws_B09NVD36XN_3363", "instruction": "i am looking for some purple, woman's shoes in size 8 that have an anti-slip, rubber sole.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "purple", "8" ] }, "asin": "B09NVD36XN" }, { "task_id": "ws_B08BZXG337_3364", "instruction": "i am looking for purple accent side table end which is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "purple" ] }, "asin": "B08BZXG337" }, { "task_id": "ws_B09S3RBNNG_3365", "instruction": "i'm looking for a easy to install ottoman bench with handle made of faux leather. also, choose grey colored one.", "target_attributes": { "attributes": [ "easy install", "faux leather" ], "options": [ "grey" ] }, "asin": "B09S3RBNNG" }, { "task_id": "ws_B098PH8LVY_3366", "instruction": "i would like a color 15 72\" w x 63\" panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "72\" w x 63\" l" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3367", "instruction": "i'm looking for curtains for machinable products.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "color03" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3368", "instruction": "i am looking for 2 window panels that are 108\" wide and 84\" in length that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "108\" w x 84\" l" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3369", "instruction": "i want machine washable dream catcher light proof curtains that is 55\" w x 45\" l.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "55\" w x 45\" l" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3370", "instruction": "i want hand painted window covering curtain panels. the size should be 52\" wide and 63\" in length.", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "52\" w x 63\" l" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3371", "instruction": "i am looking for some machine washable curtains in the side 52\" by 63\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "52\" w x 63\" l" ] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B098PH8LVY_3372", "instruction": "i saw hand painted with size 96\" w x 90\"", "target_attributes": { "attributes": [ "hand painted" ], "options": [] }, "asin": "B098PH8LVY" }, { "task_id": "ws_B0944C6L42_3373", "instruction": "i would like some medium brown hair building fibers for my hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "medium brown" ] }, "asin": "B0944C6L42" }, { "task_id": "ws_B006H7YNNA_3374", "instruction": "find me the 2-pack of trader joe's chocolate covered peppermint joe's cookies.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [] }, "asin": "B006H7YNNA" }, { "task_id": "ws_B079B43M9T_3375", "instruction": "i want to get some baked fresh pretzels. can you get me 6 of them?", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "6" ] }, "asin": "B079B43M9T" }, { "task_id": "ws_B084P6N9MN_3376", "instruction": "i want an elastic waist beach shorts that is xx-large in size.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "xx-large" ] }, "asin": "B084P6N9MN" }, { "task_id": "ws_B08MJRJDNT_3377", "instruction": "i would like a 10x8ft light weight photo background for my studio that looks good on digital photography.", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "10x8ft" ] }, "asin": "B08MJRJDNT" }, { "task_id": "ws_B09QPN25MK_3378", "instruction": "i'm looking for a short sleeve shirt with a button down closure. get the one in 3xl.", "target_attributes": { "attributes": [ "button closure", "short sleeve" ], "options": [ "3x-large" ] }, "asin": "B09QPN25MK" }, { "task_id": "ws_B081CRX2WY_3379", "instruction": "can you find me a stainless steel band for my smartwatch? i need it to be 24 mm.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "24mm" ] }, "asin": "B081CRX2WY" }, { "task_id": "ws_B081CRX2WY_3380", "instruction": "i want a 20mm stainless steel handmade alligator leather watch band.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "20mm" ] }, "asin": "B081CRX2WY" }, { "task_id": "ws_B08TCD5LNW_3381", "instruction": "i would like a color12 hair cutting kit that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "color12" ] }, "asin": "B08TCD5LNW" }, { "task_id": "ws_B00JKK43AO_3382", "instruction": "i am looking for a certified organic and caffeine free tea that is licorice root flavored and comes in pack of 16.", "target_attributes": { "attributes": [ "caffeine free", "certified organic" ], "options": [ "licorice root", "16 count (pack of 4)" ] }, "asin": "B00JKK43AO" }, { "task_id": "ws_B00JKK43AO_3383", "instruction": "i am looking for caffeine free herbal leaf tea having hibiscus flavor.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "hibiscus" ] }, "asin": "B00JKK43AO" }, { "task_id": "ws_B00JKK43AO_3384", "instruction": "i would like a 32 count box of individually wrapped moringa with spearmint and sage tea bags that are certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "moringa with spearmint & sage", "32 count (pack of 3)" ] }, "asin": "B00JKK43AO" }, { "task_id": "ws_B09JPJX8RS_3385", "instruction": "i am looking for hair growth treatment for damaged hair. find me a pack of 2.", "target_attributes": { "attributes": [ "hair growth", "hair treatment", "damaged hair" ], "options": [] }, "asin": "B09JPJX8RS" }, { "task_id": "ws_B07ZDM9HBC_3386", "instruction": "i want non gmo liquid alchemist blood orange for cocktails.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "blood orange" ] }, "asin": "B07ZDM9HBC" }, { "task_id": "ws_B08JCRSWH6_3387", "instruction": "i am looking for a power amplifier that is silver.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "silver" ] }, "asin": "B08JCRSWH6" }, { "task_id": "ws_B0922YSW2X_3388", "instruction": "i'm looking for 3x-large women's top which will be a great gift for plus size women. ensure to pick the one with blakc color.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "black", "3x-large" ] }, "asin": "B0922YSW2X" }, { "task_id": "ws_B07SBCQXXG_3389", "instruction": "i would like a small blue blazer that can be dry cleaned.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "blue", "small" ] }, "asin": "B07SBCQXXG" }, { "task_id": "ws_B08BX7GW4N_3390", "instruction": "i need 2-pack dark chocolate almond bars that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "2-pack dark chocolate almond" ] }, "asin": "B08BX7GW4N" }, { "task_id": "ws_B08DQSR5N6_3391", "instruction": "i am looking for a kerating detangler spray that is effective at stimulating hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B08DQSR5N6" }, { "task_id": "ws_B09FZKCTVV_3392", "instruction": "i need a perfect sugar fruit gift basket for halloween party. it should be easy to use.", "target_attributes": { "attributes": [ "easy use", "perfect gift" ], "options": [] }, "asin": "B09FZKCTVV" }, { "task_id": "ws_B0927MLTZZ_3393", "instruction": "i need a stainless steel gua sha set that includes the roller and box.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "roller and box" ] }, "asin": "B0927MLTZZ" }, { "task_id": "ws_B09DGV3RC7_3394", "instruction": "can you find me a pair of open toe rubber sole pumps? get me the black one in 5.5.", "target_attributes": { "attributes": [ "open toe", "rubber sole" ], "options": [ "black", "5.5" ] }, "asin": "B09DGV3RC7" }, { "task_id": "ws_B09PBL7FCR_3395", "instruction": "i am looking for grey color women sandals.it must have steel toe.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "grey" ] }, "asin": "B09PBL7FCR" }, { "task_id": "ws_B09PG8VYL8_3396", "instruction": "i am looking for valentine d\u00e9cor for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09PG8VYL8" }, { "task_id": "ws_B09PG8VYL8_3397", "instruction": "i am looking for window treatment panels for living room and size should be 52x84 inx2.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52x84inx2" ] }, "asin": "B09PG8VYL8" }, { "task_id": "ws_B09P6CDSG5_3398", "instruction": "i need a box spring bunk bed. pick a grey one with slide.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "grey with slide" ] }, "asin": "B09P6CDSG5" }, { "task_id": "ws_B09CZBG4RW_3399", "instruction": "i am looking for variety pack of gluten free energy drinks.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety pack" ] }, "asin": "B09CZBG4RW" }, { "task_id": "ws_B01NBVCWP8_3400", "instruction": "i want to update the living room and need a bronze light fixture. i want you to buy one that is a sconce in the industrial style with clear glass globe shade.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "bronze" ] }, "asin": "B01NBVCWP8" }, { "task_id": "ws_B01D9HSULQ_3401", "instruction": "i need a hyaluronic acid lotion that is unscented.", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "unscented" ] }, "asin": "B01D9HSULQ" }, { "task_id": "ws_B09N8HH539_3402", "instruction": "i'm searching for blue color autumn winter shoes of open toe style and size 8.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "blue", "8" ] }, "asin": "B09N8HH539" }, { "task_id": "ws_B08TMN2DVH_3403", "instruction": "i want a low fat cereal that is also sugar free.", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B08TMN2DVH" }, { "task_id": "ws_B07MBD86WN_3404", "instruction": "i'm looking for an anti aging face mask with jojoba seed oil to restore my skin's vitality.", "target_attributes": { "attributes": [ "anti aging", "seed oil" ], "options": [ "vitality" ] }, "asin": "B07MBD86WN" }, { "task_id": "ws_B078N2XRNB_3405", "instruction": "i would like a pound of non gmo oatmeal", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B078N2XRNB" }, { "task_id": "ws_B07FYPSNH8_3406", "instruction": "i am looking for a gluten free, 100% vegan plant based protein shake that is soy-free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07FYPSNH8" }, { "task_id": "ws_B07QLJXLKX_3407", "instruction": "i would like a floor lamp light fixture for my living room.", "target_attributes": { "attributes": [ "light fixture", "living room" ], "options": [] }, "asin": "B07QLJXLKX" }, { "task_id": "ws_B08ND3NK5C_3408", "instruction": "i need a white maxax feather pendant light for the living room.", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [ "white" ] }, "asin": "B08ND3NK5C" }, { "task_id": "ws_B09Q3DSP3Y_3409", "instruction": "find me a women's 3 piece brazilian thong bikini set that is machine washable and size large. i need it in color a01#purple.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "a01#purple", "large" ] }, "asin": "B09Q3DSP3Y" }, { "task_id": "ws_B00YJG4GVU_3410", "instruction": "i'm searching for a black color 150-inch | 16:9, ultra hd and light weight projector screen", "target_attributes": { "attributes": [ "ultra hd", "light weight" ], "options": [ "black", "150-inch | 16:9" ] }, "asin": "B00YJG4GVU" }, { "task_id": "ws_B00YJG4GVU_3411", "instruction": "i am looking for a cinewhite sable frame series ultra hd projection material .i prefer light weight.", "target_attributes": { "attributes": [ "ultra hd", "light weight" ], "options": [ "cinewhite", "sable frame series" ] }, "asin": "B00YJG4GVU" }, { "task_id": "ws_B00YJG4GVU_3412", "instruction": "i'm looking for a 135 inch light weight projection screen.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "135-inch | 2.35:1" ] }, "asin": "B00YJG4GVU" }, { "task_id": "ws_B00YJG4GVU_3413", "instruction": "i would like a 92\" powergain ezframe cg5d series projection screen that is ultra hd.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "powergain", "92\" | 16:9", "ezframe cg5d series" ] }, "asin": "B00YJG4GVU" }, { "task_id": "ws_B00YJG4GVU_3414", "instruction": "i am interested in an ultra hd projection screen that is 92\"", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "92\" | 16:9" ] }, "asin": "B00YJG4GVU" }, { "task_id": "ws_B07NZML351_3415", "instruction": "i am looking for contemporary design featuring clean lines and smooth upholstery, storage ottoman offers the look, feel, and design of a truly contemporary piece. with a minimalistic yet refined structure, this piece brings out a simplistic style that emphasizes comfort and functionality of christopher knight home bancroft lift-top storage ottoman.", "target_attributes": { "attributes": [ "storage space", "contemporary design" ], "options": [] }, "asin": "B07NZML351" }, { "task_id": "ws_B0966FVJ5N_3416", "instruction": "i need easy to install window films that are multicolored and are 123.6\" by 78.7\".", "target_attributes": { "attributes": [ "easy install" ], "options": [ "multi-19818", "l23.6\" x h 78.7\"" ] }, "asin": "B0966FVJ5N" }, { "task_id": "ws_B0966FVJ5N_3417", "instruction": "i need a hand psychedelic painted window cover that is multi-19818 color and about l23.6\" x h 35.4\".", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "multi-19818", "l23.6\" x h 35.4\"" ] }, "asin": "B0966FVJ5N" }, { "task_id": "ws_B0966FVJ5N_3418", "instruction": "i need some multicolored window films that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "multi-19826" ] }, "asin": "B0966FVJ5N" }, { "task_id": "ws_B083SRWLJD_3419", "instruction": "i am looking for an intel core i5 desktop pc.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B083SRWLJD" }, { "task_id": "ws_B09M8TSCXP_3420", "instruction": "i am looking for a blue toothbrush for kids that is easy to use for ages 2-6.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "a02#blue", "age 2-6" ] }, "asin": "B09M8TSCXP" }, { "task_id": "ws_B07V5FHPWR_3421", "instruction": "can you get me a machine washable throw? get me one that is 30x40 inches.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "30 in x 40 in" ] }, "asin": "B07V5FHPWR" }, { "task_id": "ws_B005GPWCPA_3422", "instruction": "i'm looking for 16 plus petite women pant with regular fit and easy to care. also, choose vivid blue colored one", "target_attributes": { "attributes": [ "easy care", "regular fit" ], "options": [ "vivid blue", "16 plus petite" ] }, "asin": "B005GPWCPA" }, { "task_id": "ws_B093Y7Q1RR_3423", "instruction": "i need a heavy duty desk chair for my office. get me one that is easy to assemble though.", "target_attributes": { "attributes": [ "heavy duty", "easy assemble" ], "options": [] }, "asin": "B093Y7Q1RR" }, { "task_id": "ws_B08B51Q53Z_3424", "instruction": "i am looking for a vegan gourmet food gift basket with 4 bars.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "4 bars" ] }, "asin": "B08B51Q53Z" }, { "task_id": "ws_B08YRH7DJR_3425", "instruction": "i am looking for a long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B08YRH7DJR" }, { "task_id": "ws_B08YK7NVGD_3426", "instruction": "i need a liwin black wireless 3 in 1 qi-certified 15w fast charging station", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [ "black" ] }, "asin": "B08YK7NVGD" }, { "task_id": "ws_B08VHM34R6_3427", "instruction": "i am looking for shoes that are grey and light blue with a rubber sole in a size 11-11.5 women.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "grey | light blue", "11-11.5 women | 9.5-10 men" ] }, "asin": "B08VHM34R6" }, { "task_id": "ws_B09PL9FJRH_3428", "instruction": "i need a pink peach colored cruelty free blush.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "d" ] }, "asin": "B09PL9FJRH" }, { "task_id": "ws_B09PL9FJRH_3429", "instruction": "i would like a size a color f face cruelty free brush.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "f", "a" ] }, "asin": "B09PL9FJRH" }, { "task_id": "ws_B07GW9Q8FH_3430", "instruction": "i would like to purchase a 0.4 ounce hyaluronic acid water proof concealer that can help to improve the appearance of dark circles. the one with the 20.0 medium (n) color is preferable.", "target_attributes": { "attributes": [ "hyaluronic acid", "dark circles" ], "options": [ "20.0 medium (n)", "0.4 ounce" ] }, "asin": "B07GW9Q8FH" }, { "task_id": "ws_B07GW9Q8FH_3431", "instruction": "i need long lasting concealer that is in a light natural and is a pack of one.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "13.0 light natural (n)", "0.4 fl oz (pack of 1)" ] }, "asin": "B07GW9Q8FH" }, { "task_id": "ws_B07GW9Q8FH_3432", "instruction": "my skin included 0.4 size dark circle", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "0.4 fl oz" ] }, "asin": "B07GW9Q8FH" }, { "task_id": "ws_B093H9TCF8_3433", "instruction": "i want to buy a pair of but lifting grey skinny jean shorts.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "gray" ] }, "asin": "B093H9TCF8" }, { "task_id": "ws_B09NNDWMDG_3434", "instruction": "i am looking for a long sleeved graphic shirt that is large in size.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B09NNDWMDG" }, { "task_id": "ws_B08BZB7F14_3435", "instruction": "i need a black barber blade cleaning brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "black" ] }, "asin": "B08BZB7F14" }, { "task_id": "ws_B08254Z9ZZ_3436", "instruction": "i need a super soft brown color llama storage ottoman for living room", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "brown", "llama" ] }, "asin": "B08254Z9ZZ" }, { "task_id": "ws_B09B22X8TN_3437", "instruction": "i'd like to buy a queen size bed frame with a dark grey linen headboard.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "dark gray linen" ] }, "asin": "B09B22X8TN" }, { "task_id": "ws_B09B22X8TN_3438", "instruction": "i am looking for full size , faux leather and box sping pezzola led bed frame", "target_attributes": { "attributes": [ "faux leather", "box spring" ], "options": [ "full" ] }, "asin": "B09B22X8TN" }, { "task_id": "ws_B01M65AA2V_3439", "instruction": "i want an alcohol and sulfate free perfume for women. look for the poised clean breeze scent.", "target_attributes": { "attributes": [ "alcohol free", "sulfate free" ], "options": [ "poised (clean breeze)" ] }, "asin": "B01M65AA2V" }, { "task_id": "ws_B06X17CLQX_3440", "instruction": "i\u2019d like to find a core i5 micro tower desktop computer; it must have 8 gig of ram and have a 500 gig hard drive.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "micro tower | 500 gb hdd | 8g ram | i5 |..." ] }, "asin": "B06X17CLQX" }, { "task_id": "ws_B00TJ0PGDS_3441", "instruction": "i am looking for a headset that is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B00TJ0PGDS" }, { "task_id": "ws_B076PNSLTT_3442", "instruction": "i want you to find me a mini desktop computer with intel core. i want the one with no ram, no ssd, and no wifi.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "no ram, no ssd, no wifi" ] }, "asin": "B076PNSLTT" }, { "task_id": "ws_B077LQMF5Y_3443", "instruction": "can you find me a formal dress with a lace closure? i'm looking for something in ocean blue in size 24 plus.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "ocean blue", "24 plus" ] }, "asin": "B077LQMF5Y" }, { "task_id": "ws_B01IAA1O60_3444", "instruction": "i would like a coffee latte rooted wig made of natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "coffee latte rooted" ] }, "asin": "B01IAA1O60" }, { "task_id": "ws_B09NDR2N1Y_3445", "instruction": "find me a loose fitting, long sleeve hoodie for teenage girls. i want the one that is green and in xxl.", "target_attributes": { "attributes": [ "loose fit", "long sleeve", "teen girls" ], "options": [ "b5-green", "xx-large" ] }, "asin": "B09NDR2N1Y" }, { "task_id": "ws_B089T11DM4_3446", "instruction": "i need a z6-black and small short sleeve crop top for women.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "z6-black", "small" ] }, "asin": "B089T11DM4" }, { "task_id": "ws_B09DVKC4MV_3447", "instruction": "i'm looking for a khaki - light filtering cellular shades of size 67\"w x 39\"h for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "khaki - light filtering", "67\"w x 39\"h" ] }, "asin": "B09DVKC4MV" }, { "task_id": "ws_B09DVKC4MV_3448", "instruction": "i would like a 88 inch wide by 56 inch tall set of blinds for my living room preferably coffee colored.", "target_attributes": { "attributes": [ "living room" ], "options": [ "coffee - light filtering", "88\"w x 56\"h" ] }, "asin": "B09DVKC4MV" }, { "task_id": "ws_B09QSSCJPZ_3449", "instruction": "i am looking for a dairy free, and soy free vegan mac and cheese, id like to get a four pack of them.", "target_attributes": { "attributes": [ "dairy free", "soy free" ], "options": [] }, "asin": "B09QSSCJPZ" }, { "task_id": "ws_B019IOH5F6_3450", "instruction": "i am looking for a high speed hdmi male to male cable that is gold plated. i need it in a 10 pack.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "hdmi male to male" ] }, "asin": "B019IOH5F6" }, { "task_id": "ws_B019IOH5F6_3451", "instruction": "i am looking for a 1 pack of high speed hdmi cables", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1 pack" ] }, "asin": "B019IOH5F6" }, { "task_id": "ws_B0968SKYCF_3452", "instruction": "i want to get a fully cooked meat pizza. pick out the one that comes in the five pack.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "5 pack" ] }, "asin": "B0968SKYCF" }, { "task_id": "ws_B0968SKYCF_3453", "instruction": "ilooking a fully cooked 6 pack meat natural ingredient with sausage supreme flavour", "target_attributes": { "attributes": [ "fully cooked", "natural ingredients" ], "options": [ "sausage supreme", "6 pack" ] }, "asin": "B0968SKYCF" }, { "task_id": "ws_B0968SKYCF_3454", "instruction": "i need a bag of pizza pepperoni with natural pizza ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "sausage supreme" ] }, "asin": "B0968SKYCF" }, { "task_id": "ws_B0968SKYCF_3455", "instruction": "i am looking for well cooked frozen chicken pizza with double cheese in a size of 6 pack.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "cheese", "6 pack" ] }, "asin": "B0968SKYCF" }, { "task_id": "ws_B08Q3TXGFK_3456", "instruction": "i am looking for non-toxic eyelashes that are purple.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "purple" ] }, "asin": "B08Q3TXGFK" }, { "task_id": "ws_B09NVPNVM6_3457", "instruction": "i need wireless bluetooth speakers that are red.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "red" ] }, "asin": "B09NVPNVM6" }, { "task_id": "ws_B08Q41YX7C_3458", "instruction": "please help me find a phoenix single cup and saucer that is made of bone china and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "phoenix single cup and saucer" ] }, "asin": "B08Q41YX7C" }, { "task_id": "ws_B08Y7YT94L_3459", "instruction": "i'm looking for a fruit king crispy tofu stick that is freeze dried and high in protein.", "target_attributes": { "attributes": [ "freeze dried", "high protein" ], "options": [] }, "asin": "B08Y7YT94L" }, { "task_id": "ws_B07KWLQJ53_3460", "instruction": "show me a ready to hang horse33 wall art in 16''w x 24''h size for my living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "horse33", "16''w x 24''h" ] }, "asin": "B07KWLQJ53" }, { "task_id": "ws_B0829QD7J1_3461", "instruction": "i'm looking for high heels with open toe and has ankle strap. also choose size 6 with black colored one.", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "black", "6" ] }, "asin": "B0829QD7J1" }, { "task_id": "ws_B0778WH8SD_3462", "instruction": "i am looking for hand crafted food decoration toopers for birthday parties.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B0778WH8SD" }, { "task_id": "ws_B08RXX825P_3463", "instruction": "i tore my walking shoes today and need new ones. i'd like you to buy me a new pair. my size is 16 wide and the only other thing i care about is that they are made of ethylene vinyl.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "16 wide" ] }, "asin": "B08RXX825P" }, { "task_id": "ws_B08RXX825P_3464", "instruction": "buy a pair of size nine waterproof lace-up walking shoes. they should be made out of vinyl acetate .", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "9 wide" ] }, "asin": "B08RXX825P" }, { "task_id": "ws_B08X1YXPZM_3465", "instruction": "i'm looking for some open toe flats for teen girls. i want the pink one in size 7.", "target_attributes": { "attributes": [ "open toe", "teen girls" ], "options": [ "z1-hot pink", "7" ] }, "asin": "B08X1YXPZM" }, { "task_id": "ws_B08RS6FRVM_3466", "instruction": "i would like a 40x120cm roller shade for my living room that's easy to install.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "40x120cm | 16x47in" ] }, "asin": "B08RS6FRVM" }, { "task_id": "ws_B0085T88NE_3467", "instruction": "i need a stainless steel pot rack.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B0085T88NE" }, { "task_id": "ws_B07MYQH91L_3468", "instruction": "i am looking for a 12\" darkest brown #2 synthetic hair hair extensions", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "darkest brown #2", "12 inch" ] }, "asin": "B07MYQH91L" }, { "task_id": "ws_B08B5K6BW5_3469", "instruction": "i need a gift set of cookies for the perfect gift that has oreos.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "oreos\u00ae, m&ms\u00ae, and reese\u2019s peanut butter..." ] }, "asin": "B08B5K6BW5" }, { "task_id": "ws_B08SJGT3GL_3470", "instruction": "i am looking for a specific perfume fragrance called impression of a poison girl that comes in a travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "impression of poison girl" ] }, "asin": "B08SJGT3GL" }, { "task_id": "ws_B09NKRK5YJ_3471", "instruction": "i am looking for a kids u shaped toothbrush that is high quality and blue or orange in color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "blue+orange" ] }, "asin": "B09NKRK5YJ" }, { "task_id": "ws_B08BXJ1P9S_3472", "instruction": "i'm looking for space saving storage bins made of pu leather. also, choose 16.5\" thickened in size with burgundy stripe pattern.", "target_attributes": { "attributes": [ "space saving", "pu leather" ], "options": [ "burgundy stripe", "16.5\" | thickened" ] }, "asin": "B08BXJ1P9S" }, { "task_id": "ws_B08M5V1DGG_3473", "instruction": "snow white water glow mask cream", "target_attributes": { "attributes": [ "oil free" ], "options": [ "4th generation" ] }, "asin": "B08M5V1DGG" }, { "task_id": "ws_B07QFZ6Z8X_3474", "instruction": "can you find me a pair of men's pleated golf shorts with a button closure and a high waist? i want them in khaki and in size 38.", "target_attributes": { "attributes": [ "button closure", "high waist" ], "options": [ "khaki", "38" ] }, "asin": "B07QFZ6Z8X" }, { "task_id": "ws_B09PNRGYNQ_3475", "instruction": "i want to buy a pair of closed toe sandals in size 6. it should have high heels.", "target_attributes": { "attributes": [ "closed toe", "high heel" ], "options": [ "6" ] }, "asin": "B09PNRGYNQ" }, { "task_id": "ws_B07VTM5TWH_3476", "instruction": "i'm looking for a non slip spotting scopes for bird watching.", "target_attributes": { "attributes": [ "non slip", "bird watching" ], "options": [] }, "asin": "B07VTM5TWH" }, { "task_id": "ws_B082M7W64J_3477", "instruction": "find me a high quality 613 bundle with closure hair extension in 14 14 16+12 size.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "613 bundles with closure", "14 14 16+12" ] }, "asin": "B082M7W64J" }, { "task_id": "ws_B082M7W64J_3478", "instruction": "i would like a bundle of hair extensions that are 20 inches", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "613 bundles with closure", "18 | 20 | 20+16 inch" ] }, "asin": "B082M7W64J" }, { "task_id": "ws_B09QM39K2F_3479", "instruction": "find me some non-slip steel toe platform shoes for women. i want something in pink in the size 10.5.", "target_attributes": { "attributes": [ "slip resistant", "non slip", "steel toe" ], "options": [ "pink", "10.5" ] }, "asin": "B09QM39K2F" }, { "task_id": "ws_B01IEK23A2_3480", "instruction": "i am looking for an easy clean rug that is red in color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B01IEK23A2" }, { "task_id": "ws_B07MBVNFXS_3481", "instruction": "i need some new yoga wide leg yoga pants. make sure you get me the wocachi brand and that they are plaid. oh, also make sure they are from this years spring/summer collection.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "4x-large" ] }, "asin": "B07MBVNFXS" }, { "task_id": "ws_B09GFL5G1G_3482", "instruction": "i am looking for a high quality nylon strap for my galaxy phone.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "02bhl" ] }, "asin": "B09GFL5G1G" }, { "task_id": "ws_B087D53LM1_3483", "instruction": "i am looking for natural looking hair extensions 18 inch.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "10 inch" ] }, "asin": "B087D53LM1" }, { "task_id": "ws_B087D53LM1_3484", "instruction": "my sister have natural hair in 12 inch", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "12 inch" ] }, "asin": "B087D53LM1" }, { "task_id": "ws_B09FG43X5Q_3485", "instruction": "i am looking for an eco friendly 35 by 59 inch waterproof clear plastic table mat.", "target_attributes": { "attributes": [ "eco friendly", "stainless steel" ], "options": [ "35x59in | 90x150cm" ] }, "asin": "B09FG43X5Q" }, { "task_id": "ws_B09MVYD2R4_3486", "instruction": "i am looking for some birthday party supplies to go on a plane-themed birthday cake.", "target_attributes": { "attributes": [ "party supplies", "birthday party" ], "options": [ "airplane" ] }, "asin": "B09MVYD2R4" }, { "task_id": "ws_B0924JWYGM_3487", "instruction": "can you find me some rose gold eyeshadow, please?", "target_attributes": { "attributes": [ "rose gold", "eye shadow" ], "options": [ "rose gold" ] }, "asin": "B0924JWYGM" }, { "task_id": "ws_B004Q85JV2_3488", "instruction": "i am looking for a high quality perfume.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B004Q85JV2" }, { "task_id": "ws_B07MNW2KV4_3489", "instruction": "i would like a size 10 black long sleeve sweatshirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B07MNW2KV4" }, { "task_id": "ws_B07NNTC257_3490", "instruction": "i need contemporary style and granite counter stools for the dining room.", "target_attributes": { "attributes": [ "contemporary style", "dining room" ], "options": [ "granite", "counter stool" ] }, "asin": "B07NNTC257" }, { "task_id": "ws_B00DVFHZFE_3491", "instruction": "can you find me a tablet charger with ouput protection, please?", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B00DVFHZFE" }, { "task_id": "ws_B08DR3KHXG_3492", "instruction": "please help me find a pair of white men\u2019s sneaker in a size 13; it must be the \u201cu-throat\u201d type with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "white", "13" ] }, "asin": "B08DR3KHXG" }, { "task_id": "ws_B09Q57WQ9G_3493", "instruction": "i am looking for 16\" natural human hair extensions that is a mix of brown and dark blonde.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "16\"" ] }, "asin": "B09Q57WQ9G" }, { "task_id": "ws_B09SQ5ZCGK_3494", "instruction": "i am looking for a high quality reusable facial treatment.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09SQ5ZCGK" }, { "task_id": "ws_B09HHP2J5L_3495", "instruction": "i want a gray dzquy men striped knit sweater in x-large. i want one that is fleece lined and water resistant.", "target_attributes": { "attributes": [ "fleece lined", "water resistant" ], "options": [ "gray", "x-large" ] }, "asin": "B09HHP2J5L" }, { "task_id": "ws_B09NMDXK5J_3496", "instruction": "i am looking for a window film for the dining room in the color 917730770571231000 in the size 23.6 by 23.6.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "917730770571231000", "(width\uff0923.6in x (length)23.6in x 2pcs" ] }, "asin": "B09NMDXK5J" }, { "task_id": "ws_B08CKZBLYN_3497", "instruction": "i am looking for a 2 light vanity light with glass shade.", "target_attributes": { "attributes": [ "vanity light", "glass shade" ], "options": [ "2 light" ] }, "asin": "B08CKZBLYN" }, { "task_id": "ws_B08L9C3MDF_3498", "instruction": "i am looking for a desktop that is a core intel i7 that has 8gb of ram and 512 ssd of storage.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "ddr3l core i7 4500u", "8gb ram 512gb ssd" ] }, "asin": "B08L9C3MDF" }, { "task_id": "ws_B08L9C3MDF_3499", "instruction": "i would like to buy a desktop computer with windows 10, intel core processor. additionally i would like 8gb of ram and a 512gb ssd.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "new ddr4l core i5 8250u", "8gb ram 512gb ssd" ] }, "asin": "B08L9C3MDF" }, { "task_id": "ws_B08STVQLVR_3500", "instruction": "i am looking for a fast charging charger in mystic navy color.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "bronze" ] }, "asin": "B08STVQLVR" }, { "task_id": "ws_B08Z3K789Q_3501", "instruction": "i need one ounce of keto friendly vanilla flavor.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "1 oz" ] }, "asin": "B08Z3K789Q" }, { "task_id": "ws_B09QZPM2TB_3502", "instruction": "can you look and find me some water resistant eyeliner?", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B09QZPM2TB" }, { "task_id": "ws_B09J8673JD_3503", "instruction": "do you have any long lasting eye shadow? something with 2 colors would be the best.", "target_attributes": { "attributes": [ "long lasting", "eye shadow" ], "options": [ "2" ] }, "asin": "B09J8673JD" }, { "task_id": "ws_B01GE2ZOT4_3504", "instruction": "i want to buy a tongue scraper that will give me fresh breath and is made from stainless steel.", "target_attributes": { "attributes": [ "stainless steel", "fresh breath" ], "options": [] }, "asin": "B01GE2ZOT4" }, { "task_id": "ws_B09BQRTH7L_3505", "instruction": "i am looking for a blue long sleeve quarter zip hoodie.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue" ] }, "asin": "B09BQRTH7L" }, { "task_id": "ws_B09BC92CVS_3506", "instruction": "i need 26\" metal bar stools that are distressed teal with modern wooden seats and are easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "distressed teal with modern wooden seat", "26\"" ] }, "asin": "B09BC92CVS" }, { "task_id": "ws_B097XFZ2LM_3507", "instruction": "i am looking for a good travel size cologne small 0.27 ounce.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "0.27 fl oz (pack of 1)" ] }, "asin": "B097XFZ2LM" }, { "task_id": "ws_B097XFZ2LM_3508", "instruction": "i am looking for a travel size eau de parfum for men of sandalwood & white musk perfume scent.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "sandalwood & white musk perfume" ] }, "asin": "B097XFZ2LM" }, { "task_id": "ws_B097XFZ2LM_3509", "instruction": "i'm looking for a men's fragrance or cologne with a long lasting scent. i need a travel size bottle of about 8ml.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "0.27 fl oz | 8ml" ] }, "asin": "B097XFZ2LM" }, { "task_id": "ws_B097XFZ2LM_3510", "instruction": "i will like to get a high quality, long lasting ca perfume club impression of bad boy for men, size 0.17 fl oz | 5ml", "target_attributes": { "attributes": [ "travel size", "high quality" ], "options": [ "0.17 fl oz | 5ml" ] }, "asin": "B097XFZ2LM" }, { "task_id": "ws_B094H3QJ8R_3511", "instruction": "do you have a high quality tool bag? i need something at least 5ml.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "5ml" ] }, "asin": "B094H3QJ8R" }, { "task_id": "ws_B00MJW4HYW_3512", "instruction": "find me a non gmo banana and strawberry meal.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "strawberry & banana" ] }, "asin": "B00MJW4HYW" }, { "task_id": "ws_B08SQPYY1F_3513", "instruction": "i am looking for a happy birthday cake for a party.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B08SQPYY1F" }, { "task_id": "ws_B072C64JZR_3514", "instruction": "i want a double sided pillow cover. it should be orange blue in color.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "orange blue" ] }, "asin": "B072C64JZR" }, { "task_id": "ws_B07DCP65HD_3515", "instruction": "i need 300 cotton rounds for my nail polish", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "300pcs" ] }, "asin": "B07DCP65HD" }, { "task_id": "ws_B001VJ70UC_3516", "instruction": "locate the 12 pouch option of gogo squeez fruit on the go applesauce that is non gmo. i want the apple cinnamon flavor.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "apple cinnamon", "12 pouches" ] }, "asin": "B001VJ70UC" }, { "task_id": "ws_B08G4NKG7T_3517", "instruction": "i'm looking for a living room light set. i want the one in gold with three lights.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold", "3-light" ] }, "asin": "B08G4NKG7T" }, { "task_id": "ws_B00O84PEWS_3518", "instruction": "i am looking for 4g lte wifi router.it should be of black color.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "black" ] }, "asin": "B00O84PEWS" }, { "task_id": "ws_B09J2L1DM5_3519", "instruction": "i am looking for a black high performance smart watch.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "black" ] }, "asin": "B09J2L1DM5" }, { "task_id": "ws_B08PC5R8N2_3520", "instruction": "i need a desk lamp with brushed nickle finish.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish" ], "options": [ "brushed nickel" ] }, "asin": "B08PC5R8N2" }, { "task_id": "ws_B07RT73KP5_3521", "instruction": "i am looking for 8 channel pyle bluetooth stereo amplifier receiver is perfect for your pa/ home theater acoustic sound system with wireless bluetooth-compatible the professional compact rack mount home theater system of amplifier - 4000w rack mount multi zone sound mixer set of 1 pack.", "target_attributes": { "attributes": [ "power amplifier", "wireless bluetooth" ], "options": [ "1-pack" ] }, "asin": "B07RT73KP5" }, { "task_id": "ws_B09QHR7BZ6_3522", "instruction": "i'm looking for a pair of open toe women's sandals with a leather sole. i want the green ones in size six.", "target_attributes": { "attributes": [ "open toe", "leather sole" ], "options": [ "green-26#", "6" ] }, "asin": "B09QHR7BZ6" }, { "task_id": "ws_B09SHZZBQH_3523", "instruction": "i am looking for a men's medium size slim fit long sleeve button down floral dress shirt.", "target_attributes": { "attributes": [ "slim fit", "long sleeve" ], "options": [ "medium" ] }, "asin": "B09SHZZBQH" }, { "task_id": "ws_B01N3TDQJ0_3524", "instruction": "i need a sugar free 5 pound pack of coconut flakes. it should be plant based.", "target_attributes": { "attributes": [ "sugar free", "plant based" ], "options": [ "5 pound (pack of 1)" ] }, "asin": "B01N3TDQJ0" }, { "task_id": "ws_B08F9FGDK7_3525", "instruction": "i need black 20g makeup sample containers that are leak proof.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "black", "20g" ] }, "asin": "B08F9FGDK7" }, { "task_id": "ws_B08LDQGYVH_3526", "instruction": "get me a high power bird watching monocular that is 10x50 in size", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [ "10x50" ] }, "asin": "B08LDQGYVH" }, { "task_id": "ws_B09J22PJ6Y_3527", "instruction": "i need a slipper anti slip in white color size 9.5-11 for women and 9-10 for men", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "white-purple", "9.5-11 women | 9-10 men" ] }, "asin": "B09J22PJ6Y" }, { "task_id": "ws_B086X6M1W2_3528", "instruction": "i'm looking to buy a high resolution marine animal themed backdrop. the size should be 12x10ft.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "12x10ft" ] }, "asin": "B086X6M1W2" }, { "task_id": "ws_B09J6FKBNM_3529", "instruction": "i need a coconut hair loss serum.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "wil+gain_coconut+flaxseed oil (moisturizing)" ] }, "asin": "B09J6FKBNM" }, { "task_id": "ws_B09SWDZ9HZ_3530", "instruction": "i need to get a new photography background. pick out the one that is 2m in diameter.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "6.5ft | 2m diameter" ] }, "asin": "B09SWDZ9HZ" }, { "task_id": "ws_B07FDL284N_3531", "instruction": "i would like a 6 pack of 5.5 ounce non gmo sundried tomatoes.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sundried tomato", "5.5 ounce (pack of 6)" ] }, "asin": "B07FDL284N" }, { "task_id": "ws_B091DG574T_3532", "instruction": "i want to find a barstool made out of faux leather and stainless steel. i want the one in black.", "target_attributes": { "attributes": [ "faux leather", "stainless steel" ], "options": [ "black | stainless steel" ] }, "asin": "B091DG574T" }, { "task_id": "ws_B09MZ4VGLR_3533", "instruction": "i am looking for a core i5 laptop that has 64 gb of ram and 2tb of storage.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "64gb ddr4 ram, 2tb pcie ssd" ] }, "asin": "B09MZ4VGLR" }, { "task_id": "ws_B078H4GBC6_3534", "instruction": "can you find me a wireless bluetooth speaker that comes with a carrying case? i want you to get me the one in blue.", "target_attributes": { "attributes": [ "carrying case", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B078H4GBC6" }, { "task_id": "ws_B07Z11QCDP_3535", "instruction": "i need a keto friendly and non gmo variety pack can. it should be cranberry and raspberry flavored.", "target_attributes": { "attributes": [ "keto friendly", "non gmo" ], "options": [ "cran-raspberry" ] }, "asin": "B07Z11QCDP" }, { "task_id": "ws_B07Z11QCDP_3536", "instruction": "i'd like to shop for sparkling watermelon juice that's non-gmo and sugar free.", "target_attributes": { "attributes": [ "sugar free", "non gmo" ], "options": [ "watermelon" ] }, "asin": "B07Z11QCDP" }, { "task_id": "ws_B096LNNZRY_3537", "instruction": "i'm looking for beauty pro 30 capsules which should be clinically proven for anti aging, hair growth, works on dry skin and has natural ingredients.", "target_attributes": { "attributes": [ "clinically proven", "anti aging", "natural ingredients", "dry skin", "hair growth" ], "options": [] }, "asin": "B096LNNZRY" }, { "task_id": "ws_B017JX5456_3538", "instruction": "i am looking for great for normal to oily skin, the non-comedogenic cosmetic features skin-soothing aloe vera and lavender plus anti-aging antioxidants and skin-smoothing peptides selected with effective natural ingredients and ensure our products are free of gluten, parabens, talc, artificial colors, synthetic fragrances, sls and phthalates. never conduct animal testing mineral fusion liquid foundation, warm 2, 1 fl ounce in deep 1 color.", "target_attributes": { "attributes": [ "anti aging", "natural ingredients" ], "options": [ "deep 1" ] }, "asin": "B017JX5456" }, { "task_id": "ws_B08WCTV9CF_3539", "instruction": "can you find a black dining table set? i'm looking for something that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "black dining table set" ] }, "asin": "B08WCTV9CF" }, { "task_id": "ws_B08WCTV9CF_3540", "instruction": "i'm looking for sofa wall side table.", "target_attributes": { "attributes": [ "white finish", "living room" ], "options": [ "white c shape side table" ] }, "asin": "B08WCTV9CF" }, { "task_id": "ws_B095NKLWVJ_3541", "instruction": "i am looking for a black and gold chandelier for my dining room that has six lights", "target_attributes": { "attributes": [ "dining room" ], "options": [ "black&gold", "6 lights" ] }, "asin": "B095NKLWVJ" }, { "task_id": "ws_B08P4JN9MX_3542", "instruction": "i'm looking for a solid wood coatrack with a round base. i want color b as well.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "b" ] }, "asin": "B08P4JN9MX" }, { "task_id": "ws_B019MGTHFQ_3543", "instruction": "i'm looking for gold plated, high speed hdmi cable . also, choose 12 feet hdmi male to female cable in pack of 1.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "1 pack", "12 feet (4 pack)", "hdmi male to female" ] }, "asin": "B019MGTHFQ" }, { "task_id": "ws_B019MGTHFQ_3544", "instruction": "i'm looking for a single high speed gold plated hdmi cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "1 pack" ] }, "asin": "B019MGTHFQ" }, { "task_id": "ws_B019MGTHFQ_3545", "instruction": "i'm looking for high speed 3 feet hdmi cable male to female with ethernet black", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 feet (10 pack)", "hdmi male to female" ] }, "asin": "B019MGTHFQ" }, { "task_id": "ws_B0842Y5Y5Z_3546", "instruction": "i am looking for a solid wood dining table with a barn wood finish.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "barn wood finish" ] }, "asin": "B0842Y5Y5Z" }, { "task_id": "ws_B0842Y5Y5Z_3547", "instruction": "i want a modern turned leg solid wood dining table with tuscany finish.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "tuscany finish" ] }, "asin": "B0842Y5Y5Z" }, { "task_id": "ws_B09N98D1KN_3548", "instruction": "i am looking for an easy to use three piece set of hair growth treatment that works on damaged hair.", "target_attributes": { "attributes": [ "easy use", "damaged hair" ], "options": [ "3pcs" ] }, "asin": "B09N98D1KN" }, { "task_id": "ws_B07Q4819L1_3549", "instruction": "i cook beef so added artificial flavors 12 pack", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "beef 12 pack" ] }, "asin": "B07Q4819L1" }, { "task_id": "ws_B07Q4819L1_3550", "instruction": "looking for wild caught coho salmon with organic butternut squash and beets in beef 6 pack", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "beef 6 pack" ] }, "asin": "B07Q4819L1" }, { "task_id": "ws_B07Q4819L1_3551", "instruction": "i want a 12 pack of serenity kids baby food pouches, wild caught salmon.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "salmon 12 pack" ] }, "asin": "B07Q4819L1" }, { "task_id": "ws_B00C2DZAIU_3552", "instruction": "i need cat 6 cables that are gold plated, black and 1 ft.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "black", "1 ft" ] }, "asin": "B00C2DZAIU" }, { "task_id": "ws_B095FMPLN3_3553", "instruction": "i want to find a plant based party mix gift set. get me the one in old bay flavor.", "target_attributes": { "attributes": [ "plant based", "gift set" ], "options": [ "old bay duo" ] }, "asin": "B095FMPLN3" }, { "task_id": "ws_B08M9MHZHQ_3554", "instruction": "i'm looking for an easy to install living room celling light with a 2-light capacity", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "2-light" ] }, "asin": "B08M9MHZHQ" }, { "task_id": "ws_B01MY97UM3_3555", "instruction": "i am looking for a brushed nickel floor lamp. i believe the color is called great falls.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "great falls" ] }, "asin": "B01MY97UM3" }, { "task_id": "ws_B08BCS7GSL_3556", "instruction": "i would like some orange fluoride free toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "orange" ] }, "asin": "B08BCS7GSL" }, { "task_id": "ws_B015SJ7RYY_3557", "instruction": "i need pure white curtains that are machine washable and are 66 in by 54 in.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pure white", "66 in x 54 in (w x l)" ] }, "asin": "B015SJ7RYY" }, { "task_id": "ws_B01EVUAFAY_3558", "instruction": "i am looking for long lasting princess dreaming edp perfume spray.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B01EVUAFAY" }, { "task_id": "ws_B09PV8NYXC_3559", "instruction": "i need a virtual reality gaming popgrip with wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B09PV8NYXC" }, { "task_id": "ws_B09CTM4CWK_3560", "instruction": "i'm looking for a relaxed fit, long sleeve women's blouse with animal print or polka dots. the color should be a-gray and the size 4x-large.", "target_attributes": { "attributes": [ "long sleeve", "relaxed fit" ], "options": [ "a-gray", "4x-large" ] }, "asin": "B09CTM4CWK" }, { "task_id": "ws_B09P86GCLP_3561", "instruction": "i would like a small multicolor button down shirt that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "multicolor a", "small" ] }, "asin": "B09P86GCLP" }, { "task_id": "ws_B082NW3WQZ_3562", "instruction": "i need dining room chairs that is in mustard color.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "mustard" ] }, "asin": "B082NW3WQZ" }, { "task_id": "ws_B085FYTFYB_3563", "instruction": "i'm looking for a pair of high heeled, rubber soled pumps. pick the black suede ones in 9.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "black-suede", "9" ] }, "asin": "B085FYTFYB" }, { "task_id": "ws_B08CMXQJZC_3564", "instruction": "find me a quick drying hawaiin shirt with short sleeves and a front pocket. get me a large size.", "target_attributes": { "attributes": [ "quick drying", "short sleeve" ], "options": [ "large" ] }, "asin": "B08CMXQJZC" }, { "task_id": "ws_B007PK85K0_3565", "instruction": "i would like to purchase 10 packs of trader joe's pretzels. also make sure they contain no artificial flavors.", "target_attributes": { "attributes": [ "trader joe", "artificial flavors" ], "options": [ "10 pack" ] }, "asin": "B007PK85K0" }, { "task_id": "ws_B007PK85K0_3566", "instruction": "i am looking for a 4 pack of trader joe's pretzels.", "target_attributes": { "attributes": [ "trader joe" ], "options": [ "4 pack" ] }, "asin": "B007PK85K0" }, { "task_id": "ws_B007PK85K0_3567", "instruction": "i would like a one pound bag of trader joes pretzels.", "target_attributes": { "attributes": [ "trader joe" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B007PK85K0" }, { "task_id": "ws_B07BHH3RJ2_3568", "instruction": "i need a leak proof travel bottle that is reusable and comes in 6 pack.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [] }, "asin": "B07BHH3RJ2" }, { "task_id": "ws_B09QWZCPK4_3569", "instruction": "i would like a extra small multi green boxer brief that i can hand wash in the sink.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "multi 35 green", "x-small" ] }, "asin": "B09QWZCPK4" }, { "task_id": "ws_B008Y253N0_3570", "instruction": "i want to find some dairy free sprinkles. something with nuts would be great.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "nut" ] }, "asin": "B008Y253N0" }, { "task_id": "ws_B07L2M5C9C_3571", "instruction": "do you think you can find me a fluoride free toothpaste for sensitive teeth? i want something that comes in a 3.5 ounce size.", "target_attributes": { "attributes": [ "fluoride free", "sensitive teeth" ], "options": [] }, "asin": "B07L2M5C9C" }, { "task_id": "ws_B086JM3CGY_3572", "instruction": "can you find me a 4g lte coaxial cable? i need the 3 foot one.", "target_attributes": { "attributes": [ "coaxial cable", "4g lte" ], "options": [ "100cm | 3ft" ] }, "asin": "B086JM3CGY" }, { "task_id": "ws_B07WVH54JP_3573", "instruction": "i am looking for hair extensions black storage bag.it should be of high quality.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "black-storage bag#" ] }, "asin": "B07WVH54JP" }, { "task_id": "ws_B08BZTCDXT_3574", "instruction": "i would like a women's size 11 azure walking shoe made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "azure", "11 women | 8.5 men" ] }, "asin": "B08BZTCDXT" }, { "task_id": "ws_B0816GY2BD_3575", "instruction": "i'm looking for a sythetic hair extensions. also, choose black colored one.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "black" ] }, "asin": "B0816GY2BD" }, { "task_id": "ws_B019IOGFDY_3576", "instruction": "i want a hdmi cable with high speed and 1.5 feet size.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1.5 feet (10-pack)" ] }, "asin": "B019IOGFDY" }, { "task_id": "ws_B019IOGFDY_3577", "instruction": "i am interested in a high speed hdmi cable that is 10 feet long and comes in a 2 pack.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack", "10 feet (3-pack)" ] }, "asin": "B019IOGFDY" }, { "task_id": "ws_B019IOGFDY_3578", "instruction": "i'm looking for an high speed hdmi cable which is gold plated. also, choose a pack of 4 hdmi male to male cable of size 3 feet one.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "4 pack", "3 feet (3-pack)", "hdmi male to male" ] }, "asin": "B019IOGFDY" }, { "task_id": "ws_B019IOGFDY_3579", "instruction": "i am looking for high speed hdmi cable of size 75 feet.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "75 feet (single pack)" ] }, "asin": "B019IOGFDY" }, { "task_id": "ws_B093YS65BV_3580", "instruction": "i'm trying to find a laundry bag for women.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YS65BV" }, { "task_id": "ws_B09CNNJZJH_3581", "instruction": "i want a loose fit pullover. pick out the one in gray, please.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "a gray" ] }, "asin": "B09CNNJZJH" }, { "task_id": "ws_B003VP5TPW_3582", "instruction": "i want a sonoma oak or white 3 tier classic tube that comprises of shelving units and a tv stand in my living room. also choose the one designed with engineered wood.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "sonoma oak | white", "shelving unit + tv stands", "3-tier classic tube" ] }, "asin": "B003VP5TPW" }, { "task_id": "ws_B003VP5TPW_3583", "instruction": "i am looking for a french oak grey | black corner shelves for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "french oak grey | black" ] }, "asin": "B003VP5TPW" }, { "task_id": "ws_B003VP5TPW_3584", "instruction": "i am searching for 3-tier classic tube white color corner shelf for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "beech | white", "3-tier classic tube" ] }, "asin": "B003VP5TPW" }, { "task_id": "ws_B003VP5TPW_3585", "instruction": "i need a 5-tier corner shelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "5-tier" ] }, "asin": "B003VP5TPW" }, { "task_id": "ws_B07TTSM7RN_3586", "instruction": "i am in search of a black printed heavy duty toiletry bags which will be able to resist the water damage.", "target_attributes": { "attributes": [ "heavy duty", "water resistant" ], "options": [ "black print" ] }, "asin": "B07TTSM7RN" }, { "task_id": "ws_B07TTSM7RN_3587", "instruction": "i am looking for an off-white toiletry bag that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "off-white printing" ] }, "asin": "B07TTSM7RN" }, { "task_id": "ws_B08GBZB5X8_3588", "instruction": "i want help getting an open toe, non-slip sandal. get the ones in blue in women's size 6.", "target_attributes": { "attributes": [ "open toe", "non slip" ], "options": [ "z1_blue", "6" ] }, "asin": "B08GBZB5X8" }, { "task_id": "ws_B012JD9X26_3589", "instruction": "i am looking for butter from grass fed cows i need something non gmo, and gluten free. glass jar 16 oz if possible.", "target_attributes": { "attributes": [ "grass fed", "non gmo", "gluten free" ], "options": [ "16 fl oz (pack of 1)" ] }, "asin": "B012JD9X26" }, { "task_id": "ws_B07FCRDYMP_3590", "instruction": "i need a 4.7 ounce paraben free makeup remover.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "4.7 fl oz (pack of 1)" ] }, "asin": "B07FCRDYMP" }, { "task_id": "ws_B07KZSK9CP_3591", "instruction": "i need to get a new high performance printer for my office.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B07KZSK9CP" }, { "task_id": "ws_B083MYW6QY_3592", "instruction": "i am looking for king sized platform bed.it should be made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "king" ] }, "asin": "B083MYW6QY" }, { "task_id": "ws_B09BKH4DMM_3593", "instruction": "i'm looking for jeans that are machine washable and are in size 27.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "27" ] }, "asin": "B09BKH4DMM" }, { "task_id": "ws_B09BYXC5Z7_3594", "instruction": "i'm looking for a white, solid wood bar stool. i just need to make sure that it's about 45 inches high.", "target_attributes": { "attributes": [ "white item", "solid wood" ], "options": [ "white", "45'' high" ] }, "asin": "B09BYXC5Z7" }, { "task_id": "ws_B079PSXB8B_3595", "instruction": "please find a dust poof red color bluetooth speaker", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "red" ] }, "asin": "B079PSXB8B" }, { "task_id": "ws_B07W92ZMZN_3596", "instruction": "i am looking for a remote control for an lg blu-ray dvd home theater system.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B07W92ZMZN" }, { "task_id": "ws_B07W92ZMZN_3597", "instruction": "i want a remote control for lg blu ray", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B07W92ZMZN" }, { "task_id": "ws_B09286DYTK_3598", "instruction": "i need a wifi ip surveillance camera and stainless steel waterproof junction box with external speaker", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09286DYTK" }, { "task_id": "ws_B08QZCDRYH_3599", "instruction": "i need a durable 13\u201d lightweight case for my macbook; i\u2019d prefer a red one.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "matte red" ] }, "asin": "B08QZCDRYH" }, { "task_id": "ws_B08QZCDRYH_3600", "instruction": "i want to find a lightweight macbook pro case cover that has a matte blue color.", "target_attributes": { "attributes": [ "light weight", "case cover" ], "options": [ "matte blue" ] }, "asin": "B08QZCDRYH" }, { "task_id": "ws_B07JH27T27_3601", "instruction": "i'm looking for a deborah lippman gel lab pro nail polish. ensure the color is the full coverage bright red cr\u00e8me", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B07JH27T27" }, { "task_id": "ws_B004QVVJ7M_3602", "instruction": "i want to get a high resolution and high performance hdmi cable.", "target_attributes": { "attributes": [ "high resolution", "high performance" ], "options": [] }, "asin": "B004QVVJ7M" }, { "task_id": "ws_B09D3M46H2_3603", "instruction": "i need a high performance smartwatch band compatible with apple. pick something in black gray color.", "target_attributes": { "attributes": [ "compatible apple", "high performance" ], "options": [ "5-gray teal | black gray | lightblue teal | black blue" ] }, "asin": "B09D3M46H2" }, { "task_id": "ws_B09NVVQCN8_3604", "instruction": "i buy a solid wood in white color", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "white" ] }, "asin": "B09NVVQCN8" }, { "task_id": "ws_B07Q6C1BRG_3605", "instruction": "i need a multipack of living room curtains that are 29\" by 45\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi 10", "29\" w x 45\" l" ] }, "asin": "B07Q6C1BRG" }, { "task_id": "ws_B085NXXD8J_3606", "instruction": "i need a face mask that is for dark circles and is clinically proven to work.", "target_attributes": { "attributes": [ "clinically proven", "dark circles" ], "options": [] }, "asin": "B085NXXD8J" }, { "task_id": "ws_B01GZI0JMY_3607", "instruction": "i am looking for 9 ounce packs of 12 certified organic, non gmo, and gluten free organic brown rice cakes.", "target_attributes": { "attributes": [ "certified organic", "non gmo", "gluten free" ], "options": [ "9 ounce (pack of 12)" ] }, "asin": "B01GZI0JMY" }, { "task_id": "ws_B01GZI0JMY_3608", "instruction": "i am hoping to find some tamari with seaweed flavored rice cakes. i want them to be gluten free and non gmo", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "tamari with seaweed" ] }, "asin": "B01GZI0JMY" }, { "task_id": "ws_B099KRPB3M_3609", "instruction": "i am looking for a pack of 12 cafe mocha in plant based form.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "caf\u00e9 mocha", "pack of 12" ] }, "asin": "B099KRPB3M" }, { "task_id": "ws_B091JGLW4G_3610", "instruction": "i need an usda organic jinxuan oolong tea bag that is hand crafted.", "target_attributes": { "attributes": [ "usda organic", "hand crafted" ], "options": [ "jinxuan oolong" ] }, "asin": "B091JGLW4G" }, { "task_id": "ws_B091JGLW4G_3611", "instruction": "i want t secretea oolong tea bags, taiwan jinxuan 100% organic.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "jinxuan oolong" ] }, "asin": "B091JGLW4G" }, { "task_id": "ws_B0829NNZPL_3612", "instruction": "i am looking for a hair styling mirror.", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B0829NNZPL" }, { "task_id": "ws_B09QCYJ2QM_3613", "instruction": "get a tongue cleaner that is easy clean and use, and is also stainless steel.", "target_attributes": { "attributes": [ "easy clean", "easy use", "stainless steel" ], "options": [] }, "asin": "B09QCYJ2QM" }, { "task_id": "ws_B01M0XSD38_3614", "instruction": "can you find me a face moisturizer for dead and dry skin? i want the one that comes in the 5.07 ounces.", "target_attributes": { "attributes": [ "dry skin", "dead skin" ], "options": [] }, "asin": "B01M0XSD38" }, { "task_id": "ws_B09M6KRDK1_3615", "instruction": "i need a black twin sized bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "d black", "twin | twin | full" ] }, "asin": "B09M6KRDK1" }, { "task_id": "ws_B09LR3WFLR_3616", "instruction": "i\u2019d like to find a super soft luxurious fleece throw that\u2019s about 50\u201d x 40\u201d in size. it should look good in my living room.", "target_attributes": { "attributes": [ "super soft", "fleece throw", "living room" ], "options": [ "50\"x40\"" ] }, "asin": "B09LR3WFLR" }, { "task_id": "ws_B09LR3WFLR_3617", "instruction": "i am looking for a 60\"x 50\" super soft throws", "target_attributes": { "attributes": [ "super soft" ], "options": [ "60\"x50\"" ] }, "asin": "B09LR3WFLR" }, { "task_id": "ws_B08XJF919X_3618", "instruction": "i need a 1.0mm braces brush that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "1.0mm" ] }, "asin": "B08XJF919X" }, { "task_id": "ws_B07FRM6MLX_3619", "instruction": "i want the easy to use seasoning spice mix. look for the garlic butter option.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "garlic butter" ] }, "asin": "B07FRM6MLX" }, { "task_id": "ws_B08RJ2FPPM_3620", "instruction": "i am looking for low sugar, low carb and gluten free cookies that has flavored chocolate cake", "target_attributes": { "attributes": [ "low sugar", "gluten free", "low carb" ], "options": [ "chocolate cake" ] }, "asin": "B08RJ2FPPM" }, { "task_id": "ws_B09PFVG2ND_3621", "instruction": "i need a henleys shirt, slim fit and fleece lined. color needs to be white and x-large in size.", "target_attributes": { "attributes": [ "slim fit", "fleece lined" ], "options": [ "white", "x-large" ] }, "asin": "B09PFVG2ND" }, { "task_id": "ws_B092VGFJY3_3622", "instruction": "hey i need some new press on nails. get me babalal cat eye ones that aren't toxic and make sure the color you get is purple.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "purple" ] }, "asin": "B092VGFJY3" }, { "task_id": "ws_B09HC9W6FK_3623", "instruction": "i would like a desktop mini computer with16 gig of ram and a intel core i9.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "core i9-11900", "16gb ram 512gb ssd" ] }, "asin": "B09HC9W6FK" }, { "task_id": "ws_B09HR1DWBR_3624", "instruction": "i'm searching for sunkist\u00ae omega 3+6 trail mix , low sodium and gluten free snack with almonds, yogurt raisins, banana chips", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "sunkist\u00ae omega 3+6 trail mix" ] }, "asin": "B09HR1DWBR" }, { "task_id": "ws_B07TYS4L2Q_3625", "instruction": "i am looking for an old fashioned and gluten free rolled oats. i would need about 400 ounces of it.", "target_attributes": { "attributes": [ "gluten free", "old fashioned" ], "options": [ "400 ounce (pack of 1)" ] }, "asin": "B07TYS4L2Q" }, { "task_id": "ws_B00G7U29KQ_3626", "instruction": "i need a dermatologist tested instantly warm clay mask- 1 count (6 masks)", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "1 count (6 masks)", "instantly warm clay mask" ] }, "asin": "B00G7U29KQ" }, { "task_id": "ws_B08JTPPFC3_3627", "instruction": "i would like to find raspberry jam snacks with real fruit combined with almond spread.", "target_attributes": { "attributes": [ "real fruit" ], "options": [ "almond spread" ] }, "asin": "B08JTPPFC3" }, { "task_id": "ws_B00VMDDDT4_3628", "instruction": "i need area rugs in the color french cellar that i can easily spot clean.", "target_attributes": { "attributes": [ "spot clean" ], "options": [ "french cellar" ] }, "asin": "B00VMDDDT4" }, { "task_id": "ws_B09PPVLKTQ_3629", "instruction": "i am looking for a high quality purple ice roller skin care tool kit.", "target_attributes": { "attributes": [ "high quality", "easy use" ], "options": [ "purple" ] }, "asin": "B09PPVLKTQ" }, { "task_id": "ws_B08936CZHQ_3630", "instruction": "i want a facial serum with antioxidants, oil free, clinically proven, in a 1.7 ounce just one pack.", "target_attributes": { "attributes": [ "oil free", "clinically proven" ], "options": [ "1.7 ounce (pack of 1)" ] }, "asin": "B08936CZHQ" }, { "task_id": "ws_B08936CZHQ_3631", "instruction": "i'd like to shop for a three piece set of eye creams that have hyaluronic acid and are oil free.", "target_attributes": { "attributes": [ "oil free", "hyaluronic acid" ], "options": [ "3 piece set", "eye cream" ] }, "asin": "B08936CZHQ" }, { "task_id": "ws_B08936CZHQ_3632", "instruction": "i would like a 0.5 fluid ounce bottle of water gel eye cream that is clinically proven.", "target_attributes": { "attributes": [ "clinically proven" ], "options": [ "0.5 fl oz (pack of 1)", "water gel" ] }, "asin": "B08936CZHQ" }, { "task_id": "ws_B0018CK0EU_3633", "instruction": "i am looking for a good freeze dried food for my dog.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "14 ounce (pack of 1)" ] }, "asin": "B0018CK0EU" }, { "task_id": "ws_B09NVS922B_3634", "instruction": "like to buy a high speed fast charging green usb type c cable 3.1a in 3.3ft size length .", "target_attributes": { "attributes": [ "fast charging", "high speed" ], "options": [ "green", "3.3ft" ] }, "asin": "B09NVS922B" }, { "task_id": "ws_B08NYJQQJG_3635", "instruction": "i would like a black dual band repeater.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "black uk" ] }, "asin": "B08NYJQQJG" }, { "task_id": "ws_B09RQN7LW3_3636", "instruction": "i am looking for large sized men tank.it shoud be made of polyester heather.", "target_attributes": { "attributes": [ "polyester heathers" ], "options": [ "large" ] }, "asin": "B09RQN7LW3" }, { "task_id": "ws_B089Z2S9XT_3637", "instruction": "i would like a german chocolate flavored syrup that is sugar free and 15.89 oz.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "german chocolate", "15.89 ounce" ] }, "asin": "B089Z2S9XT" }, { "task_id": "ws_B089Z2S9XT_3638", "instruction": "i am looking for a sugar free drink syrup. get the one in the egg nog flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "egg nog" ] }, "asin": "B089Z2S9XT" }, { "task_id": "ws_B09FQ44D2B_3639", "instruction": "i am looking for a super soft, fleece throw blanket that has to be at least 80\"x60\" and ideally have a sloth on it.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "sloth", "l 80\"x60\" for adults" ] }, "asin": "B09FQ44D2B" }, { "task_id": "ws_B09FQ44D2B_3640", "instruction": "i want to get a fleece throw that's machine washable. it needs to be extra small 40 by 30 in and strawberry cow 2 color.", "target_attributes": { "attributes": [ "machine washable", "fleece throw" ], "options": [ "strawberry cow 2", "xs 40\"x30\" for pets" ] }, "asin": "B09FQ44D2B" }, { "task_id": "ws_B09PTRF18Z_3641", "instruction": "i am looking for sweatpants and short pants for gym workout", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "black" ] }, "asin": "B09PTRF18Z" }, { "task_id": "ws_B09QCRHF47_3642", "instruction": "i want to get a birthday party themed cake topper. get the one with the purple butterfly on it.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "purple butterfly" ] }, "asin": "B09QCRHF47" }, { "task_id": "ws_B08CV7F984_3643", "instruction": "i'm searching for a toothpick oral hygiene pink color brush", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "pink" ] }, "asin": "B08CV7F984" }, { "task_id": "ws_B083Z8JXF3_3644", "instruction": "i need a 2.6 ounce deodorant that is cruelty free and smells of mandarin woods.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "mandarin woods", "2.6 ounce (pack of 1)" ] }, "asin": "B083Z8JXF3" }, { "task_id": "ws_B071W9JN82_3645", "instruction": "i am looking to buy a high powered car cd receiver with bluetooth.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B071W9JN82" }, { "task_id": "ws_B07C4NSKVJ_3646", "instruction": "i am looking for high speed 4k hdmi cable of 6 feet.i need 80 pcs.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "6ft-80pcs" ] }, "asin": "B07C4NSKVJ" }, { "task_id": "ws_B0972QDW7H_3647", "instruction": "i'm looking for twin bunk beds with box spring. also, choose black colored one.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "black(house)" ] }, "asin": "B0972QDW7H" }, { "task_id": "ws_B08NPHTDGH_3648", "instruction": "i am looking for a wall mounted mid-century sconce that preferably has a plug in 2 pack.", "target_attributes": { "attributes": [ "wall mounted", "mid century" ], "options": [ "plug in-2pack" ] }, "asin": "B08NPHTDGH" }, { "task_id": "ws_B09HS75C7D_3649", "instruction": "i need a elephant11lbg8852 valentine's fleece throw that is 50x60in.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "elephant11lbg8852", "50x60in" ] }, "asin": "B09HS75C7D" }, { "task_id": "ws_B005GEZGSQ_3650", "instruction": "i am looking for restore & repair oil.which is effective for anti aging.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B005GEZGSQ" }, { "task_id": "ws_B08D6YC8W9_3651", "instruction": "can you find me a clear screen protector for glass screens?", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "clear" ] }, "asin": "B08D6YC8W9" }, { "task_id": "ws_B08D6YC8W9_3652", "instruction": "i would like a clear performance glass screen protector for a samsung s21.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "clear | blue", "samsung s21 5g", "performance glass" ] }, "asin": "B08D6YC8W9" }, { "task_id": "ws_B08D6YC8W9_3653", "instruction": "i would like a clear value glass screen samsung a32 5g phone.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "clear | black", "samsung a32 5g", "value glass" ] }, "asin": "B08D6YC8W9" }, { "task_id": "ws_B08D6YC8W9_3654", "instruction": "i am looking for a tempered glass screen protector for an iphone 12 mini.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "iphone 12 mini" ] }, "asin": "B08D6YC8W9" }, { "task_id": "ws_B07SX57P6P_3655", "instruction": "i'm looking for desktop computer with intel core processor.", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B07SX57P6P" }, { "task_id": "ws_B08KT61CYV_3656", "instruction": "i am shopping for a ready use syrup that is lemon lime in flavor.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "lemon lime" ] }, "asin": "B08KT61CYV" }, { "task_id": "ws_B08KT61CYV_3657", "instruction": "i'm looking for a 32 ounce bottle of peach flavored ready to use syrup.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "peach", "32 fl oz (quart)" ] }, "asin": "B08KT61CYV" }, { "task_id": "ws_B09MZ5RBRT_3658", "instruction": "i'm looking for a camouflage colored leggings which is high at the waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "camouflage" ] }, "asin": "B09MZ5RBRT" }, { "task_id": "ws_B08P365RJW_3659", "instruction": "do you think you can find me a power amp that is easy to install?", "target_attributes": { "attributes": [ "power amplifier", "easy install" ], "options": [] }, "asin": "B08P365RJW" }, { "task_id": "ws_B08XNSPPTK_3660", "instruction": "i am looking for remote controls that include batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B08XNSPPTK" }, { "task_id": "ws_B088S15MCJ_3661", "instruction": "i want to buy a moisturizing milk purifying gel cleanser that is sulfate and alcohol free.", "target_attributes": { "attributes": [ "sulfate free", "alcohol free" ], "options": [ "moisturizing milk cleanser" ] }, "asin": "B088S15MCJ" }, { "task_id": "ws_B072C9CB54_3662", "instruction": "i need a small yellow polyester spandex lingerie sleepwear.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "yellow", "small" ] }, "asin": "B072C9CB54" }, { "task_id": "ws_B0848BNQFD_3663", "instruction": "i am looking for black magic seasoning that is gluten free and 1.37 pounds.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "black magic", "1.37 pound (pack of 1)" ] }, "asin": "B0848BNQFD" }, { "task_id": "ws_B0848BNQFD_3664", "instruction": "i want variety pack gluten free meat seasoning spices gift set size :5.5 ounce (pack of 4)", "target_attributes": { "attributes": [ "gluten free", "gift set" ], "options": [ "variety pack", "5.5 ounce (pack of 4)" ] }, "asin": "B0848BNQFD" }, { "task_id": "ws_B0848BNQFD_3665", "instruction": "variety pack seasoning, gluten free 5.5oz gift set (pack of 4.)i'm cooking for friends, need to gift the couple something gourmet. mis rubins magic seems to be ideal.", "target_attributes": { "attributes": [ "gluten free", "gift set" ], "options": [ "5.5 ounce (pack of 4)" ] }, "asin": "B0848BNQFD" }, { "task_id": "ws_B078JFX823_3666", "instruction": "i want an ontario furniture 5 foot solid plastic folding table. if possible i need it to be heavy duty with the steel frame.", "target_attributes": { "attributes": [ "heavy duty", "steel frame" ], "options": [ "5 foot solid" ] }, "asin": "B078JFX823" }, { "task_id": "ws_B09HPP4YZX_3667", "instruction": "do you think you can find me some long lasting women's nail polish? i want the one in the color a-07.", "target_attributes": { "attributes": [ "long lasting", "nail polish" ], "options": [ "a-07" ] }, "asin": "B09HPP4YZX" }, { "task_id": "ws_B0917L2DBN_3668", "instruction": "i need a 60 silver mist wig that is made from natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "rl56 | 60 silver mist" ] }, "asin": "B0917L2DBN" }, { "task_id": "ws_B09H6QRWJ6_3669", "instruction": "i'm searching for daily wear men loafers with size 11 and black | 01 color", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "black | 01", "11" ] }, "asin": "B09H6QRWJ6" }, { "task_id": "ws_B08QJJX71B_3670", "instruction": "i am looking for an all in one bluetooth record player and carrying case in brown.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "black", "player" ] }, "asin": "B08QJJX71B" }, { "task_id": "ws_B000V1JVAI_3671", "instruction": "can you find me a shelf stable potato side dish? i want something that i can cook in the microwave.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "microwave meals" ] }, "asin": "B000V1JVAI" }, { "task_id": "ws_B07PLF2WW5_3672", "instruction": "i need you to find me a high definition bullet camera that has 1080p hd.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B07PLF2WW5" }, { "task_id": "ws_B085TN7R2X_3673", "instruction": "i'm looking for a portable bluetooth speakers with plug play and has usb port. also, choose mini mamba sized black colored one.", "target_attributes": { "attributes": [ "plug play", "usb port" ], "options": [ "black", "mini mamba" ] }, "asin": "B085TN7R2X" }, { "task_id": "ws_B08B3K4YHZ_3674", "instruction": "i need a two pack of hdmi cables that are high speed and 35 feet.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack - nylon braided", "35 feet (cl3) | 10.6 meter" ] }, "asin": "B08B3K4YHZ" }, { "task_id": "ws_B00FDXY2WG_3675", "instruction": "i need a water resistant pager that has a transmitter set.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "1 transmitter set" ] }, "asin": "B00FDXY2WG" }, { "task_id": "ws_B09DCL3LH2_3676", "instruction": "i want a vogu twin platform wood trudle bed for teens. i need it in white-6 color.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "white-6" ] }, "asin": "B09DCL3LH2" }, { "task_id": "ws_B082FJSZHK_3677", "instruction": "i would like wide leg black jeans that are small", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "black", "small" ] }, "asin": "B082FJSZHK" }, { "task_id": "ws_B09GLWQ6T3_3678", "instruction": "i am looking for a wireless mini 1080p spy camera with motion detection and night vision.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B09GLWQ6T3" }, { "task_id": "ws_B082ZYLXKQ_3679", "instruction": "i need 30ml travel bottles.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "30ml" ] }, "asin": "B082ZYLXKQ" }, { "task_id": "ws_B09QC9H4S6_3680", "instruction": "i would like a women's xl dark heather cotton tank top that's machine washable.", "target_attributes": { "attributes": [ "machine wash", "heathers cotton", "cotton heather" ], "options": [ "dark heather", "women", "x-large" ] }, "asin": "B09QC9H4S6" }, { "task_id": "ws_B00WAKAEQS_3681", "instruction": "i'm looking for a pack of butter cookies made with quality ingredients. get me the 3 pound package.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "3 pound" ] }, "asin": "B00WAKAEQS" }, { "task_id": "ws_B07ZYDBNH5_3682", "instruction": "i am looking for light brown hair extensions for women.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "light brown-body wave" ] }, "asin": "B07ZYDBNH5" }, { "task_id": "ws_B07ZYDBNH5_3683", "instruction": "find me an 18 inch long double sided human hair extensions that is golden brown and beach blonde in color.", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "golden brown&bleach blonde", "18 inch (60 gram)" ] }, "asin": "B07ZYDBNH5" }, { "task_id": "ws_B07ZYDBNH5_3684", "instruction": "i need some 12 inch white blonde hair extensions", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "white blonde-body wave", "12 inch (60 gram)" ] }, "asin": "B07ZYDBNH5" }, { "task_id": "ws_B07ZYDBNH5_3685", "instruction": "i am interested in 24 inch hair extensions", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "24 inch (60 gram)" ] }, "asin": "B07ZYDBNH5" }, { "task_id": "ws_B07KP16BSQ_3686", "instruction": "i need a certified refurbished hp laser printer.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07KP16BSQ" }, { "task_id": "ws_B01J1PUN92_3687", "instruction": "i want to find some keto friendly salsa made with quality ingredients.", "target_attributes": { "attributes": [ "keto friendly", "quality ingredients" ], "options": [] }, "asin": "B01J1PUN92" }, { "task_id": "ws_B01M2ZXXL6_3688", "instruction": "let's see some long lasting moose that is about 250ml.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B01M2ZXXL6" }, { "task_id": "ws_B007EZ8SHQ_3689", "instruction": "i need to find a sugar free, fruit flavoured powdered drink.", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B007EZ8SHQ" }, { "task_id": "ws_B007EZ8SHQ_3690", "instruction": "i am looking for sugar free soft drink mixes with fruit punch", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B007EZ8SHQ" }, { "task_id": "ws_B08CBS1Z2Q_3691", "instruction": "i am looking for a good hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [] }, "asin": "B08CBS1Z2Q" }, { "task_id": "ws_B09GK63B91_3692", "instruction": "i'm looking for a heavy duty case for my phone. can you get me one in black and orange?", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black orange+clip" ] }, "asin": "B09GK63B91" }, { "task_id": "ws_B09GK63B91_3693", "instruction": "i am looking for an easy to install iphone case that is pink and blue and xs max in size.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "pink+blue", "xs max" ] }, "asin": "B09GK63B91" }, { "task_id": "ws_B07BF5MRJK_3694", "instruction": "can you find me a face mask for dry skin? i want something that comes in 1.0 fl oz.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "1.0 fl oz" ] }, "asin": "B07BF5MRJK" }, { "task_id": "ws_B07B616217_3695", "instruction": "i need a wall lamp that is a vanity lamp with a white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "vanity light" ] }, "asin": "B07B616217" }, { "task_id": "ws_B09HYZH871_3696", "instruction": "i'm looking for an anti-aging serum that helps to reduce fine lines and moisturizes dry skin.", "target_attributes": { "attributes": [ "anti aging", "fine lines", "dry skin" ], "options": [] }, "asin": "B09HYZH871" }, { "task_id": "ws_B000VV5XY6_3697", "instruction": "do you think you can find me a long lasting women's perfume?", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B000VV5XY6" }, { "task_id": "ws_B08PFL4K7L_3698", "instruction": "i need purple eyeshadow applicators that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "purple" ] }, "asin": "B08PFL4K7L" }, { "task_id": "ws_B07KXVGHTV_3699", "instruction": "can you find me a bath scrubber for dead skin with a long handle? i want the one that is white with the bath ball.", "target_attributes": { "attributes": [ "long handle", "dead skin" ], "options": [] }, "asin": "B07KXVGHTV" }, { "task_id": "ws_B08FM6347F_3700", "instruction": "i am looking for a man's size 6, black, non-slip working shoe with a rubber sole.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "f black", "7.5 women | 6 men" ] }, "asin": "B08FM6347F" }, { "task_id": "ws_B09PBLBWB5_3701", "instruction": "i need hdmi cables that are high speed and 1m long.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1m" ] }, "asin": "B09PBLBWB5" }, { "task_id": "ws_B00K5WG30Y_3702", "instruction": "i would like three 3.5 fluid ounce long lasting hair dye preferably in dark warm brown.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "dark warm brown", "3.5 fl oz (pack of 3)" ] }, "asin": "B00K5WG30Y" }, { "task_id": "ws_B00K5WG30Y_3703", "instruction": "i looh for this brand i need exactly this kiss express semi-permanent hair color 100ml (3.5 us fl.oz) long lasting, color cobalt blue.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "cobalt blue" ] }, "asin": "B00K5WG30Y" }, { "task_id": "ws_B07Z1RWD8Z_3704", "instruction": "i am looking for graphic tees for men highest quality fabrics, are 100% cotton and machine washable classic fit willy wonka and the chocolate factory music makers t-shirt in heather grey color. size 4t preferable.", "target_attributes": { "attributes": [ "officially licensed", "needle sleeve", "classic fit" ], "options": [ "heather grey", "men", "4t" ] }, "asin": "B07Z1RWD8Z" }, { "task_id": "ws_B089K2CS7Z_3705", "instruction": "i am looking for easy install hanging lamp dome pendant light, color b", "target_attributes": { "attributes": [ "easy install", "pendant light" ], "options": [ "b" ] }, "asin": "B089K2CS7Z" }, { "task_id": "ws_B01N5H9DIM_3706", "instruction": "i want a soy wax candle that has a terra cotta scent.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "terra cotta" ] }, "asin": "B01N5H9DIM" }, { "task_id": "ws_B01N5H9DIM_3707", "instruction": "i'm interested in a 10-inch soy jar candle with a sea salt & ginger scent.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "sea salt & ginger", "10 in" ] }, "asin": "B01N5H9DIM" }, { "task_id": "ws_B01N5H9DIM_3708", "instruction": "i would like a moss green candle that is made from soy", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "moss green" ] }, "asin": "B01N5H9DIM" }, { "task_id": "ws_B093YT997C_3709", "instruction": "i would like to buy a colorful blouse hosiery laundry bag.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YT997C" }, { "task_id": "ws_B08MN8CYT8_3710", "instruction": "i am looking for long lasting winter candle with green jar.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "green jar" ] }, "asin": "B08MN8CYT8" }, { "task_id": "ws_B07QBY4387_3711", "instruction": "i am looking for a 6 foot by 4 foot underwater photography backdrop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "6x4ft" ] }, "asin": "B07QBY4387" }, { "task_id": "ws_B09B1NY84G_3712", "instruction": "find me a samsung galaxy smartphone with a long lasting battery and its t-mobile is already unlocked.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "t-mobile unlocked" ] }, "asin": "B09B1NY84G" }, { "task_id": "ws_B07SFZQFRQ_3713", "instruction": "i am looking for snickerdoodles that have been baked fresh.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "snickerdoodle" ] }, "asin": "B07SFZQFRQ" }, { "task_id": "ws_B07YDZPYLQ_3714", "instruction": "i want 81 medium ash blonde color hair dye", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "81 medium ash blonde" ] }, "asin": "B07YDZPYLQ" }, { "task_id": "ws_B07YDZPYLQ_3715", "instruction": "i'm looking for hair dye for permanent hair it was easy to use.", "target_attributes": { "attributes": [ "hair dye", "permanent hair" ], "options": [ "50 medium natural brown" ] }, "asin": "B07YDZPYLQ" }, { "task_id": "ws_B07YDZPYLQ_3716", "instruction": "i need a easy to apply hair coloring product on the black color..", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "10 black" ] }, "asin": "B07YDZPYLQ" }, { "task_id": "ws_B096ZFGXMJ_3717", "instruction": "i am looking for hair care conditioner for damaged hair having scent tea tree rosemary 33.8 fl", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "tea tree rosemary 33.8 fl", "conditioner" ] }, "asin": "B096ZFGXMJ" }, { "task_id": "ws_B09NM1GW5W_3718", "instruction": "i am looking for lightweight men's size 7.5 non slip german shepherd shoes with mesh.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "9 women | 7.5 men" ] }, "asin": "B09NM1GW5W" }, { "task_id": "ws_B08L7KXKM6_3719", "instruction": "i would like some white noise cancelling earbud headphones that charge as fast as possible.", "target_attributes": { "attributes": [ "noise cancelling", "fast charging" ], "options": [ "white" ] }, "asin": "B08L7KXKM6" }, { "task_id": "ws_B00FGDGYXS_3720", "instruction": "do you think you can find me an alcohol free mouthwash for bad breath?", "target_attributes": { "attributes": [ "alcohol free", "bad breath" ], "options": [] }, "asin": "B00FGDGYXS" }, { "task_id": "ws_B0791H84G3_3721", "instruction": "i need some fruit snacks that come in a variety pack. make sure that they are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B0791H84G3" }, { "task_id": "ws_B093YSNJGF_3722", "instruction": "i am looking to buy a mesh laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSNJGF" }, { "task_id": "ws_B01BRTBUEC_3723", "instruction": "i would like chocolate that is individually wrapped and are fun sized.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "fun size" ] }, "asin": "B01BRTBUEC" }, { "task_id": "ws_B01HJWCB3U_3724", "instruction": "can you find me some high speed hdmi cables? i really want the ones that come in a 3 pack.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 pack" ] }, "asin": "B01HJWCB3U" }, { "task_id": "ws_B08C9FC94G_3725", "instruction": "i am looking for grey color mens polyester hoodie.", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "grey" ] }, "asin": "B08C9FC94G" }, { "task_id": "ws_B09KXSGRKG_3726", "instruction": "i'm looking for a pair of men's beach sandals with a leather sole, arch support, and non-slip grip. get the ones that are light brown in 9 or 9.5 in size.", "target_attributes": { "attributes": [ "non slip", "arch support", "leather sole" ], "options": [ "light&brown", "9-9.5" ] }, "asin": "B09KXSGRKG" }, { "task_id": "ws_B0026NS2T0_3727", "instruction": "i need to get some batteries for my two way radio. the one that i have takes aaa batteries.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B0026NS2T0" }, { "task_id": "ws_B08Y976Y4D_3728", "instruction": "i need xx-large wide leg jumpsuits that are wine colored.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "wine", "xx-large" ] }, "asin": "B08Y976Y4D" }, { "task_id": "ws_B07GXLG5W6_3729", "instruction": "i am looking for a nightstand with drawers. it should have a nickle finish.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "nightstand" ] }, "asin": "B07GXLG5W6" }, { "task_id": "ws_B0971SMH99_3730", "instruction": "i am looking for cactus colored vinyl shoes in a size 8.5-9.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "cactus", "8.5-9" ] }, "asin": "B0971SMH99" }, { "task_id": "ws_B07RXMK2PN_3731", "instruction": "i am looking for a tea gift set that is in rose gold.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "coffee gifts- rose gold" ] }, "asin": "B07RXMK2PN" }, { "task_id": "ws_B073JH3VPX_3732", "instruction": "can you find a gluten free flatbread cracker with multi-seeds on it?", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "multi-seeds" ] }, "asin": "B073JH3VPX" }, { "task_id": "ws_B08RDBGV4Z_3733", "instruction": "i\u2019m interested in nail art; can you help me find a really high quality nail gel polish with a metallic purple effect?", "target_attributes": { "attributes": [ "high quality", "nail polish", "nail art" ], "options": [ "purple" ] }, "asin": "B08RDBGV4Z" }, { "task_id": "ws_B08Q8SRFNN_3734", "instruction": "i need a water resistant snow boot in caramel brown color.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "caramel brown" ] }, "asin": "B08Q8SRFNN" }, { "task_id": "ws_B08155VDDT_3735", "instruction": "i am looking for an oil free hyaluronic acid.", "target_attributes": { "attributes": [ "oil free", "hyaluronic acid" ], "options": [] }, "asin": "B08155VDDT" }, { "task_id": "ws_B08QDPGHBL_3736", "instruction": "i\u2019m looking for some keto-friendly breakfast waffles in cinnamon toast and maple flavour. please make sure it\u2019s gluten free.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [ "cinnamon toast & maple waffle" ] }, "asin": "B08QDPGHBL" }, { "task_id": "ws_B08QDPGHBL_3737", "instruction": "i am looking for plant based,sugar free and gluten free maple waffle.", "target_attributes": { "attributes": [ "sugar free", "plant based", "gluten free" ], "options": [ "maple waffle" ] }, "asin": "B08QDPGHBL" }, { "task_id": "ws_B08QDPGHBL_3738", "instruction": "i want to buy a 9 ounce, maple waffle flavored keto friendly snack that is sugar and grain free.", "target_attributes": { "attributes": [ "keto friendly", "sugar free", "grain free" ], "options": [ "maple waffle", "9 ounce (pack of 8)" ] }, "asin": "B08QDPGHBL" }, { "task_id": "ws_B08SRDBQZD_3739", "instruction": "i would like a quad core tablet.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B08SRDBQZD" }, { "task_id": "ws_B098JR7D8X_3740", "instruction": "i would like a 12\"x20\" grey throw pillow cover that has exquisite sewing and technique.", "target_attributes": { "attributes": [ "exquisite workmanship" ], "options": [ "12\"x20\"" ] }, "asin": "B098JR7D8X" }, { "task_id": "ws_B09R6VDHJ4_3741", "instruction": "my mom wear 11 size high heel", "target_attributes": { "attributes": [ "high heel" ], "options": [ "11" ] }, "asin": "B09R6VDHJ4" }, { "task_id": "ws_B09JT2BF5M_3742", "instruction": "i am looking to buy an ultra hd, motion detection hidden camera charger.", "target_attributes": { "attributes": [ "ultra hd", "motion detection" ], "options": [] }, "asin": "B09JT2BF5M" }, { "task_id": "ws_B094ZBVWK9_3743", "instruction": "i need a butterfly print slippers which is 13 wide. it should be non slip and light weight.", "target_attributes": { "attributes": [ "non slip", "light weight" ], "options": [ "just a girl who loves butterfly", "13 wide" ] }, "asin": "B094ZBVWK9" }, { "task_id": "ws_B004A7CC32_3744", "instruction": "i am looking for some size 7 wide open toe shoes that have a heel and come in black.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black", "7 wide" ] }, "asin": "B004A7CC32" }, { "task_id": "ws_B09LVQ3T86_3745", "instruction": "find me a machine washable long sleeved pullover with a loose fit. i want the one in green in small.", "target_attributes": { "attributes": [ "machine washable", "loose fit", "machine wash", "long sleeve" ], "options": [ "x01-green", "small" ] }, "asin": "B09LVQ3T86" }, { "task_id": "ws_B08FXTGNGY_3746", "instruction": "i am looking for a gluten free, low carb, flavored fyr salt shaker.", "target_attributes": { "attributes": [ "gluten free", "low carb" ], "options": [ "fyr salt" ] }, "asin": "B08FXTGNGY" }, { "task_id": "ws_B098XBFPF4_3747", "instruction": "i need an easy to clean bedroom bench footstool seat. show me something in white.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "white" ] }, "asin": "B098XBFPF4" }, { "task_id": "ws_B07SZB6VQH_3748", "instruction": "i wish to buy a tempered glass screen protector which must be easy to instal on an 8.4 inch touchscreen of a 2019 dodge ram.", "target_attributes": { "attributes": [ "easy install", "tempered glass" ], "options": [ "for 2019 dodge ram 8.4 inch" ] }, "asin": "B07SZB6VQH" }, { "task_id": "ws_B001CMRVH0_3749", "instruction": "i need ten 12 foot high speed hdmi male to male cables.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 pack", "12 feet (10-pack)", "hdmi male to male" ] }, "asin": "B001CMRVH0" }, { "task_id": "ws_B001CMRVH0_3750", "instruction": "i'm looking for product packaging it is easy to use", "target_attributes": { "attributes": [ "high speed" ], "options": [ "4 pack", "8 feet (3-pack)" ] }, "asin": "B001CMRVH0" }, { "task_id": "ws_B001CMRVH0_3751", "instruction": "i would like two packs of 12 feet high speed hdmi male to male cables.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack", "12 feet (10-pack)", "hdmi male to male" ] }, "asin": "B001CMRVH0" }, { "task_id": "ws_B075G2XTBW_3752", "instruction": "i would like a remote control that already comes with aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B075G2XTBW" }, { "task_id": "ws_B07JMWDK4J_3753", "instruction": "i am looking for a slip resistant black water shoe in size 12 that is also quick drying.", "target_attributes": { "attributes": [ "slip resistant", "quick drying" ], "options": [ "black", "12" ] }, "asin": "B07JMWDK4J" }, { "task_id": "ws_B078YFWC2R_3754", "instruction": "can you get me a whitening toothpaste that is for sensitive teeth?", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [] }, "asin": "B078YFWC2R" }, { "task_id": "ws_B085TKNL9R_3755", "instruction": "i'm setting up for a birthday party and i'm looking for some party supplies. can you find me a cake topper?", "target_attributes": { "attributes": [ "party supplies", "birthday party" ], "options": [] }, "asin": "B085TKNL9R" }, { "task_id": "ws_B09JWM3Y7X_3756", "instruction": "i'm searching for small high gloss nightstand for living room", "target_attributes": { "attributes": [ "high gloss", "living room" ], "options": [] }, "asin": "B09JWM3Y7X" }, { "task_id": "ws_B094ZNX8HY_3757", "instruction": "i am an african woman looking for a barber to cut my hair.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [] }, "asin": "B094ZNX8HY" }, { "task_id": "ws_B09LCRPSG9_3758", "instruction": "my 6 years old child like teeth whitening", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "aged 6-12" ] }, "asin": "B09LCRPSG9" }, { "task_id": "ws_B09LCRPSG9_3759", "instruction": "i am looking for toothbrush of b04#yellow penguin color that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "b04#yellow penguin" ] }, "asin": "B09LCRPSG9" }, { "task_id": "ws_B09PGHT496_3760", "instruction": "i am looking for long sleeve men t-shirt.and please also choose the black one.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "d_black" ] }, "asin": "B09PGHT496" }, { "task_id": "ws_B07GSPLN9N_3761", "instruction": "i need a wall lamp that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B07GSPLN9N" }, { "task_id": "ws_B07RT9X4PM_3762", "instruction": "i want to find a vanity light that is easy to install. my walls are black and i want something the same color.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [ "black (natural white)" ] }, "asin": "B07RT9X4PM" }, { "task_id": "ws_B07RT9X4PM_3763", "instruction": "find a black colored wall lamp thats easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "black (cool white)" ] }, "asin": "B07RT9X4PM" }, { "task_id": "ws_B08GNS58PQ_3764", "instruction": "please help me find an 8oz pack of medical body scrub exfolient that is suitable for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B08GNS58PQ" }, { "task_id": "ws_B094MRG3NG_3765", "instruction": "i need a small hawaiian shirt with short sleeves, lasts long and has a button closure.", "target_attributes": { "attributes": [ "long lasting", "button closure", "short sleeve" ], "options": [ "small" ] }, "asin": "B094MRG3NG" }, { "task_id": "ws_B07NMG2MBV_3766", "instruction": "i'm looking for some highly pigmented seed oil lipstick. find the one in rich berry that is .14 fl oz.", "target_attributes": { "attributes": [ "highly pigmented", "seed oil" ], "options": [ "13 rich berry", "0.14 fl oz" ] }, "asin": "B07NMG2MBV" }, { "task_id": "ws_B07NMG2MBV_3767", "instruction": "i need a highly pigment lip tint. pick a 0.14 fl oz bottle.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "0.14 fl oz" ] }, "asin": "B07NMG2MBV" }, { "task_id": "ws_B08W4DHZ1M_3768", "instruction": "i need cake toppers that are dairy free and are 2\".", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "2\" | 12 cupcakes toppers" ] }, "asin": "B08W4DHZ1M" }, { "task_id": "ws_B006GRKQ0K_3769", "instruction": "i am looking for rich taste and color of classic red velvet cake, packaged in bpa free and gluten free lorann red velvet bakery emulsion in hazelnut flavour in 4 fl oz, 3 pack size.", "target_attributes": { "attributes": [ "bpa free", "gluten free" ], "options": [ "hazelnut", "4 fl oz, 3 pack" ] }, "asin": "B006GRKQ0K" }, { "task_id": "ws_B089YDCJYL_3770", "instruction": "i am looking for a pair of women's high waisted active shorts. get me the pink ones.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "a pink" ] }, "asin": "B089YDCJYL" }, { "task_id": "ws_B0781VL2JZ_3771", "instruction": "i need some argan oil that is free of parabens. get me the 2 ounce pack.", "target_attributes": { "attributes": [ "paraben free", "argan oil" ], "options": [ "2 ounce" ] }, "asin": "B0781VL2JZ" }, { "task_id": "ws_B083VZWXLM_3772", "instruction": "i'm looking for men's daily wear shirt with long sleeves and button closure type. also, choose black colored tall shirt with size 20\" neck and 34\"-35\" sleeves.", "target_attributes": { "attributes": [ "button closure", "long sleeve", "daily wear" ], "options": [ "black 015", "20\" neck 34\"-35\" sleeve", "tall" ] }, "asin": "B083VZWXLM" }, { "task_id": "ws_B08VDLHDY7_3773", "instruction": "i need daily casual and gym workout large size yoga pants with classic dark gray color and special size- 02 sweatpants", "target_attributes": { "attributes": [ "daily casual", "gym workout" ], "options": [ "classic dark gray", "large", "02 sweatpants" ] }, "asin": "B08VDLHDY7" }, { "task_id": "ws_B09MRGSLGY_3774", "instruction": "i am looking for a product that i can use for hair cutting dry hair.", "target_attributes": { "attributes": [ "dry hair", "hair cutting" ], "options": [ "b" ] }, "asin": "B09MRGSLGY" }, { "task_id": "ws_B015R09D8M_3775", "instruction": "i need a 9.5 rubber soled hiking shoe made of light weight vinyl acetate.", "target_attributes": { "attributes": [ "light weight", "vinyl acetate", "rubber sole" ], "options": [ "9.5" ] }, "asin": "B015R09D8M" }, { "task_id": "ws_B08BZFMN1F_3776", "instruction": "i would like a 47.2\" x 11.8\" x 11.8\" white and sonoma oak tv center for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white and sonoma oak", "47.2\" x 11.8\" x 11.8\"" ] }, "asin": "B08BZFMN1F" }, { "task_id": "ws_B00BGNI6IS_3777", "instruction": "i'm looking for a corner shelf unit for the living room made out of engineered wood. get the one in light cherry and black color.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "light cherry | black" ] }, "asin": "B00BGNI6IS" }, { "task_id": "ws_B00BGNI6IS_3778", "instruction": "i am looking for engineered wood 3-tier corner shelf in color : walnut|brown", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "walnut | brown", "3-tier" ] }, "asin": "B00BGNI6IS" }, { "task_id": "ws_B00BGNI6IS_3779", "instruction": "i am looking for a dark cherry | black corner shelves for living room", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B00BGNI6IS" }, { "task_id": "ws_B00BGNI6IS_3780", "instruction": "i am looking for corner shelf of size 5-tier for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "5-tier" ] }, "asin": "B00BGNI6IS" }, { "task_id": "ws_B00BGNI6IS_3781", "instruction": "i am looking for 3-tier size corner shelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "3-tier" ] }, "asin": "B00BGNI6IS" }, { "task_id": "ws_B09DG3NRK3_3782", "instruction": "i am looking for a pair of anti slip womens sneakers spot color.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "spot" ] }, "asin": "B09DG3NRK3" }, { "task_id": "ws_B07MQ9S96H_3783", "instruction": "i am looking for high quality glass spray bottle of 3.40 ounce.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "3.4 ounce x 2" ] }, "asin": "B07MQ9S96H" }, { "task_id": "ws_B09SCX4WBW_3784", "instruction": "i am looking for a pair of mens shorts that are machine washable for my everyday wear. id like a light grey color.", "target_attributes": { "attributes": [ "machine washable", "everyday wear" ], "options": [ "light grey" ] }, "asin": "B09SCX4WBW" }, { "task_id": "ws_B088TP7Z5J_3785", "instruction": "i need window blinds that are easy to install that have a java brown light filtering.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "java brown(light filtering)" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3786", "instruction": "i'm looking for an easy-to-install, light-filtering window curtain in java brown.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "java brown(light filtering)" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3787", "instruction": "i would like a 14\"w x 60\"h snow white roller shade that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "snow white(light filtering)", "14\"w x 60\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3788", "instruction": "i need some white window blinds that are 60 inches tall.", "target_attributes": { "attributes": [ "white item" ], "options": [ "58 1 | 2\"w x 60\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3789", "instruction": "i am looking for a size: 20\"w x 64\"h roller shades white item which is easy to install.", "target_attributes": { "attributes": [ "easy install", "white item" ], "options": [ "20\"w x 64\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3790", "instruction": "i would like a 2\"w x 36\"h cheese milk colored roller shade that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "cheese milk(light filtering)", "48 1 | 2\"w x 36\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3791", "instruction": "im looking for white window blinds that are easy to install and measure 35\u201d wide with a 48\u201d height.", "target_attributes": { "attributes": [ "easy install", "white item" ], "options": [ "48 1 | 2\"w x 72\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3792", "instruction": "i'm looking for a size 34\"w x 72\"h easy install window blinds.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "34\"w x 72\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3793", "instruction": "i am looking for shades of size 54\"w x 72\"h that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "54\"w x 72\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3794", "instruction": "i would like purple blinds that are easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "lilac purple(light filtering)" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3795", "instruction": "i am looking for an easy to install light filtering contrast grey window blind.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3796", "instruction": "i am interested in blinds that are 34\"w by 56\"h and that are light filtering.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "hudson hemp(light filtering)", "34\"w x 56\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B088TP7Z5J_3797", "instruction": "i need some white window treatments that are easy to install and size 58\"w by 48\"h", "target_attributes": { "attributes": [ "easy install" ], "options": [ "antique white(light filtering)", "58\"w x 48\"h" ] }, "asin": "B088TP7Z5J" }, { "task_id": "ws_B09CZH31LM_3798", "instruction": "i am looking for hen of the woods potato chips with all natural ingredients would like sea salt pack of 6, 6 ounce.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "sea salt 6 ounce (pack of 6)" ] }, "asin": "B09CZH31LM" }, { "task_id": "ws_B07XY3XFC5_3799", "instruction": "polyester bag with trolley belt,", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "13.3-inch" ] }, "asin": "B07XY3XFC5" }, { "task_id": "ws_B0977WW7JZ_3800", "instruction": "i would like a youth size 3t dark heather cotton t shirt.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "dark heather", "youth", "3t" ] }, "asin": "B0977WW7JZ" }, { "task_id": "ws_B0141TMYV8_3801", "instruction": "i'm looking for some women's sneakers with rubber soles. make sure they are fabric and in a size 6.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "fabric", "6.5" ] }, "asin": "B0141TMYV8" }, { "task_id": "ws_B075V5JK36_3802", "instruction": "can you find me a long lasting hdmi cable? i only need one that is fifteen foot long.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "1", "15ft" ] }, "asin": "B075V5JK36" }, { "task_id": "ws_B071WYXY6B_3803", "instruction": "i am looking for a red high performance bluetooth speaker.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "red" ] }, "asin": "B071WYXY6B" }, { "task_id": "ws_B071XHWM4Z_3804", "instruction": "i am looking for a women's natural blonde, 16 inch, synthetic hair wig to buy.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "natural blonde", "16 inch (pack of 1)" ] }, "asin": "B071XHWM4Z" }, { "task_id": "ws_B071XHWM4Z_3805", "instruction": "i'm looking for reecho 20 inch (pack of 1) of 3/4 full head curly wave clips on synthetic hair extensions pieces for women and choose the color ombre dark brown to dirty blonde", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [] }, "asin": "B071XHWM4Z" }, { "task_id": "ws_B071XHWM4Z_3806", "instruction": "i want jet black hair extensions that is synthetic.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "jet black" ] }, "asin": "B071XHWM4Z" }, { "task_id": "ws_B071XHWM4Z_3807", "instruction": "i want light purple synthetic hair extensions.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "light purple" ] }, "asin": "B071XHWM4Z" }, { "task_id": "ws_B071XHWM4Z_3808", "instruction": "i'm looking for a pack of synthetic hair extensions to clip onto my curly hair; please choose the 24\" length.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "24 inch (pack of 1)" ] }, "asin": "B071XHWM4Z" }, { "task_id": "ws_B091B1ZTX5_3809", "instruction": "what kind of cupcake toppers do you see that you can use for a birthday party?", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B091B1ZTX5" }, { "task_id": "ws_B08C543HDX_3810", "instruction": "i would like a women's size 9 brown high heeled shoe with a closed toe.", "target_attributes": { "attributes": [ "high heel", "closed toe" ], "options": [ "zr7-brown", "9" ] }, "asin": "B08C543HDX" }, { "task_id": "ws_B09MSN7WX8_3811", "instruction": "i'm looking for a cookie that replaces a meal in varying flavors with macadamia nuts and is low in calories.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "variety pack" ] }, "asin": "B09MSN7WX8" }, { "task_id": "ws_B09MSN7WX8_3812", "instruction": "i need some low calorie chocolate chip pecan snacks.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "chocolate chip pecan" ] }, "asin": "B09MSN7WX8" }, { "task_id": "ws_B094417XSZ_3813", "instruction": "i'm looking for a white bookcase for my office. make sure it has a white finish.", "target_attributes": { "attributes": [ "white item", "white finish" ], "options": [] }, "asin": "B094417XSZ" }, { "task_id": "ws_B0773YNFTJ_3814", "instruction": "i would like a perfect gift basket for a happy birthday.", "target_attributes": { "attributes": [ "perfect gift", "gift basket" ], "options": [ "e - happy birthday" ] }, "asin": "B0773YNFTJ" }, { "task_id": "ws_B07G358Y3W_3815", "instruction": "can you find me an alcohol free mouthwash for bad breath? i want the one in energizing mint flavor.", "target_attributes": { "attributes": [ "alcohol free", "bad breath" ], "options": [ "energizing mint" ] }, "asin": "B07G358Y3W" }, { "task_id": "ws_B085F2HS8S_3816", "instruction": "i need an animal themed and seafoam multicolor office chair slipcover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "seafoam multicolor" ] }, "asin": "B085F2HS8S" }, { "task_id": "ws_B09MVK8CYY_3817", "instruction": "my face included small sizes of dark circles", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B09MVK8CYY" }, { "task_id": "ws_B00LW3RC4Q_3818", "instruction": "can you find me an easy to clean coffee table made out of solid wood and tempered glass?", "target_attributes": { "attributes": [ "easy clean", "tempered glass", "solid wood" ], "options": [] }, "asin": "B00LW3RC4Q" }, { "task_id": "ws_B099KGG78L_3819", "instruction": "i want party supplies for decorations that are easy to use. make sure there are cupcake toppers.", "target_attributes": { "attributes": [ "easy use", "party supplies" ], "options": [] }, "asin": "B099KGG78L" }, { "task_id": "ws_B07T6JK232_3820", "instruction": "i'm looking for large melinda slippers for women that have faux fur and rubber soles.", "target_attributes": { "attributes": [ "faux fur", "rubber sole" ], "options": [ "large m us" ] }, "asin": "B07T6JK232" }, { "task_id": "ws_B07T6JK232_3821", "instruction": "i am ordering grey women faux fur slippers .", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "grey | mint" ] }, "asin": "B07T6JK232" }, { "task_id": "ws_B09GFHDTPD_3822", "instruction": "i'm looking for some eco friendly dental floss. can you pick out the white one?", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "white" ] }, "asin": "B09GFHDTPD" }, { "task_id": "ws_B098DXFRSD_3823", "instruction": "can you find me a pair of men's non-slip beach sandals with arch support? i want a pair in size 14.", "target_attributes": { "attributes": [ "non slip", "arch support" ], "options": [ "14" ] }, "asin": "B098DXFRSD" }, { "task_id": "ws_B01693D2ZG_3824", "instruction": "i like gold gift basket", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "warming joy - red | gold" ] }, "asin": "B01693D2ZG" }, { "task_id": "ws_B01693D2ZG_3825", "instruction": "i'm looking to buy a gift set filled with wellness tea samples that are caffeine free.", "target_attributes": { "attributes": [ "caffeine free", "gift set" ], "options": [ "wellbeing wellness tea" ] }, "asin": "B01693D2ZG" }, { "task_id": "ws_B09G6L7L72_3826", "instruction": "i need 3.52 ounce funky choco pineapple biscuits that are soy free.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "funky choco", "3.52 ounce (pack of 6)" ] }, "asin": "B09G6L7L72" }, { "task_id": "ws_B09MCPL8N4_3827", "instruction": "find for me a set of yarnow birthday party supplies", "target_attributes": { "attributes": [ "party supplies", "birthday party" ], "options": [] }, "asin": "B09MCPL8N4" }, { "task_id": "ws_B09MLM996X_3828", "instruction": "i need super soft throws that have butterflies and are 30 by 40 inches.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "i just really like butterflies", "30x40in for 1-5 toddler | pet" ] }, "asin": "B09MLM996X" }, { "task_id": "ws_B08RY2D8LQ_3829", "instruction": "i'm looking for hershey's kisses chocolates that can serve as a perfect gift for valentine's day.", "target_attributes": { "attributes": [ "valentine day", "perfect gift" ], "options": [] }, "asin": "B08RY2D8LQ" }, { "task_id": "ws_B07YFF9CL7_3830", "instruction": "i am looking for a men's classic fit t shirt that is x-large and white.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "white", "men", "x-large" ] }, "asin": "B07YFF9CL7" }, { "task_id": "ws_B07TW4HN5W_3831", "instruction": "find me some light weight, noise cancelling headphones. i want the white and black ones.", "target_attributes": { "attributes": [ "noise cancelling", "light weight" ], "options": [ "white black" ] }, "asin": "B07TW4HN5W" }, { "task_id": "ws_B07VZTDDM1_3832", "instruction": "i am looking for a candle in a clear glass jar (19 ounce) that smells like orange.", "target_attributes": { "attributes": [ "clear glass" ], "options": [ "hibiscus & melon" ] }, "asin": "B07VZTDDM1" }, { "task_id": "ws_B07VZTDDM1_3833", "instruction": "i would like a apple & oak three wick candle made of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "apple & oak", "3-wick" ] }, "asin": "B07VZTDDM1" }, { "task_id": "ws_B07N13NKV8_3834", "instruction": "i really need a long lasting deodorant.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07N13NKV8" }, { "task_id": "ws_B09DSZBVKX_3835", "instruction": "i want to buy an easy to clean and assemble entertainment center.", "target_attributes": { "attributes": [ "easy clean", "easy assemble" ], "options": [] }, "asin": "B09DSZBVKX" }, { "task_id": "ws_B08MQBH63T_3836", "instruction": "i am looking for some pink high quality makeup brush sets.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pink" ] }, "asin": "B08MQBH63T" }, { "task_id": "ws_B09SKN22ST_3837", "instruction": "i need elbow pads for teen girls that are small and black.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "black", "small" ] }, "asin": "B09SKN22ST" }, { "task_id": "ws_B09KQZGZWQ_3838", "instruction": "i would like round bottles that are bpa free and have fine mist spray caps. pick the clear one.", "target_attributes": { "attributes": [ "bpa free", "fine mist" ], "options": [ "clear" ] }, "asin": "B09KQZGZWQ" }, { "task_id": "ws_B09PDSMYJW_3839", "instruction": "i looking a short sleeve bridemaid gown satin tumble dry colour should be coral", "target_attributes": { "attributes": [ "short sleeve", "tumble dry" ], "options": [ "coral" ] }, "asin": "B09PDSMYJW" }, { "task_id": "ws_B095LD9RJH_3840", "instruction": "i would like to buy a deer statue for display in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B095LD9RJH" }, { "task_id": "ws_B09N9GMXB9_3841", "instruction": "i need cake toppers that are red for valentine's day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "red" ] }, "asin": "B09N9GMXB9" }, { "task_id": "ws_B08FBGGP37_3842", "instruction": "i need a high speed hdmi cable with an extension cord. pick a white one.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "cable + extension cord" ] }, "asin": "B08FBGGP37" }, { "task_id": "ws_B09P58XZ16_3843", "instruction": "i'm trying to find a one piece swimsuit with tummy control. i need one in size small.", "target_attributes": { "attributes": [ "tummy control" ], "options": [ "small" ] }, "asin": "B09P58XZ16" }, { "task_id": "ws_B09LK3PN6M_3844", "instruction": "i am looking for corn that is non gmo and spicy toasted as well as 16 oz.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "spicy toasted corn", "16 oz" ] }, "asin": "B09LK3PN6M" }, { "task_id": "ws_B08QHKHN59_3845", "instruction": "i am looking for easy to use movie themed cake toppers.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B08QHKHN59" }, { "task_id": "ws_B098BJVT82_3846", "instruction": "i would like a white contemporary modern style bed.", "target_attributes": { "attributes": [ "white item", "contemporary style" ], "options": [] }, "asin": "B098BJVT82" }, { "task_id": "ws_B098FGDCDS_3847", "instruction": "i need a white high definition dome camera.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "white" ] }, "asin": "B098FGDCDS" }, { "task_id": "ws_B098FGDCDS_3848", "instruction": "i'm looking for optical zoom electronics want to buy a white color.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "white", "12x" ] }, "asin": "B098FGDCDS" }, { "task_id": "ws_B08YYYDMKD_3849", "instruction": "i am looking for grey color smartwatch band.it should be compatible with apple watch.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "grey" ] }, "asin": "B08YYYDMKD" }, { "task_id": "ws_B09D3X58V1_3850", "instruction": "i'm going hiking so i'm looking for a pair of slip resistant rubber soled boots. i want something in 8.5.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "8.5" ] }, "asin": "B09D3X58V1" }, { "task_id": "ws_B07XW113LC_3851", "instruction": "i want round shape home furniture", "target_attributes": { "attributes": [ "home furnishings" ], "options": [ "round" ] }, "asin": "B07XW113LC" }, { "task_id": "ws_B07XW113LC_3852", "instruction": "i want a square shaped area rug for my home. pick a contemporary design in lavender or ivory color.", "target_attributes": { "attributes": [ "contemporary design", "home furnishings" ], "options": [ "lavender | ivory", "square" ] }, "asin": "B07XW113LC" }, { "task_id": "ws_B01MYZMIHB_3853", "instruction": "i am looking for a round, non-shedding, boho chic medallion distressed area rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "round" ] }, "asin": "B01MYZMIHB" }, { "task_id": "ws_B01MYZMIHB_3854", "instruction": "i need a pink colored area rug for my living room area.", "target_attributes": { "attributes": [ "home furnishings", "living room" ], "options": [ "pink | multi" ] }, "asin": "B01MYZMIHB" }, { "task_id": "ws_B01MYZMIHB_3855", "instruction": "i am looking for a rectangular shaped area rug for living room with orange or light blue color. also choose 2ft 2in x 4ft in size.", "target_attributes": { "attributes": [ "living room" ], "options": [ "orange | light blue", "rectangular", "2' 2\" x 4'" ] }, "asin": "B01MYZMIHB" }, { "task_id": "ws_B01MYZMIHB_3856", "instruction": "i am looking for boho chic medallion non shedding area rug 6'7''x9'2'' for my living room. in forest green, or light blue.", "target_attributes": { "attributes": [ "living room" ], "options": [ "forest green | light blue" ] }, "asin": "B01MYZMIHB" }, { "task_id": "ws_B01MYZMIHB_3857", "instruction": "i would like a 8 by 8 round rug preferably in fuchsia for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light blue | fuchsia", "round", "8' x 8'" ] }, "asin": "B01MYZMIHB" }, { "task_id": "ws_B07NBZJZDP_3858", "instruction": "i'm looking for an oil free concealer. can you get the one in shade 9?", "target_attributes": { "attributes": [ "oil free" ], "options": [ "6nt (shade 9)" ] }, "asin": "B07NBZJZDP" }, { "task_id": "ws_B09RZRCWCD_3859", "instruction": "i need a black full size metal bed frame that doesn't take up too much storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "black | silver", "full" ] }, "asin": "B09RZRCWCD" }, { "task_id": "ws_B07MRH3BQ1_3860", "instruction": "do you think you can find me a dustproof phone case? i'll take one in white.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "white" ] }, "asin": "B07MRH3BQ1" }, { "task_id": "ws_B09QKTVJV8_3861", "instruction": "i'm trying to find an office chair with metal legs. i really want one that is black.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "black2" ] }, "asin": "B09QKTVJV8" }, { "task_id": "ws_B09724XN6P_3862", "instruction": "can you get me a white bookshelf with a white finish? i want to get the one with one door.", "target_attributes": { "attributes": [ "white item", "white finish" ], "options": [ "white with 1 door" ] }, "asin": "B09724XN6P" }, { "task_id": "ws_B07F79DFCT_3863", "instruction": "i am looking for a peppermint alcohol free mouthwash for bad breath.", "target_attributes": { "attributes": [ "alcohol free", "bad breath" ], "options": [ "peppermint" ] }, "asin": "B07F79DFCT" }, { "task_id": "ws_B00P5FGRMA_3864", "instruction": "i am looking for a long lasting matte lipstick in darling damask color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "darling damask" ] }, "asin": "B00P5FGRMA" }, { "task_id": "ws_B08238WZGG_3865", "instruction": "i am looking for a heavy duty purple case with a screen protector and kickstand for a samsung galaxy tablet.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "purple" ] }, "asin": "B08238WZGG" }, { "task_id": "ws_B08L89KVGW_3866", "instruction": "i would like a 1 fluid ounce green apple lip gloss that's cruelty free to animals.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "green apple", "1 fl oz (pack of 1)" ] }, "asin": "B08L89KVGW" }, { "task_id": "ws_B093GVC697_3867", "instruction": "i need portable speakers that are bluetooth, high powered, and have stereo sound. i'm looking for k9 2ng gen color.", "target_attributes": { "attributes": [ "high power", "stereo sound" ], "options": [ "k9 2nd gen" ] }, "asin": "B093GVC697" }, { "task_id": "ws_B0859F614M_3868", "instruction": "i am looking for a styling tool that is black that one would find in a salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "black jacquard" ] }, "asin": "B0859F614M" }, { "task_id": "ws_B0859F614M_3869", "instruction": "i want a hair treatment steamer thermal heat cap.", "target_attributes": { "attributes": [ "hair treatment" ], "options": [ "heat cap" ] }, "asin": "B0859F614M" }, { "task_id": "ws_B07WYHZ4NL_3870", "instruction": "need a hair extension that is synthetic and long lasting, and get the 8 pack of 18 inch size.", "target_attributes": { "attributes": [ "long lasting", "synthetic hair" ], "options": [ "18 inch (pack of 8)" ] }, "asin": "B07WYHZ4NL" }, { "task_id": "ws_B09FS7Y48C_3871", "instruction": "i\u2019m looking for a nice outdoor loveseat sofa that is easy to clean in all weather; please choose the navy blue one.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "navy blue" ] }, "asin": "B09FS7Y48C" }, { "task_id": "ws_B09JKSZM5C_3872", "instruction": "i am looking for stylish, comfortable women's mid calf boots in leather shoes, knee-height boots in gt51-brown color. 6.5 size preferable..", "target_attributes": { "attributes": [ "knee high", "leather sole", "memory foam" ], "options": [ "gde51-brown", "6.5" ] }, "asin": "B09JKSZM5C" }, { "task_id": "ws_B075F5TYW8_3873", "instruction": "i need 3 packs tempered glass that is lcd compatible for canon eos 1500d 1300d 1200d models", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B075F5TYW8" }, { "task_id": "ws_B099NQX48P_3874", "instruction": "i am looking for a gourmet buffalo chicken snack with simple ingredients.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "buffalo chicken" ] }, "asin": "B099NQX48P" }, { "task_id": "ws_B092MP7JL1_3875", "instruction": "i am looking for high quality clear bass computer speakers of vaensong jt009 wooden multimedia. compatible with pc,tv,laptop,mac,smartphones,mp3 player, perfect for home,party etc.easy to set up,usb port in green color.", "target_attributes": { "attributes": [ "plug play", "usb port" ], "options": [ "green" ] }, "asin": "B092MP7JL1" }, { "task_id": "ws_B08R5PXSJM_3876", "instruction": "find me a lead free, eco friendly, long lasting candle. i want the fragrance to be cinnamon delight", "target_attributes": { "attributes": [ "lead free", "eco friendly", "long lasting" ], "options": [ "cinnamon delight" ] }, "asin": "B08R5PXSJM" }, { "task_id": "ws_B09P1NHM7S_3877", "instruction": "i'm searching for womens leather angle strap platform slip on of size 6.5 and c brown color", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "c brown", "6.5" ] }, "asin": "B09P1NHM7S" }, { "task_id": "ws_B09QC4NG39_3878", "instruction": "i need 2 panels easy clean window curtains of size 39.5\"w x 63\"l x2 for living room", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "39.5\"w x 63\"l x2" ] }, "asin": "B09QC4NG39" }, { "task_id": "ws_B08YDPQ7G3_3879", "instruction": "i'm looking for some nail polish. i really need something that is burgundy, please.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "burgundy collection" ] }, "asin": "B08YDPQ7G3" }, { "task_id": "ws_B075WNW39J_3880", "instruction": "i want light weight polyster back", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B075WNW39J" }, { "task_id": "ws_B08XM348SC_3881", "instruction": "i would like a basic phone case that has wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B08XM348SC" }, { "task_id": "ws_B01N1V7ER0_3882", "instruction": "i need a 15 ft 1080p hd vga cable,", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "15feet" ] }, "asin": "B01N1V7ER0" }, { "task_id": "ws_B073L11212_3883", "instruction": "i am looking for a high speed coaxial cable that is 3 feet in size.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "3ft" ] }, "asin": "B073L11212" }, { "task_id": "ws_B073L11212_3884", "instruction": "i am looking for a high speed coaxial cable that is 5 feet long and is solid copper.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "5ft", "solid copper w | weather boot - black" ] }, "asin": "B073L11212" }, { "task_id": "ws_B073L11212_3885", "instruction": "i am looking for a 200 ft size high-speed coaxial cable and the cable material is aluminum alloy.", "target_attributes": { "attributes": [ "high speed", "coaxial cable", "aluminum alloy" ], "options": [ "200ft" ] }, "asin": "B073L11212" }, { "task_id": "ws_B073L11212_3886", "instruction": "i am looking for a high speed 250 foot long 75 ohm coaxial cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "250ft" ] }, "asin": "B073L11212" }, { "task_id": "ws_B073L11212_3887", "instruction": "i would like a black 90 foot coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "90ft", "w | ground - black" ] }, "asin": "B073L11212" }, { "task_id": "ws_B07P9TTWPD_3888", "instruction": "i would like a 3xl grey scrub bottoms that are easily machine washable.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "grey", "3x-large" ] }, "asin": "B07P9TTWPD" }, { "task_id": "ws_B08BTTH66J_3889", "instruction": "i am looking for slim fit men jean of black color.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "black" ] }, "asin": "B08BTTH66J" }, { "task_id": "ws_B09NVDJXCT_3890", "instruction": "can you find me a high quality spa linen in green?", "target_attributes": { "attributes": [ "high quality" ], "options": [ "green" ] }, "asin": "B09NVDJXCT" }, { "task_id": "ws_B08GK773VS_3891", "instruction": "can you find me a high definition hdmi cable that is gold plated?", "target_attributes": { "attributes": [ "high definition", "gold plated" ], "options": [] }, "asin": "B08GK773VS" }, { "task_id": "ws_B0989NQ7RD_3892", "instruction": "i am looking for human hair toppers for hair loss. i would like something in a medium brown.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "dark brown ombre light brown-e" ] }, "asin": "B0989NQ7RD" }, { "task_id": "ws_B01M35RC7N_3893", "instruction": "get me a face moisturizer that is for dry skin and fine lines.", "target_attributes": { "attributes": [ "dry skin", "fine lines" ], "options": [] }, "asin": "B01M35RC7N" }, { "task_id": "ws_B09LQQXGK1_3894", "instruction": "i would like a lip balm that has natural ingredients and is the color a.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "a" ] }, "asin": "B09LQQXGK1" }, { "task_id": "ws_B0791RWM8M_3895", "instruction": "i need a 3.4 fl oz glass bottle of toothgel that is plant based and made of fennel & baking soda.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "fennel & baking soda", "3.4 fl oz glass bottle" ] }, "asin": "B0791RWM8M" }, { "task_id": "ws_B08SMNM3QY_3896", "instruction": "i am looking for the perfect gift, with quality ingredients like jack daniel's pecan.", "target_attributes": { "attributes": [ "quality ingredients", "perfect gift" ], "options": [ "jack daniels pecan" ] }, "asin": "B08SMNM3QY" }, { "task_id": "ws_B0861QDWT8_3897", "instruction": "i am looking for active shorts with an elastic waistband that are red and 3x large.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "red", "3x-large" ] }, "asin": "B0861QDWT8" }, { "task_id": "ws_B000Z61MSS_3898", "instruction": "i'm looking for some long lasting deodorant.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B000Z61MSS" }, { "task_id": "ws_B003SD83GE_3899", "instruction": "i am looking for a pound of instant coffee that is gluten free and english toffee.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "english toffee", "1 pound (pack of 1)" ] }, "asin": "B003SD83GE" }, { "task_id": "ws_B003SD83GE_3900", "instruction": "i am looking for a rich creamy instant coffee of hazelnut flavor", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "hazelnut" ] }, "asin": "B003SD83GE" }, { "task_id": "ws_B092DYRWV3_3901", "instruction": "i am looking for a stainless steel foot scraper.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B092DYRWV3" }, { "task_id": "ws_B08HCDGN25_3902", "instruction": "i am looking for square shaped swival bar stools with adjustable heights. a set of 2 in gray is preferred.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "fabric gray" ] }, "asin": "B08HCDGN25" }, { "task_id": "ws_B074FDCNDK_3903", "instruction": "i want to buy a special himalayan salt diet seasoning pack, around 3 ounces and it has to be gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "special diet seasonings", "3 ounce (pack of 1)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3904", "instruction": "i want to buy some gluten free gourmet seasonings.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "everyday seasonings" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3905", "instruction": "looking for organic paleo food seasoning which is gluten free of 1 pound pack", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3906", "instruction": "i would like a 1.5 pound box of 3 oz bottles of organic seasonings that are low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "organic seasonings", "3 ounce (pack of 1)", "1.5 pound (pack of 1)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3907", "instruction": "i need everyday seasoning which should be gluten free and have low sodium. i will prefer a pack of 1 with 20 ounce or a pack of 3 with 3 ounce each.", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "everyday seasonings", "20 ounce (pack of 1)", "3 ounce (pack of 3)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3908", "instruction": "i need some special diet seasonings that are low sodium and 4 ounces.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "special diet seasonings", "4 ounce (pack of 1)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B074FDCNDK_3909", "instruction": "i want to find some all-purpose everyday seasoning that is low sodium. i want both a 1.5 pound package and a 2 ounce package.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "everyday seasonings", "1.5 pound (pack of 1)", "2 ounce (pack of 1)" ] }, "asin": "B074FDCNDK" }, { "task_id": "ws_B09KH4N2BG_3910", "instruction": "i'm looking for some slim fit gym workout clothing. i wear a size small.", "target_attributes": { "attributes": [ "slim fit", "gym workout" ], "options": [ "small" ] }, "asin": "B09KH4N2BG" }, { "task_id": "ws_B075FGWGB8_3911", "instruction": "do you think you can find me an ac adapter with output protection?", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B075FGWGB8" }, { "task_id": "ws_B08SQZMQJZ_3912", "instruction": "i am looking for a gray non-slip case for a moto g power 2021 that has a screen protector.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "motorola moto g power 2021 gray brushed tpu case" ] }, "asin": "B08SQZMQJZ" }, { "task_id": "ws_B08SQZMQJZ_3913", "instruction": "i'm looking for moto g phone with dual camera.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "motorola moto g power 2021 red brushed tpu case" ] }, "asin": "B08SQZMQJZ" }, { "task_id": "ws_B093QG743V_3914", "instruction": "i need cupcake picks for birthday party decoration.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [] }, "asin": "B093QG743V" }, { "task_id": "ws_B07MLVMV93_3915", "instruction": "i need a quick drying clog shoes that is light weight and pink in color.", "target_attributes": { "attributes": [ "light weight", "quick drying" ], "options": [ "pink" ] }, "asin": "B07MLVMV93" }, { "task_id": "ws_B09QFX5BG7_3916", "instruction": "i\u2019m looking for a toothbrush that is easy to use for travel and will give me fresh breath. the sky blue one would be good.", "target_attributes": { "attributes": [ "easy use", "fresh breath" ], "options": [ "sky blue" ] }, "asin": "B09QFX5BG7" }, { "task_id": "ws_B0957588XQ_3917", "instruction": "i am looking for a white bookcase that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B0957588XQ" }, { "task_id": "ws_B09927SY88_3918", "instruction": "i would like a grey 35\"x20\"x29\" home desk that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "35.4\"x19.7\"x29.1\"" ] }, "asin": "B09927SY88" }, { "task_id": "ws_B09MQRPL77_3919", "instruction": "i an looking for designed with a button-tufted back, hand-crafted upholstery details & espresso wooden legs rosevera pottery tufted upholstered fine linen accent armchair set it in living room, bedroom or sitting room in muticolor.", "target_attributes": { "attributes": [ "button tufted", "contemporary style", "solid wood", "living room" ], "options": [ "muticolor" ] }, "asin": "B09MQRPL77" }, { "task_id": "ws_B08CSLQ85D_3920", "instruction": "i would like to buy a navy star wars top in a small men's size that is also machine washable.", "target_attributes": { "attributes": [ "machine wash", "star wars" ], "options": [ "navy", "men", "small" ] }, "asin": "B08CSLQ85D" }, { "task_id": "ws_B07S8TWCYX_3921", "instruction": "i am looking for roxy vista flip flops for women, size 11 with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "11" ] }, "asin": "B07S8TWCYX" }, { "task_id": "ws_B085B3TNKT_3922", "instruction": "i\u2019m looking for a bunny rabbit cupcake topper for theme kids birthday party supplies", "target_attributes": { "attributes": [ "party supplies", "birthday party" ], "options": [] }, "asin": "B085B3TNKT" }, { "task_id": "ws_B07GQP86J5_3923", "instruction": "i need 2 pcs of non toxic 12ml atomizer perfume spray travel bottle in gold color", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "gold+gold" ] }, "asin": "B07GQP86J5" }, { "task_id": "ws_B09NDJV2R6_3924", "instruction": "find me the fomiyes 4pcs silicone travel bottles that are easy to carry.", "target_attributes": { "attributes": [ "easy carry", "travel bottles" ], "options": [] }, "asin": "B09NDJV2R6" }, { "task_id": "ws_B09LZ1LCDG_3925", "instruction": "i am looking for queen size velvet upholstered platform bed with contemporary design. also choose black one.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "black" ] }, "asin": "B09LZ1LCDG" }, { "task_id": "ws_B07CB3Y399_3926", "instruction": "i'm looking for a gluten-free thick & easy clear thickened apple juice, honey consistency, 4 ounces.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "4 fl oz (pack of 1)", "honey" ] }, "asin": "B07CB3Y399" }, { "task_id": "ws_B0842YD1CX_3927", "instruction": "i need a sulfate and paraben free bottle of shampoo.", "target_attributes": { "attributes": [ "sulfate free", "paraben free" ], "options": [ "shampoo" ] }, "asin": "B0842YD1CX" }, { "task_id": "ws_B09BXZKNDB_3928", "instruction": "i need a long lasting pearl headset.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "pearl" ] }, "asin": "B09BXZKNDB" }, { "task_id": "ws_B0058HNT4O_3929", "instruction": "i'm searching for a rubber soled men's loafer that has memory foam and is size 13 extra wide. preferred color is birch.", "target_attributes": { "attributes": [ "memory foam", "rubber sole" ], "options": [ "birch", "13 x-wide" ] }, "asin": "B0058HNT4O" }, { "task_id": "ws_B09KXLDQT4_3930", "instruction": "i want to find an orthodontic model that is portable and easy to carry so i can use it to teach oral hygiene.", "target_attributes": { "attributes": [ "easy carry", "oral hygiene" ], "options": [] }, "asin": "B09KXLDQT4" }, { "task_id": "ws_B09B27GBVM_3931", "instruction": "i want to find a 2-piece pool alarm that's remote controlled. it needs to be easy to install and ideally the batteries will be included.", "target_attributes": { "attributes": [ "easy install", "batteries included" ], "options": [ "2pcs" ] }, "asin": "B09B27GBVM" }, { "task_id": "ws_B07TFX29TQ_3932", "instruction": "i need some keto friendly, non-gmo potato chips in the sour cream & onion flavor.", "target_attributes": { "attributes": [ "keto friendly", "non gmo" ], "options": [ "sour cream & onion" ] }, "asin": "B07TFX29TQ" }, { "task_id": "ws_B09PDWKPX4_3933", "instruction": "i'm looking for a cotton long sleeve sleepwear set having elastic waist, 3x-large sized for men. also choose the color yk9672#", "target_attributes": { "attributes": [ "elastic waist", "long sleeve" ], "options": [ "3x-large" ] }, "asin": "B09PDWKPX4" }, { "task_id": "ws_B094D7SF73_3934", "instruction": "i want to buy a dual band phone signal booster and want it to be booster 2 | 5.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "booster 2 | 5 signal booster" ] }, "asin": "B094D7SF73" }, { "task_id": "ws_B01J43HCFO_3935", "instruction": "i need some black and white fashion sneakers in size 11 with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | white", "11" ] }, "asin": "B01J43HCFO" }, { "task_id": "ws_B08ZHZCS3Y_3936", "instruction": "i am looking to buy a bathroom vanity light that has three lights. brushed nickel, please.", "target_attributes": { "attributes": [ "brushed nickel", "vanity light" ], "options": [ "3 light" ] }, "asin": "B08ZHZCS3Y" }, { "task_id": "ws_B09HWS67T8_3937", "instruction": "i'm looking for hair treatments that are sulfate and paraben free and are of high quality too. i need it in bottle for with 60 capsules.", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "high quality" ], "options": [] }, "asin": "B09HWS67T8" }, { "task_id": "ws_B092PH81NS_3938", "instruction": "i'm looking for a large pink travel makeup bag that's not only high-quality but also easy to carry and clean.", "target_attributes": { "attributes": [ "easy carry", "easy clean", "high quality" ], "options": [ "pink d", "l" ] }, "asin": "B092PH81NS" }, { "task_id": "ws_B09RPYK5PL_3939", "instruction": "i'm looking for an android tv box that comes in ultra hd with dual band wi-fi.", "target_attributes": { "attributes": [ "dual band", "ultra hd" ], "options": [] }, "asin": "B09RPYK5PL" }, { "task_id": "ws_B017TI2I2S_3940", "instruction": "i want to find a usb headset that's certifiably refurbished and has a plug to play.", "target_attributes": { "attributes": [ "certified refurbished", "plug play" ], "options": [] }, "asin": "B017TI2I2S" }, { "task_id": "ws_B087ZKY4XQ_3941", "instruction": "i want to find a gift set that includes a variety of four instant coffees from nescafe to sample in it.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "nescafe instant coffee 4 mix set" ] }, "asin": "B087ZKY4XQ" }, { "task_id": "ws_B0978Q1KK9_3942", "instruction": "i would like a bundle of crackers, spicy beef and cheese which is shelf stable. it also needs to be keto and gluten free.", "target_attributes": { "attributes": [ "shelf stable", "keto friendly", "gluten free" ], "options": [ "spicy beef backpack bundle" ] }, "asin": "B0978Q1KK9" }, { "task_id": "ws_B0978Q1KK9_3943", "instruction": "im looking for keto friendly, gluten free backpacking snacks including cheese, crackers and summer sausage.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [ "original beef backpack bundle" ] }, "asin": "B0978Q1KK9" }, { "task_id": "ws_B00PGAP3DS_3944", "instruction": "i want to find fragrance-free pure moroccan argan oil for my hair and face.", "target_attributes": { "attributes": [ "fragrance free", "argan oil" ], "options": [] }, "asin": "B00PGAP3DS" }, { "task_id": "ws_B08B4ZTX93_3945", "instruction": "i'm looking for grass-fed gluten free beef jerky meat stick flavored wild ginger. i need 16 sticks (size)", "target_attributes": { "attributes": [ "grass fed", "gluten free" ], "options": [ "16" ] }, "asin": "B08B4ZTX93" }, { "task_id": "ws_B09QCSHVWZ_3946", "instruction": "i'm looking for teeth cleansing toothpaste for teeth whitening.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [ "whitening" ] }, "asin": "B09QCSHVWZ" }, { "task_id": "ws_B091XW25T7_3947", "instruction": "i am looking for a canvas for living room with size of 12x18 inch. also ready to hang", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "12x18 inch" ] }, "asin": "B091XW25T7" }, { "task_id": "ws_B07WDCXSX1_3948", "instruction": "i am looking for a six piece peppermint bark holiday cookie that is gluten, vegan and dairy free.", "target_attributes": { "attributes": [ "gluten free", "dairy free" ], "options": [] }, "asin": "B07WDCXSX1" }, { "task_id": "ws_B09D8HF94V_3949", "instruction": "i would like a casual tie dye crewneck sweatshirt. it needs to be long sleeve and have a side splits.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09D8HF94V" }, { "task_id": "ws_B01GS1Q7SS_3950", "instruction": "i want to find an ivory area rug for my dining room. it should have a square shape and be 6 feet by 7 inches.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "ivory | fuchsia", "square", "6 ft 7 in x 6 ft 7 in" ] }, "asin": "B01GS1Q7SS" }, { "task_id": "ws_B01GS1Q7SS_3951", "instruction": "i need an area rug for the living room that is navy", "target_attributes": { "attributes": [ "living room" ], "options": [ "navy | ivory" ] }, "asin": "B01GS1Q7SS" }, { "task_id": "ws_B0894X4LRQ_3952", "instruction": "i need a leak proof purple bag for travel bottles.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [ "purple" ] }, "asin": "B0894X4LRQ" }, { "task_id": "ws_B00H3T5DDA_3953", "instruction": "i want a pack of old fashioned pretzel rods, look for chocolate covered too.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "old fashion rods", "2.5 pound (pack of 1)" ] }, "asin": "B00H3T5DDA" }, { "task_id": "ws_B001FXPNY4_3954", "instruction": "i'm looking for cinnamon almond cereal that has cookie flavor and high protein serving. also, i want a pack of 12 at 1.2 ounce each.", "target_attributes": { "attributes": [ "protein serving" ], "options": [ "protein cookie bites - cinnamon almond", "1.2 ounce (pack of 12)" ] }, "asin": "B001FXPNY4" }, { "task_id": "ws_B001FXPNY4_3955", "instruction": "i'm looking for gluten free it contains many proteins.", "target_attributes": { "attributes": [ "gluten free", "high protein" ], "options": [ "french vanilla" ] }, "asin": "B001FXPNY4" }, { "task_id": "ws_B001FXPNY4_3956", "instruction": "i would like a high protein cereal that is honey almond.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "protein breakfast cereal - honey almond" ] }, "asin": "B001FXPNY4" }, { "task_id": "ws_B07RXNWD5Y_3957", "instruction": "na", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "blue" ] }, "asin": "B07RXNWD5Y" }, { "task_id": "ws_B07KQ4X112_3958", "instruction": "i'd love some help finding some organic beard growth oil that can treat hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B07KQ4X112" }, { "task_id": "ws_B098KY87FJ_3959", "instruction": "can you pick a tapered leg jean for men that is comfortable to wear? i'm looking for harbor blue color and size 32w x 29l.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "harbor blue", "32w x 29l" ] }, "asin": "B098KY87FJ" }, { "task_id": "ws_B07NGQ2TWQ_3960", "instruction": "i need some face powder in a banana color that is long lasting and free of animal cruelty.", "target_attributes": { "attributes": [ "cruelty free", "animal testing", "long lasting" ], "options": [ "banana deep" ] }, "asin": "B07NGQ2TWQ" }, { "task_id": "ws_B07NGQ2TWQ_3961", "instruction": "i'm looing for a cruelty free certified loose baking face powder that is paraben free and long lasting. also, choose a pack of 1 weights 32g and banana light colored one.", "target_attributes": { "attributes": [ "cruelty free", "paraben free", "long lasting" ], "options": [ "banana light", "32 g (pack of 1)" ] }, "asin": "B07NGQ2TWQ" }, { "task_id": "ws_B09HT124QJ_3962", "instruction": "i am looking for a white oak dining room chandelier with 4 foyer pendant light", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B09HT124QJ" }, { "task_id": "ws_B08HNXVXXL_3963", "instruction": "i want some golden brown hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "6g light golden brown" ] }, "asin": "B08HNXVXXL" }, { "task_id": "ws_B09FTF3JTN_3964", "instruction": "i am looking for a black shower cap for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "black+navy flower" ] }, "asin": "B09FTF3JTN" }, { "task_id": "ws_B08XQL4CPC_3965", "instruction": "i'm looking for a large sea team round cotton rope storage basket with lid and decorative woven storage bin, pot, caddy, organizer, container for snacks, towels and plants 10 x 7.5 inches. also, choose the white one.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "large | shallow(pack of 1)" ] }, "asin": "B08XQL4CPC" }, { "task_id": "ws_B077D7TRS3_3966", "instruction": "i want to find a set of leak-proof, bpa-free travel bottles for my toiletries. ideally the set will have four 3-ounce bottles and the color should be #02.", "target_attributes": { "attributes": [ "leak proof", "bpa free", "travel bottles" ], "options": [ "#02 color 4*3 oz" ] }, "asin": "B077D7TRS3" }, { "task_id": "ws_B088871Y22_3967", "instruction": "i need a 8.5 fl oz cool girl aromatherapy candle for my living room. i want the nectarine + coral scent.", "target_attributes": { "attributes": [ "living room" ], "options": [ "nectarine + coral" ] }, "asin": "B088871Y22" }, { "task_id": "ws_B0859P9F6C_3968", "instruction": "i want blue chamomile scented deep hair conditioner that has tea tree oil, is sulfate free and weighs six ounces.", "target_attributes": { "attributes": [ "sulfate free", "tea tree" ], "options": [ "blue chamomile" ] }, "asin": "B0859P9F6C" }, { "task_id": "ws_B000SX4HGM_3969", "instruction": "i want to find a 7.6 ounce package of hair removal wax that's easy to use. the color should be \"all purpose honey.\"", "target_attributes": { "attributes": [ "easy use", "hair removal" ], "options": [ "all purpose honee", "7.6 ounce (pack of 1)" ] }, "asin": "B000SX4HGM" }, { "task_id": "ws_B000SX4HGM_3970", "instruction": "i want to find a 7.6 ounce package of hair removal wax that's easy to use. the wax should be brazilian style and the primary ingredients should be beeswax and soybean oil.", "target_attributes": { "attributes": [ "easy use", "hair removal" ], "options": [ "brazilian w | beeswax and soybean oil", "7.6 ounce (pack of 1)" ] }, "asin": "B000SX4HGM" }, { "task_id": "ws_B0042R7WXK_3971", "instruction": "i want to buy a 32-count pack of hand-crafted, chocolate dessert cups. they need to be gluten free!", "target_attributes": { "attributes": [ "hand crafted", "gluten free" ], "options": [ "chocolate", "32 count (pack of 1)" ] }, "asin": "B0042R7WXK" }, { "task_id": "ws_B0784JSQ6G_3972", "instruction": "i need a gold colored birthday cake ornament.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "40-gold" ] }, "asin": "B0784JSQ6G" }, { "task_id": "ws_B0784JSQ6G_3973", "instruction": "get me a gold birthday cake topper.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "60-gold2" ] }, "asin": "B0784JSQ6G" }, { "task_id": "ws_B0784JSQ6G_3974", "instruction": "i need a birthday cake topper that is gold", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "25-gold" ] }, "asin": "B0784JSQ6G" }, { "task_id": "ws_B08ZJQFYZ7_3975", "instruction": "i'm looking for fully cooked dry rubbed st. louis style ribs.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "dry rubbed (seasoned) st louis style" ] }, "asin": "B08ZJQFYZ7" }, { "task_id": "ws_B083ZG2RZL_3976", "instruction": "i need a vanity light with a classic bronze finish.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "classic bronze" ] }, "asin": "B083ZG2RZL" }, { "task_id": "ws_B09391JQ43_3977", "instruction": "i want to find a small pair of men's pajama pants that's officially licensed with the joker.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "small" ] }, "asin": "B09391JQ43" }, { "task_id": "ws_B09N9JKMLW_3978", "instruction": "i wanna find a wireless soundbar with stereo sound for my tv, color black and with support for u disk tf and sd card.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black2" ] }, "asin": "B09N9JKMLW" }, { "task_id": "ws_B00U9WP17Q_3979", "instruction": "i need some non-gmo chocolate pretzels.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B00U9WP17Q" }, { "task_id": "ws_B096YD2L7Q_3980", "instruction": "i would like a large, low carb drink alternative that is a red flavor such as cherry or strawberry.", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B096YD2L7Q" }, { "task_id": "ws_B000ER1RCY_3981", "instruction": "i want a keds champion women's for day comfort, choose a white with a especial size 9", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "white", "9 med" ] }, "asin": "B000ER1RCY" }, { "task_id": "ws_B07V1Y5MRL_3982", "instruction": "i want to find a 15.99 fluid ounce can of an energy drink without any sugar, artificial colors or flavors. my flavor of preference is called shoc wave.", "target_attributes": { "attributes": [ "zero sugar", "artificial colors", "artificial flavors" ], "options": [ "shoc wave", "15.99 fl oz (pack of 1)" ] }, "asin": "B07V1Y5MRL" }, { "task_id": "ws_B081S81FT6_3983", "instruction": "i want to find a 2-ounce bottle of sulfate-free conditioner that's compatible with damaged hair.", "target_attributes": { "attributes": [ "sulfate free", "damaged hair" ], "options": [ "2 ounce" ] }, "asin": "B081S81FT6" }, { "task_id": "ws_B09P1NSXN4_3984", "instruction": "i need a manual toothbrush which has teeth whitening strips and is good for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [] }, "asin": "B09P1NSXN4" }, { "task_id": "ws_B09P1NSXN4_3985", "instruction": "i want to find an f-colored toothbrush that can help whiten my teeth.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "f" ] }, "asin": "B09P1NSXN4" }, { "task_id": "ws_B09JJS8F4B_3986", "instruction": "i need cupcake picks for my son's birthday party.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [] }, "asin": "B09JJS8F4B" }, { "task_id": "ws_B00F4YS85G_3987", "instruction": "i'm looking for l'oreal paris true match super-blendable liquid foundation, oil free in c2 natural ivory. i want a 1 fl oz pack of 1.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "c2 natural ivory", "1 fl oz (pack of 1)" ] }, "asin": "B00F4YS85G" }, { "task_id": "ws_B00F4YS85G_3988", "instruction": "i'm looking for a single bottle of bone colored foundation that's oil free and covers fine lines.", "target_attributes": { "attributes": [ "oil free", "fine lines" ], "options": [ "c1.5 bone", "1 count" ] }, "asin": "B00F4YS85G" }, { "task_id": "ws_B00PUEV4CE_3989", "instruction": "i want to find wheat crackers that have no gmos and no high-fructose corn syrup.", "target_attributes": { "attributes": [ "non gmo", "high fructose" ], "options": [ "wheat crackers" ] }, "asin": "B00PUEV4CE" }, { "task_id": "ws_B0995NN39Z_3990", "instruction": "i'm looking for easy to apply, high quality hair extensions in medium light brown.", "target_attributes": { "attributes": [ "easy apply", "high quality" ], "options": [ "#560 medium light brown+60%gray" ] }, "asin": "B0995NN39Z" }, { "task_id": "ws_B00T7JEX44_3991", "instruction": "i like traditional , old and individually wrapped albert's chocolate ice cubes 60 count tray chocolate", "target_attributes": { "attributes": [ "old fashioned", "individually wrapped" ], "options": [] }, "asin": "B00T7JEX44" }, { "task_id": "ws_B073C1K3GZ_3992", "instruction": "i need women's loafers with arch support. find something in black.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black" ] }, "asin": "B073C1K3GZ" }, { "task_id": "ws_B08M4YVD3S_3993", "instruction": "i'm looking for some usda organic chocolate bars.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "chocolate" ] }, "asin": "B08M4YVD3S" }, { "task_id": "ws_B06XHDT44G_3994", "instruction": "i want to get a blue 100-foot-long high-speed ethernet cable that's easy to install.", "target_attributes": { "attributes": [ "high speed", "easy install" ], "options": [ "blue", "100ft" ] }, "asin": "B06XHDT44G" }, { "task_id": "ws_B07KWW4QKD_3995", "instruction": "i need burgundy colored high heels in size us5.5.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "burgundy", "us5.5" ] }, "asin": "B07KWW4QKD" }, { "task_id": "ws_B00FAQKILA_3996", "instruction": "i'm looking for chairs for the dining room that are button-tufted and easy-to-assemble.", "target_attributes": { "attributes": [ "button tufted", "easy assemble", "dining room" ], "options": [] }, "asin": "B00FAQKILA" }, { "task_id": "ws_B08ZHT9CRK_3997", "instruction": "find me a fragrance free mineral powder foundation set in a medium color and with mascara.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "medium" ] }, "asin": "B08ZHT9CRK" }, { "task_id": "ws_B09KV7GX8S_3998", "instruction": "i'm looking for an easy to clean halloween set for the dining room.", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "cartoon halloween scenelop1361" ] }, "asin": "B09KV7GX8S" }, { "task_id": "ws_B0865TZ3B4_3999", "instruction": "i am looking for a pair of grey running shorts that are light weight with an elastic waistband and have moisture wicking technology in a size small", "target_attributes": { "attributes": [ "light weight", "moisture wicking", "elastic waistband" ], "options": [ "grey", "small" ] }, "asin": "B0865TZ3B4" }, { "task_id": "ws_B097BVKF24_4000", "instruction": "i want to purchase a manual toothbrush that whitens teeth and prefer ones with stars and either pink, blue, purple or yellow.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "pink, blue, purple, yellow,", "star shape style" ] }, "asin": "B097BVKF24" }, { "task_id": "ws_B00GY0CK26_4001", "instruction": "i need an antique walnut bed frame in a walnut color", "target_attributes": { "attributes": [ "lead free" ], "options": [ "antique walnut" ] }, "asin": "B00GY0CK26" }, { "task_id": "ws_B075K15ZKB_4002", "instruction": "i want to buy some ash blonde hair color with argan oil in it.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "high lift ash blonde 100.10" ] }, "asin": "B075K15ZKB" }, { "task_id": "ws_B075K15ZKB_4003", "instruction": "i need to buy some permanent hair dye. it should be deep ash brown and contain argan oil.", "target_attributes": { "attributes": [ "argan oil", "permanent hair" ], "options": [ "deep ash brown 4aa | 4.11" ] }, "asin": "B075K15ZKB" }, { "task_id": "ws_B09PY89B1S_4004", "instruction": "show me an one organic hair growth serum roller set for all hair types.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "1pcs" ] }, "asin": "B09PY89B1S" }, { "task_id": "ws_B08JV996XH_4005", "instruction": "i want the men's mesh sissy pouch lace see through pajama pants that are low rise and slim fit in x-large. i want the black ones.", "target_attributes": { "attributes": [ "low rise", "slim fit" ], "options": [ "black", "x-large" ] }, "asin": "B08JV996XH" }, { "task_id": "ws_B00QWT4S56_4006", "instruction": "i need a bpa and gmo free pack of moringia leaf ground.", "target_attributes": { "attributes": [ "bpa free", "gmo free" ], "options": [ "moringa leaf ground", "1 count (pack of 1)" ] }, "asin": "B00QWT4S56" }, { "task_id": "ws_B00QWT4S56_4007", "instruction": "i'm looking for a natural whole bay leaf which should be free from bpa, gmo, fat and gluten. also choose a pack of 1 weighing 3.53 ounce with organic senna flavored one.", "target_attributes": { "attributes": [ "bpa free", "gmo free", "fat free", "gluten free" ], "options": [ "organic senna", "3.53 ounce (pack of 1)" ] }, "asin": "B00QWT4S56" }, { "task_id": "ws_B095X62PKW_4008", "instruction": "i'm looking for some cupcake picks that are suitable for a baby shower.", "target_attributes": { "attributes": [ "baby shower", "cupcake picks" ], "options": [] }, "asin": "B095X62PKW" }, { "task_id": "ws_B08155MLPZ_4009", "instruction": "i want to find an adult tank top that's machine washable and features the italian stallion from rocky.", "target_attributes": { "attributes": [ "machine wash" ], "options": [] }, "asin": "B08155MLPZ" }, { "task_id": "ws_B07X8NMX57_4010", "instruction": "i am interested in buying a x-small size purple colored classic fit birthday t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "purple", "x-small" ] }, "asin": "B07X8NMX57" }, { "task_id": "ws_B07VP4KL4S_4011", "instruction": "locate a emme 3-piece king bed in a bag comforter set that is machine washable. i also need the color to be blue stripe.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue stripe", "3-piece king" ] }, "asin": "B07VP4KL4S" }, { "task_id": "ws_B07KSMB6FT_4012", "instruction": "i want to buy some plant-based tuna.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B07KSMB6FT" }, { "task_id": "ws_B09743DFJC_4013", "instruction": "im looking for a earbud headphones for stereo sound quality of style je-04b which will be more comfortable for me to use without disturbing others .", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "je-04b" ] }, "asin": "B09743DFJC" }, { "task_id": "ws_B07CZSWR7P_4014", "instruction": "3 sugar free fruit syrup packs of different flavors ie cherry, raspberry, watermelon flavors", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B07CZSWR7P" }, { "task_id": "ws_B07S1RSYMC_4015", "instruction": "hello, i am looking for some cupcake picks, i want to use them on my mom's birthday party.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [] }, "asin": "B07S1RSYMC" }, { "task_id": "ws_B098DNCN3D_4016", "instruction": "i need some white inline skates in size 40.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "f-new white", "40" ] }, "asin": "B098DNCN3D" }, { "task_id": "ws_B09FLCK3PT_4017", "instruction": "#4 medium brown color hair pieces of 8 inch length as hair extension.", "target_attributes": { "attributes": [ "hair loss", "natural hair" ], "options": [] }, "asin": "B09FLCK3PT" }, { "task_id": "ws_B09RH1525C_4018", "instruction": "i need a large, gray long sleeve hoodie.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "51#gray", "3x-large" ] }, "asin": "B09RH1525C" }, { "task_id": "ws_B08L1MT2DH_4019", "instruction": "i need a 1080p hd hidden camera which is motion activated.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B08L1MT2DH" }, { "task_id": "ws_B016WDNAJ6_4020", "instruction": "i need a white mirror with a with a brushed nickel finish in window style.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish" ], "options": [ "white", "window" ] }, "asin": "B016WDNAJ6" }, { "task_id": "ws_B016WDNAJ6_4021", "instruction": "i am looking for a white brushed nickel for wall-mounted mirrors", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "white" ] }, "asin": "B016WDNAJ6" }, { "task_id": "ws_B016WDNAJ6_4022", "instruction": "i'm looking for brushed nickel decorative ship porthole nautical mirror.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "mirror" ] }, "asin": "B016WDNAJ6" }, { "task_id": "ws_B09K3SXTJ1_4023", "instruction": "i'm trying to find a six-pack of kids' toothbrushes for sensitive teeth. i need the toothbrushes to have long handles and they should come in assorted colors, like blue, pink and yellow.", "target_attributes": { "attributes": [ "long handle", "sensitive teeth" ], "options": [ "blue pink yellow", "long handle" ] }, "asin": "B09K3SXTJ1" }, { "task_id": "ws_B01CX3Y3EA_4024", "instruction": "i'm looking for a 50 piece candy gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "50 piece set" ] }, "asin": "B01CX3Y3EA" }, { "task_id": "ws_B01D0DY4B4_4025", "instruction": "i'm looking for low-fat, hot and spicy beef jerky that's also high in protein.", "target_attributes": { "attributes": [ "low fat", "high protein" ], "options": [ "hot" ] }, "asin": "B01D0DY4B4" }, { "task_id": "ws_B01D0DY4B4_4026", "instruction": "i'd like to find a 3-ounce pack of whiskey barbeque flavored beef jerky. i'm on a diet, so the jerky needs to be low fat.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "whiskey barbecue", "3 ounce (pack of 1)" ] }, "asin": "B01D0DY4B4" }, { "task_id": "ws_B01D0DY4B4_4027", "instruction": "i would like a black pepper 3 ounce bag of jerky that's high protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "black pepper", "3 ounce (pack of 1)" ] }, "asin": "B01D0DY4B4" }, { "task_id": "ws_B01D0DY4B4_4028", "instruction": "i want to order some low fat whiskey barbecue jerky. look for the three pack.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "whiskey barbecue", "3 ounce (pack of 3)" ] }, "asin": "B01D0DY4B4" }, { "task_id": "ws_B09SFYKXD4_4029", "instruction": "i'm looking for a gray faux fur height adjustable vanity chair with gold round base for a study room dorm.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "grey" ] }, "asin": "B09SFYKXD4" }, { "task_id": "ws_B08GFKXBF9_4030", "instruction": "i am looking for a mist water bottle in white color with leak proof. also delivery fine mist", "target_attributes": { "attributes": [ "leak proof", "fine mist" ], "options": [ "white" ] }, "asin": "B08GFKXBF9" }, { "task_id": "ws_B09DCNHNFH_4031", "instruction": "looking for a soft fleece blanket 50\"x60\" that is super soft and machine washable. color 8.", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "color8" ] }, "asin": "B09DCNHNFH" }, { "task_id": "ws_B07P5G65HR_4032", "instruction": "i want to find a 3 foot by 3 foot wine rack that i can mount on my wall. it must be easy to install as well.", "target_attributes": { "attributes": [ "wall mounted", "easy install" ], "options": [ "3 foot 3 deep" ] }, "asin": "B07P5G65HR" }, { "task_id": "ws_B06XRXLN77_4033", "instruction": "i'm looking for pale blush living room window drapes, 2 panel set measuring 108\" x 84\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "pale blush" ] }, "asin": "B06XRXLN77" }, { "task_id": "ws_B0794VBL18_4034", "instruction": "i need a purple body brush for sensitive, dry skin.", "target_attributes": { "attributes": [ "dry skin", "sensitive skin" ], "options": [ "purple" ] }, "asin": "B0794VBL18" }, { "task_id": "ws_B09R9ZC859_4035", "instruction": "i need a manual toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09R9ZC859" }, { "task_id": "ws_B09BQL3828_4036", "instruction": "i ned some hands free white earbuds.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "white" ] }, "asin": "B09BQL3828" }, { "task_id": "ws_B07FYL95K5_4037", "instruction": "i need an alcohol free face mist in peppermint scent.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "peppermint" ] }, "asin": "B07FYL95K5" }, { "task_id": "ws_B07FYL95K5_4038", "instruction": "i want a fragrance and alcohol free tropical waters rose water face mist make up setting spray.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "fragrance-free" ] }, "asin": "B07FYL95K5" }, { "task_id": "ws_B09QG85ZGK_4039", "instruction": "i need a metal framed dining room stool with a pink center.", "target_attributes": { "attributes": [ "metal legs", "dining room" ], "options": [ "pink" ] }, "asin": "B09QG85ZGK" }, { "task_id": "ws_B00CD24MXO_4040", "instruction": "i'm looking for dental picks with no break & no shred floss, count should be 150 & with pack of 6", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "pack of 6" ] }, "asin": "B00CD24MXO" }, { "task_id": "ws_B00CD24MXO_4041", "instruction": "i'm looking for oral hygiene because the bad breath affect our whole body.", "target_attributes": { "attributes": [ "oral hygiene", "bad breath" ], "options": [ "75 count (pack of 3)" ] }, "asin": "B00CD24MXO" }, { "task_id": "ws_B00CD24MXO_4042", "instruction": "i want a 6 pack of dentek triple clean floss picks for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "pack of 6" ] }, "asin": "B00CD24MXO" }, { "task_id": "ws_B07FTC477C_4043", "instruction": "i need the yongquiang 26\" set of 4 metal bar height stools in black. i want the ones for a dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "black", "26 inch" ] }, "asin": "B07FTC477C" }, { "task_id": "ws_B09RGT38YF_4044", "instruction": "na", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "medium" ] }, "asin": "B09RGT38YF" }, { "task_id": "ws_B09Q8LKKKY_4045", "instruction": "find me a gray men's button down work shirt that is machine washable but also gives me some tummy control. size x-large.", "target_attributes": { "attributes": [ "machine wash", "tummy control" ], "options": [ "gray", "x-large" ] }, "asin": "B09Q8LKKKY" }, { "task_id": "ws_B08NF5JL3F_4046", "instruction": "find me 150 ml wella professional oil free hair color with the pink style.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "pink" ] }, "asin": "B08NF5JL3F" }, { "task_id": "ws_B09Q6B2LPG_4047", "instruction": "i'd like to find a large pink tankini swimsuit that's loose-fitting.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "pink-5", "large" ] }, "asin": "B09Q6B2LPG" }, { "task_id": "ws_B08D6RRSB4_4048", "instruction": "i'd like help finding a pack of 500 wooden wax sticks that i can use for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "pack of 500" ] }, "asin": "B08D6RRSB4" }, { "task_id": "ws_B07KYZ93SL_4049", "instruction": "show me a 3x large sized machine washable boxer brief made with polyester spandex in black color.", "target_attributes": { "attributes": [ "machine wash", "polyester spandex" ], "options": [ "black | team red | team blue", "3x-large" ] }, "asin": "B07KYZ93SL" }, { "task_id": "ws_B0933C4F8L_4050", "instruction": "i need some baked breadcrumbs in a classic french flavor.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "classic french" ] }, "asin": "B0933C4F8L" }, { "task_id": "ws_B001KYRLIO_4051", "instruction": "i would like to have a n6 honey beige and oil free liquid foundation suitable for fine lines and sold on pack of 2 with 1fl oz each.", "target_attributes": { "attributes": [ "oil free", "fine lines" ], "options": [ "n6 honey beige", "1 fl oz (pack of 2)" ] }, "asin": "B001KYRLIO" }, { "task_id": "ws_B001KYRLIO_4052", "instruction": "i am looking for a oil free c3 creamy natural color face foundation.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "c3 creamy natural" ] }, "asin": "B001KYRLIO" }, { "task_id": "ws_B001KYRLIO_4053", "instruction": "i'm looking for foundation make up by l\u00f3real. i want oil free liquid foundation. my color is w1 porcelain. check for pack of 1 in stock.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "w1 porcelain" ] }, "asin": "B001KYRLIO" }, { "task_id": "ws_B07HJG6NMR_4054", "instruction": "i'd like to find a digital camera that's water resistant. the color needs to be graphite silver and i want the configuration to be the international version.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "graphite silver", "international version" ] }, "asin": "B07HJG6NMR" }, { "task_id": "ws_B09R6KC45H_4055", "instruction": "i am looking for hair dry shampoo ammonia free ,chestnut brown", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "chestnut brown" ] }, "asin": "B09R6KC45H" }, { "task_id": "ws_B09L41ZP46_4056", "instruction": "i'm looking for a mid century home office desk chair that is easy to assemble. please choose the grey velvet one.", "target_attributes": { "attributes": [ "mid century", "easy assemble" ], "options": [ "grey" ] }, "asin": "B09L41ZP46" }, { "task_id": "ws_B09FHNYL3T_4057", "instruction": "i want to find white scented candles that are eco-friendly and made of soy wax.", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [ "white" ] }, "asin": "B09FHNYL3T" }, { "task_id": "ws_B08J4GBZB3_4058", "instruction": "i want to get a 9-pack of veggie lasagna entrees that are easy to prepare and high in protein.", "target_attributes": { "attributes": [ "easy prepare", "high protein" ], "options": [ "vegetable lasagna", "9 pack" ] }, "asin": "B08J4GBZB3" }, { "task_id": "ws_B083X5CPXN_4059", "instruction": "i need a spread dress shirt with a slim fit in the color blue, and it needs to be available for machine wash.", "target_attributes": { "attributes": [ "slim fit", "machine wash" ], "options": [ "spread", "petrol blue" ] }, "asin": "B083X5CPXN" }, { "task_id": "ws_B09PD2MFGN_4060", "instruction": "i'm looking for a long handle stainless steel nail clipper set with color 8592 black", "target_attributes": { "attributes": [ "long handle", "stainless steel" ], "options": [] }, "asin": "B09PD2MFGN" }, { "task_id": "ws_B083M11BV8_4061", "instruction": "i need some easy to apply body glitter for halloween.", "target_attributes": { "attributes": [ "easy apply" ], "options": [] }, "asin": "B083M11BV8" }, { "task_id": "ws_B08BV21ZG2_4062", "instruction": "can you help me find organic chicken broth that is gluten free and contains high protein? i'm looking for a pack of 2 pound.", "target_attributes": { "attributes": [ "gluten free", "certified organic", "high protein" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B08BV21ZG2" }, { "task_id": "ws_B09P58FMJY_4063", "instruction": "i need a heavy duty dust proof tempered glass for iphone 13 pro max 6.7 inch and its size is case+4 protectors with redblack color", "target_attributes": { "attributes": [ "heavy duty", "dust proof" ], "options": [ "redblack" ] }, "asin": "B09P58FMJY" }, { "task_id": "ws_B07K8728Y5_4064", "instruction": "i'd like to find dark black faux dreadlock extenders. ideally they'll come 10 to a pack and i want two packs.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "faux locs-dark black", "10 count (pack of 2)" ] }, "asin": "B07K8728Y5" }, { "task_id": "ws_B09776JNLW_4065", "instruction": "i'm looking for blue slip-on women's fashion sneakers in a size 7, and they must feature good arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "d-blue", "7" ] }, "asin": "B09776JNLW" }, { "task_id": "ws_B07X8RMCVW_4066", "instruction": "i need a bag of valentine day candies full of 25 units.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "25" ] }, "asin": "B07X8RMCVW" }, { "task_id": "ws_B084FWQF1F_4067", "instruction": "i want to find a pair of white and thyme men's blaster pants with an elastic waistband. the size needs to be 5x-large.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "thyme | white", "5x-large" ] }, "asin": "B084FWQF1F" }, { "task_id": "ws_B07ZCKGHHY_4068", "instruction": "i want to buy a photography background that is lightweight and 9x6 ft..", "target_attributes": { "attributes": [ "light weight" ], "options": [ "9x6ft" ] }, "asin": "B07ZCKGHHY" }, { "task_id": "ws_B09NBSNLFH_4069", "instruction": "i need a pair of high quality black hair clippers.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "black" ] }, "asin": "B09NBSNLFH" }, { "task_id": "ws_B07CHWMXJS_4070", "instruction": "i am looking for a red area rug, 9 by 12 feet, that i can put in the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "red | multi", "9 ft x 12 ft" ] }, "asin": "B07CHWMXJS" }, { "task_id": "ws_B09D9JJ5FX_4071", "instruction": "i want to find a natural-colored twin-sized kids' bed that's easy to assemble.", "target_attributes": { "attributes": [ "twin size", "easy assemble" ], "options": [ "natural" ] }, "asin": "B09D9JJ5FX" }, { "task_id": "ws_B093D27QC3_4072", "instruction": "i'm looking for a birthday cake topper that i can use for a party.", "target_attributes": { "attributes": [ "birthday party", "birthday cake" ], "options": [] }, "asin": "B093D27QC3" }, { "task_id": "ws_B09SLD687X_4073", "instruction": "i want to find a pair of yellow high heeled stilettos with ankle straps, in a size 8.5.", "target_attributes": { "attributes": [ "arch support" ], "options": [] }, "asin": "B09SLD687X" }, { "task_id": "ws_B08QHVV16X_4074", "instruction": "i need a black colored birthday party cupcake topper.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [ "black" ] }, "asin": "B08QHVV16X" }, { "task_id": "ws_B09Q8WKXVC_4075", "instruction": "i am looking for a full wood, white king size bed frame with headboard.", "target_attributes": { "attributes": [ "king size" ], "options": [ "wthite", "full wood" ] }, "asin": "B09Q8WKXVC" }, { "task_id": "ws_B08SMGVNJP_4076", "instruction": "i'm looking for a tongue scraper for adult and children for a oral hygiene and a fresh breath with 4pcs", "target_attributes": { "attributes": [ "oral hygiene", "fresh breath" ], "options": [ "\uff084pcs\uff09" ] }, "asin": "B08SMGVNJP" }, { "task_id": "ws_B07ZJNB6T7_4077", "instruction": "i would like to get some high protein beef jerky in the resealable bag in original flavoring.", "target_attributes": { "attributes": [ "high protein", "resealable bag" ], "options": [ "original" ] }, "asin": "B07ZJNB6T7" }, { "task_id": "ws_B09R7Z4B3N_4078", "instruction": "i'm looking for the block striped t shirts for women in loose fit and long sleeve. i need the 1/4 zipper collared in 3x-large in the gxfc-s330-white color.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "gxfc-s330-white", "3x-large" ] }, "asin": "B09R7Z4B3N" }, { "task_id": "ws_B09KC85389_4079", "instruction": "i need a height adjustable swivel chair with lumbar support for gaming. i would like it in grey.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "grey" ] }, "asin": "B09KC85389" }, { "task_id": "ws_B09NF1722F_4080", "instruction": "i am looking for toyota corolla android dash navigation with bt, wifi mirror link, fm , backup camera, 8 inch touch display, models can from 2006 - 2012", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B09NF1722F" }, { "task_id": "ws_B075F5CV2W_4081", "instruction": "i need a mouse colored ottoman in a contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "mouse" ] }, "asin": "B075F5CV2W" }, { "task_id": "ws_B07MCN1NGK_4082", "instruction": "i am looking for women's active pants for walking. also, choose the medium size.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "balsam", "medium" ] }, "asin": "B07MCN1NGK" }, { "task_id": "ws_B084VP13PN_4083", "instruction": "i'm looking for a high resolution wireless headphones with charging case, earphones should be in-ear, built-in mic, easy-pair, voice control sports and gaming earbuds. also choose the black one.", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B084VP13PN" }, { "task_id": "ws_B08XX18DKL_4084", "instruction": "i'm looking for a silver radio antenna that's made of carbon fiber.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "silver" ] }, "asin": "B08XX18DKL" }, { "task_id": "ws_B09HGYZD76_4085", "instruction": "i'm looking for a white, pu leather office chair that offers good lumbar support.", "target_attributes": { "attributes": [ "lumbar support", "pu leather" ], "options": [ "white" ] }, "asin": "B09HGYZD76" }, { "task_id": "ws_B09QHPGM14_4086", "instruction": "i need some purple eye shadow brushes for easy application.", "target_attributes": { "attributes": [ "easy apply", "eye shadow" ], "options": [ "purple" ] }, "asin": "B09QHPGM14" }, { "task_id": "ws_B093L4HYR1_4087", "instruction": "i am looking for a laundry bag in medium size", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093L4HYR1" }, { "task_id": "ws_B073SZHTVT_4088", "instruction": "i need an easy to use carbon fiber tripod.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "carbon fiber tripod" ] }, "asin": "B073SZHTVT" }, { "task_id": "ws_B0797MJB63_4089", "instruction": "i want to find a super soft 50x80 inch throw that i can leave in my living room.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "50x80inch" ] }, "asin": "B0797MJB63" }, { "task_id": "ws_B09KC4Q2RH_4090", "instruction": "i'm looking for a carrying case for hair cutting accessories.", "target_attributes": { "attributes": [ "easy carry", "hair cutting" ], "options": [] }, "asin": "B09KC4Q2RH" }, { "task_id": "ws_B07XC5LJV1_4091", "instruction": "i need a core i5 desktop tower.", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B07XC5LJV1" }, { "task_id": "ws_B01LN63SUI_4092", "instruction": "i'm looking to get a pack of 24 cans of the starkist white tuna that's packed in water.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "albacore in water" ] }, "asin": "B01LN63SUI" }, { "task_id": "ws_B01LN63SUI_4093", "instruction": "i am interested in acquiring tuna which is wild caught, and has low sodium, while it has a flavor of albacore in oil and it's in a pack of 8 of 5 ounces.", "target_attributes": { "attributes": [ "low sodium", "wild caught" ], "options": [ "albacore in oil", "5 ounce (pack of 8)" ] }, "asin": "B01LN63SUI" }, { "task_id": "ws_B08RHWNKCH_4094", "instruction": "i need an accessory for the ultra hd system.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B08RHWNKCH" }, { "task_id": "ws_B07FLHLBT4_4095", "instruction": "i'd like to find a 10-pack of black usb flash drives that can store 512 megabytes of data. the usbs must be easy to carry and use.", "target_attributes": { "attributes": [ "easy carry", "easy use" ], "options": [ "black", "512mb" ] }, "asin": "B07FLHLBT4" }, { "task_id": "ws_B08KGHJFXT_4096", "instruction": "i am looking for high quality and freshed baked desserts, please include the corn muffins as well.", "target_attributes": { "attributes": [ "baked fresh", "quality ingredients" ], "options": [ "corn muffins" ] }, "asin": "B08KGHJFXT" }, { "task_id": "ws_B07Y7T3WGZ_4097", "instruction": "i want to find some casual black women's penny loafers. i wear a size 9 and need good arch support!", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black", "9" ] }, "asin": "B07Y7T3WGZ" }, { "task_id": "ws_B08QJL3F1N_4098", "instruction": "i need a hand wash blue jump suit for daily wear.", "target_attributes": { "attributes": [ "hand wash", "daily wear" ], "options": [ "blue" ] }, "asin": "B08QJL3F1N" }, { "task_id": "ws_B00KKSAWG4_4099", "instruction": "i'm looking for a heavy duty barstool with a steel frame in a natural maple color.", "target_attributes": { "attributes": [ "heavy duty", "steel frame" ], "options": [ "natural maple" ] }, "asin": "B00KKSAWG4" }, { "task_id": "ws_B00KKSAWG4_4100", "instruction": "i want to find a heavy duty bar stool that is rein bay colored.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "rein bay" ] }, "asin": "B00KKSAWG4" }, { "task_id": "ws_B09KH7MCD1_4101", "instruction": "i am looking forward to buy a high speed, high definition mini pc with windows 10 pro equip with intel celeron", "target_attributes": { "attributes": [ "high speed", "high definition" ], "options": [] }, "asin": "B09KH7MCD1" }, { "task_id": "ws_B08ZCRXBP2_4102", "instruction": "i want to find a pink 10-inch android touch tablet with a quad core processor.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "pink" ] }, "asin": "B08ZCRXBP2" }, { "task_id": "ws_B009089FP4_4103", "instruction": "i want a variety pack of fat free apple mango real fruit bars. i want a 12 pack.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "variety" ] }, "asin": "B009089FP4" }, { "task_id": "ws_B009089FP4_4104", "instruction": "i would like a fig fruit bar that is gluten and soy free.", "target_attributes": { "attributes": [ "soy free", "gluten free" ], "options": [ "fig" ] }, "asin": "B009089FP4" }, { "task_id": "ws_B08L8LGMG3_4105", "instruction": "i'd like to find a medium-sized, long-sleeve women's maternity gown that's purple.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "purple", "medium" ] }, "asin": "B08L8LGMG3" }, { "task_id": "ws_B08234W29V_4106", "instruction": "i want to find usda organic tomato basil marinara sauce. ideally i want a pack of three 1.5 pound jars.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "marinara", "1.5 pound (pack of 3)" ] }, "asin": "B08234W29V" }, { "task_id": "ws_B09BBDPRC3_4107", "instruction": "i need some long-lasting snowboots with no slip soles in size 7.5 and the color black.", "target_attributes": { "attributes": [ "long lasting", "non slip" ], "options": [ "a-black", "7.5" ] }, "asin": "B09BBDPRC3" }, { "task_id": "ws_B07CQT3D7T_4108", "instruction": "i'm looking for a pair of women's casual moccasin flats with rubber soles. i wear a size 8 and prefer the color champagne.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "champagne.2", "8" ] }, "asin": "B07CQT3D7T" }, { "task_id": "ws_B09PBMC8S3_4109", "instruction": "i'm looking for a women ladies cross angle strap roman slides sandal of size 9 and black color", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "black", "9 wide" ] }, "asin": "B09PBMC8S3" }, { "task_id": "ws_B01LYL5CZL_4110", "instruction": "i need an omega-3 deluxe mix with artificial ingredients in a resealable bag.", "target_attributes": { "attributes": [ "artificial ingredients", "resealable bag" ], "options": [ "omega-3 deluxe mix" ] }, "asin": "B01LYL5CZL" }, { "task_id": "ws_B09NVD3XLF_4111", "instruction": "i'm looking for high quality and long lasting microfiber massage table sheets set with a size 60x180cm(24x71inch). also choose the large one", "target_attributes": { "attributes": [ "long lasting", "high quality" ], "options": [ "large", "60x180cm(24x71inch)" ] }, "asin": "B09NVD3XLF" }, { "task_id": "ws_B07TN3W1KX_4112", "instruction": "i need a 3 pack of ethique solid deodorant bar for men and women. i want the oil-free variety.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "3 pack" ] }, "asin": "B07TN3W1KX" }, { "task_id": "ws_B09KX8R3K1_4113", "instruction": "i want a green stool that would be suitable to use for a haircut at a beauty salon.", "target_attributes": { "attributes": [ "beauty salon", "hair cutting" ], "options": [ "green" ] }, "asin": "B09KX8R3K1" }, { "task_id": "ws_B08Z4K991J_4114", "instruction": "i need a high-performance tablet for dual-band wifi.", "target_attributes": { "attributes": [ "dual band", "high performance" ], "options": [] }, "asin": "B08Z4K991J" }, { "task_id": "ws_B09NFQBBKJ_4115", "instruction": "i want to find a pair of non-slip women's running shoes in a size 8. they need to have rubber soles and i want them in black and red.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black red b2", "8 women | 6 men" ] }, "asin": "B09NFQBBKJ" }, { "task_id": "ws_B07K1QXRM4_4116", "instruction": "i am looking for a dark spot solution serum without fragrance and paraben.", "target_attributes": { "attributes": [ "fragrance free", "paraben free" ], "options": [] }, "asin": "B07K1QXRM4" }, { "task_id": "ws_B07RXQWB3G_4117", "instruction": "i want to find a universal remote control replacement that comes with aaa batteries.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B07RXQWB3G" }, { "task_id": "ws_B01EMA3TX8_4118", "instruction": "i'm looking fo a large faux leather even path that's effective for dark circles also.choose the blue one.", "target_attributes": { "attributes": [ "faux leather", "steel frame" ], "options": [ "black" ] }, "asin": "B01EMA3TX8" }, { "task_id": "ws_B00GAQ2EG6_4119", "instruction": "i need rich, creamy coconut biscuits.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "coconut" ] }, "asin": "B00GAQ2EG6" }, { "task_id": "ws_B09N1BWH8F_4120", "instruction": "i'm trying to find a tempered glass screen protector that i can use for my iphone 13 pro max.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [ "iphone 13 pro max" ] }, "asin": "B09N1BWH8F" }, { "task_id": "ws_B085TCPF68_4121", "instruction": "i'm looking for a black phone case that is apple compatible with a black screen.", "target_attributes": { "attributes": [ "compatible apple", "glass screen" ], "options": [ "black" ] }, "asin": "B085TCPF68" }, { "task_id": "ws_B085TCPF68_4122", "instruction": "i need a smartwatch case that is apple compatible and is silver", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "silver" ] }, "asin": "B085TCPF68" }, { "task_id": "ws_B085TCPF68_4123", "instruction": "i want to buy case for apple watch which has tempered glass and is for rose pink color, and it's size should be 42 mm.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "rose pink", "42 mm" ] }, "asin": "B085TCPF68" }, { "task_id": "ws_B09J2G581P_4124", "instruction": "i want 4 pcs of bpa free oral hygiene tongue scraper for fresh breath.", "target_attributes": { "attributes": [ "bpa free", "fresh breath", "oral hygiene" ], "options": [] }, "asin": "B09J2G581P" }, { "task_id": "ws_B08FD5WHDX_4125", "instruction": "please help me find a pair of soft plush women's house shoes that would be cozy and warm for winter. my favorite color is khaki and i normally wear anywhere between a size 9.5 to a 10.5.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "khaki", "9.5-10.5" ] }, "asin": "B08FD5WHDX" }, { "task_id": "ws_B095HZ9WQM_4126", "instruction": "i'm trying to find a 4-xl collegiate unc charlotte polo that is officially licensed.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "university of north carolina at charlott...", "4x-large" ] }, "asin": "B095HZ9WQM" }, { "task_id": "ws_B095HZ9WQM_4127", "instruction": "i'm looking for clothing it can use for machinable uses.", "target_attributes": { "attributes": [ "machine washable", "everyday wear" ], "options": [ "texas a&m university-corpus christi" ] }, "asin": "B095HZ9WQM" }, { "task_id": "ws_B0787KFYMJ_4128", "instruction": "i want some long-lasting snow boots with faux fur in black or khaki at size 7.5.", "target_attributes": { "attributes": [ "long lasting", "faux fur" ], "options": [ "black | khaki ii", "7.5" ] }, "asin": "B0787KFYMJ" }, { "task_id": "ws_B07WHCJRVF_4129", "instruction": "i'm looking for a 70cm wall mounted mirror for bathroom", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "70cm" ] }, "asin": "B07WHCJRVF" }, { "task_id": "ws_B005Z6LGYS_4130", "instruction": "i need some high fructose citrus tonic water.", "target_attributes": { "attributes": [ "high fructose" ], "options": [ "citrus" ] }, "asin": "B005Z6LGYS" }, { "task_id": "ws_B07TLBM7DJ_4131", "instruction": "i need a pack of fine line remover.", "target_attributes": { "attributes": [ "fine lines" ], "options": [ "1 count (pack of 1)" ] }, "asin": "B07TLBM7DJ" }, { "task_id": "ws_B09GZR1GT6_4132", "instruction": "i want to find some spray that i can use to treat hot flashes, and it should be suitable for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B09GZR1GT6" }, { "task_id": "ws_B08T5WTP2T_4133", "instruction": "i'd like to find some noise cancelling headphones that are hands-free. they should be compatible with bluetooth version 5.0.", "target_attributes": { "attributes": [ "noise cancelling", "hands free" ], "options": [] }, "asin": "B08T5WTP2T" }, { "task_id": "ws_B09R74G1JF_4134", "instruction": "i am looking to purchase a hand or machine wash women's classic plain bikini swimsuit with high waist, tummy control in an x-large. prefer color yellow.", "target_attributes": { "attributes": [ "hand wash", "machine wash", "tummy control", "high waist" ], "options": [ "yellow", "x-large" ] }, "asin": "B09R74G1JF" }, { "task_id": "ws_B09LGX8FK6_4135", "instruction": "i'm looking for black color medium size puweer straight leg slacks for women to business work casual.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "black", "medium" ] }, "asin": "B09LGX8FK6" }, { "task_id": "ws_B09JWTPGM2_4136", "instruction": "i'm looking for easy-to-use cake toppers for a birthday party.", "target_attributes": { "attributes": [ "easy use", "birthday party" ], "options": [] }, "asin": "B09JWTPGM2" }, { "task_id": "ws_B016S52Q7U_4137", "instruction": "i am looking for a water beverage with source of vitamin and zero sugar. also in kiwi strawberry flavor.", "target_attributes": { "attributes": [ "source vitamin", "zero sugar" ], "options": [ "kiwi strawberry" ] }, "asin": "B016S52Q7U" }, { "task_id": "ws_B08P797L5K_4138", "instruction": "i'm looking for a high-quality manicure set made from stainless steel that is designed for removing dead skin.", "target_attributes": { "attributes": [ "high quality", "stainless steel", "dead skin" ], "options": [] }, "asin": "B08P797L5K" }, { "task_id": "ws_B083XK3VQX_4139", "instruction": "i would like to buy a sugar free powder drink mix that is a nice source of vitamin.", "target_attributes": { "attributes": [ "sugar free", "source vitamin" ], "options": [] }, "asin": "B083XK3VQX" }, { "task_id": "ws_B09SXQFM4V_4140", "instruction": "i want to find a set of high-power binoculars that i can use for birdwatching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B09SXQFM4V" }, { "task_id": "ws_B085W93XWY_4141", "instruction": "looking for men classic slip on with anti slip grips and back heel square toe, with quality leather.", "target_attributes": { "attributes": [ "anti slip" ], "options": [] }, "asin": "B085W93XWY" }, { "task_id": "ws_B08R115KB1_4142", "instruction": "i want the 8 pack of pork king good seasoning. i need the 8 pack of the gluten free variety.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "dill pickle", "8 pack" ] }, "asin": "B08R115KB1" }, { "task_id": "ws_B094XWSQDT_4143", "instruction": "i'm looking for rose gold hair salon bags.", "target_attributes": { "attributes": [ "rose gold", "hair salon" ], "options": [] }, "asin": "B094XWSQDT" }, { "task_id": "ws_B07HMVN5HZ_4144", "instruction": "i want a 2-in-one shampoo and conditioner for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "shampoo+conditioner" ] }, "asin": "B07HMVN5HZ" }, { "task_id": "ws_B07XZ1VW78_4145", "instruction": "i'm looking for an armchair for my living room that features solid wood legs. i only need one chair and the color should be brown.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "brown", "1" ] }, "asin": "B07XZ1VW78" }, { "task_id": "ws_B08YRDPZKY_4146", "instruction": "i'd like to get a 3d, high-resolution personal mobile cinema. it needs to come with a carrying case too.", "target_attributes": { "attributes": [ "high resolution", "carrying case" ], "options": [] }, "asin": "B08YRDPZKY" }, { "task_id": "ws_B09NVBS2W1_4147", "instruction": "i want to find a tempered glass covering film that i can use on my dining room windows. the dimensions should be 23.6 inches by 47.2 inches and film should come in a set of two.", "target_attributes": { "attributes": [ "tempered glass", "dining room" ], "options": [ "(width\uff0923.6in x (length)47.2in x 2pcs" ] }, "asin": "B09NVBS2W1" }, { "task_id": "ws_B08P766SNC_4148", "instruction": "i need a space saving coat rack in solid wood.", "target_attributes": { "attributes": [ "space saving", "solid wood" ], "options": [] }, "asin": "B08P766SNC" }, { "task_id": "ws_B099RQDNVN_4149", "instruction": "i'm looking for a stool that could be used by a beauty salon to cut hair.", "target_attributes": { "attributes": [ "beauty salon", "hair cutting" ], "options": [] }, "asin": "B099RQDNVN" }, { "task_id": "ws_B09SXRG46H_4150", "instruction": "i'm looking for a way to watch birds from far away and have my smartphone involved.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09SXRG46H" }, { "task_id": "ws_B09GY857SW_4151", "instruction": "i am looking for a high quality, black spa equipment wall mount that is eco friendly.", "target_attributes": { "attributes": [ "high quality", "eco friendly" ], "options": [ "style7 black" ] }, "asin": "B09GY857SW" }, { "task_id": "ws_B09QXB34BD_4152", "instruction": "i\u2019m looking for a small tummy control swimwear for teen girls. and i would prefer the a3-green color", "target_attributes": { "attributes": [ "tummy control", "teen girls" ], "options": [ "a3-green", "small" ] }, "asin": "B09QXB34BD" }, { "task_id": "ws_B099Z7ZNDK_4153", "instruction": "i'm looking for a queen size bed with a box spring.", "target_attributes": { "attributes": [ "queen size", "box spring" ], "options": [] }, "asin": "B099Z7ZNDK" }, { "task_id": "ws_B09PLC2QV8_4154", "instruction": "na", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "black blue" ] }, "asin": "B09PLC2QV8" }, { "task_id": "ws_B01M9B4YOA_4155", "instruction": "i'm hoping to find a purple, xx-large batman shirt that's officially licensed.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "purple", "xx-large" ] }, "asin": "B01M9B4YOA" }, { "task_id": "ws_B09NXS598S_4156", "instruction": "show me long sleeved daily wear sweater for teen girls in white color and 4x large size.", "target_attributes": { "attributes": [ "long sleeve", "teen girls", "daily wear" ], "options": [ "z4 white", "4x-large" ] }, "asin": "B09NXS598S" }, { "task_id": "ws_B081811MTB_4157", "instruction": "i'm looking for easy to install mounted wall hooks to hang towels and clothes also, choose the 1 piece set with 2 hooks.", "target_attributes": { "attributes": [ "wall mounted", "easy install" ], "options": [] }, "asin": "B081811MTB" }, { "task_id": "ws_B09N3C1MZZ_4158", "instruction": "i'm looking for white noise cancelling, wireless headphones that have bluetooth capabilites.", "target_attributes": { "attributes": [ "noise cancelling", "hands free", "wireless bluetooth" ], "options": [ "white" ] }, "asin": "B09N3C1MZZ" }, { "task_id": "ws_B076RFDSBG_4159", "instruction": "i'm looking for an 8-pack of 8-inch portable hair extensions. the color needs to be wine red.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "wine red", "8 inch (pack of 8)" ] }, "asin": "B076RFDSBG" }, { "task_id": "ws_B076RFDSBG_4160", "instruction": "looking for a hair extension for grey dry hair and 18 in long", "target_attributes": { "attributes": [ "hair extensions", "dry hair" ], "options": [ "grey", "18 inch (pack of 8)" ] }, "asin": "B076RFDSBG" }, { "task_id": "ws_B076RFDSBG_4161", "instruction": "i need a pack of storage bag for my hair extension . and i would prefer the white blonde color", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "white blonde", "1 count" ] }, "asin": "B076RFDSBG" }, { "task_id": "ws_B076RFDSBG_4162", "instruction": "i would like a 18 inch medium brown hair extension.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "medium brown", "18 inch (pack of 1)" ] }, "asin": "B076RFDSBG" }, { "task_id": "ws_B07TFJBQFL_4163", "instruction": "i want some anti-slip water shoes in size 7.5 and the color khaki.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "kahaki", "7.5" ] }, "asin": "B07TFJBQFL" }, { "task_id": "ws_B09RQ79JRR_4164", "instruction": "i'm interested in jar candles made from soy with a lead-free wick.", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [] }, "asin": "B09RQ79JRR" }, { "task_id": "ws_B0947BLY8N_4165", "instruction": "i'am looking for sulfate free argan oil for the hair treatment of my wife", "target_attributes": { "attributes": [ "sulfate free", "argan oil", "hair treatment" ], "options": [] }, "asin": "B0947BLY8N" }, { "task_id": "ws_B09C2RM9XT_4166", "instruction": "i need some wild caught spring water tuna fish.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "spring water" ] }, "asin": "B09C2RM9XT" }, { "task_id": "ws_B09C2RM9XT_4167", "instruction": "i want to find a two-pack of jarred wild-caught tuna filets that are low calorie. the jars need to be 6.7 ounces, and ideally the flavor should be very garlicky.", "target_attributes": { "attributes": [ "wild caught", "low calorie" ], "options": [ "garlic", "6.7 ounce (pack of 2)" ] }, "asin": "B09C2RM9XT" }, { "task_id": "ws_B075FZMXGS_4168", "instruction": "locate the ambesonne harbour stripe throw pillow cover, 18 x 18 inch, double sided. i want the salmon brown color.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "salmon brown", "18 x 18-inch" ] }, "asin": "B075FZMXGS" }, { "task_id": "ws_B08LDY73WQ_4169", "instruction": "i want some low fat orange mousse cookies.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "orange mousse" ] }, "asin": "B08LDY73WQ" }, { "task_id": "ws_B08K1PWRLD_4170", "instruction": "i want a hair remover for face and body including the bikini area. pick the lilac one.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B08K1PWRLD" }, { "task_id": "ws_B08YWW48JC_4171", "instruction": "i need ready use hand-knitted ottoman pouf for living room. and choose the purple one.", "target_attributes": { "attributes": [ "ready use", "living room" ], "options": [ "purple" ] }, "asin": "B08YWW48JC" }, { "task_id": "ws_B08CJZ4B8M_4172", "instruction": "i'm looking for a gray wash colored living room console table with a wood frame.", "target_attributes": { "attributes": [ "wood frame", "living room" ], "options": [ "gray wash" ] }, "asin": "B08CJZ4B8M" }, { "task_id": "ws_B082XGZ455_4173", "instruction": "i need some hands free gold earbuds.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "gold" ] }, "asin": "B082XGZ455" }, { "task_id": "ws_B089FMW6ZV_4174", "instruction": "remote control for emerson led lcd tv lf501em4a lf320em4a lc391em4", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B089FMW6ZV" }, { "task_id": "ws_B00R4R084K_4175", "instruction": "i need a slate blue, big and tall t-shirt that is good for machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "heather slate blue", "8x-large big" ] }, "asin": "B00R4R084K" }, { "task_id": "ws_B08PJ86CJD_4176", "instruction": "i'm looking for a 10 pack of hydrating sheet masks with anti aging properties. i would like to select the spa hairband option.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "full collection w | spa hairband", "pack of 10" ] }, "asin": "B08PJ86CJD" }, { "task_id": "ws_B08DQSV61J_4177", "instruction": "i need some easy to apply 18mm eyelashes.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "18mm" ] }, "asin": "B08DQSV61J" }, { "task_id": "ws_B08DQSV61J_4178", "instruction": "i need high quality lashes in size 21mm that are easy to apply.", "target_attributes": { "attributes": [ "easy apply", "high quality" ], "options": [ "21mm" ] }, "asin": "B08DQSV61J" }, { "task_id": "ws_B08DQSV61J_4179", "instruction": "look for supplies for eyelash extension dd curl 0.05 show me with easy apply.color: dd-0.03. please", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "dd-0.03" ] }, "asin": "B08DQSV61J" }, { "task_id": "ws_B09SZJHN5N_4180", "instruction": "i am looking for a high quality wig that is sky blue colored.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "sky blue" ] }, "asin": "B09SZJHN5N" }, { "task_id": "ws_B005Z6AK2C_4181", "instruction": "i want to buy an easy to use instant coffee that comes in a decaf french vanilla.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "decaf french vanilla" ] }, "asin": "B005Z6AK2C" }, { "task_id": "ws_B005Z6AK2C_4182", "instruction": "i would like a 3 piece assortment of salted caramel instant coffee that's rich and creamy.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "salted caramel", "3 piece assortment" ] }, "asin": "B005Z6AK2C" }, { "task_id": "ws_B005Z6AK2C_4183", "instruction": "i would like some easy to use salted caramel instant coffee", "target_attributes": { "attributes": [ "easy use" ], "options": [ "salted caramel" ] }, "asin": "B005Z6AK2C" }, { "task_id": "ws_B005Z6AK2C_4184", "instruction": "i would like a 12 ounce box of classic cappuccino instant coffee mix that is easy to make.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "classic cappuccino", "12 ounce (pack of 2)" ] }, "asin": "B005Z6AK2C" }, { "task_id": "ws_B081TYSS5S_4185", "instruction": "i want to buy some men's construction boots with steel toe. they need to be slip resistant and size 15.", "target_attributes": { "attributes": [ "slip resistant", "steel toe" ], "options": [ "15" ] }, "asin": "B081TYSS5S" }, { "task_id": "ws_B09STZH768_4186", "instruction": "i want the fast charging hands free amzstar ipx0 waterproof headset. i want the grey ones.", "target_attributes": { "attributes": [ "fast charging", "hands free" ], "options": [ "grey" ] }, "asin": "B09STZH768" }, { "task_id": "ws_B09STZH768_4187", "instruction": "fast charging wireless headphones with waterproof and bluetooth 5.0 facility and 16gb mp3 player and also color is red", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "red" ] }, "asin": "B09STZH768" }, { "task_id": "ws_B08Z8MHWVS_4188", "instruction": "i am interested in 2 pints eggless raw edible cookie dough with natural ingredients with chocochip & cherrychoco flavor.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B08Z8MHWVS" }, { "task_id": "ws_B08L6M9SK5_4189", "instruction": "i am looking for a lantern pendant light with 4 lights. find me something in black and gold.", "target_attributes": { "attributes": [ "pendant light" ], "options": [] }, "asin": "B08L6M9SK5" }, { "task_id": "ws_B01N6YD5PL_4190", "instruction": "seeking to buy a jar candle that is eco friendly. i want it to be 8 ounces and hazelnut latte color. soy candle wax.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "hazelnut latte", "8 ounce" ] }, "asin": "B01N6YD5PL" }, { "task_id": "ws_B01N6YD5PL_4191", "instruction": "i want to find a gift set of soy candles that are eco friendly. the color should ideally be fresh linen.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "fresh linen", "gift set" ] }, "asin": "B01N6YD5PL" }, { "task_id": "ws_B01N6YD5PL_4192", "instruction": "i am looking for eco friendly candle wax. please choose vanilla lavender.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "stress relief & vanilla lavender" ] }, "asin": "B01N6YD5PL" }, { "task_id": "ws_B01N6YD5PL_4193", "instruction": "i would like a jar candle that is eco friendly and cinnamon vanilla", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "cinnamon vanilla" ] }, "asin": "B01N6YD5PL" }, { "task_id": "ws_B09J2KSTLN_4194", "instruction": "throw of size 40\"x50\" and color blankets 13", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [] }, "asin": "B09J2KSTLN" }, { "task_id": "ws_B07L63JWVK_4195", "instruction": "i need a ready to use and fully assembled sewing kit.", "target_attributes": { "attributes": [ "ready use", "fully assembled" ], "options": [] }, "asin": "B07L63JWVK" }, { "task_id": "ws_B00IZ8L3LY_4196", "instruction": "i need some pre-cooked honey barbque wings with the bone in, having at least 14 grams of protein per serving, contains 5 servings and is preferably frozen.", "target_attributes": { "attributes": [ "fully cooked", "protein serving", "ready eat" ], "options": [] }, "asin": "B00IZ8L3LY" }, { "task_id": "ws_B0968SML8V_4197", "instruction": "i need a travel sized shampoo for damaged hair in a mini-discovery kit.", "target_attributes": { "attributes": [ "travel size", "damaged hair" ], "options": [ "mini discovery kit" ] }, "asin": "B0968SML8V" }, { "task_id": "ws_B074CZW6CZ_4198", "instruction": "i'm looking for a quad core, high performance desktop which has core i5.", "target_attributes": { "attributes": [ "high performance", "core i5", "quad core" ], "options": [] }, "asin": "B074CZW6CZ" }, { "task_id": "ws_B08S6PGBLT_4199", "instruction": "i'd like to find some brown fur-lined women's boots; they should be warm in the winter and work well in snow.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "brown" ] }, "asin": "B08S6PGBLT" }, { "task_id": "ws_B09BYQFM1Z_4200", "instruction": "i need high quality makeup remover pads for my sensitive skin. i like it to be 12 pack and gray in color.", "target_attributes": { "attributes": [ "high quality", "sensitive skin" ], "options": [ "grayx12pack" ] }, "asin": "B09BYQFM1Z" }, { "task_id": "ws_B081VL1NVS_4201", "instruction": "locate for me a sweatyrocks women's high waist pu leather midi skirt. i want it in brown.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "brown", "medium" ] }, "asin": "B081VL1NVS" }, { "task_id": "ws_B07DYT5VS3_4202", "instruction": "i need a hands free fm transmitter with a fast charge time.", "target_attributes": { "attributes": [ "hands free", "fast charging" ], "options": [] }, "asin": "B07DYT5VS3" }, { "task_id": "ws_B09M9QX1M9_4203", "instruction": "i need some extra large butt lifting leggings in mint green.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "mint green", "x-large" ] }, "asin": "B09M9QX1M9" }, { "task_id": "ws_B09CZMMLC8_4204", "instruction": "i'm looking for a dark blue fleece throw that i can use to decorate my living room.", "target_attributes": { "attributes": [ "fleece throw", "living room" ], "options": [ "dark blue- \"good vibes only\"" ] }, "asin": "B09CZMMLC8" }, { "task_id": "ws_B09M72Z43M_4205", "instruction": "i need a small rotating book shelf made of wood with 3 tier storage. pick a white one.", "target_attributes": { "attributes": [ "white item", "storage unit", "storage space" ], "options": [] }, "asin": "B09M72Z43M" }, { "task_id": "ws_B09D2T5HVK_4206", "instruction": "i:need a mirrored wooden cabinet with one drawer two doors with round ring handle, style28 size and solid wood legs", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "style28" ] }, "asin": "B09D2T5HVK" }, { "task_id": "ws_B08CJLXVMZ_4207", "instruction": "find me 9oz bags of sugar free catalina crunch honey graham keto cereal. i want the low carb gluten free kind.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "honey graham & dark chocolate" ] }, "asin": "B08CJLXVMZ" }, { "task_id": "ws_B07CZ37V8N_4208", "instruction": "i am looking for a organic cold brew coffee with straight black flavor. choose shelf stable product.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "straight black" ] }, "asin": "B07CZ37V8N" }, { "task_id": "ws_B09R8VK3Q3_4209", "instruction": "i am looking for a non-diary and sugar free cookie baking mix. it should have soft chocolate chips.", "target_attributes": { "attributes": [ "non dairy", "sugar free" ], "options": [ "soft chocolate chip" ] }, "asin": "B09R8VK3Q3" }, { "task_id": "ws_B07KC127M7_4210", "instruction": "i'd like to find a plastic body brush with a long handle that can slough off dead skin.", "target_attributes": { "attributes": [ "long handle", "dead skin" ], "options": [] }, "asin": "B07KC127M7" }, { "task_id": "ws_B07FLJNFM8_4211", "instruction": "i need some paraben free conditioner to promote hair growht.", "target_attributes": { "attributes": [ "paraben free", "hair growth" ], "options": [] }, "asin": "B07FLJNFM8" }, { "task_id": "ws_B07M9YKV87_4212", "instruction": "i am looking for slimpointoe red color anti slip flat sandal.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "slimpointoe red" ] }, "asin": "B07M9YKV87" }, { "task_id": "ws_B07M9YKV87_4213", "instruction": "shop for a pair of size six jelly sandals with rubber soles and snap closures. by the silver ones in size six.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "snapclosure silver", "6" ] }, "asin": "B07M9YKV87" }, { "task_id": "ws_B097TKMBPN_4214", "instruction": "i want to find a blue electric shower brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "blue" ] }, "asin": "B097TKMBPN" }, { "task_id": "ws_B09D34D2FV_4215", "instruction": "i need some hair growth formula.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B09D34D2FV" }, { "task_id": "ws_B09JWL2HP5_4216", "instruction": "i\u2019m looking for refreshing advanced purifying mouth wash mouth spray for instant fresh breath.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [ "mint" ] }, "asin": "B09JWL2HP5" }, { "task_id": "ws_B09SF2BHYJ_4217", "instruction": "i need a 6-wide jogging shoes that has arch support. and i would prefer the a4-black", "target_attributes": { "attributes": [ "arch support" ], "options": [ "a4 - black", "6 wide" ] }, "asin": "B09SF2BHYJ" }, { "task_id": "ws_B09L7QXNCR_4218", "instruction": "i am looking for a blue video gaming chair with lumbar support please.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "blue" ] }, "asin": "B09L7QXNCR" }, { "task_id": "ws_B01N58JX21_4219", "instruction": "get me a non alcoholic bread mix made with natural ingredients.", "target_attributes": { "attributes": [ "non alcoholic", "natural ingredients" ], "options": [] }, "asin": "B01N58JX21" }, { "task_id": "ws_B018P3KPNA_4220", "instruction": "i want a tempered glass screen protector that i can use for my iphone se.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [] }, "asin": "B018P3KPNA" }, { "task_id": "ws_B092M7K146_4221", "instruction": "i'd like some black cupcake topper picks that i can use for a birthday party.", "target_attributes": { "attributes": [ "birthday party", "cupcake picks" ], "options": [ "black" ] }, "asin": "B092M7K146" }, { "task_id": "ws_B00ALTXFUC_4222", "instruction": "find me thai healthy gluten free mixed real fruit chips", "target_attributes": { "attributes": [ "real fruit" ], "options": [] }, "asin": "B00ALTXFUC" }, { "task_id": "ws_B08FHPD83P_4223", "instruction": "i need highly pigmented eyeshadow that is suitable for sensitive skin. metallic grey color is my preference.", "target_attributes": { "attributes": [ "highly pigmented", "sensitive skin" ], "options": [ "23 galaxy grey metallic" ] }, "asin": "B08FHPD83P" }, { "task_id": "ws_B01GS46GL8_4224", "instruction": "looking for safavieh hudson shag collection area rug in dark grey | ivory rectangular shaped that is 2 ft 3 in x 6 ft for my living or dining room.", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "dark grey | ivory", "rectangular", "2 ft 3 in x 6 ft" ] }, "asin": "B01GS46GL8" }, { "task_id": "ws_B08T1D4PPL_4225", "instruction": "i want to find an extra large, long-sleeve two-piece outfit for daily wear. please find me something in coffee color.", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "28231-coffee", "x-large" ] }, "asin": "B08T1D4PPL" }, { "task_id": "ws_B09R73K1JK_4226", "instruction": "i want to find a 4-piece set of haircare products for damaged hair, including essential oils and herbal spray.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "4pcs" ] }, "asin": "B09R73K1JK" }, { "task_id": "ws_B01N7DHJ8V_4227", "instruction": "i'm looking for some non gmo honey roasted and chopped pecans.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "honey roasted and chopped" ] }, "asin": "B01N7DHJ8V" }, { "task_id": "ws_B094MYWRBX_4228", "instruction": "i want to find a pink pair of women's casual wedge, anti-slip slippers in a size 9.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "0 # pink", "9" ] }, "asin": "B094MYWRBX" }, { "task_id": "ws_B08QW2HK8Z_4229", "instruction": "i'd like to find a pair of extra-large cargo shorts in british khaki. ideally, it'll have an elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "british khaki", "x-large big" ] }, "asin": "B08QW2HK8Z" }, { "task_id": "ws_B074KD7T93_4230", "instruction": "please find me a heavy duty pvc table cover protector that is about 36 x 60 inches. ideally, it should be waterproof and easy clean.", "target_attributes": { "attributes": [ "easy clean", "heavy duty" ], "options": [ "36 x 60 inches" ] }, "asin": "B074KD7T93" }, { "task_id": "ws_B074KD7T93_4231", "instruction": "i am looking for a 44 x 122.2 inches - customized size double sided table pads", "target_attributes": { "attributes": [ "double sided" ], "options": [ "44 x 122.2 inches - customized" ] }, "asin": "B074KD7T93" }, { "task_id": "ws_B07P1BSPF2_4232", "instruction": "i'm looking for gluten-free beanfields bean chips, jalapeno lime 4-pack.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "5.5 ounce (pack of 4)" ] }, "asin": "B07P1BSPF2" }, { "task_id": "ws_B01CKI9A5A_4233", "instruction": "i am looking for a face oil serum that is cruelty free produced and has anti aging properties.", "target_attributes": { "attributes": [ "anti aging", "cruelty free" ], "options": [] }, "asin": "B01CKI9A5A" }, { "task_id": "ws_B07X2VFG42_4234", "instruction": "i need a easy to use high quality self piercing ear gun in light grey colour", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "lightgrey" ] }, "asin": "B07X2VFG42" }, { "task_id": "ws_B09LXDB5W4_4235", "instruction": "i'm looking for a remote control for my ultra hd tv.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B09LXDB5W4" }, { "task_id": "ws_B08BC4LRJX_4236", "instruction": "i'm looking for a neck cushion for a hair salon shampoo bowl .", "target_attributes": { "attributes": [ "hair salon" ], "options": [] }, "asin": "B08BC4LRJX" }, { "task_id": "ws_B07JFWG8L5_4237", "instruction": "i'm looking for a candie potato chips covered by chocolate and with 1 pound pack", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B07JFWG8L5" }, { "task_id": "ws_B08216Z7RW_4238", "instruction": "i want to find grey 30 by 45 inch blackout curtains that i can use for my living room. they must be machine washable.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "grey", "w30\"xl45\"" ] }, "asin": "B08216Z7RW" }, { "task_id": "ws_B00LFCEXWI_4239", "instruction": "i need some vinyl sandals in ochre colors.", "target_attributes": { "attributes": [ "ethylene vinyl", "vinyl acetate" ], "options": [ "ochre" ] }, "asin": "B00LFCEXWI" }, { "task_id": "ws_B09BJC4JHD_4240", "instruction": "i'm looking for a w 47in x h 75in cooling bamboo mattress pad that is double sided.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "w 47in x h 75 in" ] }, "asin": "B09BJC4JHD" }, { "task_id": "ws_B09PFKWRTH_4241", "instruction": "search for women wedding wedges with slingback shoes and summer ankle strap must be leopard print.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "brown" ] }, "asin": "B09PFKWRTH" }, { "task_id": "ws_B00HQUSPMW_4242", "instruction": "i need some fully cooked canned meats with a long shelf life.", "target_attributes": { "attributes": [ "fully cooked", "shelf stable" ], "options": [] }, "asin": "B00HQUSPMW" }, { "task_id": "ws_B07LD885TY_4243", "instruction": "i'm looking for a highly pigmented eye shadow kit. also, choose the nude pallet kit with brush.", "target_attributes": { "attributes": [ "highly pigmented", "eye shadow" ], "options": [] }, "asin": "B07LD885TY" }, { "task_id": "ws_B07ZLZPN1N_4244", "instruction": "i need a new quad core 4gb 32gb support usb port 1080p hd android tv box.", "target_attributes": { "attributes": [ "1080p hd", "quad core", "usb port" ], "options": [] }, "asin": "B07ZLZPN1N" }, { "task_id": "ws_B09KLPLGNX_4245", "instruction": "i want a fully assembled queen size mattress.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "twin" ] }, "asin": "B09KLPLGNX" }, { "task_id": "ws_B09KLPLGNX_4246", "instruction": "i would like a twin size bed with a 8\" unassembled box string high density mattress.", "target_attributes": { "attributes": [ "high density" ], "options": [ "twin", "matt + 8\" unassembled box spring" ] }, "asin": "B09KLPLGNX" }, { "task_id": "ws_B00BK54GWW_4247", "instruction": "i am looking 2 bathbar marblezied having nickel finish vanity light", "target_attributes": { "attributes": [ "nickel finish", "glass shade" ], "options": [] }, "asin": "B00BK54GWW" }, { "task_id": "ws_B09GFLJ4S8_4248", "instruction": "i want to find a high-speed, fast-charging portable iphone charger that's black.", "target_attributes": { "attributes": [ "high speed", "fast charging" ], "options": [ "black" ] }, "asin": "B09GFLJ4S8" }, { "task_id": "ws_B07WCNFJVC_4249", "instruction": "i need a beauty salon chair.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B07WCNFJVC" }, { "task_id": "ws_B09T32NH5L_4250", "instruction": "i'm looking for a men's loose fit shirt in xx-large for daily wear.", "target_attributes": { "attributes": [ "loose fit", "daily wear" ], "options": [ "xx-large" ] }, "asin": "B09T32NH5L" }, { "task_id": "ws_B005LBD76C_4251", "instruction": "i'm looking for a two-ounce stick of anti-perspirant that will be long-lasting.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B005LBD76C" }, { "task_id": "ws_B06XG8WKGM_4252", "instruction": "i need a machine washable ottoman seat that is contemporary and white navy colored.", "target_attributes": { "attributes": [ "machine washable", "contemporary style" ], "options": [ "white navy" ] }, "asin": "B06XG8WKGM" }, { "task_id": "ws_B06XG8WKGM_4253", "instruction": "i would like a white beige armless chair in a contemporary modern style.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "white beige", "armless chair" ] }, "asin": "B06XG8WKGM" }, { "task_id": "ws_B0773FVPXQ_4254", "instruction": "i need a long sleeve shirt with a red contrast color.", "target_attributes": { "attributes": [ "contrast color", "long sleeve" ], "options": [ "z-red" ] }, "asin": "B0773FVPXQ" }, { "task_id": "ws_B09QCZNZN8_4255", "instruction": "i need a medium size lovers casual round neck valentine's day print short sleeve tummy control v-neck t-shirt top, also, choose the \u8d2248 - wine color one.", "target_attributes": { "attributes": [ "short sleeve", "tummy control" ], "options": [ "medium" ] }, "asin": "B09QCZNZN8" }, { "task_id": "ws_B08QYJW5T5_4256", "instruction": "i need an eco friendly soy candle with an english pear scent.", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [ "freesias & english pear" ] }, "asin": "B08QYJW5T5" }, { "task_id": "ws_B000WHZFHE_4257", "instruction": "i'm looking for a size 0.75 ounce easy prepare turkey gravy mix.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "0.75 ounce (pack of 24)" ] }, "asin": "B000WHZFHE" }, { "task_id": "ws_B000WHZFHE_4258", "instruction": "i want an easy to prepare mccormick turkey brown gravy mix.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "premium brown" ] }, "asin": "B000WHZFHE" }, { "task_id": "ws_B000WHZFHE_4259", "instruction": "can you find me a pack of turkey gravy mix that is easy to prepare?", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "turkey gravy mix", "0.75 ounce (pack of 1)" ] }, "asin": "B000WHZFHE" }, { "task_id": "ws_B09LCYXFWX_4260", "instruction": "i'm looking for a cell phone case for my new iphone 13 mini, i want the case to have the non slip and wireless charging feature, also, the color should be in clear green and blue.", "target_attributes": { "attributes": [ "non slip", "wireless charging" ], "options": [ "clear green & blue" ] }, "asin": "B09LCYXFWX" }, { "task_id": "ws_B09DFFVJMQ_4261", "instruction": "i'm looking for soft, blue plaid throw pillows for the living room, also machine washable.", "target_attributes": { "attributes": [ "super soft", "machine washable", "living room" ], "options": [ "blue ,plaid" ] }, "asin": "B09DFFVJMQ" }, { "task_id": "ws_B07Q6PCRWP_4262", "instruction": "i want to find a pair of women's ankle boots in an ice blue color. i wear a size 5 and need good arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "ice blue nubuck", "5" ] }, "asin": "B07Q6PCRWP" }, { "task_id": "ws_B07HBDV8Z5_4263", "instruction": "find me a 2 ft 3 in x 14 ft sized living room square rug in either navy or cream color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "cream | navy", "square", "2 ft 3 in x 14 ft" ] }, "asin": "B07HBDV8Z5" }, { "task_id": "ws_B07MZ353XV_4264", "instruction": "i need a large high resolution photography background in 10x7ft.", "target_attributes": { "attributes": [ "high resolution", "digital photography" ], "options": [ "10x7ft" ] }, "asin": "B07MZ353XV" }, { "task_id": "ws_B07D4BFKYB_4265", "instruction": "i'm looking for a solid wood, full size low platform storage bed.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "full" ] }, "asin": "B07D4BFKYB" }, { "task_id": "ws_B07D4BFKYB_4266", "instruction": "i am interested in a bos spring storage bed which is king sized.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "king" ] }, "asin": "B07D4BFKYB" }, { "task_id": "ws_B01HJWEE4O_4267", "instruction": "i'd like to find a 3-pack of male to female high-speed hdmi cables. ideally these cables should be 12 feet long.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 pack", "12 feet (4 pack)", "hdmi male to female" ] }, "asin": "B01HJWEE4O" }, { "task_id": "ws_B01HJWEE4O_4268", "instruction": "i want to buy hdmi cable which is gold plated and comes in 10 pack with a length of 1.5 feet and is an hdmi male to male.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10 pack", "1.5 feet (3 pack)", "hdmi male to male" ] }, "asin": "B01HJWEE4O" }, { "task_id": "ws_B07T1WNB1B_4269", "instruction": "please help me find a cozy and warm fleece throw blanket. it should be quite large, about 50 by 80 inches.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "50 in x 80 in" ] }, "asin": "B07T1WNB1B" }, { "task_id": "ws_B06XFVZWQF_4270", "instruction": "i want to find an ac adapter that features a dual-band cradle signal booster kit.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B06XFVZWQF" }, { "task_id": "ws_B06XFVZWQF_4271", "instruction": "i am looking for an ac adapter that has output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B06XFVZWQF" }, { "task_id": "ws_B07S975Y8V_4272", "instruction": "i want to find a pair of women's classic side sandals in black and red. i wear a size 7, and the shoes need to feature ethylene vinyl.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "black | red", "7 women | 5 men" ] }, "asin": "B07S975Y8V" }, { "task_id": "ws_B08ZJWG6JM_4273", "instruction": "i'd like to find a pair of size-12 men's waterproof sneakers. it should have ethylene vinyl and ideally i want the color to be breen.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "breen", "12" ] }, "asin": "B08ZJWG6JM" }, { "task_id": "ws_B08THJRWHK_4274", "instruction": "i need a 70\" portable, easy to install, and easy to use projector screen.", "target_attributes": { "attributes": [ "easy install", "easy use" ], "options": [ "70\"" ] }, "asin": "B08THJRWHK" }, { "task_id": "ws_B08SPX44X3_4275", "instruction": "i need some medium white casual shorts in a regular size.", "target_attributes": { "attributes": [ "daily casual", "regular fit" ], "options": [ "white", "medium" ] }, "asin": "B08SPX44X3" }, { "task_id": "ws_B00JJ5BPYM_4276", "instruction": "i'm looking for a 12-pack of individually wrapped, spicy beef jamaican style patties.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "spicy beef", "12 count (pack of 1)" ] }, "asin": "B00JJ5BPYM" }, { "task_id": "ws_B09MYRB37Q_4277", "instruction": "i need a heavy duty beauty salon chair in black.", "target_attributes": { "attributes": [ "heavy duty", "beauty salon" ], "options": [ "black" ] }, "asin": "B09MYRB37Q" }, { "task_id": "ws_B07HJW43PF_4278", "instruction": "i'm looking for a pair of men's adidas shoes with lace closure and rubber sole, and i need size seven.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "7" ] }, "asin": "B07HJW43PF" }, { "task_id": "ws_B095BV6LP8_4279", "instruction": "i want a bling smartwatch case, apple series 6/5/4/3/2/1, with tempered glass, to fit a 44mm watch.", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "rose gold with tempered glass screen protector" ] }, "asin": "B095BV6LP8" }, { "task_id": "ws_B07KWTYZJN_4280", "instruction": "i need an officially plated iron armor t-shirt which is medium, and also navy blue.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "navy", "medium" ] }, "asin": "B07KWTYZJN" }, { "task_id": "ws_B081QN8R8D_4281", "instruction": "i'd like to find a six-piece haircare gift set that includes items specifically meant to promote hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B081QN8R8D" }, { "task_id": "ws_B07Q4SBPP4_4282", "instruction": "i'd like a brown wire-framed coffee table that i can put in my living room, fully assembled.", "target_attributes": { "attributes": [ "fully assembled", "living room" ], "options": [] }, "asin": "B07Q4SBPP4" }, { "task_id": "ws_B08MMQH84M_4283", "instruction": "i'm looking for some non-slip black vinyls.", "target_attributes": { "attributes": [ "non slip", "ethylene vinyl", "vinyl acetate" ], "options": [ "new black" ] }, "asin": "B08MMQH84M" }, { "task_id": "ws_B09R37C1G7_4284", "instruction": "bragg premium nutritional yeast seasoning - vegan, gluten free cheese flakes \u2013 good source of protein & vitamins \u2013 nutritious savory parmesan cheese substitute \u2013 non gmo verified (variety, 3.0 ounce (pack of 2))", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "smoky bbq" ] }, "asin": "B09R37C1G7" }, { "task_id": "ws_B07JFD7D32_4285", "instruction": "i'm looking for permanent hair coloring in a smoky pink color.", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "smokey pink" ] }, "asin": "B07JFD7D32" }, { "task_id": "ws_B07JFD7D32_4286", "instruction": "i am looking for l'oreal paris feria hair dye in the color tropical teal.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "517 tropical teal" ] }, "asin": "B07JFD7D32" }, { "task_id": "ws_B074PB6F5J_4287", "instruction": "i need some high performance speakers that are easy to install.", "target_attributes": { "attributes": [ "high performance", "easy install" ], "options": [] }, "asin": "B074PB6F5J" }, { "task_id": "ws_B07DQS31BW_4288", "instruction": "i'm looking for the harklinikken balancing shampoo in 2.54 oz. it must be plant based and comprised of seed oil.", "target_attributes": { "attributes": [ "plant based", "seed oil" ], "options": [] }, "asin": "B07DQS31BW" }, { "task_id": "ws_B00I83XF76_4289", "instruction": "i need high-speed usb cables with gold plates in a simple packaging.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "frustration-free packaging" ] }, "asin": "B00I83XF76" }, { "task_id": "ws_B00KXDW4EE_4290", "instruction": "i need a 35-quart top mount pullout kitchen waste trash container easy install bin for 1.63 inch wood frame cabinet", "target_attributes": { "attributes": [ "easy install", "wood frame" ], "options": [] }, "asin": "B00KXDW4EE" }, { "task_id": "ws_B081KQTYZQ_4291", "instruction": "i need a quick release camera mount made of aluminum alloy.", "target_attributes": { "attributes": [ "quick release", "aluminum alloy" ], "options": [] }, "asin": "B081KQTYZQ" }, { "task_id": "ws_B08MTQ1156_4292", "instruction": "i need a machine washable jogger outfit in a red color.", "target_attributes": { "attributes": [ "easy care", "machine washable" ], "options": [ "bling glitter-wine red" ] }, "asin": "B08MTQ1156" }, { "task_id": "ws_B08G1995C3_4293", "instruction": "i want to buy a double-sided shower brush.", "target_attributes": { "attributes": [ "double sided" ], "options": [] }, "asin": "B08G1995C3" }, { "task_id": "ws_B08ZLK16RR_4294", "instruction": "i want to find a straight spotting scope that i can use for bird-watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [ "straight" ] }, "asin": "B08ZLK16RR" }, { "task_id": "ws_B09P5BJBML_4295", "instruction": "i want to find some whitening toothpaste for sensitive teeth. the color should be orange and ideally it'll come in a set of two.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [ "orange", "2bottle" ] }, "asin": "B09P5BJBML" }, { "task_id": "ws_B08NWSR8VL_4296", "instruction": "i am looking down jacket ,long sleeve pedded coat insulated thick puffer jacket", "target_attributes": { "attributes": [ "winter warm", "long sleeve" ], "options": [ "black-faux fur" ] }, "asin": "B08NWSR8VL" }, { "task_id": "ws_B00NTR9B6A_4297", "instruction": "i'm looking for a skincare set including a snail gel cream. choose the ones that are fragrance and paraben free and comes in a size of 1.52 fl oz.", "target_attributes": { "attributes": [ "fragrance free", "paraben free" ], "options": [ "1.52 fl oz (pack of 1)" ] }, "asin": "B00NTR9B6A" }, { "task_id": "ws_B017BE451M_4298", "instruction": "i'm looking for some easy to install center channel speakers.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "center channel" ] }, "asin": "B017BE451M" }, { "task_id": "ws_B01MQENV0C_4299", "instruction": "i need a paraben free blow out mist serum.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "blow out mist" ] }, "asin": "B01MQENV0C" }, { "task_id": "ws_B09QQ8TVC2_4300", "instruction": "i want to find a men's wine-colored long sleeve dress shirt in size xx-large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "wine", "xx-large" ] }, "asin": "B09QQ8TVC2" }, { "task_id": "ws_B095HCT8CK_4301", "instruction": "i'm trying to find a black and walnut standing desk. it should be electric and height adjustable with memory presets as well.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "walnut and black" ] }, "asin": "B095HCT8CK" }, { "task_id": "ws_B09HRZ8V4P_4302", "instruction": "i need a high quality elastic tie for my hair with a light blue band.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "light blue" ] }, "asin": "B09HRZ8V4P" }, { "task_id": "ws_B07Y2FYGTN_4303", "instruction": "i want to buy a keto deluxe trail mix that is made with natural flavors.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "keto deluxe mix" ] }, "asin": "B07Y2FYGTN" }, { "task_id": "ws_B07Y2FYGTN_4304", "instruction": "i am interested in buying snacks which have natural ingredients, and have a flavor of keto choconut mix and the size of which is 16 ounce and come in pack of 1.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "keto choconut mix", "16 ounce (pack of 1)" ] }, "asin": "B07Y2FYGTN" }, { "task_id": "ws_B07Y2FYGTN_4305", "instruction": "i need a 1.5 pound box of trail mix that is keto and has natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "keto variety snack packs", "1.5 pound (pack of 1)" ] }, "asin": "B07Y2FYGTN" }, { "task_id": "ws_B09Q98WCJQ_4306", "instruction": "i need an easy carry headset in gray.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "gray small" ] }, "asin": "B09Q98WCJQ" }, { "task_id": "ws_B086WM1LQK_4307", "instruction": "i'm looking for unicorn sprinkle surprise cereal bars which coms with 15 count (pack of 1), also gluten free and non gmo.", "target_attributes": { "attributes": [ "gluten free", "non gmo" ], "options": [ "unicorn sprinkle surprise", "15 count (pack of 1)" ] }, "asin": "B086WM1LQK" }, { "task_id": "ws_B086WM1LQK_4308", "instruction": "i am looking gluten free non gmo nut free cereal bar size 40 count", "target_attributes": { "attributes": [ "gluten free", "non gmo", "nut free" ], "options": [ "40 count (pack of 1)" ] }, "asin": "B086WM1LQK" }, { "task_id": "ws_B09MFL33Z2_4309", "instruction": "i need to buy a power charger for my car that is fast charging. it also needs to be black blue.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "black blue(pd+qc)" ] }, "asin": "B09MFL33Z2" }, { "task_id": "ws_B09DK2QTMF_4310", "instruction": "i am looking for quad core video game console with high definition. pick a 256 gb one that is yellow in color.", "target_attributes": { "attributes": [ "high definition", "quad core" ], "options": [ "256g-yellow" ] }, "asin": "B09DK2QTMF" }, { "task_id": "ws_B09Q89DYTJ_4311", "instruction": "i'm looking for some black high heeled sandals for my mom. she wears size 5.5.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "black", "5.5" ] }, "asin": "B09Q89DYTJ" }, { "task_id": "ws_B07VDMFW5D_4312", "instruction": "chocolatefilledcandy", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "butterscotch" ] }, "asin": "B07VDMFW5D" }, { "task_id": "ws_B00DYQ3Z5E_4313", "instruction": "i'm looking for gluten free which has a protein found in a wheat.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peach preserve", "12 ounce (pack of 2)" ] }, "asin": "B00DYQ3Z5E" }, { "task_id": "ws_B09RWJWH4V_4314", "instruction": "find me the large loose fit towmus mens polo t shirt.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "large" ] }, "asin": "B09RWJWH4V" }, { "task_id": "ws_B00J2APBZI_4315", "instruction": "i want a oil-free concealer for dark circles for medium color.", "target_attributes": { "attributes": [ "oil free", "dark circles" ], "options": [ "medium | deep" ] }, "asin": "B00J2APBZI" }, { "task_id": "ws_B08MDH6DPS_4316", "instruction": "i'd like to find a four-pack of low-carb chocolate chip cookies.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "chocolate chip", "4 pack" ] }, "asin": "B08MDH6DPS" }, { "task_id": "ws_B08QCY2B72_4317", "instruction": "i want a power inverter with dual ac outlets and usb for my car. it should be 900 watts.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "900watt" ] }, "asin": "B08QCY2B72" }, { "task_id": "ws_B09QQL392H_4318", "instruction": "i need some purple polyester robes.", "target_attributes": { "attributes": [ "elastic waist", "polyester spandex" ], "options": [ "2 purple" ] }, "asin": "B09QQL392H" }, { "task_id": "ws_B09534QLNF_4319", "instruction": "i need a steel framed dining set with a black and blue coating.", "target_attributes": { "attributes": [ "coated steel", "steel frame" ], "options": [ "black and blue" ] }, "asin": "B09534QLNF" }, { "task_id": "ws_B07MS8XZPH_4320", "instruction": "i'm looking for a waterproof hiking sandals with arch support. also, choose the red color in a size 6.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "red-2", "6" ] }, "asin": "B07MS8XZPH" }, { "task_id": "ws_B07MS8XZPH_4321", "instruction": "i need an anti slip pair of sandals with arch support. pick something in purple, grey or green.", "target_attributes": { "attributes": [ "anti slip", "arch support" ], "options": [ "purple grey green" ] }, "asin": "B07MS8XZPH" }, { "task_id": "ws_B00CBM1EYG_4322", "instruction": "i want to find some bpa-free bottles of strawberry flavored emulsion extract. please find a package of six 4-ounce bottles.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "strawberry", "4 ounce, 6 pack" ] }, "asin": "B00CBM1EYG" }, { "task_id": "ws_B00CBM1EYG_4323", "instruction": "i would like a 16 fluid ounce rum imitation extract that is bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "rum", "16 fl oz." ] }, "asin": "B00CBM1EYG" }, { "task_id": "ws_B09NN95T7F_4324", "instruction": "i need a bundle of red shower caps that are used for hair treatment.", "target_attributes": { "attributes": [ "hair treatment" ], "options": [ "red" ] }, "asin": "B09NN95T7F" }, { "task_id": "ws_B096LRK34W_4325", "instruction": "i want to find a black xx-large men's jean jacket that i can throw in the washing machine.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "black 3106", "xx-large" ] }, "asin": "B096LRK34W" }, { "task_id": "ws_B08NHBJP12_4326", "instruction": "i'm looking for non gmo kettle corn in the flavors of dark chocolate, marshmallow, and frosted sugar cookie. also, choose the set of three", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "chocolate-covered raspberry & dark choco...", "3 piece assortment" ] }, "asin": "B08NHBJP12" }, { "task_id": "ws_B09LCQZZG4_4327", "instruction": "i need some compact space saving bookcases.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B09LCQZZG4" }, { "task_id": "ws_B07PNRXGZ8_4328", "instruction": "i'm interested in a lightweight, easy to carry background for digital photography that is 9 x 6 feet.", "target_attributes": { "attributes": [ "light weight", "easy carry", "digital photography" ], "options": [ "9x6ft" ] }, "asin": "B07PNRXGZ8" }, { "task_id": "ws_B07V3HC86K_4329", "instruction": "i want a super soft, yellow rug for the living room area.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "yellow" ] }, "asin": "B07V3HC86K" }, { "task_id": "ws_B07SKCDWB1_4330", "instruction": "i'm looking for a tempered glass iphone 11 screen protector", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B07SKCDWB1" }, { "task_id": "ws_B09CYTXQPQ_4331", "instruction": "large size white colored 1/4 zip golf shirt long sleeve athletic pullover with brushed fleece lining", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09CYTXQPQ" }, { "task_id": "ws_B081H93CSY_4332", "instruction": "i am looking for dukal toothpastes of size :2.75 ounce |144 pack with oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "2.75 ounce | 144 pack." ] }, "asin": "B081H93CSY" }, { "task_id": "ws_B08NR5SJSW_4333", "instruction": "i need a face mask for dead skin removal with a peppermint scent.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "peppermint" ] }, "asin": "B08NR5SJSW" }, { "task_id": "ws_B08TZZP8MN_4334", "instruction": "i'm looking for an extra large boxer briefs with customizable multi face prints. choose the machine washable ones.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "multi face", "x-large" ] }, "asin": "B08TZZP8MN" }, { "task_id": "ws_B08L4C63YF_4335", "instruction": "i want to find a women's gift set that contains long-lasting edt spray and body cream.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B08L4C63YF" }, { "task_id": "ws_B09MMWY57X_4336", "instruction": "large size black 44410 color snowflake graphic flowy vintage loose tunic tops for women", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09MMWY57X" }, { "task_id": "ws_B00S560WPE_4337", "instruction": "i need a dermatologist tested moisturizer with a buttercream scent.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "buttercream 03" ] }, "asin": "B00S560WPE" }, { "task_id": "ws_B08QV6FVNP_4338", "instruction": "i need some grey living room pillow covers.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey 2 | linen band" ] }, "asin": "B08QV6FVNP" }, { "task_id": "ws_B0014C2NKS_4339", "instruction": "i want some vinyl acetate clogs in women's size 8.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "8 women | 7 men" ] }, "asin": "B0014C2NKS" }, { "task_id": "ws_B07PX8S57X_4340", "instruction": "i am looking lightweight backgrounds for my digital photography that has 15x10ft size", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "15x10ft" ] }, "asin": "B07PX8S57X" }, { "task_id": "ws_B08TVSCDKC_4341", "instruction": "find me a heavy duty wall plate that is 1-gang blank style.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "1-gang blank" ] }, "asin": "B08TVSCDKC" }, { "task_id": "ws_B007TDNS3M_4342", "instruction": "i'm interested in a pair of rubber-soled, non-slip snakeskin shoes in a size medium.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "snakeskin (black | silver)", "medium (6.5 - 8)" ] }, "asin": "B007TDNS3M" }, { "task_id": "ws_B00KYOMIDY_4343", "instruction": "i'm looking for a pair of navy pants for men in a size 36w x 34l for daily wear made from a polyester-cotton blend.", "target_attributes": { "attributes": [ "polyester cotton", "daily wear" ], "options": [ "navy", "36w x 34l" ] }, "asin": "B00KYOMIDY" }, { "task_id": "ws_B09CSTXGQ5_4344", "instruction": "i want 50g of green brew edible glitter in bronze. it must be nut and dairy free.", "target_attributes": { "attributes": [ "nut free", "dairy free" ], "options": [ "bronze", "50g" ] }, "asin": "B09CSTXGQ5" }, { "task_id": "ws_B09CSTXGQ5_4345", "instruction": "i want a nut free brew glitter in the maroon red color.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "maroon red" ] }, "asin": "B09CSTXGQ5" }, { "task_id": "ws_B09KTYCG98_4346", "instruction": "i am looking for an easy to assemble sofa with metal legs and preferably grey in color.", "target_attributes": { "attributes": [ "easy assemble", "metal legs" ], "options": [ "grey" ] }, "asin": "B09KTYCG98" }, { "task_id": "ws_B08PCNXQJH_4347", "instruction": "i want the n!ck's swedish chocolate variety pack ice cream but i want the bakery flavor. it must be keto friendly.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "bakery" ] }, "asin": "B08PCNXQJH" }, { "task_id": "ws_B07XS6W35B_4348", "instruction": "i want to find 0.9 ounce packets of old-fashioned, harvest raspberry flavored oatmeal. they should come in a pack of 8.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "harvest raspberry", "0.9 ounce (pack of 8)" ] }, "asin": "B07XS6W35B" }, { "task_id": "ws_B081KWP6N5_4349", "instruction": "i want to find a hand-crafted care package box filled with the best meats, cheeses and savory snacks.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B081KWP6N5" }, { "task_id": "ws_B09DGG7H6H_4350", "instruction": "i need a clear glass wall mounting lamp for my bath room. and i would prefer 2-light size", "target_attributes": { "attributes": [ "clear glass" ], "options": [ "2-light" ] }, "asin": "B09DGG7H6H" }, { "task_id": "ws_B09P8HZ15L_4351", "instruction": "please help me find a monocular telescope with good high power and zoom. it needs to work at night for bird watching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B09P8HZ15L" }, { "task_id": "ws_B08TVWK24W_4352", "instruction": "i need heavy duty electrical outlets with high gloss.", "target_attributes": { "attributes": [ "heavy duty", "high gloss" ], "options": [ "outlet" ] }, "asin": "B08TVWK24W" }, { "task_id": "ws_B01N6MGRFE_4353", "instruction": "i want to find a pair of dark gray, slip resistant women's work shoes. i wear a size 9.5, usually.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "dark gray" ] }, "asin": "B01N6MGRFE" }, { "task_id": "ws_B07C9JMLWL_4354", "instruction": "i want to get some lemon sesame and ginger tuna salad that is wild caught.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "lemon sesame & ginger" ] }, "asin": "B07C9JMLWL" }, { "task_id": "ws_B08V4WTKGK_4355", "instruction": "i'm looking for a blu-ray and dvd player in ultra hd.", "target_attributes": { "attributes": [ "blu ray", "ultra hd" ], "options": [] }, "asin": "B08V4WTKGK" }, { "task_id": "ws_B09SV1V24L_4356", "instruction": "i'm looking for a hair growth serum designed to combat hair loss and repair damaged hair.", "target_attributes": { "attributes": [ "hair growth", "damaged hair", "hair loss" ], "options": [] }, "asin": "B09SV1V24L" }, { "task_id": "ws_B09QS66QTZ_4357", "instruction": "i'm looking for some mid-century style grey chairs.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "grey" ] }, "asin": "B09QS66QTZ" }, { "task_id": "ws_B08KRW147K_4358", "instruction": "i want to find a camel-colored tissue box cover that is made of pu leather.", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "camel" ] }, "asin": "B08KRW147K" }, { "task_id": "ws_B09R9M7B76_4359", "instruction": "i'm looking for dark gray button down short-sleeve shirts.", "target_attributes": { "attributes": [ "short sleeve", "everyday wear" ], "options": [ "a-dark gray" ] }, "asin": "B09R9M7B76" }, { "task_id": "ws_B09NY9TVQJ_4360", "instruction": "i'm looking for teeth cleansing toothpaste which is idol for fresh breath,stain removal and longlasting. i need 2pcs in purple color.", "target_attributes": { "attributes": [ "long lasting", "fresh breath" ], "options": [ "2pcs purple" ] }, "asin": "B09NY9TVQJ" }, { "task_id": "ws_B09NSSG2GG_4361", "instruction": "looking for a very powerful range extender antenna with high performance.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B09NSSG2GG" }, { "task_id": "ws_B0987XMJMF_4362", "instruction": "i need some non-slip black walking shoes in the color black and size 7.5 for women.", "target_attributes": { "attributes": [ "non slip", "teen girls" ], "options": [ "black", "7.5" ] }, "asin": "B0987XMJMF" }, { "task_id": "ws_B01A87UAF4_4363", "instruction": "i need a gift basket for welcoming.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "welcome cottage gift box" ] }, "asin": "B01A87UAF4" }, { "task_id": "ws_B01A87UAF4_4364", "instruction": "i am looking for a gift basket of candy & chocolate gifts. also, choose the welcome cottage gift box.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "welcome cottage gift box" ] }, "asin": "B01A87UAF4" }, { "task_id": "ws_B077NXMB8B_4365", "instruction": "you need to come up with an instruction for a virtual shopping assistant (ai with human-level smartness) to buy a product on amazon. you will be given a product's title along with some of its background information, such as the product's tags, buying options, and its category on the amazon website. you need write an instruction that tells a virtual assistant what you want to buy. include at least one tag in your instruction. when suitable, more tags is better. include at least one buying option in your instruction. check the tag boxes that you included in the instruction. avoid including too much information from \"product title\". this is only to provide a better context (see example page). a good instruction should allow the ai assistant to find the intended product. the instruction should be natural sounding text. imagine you are talking to a smart ai. diversify language use when viable.", "target_attributes": { "attributes": [ "tummy control", "gym workout" ], "options": [ "spacedye mattblack", "large" ] }, "asin": "B077NXMB8B" }, { "task_id": "ws_B01K5BFFQW_4366", "instruction": "i need some fresh baked rye.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [] }, "asin": "B01K5BFFQW" }, { "task_id": "ws_B099S9VLGN_4367", "instruction": "i want buy a string backpack with small woman kids travel bag", "target_attributes": { "attributes": [ "high quality" ], "options": [ "elephant sunflower" ] }, "asin": "B099S9VLGN" }, { "task_id": "ws_B00UJGXSDG_4368", "instruction": "i am looking for 9'x 12' size modern ombre that fits for my living room. and i would prefer the purple one", "target_attributes": { "attributes": [ "living room" ], "options": [ "cream | purple", "9' x 12'" ] }, "asin": "B00UJGXSDG" }, { "task_id": "ws_B007XAHUHQ_4369", "instruction": "i want to get some satin nickel wall sconces that are 40 inches in width. they also need to have a bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "satin nickel", "40\" width" ] }, "asin": "B007XAHUHQ" }, { "task_id": "ws_B007XAHUHQ_4370", "instruction": "this brand eurofase 23271-036 zuma frosted tube glass with cast metal frame sconce wall mount lighting, 2-light 80 total watts, 13\"h x 5\"w, bronze finish for my living room, help me", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "5\" width" ] }, "asin": "B007XAHUHQ" }, { "task_id": "ws_B073GJN22W_4371", "instruction": "i need a 9 channel power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "9 ch." ] }, "asin": "B073GJN22W" }, { "task_id": "ws_B0868PWFRR_4372", "instruction": "i need a lorex ultra hd indoor wired dvr security camera system with motion detection", "target_attributes": { "attributes": [ "ultra hd", "motion detection" ], "options": [] }, "asin": "B0868PWFRR" }, { "task_id": "ws_B08BF8TLFN_4373", "instruction": "i need some straight legged levi jeans in big and tall, with a button and not a zipper.", "target_attributes": { "attributes": [ "straight leg", "button closure" ], "options": [ "the ben big & tall" ] }, "asin": "B08BF8TLFN" }, { "task_id": "ws_B08BF8TLFN_4374", "instruction": "i would like a pair of 58 w and 32 long dark stonewash straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "dark stonewash (waterless)", "58w x 32l" ] }, "asin": "B08BF8TLFN" }, { "task_id": "ws_B093YT9DVH_4375", "instruction": "two wolf bags one large and one small bra and panty set jeans white blouse and a zipper jacket", "target_attributes": { "attributes": [ "imported zipper" ], "options": [] }, "asin": "B093YT9DVH" }, { "task_id": "ws_B01MYX0CPW_4376", "instruction": "i'm looking for a large package of micro applicator brushes that has it's own storage case and comes in purple, blue, pink, and white.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "purple+blue+pink+white (400pcs)" ] }, "asin": "B01MYX0CPW" }, { "task_id": "ws_B08QHX6692_4377", "instruction": "i'm looking for a pair of women's workout shorts with a drawstring waist. i need them to be extra large and in light gray.", "target_attributes": { "attributes": [ "drawstring waist" ], "options": [ "light grey", "x-large" ] }, "asin": "B08QHX6692" }, { "task_id": "ws_B07QPVJKYR_4378", "instruction": "i want to find strawberry mango fruit spread that's fat free.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "strawberry mango" ] }, "asin": "B07QPVJKYR" }, { "task_id": "ws_B08JBMFCXC_4379", "instruction": "find me a dual band signal booster.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B08JBMFCXC" }, { "task_id": "ws_B09P13MCCQ_4380", "instruction": "i need a light weight photo studio wall prop in 100 square feet for a high resolution image.", "target_attributes": { "attributes": [ "light weight", "high resolution" ], "options": [ "10x10ft | 3x3m" ] }, "asin": "B09P13MCCQ" }, { "task_id": "ws_B08CBVV28M_4381", "instruction": "i'd love help finding a square ottoman coffee table made of solid wood. it should come in gray.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey-pu square ottoman", "square ottoman with casters" ] }, "asin": "B08CBVV28M" }, { "task_id": "ws_B01FRGFOHK_4382", "instruction": "i'm looking for coconut oil body butters.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [] }, "asin": "B01FRGFOHK" }, { "task_id": "ws_B085YFRM74_4383", "instruction": "i'm trying to find white bluetooth speakers that are not only water resistant but also come with stereo sound.", "target_attributes": { "attributes": [ "water resistant", "stereo sound" ], "options": [ "white" ] }, "asin": "B085YFRM74" }, { "task_id": "ws_B094JH14C9_4384", "instruction": "i'm looking for a teal blue watch band that's easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "teal blue" ] }, "asin": "B094JH14C9" }, { "task_id": "ws_B095C9YLM2_4385", "instruction": "i'm looking for some high heeled sandals in size 9. also, in the color red.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "#07-red", "9" ] }, "asin": "B095C9YLM2" }, { "task_id": "ws_B011M8UDA0_4386", "instruction": "i am looking for an exfoliating and soothing skin cream for keratosis pilaris and would like a two pack of four oz containers", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "two pack" ] }, "asin": "B011M8UDA0" }, { "task_id": "ws_B08LGK3SXL_4387", "instruction": "i'm hoping to find a stainless steel set of wireless headphones that comes with a carrying case. ideally the metal on the headphones should be black and the leather should be olive colored.", "target_attributes": { "attributes": [ "carrying case", "stainless steel" ], "options": [ "black metal | olive leather" ] }, "asin": "B08LGK3SXL" }, { "task_id": "ws_B003RWVFEI_4388", "instruction": "i'm searching for canned skinless and boneless pink salmon which is ready to eat. also, i want sweet and spicy flavor.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "sweet & spicy" ] }, "asin": "B003RWVFEI" }, { "task_id": "ws_B0924JK3Z6_4389", "instruction": "i need some open toe women's sandals in size 10.5.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "10.5" ] }, "asin": "B0924JK3Z6" }, { "task_id": "ws_B0749QT7GQ_4390", "instruction": "i am looking for a gluten free almond flour with 32 ounce (pack of 4)", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "32 ounce (pack of 4)" ] }, "asin": "B0749QT7GQ" }, { "task_id": "ws_B08YCWF272_4391", "instruction": "i want to find a signal booster for my 4g lte phone, and it needs to have a dual-band cell signal repeater.", "target_attributes": { "attributes": [ "dual band", "4g lte" ], "options": [] }, "asin": "B08YCWF272" }, { "task_id": "ws_B09M6S8GNB_4392", "instruction": "i'm hoping to find a 4g lte tablet that i can use for my work.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09M6S8GNB" }, { "task_id": "ws_B088T8FWSJ_4393", "instruction": "i need a super soft throw pillow in coral for my living room.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "coral" ] }, "asin": "B088T8FWSJ" }, { "task_id": "ws_B07QC3KYRN_4394", "instruction": "i need a modern wall mount for light led in bronze with a 36\" wide.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "36\" wide" ] }, "asin": "B07QC3KYRN" }, { "task_id": "ws_B07C39RCNZ_4395", "instruction": "i\u2019m looking for a dht blocking anti hair loss set with hyaluronic acid as pure hair growth support shampoo", "target_attributes": { "attributes": [ "hyaluronic acid", "hair growth" ], "options": [] }, "asin": "B07C39RCNZ" }, { "task_id": "ws_B08BCGZC4M_4396", "instruction": "i need a long high speed and aluminum alloy usb 3.0 extension cable of male-male style and 3.3ft long size", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B08BCGZC4M" }, { "task_id": "ws_B084LHV2M1_4397", "instruction": "i need an oil and paraben free shampoo for my hair. it should be 29.2 fluid ounces in size.", "target_attributes": { "attributes": [ "oil free", "paraben free" ], "options": [] }, "asin": "B084LHV2M1" }, { "task_id": "ws_B07QC96VV9_4398", "instruction": "blue color velvet upholstered suitable for large living room.", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [] }, "asin": "B07QC96VV9" }, { "task_id": "ws_B08LVXD5Z3_4399", "instruction": "i want to find a gray twin-sized daybed with a trundle made out of solid wood.", "target_attributes": { "attributes": [ "twin size", "solid wood" ], "options": [ "grey", "with trundle" ] }, "asin": "B08LVXD5Z3" }, { "task_id": "ws_B000XESVO0_4400", "instruction": "i need a black, rubber sole workboot in size 11.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black", "11.5" ] }, "asin": "B000XESVO0" }, { "task_id": "ws_B005LURBFQ_4401", "instruction": "get me sugar free water drink mix. i like half iced tea and half lemonade flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "half iced tea | half lemonade" ] }, "asin": "B005LURBFQ" }, { "task_id": "ws_B092M6NZNS_4402", "instruction": "i'd like to find aa batteries that are fast-charging and compatible with my xbox controller.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "aa battery" ] }, "asin": "B092M6NZNS" }, { "task_id": "ws_B07NSWJ1G7_4403", "instruction": "i want a size 6 donna morgan women's knotted crepe sheath dress that is machine washable. i want it in viridian green.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "viridian green", "6" ] }, "asin": "B07NSWJ1G7" }, { "task_id": "ws_B09J2WGRHW_4404", "instruction": "i want to find a long-lasting tempered glass phone screen protector that i can use. the color needs to be liquid purple and blue.", "target_attributes": { "attributes": [ "long lasting", "glass screen", "tempered glass" ], "options": [ "ring liquid purple | blue" ] }, "asin": "B09J2WGRHW" }, { "task_id": "ws_B096M1D621_4405", "instruction": "i want to buy a gray a gray color daybed in twin size with a wooden frame.", "target_attributes": { "attributes": [ "twin size", "wood frame" ], "options": [ "grey" ] }, "asin": "B096M1D621" }, { "task_id": "ws_B0966CMX16_4406", "instruction": "i'm looking for some temporary hair chalk for my teenage niece; it should be easy to apply to dry hair.", "target_attributes": { "attributes": [ "easy apply", "dry hair" ], "options": [] }, "asin": "B0966CMX16" }, { "task_id": "ws_B073JC1M93_4407", "instruction": "i'd like to find a large, navy-colored women's skater dress that's machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "navy", "large" ] }, "asin": "B073JC1M93" }, { "task_id": "ws_B09CLHRQGW_4408", "instruction": "find an electric spa body brush with a long handle that comes in stainless steel for me please", "target_attributes": { "attributes": [ "long handle", "stainless steel" ], "options": [] }, "asin": "B09CLHRQGW" }, { "task_id": "ws_B08DTQ7YZM_4409", "instruction": "i need a digital photography background that is lightweight, easy to carry, and 8 by 6 feet in size.", "target_attributes": { "attributes": [ "light weight", "easy carry", "digital photography" ], "options": [ "8x6ft" ] }, "asin": "B08DTQ7YZM" }, { "task_id": "ws_B07MZ2W5T7_4410", "instruction": "i want to find a 7x5 foot underwater world backdrop that's high resolution and also lightweight.", "target_attributes": { "attributes": [ "light weight", "high resolution" ], "options": [ "7x5ft" ] }, "asin": "B07MZ2W5T7" }, { "task_id": "ws_B07VMYLG81_4411", "instruction": "i want to find snickerdoodle cookie bites that are dairy free and low carb.", "target_attributes": { "attributes": [ "low carb", "dairy free" ], "options": [ "snickerdoodle" ] }, "asin": "B07VMYLG81" }, { "task_id": "ws_B08ZMKVT1N_4412", "instruction": "i need a motion-activated black bullet camera in 1080p hd.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [ "black" ] }, "asin": "B08ZMKVT1N" }, { "task_id": "ws_B0000WLVGU_4413", "instruction": "i want some navy blue straight leg pants.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "navy", "33w x 34l" ] }, "asin": "B0000WLVGU" }, { "task_id": "ws_B07H28D7J5_4414", "instruction": "i want to find a microdermabrasion machine that can treat sensitive dead skin.", "target_attributes": { "attributes": [ "dead skin", "sensitive skin" ], "options": [] }, "asin": "B07H28D7J5" }, { "task_id": "ws_B09QHLZVXG_4415", "instruction": "i am looking for cupcake toppers for a birthday party that are dino shaped.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "dino cake topper-3" ] }, "asin": "B09QHLZVXG" }, { "task_id": "ws_B092ZL4VTQ_4416", "instruction": "i need to buy a toothbrush travel container. make sure it's easy to clean and buy color five.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "5" ] }, "asin": "B092ZL4VTQ" }, { "task_id": "ws_B09PV3KH7J_4417", "instruction": "i am looking for a high resolution natural scenery.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "7x5ft | 2.1x1.5m" ] }, "asin": "B09PV3KH7J" }, { "task_id": "ws_B07D8X7VNM_4418", "instruction": "i'm looking for a size 14.9 ounce wabry organic syrup", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "14.9 ounce (pack of 4)" ] }, "asin": "B07D8X7VNM" }, { "task_id": "ws_B00NCCSIRK_4419", "instruction": "i need to buy some decaffeinated lavender tea.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "lavender" ] }, "asin": "B00NCCSIRK" }, { "task_id": "ws_B00NCCSIRK_4420", "instruction": "i am looking for a certified organic herbal tea which has a rose flavor.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "rose" ] }, "asin": "B00NCCSIRK" }, { "task_id": "ws_B09DP9C125_4421", "instruction": "need one toothbrush holder easy to clean and non toxic in white", "target_attributes": { "attributes": [ "non toxic", "easy clean" ], "options": [ "w" ] }, "asin": "B09DP9C125" }, { "task_id": "ws_B01GV0PR0A_4422", "instruction": "i need a black yaheetech home office computer desk that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "black" ] }, "asin": "B01GV0PR0A" }, { "task_id": "ws_B08DJ5VY8V_4423", "instruction": "i am interested in the travel sized version of gucci bamboo impression.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "gucci bamboo impression" ] }, "asin": "B08DJ5VY8V" }, { "task_id": "ws_B08DJ5VY8V_4424", "instruction": "i'm looking travel size alcohol free fragrance body oil which should be long lasting. also choose chanel coco impression one.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "long lasting" ], "options": [ "chanel coco impression" ] }, "asin": "B08DJ5VY8V" }, { "task_id": "ws_B08DJ7LBNR_4425", "instruction": "i am interested in a travel sized bottle of kilian good girl gone bad.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "by kilian good girl gone bad impression" ] }, "asin": "B08DJ7LBNR" }, { "task_id": "ws_B08DJ7LBNR_4426", "instruction": "i am looking for alcohol free women versace dreamer impression scent.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "versace dreamer impression" ] }, "asin": "B08DJ7LBNR" }, { "task_id": "ws_B08DJ7LBNR_4427", "instruction": "i am looking for a travel sized bottle of jean paul gaultier scandal impression perfume.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "jean paul gaultier scandal impression" ] }, "asin": "B08DJ7LBNR" }, { "task_id": "ws_B08YR79P5T_4428", "instruction": "i am looking for a women's short sleeve honey bee t shirt size x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "x-large" ] }, "asin": "B08YR79P5T" }, { "task_id": "ws_B09P14213F_4429", "instruction": "i am looking for a lightweight photography background in a size 10ft by 7ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "10x7ft | 3x2.2m" ] }, "asin": "B09P14213F" }, { "task_id": "ws_B09P14213F_4430", "instruction": "i am looking for loght weight photography background.size should be 10x7 ft", "target_attributes": { "attributes": [ "light weight" ], "options": [ "10x7ft | 3x2.2m" ] }, "asin": "B09P14213F" }, { "task_id": "ws_B09P14213F_4431", "instruction": "i need a lightweight background for the photo studio that is 10 by 7 ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "10x7ft | 3x2.2m" ] }, "asin": "B09P14213F" }, { "task_id": "ws_B09BBM1CLR_4432", "instruction": "i want to get an 8 fluid ounce pack of 24 sweet and sour margarita and daquiri mix packets made with only natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "sweet & sour", "8 fl oz (pack of 24)" ] }, "asin": "B09BBM1CLR" }, { "task_id": "ws_B098NRMH19_4433", "instruction": "i want rose gold cupcake picks that say we will miss you for a retirement party i'm throwing.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "rose gold" ] }, "asin": "B098NRMH19" }, { "task_id": "ws_B00VGMLHY4_4434", "instruction": "i would like a chocolate gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B00VGMLHY4" }, { "task_id": "ws_B08M3SGYDQ_4435", "instruction": "i need to buy an iphone case in midnight grey. make sure it supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "midnight grey" ] }, "asin": "B08M3SGYDQ" }, { "task_id": "ws_B09HQ6BYK8_4436", "instruction": "i would like some soft drink mixes that have low sugar.", "target_attributes": { "attributes": [ "low sugar" ], "options": [] }, "asin": "B09HQ6BYK8" }, { "task_id": "ws_B0756ZYS4D_4437", "instruction": "i would like a size 7 narrow non slip sneaker with a storm blue snake color.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "storm blue snake", "7 narrow" ] }, "asin": "B0756ZYS4D" }, { "task_id": "ws_B097QRTLBJ_4438", "instruction": "i want a multicolor spandex top for summer.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "d3-multicolor" ] }, "asin": "B097QRTLBJ" }, { "task_id": "ws_B07FZ6XX2T_4439", "instruction": "i am looking for caffeine free coconut almond flavored carob bars.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "coconut almond" ] }, "asin": "B07FZ6XX2T" }, { "task_id": "ws_B07FZ6XX2T_4440", "instruction": "i am looking for caffeine free and gluten free chocolate. please choose peanut butter flavor.", "target_attributes": { "attributes": [ "caffeine free", "gluten free" ], "options": [ "peanut butter" ] }, "asin": "B07FZ6XX2T" }, { "task_id": "ws_B09R7QWXB5_4441", "instruction": "i want to find an extra-large black women's blouse that is loose-fitting.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "a02 fashion 2022 loose fit tops black", "x-large" ] }, "asin": "B09R7QWXB5" }, { "task_id": "ws_B08D9MGFN3_4442", "instruction": "i want to find 8 ounces of instant coffee sticks that are easy to prepare. they must come with 12 sticks in a box.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "g7 3 in 1", "8oz (12 sticks | box)" ] }, "asin": "B08D9MGFN3" }, { "task_id": "ws_B08D9MGFN3_4443", "instruction": "i am looking for 14 oz (200 sachets) strong and pure easy prepare coffee of cappucino hazelnut color", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "cappucino hazelnut", "14 oz (200 sachets | bag)" ] }, "asin": "B08D9MGFN3" }, { "task_id": "ws_B08D9MGFN3_4444", "instruction": "i am looking for some special edition instant coffee that is easy to prepare and has 12 sticks.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "special edition", "8oz (12 sticks | box)" ] }, "asin": "B08D9MGFN3" }, { "task_id": "ws_B08D9MGFN3_4445", "instruction": "i am looking for cappucino coconut and low sugar instant coffee for energy boost", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "cappucino coconut" ] }, "asin": "B08D9MGFN3" }, { "task_id": "ws_B08B1M9D96_4446", "instruction": "i am looking for khaki color summer pants for women that can be washed by hands.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "khaki" ] }, "asin": "B08B1M9D96" }, { "task_id": "ws_B09BZ3DTPS_4447", "instruction": "i'm looking for size ten ladies shoes with a closed toe and leather soles.", "target_attributes": { "attributes": [ "leather sole", "closed toe" ], "options": [ "10" ] }, "asin": "B09BZ3DTPS" }, { "task_id": "ws_B000IDV3UA_4448", "instruction": "i am looking for a nickel finished one light wall sconce.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "1 light" ] }, "asin": "B000IDV3UA" }, { "task_id": "ws_B01ERGEB34_4449", "instruction": "i would like a 3.4 oz dry shampoo that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "dry shampoo - fl oz 3.4" ] }, "asin": "B01ERGEB34" }, { "task_id": "ws_B000QSPX4O_4450", "instruction": "buy some baby food. make sure it's certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [] }, "asin": "B000QSPX4O" }, { "task_id": "ws_B098SKK3BX_4451", "instruction": "buy me a black flip case for my phone with a glass screen.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "black" ] }, "asin": "B098SKK3BX" }, { "task_id": "ws_B00KL19J4Q_4452", "instruction": "i would like a 100 count friends bunny grahams party mix with simple ingredients.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "friends bunny grahams", "100 count (pack of 1)" ] }, "asin": "B00KL19J4Q" }, { "task_id": "ws_B082257WQ6_4453", "instruction": "i want a 12 ounce bag of gluten free pecan flavored ground coffee.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12 ounce" ] }, "asin": "B082257WQ6" }, { "task_id": "ws_B08L796942_4454", "instruction": "i want to get a grey wireless headset with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "grey" ] }, "asin": "B08L796942" }, { "task_id": "ws_B07M8JT8PZ_4455", "instruction": "i'm looking for a 12-count box of european cookies in holiday flavors that i can give as a valentine's day gift.", "target_attributes": { "attributes": [ "valentine day", "great gift", "perfect gift" ], "options": [ "holiday flavors", "box of 12" ] }, "asin": "B07M8JT8PZ" }, { "task_id": "ws_B09QHZDXRT_4456", "instruction": "i am looking for pink cake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pink" ] }, "asin": "B09QHZDXRT" }, { "task_id": "ws_B00DY2TG7E_4457", "instruction": "i'm looking for a pair of mens sneakers with a synthetic sole, i'm a size 7 and a half.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "7.5" ] }, "asin": "B00DY2TG7E" }, { "task_id": "ws_B07GDH89Y3_4458", "instruction": "i want to find a wireless bluetooth sound bar featuring blu ray.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B07GDH89Y3" }, { "task_id": "ws_B07GDH89Y3_4459", "instruction": "i am looking for a power cord for a blu ray player with output protection.", "target_attributes": { "attributes": [ "output protection", "blu ray" ], "options": [] }, "asin": "B07GDH89Y3" }, { "task_id": "ws_B07H2LG414_4460", "instruction": "i am looking for a certified refurbished intel core mini desktop computer with windows 10 pro.", "target_attributes": { "attributes": [ "certified refurbished", "intel core" ], "options": [] }, "asin": "B07H2LG414" }, { "task_id": "ws_B09N74SXQZ_4461", "instruction": "i am interested in a high quality cosmetic bag.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "bonus daughter gifts makeup bag" ] }, "asin": "B09N74SXQZ" }, { "task_id": "ws_B0895X475B_4462", "instruction": "looking for hiking shoes non slip and waterproof in orange size 7.5", "target_attributes": { "attributes": [ "non slip" ], "options": [ "orange", "7.5" ] }, "asin": "B0895X475B" }, { "task_id": "ws_B07JKX54RT_4463", "instruction": "need a mini computer with a intel core 5 4200u, 8gb ram, 64g ssd", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "i5 4200u", "8g ram 64g ssd" ] }, "asin": "B07JKX54RT" }, { "task_id": "ws_B07R6W51S5_4464", "instruction": "i am interested in a dual colored headset that is noise cancelling.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "duo 510dsp" ] }, "asin": "B07R6W51S5" }, { "task_id": "ws_B096FPCTYS_4465", "instruction": "i am looking for black 18th birthday cake toppers.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "black" ] }, "asin": "B096FPCTYS" }, { "task_id": "ws_B096FPCTYS_4466", "instruction": "i want pink 18th birthday cake toppers.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "pink" ] }, "asin": "B096FPCTYS" }, { "task_id": "ws_B07NPM7BMS_4467", "instruction": "i need a grey square shaped rug that is 2'3\" x 18' for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey | silver", "square", "2'3\" x 18'" ] }, "asin": "B07NPM7BMS" }, { "task_id": "ws_B004989EGK_4468", "instruction": "i want a 36 pack of applesauce that is non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "apple", "3.2 ounce (pack of 36)" ] }, "asin": "B004989EGK" }, { "task_id": "ws_B07GWDXWRH_4469", "instruction": "i night some light tan anti-aging cream for dark circles under my eyes.", "target_attributes": { "attributes": [ "anti aging", "dark circles" ], "options": [ "14.0 light tan (w)" ] }, "asin": "B07GWDXWRH" }, { "task_id": "ws_B08R3KFFMW_4470", "instruction": "i want to find a heavy duty writing table that has a steel coating.", "target_attributes": { "attributes": [ "heavy duty", "coated steel" ], "options": [] }, "asin": "B08R3KFFMW" }, { "task_id": "ws_B09K49DTTZ_4471", "instruction": "i need a loose fit, long sleeved hoodie in green. buy the size medium.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "green", "medium" ] }, "asin": "B09K49DTTZ" }, { "task_id": "ws_B09KNFM2Q7_4472", "instruction": "i want blue faux leather 26\" watson & whitely bar stools.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "pu-blue" ] }, "asin": "B09KNFM2Q7" }, { "task_id": "ws_B07W4JWKXW_4473", "instruction": "do you have any old fashioned taffy that is sugar free in apple flavour?", "target_attributes": { "attributes": [ "old fashioned", "sugar free" ], "options": [ "apple" ] }, "asin": "B07W4JWKXW" }, { "task_id": "ws_B08C42HNN9_4474", "instruction": "i'm looking for eye serum for anti aging and clinically proven", "target_attributes": { "attributes": [ "anti aging", "clinically proven" ], "options": [] }, "asin": "B08C42HNN9" }, { "task_id": "ws_B08YY632H4_4475", "instruction": "get me a green iphone 12 case that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "midle green" ] }, "asin": "B08YY632H4" }, { "task_id": "ws_B093KMVLFG_4476", "instruction": "i am looking for 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KMVLFG" }, { "task_id": "ws_B008L532XI_4477", "instruction": "i would like a shampoo to help my dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [] }, "asin": "B008L532XI" }, { "task_id": "ws_B09F52WW6W_4478", "instruction": "i am looking for women's size 5.5 athletic sneakers with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5.5" ] }, "asin": "B09F52WW6W" }, { "task_id": "ws_B09F52WW6W_4479", "instruction": "i am looking for a pair of women's size 5 athletic sneakers with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5" ] }, "asin": "B09F52WW6W" }, { "task_id": "ws_B07SJB7T8M_4480", "instruction": "i would like some 16 inch hair extensions in color 60.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#60", "16 inch" ] }, "asin": "B07SJB7T8M" }, { "task_id": "ws_B086ST5T8J_4481", "instruction": "i need a beige or green shower brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "beige" ] }, "asin": "B086ST5T8J" }, { "task_id": "ws_B093CLC753_4482", "instruction": "can you find me 1 pack of low calorie wheat flour sandwich crackers that are lemon, chocolate, and cream cheese flavored?", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "lemon,chocolate,cream cheese", "1 pack" ] }, "asin": "B093CLC753" }, { "task_id": "ws_B078RQ51M8_4483", "instruction": "i need black dodoing curly messy hair bun extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "natural black" ] }, "asin": "B078RQ51M8" }, { "task_id": "ws_B07XHD17PB_4484", "instruction": "i am looking for a white mesh height adjustable drafting chair.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "white mesh" ] }, "asin": "B07XHD17PB" }, { "task_id": "ws_B077JH57XG_4485", "instruction": "i'm looking for a mens slipper that has a water resistant rubber outer sole. size thirteen and extra wide.", "target_attributes": { "attributes": [ "water resistant", "rubber sole" ], "options": [ "13 x-wide" ] }, "asin": "B077JH57XG" }, { "task_id": "ws_B098LDD49Z_4486", "instruction": "i am looking for a women's short sleeve playsuit size medium.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "medium" ] }, "asin": "B098LDD49Z" }, { "task_id": "ws_B07ZFBMM45_4487", "instruction": "i want to buy the rattan wicker sofa set with machine washable burgandy cusions.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "burgundy" ] }, "asin": "B07ZFBMM45" }, { "task_id": "ws_B01GNFZ5H8_4488", "instruction": "i'd like to find a highly pigmented eyeshadow palette that is long-lasting. it needs to have a daring color.", "target_attributes": { "attributes": [ "highly pigmented", "long lasting" ], "options": [ "daring" ] }, "asin": "B01GNFZ5H8" }, { "task_id": "ws_B09MT3NH6Z_4489", "instruction": "i am looking for an apple watch compatible lavender grey silicone band with quick release.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "lavender grey" ] }, "asin": "B09MT3NH6Z" }, { "task_id": "ws_B076CKJ4YX_4490", "instruction": "i want gluten free classic chili chicharrones.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B076CKJ4YX" }, { "task_id": "ws_B07RQKXNHR_4491", "instruction": "i am interested in a high quality brush set.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B07RQKXNHR" }, { "task_id": "ws_B077D1BVHW_4492", "instruction": "i'm looking for throw pillow covers for the pillows for my living room, they should be super soft and about 22 by 22 inches.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "22 x 22 inchs" ] }, "asin": "B077D1BVHW" }, { "task_id": "ws_B074847M44_4493", "instruction": "i'm looking for a standard pair of straight legged jeans in noir heather.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "noir heather (waterless)", "standard" ] }, "asin": "B074847M44" }, { "task_id": "ws_B08JVJJD3T_4494", "instruction": "i would like some clinically proven power dental flossers.", "target_attributes": { "attributes": [ "clinically proven" ], "options": [] }, "asin": "B08JVJJD3T" }, { "task_id": "ws_B09HNKW6RN_4495", "instruction": "i am looking for a women's long sleeve sherpa fleece jacket.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "3x-large" ] }, "asin": "B09HNKW6RN" }, { "task_id": "ws_B08FC4RS18_4496", "instruction": "i would like four flatbreads from trader joes.", "target_attributes": { "attributes": [ "trader joe" ], "options": [ "4" ] }, "asin": "B08FC4RS18" }, { "task_id": "ws_B08FC4RS18_4497", "instruction": "i need 3 trader joe's gluten free crackers.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [ "3" ] }, "asin": "B08FC4RS18" }, { "task_id": "ws_B08FC4RS18_4498", "instruction": "i want to buy crackers which are gluten free and i want 2 of them.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "2" ] }, "asin": "B08FC4RS18" }, { "task_id": "ws_B01MZ2CH6O_4499", "instruction": "i am looking for fuchsia colored comfortable fit levi's bomber jacket for women.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "fuchsia" ] }, "asin": "B01MZ2CH6O" }, { "task_id": "ws_B00J1ZNSN6_4500", "instruction": "i would like plant based meatballs.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B00J1ZNSN6" }, { "task_id": "ws_B07D9LVGM8_4501", "instruction": "i want a regular fit dark green pair of adidas men's pro bounce shoes in size 14.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "dark green | white | active green", "14" ] }, "asin": "B07D9LVGM8" }, { "task_id": "ws_B09PFKP5DP_4502", "instruction": "i need brown eco friendly cenglings women slingback sandals in size 7.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "brown", "7" ] }, "asin": "B09PFKP5DP" }, { "task_id": "ws_B07S49NQQ5_4503", "instruction": "i'd like to buy some board shorts in size twenty-nine. get the ones with the button closure.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "29" ] }, "asin": "B07S49NQQ5" }, { "task_id": "ws_B097NGDB64_4504", "instruction": "i need a x-large machine washable men's evan scrub pant in ceil color.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "ceil", "x-large" ] }, "asin": "B097NGDB64" }, { "task_id": "ws_B097NGDB64_4505", "instruction": "i am interested in straight leg scrub buttoms in an x-large that are ceil colored", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "ceil", "x-large" ] }, "asin": "B097NGDB64" }, { "task_id": "ws_B08SJ9JM97_4506", "instruction": "i want to get a grey counter stool that is made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey" ] }, "asin": "B08SJ9JM97" }, { "task_id": "ws_B09MD3PZYS_4507", "instruction": "i want to find a glass screen protector for my high definition s20 samsung galaxy ultra.", "target_attributes": { "attributes": [ "high definition", "glass screen" ], "options": [ "hd s20 ultra screen protector" ] }, "asin": "B09MD3PZYS" }, { "task_id": "ws_B09Q8THWGR_4508", "instruction": "i would like a backdrop for digital photography that is 10 by 8 ft.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "10x8ft" ] }, "asin": "B09Q8THWGR" }, { "task_id": "ws_B09Q8THWGR_4509", "instruction": "i am looking for a 8x6ft backgrounds for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "8x6ft" ] }, "asin": "B09Q8THWGR" }, { "task_id": "ws_B07NB7SJ1Y_4510", "instruction": "i am looking for easy to use marula oil hydrating shampoo.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "marula oil hydrating shampoo" ] }, "asin": "B07NB7SJ1Y" }, { "task_id": "ws_B09SGJP3LP_4511", "instruction": "i'm looking for a slim-fit, short-sleeved, slim-fit men's compression t-shirt in i-silver.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "i-silver" ] }, "asin": "B09SGJP3LP" }, { "task_id": "ws_B085W5VF39_4512", "instruction": "i would like a brown wig made of natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "f-brown" ] }, "asin": "B085W5VF39" }, { "task_id": "ws_B09SBFH2NC_4513", "instruction": "i need new york style strawberry swirl cheesecake that is ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "new york style" ] }, "asin": "B09SBFH2NC" }, { "task_id": "ws_B01M34Z8YW_4514", "instruction": "buy me some paraben free coconut oil lip balm.", "target_attributes": { "attributes": [ "paraben free", "coconut oil" ], "options": [] }, "asin": "B01M34Z8YW" }, { "task_id": "ws_B09FJLKPDL_4515", "instruction": "i would like some blue non toxic bath brushes.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "blue" ] }, "asin": "B09FJLKPDL" }, { "task_id": "ws_B085VB9Y1V_4516", "instruction": "i need jane grey pink vanity fair women's nylon spandex hi cut panties in plus size 5.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "jane grey pink", "plus size", "5" ] }, "asin": "B085VB9Y1V" }, { "task_id": "ws_B07HJNBCX4_4517", "instruction": "i am interested in a memory foam queen sized mattress.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "queen" ] }, "asin": "B07HJNBCX4" }, { "task_id": "ws_B09N75GRYM_4518", "instruction": "i need to shop for a high performance tablet. i'd really like a blue one.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [ "blue" ] }, "asin": "B09N75GRYM" }, { "task_id": "ws_B07J2VD4XS_4519", "instruction": "i want to get a white wooden coat rack.", "target_attributes": { "attributes": [ "white item", "white finish" ], "options": [] }, "asin": "B07J2VD4XS" }, { "task_id": "ws_B09B1ZLZMH_4520", "instruction": "i want to find a dip powder kit for my nails that's easy to use. the color of the powder must be gentle nude.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "gentle nudes" ] }, "asin": "B09B1ZLZMH" }, { "task_id": "ws_B07WRV3NFX_4521", "instruction": "i am interested in a black shirt that is short sleeved.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "black on black", "small" ] }, "asin": "B07WRV3NFX" }, { "task_id": "ws_B09BV632MQ_4522", "instruction": "i am looking for a plug and play ps2 to hdmi converter adapter.", "target_attributes": { "attributes": [ "plug play" ], "options": [] }, "asin": "B09BV632MQ" }, { "task_id": "ws_B07JQ4T9N6_4523", "instruction": "i need a lightweight navy pullover in a large.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "navy", "large" ] }, "asin": "B07JQ4T9N6" }, { "task_id": "ws_B072WFY47F_4524", "instruction": "i am interested in wedges that are teal with memory foam in a size 9.5-10.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "teal", "9.5-10" ] }, "asin": "B072WFY47F" }, { "task_id": "ws_B093RJNQDM_4525", "instruction": "i want to find a high quality 5 pcs makeup brush set with the stitch 2 color theme", "target_attributes": { "attributes": [ "high quality" ], "options": [ "stitch 2" ] }, "asin": "B093RJNQDM" }, { "task_id": "ws_B001OC75GK_4526", "instruction": "i need to buy a four pack of fully assembled dining room chairs.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "4 pack" ] }, "asin": "B001OC75GK" }, { "task_id": "ws_B001OC75GK_4527", "instruction": "i am looking for heavy duty chair. please choose kelly red color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "distressed kelly red" ] }, "asin": "B001OC75GK" }, { "task_id": "ws_B004Q8TFJ4_4528", "instruction": "get me a heavy duty office chair with lumbar support. look for dillon black fabric.", "target_attributes": { "attributes": [ "heavy duty", "lumbar support" ], "options": [ "dillon black fabric" ] }, "asin": "B004Q8TFJ4" }, { "task_id": "ws_B08XZ31PVL_4529", "instruction": "i'm looking for a portable beauty salon manicure table.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B08XZ31PVL" }, { "task_id": "ws_B09JWNS4S2_4530", "instruction": "i need a toothbrush container with holes.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B09JWNS4S2" }, { "task_id": "ws_B09C4PDL5S_4531", "instruction": "i want to buy some living room curtain panels that are pattern 6 and 55x46 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pattern-6", "55 x 46 inch(27.5 x 46 inch*2pes)" ] }, "asin": "B09C4PDL5S" }, { "task_id": "ws_B09C4PDL5S_4532", "instruction": "i would like a pattern-4 colored window curtain panel for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pattern-4" ] }, "asin": "B09C4PDL5S" }, { "task_id": "ws_B07JFT17Q2_4533", "instruction": "buy a flat-packed nightstand in marble black with a white frame.", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "marble black \u2013 white frame" ] }, "asin": "B07JFT17Q2" }, { "task_id": "ws_B07RRJTRTC_4534", "instruction": "get me some low-carb plant based lemon cookies.", "target_attributes": { "attributes": [ "low carb", "plant based" ], "options": [ "lemon" ] }, "asin": "B07RRJTRTC" }, { "task_id": "ws_B07CWWTHN9_4535", "instruction": "i am looking for a three pack of hand crafted cheese squares,", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "asiago & cheddar squares", "4.5 ounce (pack of 3)" ] }, "asin": "B07CWWTHN9" }, { "task_id": "ws_B000XEX11I_4536", "instruction": "get me some steel-toed workboots in size eleven and a half.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "11.5" ] }, "asin": "B000XEX11I" }, { "task_id": "ws_B08V4N63K9_4537", "instruction": "i want to get a super soft blue fleece throw that's 50 inches by 63 inches.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "blue", "50\"x63\"" ] }, "asin": "B08V4N63K9" }, { "task_id": "ws_B088YWBL47_4538", "instruction": "i would like a deep brown clog with a rubber sole for my size 8 foot.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "deep brown", "8" ] }, "asin": "B088YWBL47" }, { "task_id": "ws_B007AS4YSO_4539", "instruction": "i'm looking for a wax hair removal kit for very sensitive skin.", "target_attributes": { "attributes": [ "hair removal", "sensitive skin" ], "options": [] }, "asin": "B007AS4YSO" }, { "task_id": "ws_B08JTMVZKS_4540", "instruction": "i want to find a gold v shaped facial roller for anti aging massage.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "gold" ] }, "asin": "B08JTMVZKS" }, { "task_id": "ws_B004AW4370_4541", "instruction": "i would like a black schwarz size 6-6.5 shoe made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "black schwarz skull black", "6-6.5" ] }, "asin": "B004AW4370" }, { "task_id": "ws_B08QDR81K6_4542", "instruction": "i'm looking for a high power sound bar.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B08QDR81K6" }, { "task_id": "ws_B00278G99O_4543", "instruction": "i want to find a wooden bar stool that features faux leather.", "target_attributes": { "attributes": [ "faux leather" ], "options": [] }, "asin": "B00278G99O" }, { "task_id": "ws_B09P4P4H25_4544", "instruction": "i want to find engraved cheetah-white bands for my apple watch. the bands need to be 38 millimeters long.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "cheetah-white | green | lavender gray | black", "38mm | 40mm | 41mm" ] }, "asin": "B09P4P4H25" }, { "task_id": "ws_B09GR8JT1W_4545", "instruction": "i am looking for a king size platform bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "grey" ] }, "asin": "B09GR8JT1W" }, { "task_id": "ws_B09GR8JT1W_4546", "instruction": "i'm looking for upholstered platform bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "king", "bed" ] }, "asin": "B09GR8JT1W" }, { "task_id": "ws_B09SD2KGX9_4547", "instruction": "i want to get some sandals with high heels and open toe in the color black and size 9 wide.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "a10 - black", "9 wide" ] }, "asin": "B09SD2KGX9" }, { "task_id": "ws_B08CHFJ7BQ_4548", "instruction": "i am looking for a pink leak proof bag.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "pink-100g" ] }, "asin": "B08CHFJ7BQ" }, { "task_id": "ws_B08CHFJ7BQ_4549", "instruction": "looking for leak proof refillable plastic cosmetic jars 50g", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "clear-50g" ] }, "asin": "B08CHFJ7BQ" }, { "task_id": "ws_B08BYS9RT5_4550", "instruction": "get me some non-toxic nail glitter in twelve colors.", "target_attributes": { "attributes": [ "non toxic", "nail art" ], "options": [ "12 colors" ] }, "asin": "B08BYS9RT5" }, { "task_id": "ws_B09L6CL783_4551", "instruction": "show me all your non-slip size ten ladies ankle boots in grey.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "gray a", "10" ] }, "asin": "B09L6CL783" }, { "task_id": "ws_B09BJFBZKT_4552", "instruction": "i want to find a 30-count pack of non-dairy, salted caramel flavored hot chocolate mix.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "salted caramel", "30 count (pack of 1)" ] }, "asin": "B09BJFBZKT" }, { "task_id": "ws_B09SHHN9D9_4553", "instruction": "i need a yellow xx-large floral print tank sleeveless dress that is quick drying.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "yellow", "xx-large" ] }, "asin": "B09SHHN9D9" }, { "task_id": "ws_B00VO4KYV6_4554", "instruction": "i want gluten free tasty teriyaki perky jerky turkey jerky.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "plant based - tasty teriyaki" ] }, "asin": "B00VO4KYV6" }, { "task_id": "ws_B08DCGPRKK_4555", "instruction": "i'm looking for a ready to eat goya guisadas preferable white beans in sauce.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "white beans in sauce" ] }, "asin": "B08DCGPRKK" }, { "task_id": "ws_B071NV1CRV_4556", "instruction": "i am interested in permanent hair color that is dark blonde tobacco.", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "dark blonde tobacco" ] }, "asin": "B071NV1CRV" }, { "task_id": "ws_B00EECI9A8_4557", "instruction": "i would like some long lasting eau de toilette.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00EECI9A8" }, { "task_id": "ws_B01HJWDWP6_4558", "instruction": "i'm looking for high speed, gold plated hdmi cables that are male to male.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "hdmi male to male" ] }, "asin": "B01HJWDWP6" }, { "task_id": "ws_B097DM97CS_4559", "instruction": "what scented candles that are lead free are available in wild lavender scent?", "target_attributes": { "attributes": [ "lead free" ], "options": [ "wild lavender" ] }, "asin": "B097DM97CS" }, { "task_id": "ws_B09RQ6D2XX_4560", "instruction": "i want to get a six-count package of white karahi flavored mix. the mix shouldn't have any artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "white karahi 1.41 oz (40g)", "pack of 6" ] }, "asin": "B09RQ6D2XX" }, { "task_id": "ws_B093YRY22W_4561", "instruction": "get me a mesh laundry bag in any color, please.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YRY22W" }, { "task_id": "ws_B07GXDNMCP_4562", "instruction": "i am looking for a stainless steel tongue cleaner.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B07GXDNMCP" }, { "task_id": "ws_B09PB9NFWJ_4563", "instruction": "i am looking for a cat with ears cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09PB9NFWJ" }, { "task_id": "ws_B07VPSW334_4564", "instruction": "i want a small black women's blouse with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "#1 black", "small" ] }, "asin": "B07VPSW334" }, { "task_id": "ws_B083QFB8L5_4565", "instruction": "i want to find an 80x50 centimeter desk that can be mounted to my wall.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "80\u00d750 cm | 31.5\u00d719.7 in" ] }, "asin": "B083QFB8L5" }, { "task_id": "ws_B09S31L7LB_4566", "instruction": "i am looking for x-large mint green snow boots that have a rubber outsole.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "b32 - mint green", "x-large" ] }, "asin": "B09S31L7LB" }, { "task_id": "ws_B01GQU0HMS_4567", "instruction": "i am looking for low fat beef jerky.", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B01GQU0HMS" }, { "task_id": "ws_B08YNFX8P8_4568", "instruction": "i am looking for a body brush that has a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B08YNFX8P8" }, { "task_id": "ws_B078VDBGJK_4569", "instruction": "i want to find a pair of purple women's boots in a size 8. the boots need to have rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "purple sage", "8" ] }, "asin": "B078VDBGJK" }, { "task_id": "ws_B09R1XFNKW_4570", "instruction": "i need a black leopard print polyester-cotton shirt with long sleeves.", "target_attributes": { "attributes": [ "long sleeve", "polyester cotton" ], "options": [ "black" ] }, "asin": "B09R1XFNKW" }, { "task_id": "ws_B09228DH3M_4571", "instruction": "i am interested in a high quality hair cutting kit.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09228DH3M" }, { "task_id": "ws_B07VHGV3XW_4572", "instruction": "i want 8 pcs of water resistant tattoo grip tape.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "tattoo grip tape 8pcs" ] }, "asin": "B07VHGV3XW" }, { "task_id": "ws_B097P8M6MB_4573", "instruction": "i need to buy a fake security camera. get the one that comes with batteries. buy it in silver.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "silver" ] }, "asin": "B097P8M6MB" }, { "task_id": "ws_B009DU4QYE_4574", "instruction": "i want a sulfate free shampoo that is 8 fl oz.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "8 fl oz (pack of 1)" ] }, "asin": "B009DU4QYE" }, { "task_id": "ws_B071RGNKD2_4575", "instruction": "i am looking for a usda organic cacao flavored instant cup of oatmeal .", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "cacao" ] }, "asin": "B071RGNKD2" }, { "task_id": "ws_B07PYDRYWP_4576", "instruction": "i am looking for a pack of 4 non gmo flatbread crackers that are sesame", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sesame and sea salt", "6.7 ounce (pack of 4)" ] }, "asin": "B07PYDRYWP" }, { "task_id": "ws_B07QJ7J993_4577", "instruction": "i want a mother's love scented long lasting jewelry jar candle with a size 9 ring.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "mother's love", "ring (size 9)" ] }, "asin": "B07QJ7J993" }, { "task_id": "ws_B07QJ7J993_4578", "instruction": "i need long lasting lead free candle with a smoky mountains cabin scent.", "target_attributes": { "attributes": [ "lead free", "long lasting" ], "options": [ "smoky mountains cabin" ] }, "asin": "B07QJ7J993" }, { "task_id": "ws_B07QJ7J993_4579", "instruction": "i'm looking for a long lasting jewelry candle with a cotton candy scent; please pick the one with earrings inside.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "cotton candy", "earrings" ] }, "asin": "B07QJ7J993" }, { "task_id": "ws_B07QJ7J993_4580", "instruction": "i would like a lead free bracelet birthday cake jar candle.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "birthday cake", "bracelet" ] }, "asin": "B07QJ7J993" }, { "task_id": "ws_B07QJ7J993_4581", "instruction": "i want a size 8 black raspberry vanilla candle that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "black raspberry vanilla", "ring (size 8)" ] }, "asin": "B07QJ7J993" }, { "task_id": "ws_B07CZS5SM7_4582", "instruction": "i am looking for a mint green twin size adult weighted blanket.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "mint green" ] }, "asin": "B07CZS5SM7" }, { "task_id": "ws_B0000645C9_4583", "instruction": "i need a canon powershot s200 with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B0000645C9" }, { "task_id": "ws_B08FCXCD93_4584", "instruction": "i want to buy a high speed, high resolution mirrorless camera. get the one with the standard lens kit.", "target_attributes": { "attributes": [ "high resolution", "high speed" ], "options": [ "standard lens kit" ] }, "asin": "B08FCXCD93" }, { "task_id": "ws_B07YZL99M8_4585", "instruction": "i am looking for a slim fit t-shirt of black-5 color.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "black-5" ] }, "asin": "B07YZL99M8" }, { "task_id": "ws_B09SGBKXB9_4586", "instruction": "get me a hand-washable swimsuit in size small.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "small" ] }, "asin": "B09SGBKXB9" }, { "task_id": "ws_B07Y497YYL_4587", "instruction": "i need to shop for a heavy duty cell phone case. i'd like one that's black with blue accents.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black&blue" ] }, "asin": "B07Y497YYL" }, { "task_id": "ws_B09PMZD9TB_4588", "instruction": "i want a pink coat that is 3x large and machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pink", "3x-large" ] }, "asin": "B09PMZD9TB" }, { "task_id": "ws_B000EITYUU_4589", "instruction": "i need 2 pack 5 pound resealable bags of fine ground celtic sea salt.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "2-pack", "5 pound (pack of 1)", "2-pack" ] }, "asin": "B000EITYUU" }, { "task_id": "ws_B000EITYUU_4590", "instruction": "i'm looking for gluten free it was high protein and healthy need to buy.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sea salt + light grey celtic sea salt" ] }, "asin": "B000EITYUU" }, { "task_id": "ws_B000EITYUU_4591", "instruction": "i am looking for sea salt of 2-pack size which is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "2-pack" ] }, "asin": "B000EITYUU" }, { "task_id": "ws_B000EITYUU_4592", "instruction": "i'm looking for a 2 pack of sea salt in a resealable bag and gluten free", "target_attributes": { "attributes": [ "gluten free", "resealable bag" ], "options": [ "sea salt", "2-pack", "2-pack" ] }, "asin": "B000EITYUU" }, { "task_id": "ws_B09QL71Q7B_4593", "instruction": "i am looking for a women's short sleeve tank top size 3x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "3x-large" ] }, "asin": "B09QL71Q7B" }, { "task_id": "ws_B08G6NGY1J_4594", "instruction": "i need a can of ready to eat vegan duck.", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B08G6NGY1J" }, { "task_id": "ws_B09T3BML8K_4595", "instruction": "i am looking for a solid wood vertical file cabinet that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble", "solid wood" ], "options": [] }, "asin": "B09T3BML8K" }, { "task_id": "ws_B09CQ2QHHT_4596", "instruction": "i am looking for 1 pack of 14 inch tape in hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "14 inch (pack of 1)" ] }, "asin": "B09CQ2QHHT" }, { "task_id": "ws_B08LND5CJZ_4597", "instruction": "i need a rose gold cell phone case with a tempered glass screen.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "rose gold" ] }, "asin": "B08LND5CJZ" }, { "task_id": "ws_B096V6LFW9_4598", "instruction": "i am looking for high quality 18 inch hair extensions", "target_attributes": { "attributes": [ "high quality" ], "options": [ "18 in" ] }, "asin": "B096V6LFW9" }, { "task_id": "ws_B08LMLN5YH_4599", "instruction": "i'd like to buy a black bullet camera with motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "black" ] }, "asin": "B08LMLN5YH" }, { "task_id": "ws_B07S3Z2N18_4600", "instruction": "i would like a woman's large cotton heather t shirt preferably in slate gray.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "slate", "women", "large" ] }, "asin": "B07S3Z2N18" }, { "task_id": "ws_B099MQDKXM_4601", "instruction": "i need to buy a new laptop. look for one with a core i5 intel processor, 64 gigabytes of ram, and a 2 terrabyte ssd.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "64gb ddr4 i 2tb ssd" ] }, "asin": "B099MQDKXM" }, { "task_id": "ws_B098KYNNF1_4602", "instruction": "buy me any long sleeve polo as long as it's a size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B098KYNNF1" }, { "task_id": "ws_B01BY04QQS_4603", "instruction": "i am looking for a 40ft hdmi cable that is gold plated.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "1 pack", "40 ft" ] }, "asin": "B01BY04QQS" }, { "task_id": "ws_B01BY04QQS_4604", "instruction": "i would like a single 25 foot hdmi 2.1 cable for my blu ray player.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "hdmi 2.1", "1 pack", "25 ft" ] }, "asin": "B01BY04QQS" }, { "task_id": "ws_B01BY04QQS_4605", "instruction": "i am looking for a 3ft high speed hdmi male-male cable with gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "hdmi male-male", "3ft" ] }, "asin": "B01BY04QQS" }, { "task_id": "ws_B072PZ683F_4606", "instruction": "add some non-gmo popcorn to my order.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B072PZ683F" }, { "task_id": "ws_B08PC7RDVF_4607", "instruction": "i want to get a 12-pack of 14 ounce boxes of hand-crafted fettucine.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "fettucine", "14 ounce (pack of 12)" ] }, "asin": "B08PC7RDVF" }, { "task_id": "ws_B07YCJCLRH_4608", "instruction": "i want to find a case for my iphone 11 pro that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "apple iphone 11 pro" ] }, "asin": "B07YCJCLRH" }, { "task_id": "ws_B01KLLGE9I_4609", "instruction": "i need a rainfall colored and high quality reusable shower cap.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "rainfall" ] }, "asin": "B01KLLGE9I" }, { "task_id": "ws_B09LTRP7HW_4610", "instruction": "i want to find a tv stand made of solid wood for my living room.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [] }, "asin": "B09LTRP7HW" }, { "task_id": "ws_B08YNG2BWW_4611", "instruction": "i need a new watchband for my apple watch se. buy one that's sky blue and waterproof.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "sky blue" ] }, "asin": "B08YNG2BWW" }, { "task_id": "ws_B08YNG2BWW_4612", "instruction": "i need a water proof watch band for a 42 millimeter apple watch. i want a green one.", "target_attributes": { "attributes": [ "water resistant", "compatible apple" ], "options": [ "facebook green", "42mm | 44mm" ] }, "asin": "B08YNG2BWW" }, { "task_id": "ws_B09KBRDLQ5_4613", "instruction": "looking for a coat with hood and long sleeve in black size large for women", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black 2", "large" ] }, "asin": "B09KBRDLQ5" }, { "task_id": "ws_B09P8H2C92_4614", "instruction": "i would like a monocular for my bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09P8H2C92" }, { "task_id": "ws_B08PCJFYZX_4615", "instruction": "buy a steel framed end table for the living room.", "target_attributes": { "attributes": [ "steel frame", "living room" ], "options": [] }, "asin": "B08PCJFYZX" }, { "task_id": "ws_B09R1TRCMC_4616", "instruction": "i am looking for gold+purple color remote controller for playstation 3 having wireless bluetooth.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "gold+purple" ] }, "asin": "B09R1TRCMC" }, { "task_id": "ws_B09H5NK549_4617", "instruction": "i am looking for swivel bar stools with adjustable height, 1pc.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "1pc" ] }, "asin": "B09H5NK549" }, { "task_id": "ws_B08BZF2945_4618", "instruction": "buy some gray machine washable shorts.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "gray" ] }, "asin": "B08BZF2945" }, { "task_id": "ws_B08G1C28J9_4619", "instruction": "i'm looking for a lip gloss base that is non-toxic. it comes in a pink tube.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "pink tube" ] }, "asin": "B08G1C28J9" }, { "task_id": "ws_B08P7Y189P_4620", "instruction": "i'm looking for a set of 6 midcentury desert prints in 11x14\" beige frames. they are a terra cotta color.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "midcentury terracotta", "11x14 beige framed" ] }, "asin": "B08P7Y189P" }, { "task_id": "ws_B06XCT3QY4_4621", "instruction": "i would like a 6 pack of 5 count boxes of gluten free peanut butter fudge crisp bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peanut butter fudge crisp", "5 count (pack of 6)" ] }, "asin": "B06XCT3QY4" }, { "task_id": "ws_B0876WGZRL_4622", "instruction": "i am interested in a long sleeved large button down shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B0876WGZRL" }, { "task_id": "ws_B09B6RF1VM_4623", "instruction": "i am interested in a heavy duty coat rack that is rice white colored.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "rice white" ] }, "asin": "B09B6RF1VM" }, { "task_id": "ws_B08C2N8BVB_4624", "instruction": "i would like some non gmo strawberries that are 2.5 ounces", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "strawberries", "2.5 ounce (pack of 1)" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4625", "instruction": "i am looking for a freeze dried bag of beets.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "bag" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4626", "instruction": "i am looking for 1 ounce bag of non-gmo freeze-dried beets.", "target_attributes": { "attributes": [ "non gmo", "freeze dried" ], "options": [ "1 ounce (pack of 12)" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4627", "instruction": "need me an organic freeze dried beets in strawberries and apples flavor", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "strawberries + apples" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4628", "instruction": "i am looking a non gmo freeze dried low calorie fat free peas 1.8 ounce", "target_attributes": { "attributes": [ "non gmo", "freeze dried", "low calorie", "fat free" ], "options": [ "peas", "1.8 ounce (pack of 1)" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4629", "instruction": "i am looking for low calorie dried vegetables of chocolate banana slices flavor.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "chocolate banana slices" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4630", "instruction": "i would like a 2.5 ounce bundle of blueberries that are usda organic.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "blueberries", "2.5 ounce (pack of 12)", "bundle" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4631", "instruction": "i'm looking for a plant based, usda organic freeze dried fruits which is fat free. also choose a pack of 12 weighting 1.5 ounce bundle with strawberries + banana flavored one.", "target_attributes": { "attributes": [ "freeze dried", "usda organic", "fat free", "plant based" ], "options": [ "strawberries + bananas", "1.5 ounce (pack of 12)", "bundle" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4632", "instruction": "i'm looking for organic freeze-dried beets.", "target_attributes": { "attributes": [ "non gmo", "freeze dried" ], "options": [] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B08C2N8BVB_4633", "instruction": "i'm looking for a 1.2 ounce package of freeze dried, non gmo, beets.", "target_attributes": { "attributes": [ "non gmo", "freeze dried" ], "options": [ "1.2 ounce (pack of 1)" ] }, "asin": "B08C2N8BVB" }, { "task_id": "ws_B017M3IXZG_4634", "instruction": "i am looking for a long lasting edp spray for women.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B017M3IXZG" }, { "task_id": "ws_B09CV289F8_4635", "instruction": "i am looking for a yellow short sleeve men's hawaiian shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "yellow" ] }, "asin": "B09CV289F8" }, { "task_id": "ws_B086VNCP37_4636", "instruction": "i am looking for a solid wood light golden brown stained bookcase.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "light golden brown | stained" ] }, "asin": "B086VNCP37" }, { "task_id": "ws_B09Q9CSX6M_4637", "instruction": "i am looking for a computer desk with a steel frame and a wood finish that is easy to clean.", "target_attributes": { "attributes": [ "easy clean", "wood finish", "steel frame" ], "options": [] }, "asin": "B09Q9CSX6M" }, { "task_id": "ws_B09MLNQM9R_4638", "instruction": "i am looking for a dust proof travel bag.", "target_attributes": { "attributes": [ "dust proof" ], "options": [] }, "asin": "B09MLNQM9R" }, { "task_id": "ws_B09PBXS1XZ_4639", "instruction": "i am interested in orange flats with arch support that are a size 11.5", "target_attributes": { "attributes": [ "arch support" ], "options": [ "z92-orange", "11.5" ] }, "asin": "B09PBXS1XZ" }, { "task_id": "ws_B09MW1MRCH_4640", "instruction": "i am looking for a gold colored bpa free beauty case.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "transparent gold" ] }, "asin": "B09MW1MRCH" }, { "task_id": "ws_B096V4P7PK_4641", "instruction": "i would like a extra large fushia and leopard tunic that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "fuchsia&leopard", "x-large" ] }, "asin": "B096V4P7PK" }, { "task_id": "ws_B07JZWV8WF_4642", "instruction": "i want to find a pair of blue men's work shoes in size 10. the shoes must be made of high quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "blue", "10 us" ] }, "asin": "B07JZWV8WF" }, { "task_id": "ws_B096RZF13X_4643", "instruction": "i need a peacock blue halter lace short homecoming dress in size 2 that can be hand washed.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "peacock blue", "2" ] }, "asin": "B096RZF13X" }, { "task_id": "ws_B01HSFND6W_4644", "instruction": "i want to get a two-count package of gray barstools that i can put in my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "grey", "2 pack" ] }, "asin": "B01HSFND6W" }, { "task_id": "ws_B07B8BBFKL_4645", "instruction": "i need a shampoo set that is sulfate free and is 16 fl oz.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "16 fl oz (pack of 1)" ] }, "asin": "B07B8BBFKL" }, { "task_id": "ws_B01K6CHVKI_4646", "instruction": "i would like a charcoal oval rug thats 10 ft x 13 ft and easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "charcoal", "oval", "10 ft x 13 ft" ] }, "asin": "B01K6CHVKI" }, { "task_id": "ws_B01K6CHVKI_4647", "instruction": "i want an octagonal area right that is light green in color and is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "light green", "octagonal" ] }, "asin": "B01K6CHVKI" }, { "task_id": "ws_B01K6CHVKI_4648", "instruction": "i am looking for a red easy to clean area rugs", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B01K6CHVKI" }, { "task_id": "ws_B01K6CHVKI_4649", "instruction": "i am looking for a light green octagonal plush area rug.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "light green", "octagonal" ] }, "asin": "B01K6CHVKI" }, { "task_id": "ws_B07GL3PWQ1_4650", "instruction": "get some shelf stable baguettes.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [] }, "asin": "B07GL3PWQ1" }, { "task_id": "ws_B084YV58DJ_4651", "instruction": "i would like some long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B084YV58DJ" }, { "task_id": "ws_B07R1HDL4M_4652", "instruction": "buy some cotton rounds that are appropriate for sensitive skin, okay?", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B07R1HDL4M" }, { "task_id": "ws_B095KSSZ48_4653", "instruction": "i am looking for an eco friendly cruelty free orange ylang shampoo and conditioner combo pack.", "target_attributes": { "attributes": [ "eco friendly", "cruelty free" ], "options": [ "orange ylang shampoo & conditioner combo pack" ] }, "asin": "B095KSSZ48" }, { "task_id": "ws_B089SXDC1N_4654", "instruction": "i am looking for loose fitting men's cargo pants with an elastic waist size 32.", "target_attributes": { "attributes": [ "loose fit", "elastic waist" ], "options": [ "32" ] }, "asin": "B089SXDC1N" }, { "task_id": "ws_B09R9MWSG7_4655", "instruction": "i'd like to see large bathing suits for women that are quick drying and loose fitting.", "target_attributes": { "attributes": [ "quick drying", "loose fit" ], "options": [ "large" ] }, "asin": "B09R9MWSG7" }, { "task_id": "ws_B08MKTY3J9_4656", "instruction": "can you find me a rose hydrations set to take care of my skin that has natural ingredients like green tea?", "target_attributes": { "attributes": [ "green tea", "natural ingredients" ], "options": [] }, "asin": "B08MKTY3J9" }, { "task_id": "ws_B09HHDBKWG_4657", "instruction": "buy me a non-slip razor stand.", "target_attributes": { "attributes": [ "non slip" ], "options": [] }, "asin": "B09HHDBKWG" }, { "task_id": "ws_B07F43F67Z_4658", "instruction": "i need a dermatologist tested honest beauty elevated hydration mist.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [] }, "asin": "B07F43F67Z" }, { "task_id": "ws_B07TTXZS9Z_4659", "instruction": "i am looking for an easy to use meat masala flavored seasoning mix for a traditional meat stew.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "meat masala" ] }, "asin": "B07TTXZS9Z" }, { "task_id": "ws_B07TTXZS9Z_4660", "instruction": "i am looking for spice powder with some artificial flavor such as meat masala", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "meat masala" ] }, "asin": "B07TTXZS9Z" }, { "task_id": "ws_B07TTXZS9Z_4661", "instruction": "i would like a 3.52 ounce packet of kat a kat seasoning that's easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "kat a kat", "3.52 ounce (pack of 6)" ] }, "asin": "B07TTXZS9Z" }, { "task_id": "ws_B07TTXZS9Z_4662", "instruction": "i am looking for some easy to use chicken handi indian seasoning mix.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "chicken handi" ] }, "asin": "B07TTXZS9Z" }, { "task_id": "ws_B07TTXZS9Z_4663", "instruction": "i want a 2.1 ounce package of chicken masala seasoning that's easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "chicken masala", "2.1 ounce (pack of 1)" ] }, "asin": "B07TTXZS9Z" }, { "task_id": "ws_B09BDDB9HF_4664", "instruction": "i'd like to buy a nightsand that's made out of engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [] }, "asin": "B09BDDB9HF" }, { "task_id": "ws_B08BR9YDMK_4665", "instruction": "looking for temporary tattoos easy apply and waterproof with pattern name fluttery", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "fluttery" ] }, "asin": "B08BR9YDMK" }, { "task_id": "ws_B07Z1HD9C5_4666", "instruction": "i am looking for a three piece assortment of individually wrapped bakery gifts that are chocolate caramels.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "dark and milk chocolate caramel", "3 piece assortment" ] }, "asin": "B07Z1HD9C5" }, { "task_id": "ws_B086HDW5T5_4667", "instruction": "i am looking for hair extensions that are gray and 26 inches.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "x-#gray", "26 inch" ] }, "asin": "B086HDW5T5" }, { "task_id": "ws_B086HDW5T5_4668", "instruction": "i want an 18 inch sunny human hair extensions tape.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "18 inch" ] }, "asin": "B086HDW5T5" }, { "task_id": "ws_B086ZCTH3P_4669", "instruction": "get me some twenty four inch natural hair extensions. buy color number eight.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "#8 | 60 | 18", "24 inch" ] }, "asin": "B086ZCTH3P" }, { "task_id": "ws_B083K37BSD_4670", "instruction": "i am interested in a large short sleeved shirt that is multicolored.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "multi010", "large" ] }, "asin": "B083K37BSD" }, { "task_id": "ws_B08NRMRDTM_4671", "instruction": "i am looking for 1 pound of nut free christmas candy.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B08NRMRDTM" }, { "task_id": "ws_B08NRMRDTM_4672", "instruction": "i am looking for 1 pound of nut free christmas candy.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B08NRMRDTM" }, { "task_id": "ws_B09PHCMGRR_4673", "instruction": "i am interested in rose gold eyebrow trimmers.", "target_attributes": { "attributes": [ "rose gold" ], "options": [] }, "asin": "B09PHCMGRR" }, { "task_id": "ws_B09PJ72WM1_4674", "instruction": "i need white womens high waist bell-bottomed pants in size x-large.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "white", "x-large" ] }, "asin": "B09PJ72WM1" }, { "task_id": "ws_B09KH8VTW8_4675", "instruction": "i am interested in a lightweight hoodie that is red and x-large.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "red", "x-large" ] }, "asin": "B09KH8VTW8" }, { "task_id": "ws_B07NDLGGS1_4676", "instruction": "i am interested in a synthetic wig that is silver.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "rl56 | 60 silver mist" ] }, "asin": "B07NDLGGS1" }, { "task_id": "ws_B07QNR3PN1_4677", "instruction": "i need a pair of shorts. make sure they're made out of quality materials and buy them in a size extra small.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "x-small" ] }, "asin": "B07QNR3PN1" }, { "task_id": "ws_B09SZ8YHQN_4678", "instruction": "i need a pair of sandles with an ankle strap in size eight wide, please.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "8 wide" ] }, "asin": "B09SZ8YHQN" }, { "task_id": "ws_B09PDTSB4K_4679", "instruction": "i would like some black tongue cleaners for my bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "black" ] }, "asin": "B09PDTSB4K" }, { "task_id": "ws_B07CL8ZHXS_4680", "instruction": "i want some hand cream for dry and sensitive hands in a grapefruit scent.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "honeyed grapefruit" ] }, "asin": "B07CL8ZHXS" }, { "task_id": "ws_B08228LTKC_4681", "instruction": "get me some twin-sized flat sheets in gray.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "gray" ] }, "asin": "B08228LTKC" }, { "task_id": "ws_B08PP8QK5M_4682", "instruction": "looking for flexible curling rods in blue for natural and dry hair easy to use in size 9.45 x 0.55", "target_attributes": { "attributes": [ "easy use", "natural hair", "dry hair" ], "options": [ "blue", "9.45 x 0.55" ] }, "asin": "B08PP8QK5M" }, { "task_id": "ws_B09N8T4QNV_4683", "instruction": "find me a clear ultra hd tempered glass screen protector for my samsung galaxy s22 ultra 5g. it has a 6.8\" screen, and i'll need a 3 pack.", "target_attributes": { "attributes": [ "ultra hd", "tempered glass" ], "options": [ "clear" ] }, "asin": "B09N8T4QNV" }, { "task_id": "ws_B092VRBMN3_4684", "instruction": "i would like a medium sized dress with a elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "medium" ] }, "asin": "B092VRBMN3" }, { "task_id": "ws_B07H432DKS_4685", "instruction": "i am looking for a certified refurbished laser printer.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07H432DKS" }, { "task_id": "ws_B016MDQ6B0_4686", "instruction": "i'm looking for hyaluronic acid serum for face -1 fl oz (pack of 1)", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B016MDQ6B0" }, { "task_id": "ws_B001JO4O80_4687", "instruction": "i want to get gluten free chicken and apple sausages that are organic.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B001JO4O80" }, { "task_id": "ws_B08YNRD68R_4688", "instruction": "i am looking for an easy to carry bluetooth speaker that is black.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "black" ] }, "asin": "B08YNRD68R" }, { "task_id": "ws_B07QD4WHMZ_4689", "instruction": "i'd like to find a 1-pack of hdmi and dp cables that are three feet long. they need to have gold plating.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "cable + dp cable - 6 feet, 10-pack", "3 feet", "1-pack" ] }, "asin": "B07QD4WHMZ" }, { "task_id": "ws_B07QD4WHMZ_4690", "instruction": "i am looking for a uni-directional displayport to hdmi cable for usb port which capable of 1080p hd quality. also choose 25 feet in length and 10-pack", "target_attributes": { "attributes": [ "1080p hd", "usb port" ], "options": [ "25 feet", "10-pack" ] }, "asin": "B07QD4WHMZ" }, { "task_id": "ws_B07QD4WHMZ_4691", "instruction": "i need a display usb port for 1080p hd to hdmi. pick one that is 10ft", "target_attributes": { "attributes": [ "1080p hd", "usb port" ], "options": [ "10 feet" ] }, "asin": "B07QD4WHMZ" }, { "task_id": "ws_B07QD4WHMZ_4692", "instruction": "i am looking for a ten foot gold plated displayport to hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10 feet" ] }, "asin": "B07QD4WHMZ" }, { "task_id": "ws_B08N5NQ869_4693", "instruction": "i would like a venetian bronze doorbell only motion detector for my door.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "venetian bronze", "doorbell only" ] }, "asin": "B08N5NQ869" }, { "task_id": "ws_B09RDXT5G8_4694", "instruction": "i am looking for chocolate gifts for valentine's day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B09RDXT5G8" }, { "task_id": "ws_B01K8T6V0A_4695", "instruction": "i would like some gnocchi that is easy to prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [] }, "asin": "B01K8T6V0A" }, { "task_id": "ws_B08NZ512GL_4696", "instruction": "i am looking for a gift basket that has pancakes, muffins, jam and syrup.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08NZ512GL" }, { "task_id": "ws_B081R831MX_4697", "instruction": "i am looking for silver cake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "silver" ] }, "asin": "B081R831MX" }, { "task_id": "ws_B072NFDZ8K_4698", "instruction": "i need a red pair of skechers men's performance shoes with synthetic soles in size 9.5.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "red", "9.5 x-wide" ] }, "asin": "B072NFDZ8K" }, { "task_id": "ws_B07K56587S_4699", "instruction": "i want to find an xxl sized granite heather colored champion crew neck sweatshirt that is a poly cotton blend.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "granite heather", "xx-large" ] }, "asin": "B07K56587S" }, { "task_id": "ws_B08L215MCC_4700", "instruction": "i am interested in highly pigmented eyeshadow in the color sienna.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "sienna" ] }, "asin": "B08L215MCC" }, { "task_id": "ws_B00CF3OZ4M_4701", "instruction": "i'd like to see double sided box spring mattresses.", "target_attributes": { "attributes": [ "double sided", "box spring" ], "options": [] }, "asin": "B00CF3OZ4M" }, { "task_id": "ws_B0979DKSDS_4702", "instruction": "i am looking for a truffle oil and mushroom pizza with artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [] }, "asin": "B0979DKSDS" }, { "task_id": "ws_B07FD4XRJB_4703", "instruction": "i need a 10 foot high speed tnp hdmi cable left angle.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 feet", "left angle" ] }, "asin": "B07FD4XRJB" }, { "task_id": "ws_B07VNPHTB2_4704", "instruction": "i would like a remote control that has batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B07VNPHTB2" }, { "task_id": "ws_B083QB5YYV_4705", "instruction": "i want to buy some hair extensions in color 613 bleach blonde in a two pack.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "613# bleach blonde", "2 count (pack of 1)" ] }, "asin": "B083QB5YYV" }, { "task_id": "ws_B082HD292M_4706", "instruction": "i need small boxer briefs that have an elastic waistband", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "small" ] }, "asin": "B082HD292M" }, { "task_id": "ws_B07Q5XRMLD_4707", "instruction": "i would like a faux leather light brown chair.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "light brown" ] }, "asin": "B07Q5XRMLD" }, { "task_id": "ws_B08LFZ6LGZ_4708", "instruction": "i need a set of non slip eyebrow epilator.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "style 1" ] }, "asin": "B08LFZ6LGZ" }, { "task_id": "ws_B0915TJYRJ_4709", "instruction": "i need a stainless steel black and large easuny watch band.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black | white | light gray", "large" ] }, "asin": "B0915TJYRJ" }, { "task_id": "ws_B087LNZ7P4_4710", "instruction": "get me some gluten free tortilla chips with sea salt.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sea salt tortilla" ] }, "asin": "B087LNZ7P4" }, { "task_id": "ws_B087LNZ7P4_4711", "instruction": "i would like 10 sweet and savory variety packs of gluten free potato sticks.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sweet & savory variety pack", "pack of 10" ] }, "asin": "B087LNZ7P4" }, { "task_id": "ws_B073H4LFF4_4712", "instruction": "i am interested in closed toe muels that are blue and size 10 narrow.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "blue", "10 narrow women | 8 narrow men" ] }, "asin": "B073H4LFF4" }, { "task_id": "ws_B083PJWR17_4713", "instruction": "i need women's olive leather moccasins in size 9.5 wide.", "target_attributes": { "attributes": [ "day comfort" ], "options": [] }, "asin": "B083PJWR17" }, { "task_id": "ws_B09QBY9R4M_4714", "instruction": "i am looking for a high power monocular with phone holder.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B09QBY9R4M" }, { "task_id": "ws_B072M4L644_4715", "instruction": "i am looking for organic snacks with real fruit.", "target_attributes": { "attributes": [ "real fruit" ], "options": [] }, "asin": "B072M4L644" }, { "task_id": "ws_B07M77GMQD_4716", "instruction": "i want to find a spinning facial brush that is water resistant and comes with a storage case. make sure it's the mint green one from touchbeauty.", "target_attributes": { "attributes": [ "water resistant", "storage case" ], "options": [ "mint green" ] }, "asin": "B07M77GMQD" }, { "task_id": "ws_B07NX259SR_4717", "instruction": "get some barbecue vegetable chips. make sure they're nut-free.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "barbecue" ] }, "asin": "B07NX259SR" }, { "task_id": "ws_B08H8K6VCJ_4718", "instruction": "i am interested in a tempered glass iphone case that is blue", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "blue" ] }, "asin": "B08H8K6VCJ" }, { "task_id": "ws_B08T66H3KS_4719", "instruction": "i need a pair of shoes with rubber soles. remember to get size seven and a half women's.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "7.5" ] }, "asin": "B08T66H3KS" }, { "task_id": "ws_B081RP76FY_4720", "instruction": "i am looking for cake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B081RP76FY" }, { "task_id": "ws_B09J2FYN62_4721", "instruction": "i am looking for a phone case for iphone 13 of sunflower america flag color that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "sunflower america flag", "iphone 13\uff086.1inch\uff09" ] }, "asin": "B09J2FYN62" }, { "task_id": "ws_B07VL2H8KN_4722", "instruction": "i'm looking for a gameboy should to be easy to instal and to use for an iphone11 pro", "target_attributes": { "attributes": [ "easy install", "easy use" ], "options": [ "for iphone 11 pro" ] }, "asin": "B07VL2H8KN" }, { "task_id": "ws_B07VL2H8KN_4723", "instruction": "i want a dust proof case for my iphone 11. it should be black and easy to install.", "target_attributes": { "attributes": [ "dust proof", "easy install" ], "options": [ "black", "for iphone 11" ] }, "asin": "B07VL2H8KN" }, { "task_id": "ws_B097Q3XVY8_4724", "instruction": "i am interested in a loose fit t-shirt that is blue and 4x large.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "blue", "4x-large" ] }, "asin": "B097Q3XVY8" }, { "task_id": "ws_B07FRCH7QL_4725", "instruction": "i want a hair loss and thinning hair product for a hair treatment, water based", "target_attributes": { "attributes": [ "hair treatment" ], "options": [] }, "asin": "B07FRCH7QL" }, { "task_id": "ws_B08F18QL36_4726", "instruction": "i want a eco friendly xiao jian swivel computer chair.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "f" ] }, "asin": "B08F18QL36" }, { "task_id": "ws_B09JWZXCD3_4727", "instruction": "i would like a red cupcake topper for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "red" ] }, "asin": "B09JWZXCD3" }, { "task_id": "ws_B09MP3SDL2_4728", "instruction": "i want a queen size upholstered platform bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [] }, "asin": "B09MP3SDL2" }, { "task_id": "ws_B09HC9NXDF_4729", "instruction": "find counter height table set with socket space saving for dining room in brawn/beige colors", "target_attributes": { "attributes": [ "space saving", "dining room" ], "options": [ "brown table+beige stool" ] }, "asin": "B09HC9NXDF" }, { "task_id": "ws_B08B485FBV_4730", "instruction": "i need a 1 fl oz bottle of organic neem oil for hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B08B485FBV" }, { "task_id": "ws_B08BLGXXJH_4731", "instruction": "i am interested in a plug and play hdmi to vga adapter.", "target_attributes": { "attributes": [ "plug play" ], "options": [] }, "asin": "B08BLGXXJH" }, { "task_id": "ws_B09FJCXRKW_4732", "instruction": "i am interested in cake topper party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [] }, "asin": "B09FJCXRKW" }, { "task_id": "ws_B07ZGVV9Z6_4733", "instruction": "looking for grand court adidas for everyday wear size 9 in white", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "white | white | white", "9" ] }, "asin": "B07ZGVV9Z6" }, { "task_id": "ws_B0859MT52F_4734", "instruction": "i'm looking for a red carbon fiber decal for my xbox.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "red carbon fiber" ] }, "asin": "B0859MT52F" }, { "task_id": "ws_B0859MT52F_4735", "instruction": "i am looking for a red carbon fiber faceplates, protectors & skins with high resolution.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "red carbon fiber" ] }, "asin": "B0859MT52F" }, { "task_id": "ws_B0859MT52F_4736", "instruction": "i am looking for an xbox compatible vinyl skin that has a black carbon fiber design.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "mts black" ] }, "asin": "B0859MT52F" }, { "task_id": "ws_B09MMBHZ98_4737", "instruction": "i want to find a pink orthodontic retainer storage case that's easy to carry.", "target_attributes": { "attributes": [ "easy carry", "storage case" ], "options": [ "pink" ] }, "asin": "B09MMBHZ98" }, { "task_id": "ws_B007TVSUUK_4738", "instruction": "i want to find a 12-pack of 4.2 ounce low-carb lentil-flavored rice cakes.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "lentil", "4.2 ounce (pack of 12)" ] }, "asin": "B007TVSUUK" }, { "task_id": "ws_B007TVSUUK_4739", "instruction": "i need to buy some rice cakes that are sugar free, fat free, low calorie, and low carb. they should contain whole wheat. get the pack of twelve.", "target_attributes": { "attributes": [ "low carb", "low calorie", "fat free", "sugar free" ], "options": [ "whole wheat", "4.2 ounce (pack of 12)" ] }, "asin": "B007TVSUUK" }, { "task_id": "ws_B07NGNNNH4_4740", "instruction": "i am looking for a living room curtain that is machine washable and multi color", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "multi color" ] }, "asin": "B07NGNNNH4" }, { "task_id": "ws_B06ZZ68SBZ_4741", "instruction": "i am looking for a white color hdmi cable having high speed.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "white" ] }, "asin": "B06ZZ68SBZ" }, { "task_id": "ws_B08DXQ2H8K_4742", "instruction": "i'd like to buy a small hair cutting kit.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "small" ] }, "asin": "B08DXQ2H8K" }, { "task_id": "ws_B07W21XY7H_4743", "instruction": "can you help me find the replacement power cord made by afkt for my yamaha bd-s681 blue ray player?", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B07W21XY7H" }, { "task_id": "ws_B0821B3XLC_4744", "instruction": "i need a five by three foot background for digitial photography. make sure it's light weight and easy to carry.", "target_attributes": { "attributes": [ "light weight", "easy carry", "digital photography" ], "options": [ "5x3ft" ] }, "asin": "B0821B3XLC" }, { "task_id": "ws_B07B7BV15N_4745", "instruction": "i am looking for a individual wrapped birthday cakes and chocolate chip blondies that come in a 12 pack.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "birthday cake & chocolate chip blondie" ] }, "asin": "B07B7BV15N" }, { "task_id": "ws_B09PRF5KX5_4746", "instruction": "get me some sandals with an ankle strap. buy them in size seven and a half, please.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "7.5" ] }, "asin": "B09PRF5KX5" }, { "task_id": "ws_B0845FL6FD_4747", "instruction": "help me find the alcohol free listerine tartar control mouthwash.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B0845FL6FD" }, { "task_id": "ws_B01LYP9LQ2_4748", "instruction": "i need a long lasting 7 oz rosemary candle.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "rosemary (double wick - white box)", "7 oz" ] }, "asin": "B01LYP9LQ2" }, { "task_id": "ws_B09SLDMH3S_4749", "instruction": "i am interested in a high quality shower cap", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09SLDMH3S" }, { "task_id": "ws_B082VL45Z5_4750", "instruction": "i want a 89\" stone & beam dark grey leather sofa with a wood frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "dark grey leather", "89\" sofa" ] }, "asin": "B082VL45Z5" }, { "task_id": "ws_B08636QNKY_4751", "instruction": "i am looking for 1 pack of 8 fl oz style balm for hair with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "8 fl oz (pack of 1)" ] }, "asin": "B08636QNKY" }, { "task_id": "ws_B08Y8DB8H4_4752", "instruction": "i need a high speed, high performance fifteen foot hdmi cable. make sure it's gold plated, and buy it in blue.", "target_attributes": { "attributes": [ "gold plated", "high performance", "high speed" ], "options": [ "bluehousing", "4k_15ft_blackcable" ] }, "asin": "B08Y8DB8H4" }, { "task_id": "ws_B08Y8DB8H4_4753", "instruction": "i need a highspeed hdmi cable that is purple", "target_attributes": { "attributes": [ "high speed" ], "options": [ "purplehousing" ] }, "asin": "B08Y8DB8H4" }, { "task_id": "ws_B09HC1FWD3_4754", "instruction": "i am looking for high quality travel size glass spray bottles", "target_attributes": { "attributes": [ "travel size", "high quality" ], "options": [] }, "asin": "B09HC1FWD3" }, { "task_id": "ws_B09B5V7781_4755", "instruction": "i want to get a pack of 10 different food flavors that are dairy and sugar free.", "target_attributes": { "attributes": [ "sugar free", "dairy free" ], "options": [ "10 flavors" ] }, "asin": "B09B5V7781" }, { "task_id": "ws_B07FL4RQXM_4756", "instruction": "i'm looking for a men's velvet coat with a button closure in purple.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "purple" ] }, "asin": "B07FL4RQXM" }, { "task_id": "ws_B09MRXN2DT_4757", "instruction": "i want to buy a casual performance fleece jacket in black.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "black" ] }, "asin": "B09MRXN2DT" }, { "task_id": "ws_B07JFQMJMK_4758", "instruction": "i want a pair of black men's work shoes that are slip resistant. they must come in a size 9.5 and be extra wide.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "black", "9.5 x-wide" ] }, "asin": "B07JFQMJMK" }, { "task_id": "ws_B08PB7L82H_4759", "instruction": "i am interested in curtains that are eco friendly with geometric patterns and is size 42w by 63 h.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "geometric\u00a0games", "42(w) x 63(h)" ] }, "asin": "B08PB7L82H" }, { "task_id": "ws_B077QX86MN_4760", "instruction": "i am interested in grass fed protein bars that are vanilla shortbread flavor.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "vanilla shortbread" ] }, "asin": "B077QX86MN" }, { "task_id": "ws_B08H5T5T3V_4761", "instruction": "i am looking for a pack of 2 hemp seed oil deep conditioner treatments.", "target_attributes": { "attributes": [ "seed oil" ], "options": [ "2" ] }, "asin": "B08H5T5T3V" }, { "task_id": "ws_B08H5T5T3V_4762", "instruction": "i want hask hemp seed oil deep conditioner treatments for all hair types, it should be sulfate free and have a tea tree scent.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "tea tree" ] }, "asin": "B08H5T5T3V" }, { "task_id": "ws_B089D8K91K_4763", "instruction": "i would like some stainless steel sheers to cut my hair.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B089D8K91K" }, { "task_id": "ws_B08R42CJMD_4764", "instruction": "i am interested in grass fed jerky that is chili lime.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "chili lime (pack of 4)" ] }, "asin": "B08R42CJMD" }, { "task_id": "ws_B08RDH5HBV_4765", "instruction": "i am looking for a light weight background of size 9x16 ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "9x16 ft" ] }, "asin": "B08RDH5HBV" }, { "task_id": "ws_B09PHFZSCZ_4766", "instruction": "i need laser ipl hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09PHFZSCZ" }, { "task_id": "ws_B09PH67195_4767", "instruction": "i want to buy that window film for the dining room. make sure to get the one that's 59 inches in length.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "(width\uff0935.4in x (length)59in x 2pcs" ] }, "asin": "B09PH67195" }, { "task_id": "ws_B08B6D39FM_4768", "instruction": "can you find some carol wright men's lounge pants in a 5xl? i want the ones with a draw string closure that are charcoal colored.", "target_attributes": { "attributes": [ "machine wash", "drawstring closure" ], "options": [ "charcoal", "5x-large" ] }, "asin": "B08B6D39FM" }, { "task_id": "ws_B094JNNX1G_4769", "instruction": "i would like a 26 inch black brown natural hairpiece.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "black brown", "26 inch (pack of 1)" ] }, "asin": "B094JNNX1G" }, { "task_id": "ws_B09FPQTY4M_4770", "instruction": "i want to find eco-friendly candles made out of soy wax in the ms. coco color.", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [ "ms coco" ] }, "asin": "B09FPQTY4M" }, { "task_id": "ws_B019RKX31Q_4771", "instruction": "i would like a 24\" x 24\" blackish green pillow throw cover for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackish green", "24\" x 24\"" ] }, "asin": "B019RKX31Q" }, { "task_id": "ws_B019RKX31Q_4772", "instruction": "i want to find gray throw pillow covers for my living room that are 18 inches by 18 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gray", "18\u201c x 18\u201c" ] }, "asin": "B019RKX31Q" }, { "task_id": "ws_B07B54NHW8_4773", "instruction": "i'm looking for a pair of size sixteen nylon spandex pants.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "16" ] }, "asin": "B07B54NHW8" }, { "task_id": "ws_B001EWEP04_4774", "instruction": "buy me some antiperspirant. make sure it's clinically proven.", "target_attributes": { "attributes": [ "anti perspirant", "clinically proven" ], "options": [] }, "asin": "B001EWEP04" }, { "task_id": "ws_B09MFSBCKK_4775", "instruction": "i am interested in a bullet camera that has motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B09MFSBCKK" }, { "task_id": "ws_B07NZ2NP9W_4776", "instruction": "i am interested in a bookcase that has a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B07NZ2NP9W" }, { "task_id": "ws_B09P63GLR4_4777", "instruction": "i'm looking for a pair of blue noise cancelling headphones with stereo sound.", "target_attributes": { "attributes": [ "noise cancelling", "stereo sound" ], "options": [ "blue" ] }, "asin": "B09P63GLR4" }, { "task_id": "ws_B086HNCWFR_4778", "instruction": "i need white chocolate andy anand malt balls with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "white chocolate" ] }, "asin": "B086HNCWFR" }, { "task_id": "ws_B0892GRB9N_4779", "instruction": "i want to buy a navy blue ottomon for the living room. get the one with tufted buttons.", "target_attributes": { "attributes": [ "button tufted", "living room" ], "options": [ "navy blue" ] }, "asin": "B0892GRB9N" }, { "task_id": "ws_B08T5SBG7K_4780", "instruction": "i want to find italian herb-flavored parmesan cheese crisps that are low in carbs.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "italian herb" ] }, "asin": "B08T5SBG7K" }, { "task_id": "ws_B07D7FBCZ2_4781", "instruction": "i am looking for a high performance laptop with 1tb,16 gb ram, intel core i7. nvidia.", "target_attributes": { "attributes": [ "high performance", "intel core" ], "options": [ "1tb, 16 gb ram, intel core i7, nvidia" ] }, "asin": "B07D7FBCZ2" }, { "task_id": "ws_B08DHD6J8T_4782", "instruction": "i am interested in a living room chandelier that is black with eight lights.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black", "8 lights-black" ] }, "asin": "B08DHD6J8T" }, { "task_id": "ws_B08CZKMDNX_4783", "instruction": "i am looking for iced coffee that is shelf stable and mocha flavor that is 96 fl oz.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "mocha", "96 fl oz (pack of 1)" ] }, "asin": "B08CZKMDNX" }, { "task_id": "ws_B07YDZC838_4784", "instruction": "i would like a 4 ounce volume plus hair care bottle thats made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "volume plus", "8 ounce | 4 ounce" ] }, "asin": "B07YDZC838" }, { "task_id": "ws_B07YDZC838_4785", "instruction": "i would like a 8 ounce bottle of scalp therapy spray made with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "scalp therapy spray", "8 ounce" ] }, "asin": "B07YDZC838" }, { "task_id": "ws_B08HT4NLH5_4786", "instruction": "do you have any gluten free cheese spreads with 0g of trans fat?", "target_attributes": { "attributes": [ "gluten free", "0g trans" ], "options": [] }, "asin": "B08HT4NLH5" }, { "task_id": "ws_B08F6HWPLJ_4787", "instruction": "i need a foamma memory foam mattress in size 5\" x 36\" x 84\".", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "5\" x 36\" x 84\"" ] }, "asin": "B08F6HWPLJ" }, { "task_id": "ws_B09LRLP7WM_4788", "instruction": "i'm looking for a tempered glass screen protector for my phone that comes with a black case.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "black" ] }, "asin": "B09LRLP7WM" }, { "task_id": "ws_B000B2JWMY_4789", "instruction": "i am looking for men's reebok leather sneakers size 3.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5 women | 3.5 men" ] }, "asin": "B000B2JWMY" }, { "task_id": "ws_B000B2JWMY_4790", "instruction": "please add to my list a pair of reebok men\u2019s classic daily casual sneaker size 8 .", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "9.5 women | 8 men" ] }, "asin": "B000B2JWMY" }, { "task_id": "ws_B000B2JWMY_4791", "instruction": "i need a pair of sneakers that have a rubber sole and come in black. get the size five and a half.", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "black | cold grey | fierce gold", "5.5" ] }, "asin": "B000B2JWMY" }, { "task_id": "ws_B000B2JWMY_4792", "instruction": "i need leather sneakers with rubber sole. i am a size 11.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "11" ] }, "asin": "B000B2JWMY" }, { "task_id": "ws_B09SZ3KRHN_4793", "instruction": "i am looking for quick drying x- large women's bathing suit.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "x-large" ] }, "asin": "B09SZ3KRHN" }, { "task_id": "ws_B0861D628Y_4794", "instruction": "i'd like to order another one of those soy wax candles that smells like a flower market.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "flower market" ] }, "asin": "B0861D628Y" }, { "task_id": "ws_B0896JP8CG_4795", "instruction": "i'm looking for a moisturizing shave oil for dry skin scent vanilla", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B0896JP8CG" }, { "task_id": "ws_B08GFDG5QT_4796", "instruction": "buy me the bluetooth soundbar in size mb-3220.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "mb-3220" ] }, "asin": "B08GFDG5QT" }, { "task_id": "ws_B099XBMPLZ_4797", "instruction": "get me some black lounge pants with an elastic waistband.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "black" ] }, "asin": "B099XBMPLZ" }, { "task_id": "ws_B094ZQ349N_4798", "instruction": "i am looking for high performance night vision binoculars with batteries included.", "target_attributes": { "attributes": [ "batteries included", "high performance" ], "options": [] }, "asin": "B094ZQ349N" }, { "task_id": "ws_B09NXJJ2KQ_4799", "instruction": "get the heavy duty bed frame in espresso.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "espresso" ] }, "asin": "B09NXJJ2KQ" }, { "task_id": "ws_B07DD9Z6ZB_4800", "instruction": "i would like a mickey mouse toy chest made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "disney mickey mouse" ] }, "asin": "B07DD9Z6ZB" }, { "task_id": "ws_B09H35WZDV_4801", "instruction": "i am looking for a low sugar garlic flavor sauce.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "garlic" ] }, "asin": "B09H35WZDV" }, { "task_id": "ws_B09PH34GXC_4802", "instruction": "i would like a 2xl gray short sleeve button down shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "gray8", "xx-large" ] }, "asin": "B09PH34GXC" }, { "task_id": "ws_B09Q93XK5S_4803", "instruction": "i am looking for a loose fit tee that is army green and in an xx-large.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "army green", "xx-large" ] }, "asin": "B09Q93XK5S" }, { "task_id": "ws_B07KX9Y4XZ_4804", "instruction": "i am interested in a closed toe mule that is light tan suede and in a size 6.5", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "light tan suede", "6.5" ] }, "asin": "B07KX9Y4XZ" }, { "task_id": "ws_B09PBC1QH4_4805", "instruction": "i am looking for a water resistant cosmetic bag", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B09PBC1QH4" }, { "task_id": "ws_B0943RPSB2_4806", "instruction": "i am looking for a dark blue daily wear women's jumpsuit.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "dark blue" ] }, "asin": "B0943RPSB2" }, { "task_id": "ws_B09DPJB2QP_4807", "instruction": "i am looking in day comfort walking shoes that are pink and in a size 5 wide.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "pink-01", "5 wide" ] }, "asin": "B09DPJB2QP" }, { "task_id": "ws_B073WCD5Z1_4808", "instruction": "i would like double sided throw pillow covers that are scarlet orange and are 20\" by 20\".", "target_attributes": { "attributes": [ "double sided" ], "options": [ "scarlet orange", "20\" x 20\"" ] }, "asin": "B073WCD5Z1" }, { "task_id": "ws_B0739KF1S1_4809", "instruction": "i am interested in an intel core computer that has 4gb of ram and 64gb of ssd.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "4g ram 64g ssd" ] }, "asin": "B0739KF1S1" }, { "task_id": "ws_B09P6CRT57_4810", "instruction": "i would like some color 5 hairpieces that are easy to put on.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "5" ] }, "asin": "B09P6CRT57" }, { "task_id": "ws_B09QXN2FH3_4811", "instruction": "i'd like to look at high resolution backdrops with pictures of marine animals. the size should be around seven by five foot.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "7x5ft" ] }, "asin": "B09QXN2FH3" }, { "task_id": "ws_B000RNNI0O_4812", "instruction": "i am interested in a long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B000RNNI0O" }, { "task_id": "ws_B09F63MDV2_4813", "instruction": "i am looking for a loose fitting x-large women's cardigan.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "x-large" ] }, "asin": "B09F63MDV2" }, { "task_id": "ws_B09GKD4XQ4_4814", "instruction": "get me an easy to install phone case in blue.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "blue" ] }, "asin": "B09GKD4XQ4" }, { "task_id": "ws_B089QBNCC5_4815", "instruction": "i need some aaa batteries.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B089QBNCC5" }, { "task_id": "ws_B09QMCQMMY_4816", "instruction": "i need an open toe summer gladiator strap sandle. get me size 6.5", "target_attributes": { "attributes": [ "open toe" ], "options": [ "6.5" ] }, "asin": "B09QMCQMMY" }, { "task_id": "ws_B07VVFF4DM_4817", "instruction": "i am looking for a heavy duty phone holster.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B07VVFF4DM" }, { "task_id": "ws_B09RGW1KKN_4818", "instruction": "i am looking for a gift of sriracha peanuts.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "sriracha" ] }, "asin": "B09RGW1KKN" }, { "task_id": "ws_B09RGW1KKN_4819", "instruction": "i need some chocolate covered peanuts that would be a great gift", "target_attributes": { "attributes": [ "great gift" ], "options": [ "chocolate" ] }, "asin": "B09RGW1KKN" }, { "task_id": "ws_B019IOI8OS_4820", "instruction": "i am interested in a high speed hdmi cable that is 10 feet long.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1 pack", "10 feet (single pack)" ] }, "asin": "B019IOI8OS" }, { "task_id": "ws_B088BYPPYW_4821", "instruction": "i am looking for a large women's skirt with an elastic waistband and pockets.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "large" ] }, "asin": "B088BYPPYW" }, { "task_id": "ws_B082WS53GT_4822", "instruction": "i would like a 3xl black broken cover long sleeve sweatshirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black broken clover", "3x-large" ] }, "asin": "B082WS53GT" }, { "task_id": "ws_B07PH99HMB_4823", "instruction": "i need to buy an officially licenced marvel t-shirt for women.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "women" ] }, "asin": "B07PH99HMB" }, { "task_id": "ws_B07HCVL762_4824", "instruction": "i'm looking for lounge style pants that are machine washable and they should have a drawstring waist. the size should be small.", "target_attributes": { "attributes": [ "machine wash", "drawstring waist" ], "options": [ "small" ] }, "asin": "B07HCVL762" }, { "task_id": "ws_B09NN9HDQ3_4825", "instruction": "i am looking for a 3 color alarm clock having wireless bluetooth.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "3" ] }, "asin": "B09NN9HDQ3" }, { "task_id": "ws_B0924Y7RN1_4826", "instruction": "i would like a pink toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "pink" ] }, "asin": "B0924Y7RN1" }, { "task_id": "ws_B079KHGNFR_4827", "instruction": "i am looking for a black history classic fit shirt size medium.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "medium" ] }, "asin": "B079KHGNFR" }, { "task_id": "ws_B09MFGRR97_4828", "instruction": "i want to get cartoon themed cupcake toppers that i can use for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09MFGRR97" }, { "task_id": "ws_B07VBLHD8C_4829", "instruction": "i am interested in single serve coffee that is cinnamon roll flavored and is a 24 count.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "cinnamon roll", "24 count (pack of 1)" ] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B07VBLHD8C_4830", "instruction": "i'm looking for gluten free high protein for coffee.", "target_attributes": { "attributes": [ "dairy free", "gluten free" ], "options": [ "french roast" ] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B07VBLHD8C_4831", "instruction": "get me a pack of 16 count hot chocolate pack. it should be dairy and gluten free.", "target_attributes": { "attributes": [ "dairy free", "gluten free" ], "options": [ "16 count (pack of 1)" ] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B07VBLHD8C_4832", "instruction": "look for gluten free dairy free hot cocoa pods 16 count (pack of 1) with quality ingredients and also choose", "target_attributes": { "attributes": [ "dairy free", "gluten free", "quality ingredients" ], "options": [ "16 count (pack of 1)" ] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B07VBLHD8C_4833", "instruction": "i want 16 pieces of dairy free maud's dark hot chocolate.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "16 count (pack of 1)" ] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B07VBLHD8C_4834", "instruction": "sumatra sensation included the quality ingretidents", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [] }, "asin": "B07VBLHD8C" }, { "task_id": "ws_B08FRV8QLN_4835", "instruction": "i am interested in old fashioned caramels.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [] }, "asin": "B08FRV8QLN" }, { "task_id": "ws_B093YSKFKF_4836", "instruction": "i need 2 pink flamingo rose mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSKFKF" }, { "task_id": "ws_B09686THJK_4837", "instruction": "i need to find the 10 pack of easy to use lankiz magnetic eyelashes that come with the micellar water, tweezers, and the tubes of magnetism.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09686THJK" }, { "task_id": "ws_B07SGG9YJQ_4838", "instruction": "i need 5 ounce flawless eye cream for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "5 ounce", "flawless eye cream" ] }, "asin": "B07SGG9YJQ" }, { "task_id": "ws_B07SGG9YJQ_4839", "instruction": "i need a 1.7 ounce eye cream for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "1.7 ounce" ] }, "asin": "B07SGG9YJQ" }, { "task_id": "ws_B076VYP83L_4840", "instruction": "buy me some cotton pajama pants in size extra extra large, please. make sure they have an elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "xx-large" ] }, "asin": "B076VYP83L" }, { "task_id": "ws_B007R58WI8_4841", "instruction": "i am interested in a waxing kit for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B007R58WI8" }, { "task_id": "ws_B09NM5MTJ5_4842", "instruction": "get me some long sleeve pajamas. look for blue ones.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue" ] }, "asin": "B09NM5MTJ5" }, { "task_id": "ws_B09QSRNP3T_4843", "instruction": "i am looking for a blue long sleeve men's linen shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue" ] }, "asin": "B09QSRNP3T" }, { "task_id": "ws_B00N1GG62G_4844", "instruction": "i would like 10 pounds of chocolate covered nuts.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "10 pound (pack of 1)" ] }, "asin": "B00N1GG62G" }, { "task_id": "ws_B00N1GG62G_4845", "instruction": "i'm looking for chocolates covered for parties.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B00N1GG62G" }, { "task_id": "ws_B07QPS3GR8_4846", "instruction": "i need a decor therapy white fnished bailey bead board, sized 14x17x26.5, in color sahara.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "sahara", "14x17x26.5" ] }, "asin": "B07QPS3GR8" }, { "task_id": "ws_B095BYSN17_4847", "instruction": "buy me a pink synthetic wig.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "pink" ] }, "asin": "B095BYSN17" }, { "task_id": "ws_B00AQMLFNI_4848", "instruction": "looking for spicy sea salt with low sodium and smoked & infused", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "smoked & infused" ] }, "asin": "B00AQMLFNI" }, { "task_id": "ws_B00AQMLFNI_4849", "instruction": "i want a smoked and infused spicy sea salt gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "smoked & infused" ] }, "asin": "B00AQMLFNI" }, { "task_id": "ws_B08SWWVD2G_4850", "instruction": "i am interested in a height adjustable spa tool that is color a8 and is 40 by 45-63cm.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "a8", "40*45-63cm" ] }, "asin": "B08SWWVD2G" }, { "task_id": "ws_B0015S1DZW_4851", "instruction": "i need a small stick of antiperspirant that is fragrance free.", "target_attributes": { "attributes": [ "anti perspirant", "fragrance free" ], "options": [ "2.25 ounce (pack of 1)" ] }, "asin": "B0015S1DZW" }, { "task_id": "ws_B0799Y3QCN_4852", "instruction": "get me a quad core tablet with 64 gigabytes of storage.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "64gb", "tablet" ] }, "asin": "B0799Y3QCN" }, { "task_id": "ws_B001KYNTLC_4853", "instruction": "i want to get a single-count pack of oil-free liquid foundation that has a natural buff color.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "n3 natural buff", "1 count (pack of 1)" ] }, "asin": "B001KYNTLC" }, { "task_id": "ws_B09DFP2HMB_4854", "instruction": "i want to buy a fully assembled faux leather nightstand. i want the one that's white and has a contemporary design.", "target_attributes": { "attributes": [ "fully assembled", "white item", "faux leather", "contemporary design" ], "options": [] }, "asin": "B09DFP2HMB" }, { "task_id": "ws_B08S7K5DQK_4855", "instruction": "i am looking for a printed backdrop that is 6 by 9 feet for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 07", "6x9 ft" ] }, "asin": "B08S7K5DQK" }, { "task_id": "ws_B08S7K5DQK_4856", "instruction": "i'm looking for a 3' x 5', light weight, aquatic wildlife back drop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "3x5 ft" ] }, "asin": "B08S7K5DQK" }, { "task_id": "ws_B09NBKNJG5_4857", "instruction": "i want a top hairpiece in dark blonde to conceal hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "#27 dark blonde" ] }, "asin": "B09NBKNJG5" }, { "task_id": "ws_B09NBKNJG5_4858", "instruction": "find my-lady silk base top , updated 120% density remy human hair clip in fringe-free topper. it has to be this one and i will for sure cover up a friend's hair loss. register the color : #18p613 so that the order is correct.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "#18p613" ] }, "asin": "B09NBKNJG5" }, { "task_id": "ws_B09NBKNJG5_4859", "instruction": "i am looking for 12 inch size women hairpiece for my damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "12 inch" ] }, "asin": "B09NBKNJG5" }, { "task_id": "ws_B09NBKNJG5_4860", "instruction": "i need a jet black hair piece for hair loss", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "#1 jet black" ] }, "asin": "B09NBKNJG5" }, { "task_id": "ws_B096RD2FBZ_4861", "instruction": "i am looking for a canvas poster for the living room that shows sunny zakynthos island.", "target_attributes": { "attributes": [ "living room" ], "options": [ "sunny zakynthos island", "only canvas" ] }, "asin": "B096RD2FBZ" }, { "task_id": "ws_B0985T17YV_4862", "instruction": "i am interested in a white dinnerware set that has a contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "white" ] }, "asin": "B0985T17YV" }, { "task_id": "ws_B09P51CZZN_4863", "instruction": "i am looking for stainless steel hair removal tweezers.", "target_attributes": { "attributes": [ "stainless steel", "hair removal" ], "options": [] }, "asin": "B09P51CZZN" }, { "task_id": "ws_B09P51CZZN_4864", "instruction": "i want a set of tweezers for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09P51CZZN" }, { "task_id": "ws_B08RJZ16P1_4865", "instruction": "i am looking for men's adidas hiking shoes size 9 with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "9" ] }, "asin": "B08RJZ16P1" }, { "task_id": "ws_B094QPCJ9H_4866", "instruction": "i am interested in a high definition streaming media player.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B094QPCJ9H" }, { "task_id": "ws_B015ETINHS_4867", "instruction": "i'm looking for a charcoal and walnut colored summer chair that has a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "charcoal | walnut", "chair" ] }, "asin": "B015ETINHS" }, { "task_id": "ws_B0972P4GJP_4868", "instruction": "i want to find a black portable bluetooth speaker with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black" ] }, "asin": "B0972P4GJP" }, { "task_id": "ws_B07RMK36GG_4869", "instruction": "i need a 2 pack of lemon cookie mini bars that have high protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "lemon cookie", "12 count (pack of 2)" ] }, "asin": "B07RMK36GG" }, { "task_id": "ws_B07RMK36GG_4870", "instruction": "i am looking for 36 high protein chocolate caramel snack bars.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "chocolate caramel", "36 count (pack of 3)" ] }, "asin": "B07RMK36GG" }, { "task_id": "ws_B0079IYUYS_4871", "instruction": "i'm looking for a vanity wall light with a brushed nickel finish. it should be around 15 inches big.", "target_attributes": { "attributes": [ "nickel finish", "brushed nickel" ], "options": [ "15 inch" ] }, "asin": "B0079IYUYS" }, { "task_id": "ws_B09SL5S4Y4_4872", "instruction": "i want to find a women's long-sleeve jumpsuit in a medium size with the 13 color.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "color13", "medium" ] }, "asin": "B09SL5S4Y4" }, { "task_id": "ws_B091TZTD5G_4873", "instruction": "i would like a 16.9 fluid ounce amber bottle that could be used in a hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "amber", "16.9 fl oz (pack of 1)" ] }, "asin": "B091TZTD5G" }, { "task_id": "ws_B092Q2QGQF_4874", "instruction": "i want a bezel-less vizio 43-inch d-series full hd 1080p smart tv.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "bezel-less" ] }, "asin": "B092Q2QGQF" }, { "task_id": "ws_B07PYPGQ8B_4875", "instruction": "i'm trying to find high quality eyelash extensions that are 0.15 millimeters in diameter and 13-20 millimeters long.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "0.15-d-mix-13-20mm" ] }, "asin": "B07PYPGQ8B" }, { "task_id": "ws_B09KTVWQ5V_4876", "instruction": "i need to buy some slim fit yoga pants. get the ones that are multicolered in xx large.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "multicolor", "xx-large" ] }, "asin": "B09KTVWQ5V" }, { "task_id": "ws_B08FQSSTQ5_4877", "instruction": "i am looking for an easy to carry 4-tier black cosmetic box.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "4-tier black" ] }, "asin": "B08FQSSTQ5" }, { "task_id": "ws_B0932W5W2N_4878", "instruction": "i want a vintage beige twin size metal platform bed frame.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "beige", "vintage bed" ] }, "asin": "B0932W5W2N" }, { "task_id": "ws_B082L53NSB_4879", "instruction": "i am looking for a brushed polished nickel color vanity light having glass shade.", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "brushed polished nickel" ] }, "asin": "B082L53NSB" }, { "task_id": "ws_B07F5M8YPD_4880", "instruction": "buy a two pack of whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B07F5M8YPD" }, { "task_id": "ws_B091F3RWX8_4881", "instruction": "i need brown eco friendly nikahoo small storage baskets.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "06 brown-2pcs" ] }, "asin": "B091F3RWX8" }, { "task_id": "ws_B01F8T9LMA_4882", "instruction": "i need a new dresser. look for one made from engineered wood with lots of storage space.", "target_attributes": { "attributes": [ "engineered wood", "storage space" ], "options": [] }, "asin": "B01F8T9LMA" }, { "task_id": "ws_B09HZV14ND_4883", "instruction": "buy me some coffee brown hair dye. make sure it only contains natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "hair dye" ], "options": [ "coffee" ] }, "asin": "B09HZV14ND" }, { "task_id": "ws_B07VPCPY1X_4884", "instruction": "i'm looking for protein snacks that are very high in protein and contain pumpkin seeds. i'm lactose intolerant.", "target_attributes": { "attributes": [ "dairy free", "high protein" ], "options": [ "pumpkin" ] }, "asin": "B07VPCPY1X" }, { "task_id": "ws_B07C2F29CP_4885", "instruction": "i'm looking for a comfortable pair of mens jeans. they should be shadow black and slim fitting.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "shadow black", "slim" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4886", "instruction": "i am looking for slim comfortable fit jeans that is long lasting.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "slim" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4887", "instruction": "i'm looking for comfortable fit regular jean which must be machine wash with long lasting imported zipper", "target_attributes": { "attributes": [ "long lasting", "machine wash", "imported zipper", "comfortable fit" ], "options": [ "regular" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4888", "instruction": "i would like a 28 wide by 34 long big and tall pair of dax jeans that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "dax", "big & tall", "28w x 34l" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4889", "instruction": "i would like a 30 wide by 40 long big and tall pair of acorn jeans with a comfortable fit.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "acorn", "big & tall", "31w x 40l" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4890", "instruction": "i'm locking for a cowboy cut original fit jean for men's.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B07C2F29CP_4891", "instruction": "i'm looking for a pair of comfortably fitting men's jeans in the size of 33 wide by 34 length.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "33w x 34l" ] }, "asin": "B07C2F29CP" }, { "task_id": "ws_B08RHLN3DK_4892", "instruction": "i would like some low carb elbow noodles that come in a six pack.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "elbows", "8 ounce (pack of 6)" ] }, "asin": "B08RHLN3DK" }, { "task_id": "ws_B09QGQVXWX_4893", "instruction": "i'm looking for an extra-large women's swimsuit that is moisture-wicking. it needs to be green.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "egreen", "x-large" ] }, "asin": "B09QGQVXWX" }, { "task_id": "ws_B081YB76BF_4894", "instruction": "i want machine washable christmas scene white decorative pillow covers in size square 22 x 22 inches.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "christmas scene white", "square 22 x 22 inches" ] }, "asin": "B081YB76BF" }, { "task_id": "ws_B081YB76BF_4895", "instruction": "i want to buy pillow covers which are machine washable and have ombre blue grey color and have a size of square 20 x 20 inches.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "ombre blue grey", "square 20 x 20 inches" ] }, "asin": "B081YB76BF" }, { "task_id": "ws_B09JP2LYMH_4896", "instruction": "i am looking for a folding mattress of size 90cm\u00d7190cm for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "90cm\u00d7190cm" ] }, "asin": "B09JP2LYMH" }, { "task_id": "ws_B098QBHNQ3_4897", "instruction": "i am interested in a black travel sized cosmetic bag.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "a-black" ] }, "asin": "B098QBHNQ3" }, { "task_id": "ws_B096ZGR1JX_4898", "instruction": "i need a xmarto wireless home security camera system with motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B096ZGR1JX" }, { "task_id": "ws_B09FXVS6QB_4899", "instruction": "i am looking for a dual band streaming player that has 4gb of ram and 64gb of storage.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "4gb+64gb" ] }, "asin": "B09FXVS6QB" }, { "task_id": "ws_B08DK41PGJ_4900", "instruction": "i am looking for a 3 cheese wine country gift basket with italian salame.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "3 cheese" ] }, "asin": "B08DK41PGJ" }, { "task_id": "ws_B08LVQTPJN_4901", "instruction": "i am interested in earth tone blinds that are easy to install and are 43\" by 56\"", "target_attributes": { "attributes": [ "easy install" ], "options": [ "earth tone - 100% blackout", "43\"w x 56\"h" ] }, "asin": "B08LVQTPJN" }, { "task_id": "ws_B08LVQTPJN_4902", "instruction": "i am looking for a light brown - 100% blackout 50\"w x 72\"h roller shades which is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "light brown - 100% blackout", "50\"w x 72\"h" ] }, "asin": "B08LVQTPJN" }, { "task_id": "ws_B08LVQTPJN_4903", "instruction": "i am looking for easy install blackout roller shades no tools needed. 12'w x 48\"h", "target_attributes": { "attributes": [ "easy install" ], "options": [ "38\"w x 60\"h" ] }, "asin": "B08LVQTPJN" }, { "task_id": "ws_B08RZF6YWF_4904", "instruction": "i want to find a two-pack of 2-ounce beef jerky bags that are high in protein and come in a variety of flavors.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "variety", "2 ounce (pack of 2)" ] }, "asin": "B08RZF6YWF" }, { "task_id": "ws_B00HB55PKM_4905", "instruction": "i am looking for size 13 evergreen clogs with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "evergreen", "13 women | 13 men" ] }, "asin": "B00HB55PKM" }, { "task_id": "ws_B07HKB2VF1_4906", "instruction": "i want to find an emergency radio that's water resistant and includes aaa batteries.", "target_attributes": { "attributes": [ "water resistant", "batteries included", "aaa batteries" ], "options": [] }, "asin": "B07HKB2VF1" }, { "task_id": "ws_B08P5481L1_4907", "instruction": "i'd like to get men's straight-legged jeans that are 38 centimeters in width and 30 centimeters in length. the color should be waterless rose.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "the rose (waterless) big & tall", "48w x 30l" ] }, "asin": "B08P5481L1" }, { "task_id": "ws_B003GU0TIO_4908", "instruction": "i am looking for gluten free chili bean sauce.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chil bean sauce" ] }, "asin": "B003GU0TIO" }, { "task_id": "ws_B09BLHVV47_4909", "instruction": "i need white non slip working shoes that in a size 10.5 for women", "target_attributes": { "attributes": [ "non slip" ], "options": [ "white camo", "10.5 women | 9.5 men" ] }, "asin": "B09BLHVV47" }, { "task_id": "ws_B09PTXWC42_4910", "instruction": "i am looking for a high quality makeup mirror.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "i" ] }, "asin": "B09PTXWC42" }, { "task_id": "ws_B096QDXYXG_4911", "instruction": "i would like some pink wedges that provide all day comfort and are a size 8.5.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "z5-pink", "8.5" ] }, "asin": "B096QDXYXG" }, { "task_id": "ws_B096QDXYXG_4912", "instruction": "i need a high heel 8.5 sized , z92-purple wedge platform sandals for women", "target_attributes": { "attributes": [ "high heel" ], "options": [ "z92-purple", "8.5" ] }, "asin": "B096QDXYXG" }, { "task_id": "ws_B083TJ99G3_4913", "instruction": "i am interested in hdmi cables that have output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B083TJ99G3" }, { "task_id": "ws_B07ZK98Y9Y_4914", "instruction": "i would like a white size 6 sandal with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "white 1", "6" ] }, "asin": "B07ZK98Y9Y" }, { "task_id": "ws_B07YT6ZSRG_4915", "instruction": "i would like a standard sofa table that has a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "sofa table", "standard" ] }, "asin": "B07YT6ZSRG" }, { "task_id": "ws_B093PNF328_4916", "instruction": "get me a hands free two way radio. get the two pack charging station option.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "charging station option(two pack only)" ] }, "asin": "B093PNF328" }, { "task_id": "ws_B08YJYZSX7_4917", "instruction": "i would like a desk set with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B08YJYZSX7" }, { "task_id": "ws_B09NVSN43G_4918", "instruction": "i want to find a birthday cake topper that i can use for my birthday party.", "target_attributes": { "attributes": [ "birthday cake", "birthday party" ], "options": [] }, "asin": "B09NVSN43G" }, { "task_id": "ws_B089DLMN63_4919", "instruction": "i am looking for a 36 count pack of soy free fruit and nut bars.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "36 count" ] }, "asin": "B089DLMN63" }, { "task_id": "ws_B00JVB5QTE_4920", "instruction": "i want to find a pair of wireless bluetooth headphones.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B00JVB5QTE" }, { "task_id": "ws_B01MU7OTU6_4921", "instruction": "i would like a lotion that is mango scented and cruelty free that comes in 32 ounces.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "mango", "32 ounce" ] }, "asin": "B01MU7OTU6" }, { "task_id": "ws_B07CLP2DL4_4922", "instruction": "looking for one snack of jalapeno n cheddar smoked gluten free with high protein", "target_attributes": { "attributes": [ "high protein", "gluten free" ], "options": [] }, "asin": "B07CLP2DL4" }, { "task_id": "ws_B08DG6C2WW_4923", "instruction": "i want to buy some hair growth shampoo that is bamboo and charcoal scented in a 10 ounce bottle.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "bamboo & charcoal shampoo", "10.14 fl oz" ] }, "asin": "B08DG6C2WW" }, { "task_id": "ws_B09MFFGQX3_4924", "instruction": "i'm looking for a lip balm that would help minimize dead skin caused by dry lips in the winter.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "d" ] }, "asin": "B09MFFGQX3" }, { "task_id": "ws_B0181DGCWM_4925", "instruction": "i would like a black 3'11'' x 5'3'' rug for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "3'11'' x 5'3''" ] }, "asin": "B0181DGCWM" }, { "task_id": "ws_B09PV4HGFN_4926", "instruction": "i am looking for a high resolution portrait of green forest natural scenery.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "5x3ft | 1.5x1m" ] }, "asin": "B09PV4HGFN" }, { "task_id": "ws_B09PV4HGFN_4927", "instruction": "i'm looking for a photo studio background that's light weight and has a high definition image. it should be five by three feet.", "target_attributes": { "attributes": [ "light weight", "high definition" ], "options": [ "5x3ft | 1.5x1m" ] }, "asin": "B09PV4HGFN" }, { "task_id": "ws_B09PV4HGFN_4928", "instruction": "i want a high resolution portrait background that is 10x7ft in size.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "10x7ft | 3x2.2m" ] }, "asin": "B09PV4HGFN" }, { "task_id": "ws_B09PV4HGFN_4929", "instruction": "i am looking for a high definition a19 color background.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "a19" ] }, "asin": "B09PV4HGFN" }, { "task_id": "ws_B09PV4HGFN_4930", "instruction": "searching in the photo studio, i am looking for green forest natural scenery landscape portrait background studio prop that is of high resolution and definition. the approximate size is 9x6ft|2.7x1.8m.", "target_attributes": { "attributes": [ "high resolution", "high definition" ], "options": [ "9x6ft | 2.7x1.8m" ] }, "asin": "B09PV4HGFN" }, { "task_id": "ws_B09J1HDKV2_4931", "instruction": "i am looking for small long sleeve women's christmas cardigan with pockets.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09J1HDKV2" }, { "task_id": "ws_B082MMS2YZ_4932", "instruction": "i am looking for wall mounted security camera for home security", "target_attributes": { "attributes": [ "wall mounted" ], "options": [] }, "asin": "B082MMS2YZ" }, { "task_id": "ws_B08LNTD4K3_4933", "instruction": "i am looking for a clear glass office desk that is white.", "target_attributes": { "attributes": [ "clear glass" ], "options": [ "white" ] }, "asin": "B08LNTD4K3" }, { "task_id": "ws_B09MJXTXY3_4934", "instruction": "i need a fast charging usb c wall charger.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09MJXTXY3" }, { "task_id": "ws_B09PGQ7TV8_4935", "instruction": "i want to find an 8 ounce soy wax candle that is unscented.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "unscented", "8oz" ] }, "asin": "B09PGQ7TV8" }, { "task_id": "ws_B01GUKR4GQ_4936", "instruction": "i am looking for gluten free sea salt.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B01GUKR4GQ" }, { "task_id": "ws_B082FVNHWH_4937", "instruction": "get me a high-quality cosmetic bag with palm trees on it.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "palm trees" ] }, "asin": "B082FVNHWH" }, { "task_id": "ws_B082WM6X9R_4938", "instruction": "looking for a soap that is antifugal and antibacterial with natural ingredients to wash the body", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B082WM6X9R" }, { "task_id": "ws_B075CF6VCR_4939", "instruction": "i am looking for an xx-large short sleeve casual v-neck t-shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "xx-large" ] }, "asin": "B075CF6VCR" }, { "task_id": "ws_B00YEU96GQ_4940", "instruction": "i am looking for a carbon fiber tripod.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "carbon fiber tripod" ] }, "asin": "B00YEU96GQ" }, { "task_id": "ws_B00YEU96GQ_4941", "instruction": "i am looking for stainless steel long carbon fiber 3 series| 3 section long tripod", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "3 series | 3 section long" ] }, "asin": "B00YEU96GQ" }, { "task_id": "ws_B00YEU96GQ_4942", "instruction": "i want a benro mach3 long carbon fiber aluminum tripod.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "aluminum tripod" ] }, "asin": "B00YEU96GQ" }, { "task_id": "ws_B0741SYMHT_4943", "instruction": "i need a supershieldz glass screen protector for samsung galaxy tab s2 8.0.", "target_attributes": { "attributes": [ "glass screen" ], "options": [] }, "asin": "B0741SYMHT" }, { "task_id": "ws_B07B8TWFKS_4944", "instruction": "i am looking for a gluten free chicken sticks with high protein. also choose pepper flavor and 6 stick pack.", "target_attributes": { "attributes": [ "gluten free", "high protein" ], "options": [ "pepper", "6 stick" ] }, "asin": "B07B8TWFKS" }, { "task_id": "ws_B09L775HFG_4945", "instruction": "get me a seventy centimeter wall mounted mirror that's easy to install.", "target_attributes": { "attributes": [ "wall mounted", "easy install" ], "options": [ "70cm" ] }, "asin": "B09L775HFG" }, { "task_id": "ws_B09MLQGHSY_4946", "instruction": "i'd like to get coaxial cables that are plated with gold.", "target_attributes": { "attributes": [ "gold plated", "coaxial cable" ], "options": [] }, "asin": "B09MLQGHSY" }, { "task_id": "ws_B09DGL37KN_4947", "instruction": "i am interested in a mattress pad that is the color e and is 180 by 200 cm.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "e", "180x200cm" ] }, "asin": "B09DGL37KN" }, { "task_id": "ws_B07P5JRGXW_4948", "instruction": "i'm looking for a small mens t-shirt that is machine washable and made of polyester or cotton.", "target_attributes": { "attributes": [ "machine wash", "polyester cotton" ], "options": [ "small" ] }, "asin": "B07P5JRGXW" }, { "task_id": "ws_B00GMM1CF2_4949", "instruction": "i am interested in hand crafted snack gifts.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B00GMM1CF2" }, { "task_id": "ws_B078NGJPM9_4950", "instruction": "i'm looking for a 50-pack of black usb plugs that last for a long time.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "black, 50 pack", "50 pack" ] }, "asin": "B078NGJPM9" }, { "task_id": "ws_B09FPNLS69_4951", "instruction": "i would like a clear glass screen protector for my galaxy watch 4.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "clear + black", "for galaxy watch 4 - 40mm" ] }, "asin": "B09FPNLS69" }, { "task_id": "ws_B07TBGP54C_4952", "instruction": "i am looking for an easy to use sonic toothbrush for kids, 1 pack.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "sonic toothbrush 1 pack" ] }, "asin": "B07TBGP54C" }, { "task_id": "ws_B09PL63TF9_4953", "instruction": "buy me some hiking boots with rubber soles. get them in red, size eight.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "red", "8" ] }, "asin": "B09PL63TF9" }, { "task_id": "ws_B0785YLFQX_4954", "instruction": "i need 16 inch long dark brown goo goo remy hair extensions tape.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark brown mixed chestnut brown #2 | 6 | 2", "16 inch (pack of 1)" ] }, "asin": "B0785YLFQX" }, { "task_id": "ws_B073KYYVTR_4955", "instruction": "i am looking for a 400 foot long high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [ "400ft" ] }, "asin": "B073KYYVTR" }, { "task_id": "ws_B073KYYVTR_4956", "instruction": "i'm looking for high speed accessories for video cables.", "target_attributes": { "attributes": [ "high speed", "aluminum alloy" ], "options": [ "70ft" ] }, "asin": "B073KYYVTR" }, { "task_id": "ws_B073KYYVTR_4957", "instruction": "i want a 280ft black tri-shield weather seal indoor outdoor rg-6 coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "280ft" ] }, "asin": "B073KYYVTR" }, { "task_id": "ws_B01H6NZ45E_4958", "instruction": "i'm looking for men's swiftwater river relaxed fit sandal of size 9", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "9" ] }, "asin": "B01H6NZ45E" }, { "task_id": "ws_B07C91Q25B_4959", "instruction": "i'm looking for a volleyball shorts in low rise and in a 02navy colour and large size", "target_attributes": { "attributes": [ "low rise" ], "options": [ "a02-navy", "large" ] }, "asin": "B07C91Q25B" }, { "task_id": "ws_B09P9ZR7KF_4960", "instruction": "i am looking for a high quality stainless steel set of hair cutting scissors.", "target_attributes": { "attributes": [ "high quality", "stainless steel" ], "options": [ "6.4\"" ] }, "asin": "B09P9ZR7KF" }, { "task_id": "ws_B08PNY8LT3_4961", "instruction": "i would like a dark brown fabric chair with a more contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "dark brown + natural", "fabric" ] }, "asin": "B08PNY8LT3" }, { "task_id": "ws_B09NCB2NC4_4962", "instruction": "i want a heavy duty splice board design computer office desk.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B09NCB2NC4" }, { "task_id": "ws_B0017J22OK_4963", "instruction": "i'm looking for a dermatologist tested hair remover that comes in a spray and is size large.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [] }, "asin": "B0017J22OK" }, { "task_id": "ws_B07ZJWJH8Q_4964", "instruction": "i'm trying to find a chrome, stainless steel storage organizer to put over my kitchen cabinet doors.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "chrome" ] }, "asin": "B07ZJWJH8Q" }, { "task_id": "ws_B08FRKT4FZ_4965", "instruction": "i want an electric callus remover that's not only easy to clean, but also rechargeable.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B08FRKT4FZ" }, { "task_id": "ws_B09NYC15NL_4966", "instruction": "find me a white and black wooden etagere bookcase that needs assembly.", "target_attributes": { "attributes": [ "assembly required", "wood frame" ], "options": [ "white | black" ] }, "asin": "B09NYC15NL" }, { "task_id": "ws_B07TJ9VNHQ_4967", "instruction": "i'm looking for a men's classic fit shirt containing a jamaican woman.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "men" ] }, "asin": "B07TJ9VNHQ" }, { "task_id": "ws_B09M3K9LPH_4968", "instruction": "i want a large white storage shoe bench for the entryway to my living room. please find one that's 63 inches in height.", "target_attributes": { "attributes": [ "white item", "living room" ], "options": [ "white-63\"h", "larger" ] }, "asin": "B09M3K9LPH" }, { "task_id": "ws_B0961G4KFP_4969", "instruction": "hey i am looking for an open toe, size 9 women's slipper made with fax fur.", "target_attributes": { "attributes": [ "open toe", "faux fur" ], "options": [ "9-10" ] }, "asin": "B0961G4KFP" }, { "task_id": "ws_B09DTJXZ6K_4970", "instruction": "i want to find edible black glitter that i can easily use on desserts.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09DTJXZ6K" }, { "task_id": "ws_B08P7KK2F3_4971", "instruction": "i'm looking for a tempered glass coffee table for my living room that has a wooden frame.", "target_attributes": { "attributes": [ "tempered glass", "wood frame", "living room" ], "options": [] }, "asin": "B08P7KK2F3" }, { "task_id": "ws_B099VDWX8H_4972", "instruction": "i want to find a blonde-colored, full-sized standard futon mattress. it must be easy to clean!", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "blonde" ] }, "asin": "B099VDWX8H" }, { "task_id": "ws_B07KYLGXY9_4973", "instruction": "i'm looking for an extra small black women's t-shirt that's machine washable and features origami paper cranes.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "women", "black", "x-small" ] }, "asin": "B07KYLGXY9" }, { "task_id": "ws_B074PWBRF9_4974", "instruction": "i'm in need of a large, 32 ounce bottle of conditioner that is both sulfate and paraben free. i would also like it be completely non-toxic.", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "non toxic" ], "options": [ "32 ounce" ] }, "asin": "B074PWBRF9" }, { "task_id": "ws_B08XVP8DST_4975", "instruction": "give me a long lasting 8 pieces false lashes set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "8 piece set" ] }, "asin": "B08XVP8DST" }, { "task_id": "ws_B0963QSX1Q_4976", "instruction": "i'm looking for fast charging, waterproof earbuds.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B0963QSX1Q" }, { "task_id": "ws_B07J6NSJPT_4977", "instruction": "i'm in need of a hands free pair of earbud headphones that work with bluetooth and offer noise reduction technology.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B07J6NSJPT" }, { "task_id": "ws_B09MHT7M54_4978", "instruction": "i want some vanity lights with a cylindrical shape and a metal base. the shades must feature clear glass.", "target_attributes": { "attributes": [ "vanity light", "clear glass" ], "options": [ "cylindrical" ] }, "asin": "B09MHT7M54" }, { "task_id": "ws_B09QHPJ29G_4979", "instruction": "order a women's tank top made from blue polyester spandex in size medium.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "navy", "medium" ] }, "asin": "B09QHPJ29G" }, { "task_id": "ws_B08F6ZLW5T_4980", "instruction": "i'm trying to find 52\" x 84\" sheer linen curtains for my living room, and ideally they'll be sky blue.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52\" x 84\"", "sky blue" ] }, "asin": "B08F6ZLW5T" }, { "task_id": "ws_B074G4578G_4981", "instruction": "i'd love to find a pair of women's faux fur slippers in size 8.5.", "target_attributes": { "attributes": [ "faux fur" ], "options": [] }, "asin": "B074G4578G" }, { "task_id": "ws_B07C3HDGF8_4982", "instruction": "i need a purple tee shirt in medium i can wear at the gym.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "medium", "purple" ] }, "asin": "B07C3HDGF8" }, { "task_id": "ws_B07ZZT7HBT_4983", "instruction": "find me some gluten free fruit snacks made from real fruit. they must be certified organic as well.", "target_attributes": { "attributes": [ "gluten free", "certified organic", "real fruit" ], "options": [] }, "asin": "B07ZZT7HBT" }, { "task_id": "ws_B09JP6GNTC_4984", "instruction": "i'm looking for a classic fitting, needle-sleeved t-shirt that is machine washable.", "target_attributes": { "attributes": [ "machine wash", "needle sleeve", "classic fit" ], "options": [] }, "asin": "B09JP6GNTC" }, { "task_id": "ws_B07KD7GNZB_4985", "instruction": "i'd like a set of two 12x20 decorative pillow covers that are machine-washable and ideally double sided.", "target_attributes": { "attributes": [ "double sided", "machine washable" ], "options": [ "12x20 set of 2" ] }, "asin": "B07KD7GNZB" }, { "task_id": "ws_B083J7385L_4986", "instruction": "i'm interested in a stainless steel portable salon sink that is easy to clean.", "target_attributes": { "attributes": [ "easy clean", "stainless steel" ], "options": [] }, "asin": "B083J7385L" }, { "task_id": "ws_B07WFMZH69_4987", "instruction": "i'd love some help locating a pair of men's slim fit, ripped skinny jeans in a size 34. it would be awesome if you can find a pair in black.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "34", "black" ] }, "asin": "B07WFMZH69" }, { "task_id": "ws_B07TYRGCH2_4988", "instruction": "i'm looking for a ursula neon t-shirt for girls from disney that is a classic fit, machine washable and in the size of medium.", "target_attributes": { "attributes": [ "machine wash", "classic fit" ], "options": [ "medium" ] }, "asin": "B07TYRGCH2" }, { "task_id": "ws_B07CF4CF27_4989", "instruction": "i want to find a short-sleeve, classic fit men's polo that comes in size small. see if any in white are available.", "target_attributes": { "attributes": [ "classic fit", "short sleeve" ], "options": [] }, "asin": "B07CF4CF27" }, { "task_id": "ws_B087Z21SD2_4990", "instruction": "i'm looking for a pair of large men's ankle strap sandals.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "large" ] }, "asin": "B087Z21SD2" }, { "task_id": "ws_B07W5SK4VS_4991", "instruction": "i'm interested in a pair of moss nappa pumps in a size 7 with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "7", "moss nappa" ] }, "asin": "B07W5SK4VS" }, { "task_id": "ws_B099RC7F69_4992", "instruction": "i'm looking for a package of 16 stainless steel lip razors for women.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "16" ] }, "asin": "B099RC7F69" }, { "task_id": "ws_B07HFHDJNN_4993", "instruction": "i'm interested in a pair of hunter green scrub bottoms with a straight leg and drawstring waist in size medium tall.", "target_attributes": { "attributes": [ "straight leg", "drawstring waist" ], "options": [ "medium tall", "hunter green" ] }, "asin": "B07HFHDJNN" }, { "task_id": "ws_B09DY1SSGR_4994", "instruction": "i'm looking for a solid wood sofa table in order to get some extra storage space in my living room.", "target_attributes": { "attributes": [ "storage space", "solid wood", "living room" ], "options": [] }, "asin": "B09DY1SSGR" }, { "task_id": "ws_B08GW8JSJJ_4995", "instruction": "i'm in need of a night cream for the dry skin on my face that has been tested by dermatologists.", "target_attributes": { "attributes": [ "dermatologist tested", "dry skin" ], "options": [] }, "asin": "B08GW8JSJJ" }, { "task_id": "ws_B01CPE15SO_4996", "instruction": "i'm looking to find a pair of cropped women's pants with an elastic waist and wide legs. see if you can find a pair in navy that runs small to medium.", "target_attributes": { "attributes": [ "wide leg", "elastic waist" ], "options": [ "small-medium", "navy" ] }, "asin": "B01CPE15SO" }, { "task_id": "ws_B0821Z4MHL_4997", "instruction": "i want to find a black ink refill set for temporary tattoos that is not only easy to use but high quality.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "black ink refill" ] }, "asin": "B0821Z4MHL" }, { "task_id": "ws_B09R25LLRY_4998", "instruction": "i'm looking for a black short-sleeve men's v-neck shirt that i can wear to the gym for my workouts. it would be great if the size were a medium.", "target_attributes": { "attributes": [ "short sleeve", "gym workout" ], "options": [ "black", "medium" ] }, "asin": "B09R25LLRY" }, { "task_id": "ws_B08SCGJKVW_4999", "instruction": "i'm looking for a pack of gluten free cocoa vanilla bunny-shaped cookies.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B08SCGJKVW" }, { "task_id": "ws_B01FNB7CVA_5000", "instruction": "i need a long sleeve men's chef coat with button closure in size 3x-large. i want a white one.", "target_attributes": { "attributes": [ "long sleeve", "button closure" ], "options": [ "3x-large", "white" ] }, "asin": "B01FNB7CVA" }, { "task_id": "ws_B09PQFMFB2_5001", "instruction": "i want some puffed snacks that are both gluten and fat free.", "target_attributes": { "attributes": [ "gluten free", "fat free" ], "options": [] }, "asin": "B09PQFMFB2" }, { "task_id": "ws_B09P7Z7VCD_5002", "instruction": "please buy an office desk chair with lumbar support in green.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "green" ] }, "asin": "B09P7Z7VCD" }, { "task_id": "ws_B09CN417QQ_5003", "instruction": "i want to find cruelty free organic lip balm that's made with natural ingredients.", "target_attributes": { "attributes": [ "cruelty free", "natural ingredients" ], "options": [] }, "asin": "B09CN417QQ" }, { "task_id": "ws_B0073DOPOO_5004", "instruction": "i need a pair of lightweight flip flops in a size 5 or 6 that have a rubber sole.", "target_attributes": { "attributes": [ "light weight", "rubber sole" ], "options": [ "5", "6" ] }, "asin": "B0073DOPOO" }, { "task_id": "ws_B002UDITGM_5005", "instruction": "i'm looking for an 11 ounce bag of caffeine-free, acid-free, prebiotic chicory coffee alternative. also, include vanilla nut flavor. additionally, include medium roast.", "target_attributes": { "attributes": [ "caffeine free", "artificial flavors" ], "options": [] }, "asin": "B002UDITGM" }, { "task_id": "ws_B087BPKHSD_5006", "instruction": "i am looking for a small padded bench, preferably easy to assemble and in beige, please.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "1 seat beige" ] }, "asin": "B087BPKHSD" }, { "task_id": "ws_B07JJFVLBR_5007", "instruction": "help me find some clogs in size 9.5 made of ethylene vinyl.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "9.5" ] }, "asin": "B07JJFVLBR" }, { "task_id": "ws_B09KBYJKXD_5008", "instruction": "go ahead and find me a dining room sideboard table that has a bottom shelf. it needs to be easy to assemble.", "target_attributes": { "attributes": [ "easy assemble", "dining room" ], "options": [] }, "asin": "B09KBYJKXD" }, { "task_id": "ws_B09NVYC1MX_5009", "instruction": "i'm looking for an easily assembled and cleaned storage chest for my shoes that would fit well in my living room.", "target_attributes": { "attributes": [ "easy clean", "easy assemble", "living room" ], "options": [] }, "asin": "B09NVYC1MX" }, { "task_id": "ws_B09PNJ73YZ_5010", "instruction": "i want to buy a navy blue casual short-sleeve t-shirt. it should have an ombre gradient on it, and i'll need a medium.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "medium", "navy" ] }, "asin": "B09PNJ73YZ" }, { "task_id": "ws_B08RF3JJ85_5011", "instruction": "i want to find a mirrorless digital camera that produces high resolution photos, and comes with a color filter kit.", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B08RF3JJ85" }, { "task_id": "ws_B00PGOBWPW_5012", "instruction": "can you find a seed oil based face wash that is cruelty free with no fragrance and good for sensitive skin?", "target_attributes": { "attributes": [ "fragrance free", "cruelty free", "seed oil", "sensitive skin" ], "options": [] }, "asin": "B00PGOBWPW" }, { "task_id": "ws_B09CT2QY8L_5013", "instruction": "find a hanging pendant light fixture for my living room with a plug-in cord. it should have a diamond lampshade along with hemp rope.", "target_attributes": { "attributes": [ "pendant light", "light fixture", "living room" ], "options": [] }, "asin": "B09CT2QY8L" }, { "task_id": "ws_B07TZW2XFL_5014", "instruction": "i'd like to find a large brown ottoman for my living room that's easy to spot clean.", "target_attributes": { "attributes": [ "spot clean", "living room" ], "options": [] }, "asin": "B07TZW2XFL" }, { "task_id": "ws_B09P137JZR_5015", "instruction": "help me find an electric razor for men that's easy to clean with a digital display.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09P137JZR" }, { "task_id": "ws_B09PDCNCPM_5016", "instruction": "i'm looking for a long sleeve green or yellow plaid shirt with button closure in a size medium.", "target_attributes": { "attributes": [ "long sleeve", "button closure" ], "options": [ "green", "yellow", "medium" ] }, "asin": "B09PDCNCPM" }, { "task_id": "ws_B086GF7VWJ_5017", "instruction": "i'm looking for a dust brush that i can use for my nail art which is easy to use and clean.", "target_attributes": { "attributes": [ "easy clean", "easy use", "nail art" ], "options": [] }, "asin": "B086GF7VWJ" }, { "task_id": "ws_B08PZ47C1R_5018", "instruction": "i'm looking for a record player and stereo speaker that is not only high power, but also high performance. i don't have a preference for the color.", "target_attributes": { "attributes": [ "high power", "high performance" ], "options": [] }, "asin": "B08PZ47C1R" }, { "task_id": "ws_B09PCY5H8N_5019", "instruction": "i'd love to find a compact magnified mirror that's easy to carry and travel sized.", "target_attributes": { "attributes": [ "travel size", "easy carry" ], "options": [] }, "asin": "B09PCY5H8N" }, { "task_id": "ws_B092VWYQKC_5020", "instruction": "help me find a small console table for my living room. a wall mounted one will be great.", "target_attributes": { "attributes": [ "wall mounted", "living room" ], "options": [] }, "asin": "B092VWYQKC" }, { "task_id": "ws_B09HXRFYP7_5021", "instruction": "l am looking for a pair of non-slip, rubber-soled black shoes in a size 8.5.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "8.5", "black" ] }, "asin": "B09HXRFYP7" }, { "task_id": "ws_B07VNGN9HG_5022", "instruction": "i'm trying to find an extra large men's tank top with a classic fit. it needs to be sapphire colored and say \"i play bocce & i know things\" on it.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "men", "sapphire", "x-large" ] }, "asin": "B07VNGN9HG" }, { "task_id": "ws_B09GT8JY8H_5023", "instruction": "i'm looking for a freeze-dried fruit snacks that are sugar - and gluten-free.", "target_attributes": { "attributes": [ "freeze dried", "sugar free", "gluten free" ], "options": [] }, "asin": "B09GT8JY8H" }, { "task_id": "ws_B06XQ6SHT6_5024", "instruction": "i'm hoping to buy a pair of men's slip-on penny loafers with rubber soles. find a pair for me that's black in size 8.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "8", "black" ] }, "asin": "B06XQ6SHT6" }, { "task_id": "ws_B08ZM5BJNX_5025", "instruction": "i'd like a twin-pack of gold wall sconces that i can put in my living room hallways. they should have clear glass shades.", "target_attributes": { "attributes": [ "clear glass", "glass shade", "living room" ], "options": [ "2 pack" ] }, "asin": "B08ZM5BJNX" }, { "task_id": "ws_B08N476LRT_5026", "instruction": "i'd like to find a desk for my home office that i can use for my computer. it should be easy to assemble and i'd like something in white.", "target_attributes": { "attributes": [ "white item", "easy assemble" ], "options": [] }, "asin": "B08N476LRT" }, { "task_id": "ws_B09LH9DCQK_5027", "instruction": "i'm interested in a blue or gray high performance tablet that offers fast charging capabilities.", "target_attributes": { "attributes": [ "high performance", "fast charging" ], "options": [ "blue", "gray" ] }, "asin": "B09LH9DCQK" }, { "task_id": "ws_B09MTJ92V2_5028", "instruction": "give me a slim fit machine washable blazer that is gold.", "target_attributes": { "attributes": [ "slim fit", "machine wash" ], "options": [ "gold" ] }, "asin": "B09MTJ92V2" }, { "task_id": "ws_B07KFYCK4F_5029", "instruction": "i'm looking for an officially licensed youth t-shirt featuring russell and carl from pixar's movie up. it should be extra-small and ideally come in baby blue.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "youth", "baby blue", "x-small" ] }, "asin": "B07KFYCK4F" }, { "task_id": "ws_B09S9X3MZG_5030", "instruction": "i'm looking for a slim-fitting women's button-up henley. it should be large and ideally the color will be army green.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "caishen-a129-army green", "large" ] }, "asin": "B09S9X3MZG" }, { "task_id": "ws_B09KGW43WR_5031", "instruction": "i'm in need of a four-piece set of christmas coasters with non-slip technology.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "4-piece set" ] }, "asin": "B09KGW43WR" }, { "task_id": "ws_B0978KR99V_5032", "instruction": "i'm looking for a white, twin sized bed frame which will allow me to save space in my child's bedroom.", "target_attributes": { "attributes": [ "twin size", "space saving" ], "options": [ "white" ] }, "asin": "B0978KR99V" }, { "task_id": "ws_B09J8YN9N7_5033", "instruction": "i want to find a pink women's quilted puffy vest that i can machine wash. the size needs to be extra large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "pink", "x-large" ] }, "asin": "B09J8YN9N7" }, { "task_id": "ws_B093R27X9G_5034", "instruction": "i'm looking for an officially licensed minecraft alex with bow taking aim tshirt in youth size and heather grey color", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "youth", "heather grey" ] }, "asin": "B093R27X9G" }, { "task_id": "ws_B09GTWJS8X_5035", "instruction": "help me find a standing four-tiered baker's rack that's heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B09GTWJS8X" }, { "task_id": "ws_B093SY1VL3_5036", "instruction": "find me a set of cute mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SY1VL3" }, { "task_id": "ws_B09SHQXRK6_5037", "instruction": "i need a long sleeve button up shirt that has a casual style and slim fit.", "target_attributes": { "attributes": [ "daily casual", "slim fit", "long sleeve" ], "options": [] }, "asin": "B09SHQXRK6" }, { "task_id": "ws_B001E6GFR6_5038", "instruction": "i'm looking for healthy granola bars that lack artificial coloring, flavoring and don't include high fructose corn syrup as an ingredient.", "target_attributes": { "attributes": [ "artificial colors", "high fructose", "artificial flavors" ], "options": [] }, "asin": "B001E6GFR6" }, { "task_id": "ws_B09NV9PTBZ_5039", "instruction": "i want to find a pair of brown loose-fitting men's pants in a medium size.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "medium", "brown" ] }, "asin": "B09NV9PTBZ" }, { "task_id": "ws_B01GRQLS38_5040", "instruction": "would you get me a work polo, has to have buttons, preferably orange and a medium.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "medium", "orang" ] }, "asin": "B01GRQLS38" }, { "task_id": "ws_B08PJ5LMXM_5041", "instruction": "i need to buy women's leggings for yoga. i need slim fit with tummy control in a large size.", "target_attributes": { "attributes": [ "slim fit", "tummy control" ], "options": [ "large" ] }, "asin": "B08PJ5LMXM" }, { "task_id": "ws_B08C9S7K81_5042", "instruction": "i need help finding a twin set of gold coffee tables that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "gold-set of 2" ] }, "asin": "B08C9S7K81" }, { "task_id": "ws_B09PR9WQLZ_5043", "instruction": "i want to find a long-sleeve sweatshirt that features the charlie vaggie anime character on it.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09PR9WQLZ" }, { "task_id": "ws_B08LG89H3J_5044", "instruction": "order a round black side table with storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "round", "black" ] }, "asin": "B08LG89H3J" }, { "task_id": "ws_B07KDX6TJN_5045", "instruction": "i'm hoping to find a twin pack of hydrating body lotion that's cruelty free and certified organic.", "target_attributes": { "attributes": [ "certified organic", "cruelty free" ], "options": [] }, "asin": "B07KDX6TJN" }, { "task_id": "ws_B07ZBS2W4V_5046", "instruction": "find me a classic-fitting women's tank top in navy that says \"why yes they're real boobs\" on it.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "women", "navy" ] }, "asin": "B07ZBS2W4V" }, { "task_id": "ws_B09RH6LR1F_5047", "instruction": "i'm looking for a men's classic fit button-down shirt for special occasions.", "target_attributes": { "attributes": [ "classic fit" ], "options": [] }, "asin": "B09RH6LR1F" }, { "task_id": "ws_B09QMN8742_5048", "instruction": "i'm hoping to find a pair of g-string thong underwear for men. ideally, the underwear will have a high waist, and i need it in a medium size.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "medium" ] }, "asin": "B09QMN8742" }, { "task_id": "ws_B09QYRV21T_5049", "instruction": "i'd like to find a twin sized bed with drawers for extra storage.", "target_attributes": { "attributes": [ "twin size", "storage space" ], "options": [] }, "asin": "B09QYRV21T" }, { "task_id": "ws_B07WYDVDZ3_5050", "instruction": "i want an easy to carry lighting background for my studio.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B07WYDVDZ3" }, { "task_id": "ws_B004K40ZYS_5051", "instruction": "i'm looking for a provocative set of small women's polyester spandex.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "small" ] }, "asin": "B004K40ZYS" }, { "task_id": "ws_B08FDNRDYH_5052", "instruction": "i'm looking for an ornament sculpted from iron of a mother and child that i can put in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B08FDNRDYH" }, { "task_id": "ws_B08W1Y9PJ7_5053", "instruction": "i need a plug and play high definition video converter.", "target_attributes": { "attributes": [ "plug play", "high definition" ], "options": [] }, "asin": "B08W1Y9PJ7" }, { "task_id": "ws_B09NGWXMDQ_5054", "instruction": "i'm looking for a silicone band compatible with my apple watch that's 40 mm and white.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "38 | 40 | 41mm", "white | stone | sand pink" ] }, "asin": "B09NGWXMDQ" }, { "task_id": "ws_B09NGWXMDQ_5055", "instruction": "i want to find 38 millimeter silicone bands that are compatible with my apple watch. the bands can be either dark green, black, or olive green.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "dark green | black | olive green", "38 | 40 | 41mm" ] }, "asin": "B09NGWXMDQ" }, { "task_id": "ws_B09FZ7RDZ2_5056", "instruction": "i want to find a blue bedside table unit that comes with extra shelf storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "blue" ] }, "asin": "B09FZ7RDZ2" }, { "task_id": "ws_B07FYWZZRM_5057", "instruction": "help me locate a pair of women's angelfish stripe boat shoes with rubber soles in a size 6.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "6" ] }, "asin": "B07FYWZZRM" }, { "task_id": "ws_B082WSKPKR_5058", "instruction": "i'm hoping to buy a medium pair of women's cropped jeans with an elastic waist for everyday wear.", "target_attributes": { "attributes": [ "elastic waist", "everyday wear" ], "options": [ "medium" ] }, "asin": "B082WSKPKR" }, { "task_id": "ws_B07942XCKN_5059", "instruction": "i'm looking for a men's slip-on in a size 10 that has a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "10" ] }, "asin": "B07942XCKN" }, { "task_id": "ws_B09CKY4TGN_5060", "instruction": "i'm looking to buy a large adjustable blue bathrobe towel wrap that's good for drying hair after a shower.", "target_attributes": { "attributes": [ "dry hair" ], "options": [] }, "asin": "B09CKY4TGN" }, { "task_id": "ws_B098XJ3XLC_5061", "instruction": "find me a navy blue wooden sideboard storage cabinet that comes with a height-adjustable shelf.", "target_attributes": { "attributes": [ "height adjustable", "wood frame", "storage space" ], "options": [ "navy blue" ] }, "asin": "B098XJ3XLC" }, { "task_id": "ws_B09NRLPG4Y_5062", "instruction": "i am looking to buy a stainless steel mens hair trimmer", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B09NRLPG4Y" }, { "task_id": "ws_B08FSZLW8C_5063", "instruction": "i am in the need of an end table that has to be put together.", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B08FSZLW8C" }, { "task_id": "ws_B07MYYNDLN_5064", "instruction": "i'm looking for a women's swimsuit that is quick drying and size large and color black", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "large-x-large", "33-black-short" ] }, "asin": "B07MYYNDLN" }, { "task_id": "ws_B07YNFDGW4_5065", "instruction": "you are viewing one of the trendiest products vintage yellowstone national park wolf retro graphic art tank top for men black belong theme vintage yellowstone national park tank tops at printerval:", "target_attributes": { "attributes": [ "polyester heathers", "heathers cotton", "cotton heather", "needle sleeve" ], "options": [ "men", "women", "dark heather", "royal blue", "large", "x-large" ] }, "asin": "B07YNFDGW4" }, { "task_id": "ws_B07KWNMHZC_5066", "instruction": "i want a nesting table that will last a long time and is gray. it has to be small and space saving too.", "target_attributes": { "attributes": [ "long lasting", "space saving" ], "options": [ "nesting tables", "graphite gray" ] }, "asin": "B07KWNMHZC" }, { "task_id": "ws_B08JJ2SD8N_5067", "instruction": "i'm looking for blackout curtains for living room which should be thermal insulated. also, choose 52w*84l size mustard yellow one.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52w x 84l", "mustard yellow" ] }, "asin": "B08JJ2SD8N" }, { "task_id": "ws_B094X12P3V_5068", "instruction": "i need a basketball of size 9. it needs to have a lace closure and and rubber sole and outsole.", "target_attributes": { "attributes": [ "lace closure", "rubber outsole", "rubber sole" ], "options": [ "9" ] }, "asin": "B094X12P3V" }, { "task_id": "ws_B09LYMKLDN_5069", "instruction": "i need a grey button down dhirt that is hand wash and has a longer sleeve.", "target_attributes": { "attributes": [ "hand wash", "long sleeve" ], "options": [ "grey" ] }, "asin": "B09LYMKLDN" }, { "task_id": "ws_B075PFGT15_5070", "instruction": "show me an easy carry high definition body cam which can be used for spying or security.", "target_attributes": { "attributes": [ "easy carry", "high definition" ], "options": [] }, "asin": "B075PFGT15" }, { "task_id": "ws_B09FRJPSRV_5071", "instruction": "i need some cheese that is ready to eat and has good quality to it. an 8 pack that is individually wrapped is what i need.", "target_attributes": { "attributes": [ "ready eat", "individually wrapped", "quality ingredients" ], "options": [ "8 pack" ] }, "asin": "B09FRJPSRV" }, { "task_id": "ws_B09FRJPSRV_5072", "instruction": "i want a 12-pack of bourbon gouda that's individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "12 pack" ] }, "asin": "B09FRJPSRV" }, { "task_id": "ws_B09FRJPSRV_5073", "instruction": "i am interested in buying cheese which is made of quality ingredients and comes in a pack of 12.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "12 pack" ] }, "asin": "B09FRJPSRV" }, { "task_id": "ws_B09BCFH9ZK_5074", "instruction": "i'm looking for machine wasable savannan burlap placemat with compatible table runner with dahlia flower print table set of 6 pcs. also choose color golden circlesan4455 with size 13x70inch+13x19inch*4.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "golden circlesan4455" ] }, "asin": "B09BCFH9ZK" }, { "task_id": "ws_B082RTMQF3_5075", "instruction": "i need some serum that is for anti aging and doesn't have smell. cruelty free is necessary. i only need a 1 oz portion.", "target_attributes": { "attributes": [ "anti aging", "fragrance free", "cruelty free" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B082RTMQF3" }, { "task_id": "ws_B09KJJCWZF_5076", "instruction": "i'm looking for a sturdy and solid dummy camera that's portable and made of stainless steel. also, choose the one that's easy to install.", "target_attributes": { "attributes": [ "easy install", "stainless steel" ], "options": [] }, "asin": "B09KJJCWZF" }, { "task_id": "ws_B0963K7YRQ_5077", "instruction": "i want buy a large wall mounted storage organizer basket .", "target_attributes": { "attributes": [ "wall mounted" ], "options": [] }, "asin": "B0963K7YRQ" }, { "task_id": "ws_B08J5LMZB7_5078", "instruction": "i'm looking for 4g lte prepaid flip phone with quad core processor which should include sim card. also, choose color black", "target_attributes": { "attributes": [ "quad core", "4g lte" ], "options": [] }, "asin": "B08J5LMZB7" }, { "task_id": "ws_B085PYKR67_5079", "instruction": "i am looking for a black color tv stick remote that should be non slip and easy to install.", "target_attributes": { "attributes": [ "non slip", "easy install" ], "options": [] }, "asin": "B085PYKR67" }, { "task_id": "ws_B099JRSMCV_5080", "instruction": "i need a hoodie with a loose fit. sky blue and large is preferred.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "a sky blue", "large" ] }, "asin": "B099JRSMCV" }, { "task_id": "ws_B071NW1J6P_5081", "instruction": "i am looking for a lip plumper with cruelty free, also long lasting", "target_attributes": { "attributes": [ "cruelty free", "long lasting" ], "options": [] }, "asin": "B071NW1J6P" }, { "task_id": "ws_B09J1FK9HN_5082", "instruction": "i need a camera that is fast and has high definition capabilities", "target_attributes": { "attributes": [ "high speed", "high definition" ], "options": [] }, "asin": "B09J1FK9HN" }, { "task_id": "ws_B08YTY6B8J_5083", "instruction": "i am looking for a dental flosser that is eco friendly for my oral hygiene", "target_attributes": { "attributes": [ "eco friendly", "oral hygiene" ], "options": [] }, "asin": "B08YTY6B8J" }, { "task_id": "ws_B09HX5CD2D_5084", "instruction": "i need some draw string shorts that are official cleveland university. the need to be small and charcoal along with being machine washable.", "target_attributes": { "attributes": [ "officially licensed", "machine wash", "drawstring closure" ], "options": [ "heather charcoal", "small" ] }, "asin": "B09HX5CD2D" }, { "task_id": "ws_B09SHXFH3X_5085", "instruction": "i'm looking for high-waisted lace women's lingerie in red. choose the x-large size.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "red", "x-large" ] }, "asin": "B09SHXFH3X" }, { "task_id": "ws_B093TGY82Q_5086", "instruction": "looking for a 2 pack of granola that is gluten free. it needs to be non gmo and shelf stable.", "target_attributes": { "attributes": [ "shelf stable", "non gmo", "gluten free" ], "options": [ "2 pack" ] }, "asin": "B093TGY82Q" }, { "task_id": "ws_B09K41TKGS_5087", "instruction": "i need something for hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B09K41TKGS" }, { "task_id": "ws_B081RDNB65_5088", "instruction": "i'm looking for high quality phone cord hair ties. also, choose size 18, matte color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "18", "matte color" ] }, "asin": "B081RDNB65" }, { "task_id": "ws_B09327XGT6_5089", "instruction": "i am looking for a fast charging adapter with fast charging support in high speed", "target_attributes": { "attributes": [ "fast charging", "high speed" ], "options": [] }, "asin": "B09327XGT6" }, { "task_id": "ws_B08FHMZHQ6_5090", "instruction": "i'm looking for a scoop neck long sleeve medium size tunic top that's fit for everyday wear. also, choose the grey color one.", "target_attributes": { "attributes": [ "long sleeve", "everyday wear" ], "options": [ "medium", "grey" ] }, "asin": "B08FHMZHQ6" }, { "task_id": "ws_B09RF4KJ1J_5091", "instruction": "i need a bikini that is low rise and quick drying, in a size small", "target_attributes": { "attributes": [ "low rise", "quick drying" ], "options": [ "small" ] }, "asin": "B09RF4KJ1J" }, { "task_id": "ws_B07MXP2ZBZ_5092", "instruction": "i am looking for a non toxic bag that has great quality to it, along with being for nail art.", "target_attributes": { "attributes": [ "non toxic", "high quality", "nail art" ], "options": [] }, "asin": "B07MXP2ZBZ" }, { "task_id": "ws_B09DBQ36P1_5093", "instruction": "i need a button down shirt that is slim fit and hand washable. the fabric needs to be stretch and be large and black.", "target_attributes": { "attributes": [ "hand wash", "slim fit", "stretch fabric" ], "options": [ "black", "large" ] }, "asin": "B09DBQ36P1" }, { "task_id": "ws_B085P21LC3_5094", "instruction": "i am looking for cruelty free long lasting lip lacquer with the color option moody.", "target_attributes": { "attributes": [ "cruelty free", "long lasting" ], "options": [ "moody" ] }, "asin": "B085P21LC3" }, { "task_id": "ws_B097RDQTGL_5095", "instruction": "i need an easy to carry headset for audio.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B097RDQTGL" }, { "task_id": "ws_B096B813X6_5096", "instruction": "i'm looking for sheer window covering rod pocket 2 panels for living room with size 52\" x 63\" inch. also choose the color plaid red black.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52 \" wide x 63\" long x 2 panels" ] }, "asin": "B096B813X6" }, { "task_id": "ws_B096YHMGQ9_5097", "instruction": "looking for a beverage that is non alcoholic and low carb please.", "target_attributes": { "attributes": [ "non alcoholic", "low carb" ], "options": [] }, "asin": "B096YHMGQ9" }, { "task_id": "ws_B008VCXOZM_5098", "instruction": "i am in search of a cover-up that is easy to care for, machine washable and is quick drying. the waist needs to be elastic and of relaxed fit.", "target_attributes": { "attributes": [ "easy care", "machine wash", "quick drying", "elastic waist", "relaxed fit" ], "options": [] }, "asin": "B008VCXOZM" }, { "task_id": "ws_B09NVT21W2_5099", "instruction": "i am looking for some pajamas that use good materials and has long sleeves. i will be wearing it daily and need a large size.", "target_attributes": { "attributes": [ "quality materials", "long sleeve", "daily wear" ], "options": [ "large" ] }, "asin": "B09NVT21W2" }, { "task_id": "ws_B09R3JPH1D_5100", "instruction": "looking for a white medium casual shirt. i am slim and it needs to be button down. long sleeves and machine washable needed as well.", "target_attributes": { "attributes": [ "slim fit", "machine wash", "button closure", "long sleeve" ], "options": [ "medium", "white" ] }, "asin": "B09R3JPH1D" }, { "task_id": "ws_B09HP4NVYG_5101", "instruction": "i'm looking for a pair of women's jeans in a size 33 regular which wash cold and dry clean.", "target_attributes": { "attributes": [ "wash cold", "dry clean" ], "options": [ "33 regular" ] }, "asin": "B09HP4NVYG" }, { "task_id": "ws_B01EUZWTMW_5102", "instruction": "i am looking for a folding chair with steel frame. also with space saving.", "target_attributes": { "attributes": [ "space saving", "steel frame" ], "options": [] }, "asin": "B01EUZWTMW" }, { "task_id": "ws_B09JV9N6RS_5103", "instruction": "i'm looking for a pair of high quality, stainless steel nail clippers that also function as a pedicure tool.", "target_attributes": { "attributes": [ "high quality", "stainless steel" ], "options": [] }, "asin": "B09JV9N6RS" }, { "task_id": "ws_B096MPYVPT_5104", "instruction": ": i'm looking for a funny dad beer tank top. also men's size large classic fit in royal blue,", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "men", "royal blue", "large" ] }, "asin": "B096MPYVPT" }, { "task_id": "ws_B08PTQFM2V_5105", "instruction": "i am looking for a heavy duty spa bed made-up of stainless steel", "target_attributes": { "attributes": [ "heavy duty", "stainless steel" ], "options": [] }, "asin": "B08PTQFM2V" }, { "task_id": "ws_B07D7J41W8_5106", "instruction": "i need a woman's t-shirt that has a classic fit and a needle type sleeve.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit" ], "options": [ "women" ] }, "asin": "B07D7J41W8" }, { "task_id": "ws_B09MKGT2QN_5107", "instruction": "i am looking for a metal coat rack for my entryway. i need it to be heavy duty and i want it silver in color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "silvery" ] }, "asin": "B09MKGT2QN" }, { "task_id": "ws_B075GWQL5Z_5108", "instruction": "i'm looking for a 4 pack of teeth whitening trays,bpa free, that comes with a free storage case.", "target_attributes": { "attributes": [ "teeth whitening", "storage case" ], "options": [] }, "asin": "B075GWQL5Z" }, { "task_id": "ws_B005B9LWV6_5109", "instruction": "i am looking for a shoe with rubber sole and vinyl acetate also size 11.", "target_attributes": { "attributes": [ "vinyl acetate", "rubber sole" ], "options": [ "11" ] }, "asin": "B005B9LWV6" }, { "task_id": "ws_B09KYH4H84_5110", "instruction": "i'm looking for a women soon to be dad pregnancy tank top with classic fit, needle sleeve, cotton heather and should be machine washable. also, choose medium size, royal blue", "target_attributes": { "attributes": [ "machine wash", "cotton heather", "needle sleeve", "classic fit" ], "options": [ "women", "royal blue", "medium" ] }, "asin": "B09KYH4H84" }, { "task_id": "ws_B08Q9SCL49_5111", "instruction": "find me a high speed dual style package with 12\" power amplifier car subwoofer", "target_attributes": { "attributes": [ "power amplifier", "high speed" ], "options": [ "dual 12\u201d with amplifier" ] }, "asin": "B08Q9SCL49" }, { "task_id": "ws_B08Q9SCL49_5112", "instruction": "i would like a single 15\" power amplifier car subwoofer/", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "single 15\u201d with amplifier" ] }, "asin": "B08Q9SCL49" }, { "task_id": "ws_B09QBSFFSL_5113", "instruction": "i am looking for a lace closure water booties & socks of red color.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "red" ] }, "asin": "B09QBSFFSL" }, { "task_id": "ws_B07XF8M51P_5114", "instruction": "i am looking for a letter y size monogram coaster set that fits for my living room . and i prefer the 22-lights color", "target_attributes": { "attributes": [ "living room" ], "options": [ "22-lights", "letter y" ] }, "asin": "B07XF8M51P" }, { "task_id": "ws_B08B3KGC31_5115", "instruction": "i'm looking for the wall arts for hanging through the wall to the living room and dinning room.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "plum blossom 1" ] }, "asin": "B08B3KGC31" }, { "task_id": "ws_B09HPX192V_5116", "instruction": "i am looking owl statue eco friendly soy wax jar candle color black", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [ "black", "owl statue" ] }, "asin": "B09HPX192V" }, { "task_id": "ws_B00MQ9QVOM_5117", "instruction": "i am looking for a super comfy x-large palazzo pants with elastic waist and wide legs.", "target_attributes": { "attributes": [ "wide leg", "elastic waist" ], "options": [ "x-large" ] }, "asin": "B00MQ9QVOM" }, { "task_id": "ws_B07MTPV3GR_5118", "instruction": "i am looking for rose gold and phoenix colored makeup powder.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "phoenix (warm copper)" ] }, "asin": "B07MTPV3GR" }, { "task_id": "ws_B07MTPV3GR_5119", "instruction": "looking for highlighting makeup powder in the highlighting & luminizers section of beauty & personal care. long lasting, metallic shimmer, venus (pearlescent white.) made by aesthetica starlite", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "venus (pearlescent white)" ] }, "asin": "B07MTPV3GR" }, { "task_id": "ws_B08QPRZ4HP_5120", "instruction": "i am looking for a gluten free mixed nuts of all-in-one mix flavours", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "all-in-one mix" ] }, "asin": "B08QPRZ4HP" }, { "task_id": "ws_B08MBLRLZG_5121", "instruction": "i am looking for size: \u00f870cm | 28inch size tempered glass lazy susans", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "\u00f870cm | 28inch" ] }, "asin": "B08MBLRLZG" }, { "task_id": "ws_B07Q2SQR8V_5122", "instruction": "earphone earbuds comfortable ear noise cancelling with mic", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "with mic" ] }, "asin": "B07Q2SQR8V" }, { "task_id": "ws_B09PJY11X3_5123", "instruction": "i need a gift basket with milk chocolate covered peanuts", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "milk chocolate covered peanuts" ] }, "asin": "B09PJY11X3" }, { "task_id": "ws_B09PVF9VXP_5124", "instruction": "i'm looking for a men's slim fit athletic long sleeve shirts with printed graphic tees top by jspoyou .", "target_attributes": { "attributes": [ "slim fit", "long sleeve" ], "options": [ "b-black", "large" ] }, "asin": "B09PVF9VXP" }, { "task_id": "ws_B07S4DVKZ3_5125", "instruction": "i want long lasting king size headbord color : white queen wingback", "target_attributes": { "attributes": [ "long lasting", "king size" ], "options": [ "white queen wingback" ] }, "asin": "B07S4DVKZ3" }, { "task_id": "ws_B09J8CDPWJ_5126", "instruction": "i'm searching for cork base coaster for home living room - a set of 4 with cup holder", "target_attributes": { "attributes": [ "living room" ], "options": [ "set of 4 with cup holder" ] }, "asin": "B09J8CDPWJ" }, { "task_id": "ws_B007GBXMBA_5127", "instruction": "i want a small dress shirt made of polyester cotton. it should be navy in color.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "navy", "small" ] }, "asin": "B007GBXMBA" }, { "task_id": "ws_B071ZZJ99N_5128", "instruction": "i am looking for a espresso color home office desks with steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "espresso" ] }, "asin": "B071ZZJ99N" }, { "task_id": "ws_B098QQGJ48_5129", "instruction": "i am looking for a denim for daily wear , size 28.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "28" ] }, "asin": "B098QQGJ48" }, { "task_id": "ws_B08QPHB6LC_5130", "instruction": "i am searching for an engorgement style breast mask suitable for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "engorgement" ] }, "asin": "B08QPHB6LC" }, { "task_id": "ws_B093GNXNX4_5131", "instruction": "i am looking for cupcake toppers for baby shower birthday party. please choose pink color.", "target_attributes": { "attributes": [ "baby shower", "birthday party" ], "options": [ "pink" ] }, "asin": "B093GNXNX4" }, { "task_id": "ws_B09NYHLYN6_5132", "instruction": "i need pink tennis shoes for my daily wear. it should be a size 8.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "z04-pink", "8" ] }, "asin": "B09NYHLYN6" }, { "task_id": "ws_B09NYHLYN6_5133", "instruction": "i want size 8 aodong walking shoes for women with lace closure.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "8" ] }, "asin": "B09NYHLYN6" }, { "task_id": "ws_B097442F4B_5134", "instruction": "i am looking for blue color wireless charger", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "purple marble" ] }, "asin": "B097442F4B" }, { "task_id": "ws_B081R2JC38_5135", "instruction": "i'm looking for wall mounted for furniture need to buy it.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [] }, "asin": "B081R2JC38" }, { "task_id": "ws_B07BCRWR2F_5136", "instruction": "i am looking a large pajama set machine wash cold wash relaxed fit color: with checker pant", "target_attributes": { "attributes": [ "wash cold", "machine wash", "relaxed fit" ], "options": [ "with checker pant", "large" ] }, "asin": "B07BCRWR2F" }, { "task_id": "ws_B01M4IJHRC_5137", "instruction": "i am looking for a 9 ft. x 12 ft area rugs for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "9 ft. x 12 ft." ] }, "asin": "B01M4IJHRC" }, { "task_id": "ws_B01M4IJHRC_5138", "instruction": "i would like a 8 ft. by 10 ft. chocolate brown runner rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "a chocolate", "runner", "8 ft. x 10 ft." ] }, "asin": "B01M4IJHRC" }, { "task_id": "ws_B07XR88QNL_5139", "instruction": "i am looking for a rose gold high quality oral care", "target_attributes": { "attributes": [ "high quality" ], "options": [ "rose gold" ] }, "asin": "B07XR88QNL" }, { "task_id": "ws_B07G81QFKG_5140", "instruction": "i want a easy care hair styling irons straighteners", "target_attributes": { "attributes": [ "easy carry", "hair styling" ], "options": [] }, "asin": "B07G81QFKG" }, { "task_id": "ws_B09FG22K7Z_5141", "instruction": "i'm looking for oral hygiene to prevent the dental care problems.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [] }, "asin": "B09FG22K7Z" }, { "task_id": "ws_B09HS8HG7H_5142", "instruction": "i'm looking for a foothill farms cream pie filling mix.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "whipped topping", "13.05 ounce bag (pack of 12)" ] }, "asin": "B09HS8HG7H" }, { "task_id": "ws_B09R1KJYT5_5143", "instruction": "i am looking for a small size cotton heather tank top with classic fit which is machine washable. also choose the royal blue color.", "target_attributes": { "attributes": [ "machine wash", "cotton heather", "classic fit" ], "options": [ "royal blue", "small" ] }, "asin": "B09R1KJYT5" }, { "task_id": "ws_B09MYZ4F19_5144", "instruction": "i would like a 64 gig ddr 4 ram laptop with a intel core.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "64gb ddr4 ram, 2tb pcie ssd" ] }, "asin": "B09MYZ4F19" }, { "task_id": "ws_B09B9YGLD7_5145", "instruction": "i would like some cake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09B9YGLD7" }, { "task_id": "ws_B0891SD2JQ_5146", "instruction": "i am looking for a hair removal device for home use.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B0891SD2JQ" }, { "task_id": "ws_B0862MDKDW_5147", "instruction": "i am looking for fragrance free eye cream effective for dark circle.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "dark c7-8" ] }, "asin": "B0862MDKDW" }, { "task_id": "ws_B0948FKFNW_5148", "instruction": "i am looking for a pink/blue switch gaming keyboard that is non-slip", "target_attributes": { "attributes": [ "non slip" ], "options": [ "pink | blue switch" ] }, "asin": "B0948FKFNW" }, { "task_id": "ws_B082X1PDZK_5149", "instruction": "i am looking for water resistant camera housing.", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B082X1PDZK" }, { "task_id": "ws_B08P5SDYST_5150", "instruction": "i am looking for a white moisture wicking briefs for men", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "white" ] }, "asin": "B08P5SDYST" }, { "task_id": "ws_B09SG3LJLK_5151", "instruction": "i'm looking for a twin size bed that soft beds for bedroom.", "target_attributes": { "attributes": [ "twin size" ], "options": [] }, "asin": "B09SG3LJLK" }, { "task_id": "ws_B000KOUGJ6_5152", "instruction": "i am looking for a pack of 3 long lasting champagne blonde hair dye.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "8.5a champagne blonde", "pack of 3" ] }, "asin": "B000KOUGJ6" }, { "task_id": "ws_B0759WR4Y9_5153", "instruction": "i am looking for long lasting eyeliner in charcoal color", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "continuous charcoal" ] }, "asin": "B0759WR4Y9" }, { "task_id": "ws_B009B1LZBM_5154", "instruction": "i am looking for a solid wood display & curio cabinets", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B009B1LZBM" }, { "task_id": "ws_B09GR3H5Q6_5155", "instruction": "i would like a versa3 furry beige black fitbit band that has a quick release.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "furry beige black", "versa3 | sense black adapters" ] }, "asin": "B09GR3H5Q6" }, { "task_id": "ws_B08HHRCV7H_5156", "instruction": "i'm looking for a easy to assemble dresser storage organizer with steel frame. also, choose small size black grey colored one.", "target_attributes": { "attributes": [ "easy assemble", "steel frame" ], "options": [ "black grey", "small" ] }, "asin": "B08HHRCV7H" }, { "task_id": "ws_B09B9ZVYV4_5157", "instruction": "baggy jeans for women high waisted daily casuals in colour blue-6", "target_attributes": { "attributes": [ "daily casual", "high waist", "teen girls" ], "options": [ "blue-6" ] }, "asin": "B09B9ZVYV4" }, { "task_id": "ws_B07T59DKT9_5158", "instruction": "i am looking for a 5 no. rubber sole of road running shoes", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5" ] }, "asin": "B07T59DKT9" }, { "task_id": "ws_B07T59DKT9_5159", "instruction": "i am looking for 9 size , true red color and rubber sole running shoes for men", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "true red", "9" ] }, "asin": "B07T59DKT9" }, { "task_id": "ws_B08656N5YT_5160", "instruction": "i'm looking for a winsome element 2pc bar stool.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B08656N5YT" }, { "task_id": "ws_B09G2XJRGC_5161", "instruction": "i am looking for an easy to carry charger with wireless bluetooth features.", "target_attributes": { "attributes": [ "easy carry", "wireless bluetooth" ], "options": [] }, "asin": "B09G2XJRGC" }, { "task_id": "ws_B0843J7ZP6_5162", "instruction": "i want to buy a faux fur snow boots with rubber soles. it should be size 9 in width.", "target_attributes": { "attributes": [ "faux fur", "rubber sole" ], "options": [ "9 wide" ] }, "asin": "B0843J7ZP6" }, { "task_id": "ws_B081TY83PX_5163", "instruction": "i'm looking for groceries shop for high protein ingredients.", "target_attributes": { "attributes": [ "high protein", "source vitamin", "dietary fiber" ], "options": [] }, "asin": "B081TY83PX" }, { "task_id": "ws_B09KWZGR96_5164", "instruction": "i'm looking for a contemporary style dresser made of solid wood.", "target_attributes": { "attributes": [ "contemporary style", "solid wood" ], "options": [] }, "asin": "B09KWZGR96" }, { "task_id": "ws_B08T1QVF28_5165", "instruction": "i need a blanket with lighthouse printing with 70x90\" in grey brown", "target_attributes": { "attributes": [ "printing technology" ], "options": [ "grey brown", "70\" x 90\"" ] }, "asin": "B08T1QVF28" }, { "task_id": "ws_B07GGP87JS_5166", "instruction": "i would like a 2xl black and white hoodie that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "sky-black+white", "xx-large" ] }, "asin": "B07GGP87JS" }, { "task_id": "ws_B08R617FRZ_5167", "instruction": "i would like a bottle of coffee time romance nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "a-coffee time romance" ] }, "asin": "B08R617FRZ" }, { "task_id": "ws_B08ZH4R64F_5168", "instruction": "i'm looking for a organic certified garbanzo beans that contains dietary fiber and low sodium level. also, choose a pack of 1 weights 15 pounds with conventional one.", "target_attributes": { "attributes": [ "low sodium", "certified organic", "gluten free", "dietary fiber" ], "options": [ "conventional", "15 pound (pack of 1)" ] }, "asin": "B08ZH4R64F" }, { "task_id": "ws_B0108L1GBC_5169", "instruction": "i want a gluten free apple strawberry snack gift.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B0108L1GBC" }, { "task_id": "ws_B0978YWGM2_5170", "instruction": "i'm searching for 650 pcs nail art gel polish remover", "target_attributes": { "attributes": [ "nail art" ], "options": [ "650 pcs" ] }, "asin": "B0978YWGM2" }, { "task_id": "ws_B00FBO8FF2_5171", "instruction": "i'm looking for a blue diamond almonds nut .", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sesame seeds", "4.25 ounce (pack of 12)" ] }, "asin": "B00FBO8FF2" }, { "task_id": "ws_B07XPRVK7F_5172", "instruction": "i am looking for a turquoise color turquoise", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "turquoise" ] }, "asin": "B07XPRVK7F" }, { "task_id": "ws_B08M6FCPH2_5173", "instruction": "find for gift: comfortable women's pink drawstring sweatpants high waist with pockets aragone my friend's favorite brand to train at the gym workout.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "pink" ] }, "asin": "B08M6FCPH2" }, { "task_id": "ws_B093YT1D4W_5174", "instruction": "i am looking for 2 sets of mesh laundry bags and should be medium sized.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YT1D4W" }, { "task_id": "ws_B08G1H75XN_5175", "instruction": "i would like a blue 2.95 foot wire pendent light for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue", "2.95ft wire,3-pack" ] }, "asin": "B08G1H75XN" }, { "task_id": "ws_B08YRJYQV2_5176", "instruction": "i am looking for a wooden storage rack that is easy to assemble and has exquisite workmanship.", "target_attributes": { "attributes": [ "easy assemble", "exquisite workmanship" ], "options": [] }, "asin": "B08YRJYQV2" }, { "task_id": "ws_B09DFJ8YHC_5177", "instruction": "for dry skin, i need three pack of foot scrub which also contains coconut oil.", "target_attributes": { "attributes": [ "coconut oil", "dry skin" ], "options": [ "three pack" ] }, "asin": "B09DFJ8YHC" }, { "task_id": "ws_B09K7J8C7Q_5178", "instruction": "i am looking for modern vanity lighting for bathroom. please choose chrome color.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "chrome" ] }, "asin": "B09K7J8C7Q" }, { "task_id": "ws_B08JZ275FK_5179", "instruction": "looking for one merry christmas cake toppers for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08JZ275FK" }, { "task_id": "ws_B010NBE6HI_5180", "instruction": "i'm looking for groceries for simple ingredients need to buy it for house usage.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "light", "30 ounce (pack of 6)" ] }, "asin": "B010NBE6HI" }, { "task_id": "ws_B010NBE6HI_5181", "instruction": "i am looking for 30 fl oz (pack of 1) - set of 2 new (two... size simple ingredients mayonnaise", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "30 fl oz (pack of 1) - set of 2 new (two..." ] }, "asin": "B010NBE6HI" }, { "task_id": "ws_B010NBE6HI_5182", "instruction": "i would like a bottle of 30 fluid ounce regular mayo with simple ingredients.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "regular", "30 fl oz (pack of 1)" ] }, "asin": "B010NBE6HI" }, { "task_id": "ws_B07GDJQFMY_5183", "instruction": "i am looking for 0.34 fluid ounce of medium colored concealer. also, please make sure that it is suitable for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "medium", "0.34 fl oz (pack of 1)" ] }, "asin": "B07GDJQFMY" }, { "task_id": "ws_B07GDJQFMY_5184", "instruction": "i would like a 0.34 fluid ounce bottle of bisque concealer for my dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "bisque", "0.34 fl oz (pack of 1)" ] }, "asin": "B07GDJQFMY" }, { "task_id": "ws_B092W45FY9_5185", "instruction": "i am looking for foldable wireless bluetooth headphones", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B092W45FY9" }, { "task_id": "ws_B08TDPMSBY_5186", "instruction": "i am looking for a great gift of breakfast & cereal bars of newtella crispies flavor.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "newtella crispies" ] }, "asin": "B08TDPMSBY" }, { "task_id": "ws_B08TDPMSBY_5187", "instruction": "i want lemon berry crispies in a gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "lemon berry crispies" ] }, "asin": "B08TDPMSBY" }, { "task_id": "ws_B07PM8LPWQ_5188", "instruction": "i am looking for a pack of 1 antiseptic mouthwash that is effective at eliminating bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "50.7 fl oz (pack of 1)" ] }, "asin": "B07PM8LPWQ" }, { "task_id": "ws_B09MTYJ4YV_5189", "instruction": "find me a large cardigan sweater for men in long sleeve and machine wash", "target_attributes": { "attributes": [ "machine wash", "long sleeve" ], "options": [] }, "asin": "B09MTYJ4YV" }, { "task_id": "ws_B084GRYF1C_5190", "instruction": "i am looking for a table + 4 grey chairs of clear glass and faux leather.", "target_attributes": { "attributes": [ "clear glass", "faux leather" ], "options": [ "table + 4 grey chairs" ] }, "asin": "B084GRYF1C" }, { "task_id": "ws_B09PYL51D3_5191", "instruction": "i'm looking for a wide leg, daily wear women's baggy jeans with high waist, button closure type made of polyester spandex. also choose x-large, aa-dark blue colored one.", "target_attributes": { "attributes": [ "wide leg", "high waist", "button closure", "polyester spandex", "daily wear" ], "options": [ "aa-dark blue", "x-large" ] }, "asin": "B09PYL51D3" }, { "task_id": "ws_B07L75Y8MD_5192", "instruction": "i'm looking for peanut butter chocolate chip protein bars. they need to be both dairy free and gluten free.", "target_attributes": { "attributes": [ "dairy free", "gluten free" ], "options": [ "peanut butter chocolate chip" ] }, "asin": "B07L75Y8MD" }, { "task_id": "ws_B09JSWM642_5193", "instruction": "multi stick trio cream that is easy to apply also choose sweet pink rose", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "sweet pink rose" ] }, "asin": "B09JSWM642" }, { "task_id": "ws_B098B8M9P7_5194", "instruction": "i am looking for a medium size low rise underwear string for men.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "medium" ] }, "asin": "B098B8M9P7" }, { "task_id": "ws_B09G65YNVN_5195", "instruction": "i am looking for santa red color birthday cake", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "santa claus-red" ] }, "asin": "B09G65YNVN" }, { "task_id": "ws_B08FR3BGFW_5196", "instruction": "1 pacj of deep nourishing hair mask for hair treatment", "target_attributes": { "attributes": [ "hair treatment" ], "options": [ "pack of 1" ] }, "asin": "B08FR3BGFW" }, { "task_id": "ws_B0984HCLKB_5197", "instruction": "i am looking for green beans pickle in a jar. it should be made of natural infredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "green beans" ] }, "asin": "B0984HCLKB" }, { "task_id": "ws_B08R9YKM5S_5198", "instruction": "get me height adjustable pendant light with easy installation feature for dining room and in large wood chandelier size", "target_attributes": { "attributes": [ "height adjustable", "easy install", "pendant light", "dining room" ], "options": [ "large wood chandelier" ] }, "asin": "B08R9YKM5S" }, { "task_id": "ws_B09P9XNWDQ_5199", "instruction": "i need a gluten free popped veggie chips of 10 packs", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "0.75 ounce (pack of 10)" ] }, "asin": "B09P9XNWDQ" }, { "task_id": "ws_B09FK3D6KY_5200", "instruction": "i am looking for a light blue color anti slip boots with rubber sole for women. also choose size 9.5.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "4light blue", "9.5" ] }, "asin": "B09FK3D6KY" }, { "task_id": "ws_B09DJY3N7N_5201", "instruction": "i am trying to find carolina herrera good girl impression scent and it should be in travel size long lasting and high quality.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "long lasting" ], "options": [] }, "asin": "B09DJY3N7N" }, { "task_id": "ws_B09DJY3N7N_5202", "instruction": "i am looking for a travel size, alcohol free eau de parfum for women of estee lauder beautiful impression scent.", "target_attributes": { "attributes": [ "travel size", "alcohol free" ], "options": [ "estee lauder beautiful impression" ] }, "asin": "B09DJY3N7N" }, { "task_id": "ws_B09DJY3N7N_5203", "instruction": "i am looking for a long lasting travel size bottle of michael kors sexy amber impression perfume.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "michael kors sexy amber impression" ] }, "asin": "B09DJY3N7N" }, { "task_id": "ws_B09DJY3N7N_5204", "instruction": "i am looking for le labo bergamote 22 impression and alcohol-free travel size concentrated hypoallergenic vegan attar roll-on for women", "target_attributes": { "attributes": [ "travel size", "alcohol free" ], "options": [ "le labo bergamote 22 impression" ] }, "asin": "B09DJY3N7N" }, { "task_id": "ws_B09DJY3N7N_5205", "instruction": "i am looking for ca perfume impression of anais anais which is esay to carry with high quality , long lasting, alcohol free. nina ricci l'air du temps impression scent preferable.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "high quality", "long lasting" ], "options": [ "nina ricci l'air du temps impression" ] }, "asin": "B09DJY3N7N" }, { "task_id": "ws_B09PTNHZ5P_5206", "instruction": "i'm looking for teeth cleansing for teeth whitening and the fresh breathe.", "target_attributes": { "attributes": [ "teeth whitening", "fresh breath", "sensitive teeth" ], "options": [] }, "asin": "B09PTNHZ5P" }, { "task_id": "ws_B09FL11QF8_5207", "instruction": "i want to buy a red watch band for my 42 millimeter apple watch.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "red", "42mm | 44mm | 45mm" ] }, "asin": "B09FL11QF8" }, { "task_id": "ws_B01KHSV0TE_5208", "instruction": "i'm looking for eye shadow to use for eye makeup the needed color was caramel.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "caramel" ] }, "asin": "B01KHSV0TE" }, { "task_id": "ws_B01KHSV0TE_5209", "instruction": "i want a .18 ounce pack of revlon colorstay creme eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "0.18 ounce (pack of 1)" ] }, "asin": "B01KHSV0TE" }, { "task_id": "ws_B09NY1YLKM_5210", "instruction": "i'm looking for computer accessories and its easy to carry and it need to buy it.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "2" ] }, "asin": "B09NY1YLKM" }, { "task_id": "ws_B09R1M9SRV_5211", "instruction": "i am searching for a high definition stereo sound hands free portable bluetooth speaker. also, choose the b color.", "target_attributes": { "attributes": [ "hands free", "high definition", "stereo sound" ], "options": [ "b" ] }, "asin": "B09R1M9SRV" }, { "task_id": "ws_B09RJYR8WC_5212", "instruction": "i am looking for a long sleeve women's jumpsuits of small size.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09RJYR8WC" }, { "task_id": "ws_B09J4PY9C9_5213", "instruction": "i am looking for brown colored kitchen table and chair set with storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "drift brown" ] }, "asin": "B09J4PY9C9" }, { "task_id": "ws_B01DEDTZ28_5214", "instruction": "i'm searching for men's stan smith rubber sole sneaker of size 5.5", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5.5" ] }, "asin": "B01DEDTZ28" }, { "task_id": "ws_B08KWJ2GT5_5215", "instruction": "i'm looking for a bath brush that is easy to clean and has a long handle for easy use. oh and it should be blue.", "target_attributes": { "attributes": [ "easy clean", "long handle" ], "options": [ "blue" ] }, "asin": "B08KWJ2GT5" }, { "task_id": "ws_B099XC5XYK_5216", "instruction": "i want a plant based, dairy free oat milk of about 4.4lb.", "target_attributes": { "attributes": [ "plant based", "dairy free" ], "options": [ "4.4 lb" ] }, "asin": "B099XC5XYK" }, { "task_id": "ws_B08ZDJZ5JD_5217", "instruction": "i'm looking for women's clothing it was long sleeve the color was hot pink.", "target_attributes": { "attributes": [ "daily casual", "elastic waist", "button closure", "long sleeve" ], "options": [ "z3-hot pink" ] }, "asin": "B08ZDJZ5JD" }, { "task_id": "ws_B09BZFSTNM_5218", "instruction": "i need a 3 panel african art for my living room wall.", "target_attributes": { "attributes": [ "living room" ], "options": [ "african wall art - 14", "3panel-s-(12x18inches x3pcs)" ] }, "asin": "B09BZFSTNM" }, { "task_id": "ws_B08RBZYY97_5219", "instruction": "i'm looking for fine mist and the bottles was continues that stream of water.", "target_attributes": { "attributes": [ "leak proof", "fine mist" ], "options": [ "9ml-5pack" ] }, "asin": "B08RBZYY97" }, { "task_id": "ws_B07YKG5J6L_5220", "instruction": "i am looking for 5mp ptz poe camera with 20x optical zoom lens.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "5mp ptz poe 20x camera" ] }, "asin": "B07YKG5J6L" }, { "task_id": "ws_B09MHG8DD6_5221", "instruction": "i need a pink pair of winter warm boots for a 9 year old kid. it has to be non slip ones.", "target_attributes": { "attributes": [ "winter warm", "non slip" ], "options": [ "b~pink", "9-9.5 years" ] }, "asin": "B09MHG8DD6" }, { "task_id": "ws_B08R34DR16_5222", "instruction": "i am looking for an easy to assemble blue home office desk chair with lumbar support.", "target_attributes": { "attributes": [ "easy assemble", "lumbar support" ], "options": [ "blue" ] }, "asin": "B08R34DR16" }, { "task_id": "ws_B0091F0XR0_5223", "instruction": "i am looking for 5p deep pink color concealer that is anti aging and cruelty free.", "target_attributes": { "attributes": [ "anti aging", "cruelty free" ], "options": [] }, "asin": "B0091F0XR0" }, { "task_id": "ws_B0091F0XR0_5224", "instruction": "i want light pink veil cosmetics complexion fix oil-free concealer.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "2p light pink" ] }, "asin": "B0091F0XR0" }, { "task_id": "ws_B0091F0XR0_5225", "instruction": "i want to find oil-free concealer that has a light, neutral color.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "2n light neutral" ] }, "asin": "B0091F0XR0" }, { "task_id": "ws_B08WHXNRY4_5226", "instruction": "i'm looking for intel core was computer accessories it was install at any.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "32gb ram |512gb ssd" ] }, "asin": "B08WHXNRY4" }, { "task_id": "ws_B07GBGZZLC_5227", "instruction": "i'd like a certfied organic 36 pack of 2 ounce vitality shot drink flavored lemon ginger", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "lemon ginger", "2 ounce (pack of 36)" ] }, "asin": "B07GBGZZLC" }, { "task_id": "ws_B07GBGZZLC_5228", "instruction": "i am looking for tulua apple cider vinegar lemon ginger flavored fruit juice that is certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "tulua apple cider vinegar lemon ginger" ] }, "asin": "B07GBGZZLC" }, { "task_id": "ws_B07WHYSQ5W_5229", "instruction": "i'm looking for a 80 miles signal amplifier booster for hd tv.", "target_attributes": { "attributes": [ "high power" ], "options": [ "xh-black" ] }, "asin": "B07WHYSQ5W" }, { "task_id": "ws_B08ZN3Q4DN_5230", "instruction": "i am looking for 3mp motion detection security camera.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "3mp" ] }, "asin": "B08ZN3Q4DN" }, { "task_id": "ws_B07D9WKMDG_5231", "instruction": "i'm looking for clothing for machinable wash and it makes confortable.", "target_attributes": { "attributes": [ "machine wash", "relaxed fit", "tumble dry" ], "options": [ "with gray camo pant" ] }, "asin": "B07D9WKMDG" }, { "task_id": "ws_B07S316QK8_5232", "instruction": "i want pure certified organic bpa free coconut oil for baking and cooking purpose size :128 fl oz", "target_attributes": { "attributes": [ "bpa free", "certified organic" ], "options": [ "128 fl oz (pack of 1)" ] }, "asin": "B07S316QK8" }, { "task_id": "ws_B09SQ7SG2L_5233", "instruction": "i looking a heavy duty height adjustable professional salon spa stool color:beige", "target_attributes": { "attributes": [ "height adjustable", "heavy duty" ], "options": [ "beige" ] }, "asin": "B09SQ7SG2L" }, { "task_id": "ws_B08N6LB8MH_5234", "instruction": "i am looking for arms lumbar support in grey", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "grey" ] }, "asin": "B08N6LB8MH" }, { "task_id": "ws_B08Q642VRV_5235", "instruction": "want to buy some peanut butter flavored cereal that is grain free and keto friendly. it needs to come in a 9 oz pack of four.", "target_attributes": { "attributes": [ "keto friendly", "grain free" ], "options": [ "peanut butter", "9 ounce (pack of 4)" ] }, "asin": "B08Q642VRV" }, { "task_id": "ws_B08Q642VRV_5236", "instruction": "i would like some maple waffle 1.27 ounce sugar free cereal.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "maple waffle", "1.27 ounce (pack of 6)" ] }, "asin": "B08Q642VRV" }, { "task_id": "ws_B08SH3J22Q_5237", "instruction": "i'm looking for groceries shop for buying zero sugar and the flavor was french vanilla.", "target_attributes": { "attributes": [ "lactose free", "dairy free", "zero sugar" ], "options": [ "french vanilla" ] }, "asin": "B08SH3J22Q" }, { "task_id": "ws_B08NX3695X_5238", "instruction": "i want a non slip case cover for my motorola one phone.", "target_attributes": { "attributes": [ "non slip", "case cover" ], "options": [] }, "asin": "B08NX3695X" }, { "task_id": "ws_B09JWT9VVX_5239", "instruction": "i'm looking for need to clean my teeth adn it was prevention of oral care.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "coconut" ] }, "asin": "B09JWT9VVX" }, { "task_id": "ws_B0895CV637_5240", "instruction": "i'm in need of a stereo sound, pink color alarm clock radio", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "pink" ] }, "asin": "B0895CV637" }, { "task_id": "ws_B087CXMMQM_5241", "instruction": "i need a big rug with a fuzzy non-stick surface.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "4x5.9 feet" ] }, "asin": "B087CXMMQM" }, { "task_id": "ws_B08Y6NSWS4_5242", "instruction": "i need a high performance bluetooth speakers that can be used for indoor parties. please choose the gray one.", "target_attributes": { "attributes": [ "high performance", "stereo sound" ], "options": [ "gray" ] }, "asin": "B08Y6NSWS4" }, { "task_id": "ws_B07QK2FTWT_5243", "instruction": "i want lead free long lasting scented candle scent : cinnamon apple", "target_attributes": { "attributes": [ "lead free", "long lasting" ], "options": [ "cinnamon apple", "ring (size 5)" ] }, "asin": "B07QK2FTWT" }, { "task_id": "ws_B07QK2FTWT_5244", "instruction": "i am looking for long lasting candle. please choose creme brulee scent.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "creme brulee" ] }, "asin": "B07QK2FTWT" }, { "task_id": "ws_B000XEF5OO_5245", "instruction": "i am looking for a travel size moschino miniature eau de toilette.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B000XEF5OO" }, { "task_id": "ws_B083XPLGC3_5246", "instruction": "i want to buy a box of savory fava bean snacks that are non-gmo. find the pack that has 21 bags.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "the savory box", "1 ounce (pack of 21)" ] }, "asin": "B083XPLGC3" }, { "task_id": "ws_B0719R1WZ7_5247", "instruction": "i need an area rug for my living room in wineberry color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "wineberry" ] }, "asin": "B0719R1WZ7" }, { "task_id": "ws_B00PYUS4PY_5248", "instruction": "i'm looking for an oil free fine mist makeup foundation. also, choose the buff beige color.", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B00PYUS4PY" }, { "task_id": "ws_B09RFDWPX9_5249", "instruction": "i'm looking for a relax fit fashion designed long sleeve lapel coats for women. also, choose xx-large size z4 black colored one.", "target_attributes": { "attributes": [ "long sleeve", "fashion design", "relaxed fit" ], "options": [ "z4-black", "xx-large" ] }, "asin": "B09RFDWPX9" }, { "task_id": "ws_B09M7PMKJP_5250", "instruction": "i am looking for a classic fit t-shirt for a youth girl. also choose asphalt color and x-small size.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "asphalt", "youth", "x-small" ] }, "asin": "B09M7PMKJP" }, { "task_id": "ws_B07P1Z265L_5251", "instruction": "i am looking for a black rose high speed automobile chargers", "target_attributes": { "attributes": [ "high speed" ], "options": [ "black rose" ] }, "asin": "B07P1Z265L" }, { "task_id": "ws_B09LZ6DN9L_5252", "instruction": "i am looking for a pair of men's size 48 blue winter shoes with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "blue", "48" ] }, "asin": "B09LZ6DN9L" }, { "task_id": "ws_B08GY8HNL9_5253", "instruction": "i want a bedside table with a wooden cabinet in my living room. it should be green in color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green" ] }, "asin": "B08GY8HNL9" }, { "task_id": "ws_B085W67P7L_5254", "instruction": "i am looking for travel foaming dispenser for hand soap. please choose rose gold and silver pump head.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "silver pump head" ] }, "asin": "B085W67P7L" }, { "task_id": "ws_B09MMFQFZJ_5255", "instruction": "i would like a op99 phone case cover.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "op99" ] }, "asin": "B09MMFQFZJ" }, { "task_id": "ws_B01MZWL5Y3_5256", "instruction": "i want a fully assembled desk converter that would fit 2 monitors.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [] }, "asin": "B01MZWL5Y3" }, { "task_id": "ws_B00J4OTK9A_5257", "instruction": "get me a body scrub to remove dead skin. pick a 3.4 fl oz pack that is meant for sensitive skin.", "target_attributes": { "attributes": [ "dead skin", "sensitive skin" ], "options": [ "3.4 fl oz (pack of 1)" ] }, "asin": "B00J4OTK9A" }, { "task_id": "ws_B09NKV2PYS_5258", "instruction": "i need an easy use but high quality beauty ice contour mold skin care tool. pink color will work for me.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "pink" ] }, "asin": "B09NKV2PYS" }, { "task_id": "ws_B079S8B9SF_5259", "instruction": "get me a gluten and nut free ready to eat plant based vegan meal variety pack in size 2.29 ounce (pack of 4).", "target_attributes": { "attributes": [ "ready eat", "gluten free", "nut free" ], "options": [ "variety pack", "2.29 ounce (pack of 4)" ] }, "asin": "B079S8B9SF" }, { "task_id": "ws_B079S8B9SF_5260", "instruction": "i am looking for a 2.3 ounce (pack of 4) size of plant based, gluten free and non gmo side dishes", "target_attributes": { "attributes": [ "plant based", "gluten free", "non gmo" ], "options": [ "2.3 ounce (pack of 4)" ] }, "asin": "B079S8B9SF" }, { "task_id": "ws_B079S8B9SF_5261", "instruction": "i am interested in a ready to eat millet and lentil packet that comes in a pack of 8", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "jaipur millet & lentil", "2.3 ounce (pack of 8)" ] }, "asin": "B079S8B9SF" }, { "task_id": "ws_B09GNR9BS1_5262", "instruction": "i need a long lasting perfume that is unisex and alcohol free.", "target_attributes": { "attributes": [ "long lasting", "alcohol free" ], "options": [] }, "asin": "B09GNR9BS1" }, { "task_id": "ws_B07X2T33Q4_5263", "instruction": "i an looking for electric hair cream mixer, automatic hair dye mixing bowl, usb rechargeable hair dyeing, color diy mixer for salon home use which is durable and lightweight. will not mold, peel, crack, warp, absorb odors, or fade. portable size, convenient to carry..suitable for professional salon hairstylist or home personal use.2 in 1 includes a bowl and a dyestuff whisk, meeting basic demands on hair dying.", "target_attributes": { "attributes": [ "easy clean", "high quality", "hair dye" ], "options": [ "1#" ] }, "asin": "B07X2T33Q4" }, { "task_id": "ws_B01H6PX8AK_5264", "instruction": "i want lumabase 30748 votive candles in clear glass holders - set of 12", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B01H6PX8AK" }, { "task_id": "ws_B0913HN2QV_5265", "instruction": "i am looking for a makeup chair with metal legs for my living room. pick something in blue.", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [ "blue" ] }, "asin": "B0913HN2QV" }, { "task_id": "ws_B07LFT8MFW_5266", "instruction": "i am looking for gluten free strawberry juicy gels.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07LFT8MFW" }, { "task_id": "ws_B08LN5YSLR_5267", "instruction": "please find an easy use shower scalp scrubber tool in the color pink for hair care", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B08LN5YSLR" }, { "task_id": "ws_B004K025J0_5268", "instruction": "i am looking high speed hdmi cable. size should be 3 feet.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 ft. slim" ] }, "asin": "B004K025J0" }, { "task_id": "ws_B082G4HM4S_5269", "instruction": "i want a swappable top for my phone with wireless charging. it should have jacksonville jaguars logo.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "jacksonville jaguars logo" ] }, "asin": "B082G4HM4S" }, { "task_id": "ws_B09MTYKWTR_5270", "instruction": "i am looking for whitening massage manual easy use toothbrush with handle for boy with color d", "target_attributes": { "attributes": [ "easy use" ], "options": [ "d" ] }, "asin": "B09MTYKWTR" }, { "task_id": "ws_B06XH86JBZ_5271", "instruction": "i want to find 6 ounces of goji colored blueberry powder that is high in dietary fiber.", "target_attributes": { "attributes": [ "dietary fiber" ], "options": [ "goji", "6 ounce" ] }, "asin": "B06XH86JBZ" }, { "task_id": "ws_B06XH86JBZ_5272", "instruction": "i'm looking for a nubeleaf blackberry powder.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "banana", "6 ounce (pack of 1)" ] }, "asin": "B06XH86JBZ" }, { "task_id": "ws_B08WCM5XT3_5273", "instruction": "i'm looking for easy apply for hair removal in natural ingredients. it can easily apply.", "target_attributes": { "attributes": [ "natural ingredients", "hair removal" ], "options": [] }, "asin": "B08WCM5XT3" }, { "task_id": "ws_B00487L2Y4_5274", "instruction": "i need some spacedye spandex leggings.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "skystorm spacedye" ] }, "asin": "B00487L2Y4" }, { "task_id": "ws_B00487L2Y4_5275", "instruction": "i'm looking for a high waist shapewear leggings in heather charcoal color and in size large.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "heather charcoal", "large" ] }, "asin": "B00487L2Y4" }, { "task_id": "ws_B09KV1BXST_5276", "instruction": "i'm looking for a lace silk pajama lingerie for women with long sleeves and made of good quality polyester material. also, choose large size wine colored one.", "target_attributes": { "attributes": [ "quality polyester", "long sleeve" ], "options": [ "wine", "large" ] }, "asin": "B09KV1BXST" }, { "task_id": "ws_B084ZHHY5H_5277", "instruction": "i would like a size 11 women's slate colored clog with a rubber sole.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "slate", "11 women | 9 men" ] }, "asin": "B084ZHHY5H" }, { "task_id": "ws_B01IDDRDRI_5278", "instruction": "i am looking for a pack of 6 12 ounce gluten free coffee creamer.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12 ounce (pack of 6)" ] }, "asin": "B01IDDRDRI" }, { "task_id": "ws_B06W5BQ95C_5279", "instruction": "i would like a 1.25 ounce container of probiotics from natural ingredients. i would like 24 of them.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "1.25 ounce (pack of 24)" ] }, "asin": "B06W5BQ95C" }, { "task_id": "ws_B07N3NN79M_5280", "instruction": "looking for a black 28\" inseam 3 x-large machine wash, drawstring closure men's straight fit modern stretch pant made by goodthreads.", "target_attributes": { "attributes": [ "machine wash", "drawstring closure" ], "options": [ "black", "3x-large | 28\" inseam" ] }, "asin": "B07N3NN79M" }, { "task_id": "ws_B00ICSCDW0_5281", "instruction": "i am looking for cruelty free beard oil with sandalwood", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "sandalwood" ] }, "asin": "B00ICSCDW0" }, { "task_id": "ws_B08X3R2V9S_5282", "instruction": "i'm looking for a gourmet food gift basket that is perfect for valentine's day", "target_attributes": { "attributes": [ "gift basket", "valentine day" ], "options": [] }, "asin": "B08X3R2V9S" }, { "task_id": "ws_B09K5SWKWK_5283", "instruction": "i'm looking for strawberry & yogurt pretzels artificial flavors snacks", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [] }, "asin": "B09K5SWKWK" }, { "task_id": "ws_B095VX97GN_5284", "instruction": "i want an easy to carry storage case for my cosmetics that is multi-colored.", "target_attributes": { "attributes": [ "easy carry", "storage case" ], "options": [ "multi 7" ] }, "asin": "B095VX97GN" }, { "task_id": "ws_B095VX97GN_5285", "instruction": "i'm looking for native american indian dream catcher feathers talisman.", "target_attributes": { "attributes": [ "storage case" ], "options": [] }, "asin": "B095VX97GN" }, { "task_id": "ws_B07ZJC7G3N_5286", "instruction": "i'm looking for an ottoman cover made of beige faux leather.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "beige" ] }, "asin": "B07ZJC7G3N" }, { "task_id": "ws_B08Y8YNMRP_5287", "instruction": "i need a short sleeved top for a teen girl. it should be xx-large in size.", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "xx-large" ] }, "asin": "B08Y8YNMRP" }, { "task_id": "ws_B073B57CQZ_5288", "instruction": "find me a backdrop vertical striped easy carry for digital photography in 5x7 ft", "target_attributes": { "attributes": [ "easy carry", "digital photography" ], "options": [ "5x7ft" ] }, "asin": "B073B57CQZ" }, { "task_id": "ws_B01N4LEQE5_5289", "instruction": "i need a twin size fully assembled plush mattress, which should have 8' split foundation with frame.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "twin", "8' split foundation with frame" ] }, "asin": "B01N4LEQE5" }, { "task_id": "ws_B0992D6BFT_5290", "instruction": "i am looking for a light brown color faux leather storage benches for living room", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "light brown" ] }, "asin": "B0992D6BFT" }, { "task_id": "ws_B07CR9MGLG_5291", "instruction": "i'm looking for curtains for living room and it color was white.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B07CR9MGLG" }, { "task_id": "ws_B075YM97NK_5292", "instruction": "i am looking for wood split box spring of california king sized.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "california king" ] }, "asin": "B075YM97NK" }, { "task_id": "ws_B00V5KRF66_5293", "instruction": "i'm looking for god plated converter for combo kit and need to buy it.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "combo kit" ] }, "asin": "B00V5KRF66" }, { "task_id": "ws_B09Q6B974T_5294", "instruction": "find me a small long sleeve sweatshirt in green", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "new dressy - b133 -green", "small" ] }, "asin": "B09Q6B974T" }, { "task_id": "ws_B09LGXTKSH_5295", "instruction": "i'm looking for a smart remote control included with batteries. also, that battery type should be aaa size.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B09LGXTKSH" }, { "task_id": "ws_B08QMDM179_5296", "instruction": "i am looking for lace closure men sneaker. please select 16 size.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "16" ] }, "asin": "B08QMDM179" }, { "task_id": "ws_B07ZR8KF4C_5297", "instruction": "i need an easy to use tofu drainer for tofu bricks.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "8-12 oz bricks of tofu" ] }, "asin": "B07ZR8KF4C" }, { "task_id": "ws_B097R6HS3G_5298", "instruction": "i would like a medium snickers tracksuit for my gym workout.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "snickers", "medium" ] }, "asin": "B097R6HS3G" }, { "task_id": "ws_B097H8C87M_5299", "instruction": "i am looking for high density tri-fold full memory foam mattress with size :twin xl and 3\" blue", "target_attributes": { "attributes": [ "high density" ], "options": [ "twin xl", "3\" blue" ] }, "asin": "B097H8C87M" }, { "task_id": "ws_B09K813WBQ_5300", "instruction": "i am looking for a cupcake topper for a family birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09K813WBQ" }, { "task_id": "ws_B09QKZ1GSS_5301", "instruction": "i'm looking for daily wear open toe shoes that was blue in color.", "target_attributes": { "attributes": [ "open toe", "teen girls", "daily wear" ], "options": [ "blue" ] }, "asin": "B09QKZ1GSS" }, { "task_id": "ws_B07GVBWL3Q_5302", "instruction": "i'm looking for a 84 inch green lazzzy blackout velvet curtains.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold brown", "63 inch" ] }, "asin": "B07GVBWL3Q" }, { "task_id": "ws_B00J1NGCF4_5303", "instruction": "i am looking for a skin brush with natural bristles and a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B00J1NGCF4" }, { "task_id": "ws_B07L1R7YQ9_5304", "instruction": "i am looking bpa free fine mist high quality case color silver color size 3.4 ounce", "target_attributes": { "attributes": [ "bpa free", "high quality", "fine mist" ], "options": [ "silver frosted", "3.4 ounce (pack of 2)" ] }, "asin": "B07L1R7YQ9" }, { "task_id": "ws_B07PTT1PW4_5305", "instruction": "i am looking for a 180w x 5 power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "180w x 5" ] }, "asin": "B07PTT1PW4" }, { "task_id": "ws_B09L1MPCY9_5306", "instruction": "i would like to buy a machine washable quick drying butt lifting tummy controlling women legging in ywhite color and small size made from quality polyester .", "target_attributes": { "attributes": [ "butt lifting", "quick drying", "machine wash", "quality polyester", "tummy control" ], "options": [ "ywhite", "small" ] }, "asin": "B09L1MPCY9" }, { "task_id": "ws_B01LWUENY1_5307", "instruction": "i need a 10' round area rug for my living room. it should be ivory colored.", "target_attributes": { "attributes": [ "living room" ], "options": [ "red | ivory", "10' round" ] }, "asin": "B01LWUENY1" }, { "task_id": "ws_B00DQJYL2K_5308", "instruction": "liquid water identifier strawberry watermelon flavor and natural flavor", "target_attributes": { "attributes": [ "natural flavors" ], "options": [] }, "asin": "B00DQJYL2K" }, { "task_id": "ws_B00DQJYL2K_5309", "instruction": "i am looking a natural flavor sugar free straberry kiwi water enhancer", "target_attributes": { "attributes": [ "sugar free", "natural flavors" ], "options": [ "sugar-free strawberry kiwi" ] }, "asin": "B00DQJYL2K" }, { "task_id": "ws_B081J2PSXK_5310", "instruction": "i am looking for a dome cameras of 1080p hd", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B081J2PSXK" }, { "task_id": "ws_B00FDM5NAM_5311", "instruction": "i am looking for a real fruit juice of cranberry cocktail juice drink flavor", "target_attributes": { "attributes": [ "real fruit" ], "options": [ "cranberry cocktail juice drink" ] }, "asin": "B00FDM5NAM" }, { "task_id": "ws_B06XV4LYZC_5312", "instruction": "i need a janet color low rise women's jeans with quality material in size 7-36", "target_attributes": { "attributes": [ "low rise", "quality materials" ], "options": [ "janet", "7-36" ] }, "asin": "B06XV4LYZC" }, { "task_id": "ws_B07JJDXFJL_5313", "instruction": "i am looking for home decor products for living room in a ivory /aqua color", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B07JJDXFJL" }, { "task_id": "ws_B09Q25X4NJ_5314", "instruction": "i would like a pair of size 7 black oxfords with a anti slip rubber sole.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "black-2", "7" ] }, "asin": "B09Q25X4NJ" }, { "task_id": "ws_B008BZSXEG_5315", "instruction": "i am looking for low fat pasta options", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B008BZSXEG" }, { "task_id": "ws_B07ZK5QW3P_5316", "instruction": "i'm looking for a machine washable window curtains for living room. also choose 52\"w by 90\"l and lace4lbg0839 designed one.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "lace4lbg0839", "52\" w by 90\" l" ] }, "asin": "B07ZK5QW3P" }, { "task_id": "ws_B0794T7QHW_5317", "instruction": "i need a king sized, white coloured contemporary style wooden frame bed with memory foam.", "target_attributes": { "attributes": [ "contemporary style", "memory foam", "wood frame" ], "options": [ "white", "king" ] }, "asin": "B0794T7QHW" }, { "task_id": "ws_B097MRL84T_5318", "instruction": "i'm looking for living room furniture and kitchen furniture and need to buy it.", "target_attributes": { "attributes": [ "wood frame", "living room" ], "options": [ "grey" ] }, "asin": "B097MRL84T" }, { "task_id": "ws_B00T3IQUDG_5319", "instruction": "i am looking for a pair of long lasting men's size 10 steel toe work boots.", "target_attributes": { "attributes": [ "long lasting", "steel toe" ], "options": [ "10 wide" ] }, "asin": "B00T3IQUDG" }, { "task_id": "ws_B07PYQN77F_5320", "instruction": "i'm looking for a 24 pcs arrow cupcake topper .", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold" ] }, "asin": "B07PYQN77F" }, { "task_id": "ws_B09QLL279P_5321", "instruction": "i am looking for chocolate covered wafers for valentine day.", "target_attributes": { "attributes": [ "chocolate covered", "valentine day" ], "options": [] }, "asin": "B09QLL279P" }, { "task_id": "ws_B08KW5D1HG_5322", "instruction": "i am looking for a large sized makeup case that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "large" ] }, "asin": "B08KW5D1HG" }, { "task_id": "ws_B019EGM90O_5323", "instruction": "get me 6 bars of gluten free low sodium 0g trans in flavor of dark chocolate nuts & sea salt.", "target_attributes": { "attributes": [ "low sodium", "gluten free", "0g trans" ], "options": [ "dark chocolate nuts & sea salt", "6 bars" ] }, "asin": "B019EGM90O" }, { "task_id": "ws_B019EGM90O_5324", "instruction": "i would like 60 milk chocolate peanut butter bars that are low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "milk chocolate peanut butter", "60 count (pack of 1)" ] }, "asin": "B019EGM90O" }, { "task_id": "ws_B089HY61CM_5325", "instruction": "i am looking for a low soda cream soda flavor chocolate drink mixes", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "cream soda" ] }, "asin": "B089HY61CM" }, { "task_id": "ws_B09SB86W2G_5326", "instruction": "i am looking for a professional make up brush with easy use. also choose color b.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "b" ] }, "asin": "B09SB86W2G" }, { "task_id": "ws_B003YFLT0S_5327", "instruction": "i am searching for heavy duty complete tripods.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B003YFLT0S" }, { "task_id": "ws_B09NR6SYTV_5328", "instruction": "i'm looking for a wireless bluetooth speaker, preferable blue color.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B09NR6SYTV" }, { "task_id": "ws_B09CKVPQZF_5329", "instruction": "i need some easy to install 76 inch blinds for my living room. look for them in light grey.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "light grey", "15 3 | 4\"w x 76\"h" ] }, "asin": "B09CKVPQZF" }, { "task_id": "ws_B09CKVPQZF_5330", "instruction": "shop for some easy install living room shades. get the fifty two inch ones with top brackets.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "top brackets", "64 1 | 4\"w x 52\"h" ] }, "asin": "B09CKVPQZF" }, { "task_id": "ws_B09MK2BWKX_5331", "instruction": "i need noise cancelling headphones for my daily running routine.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B09MK2BWKX" }, { "task_id": "ws_B08FSSZXV9_5332", "instruction": "i want a gray colored lightweight throw for the living room. i would prefer it to be double sided.", "target_attributes": { "attributes": [ "double sided", "living room" ], "options": [ "grey" ] }, "asin": "B08FSSZXV9" }, { "task_id": "ws_B09PKTZ1JR_5333", "instruction": "i want to buy a shoe cabinet for my living room which is in pink color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink 3" ] }, "asin": "B09PKTZ1JR" }, { "task_id": "ws_B097K5Q32R_5334", "instruction": "i'm looking for plug play electronics for computer components and need to buy it.", "target_attributes": { "attributes": [ "high performance", "plug play" ], "options": [ "3600 mhz" ] }, "asin": "B097K5Q32R" }, { "task_id": "ws_B09J29BV3V_5335", "instruction": "i am looking for a foldable tatami mattress to reduce on my storage space. the best size would be 90x200 cm (35.4*78.7 in).", "target_attributes": { "attributes": [ "storage space" ], "options": [ "90x200 cm (35.4*78.7 in)" ] }, "asin": "B09J29BV3V" }, { "task_id": "ws_B097R6WTWX_5336", "instruction": "i looking wooden frame mid century sofa couch for leaving room colour :blue", "target_attributes": { "attributes": [ "mid century", "wood frame", "living room" ], "options": [ "navy" ] }, "asin": "B097R6WTWX" }, { "task_id": "ws_B097R6WTWX_5337", "instruction": "i would like a beige type 4 sofa for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige", "type-4" ] }, "asin": "B097R6WTWX" }, { "task_id": "ws_B097R6WTWX_5338", "instruction": "i need grey color wood frame", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "grey" ] }, "asin": "B097R6WTWX" }, { "task_id": "ws_B08V96ZSKJ_5339", "instruction": "i'm looking for cell phone accessories the color was red brushed tpu. it was need to buy.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "red brushed tpu" ] }, "asin": "B08V96ZSKJ" }, { "task_id": "ws_B08V96ZSKJ_5340", "instruction": "i would like a blue brush tpu case that is non slip.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "blue brushed tpu" ] }, "asin": "B08V96ZSKJ" }, { "task_id": "ws_B09NQ4LHV7_5341", "instruction": "find me a pair of non slip sneakers with rubber soles. i am a woman of size 13.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "13 women | 11 men" ] }, "asin": "B09NQ4LHV7" }, { "task_id": "ws_B01MT7DMLK_5342", "instruction": "i'm looking for pendant lights for hanging through the wall that color was chrome finish.", "target_attributes": { "attributes": [ "bronze finish", "pendant light" ], "options": [ "chrome finish" ] }, "asin": "B01MT7DMLK" }, { "task_id": "ws_B01MT7DMLK_5343", "instruction": "i need a pendant light wall fixture for my bathroom. it should have a bronze finish.", "target_attributes": { "attributes": [ "bronze finish", "pendant light" ], "options": [ "wall bath fixture" ] }, "asin": "B01MT7DMLK" }, { "task_id": "ws_B01MT7DMLK_5344", "instruction": "where can i find this product? seagull lighting 65625-782 wheaton transitional a pendant light hanging light fixture modern, bronze finish", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "one - light" ] }, "asin": "B01MT7DMLK" }, { "task_id": "ws_B09J35VQXQ_5345", "instruction": "i'm looking for natural jar candles with grapefruit and mangosteen scents and which are made with 100% soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "grapefruit & mangosteen", "natural" ] }, "asin": "B09J35VQXQ" }, { "task_id": "ws_B09J35VQXQ_5346", "instruction": "i'm looking for a lead free jar candles made of soy wax. also choose natural, coconut milk and mango scented one", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [ "coconut milk and mango", "natural" ] }, "asin": "B09J35VQXQ" }, { "task_id": "ws_B0982XLQVB_5347", "instruction": "i am looking for a blue coated steel backyard furniture set.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "blue" ] }, "asin": "B0982XLQVB" }, { "task_id": "ws_B09NYD8KN9_5348", "instruction": "i need fluoride free 2 pcs purple toothpaste which is good for sensitive teeth and teeth whitening.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening", "sensitive teeth" ], "options": [ "purple 2pcs" ] }, "asin": "B09NYD8KN9" }, { "task_id": "ws_B09NYD8KN9_5349", "instruction": "i want a purple and orange toothpaste that is fluoride free and whitens teeth.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening" ], "options": [ "purple+orange" ] }, "asin": "B09NYD8KN9" }, { "task_id": "ws_B08F9VJ7FV_5350", "instruction": "i'm looking for a black guitar cable with usb port and it should be 10ft long.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B08F9VJ7FV" }, { "task_id": "ws_B00IWVEJUG_5351", "instruction": "i am looking for eco friendly scented candles", "target_attributes": { "attributes": [ "eco friendly" ], "options": [] }, "asin": "B00IWVEJUG" }, { "task_id": "ws_B08P7YXY4C_5352", "instruction": "i need a quad core hd streaming player with enhanced voice remote", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B08P7YXY4C" }, { "task_id": "ws_B07N98D4C6_5353", "instruction": "i would like a fluoride free toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B07N98D4C6" }, { "task_id": "ws_B07MMTQYGL_5354", "instruction": "i am looking for a color: blue zebra water resistant , wireless bluetooth for portable bluetooth speakers", "target_attributes": { "attributes": [ "water resistant", "wireless bluetooth" ], "options": [ "blue zebra" ] }, "asin": "B07MMTQYGL" }, { "task_id": "ws_B08PJHS91C_5355", "instruction": "i am looking for some grass fed and grain free bread and muffin mix.", "target_attributes": { "attributes": [ "grain free", "grass fed" ], "options": [ "grain free bread" ] }, "asin": "B08PJHS91C" }, { "task_id": "ws_B08DG8ZHDT_5356", "instruction": "i'm looking for electronics accessories that aluminum alloy tripod. need to buy it.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B08DG8ZHDT" }, { "task_id": "ws_B09M3LBGVG_5357", "instruction": "i am looking for a grey wireless charging earbud headphones with stereo sound", "target_attributes": { "attributes": [ "wireless charging", "stereo sound" ], "options": [] }, "asin": "B09M3LBGVG" }, { "task_id": "ws_B09MJXZ9PQ_5358", "instruction": "i'm looking for a classic styling salon chair, hydraulic barber chair with wider seat & heavy duty hydraulic pump, also it should have beauty salon spa shampoo equipment, choose the gold color.", "target_attributes": { "attributes": [ "heavy duty", "easy clean", "high quality", "hair salon", "beauty salon" ], "options": [] }, "asin": "B09MJXZ9PQ" }, { "task_id": "ws_B09H6S736V_5359", "instruction": "i'm looking for a storage unit which is easy to clean for a living room.", "target_attributes": { "attributes": [ "easy clean", "storage unit", "living room" ], "options": [] }, "asin": "B09H6S736V" }, { "task_id": "ws_B01MQS07BG_5360", "instruction": "i'm looking for the pant have straight leg and the drawstring waist.", "target_attributes": { "attributes": [ "straight leg", "moisture wicking", "drawstring waist" ], "options": [ "wisteria" ] }, "asin": "B01MQS07BG" }, { "task_id": "ws_B09Q56WQGH_5361", "instruction": "i'm looking for highly pigmented makeup products it can use long lasting.", "target_attributes": { "attributes": [ "long lasting", "highly pigmented" ], "options": [ "k" ] }, "asin": "B09Q56WQGH" }, { "task_id": "ws_B09Q56WQGH_5362", "instruction": "i am interested in purchasing a lip gloss set which is long lasting and comes in the size g.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "g" ] }, "asin": "B09Q56WQGH" }, { "task_id": "ws_B08P59RBQ4_5363", "instruction": "looking for tooth powder for teeth whitening", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B08P59RBQ4" }, { "task_id": "ws_B078YYVN2F_5364", "instruction": "i am looking for large size regular fit polo.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "large" ] }, "asin": "B078YYVN2F" }, { "task_id": "ws_B09NFJWJYP_5365", "instruction": "i am looking a easy install smartwatch band compatible with apple color:midnight blue /cantaloupe size: 38mm/40mm/41mm", "target_attributes": { "attributes": [ "compatible apple", "easy install" ], "options": [ "midnight blue | cantaloupe", "38mm | 40mm | 41mm" ] }, "asin": "B09NFJWJYP" }, { "task_id": "ws_B09SV2GLZW_5366", "instruction": "i am looking for small sized and tummy control women workout legging.", "target_attributes": { "attributes": [ "tummy control" ], "options": [ "small" ] }, "asin": "B09SV2GLZW" }, { "task_id": "ws_B0861DHT1J_5367", "instruction": "i am looking for mlide men's summer quick dry fit performance short surf swim trunk drawstring with pockets. swim trunk featuring elasticized waistband with drawstring and contrast in green in xxl size.", "target_attributes": { "attributes": [ "drawstring closure", "polyester spandex" ], "options": [ "green", "xx-large" ] }, "asin": "B0861DHT1J" }, { "task_id": "ws_B01FA1BMSW_5368", "instruction": "i am looking for texas style flank steak beef jerky that has a resealable bag.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "texas style flank steak" ] }, "asin": "B01FA1BMSW" }, { "task_id": "ws_B09PLB5JYK_5369", "instruction": "i am looking for a blue loose fit sleep bottoms for men", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "blue" ] }, "asin": "B09PLB5JYK" }, { "task_id": "ws_B07CZC9Z3S_5370", "instruction": "i'm looking for a pack of 3 cheese crisps with 10 ounce need to be gluten and lactose free, savory seed flavor", "target_attributes": { "attributes": [ "gluten free", "lactose free" ], "options": [ "savory seed", "10 ounce (pack of 3)" ] }, "asin": "B07CZC9Z3S" }, { "task_id": "ws_B076C8KB1Z_5371", "instruction": "i am looking for a blue stripe classic fit dress shirts", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "blue stripe" ] }, "asin": "B076C8KB1Z" }, { "task_id": "ws_B081R4NL12_5372", "instruction": "i am looking for women\u2019s long pajama sleep pants with elastic waistband and small in size.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "small" ] }, "asin": "B081R4NL12" }, { "task_id": "ws_B08WJFNJ29_5373", "instruction": "i'm looking for a plant based healthy snacks which is gmo free and gluten free. also, choose a pack of 2 with coconut cashew pineapple mix and banana flavored one.", "target_attributes": { "attributes": [ "gmo free", "plant based", "gluten free" ], "options": [ "coconut cashew pineapple mix and banana", "2 pack" ] }, "asin": "B08WJFNJ29" }, { "task_id": "ws_B07D6RZQD3_5374", "instruction": "i am looking for a women's xx-large oatmeal | navy iowa state cyclones relaxed fit , fleece lined asym redux hoodie made by ouray sportswear.", "target_attributes": { "attributes": [ "fleece lined", "relaxed fit" ], "options": [ "oatmeal | navy", "xx-large", "iowa state cyclones" ] }, "asin": "B07D6RZQD3" }, { "task_id": "ws_B07D6RZQD3_5375", "instruction": "i would like a fleece lined extra large navy mississippi state bulldog sweatshirt.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "navy heather", "x-large", "mississippi state bulldogs" ] }, "asin": "B07D6RZQD3" }, { "task_id": "ws_B07D6RZQD3_5376", "instruction": "i am looking for relaxed fit small size hood.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "small" ] }, "asin": "B07D6RZQD3" }, { "task_id": "ws_B07D6RZQD3_5377", "instruction": "i am looking for medium sized and relaxed fitted men hoddie.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "medium" ] }, "asin": "B07D6RZQD3" }, { "task_id": "ws_B0963DN2YZ_5378", "instruction": "i am looking for queen size , super soft terracotta comforter set with 2 pillowcases and its color is 2-white chevron", "target_attributes": { "attributes": [ "queen size", "super soft" ], "options": [ "2-white chevron" ] }, "asin": "B0963DN2YZ" }, { "task_id": "ws_B09JLG556W_5379", "instruction": "i am looking for a rechargeable and portable hair removal device which is easy to carry. also choose white color.", "target_attributes": { "attributes": [ "easy carry", "hair removal" ], "options": [] }, "asin": "B09JLG556W" }, { "task_id": "ws_B09LXMCTN9_5380", "instruction": "i am looking for deluxe faux leather, box spring, easy assemble , wood bed frame with led headboard and color is black and queen size", "target_attributes": { "attributes": [ "easy assemble", "box spring", "faux leather", "wood frame" ], "options": [ "black", "queen" ] }, "asin": "B09LXMCTN9" }, { "task_id": "ws_B07ZHGYP5C_5381", "instruction": "i want an easy to use cd player that has batteries included.", "target_attributes": { "attributes": [ "batteries included", "easy use" ], "options": [] }, "asin": "B07ZHGYP5C" }, { "task_id": "ws_B093YS5HNS_5382", "instruction": "i'm looking for clothing need to buy it .", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YS5HNS" }, { "task_id": "ws_B01CPVOVNS_5383", "instruction": "i'm looking for white finish for kitchen and it was assembly required.", "target_attributes": { "attributes": [ "assembly required", "white finish" ], "options": [] }, "asin": "B01CPVOVNS" }, { "task_id": "ws_B09BCFFSGL_5384", "instruction": "i am looking for a queen size foam mattress that has 9 inch desnsity. please choose the black & white color", "target_attributes": { "attributes": [ "queen size", "memory foam" ], "options": [ "black & white", "9 inch" ] }, "asin": "B09BCFFSGL" }, { "task_id": "ws_B0915NK2BY_5385", "instruction": "i am looking for women hair removal rechargeable razor. please select white color.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "white" ] }, "asin": "B0915NK2BY" }, { "task_id": "ws_B08LR49S3W_5386", "instruction": "i am lookin g for a nut free, gluten free cake toppers", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [] }, "asin": "B08LR49S3W" }, { "task_id": "ws_B07MJRWZD3_5387", "instruction": "i want to get a black twin size bed frame.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "black" ] }, "asin": "B07MJRWZD3" }, { "task_id": "ws_B07MJRWZD3_5388", "instruction": "i am looking for a twin size bed that has storage. pick a cherry color.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "cherry" ] }, "asin": "B07MJRWZD3" }, { "task_id": "ws_B092S9J53G_5389", "instruction": "i'm looking for teeth whitening for oral care whitening kits.", "target_attributes": { "attributes": [ "teeth whitening", "easy use" ], "options": [ "1 tooth whitening trays" ] }, "asin": "B092S9J53G" }, { "task_id": "ws_B08J846WMR_5390", "instruction": "i am looking for a faux leather storage ottoman.", "target_attributes": { "attributes": [ "faux leather" ], "options": [] }, "asin": "B08J846WMR" }, { "task_id": "ws_B081PKZTY6_5391", "instruction": "i'm looking for rubber sole hiking shoe and it was grey steel in clor.", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "ti grey steel | koi" ] }, "asin": "B081PKZTY6" }, { "task_id": "ws_B09JJ9SF5C_5392", "instruction": "i'm looking for short sleeve clothing it makes feel comfortable.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "christmas pjs - 26 - red", "6-12 months" ] }, "asin": "B09JJ9SF5C" }, { "task_id": "ws_B09QPZS86G_5393", "instruction": "i'm looking for clothing for water resistant and fleece lined.", "target_attributes": { "attributes": [ "straight leg", "water resistant", "fleece lined" ], "options": [ "clear" ] }, "asin": "B09QPZS86G" }, { "task_id": "ws_B08YFKCG9Q_5394", "instruction": "i'm looking for a tea tree oil shampoo.", "target_attributes": { "attributes": [ "tea tree" ], "options": [] }, "asin": "B08YFKCG9Q" }, { "task_id": "ws_B083JZFDD3_5395", "instruction": "i want easy to install blackout curtains for my living room. i need it in tribeca indigo color.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "tribeca indigo" ] }, "asin": "B083JZFDD3" }, { "task_id": "ws_B09BHZXV44_5396", "instruction": "i am looking for wooden bed frame of gray color.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "gray-3" ] }, "asin": "B09BHZXV44" }, { "task_id": "ws_B09S131KBS_5397", "instruction": "i am looking for a g_pink short sleeves shirts for man", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "g_pink" ] }, "asin": "B09S131KBS" }, { "task_id": "ws_B0743WP62Q_5398", "instruction": "i am looking for a nv4108e-hs size of motion detection surveillance video recorders", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "nv4108e-hs" ] }, "asin": "B0743WP62Q" }, { "task_id": "ws_B0922DVVD9_5399", "instruction": "i'm looking for natural ingredients for tattoo cleansing product.", "target_attributes": { "attributes": [ "easy use", "natural ingredients" ], "options": [] }, "asin": "B0922DVVD9" }, { "task_id": "ws_B07Z37GJCD_5400", "instruction": "i am looking for a halloween jacko lantern gift basket with handles to put candy chocolates.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "halloween jackolantern" ] }, "asin": "B07Z37GJCD" }, { "task_id": "ws_B08KGFBJDF_5401", "instruction": "i am looking high quality long lasting travel size parfum prada luna rossa impression", "target_attributes": { "attributes": [ "travel size", "long lasting", "high quality" ], "options": [ "prada luna rossa impression" ] }, "asin": "B08KGFBJDF" }, { "task_id": "ws_B09RQQ3BBS_5402", "instruction": "i want a thin and light weight men's boxers that is black in color.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a black" ] }, "asin": "B09RQQ3BBS" }, { "task_id": "ws_B07J4RH99Y_5403", "instruction": "i'm looking for a toothpaste vegan with coconut oil", "target_attributes": { "attributes": [ "coconut oil" ], "options": [] }, "asin": "B07J4RH99Y" }, { "task_id": "ws_B07JCS7ZJ4_5404", "instruction": "i am looking for a white usb cables with high performance", "target_attributes": { "attributes": [ "high performance" ], "options": [ "white" ] }, "asin": "B07JCS7ZJ4" }, { "task_id": "ws_B08GKQ1JZ4_5405", "instruction": "i am looking for a hands free z-floral color flip cases", "target_attributes": { "attributes": [ "hands free" ], "options": [ "z-floral" ] }, "asin": "B08GKQ1JZ4" }, { "task_id": "ws_B08WWRCK83_5406", "instruction": "i am looking for a double locker outlet wall plate cover and should be of a high gloss.", "target_attributes": { "attributes": [ "high gloss" ], "options": [ "double rocker | gfci" ] }, "asin": "B08WWRCK83" }, { "task_id": "ws_B078YFJXM3_5407", "instruction": "i'm looking for long sleeve sweater dry cleaned caramel cafe colored because its easy to dry.", "target_attributes": { "attributes": [ "long sleeve", "dry clean" ], "options": [ "caramel cafe" ] }, "asin": "B078YFJXM3" }, { "task_id": "ws_B00H7OVW2C_5408", "instruction": "i need a small intel desktop.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B00H7OVW2C" }, { "task_id": "ws_B08PDTPKZS_5409", "instruction": "i would like a 6 ounce package of non gmo basil pesto seasoned rice.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "basil pesto", "6 ounce (pack of 3)" ] }, "asin": "B08PDTPKZS" }, { "task_id": "ws_B09L7W3DSQ_5410", "instruction": "i am looking for a super soft fleece throw & blankets of multicolor.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "multicolor" ] }, "asin": "B09L7W3DSQ" }, { "task_id": "ws_B084MN7WRR_5411", "instruction": "i am searching for a wall mounted floating shelf for my living room. it should be 24 inch size and natural color.", "target_attributes": { "attributes": [ "wall mounted", "living room" ], "options": [ "24 inch" ] }, "asin": "B084MN7WRR" }, { "task_id": "ws_B07T1N2R4W_5412", "instruction": "i am looking for bpa free tongue scrubber with cap.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "with cap" ] }, "asin": "B07T1N2R4W" }, { "task_id": "ws_B00IYTQKOO_5413", "instruction": "i'm looking for gluten free it contains high protein need to buy a nut free.", "target_attributes": { "attributes": [ "gluten free", "nut free" ], "options": [ "whole eggs" ] }, "asin": "B00IYTQKOO" }, { "task_id": "ws_B077VWRYX2_5414", "instruction": "i am looking a small size regular fit machine wash active hoodies color :crew blue", "target_attributes": { "attributes": [ "machine wash", "regular fit" ], "options": [ "crew blue", "small" ] }, "asin": "B077VWRYX2" }, { "task_id": "ws_B07G8PHGTX_5415", "instruction": "i need a power cord cable for blu ray player sound bar", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B07G8PHGTX" }, { "task_id": "ws_B00004RDMR_5416", "instruction": "i'm looking for a nikon coolpix 990 3.34mp digital camera .", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B00004RDMR" }, { "task_id": "ws_B07669T46Z_5417", "instruction": "i'm looking for lumbar support for home office desk chairs.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "bonded leather gray", "microfiber" ] }, "asin": "B07669T46Z" }, { "task_id": "ws_B07RHRYHDM_5418", "instruction": "i am looking 5 no. rubber sole of trail running", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5" ] }, "asin": "B07RHRYHDM" }, { "task_id": "ws_B09SHJKB1R_5419", "instruction": "i'm looking to buy a quick drying bathing suit in brown and medium size.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "brown", "medium" ] }, "asin": "B09SHJKB1R" }, { "task_id": "ws_B09PN85JYS_5420", "instruction": "i'm looking for home decor products it was in living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pattern-2" ] }, "asin": "B09PN85JYS" }, { "task_id": "ws_B0744MQDVZ_5421", "instruction": "i am looking for high quality bathing accessories in white color", "target_attributes": { "attributes": [ "high quality" ], "options": [ "white" ] }, "asin": "B0744MQDVZ" }, { "task_id": "ws_B092Z86J79_5422", "instruction": "i'm looking for wood framed wall art through the wall.", "target_attributes": { "attributes": [ "ready hang", "wood frame" ], "options": [ "slh-4031" ] }, "asin": "B092Z86J79" }, { "task_id": "ws_B01EUZV5Z4_5423", "instruction": "i am looking for a gluten free, plant based and non gmo classic chocolate & hazelnut spreads", "target_attributes": { "attributes": [ "gluten free", "plant based", "non gmo" ], "options": [ "classic chocolate" ] }, "asin": "B01EUZV5Z4" }, { "task_id": "ws_B06WVC3FXV_5424", "instruction": "i'm looking for a nail treatment kit that is easy to use and certified cruelty free. also choose a pack of 2 which weighs 0.5 fl oz with bamboo & biotin 5 in 1 nail treatment kit.", "target_attributes": { "attributes": [ "cruelty free", "easy use" ], "options": [] }, "asin": "B06WVC3FXV" }, { "task_id": "ws_B09QHFV7Q7_5425", "instruction": "i would like a b002c30 rod pocket window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "b002c30", "rod pocket-w 42 l 84" ] }, "asin": "B09QHFV7Q7" }, { "task_id": "ws_B09NC669P3_5426", "instruction": "i want a white colored pair of sandals that has high heels with an ankle strap.", "target_attributes": { "attributes": [ "high heel", "ankle strap" ], "options": [ "white" ] }, "asin": "B09NC669P3" }, { "task_id": "ws_B09S5QZHVL_5427", "instruction": "i am looking for a starlight band compatible with apple watch size 38/40/421mm.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "starlight", "38 | 40 | 41mm" ] }, "asin": "B09S5QZHVL" }, { "task_id": "ws_B09S5QZHVL_5428", "instruction": "i'm looking for green color 44mm sized smart watch band compatible with apple watch", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "green" ] }, "asin": "B09S5QZHVL" }, { "task_id": "ws_B08443XV9W_5429", "instruction": "i am looking for sulfate free, paraben free , tea tree triple treat invigorating shampoo & conditioner set", "target_attributes": { "attributes": [ "sulfate free", "paraben free" ], "options": [ "tea tree triple treat (tea tree botanicals)" ] }, "asin": "B08443XV9W" }, { "task_id": "ws_B07W311PVT_5430", "instruction": "i'm looking for nickel finish for ceiling fan for home improvement.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [] }, "asin": "B07W311PVT" }, { "task_id": "ws_B08BDZQRWG_5431", "instruction": "i need a straight leg jeans that is original fit. it should be medium stonewash in color.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "medium stonewash" ] }, "asin": "B08BDZQRWG" }, { "task_id": "ws_B09PL6DG3V_5432", "instruction": "buy me a 4x-large sized long sleeved shirt made from soft material in g05#black color.", "target_attributes": { "attributes": [ "long sleeve", "soft material" ], "options": [ "g05#black", "4x-large" ] }, "asin": "B09PL6DG3V" }, { "task_id": "ws_B07KJXY6R1_5433", "instruction": "i am looking for a 16inch x 16inch x 3 panels of posters & prints for dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "16inch x 16inch x 3 panels" ] }, "asin": "B07KJXY6R1" }, { "task_id": "ws_B01HJWDNKA_5434", "instruction": "i am looking high speed blu ray hdmi cable vedio cable 8 feet color:5 pack", "target_attributes": { "attributes": [ "high speed", "blu ray" ], "options": [ "5 pack", "8 feet (3-pack)" ] }, "asin": "B01HJWDNKA" }, { "task_id": "ws_B08TR8N884_5435", "instruction": "leak prrof free refillable plastic containers of 2 count pack of 1", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "2 count (pack of 1)" ] }, "asin": "B08TR8N884" }, { "task_id": "ws_B083S43TLD_5436", "instruction": "i'm looking for storage case for toothbrush travel containers and need to buy it.", "target_attributes": { "attributes": [ "high quality", "storage case" ], "options": [] }, "asin": "B083S43TLD" }, { "task_id": "ws_B003LZN6O8_5437", "instruction": "i'm looking for black clothing out because it can easily machine wahsable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "black" ] }, "asin": "B003LZN6O8" }, { "task_id": "ws_B08SVZFFPP_5438", "instruction": "i'm looking for usb port for computer accessories.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B08SVZFFPP" }, { "task_id": "ws_B09R1T4VWW_5439", "instruction": "i am looking for a c color toothpaste for teeth whitening and sensitive teeth", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [ "c" ] }, "asin": "B09R1T4VWW" }, { "task_id": "ws_B0888NJ8QL_5440", "instruction": "i am looking for a gray color hdmi cables with high speed and blu ray", "target_attributes": { "attributes": [ "high speed", "blu ray" ], "options": [ "gray" ] }, "asin": "B0888NJ8QL" }, { "task_id": "ws_B004D6044O_5441", "instruction": "i'm looking for a vegetable snacks that is free from nuts and gluten. also, choose pack of 24 weighing 1 ounce with mixed (variety) flavored one.", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [ "variety pack", "1 ounce (pack of 24)" ] }, "asin": "B004D6044O" }, { "task_id": "ws_B004D6044O_5442", "instruction": "this simply 7 lentil chips product is delicious and also non-gmo, gluten-free and nut-free. i'm looking for a creamy dill flavor, 4 oz bag (pack of 12).", "target_attributes": { "attributes": [ "nut free", "non gmo", "gluten free" ], "options": [ "creamy dill" ] }, "asin": "B004D6044O" }, { "task_id": "ws_B09MZ7L3S3_5443", "instruction": "i am looking for red color bath & body brushes for dry skin", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "red" ] }, "asin": "B09MZ7L3S3" }, { "task_id": "ws_B0746FSYRB_5444", "instruction": "i would like a boom box with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B0746FSYRB" }, { "task_id": "ws_B09Q93ZRQ6_5445", "instruction": "i need a pair of gray workout pants with a butt lift.", "target_attributes": { "attributes": [ "butt lifting", "gym workout" ], "options": [ "gray" ] }, "asin": "B09Q93ZRQ6" }, { "task_id": "ws_B09RFHRZJB_5446", "instruction": "i am looking green color wireless bluetooth speaker", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "green" ] }, "asin": "B09RFHRZJB" }, { "task_id": "ws_B08F2QT47F_5447", "instruction": "i am looking for a low sugar granola bar that is soy and diary free. pick the pack of 3 weighing 10 ounces.", "target_attributes": { "attributes": [ "low sugar", "soy free", "dairy free" ], "options": [ "10 ounce (pack of 3)" ] }, "asin": "B08F2QT47F" }, { "task_id": "ws_B0982SCLBG_5448", "instruction": "i'm looking for a couple of laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B0982SCLBG" }, { "task_id": "ws_B09FL2CYP9_5449", "instruction": "i need a stainless steel nail dust collector machine for creating nail art.", "target_attributes": { "attributes": [ "stainless steel", "nail art" ], "options": [] }, "asin": "B09FL2CYP9" }, { "task_id": "ws_B07QGFDMTM_5450", "instruction": "i am looking for a large size men's t-shirt for gym workout with classic fit. also choose purple in color.", "target_attributes": { "attributes": [ "classic fit", "gym workout" ], "options": [ "purple", "men", "large" ] }, "asin": "B07QGFDMTM" }, { "task_id": "ws_B01BF6UWTQ_5451", "instruction": "i'm looking for anti aging beauty personal products that facial moisturizer skin.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "10 ivory fair" ] }, "asin": "B01BF6UWTQ" }, { "task_id": "ws_B09MBKD392_5452", "instruction": "please can i have one skinny pina colada which is sugar free and non gmo?", "target_attributes": { "attributes": [ "sugar free", "non gmo" ], "options": [ "pina colada", "pack of 1" ] }, "asin": "B09MBKD392" }, { "task_id": "ws_B0009NZQRU_5453", "instruction": "i'm looking for a bench style farmhouse in white color", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B0009NZQRU" }, { "task_id": "ws_B07R8WZR55_5454", "instruction": "certified organic 100% pure & natural sweet almond oil", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "almond" ] }, "asin": "B07R8WZR55" }, { "task_id": "ws_B09RJMTVP6_5455", "instruction": "i am looking for tempered glass for samsung galaxy s22 ultra.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "s22 ultra" ] }, "asin": "B09RJMTVP6" }, { "task_id": "ws_B09FG2F7S7_5456", "instruction": "i would like a epilator for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09FG2F7S7" }, { "task_id": "ws_B07X344YLM_5457", "instruction": "i'm looking for a foundation brush that i can use on very sensitive skin. i would also like it to be a coloured brush.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "a" ] }, "asin": "B07X344YLM" }, { "task_id": "ws_B0068VW22E_5458", "instruction": "i'm looking for gluten free, fat free and sugar free natural strawberry jel dessert", "target_attributes": { "attributes": [ "sugar free", "fat free", "gluten free" ], "options": [] }, "asin": "B0068VW22E" }, { "task_id": "ws_B09QVDMJN2_5459", "instruction": "i am looking for a non-slip sandals for my wife that is blue in color. and please choose the 5.5 size", "target_attributes": { "attributes": [ "non slip" ], "options": [ "light blue", "5.5" ] }, "asin": "B09QVDMJN2" }, { "task_id": "ws_B076HZF1K2_5460", "instruction": "i would like to buy a full sized box spring bed that has storage drawers.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "full", "bed" ] }, "asin": "B076HZF1K2" }, { "task_id": "ws_B076HZF1K2_5461", "instruction": "i am searching for contemporary design, black linen king size tufted upholstered platform bed with storage drawers", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "black linen", "king" ] }, "asin": "B076HZF1K2" }, { "task_id": "ws_B09QM21BVR_5462", "instruction": "i would like a medium sized with sleep set that i can hand wash.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "001-white", "medium" ] }, "asin": "B09QM21BVR" }, { "task_id": "ws_B097DCP8Q1_5463", "instruction": "i am looking for double rod silver color professional hair cutting kit for men", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "double rod silver" ] }, "asin": "B097DCP8Q1" }, { "task_id": "ws_B09MT7PLFZ_5464", "instruction": "i'm looking for clothing for elastic waisted it will use for machine wash need to buy it.", "target_attributes": { "attributes": [ "wash cold", "hand wash", "machine wash", "elastic waistband", "dry clean" ], "options": [ "multi 7" ] }, "asin": "B09MT7PLFZ" }, { "task_id": "ws_B08QGM82GC_5465", "instruction": "i'm looking for bags for travel usage. it easy to carry .", "target_attributes": { "attributes": [ "travel size", "easy use" ], "options": [ "su.s-brown" ] }, "asin": "B08QGM82GC" }, { "task_id": "ws_B08KDM37FK_5466", "instruction": "i am looking for a pair of women's high heel stilettos in a size 7.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "7" ] }, "asin": "B08KDM37FK" }, { "task_id": "ws_B08XW7K2BQ_5467", "instruction": "i'm looking for apple watch brands it can easily install any.", "target_attributes": { "attributes": [ "compatible apple", "easy install" ], "options": [ "b tie dye" ] }, "asin": "B08XW7K2BQ" }, { "task_id": "ws_B09QXH784K_5468", "instruction": "i am looking for a 11\" sized walking boots for outdoor activities. and i would go for the black one", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "black", "11" ] }, "asin": "B09QXH784K" }, { "task_id": "ws_B09Q348M72_5469", "instruction": "i want a light beige full platform bed with a headboard. it should be easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "light beige" ] }, "asin": "B09Q348M72" }, { "task_id": "ws_B009P452VO_5470", "instruction": "i am looking or a 12 ounce (pack of 1) non gmo gluten free granola", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "12 ounce (pack of 1)" ] }, "asin": "B009P452VO" }, { "task_id": "ws_B08R89VRFB_5471", "instruction": "i'm looking for sliver smart watch made from 20mm stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "silver" ] }, "asin": "B08R89VRFB" }, { "task_id": "ws_B01HXV90BS_5472", "instruction": "i am looking for an anti-aging serum based on hyaluronic acid in a 1 fl oz bottle", "target_attributes": { "attributes": [ "anti aging", "hyaluronic acid" ], "options": [ "1 fl oz (pack of 1)" ] }, "asin": "B01HXV90BS" }, { "task_id": "ws_B08TX29T65_5473", "instruction": "i am looking for a 5x7 ft backgrounds for digital photography", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "5x7 ft" ] }, "asin": "B08TX29T65" }, { "task_id": "ws_B08TX29T65_5474", "instruction": "i want to buy a lightweight photography backdrop that has a print color 03 and is 9x16 ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "printed backdrop 03", "9x16 ft" ] }, "asin": "B08TX29T65" }, { "task_id": "ws_B08G87W2B9_5475", "instruction": "i am looking for a size 13 sandal for women which has an open toe and a high heel.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "13" ] }, "asin": "B08G87W2B9" }, { "task_id": "ws_B08M6JS7SM_5476", "instruction": "i am looking for a high quality bag that has a cartoon image.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "cartoon" ] }, "asin": "B08M6JS7SM" }, { "task_id": "ws_B09NDQYJ3G_5477", "instruction": "i need an open toe, high heel, ankle strap wedge sandals in color white and size 9.5-10.", "target_attributes": { "attributes": [ "open toe", "high heel", "ankle strap" ], "options": [ "white", "9.5-10" ] }, "asin": "B09NDQYJ3G" }, { "task_id": "ws_B09LYSJB8Z_5478", "instruction": "i intend to buy a queen sized easy to assemble black metal platform bed.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "black", "queen" ] }, "asin": "B09LYSJB8Z" }, { "task_id": "ws_B079QJD2FG_5479", "instruction": "i need to buy an 104 square foot piece of eco-friendly synthetic turf.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "8 ft x 13 ft (104 square ft)" ] }, "asin": "B079QJD2FG" }, { "task_id": "ws_B09JFQR4DC_5480", "instruction": "i am looking for a blue stretch fabric dress shirts for regular fit", "target_attributes": { "attributes": [ "regular fit", "stretch fabric" ], "options": [] }, "asin": "B09JFQR4DC" }, { "task_id": "ws_B08Q7V8P6Q_5481", "instruction": "i'm looking for a large sweatpants fleece lined for sports in dark gray", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "02 dark gray", "large" ] }, "asin": "B08Q7V8P6Q" }, { "task_id": "ws_B07W7VW47Y_5482", "instruction": "i would like a pair of size 9.5 wheat work boots that have a steel toe.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "wheat", "9.5 wide" ] }, "asin": "B07W7VW47Y" }, { "task_id": "ws_B085HY41GN_5483", "instruction": "i am looking for a 8.5 size ankle strap flat sandals", "target_attributes": { "attributes": [ "ankle strap" ], "options": [] }, "asin": "B085HY41GN" }, { "task_id": "ws_B09CYFD5BX_5484", "instruction": "i am looking for a heavy duty barber chair thats high quality bar stool. go ahead and get a brown color.", "target_attributes": { "attributes": [ "heavy duty", "high quality" ], "options": [ "brown" ] }, "asin": "B09CYFD5BX" }, { "task_id": "ws_B016N62TXA_5485", "instruction": "i'm looking for coaxial cable for cell phone accessories.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [] }, "asin": "B016N62TXA" }, { "task_id": "ws_B089W8BMRT_5486", "instruction": "i'm looking for a leather sole high heel sandal in dark rose gold.", "target_attributes": { "attributes": [ "leather sole", "high heel" ], "options": [ "dark rose gold" ] }, "asin": "B089W8BMRT" }, { "task_id": "ws_B08LTCVMQG_5487", "instruction": "i'm looking for brown industrial size 10 boots made with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "brown", "10" ] }, "asin": "B08LTCVMQG" }, { "task_id": "ws_B09JC29RSY_5488", "instruction": "i am looking for large nightstand end table for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "large" ] }, "asin": "B09JC29RSY" }, { "task_id": "ws_B06XSGZKC7_5489", "instruction": "i'm looking for certifies organic groceries the flavor was cacao bits", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "cacao nibs" ] }, "asin": "B06XSGZKC7" }, { "task_id": "ws_B08R8HKCHN_5490", "instruction": "i need green colored headphones with superior stereo sound and comes with a convenient carrying case.", "target_attributes": { "attributes": [ "carrying case", "stereo sound" ], "options": [ "green" ] }, "asin": "B08R8HKCHN" }, { "task_id": "ws_B08XJ2MV9V_5491", "instruction": "i'm looking for a 10 lights stepeak w23.6\" crystal golden chandelier pendant lighting .", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "24lights 4-tier grey dia39\"" ] }, "asin": "B08XJ2MV9V" }, { "task_id": "ws_B07VGP44B2_5492", "instruction": "i need to buy a solid wood console table for my living room. look for one in grey.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "distressed grey" ] }, "asin": "B07VGP44B2" }, { "task_id": "ws_B09FT4RLLS_5493", "instruction": "i'm looking for one aluminum alloy magnetic case phor iphone 13 mini in black", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "black", "iphone 13 mini" ] }, "asin": "B09FT4RLLS" }, { "task_id": "ws_B01N9C9AT6_5494", "instruction": "i'm looking for stainless steel accessories and need to buy it.", "target_attributes": { "attributes": [ "carrying case", "stainless steel" ], "options": [ "purple" ] }, "asin": "B01N9C9AT6" }, { "task_id": "ws_B09M87JDMM_5495", "instruction": "i am looking for 1080p security camera with motion detection feature.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B09M87JDMM" }, { "task_id": "ws_B09PYVM1NK_5496", "instruction": "i am looking for a size 9.5 brown open toed heeled sandal with an ankle strip", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "a11-brown", "9.5-10" ] }, "asin": "B09PYVM1NK" }, { "task_id": "ws_B08FC8DZRJ_5497", "instruction": "i would like a grey 100x40x40cm ottoman for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey", "100x40x40cm" ] }, "asin": "B08FC8DZRJ" }, { "task_id": "ws_B07ZKLZC26_5498", "instruction": "i am looking for 60 pieces of farm themed cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07ZKLZC26" }, { "task_id": "ws_B09LVBN1QT_5499", "instruction": "get me a high performance coaxial cable connector.", "target_attributes": { "attributes": [ "high performance", "coaxial cable" ], "options": [] }, "asin": "B09LVBN1QT" }, { "task_id": "ws_B09MLFHLVS_5500", "instruction": "i'm looking for high heel boost the color was wine.", "target_attributes": { "attributes": [ "knee high", "high heel", "rubber sole" ], "options": [ "wine" ] }, "asin": "B09MLFHLVS" }, { "task_id": "ws_B00M2XDHY4_5501", "instruction": "i need some dark gray cotton trousers.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "dark grey" ] }, "asin": "B00M2XDHY4" }, { "task_id": "ws_B01DZV37VY_5502", "instruction": "i am looking for a heavy duty rca cables.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B01DZV37VY" }, { "task_id": "ws_B01N9PYL3A_5503", "instruction": "i am looking 25 pound high protein dietary fiber wheat flours & meals", "target_attributes": { "attributes": [ "high protein", "dietary fiber" ], "options": [ "25 pound (pack of 1)" ] }, "asin": "B01N9PYL3A" }, { "task_id": "ws_B09G9LGHC8_5504", "instruction": "i want a light weight high resolution background for photography purpose of baby sower party size :5*3ft", "target_attributes": { "attributes": [ "light weight", "high resolution" ], "options": [ "5x3ft" ] }, "asin": "B09G9LGHC8" }, { "task_id": "ws_B093YS37ST_5505", "instruction": "i'm looking for clothing accessories for carry a laundry bags.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YS37ST" }, { "task_id": "ws_B08J1D47RV_5506", "instruction": "looking for vegan sweet potato puffs non gmo product", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "4. vegan cheesy cheddar" ] }, "asin": "B08J1D47RV" }, { "task_id": "ws_B00A8MYSTY_5507", "instruction": "i looking a relaxed fit nylon spandex camping everyday wear hiking woman pant color :thistle", "target_attributes": { "attributes": [ "nylon spandex", "relaxed fit", "everyday wear" ], "options": [ "thistle" ] }, "asin": "B00A8MYSTY" }, { "task_id": "ws_B00A8MYSTY_5508", "instruction": "i need everyday wear pants for hiking that are flax colored in a size 20.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "flax", "20" ] }, "asin": "B00A8MYSTY" }, { "task_id": "ws_B08DWVK8LC_5509", "instruction": "i want a high quality acrylic nail kit that is long lasting and clear pink nude in color.", "target_attributes": { "attributes": [ "high quality", "long lasting" ], "options": [ "acrylic clear | pink | nude" ] }, "asin": "B08DWVK8LC" }, { "task_id": "ws_B07Y98Y4L6_5510", "instruction": "i would like a black race style video game chair with good lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "black | white", "race" ] }, "asin": "B07Y98Y4L6" }, { "task_id": "ws_B093YSDS5S_5511", "instruction": "i am looking for a medium sized laundry bag for my travel on christmas holidays", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSDS5S" }, { "task_id": "ws_B08Y98ZBKX_5512", "instruction": "i am looking for an intel core i5 workstation pc with windows 10 pro.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B08Y98ZBKX" }, { "task_id": "ws_B09NJL8M8C_5513", "instruction": "i want a pair of orange non slip shoes with memory foam for jogging.", "target_attributes": { "attributes": [ "non slip", "memory foam" ], "options": [ "orange" ] }, "asin": "B09NJL8M8C" }, { "task_id": "ws_B09SCVRT52_5514", "instruction": "i'm looking for women's clothing for it was soft material it can wear everyday wear.", "target_attributes": { "attributes": [ "soft material", "everyday wear" ], "options": [ "a10 - black" ] }, "asin": "B09SCVRT52" }, { "task_id": "ws_B09SCVRT52_5515", "instruction": "i want to find a pair of black women's platform wedges for everyday wear. they need to be a size 9 and be on the wider side.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "a10 - black", "9 wide" ] }, "asin": "B09SCVRT52" }, { "task_id": "ws_B0852ZWWS9_5516", "instruction": "i need a alcohol free perfume oil of 12ml meal size . and i would prefer the green musk scent", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "green musk", "12 ml - metal" ] }, "asin": "B0852ZWWS9" }, { "task_id": "ws_B0852ZWWS9_5517", "instruction": "seeking as premium perfume oil containing attar oil, that is vegan, cruelty, and alcohol free, long lasting, 3ml bottle, violet scent, named amber romance by amuze fragrance", "target_attributes": { "attributes": [ "alcohol free", "cruelty free", "long lasting" ], "options": [ "violet" ] }, "asin": "B0852ZWWS9" }, { "task_id": "ws_B0852ZWWS9_5518", "instruction": "i want to buy a perfume which is alcohol free and lasts long, the scent should be of egyptian musk and it should be 3 ml.", "target_attributes": { "attributes": [ "alcohol free", "long lasting" ], "options": [ "egyptian musk", "3 ml" ] }, "asin": "B0852ZWWS9" }, { "task_id": "ws_B0852ZWWS9_5519", "instruction": "i want a 12 ml bottle of turkish rose long lasting fragrance.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "turkish rose", "12 ml" ] }, "asin": "B0852ZWWS9" }, { "task_id": "ws_B0852ZWWS9_5520", "instruction": "i am looking for alcohol and cruelty free vanilla musk perfume oil.", "target_attributes": { "attributes": [ "alcohol free", "cruelty free" ], "options": [ "vanilla musk" ] }, "asin": "B0852ZWWS9" }, { "task_id": "ws_B07Y5HLQSP_5521", "instruction": "i am looking for gluten free chocolate bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07Y5HLQSP" }, { "task_id": "ws_B087LSWCM8_5522", "instruction": "i am looking for a 46 inches table pads of stainless steel", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "46 inch" ] }, "asin": "B087LSWCM8" }, { "task_id": "ws_B087LSWCM8_5523", "instruction": "i'm looking for stainless steel for for kitchen and dinning room.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "clear 1.5mm" ] }, "asin": "B087LSWCM8" }, { "task_id": "ws_B087LSWCM8_5524", "instruction": "i need a desk cover protector that's 30 by 60 inches. it should be easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "30 x 60 inch" ] }, "asin": "B087LSWCM8" }, { "task_id": "ws_B08W7X86D4_5525", "instruction": "i am looking for plant based,gluten free and sugar free seedbars.please choose mulberry cacao flavour.", "target_attributes": { "attributes": [ "plant based", "gluten free", "sugar free" ], "options": [ "mulberry cacao + spirulina" ] }, "asin": "B08W7X86D4" }, { "task_id": "ws_B097YHD3PS_5526", "instruction": "i'm looking for resealable bag red color.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "red pitaya 250g" ] }, "asin": "B097YHD3PS" }, { "task_id": "ws_B08CNMQV8Z_5527", "instruction": "i need chocolate filled snack cookies with low calories,low sugar and dairy free.", "target_attributes": { "attributes": [ "low sugar", "low calorie", "gluten free" ], "options": [ "chocolate filled" ] }, "asin": "B08CNMQV8Z" }, { "task_id": "ws_B09HPFRPD3_5528", "instruction": "i'm looking for a size 9 woman denim high heel.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "9" ] }, "asin": "B09HPFRPD3" }, { "task_id": "ws_B0845Y6ZDV_5529", "instruction": "i need a pair of high speed usb-c cables.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack - type g" ] }, "asin": "B0845Y6ZDV" }, { "task_id": "ws_B09SXYCCC1_5530", "instruction": "i want a office chair for heavy duty easy assemble with lumber support", "target_attributes": { "attributes": [ "heavy duty", "easy assemble", "lumbar support" ], "options": [] }, "asin": "B09SXYCCC1" }, { "task_id": "ws_B000PW7N2Q_5531", "instruction": "i need 3-light vanity light in brushed nickel", "target_attributes": { "attributes": [ "vanity light", "brushed nickel" ], "options": [ "3-light" ] }, "asin": "B000PW7N2Q" }, { "task_id": "ws_B0796M28ST_5532", "instruction": "i'm looking for hair loss to prevention of hair extensions.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B0796M28ST" }, { "task_id": "ws_B0113JAN8K_5533", "instruction": "i'm looking for a splitter for high speed coaxial cable.", "target_attributes": { "attributes": [ "high speed", "coaxial cable" ], "options": [] }, "asin": "B0113JAN8K" }, { "task_id": "ws_B071YPLTYP_5534", "instruction": "i need small size men's boxer brief, with elastic waistband in black air cool color for everyday wear. it should also feature quick drying and machine wash.", "target_attributes": { "attributes": [ "quick drying", "machine wash", "elastic waistband", "everyday wear" ], "options": [ "black air cool", "small" ] }, "asin": "B071YPLTYP" }, { "task_id": "ws_B097YWSYBJ_5535", "instruction": "i am looking for high performance gamer computer with 64gb ram", "target_attributes": { "attributes": [ "high performance" ], "options": [ "64gb ram | 1tb ssd | 2tb hdd" ] }, "asin": "B097YWSYBJ" }, { "task_id": "ws_B097YWSYBJ_5536", "instruction": "i am looking for a high performance gaming computer with intel core, 64gb ram and 1tb ssd. also look for 2tb hdd.", "target_attributes": { "attributes": [ "high performance", "intel core" ], "options": [ "64gb ram | 1tb ssd | 2tb hdd" ] }, "asin": "B097YWSYBJ" }, { "task_id": "ws_B097YWSYBJ_5537", "instruction": "i am looking for a high performance computer that has 32 gb of ram and 3tb of storage.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "32gb ram | 1tb ssd | 2tb hdd" ] }, "asin": "B097YWSYBJ" }, { "task_id": "ws_B092ZJ8V8R_5538", "instruction": "i am looking for black nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "black" ] }, "asin": "B092ZJ8V8R" }, { "task_id": "ws_B092ZJ8V8R_5539", "instruction": "i want a black ethereal nail polish organizer case.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "black" ] }, "asin": "B092ZJ8V8R" }, { "task_id": "ws_B09J7XX5W3_5540", "instruction": "i'm looking for future mattress for living room it can make decor a living area.", "target_attributes": { "attributes": [ "living room" ], "options": [ "a" ] }, "asin": "B09J7XX5W3" }, { "task_id": "ws_B08JV582PQ_5541", "instruction": "i am looking for a black nubuck | mesh shoes of memory foam for men.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black nubuck | mesh" ] }, "asin": "B08JV582PQ" }, { "task_id": "ws_B08D696W62_5542", "instruction": "order for me a high speed data sync charge cable for my playstation 4 and should be silver in color.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "silver" ] }, "asin": "B08D696W62" }, { "task_id": "ws_B09PBML1BN_5543", "instruction": "i am looking for a straight leg fitted shorts for my work out. and i choose the xx-large with black-2 color", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "black-2", "xx-large" ] }, "asin": "B09PBML1BN" }, { "task_id": "ws_B002PHI69I_5544", "instruction": "i'm looking for black embossed rose shoes for women's and it will long lasting.", "target_attributes": { "attributes": [ "slip resistant", "arch support" ], "options": [ "black embossed rose" ] }, "asin": "B002PHI69I" }, { "task_id": "ws_B07GDS9461_5545", "instruction": "pick a nutmeg shade concealer that hides dark circle. also remember that i have sensitive skin.", "target_attributes": { "attributes": [ "dark circles", "sensitive skin" ], "options": [ "nutmeg" ] }, "asin": "B07GDS9461" }, { "task_id": "ws_B07GDS9461_5546", "instruction": "i am looking for a medium color concealers & neutralizers for sensitive skin", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "medium" ] }, "asin": "B07GDS9461" }, { "task_id": "ws_B096NPDJQJ_5547", "instruction": "i am looking for a eco friendly window films of 23.6\" x 63\" x 2 pcs( total: 120x160cm ) size.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "23.6\" x 63\" x 2 pcs( total" ] }, "asin": "B096NPDJQJ" }, { "task_id": "ws_B084T7NY3Q_5548", "instruction": "i need individually wrapped gluten free oatmeal chocolate chip cookies that is plant based.", "target_attributes": { "attributes": [ "plant based", "individually wrapped", "gluten free" ], "options": [ "oatmeal chocolate chip" ] }, "asin": "B084T7NY3Q" }, { "task_id": "ws_B09S6HC66Y_5549", "instruction": "i am looking for a loofahs for dead skin", "target_attributes": { "attributes": [ "dead skin" ], "options": [] }, "asin": "B09S6HC66Y" }, { "task_id": "ws_B08MBFBXJ1_5550", "instruction": "i'm looking for a plant based vegetable crisps made of simple ingredients and should be gluten free.", "target_attributes": { "attributes": [ "gluten free", "plant based", "simple ingredients" ], "options": [] }, "asin": "B08MBFBXJ1" }, { "task_id": "ws_B07S3XVZVB_5551", "instruction": "i would like a box of 24 granola bars that are high in protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "24 servings" ] }, "asin": "B07S3XVZVB" }, { "task_id": "ws_B09S9N1VNJ_5552", "instruction": "i looking foco nfl team logo women's moisture wicking arch support size :9 black daily use slipper", "target_attributes": { "attributes": [ "moisture wicking", "arch support" ], "options": [ "01-black", "9" ] }, "asin": "B09S9N1VNJ" }, { "task_id": "ws_B09DFL8NVF_5553", "instruction": "i am looking for a white bed frames", "target_attributes": { "attributes": [ "white item" ], "options": [ "white" ] }, "asin": "B09DFL8NVF" }, { "task_id": "ws_B06XBX38LP_5554", "instruction": "i'm looking for computer accessories for high speed and gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated", "long lasting" ], "options": [ "purple" ] }, "asin": "B06XBX38LP" }, { "task_id": "ws_B06XBX38LP_5555", "instruction": "i need 5 pack of 100 feet high speed internet cable. the color should be yellow and the wire must be gold plated", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "yellow", "100 feet (5 pack)" ] }, "asin": "B06XBX38LP" }, { "task_id": "ws_B089F7T791_5556", "instruction": "i'm looking for skin care products it can easy to use and it can use for sensitive skin.", "target_attributes": { "attributes": [ "easy use", "sensitive skin" ], "options": [ "gentle cleanser" ] }, "asin": "B089F7T791" }, { "task_id": "ws_B07ZPSFLPW_5557", "instruction": "i need a casual short sleeve small size flowy dress. also d-sage green one.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "d-sage green", "small" ] }, "asin": "B07ZPSFLPW" }, { "task_id": "ws_B077YSK7SK_5558", "instruction": "i am looking for a white item barstools", "target_attributes": { "attributes": [ "white item" ], "options": [] }, "asin": "B077YSK7SK" }, { "task_id": "ws_B09713XF7Y_5559", "instruction": "i'm looking for a women's summer adjustable buckle ankle strap cloth sandals.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "red", "9" ] }, "asin": "B09713XF7Y" }, { "task_id": "ws_B08SGBKV87_5560", "instruction": "i am looking for a travel size and alcohol free eau de parfum for women of versace dreamer impression scent.", "target_attributes": { "attributes": [ "travel size", "alcohol free" ], "options": [ "versace dreamer impression" ] }, "asin": "B08SGBKV87" }, { "task_id": "ws_B08WQ6NBSL_5561", "instruction": "i am in need of 18 inch high quality human hair wig for women", "target_attributes": { "attributes": [ "high quality" ], "options": [ "18 inch" ] }, "asin": "B08WQ6NBSL" }, { "task_id": "ws_B097YLN95R_5562", "instruction": "i am looking for non toxic makeup remover.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B097YLN95R" }, { "task_id": "ws_B08TVGRCRB_5563", "instruction": "a heavy duty single gang rocker high gloss electric wall plate cover", "target_attributes": { "attributes": [ "heavy duty", "high gloss" ], "options": [ "single rocker | gfci" ] }, "asin": "B08TVGRCRB" }, { "task_id": "ws_B07H65YQLJ_5564", "instruction": "i would like a 12 by 16 inch poster in three pieces of watercolor potted leaves for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "watercolor potted leaves", "12x16inches*3pcs" ] }, "asin": "B07H65YQLJ" }, { "task_id": "ws_B08CNG5MTQ_5565", "instruction": "i am looking for a 5 no. rubber sole heeled sandals", "target_attributes": { "attributes": [ "rubber sole" ], "options": [] }, "asin": "B08CNG5MTQ" }, { "task_id": "ws_B01MYDEH3E_5566", "instruction": "i'm looking for walnut oil for dead skin for sensitive skin and skin caring.", "target_attributes": { "attributes": [ "oil free", "sensitive skin", "dead skin" ], "options": [ "16 ounce" ] }, "asin": "B01MYDEH3E" }, { "task_id": "ws_B0725Q6LQ7_5567", "instruction": "coney island classics butter me up popcorn, brings back memories of my childhood. in addition to having dietary fiber and gluten free. please select for me.", "target_attributes": { "attributes": [ "gluten free", "dietary fiber" ], "options": [] }, "asin": "B0725Q6LQ7" }, { "task_id": "ws_B08C2LCQ8M_5568", "instruction": "i want comfortable green colored winter boots that is meant for daily wear.", "target_attributes": { "attributes": [ "day comfort", "daily wear" ], "options": [ "green" ] }, "asin": "B08C2LCQ8M" }, { "task_id": "ws_B07K2QTS1T_5569", "instruction": "i'm looking for gluten free it contains high protein and needed to protein.", "target_attributes": { "attributes": [ "artificial ingredients", "gluten free" ], "options": [ "metabolism oolong tea" ] }, "asin": "B07K2QTS1T" }, { "task_id": "ws_B096RJ5DRR_5570", "instruction": "i'm looking for a 3 pack poyiccot screen protector for suunto 9 peak.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B096RJ5DRR" }, { "task_id": "ws_B075CPG5XT_5571", "instruction": "i am looking for a keto friendly vanilla syrup with quality ingredients. also choose 25.4 fl oz pack 4", "target_attributes": { "attributes": [ "keto friendly", "quality ingredients" ], "options": [ "vanilla", "25.4 fl oz (pack of 4)" ] }, "asin": "B075CPG5XT" }, { "task_id": "ws_B08HLD224X_5572", "instruction": "i want a pair of comfortable fit wide leg pants. i need it in 3x-large size.", "target_attributes": { "attributes": [ "wide leg", "comfortable fit" ], "options": [ "3x-large" ] }, "asin": "B08HLD224X" }, { "task_id": "ws_B08ZN4HFTX_5573", "instruction": "i am looking for a xx-large wide leg and high waist pants for men.", "target_attributes": { "attributes": [ "wide leg", "high waist" ], "options": [ "f-light blue" ] }, "asin": "B08ZN4HFTX" }, { "task_id": "ws_B00P8PKA4S_5574", "instruction": "i am searching for gift basket village sweet for giving as a great gift.", "target_attributes": { "attributes": [ "gift basket", "great gift" ], "options": [] }, "asin": "B00P8PKA4S" }, { "task_id": "ws_B093L4LLBD_5575", "instruction": "i am looking for a laundry, blouse and hosiery wallet", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093L4LLBD" }, { "task_id": "ws_B0922WVZ9X_5576", "instruction": "i'm looking for binoculars for bird watching and need to buy it.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B0922WVZ9X" }, { "task_id": "ws_B0015DA1V4_5577", "instruction": "i'm looking for gluten free it has contain high protein.", "target_attributes": { "attributes": [ "fat free", "dairy free", "gluten free" ], "options": [] }, "asin": "B0015DA1V4" }, { "task_id": "ws_B09BJQNNWD_5578", "instruction": "i need easy to use plug and play computer speakers with bluetooth. pick one in white color.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "white bluetooth | wired" ] }, "asin": "B09BJQNNWD" }, { "task_id": "ws_B09QBMZJXN_5579", "instruction": "a cold wash machine wash classic fit heather cotten baby blue color women t shirt size:3x-large", "target_attributes": { "attributes": [ "wash cold", "machine wash", "heathers cotton", "classic fit" ], "options": [ "baby blue", "3x-large" ] }, "asin": "B09QBMZJXN" }, { "task_id": "ws_B09LVWFHWK_5580", "instruction": "i want to buy some caffeine-free rooibos tea in a 50 pack.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "rooibos", "50 count" ] }, "asin": "B09LVWFHWK" }, { "task_id": "ws_B09492M5DY_5581", "instruction": "i want an easy to install tv antenna with usb port.", "target_attributes": { "attributes": [ "easy install", "usb port" ], "options": [] }, "asin": "B09492M5DY" }, { "task_id": "ws_B08DTMVK61_5582", "instruction": "i'm looking for ceiling lights pendent lights for living room.", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [ "brush nickel" ] }, "asin": "B08DTMVK61" }, { "task_id": "ws_B09HBXTJXJ_5583", "instruction": "i would like a eye shadow brush set.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B09HBXTJXJ" }, { "task_id": "ws_B072MHDHDY_5584", "instruction": "i am looking for gluten free cookies in chocolate flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chocolate chip" ] }, "asin": "B072MHDHDY" }, { "task_id": "ws_B005FKMUHQ_5585", "instruction": "i need a futon and chaise set that is made with faux leather. and i would prefer the navy linen color", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "navy linen", "futon and chaise set" ] }, "asin": "B005FKMUHQ" }, { "task_id": "ws_B09PZ2RL5C_5586", "instruction": "i am looking for teeth whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "teeth whitening" ] }, "asin": "B09PZ2RL5C" }, { "task_id": "ws_B08D6GLFZJ_5587", "instruction": "i am looking for a small low rise briefs for men.", "target_attributes": { "attributes": [ "low rise" ], "options": [] }, "asin": "B08D6GLFZJ" }, { "task_id": "ws_B08R68CDZX_5588", "instruction": "in hunt for an anti-perspirant deodorant that fights underarm problems in a 40ml size, alcohol free made by the belo essentials in the beauty & personal care aisle.", "target_attributes": { "attributes": [ "anti perspirant", "alcohol free" ], "options": [] }, "asin": "B08R68CDZX" }, { "task_id": "ws_B09PZ7XHK9_5589", "instruction": "i am looking for some blue daily casual jumpsuits that are a medium size.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "blue", "medium" ] }, "asin": "B09PZ7XHK9" }, { "task_id": "ws_B07R1PZ2T9_5590", "instruction": "i am looking for a digital coax cable + connector n-female to n-female.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "coax cable + connector n-female to n-female" ] }, "asin": "B07R1PZ2T9" }, { "task_id": "ws_B017L20UY0_5591", "instruction": "i am looking for coffee gift trunk with gift basket", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B017L20UY0" }, { "task_id": "ws_B09T6STCWR_5592", "instruction": "can i get an easy use gneric children\u2019s u-shape toothbrush c-green color", "target_attributes": { "attributes": [ "easy use" ], "options": [ "c- green" ] }, "asin": "B09T6STCWR" }, { "task_id": "ws_B07PDFKC9V_5593", "instruction": "get me a large sized machine washable women's v neck printed top made with polyester spandex and in 2 red-103 color.", "target_attributes": { "attributes": [ "machine wash", "polyester spandex" ], "options": [ "2 red-103", "large" ] }, "asin": "B07PDFKC9V" }, { "task_id": "ws_B087QB3RZD_5594", "instruction": "i am searching for space saving brown ottoman for living room, that should have the size 17x13x13 inches", "target_attributes": { "attributes": [ "space saving" ], "options": [ "brown", "17x13x13 inches" ] }, "asin": "B087QB3RZD" }, { "task_id": "ws_B08JTRJSMM_5595", "instruction": "i am looking for a tempered glass screen protector smartwatch cases", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "44mm" ] }, "asin": "B08JTRJSMM" }, { "task_id": "ws_B00C6HF6DQ_5596", "instruction": "i'm looking for ultra hd plug play maxwhite color.", "target_attributes": { "attributes": [ "ultra hd", "plug play" ], "options": [ "maxwhite fg | white housing" ] }, "asin": "B00C6HF6DQ" }, { "task_id": "ws_B00C6HF6DQ_5597", "instruction": "i need a plug and play spectrum projector screen that is white or black.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "white | black", "spectrum" ] }, "asin": "B00C6HF6DQ" }, { "task_id": "ws_B099WC5FQ3_5598", "instruction": "i am looking for a non slip and easy to carry tripod for my camera.", "target_attributes": { "attributes": [ "easy carry", "non slip" ], "options": [] }, "asin": "B099WC5FQ3" }, { "task_id": "ws_B089QGDWR7_5599", "instruction": "i am looking for style-10 color wall art for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "style-10" ] }, "asin": "B089QGDWR7" }, { "task_id": "ws_B09GY2VV5W_5600", "instruction": "i would like a pair of size 10.5 steel toe hiking boots.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "10.5" ] }, "asin": "B09GY2VV5W" }, { "task_id": "ws_B0969LKS57_5601", "instruction": "i am looking for a x large men's sweatpants for daily wear and color should be gray", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "grey blue", "x-large" ] }, "asin": "B0969LKS57" }, { "task_id": "ws_B08PF9GG23_5602", "instruction": "i want to buy a facial scrub that is apricot scented, oil-free dermatology tested and comes in 6 oz bottle.", "target_attributes": { "attributes": [ "dermatologist tested", "oil free" ], "options": [ "apricot", "6 ounce (pack of 1)" ] }, "asin": "B08PF9GG23" }, { "task_id": "ws_B01LXYHF7T_5603", "instruction": "i would like a quad core desktop tower.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B01LXYHF7T" }, { "task_id": "ws_B00LN9IWF2_5604", "instruction": "i would like a olive 18.5\" neck 35\" sleeve dress shirt that i can machine wash .", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "olive", "18.5\" neck 35\" - 36\" sleeve" ] }, "asin": "B00LN9IWF2" }, { "task_id": "ws_B07VKZ52ZL_5605", "instruction": "i am looking for a light ash brown mix bleach blonde hair extensions for wigs", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "light ash brown mix bleach blonde" ] }, "asin": "B07VKZ52ZL" }, { "task_id": "ws_B07VKZ52ZL_5606", "instruction": "i want dark black clip-in hair extensions. it should be 17\" in size when curly.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark black", "17\"-curly" ] }, "asin": "B07VKZ52ZL" }, { "task_id": "ws_B09SYY4L7L_5607", "instruction": "i'm looking for a transparent pendant light that comes with 15light", "target_attributes": { "attributes": [ "pendant light" ], "options": [ "15light", "transparent" ] }, "asin": "B09SYY4L7L" }, { "task_id": "ws_B09CNWNV7M_5608", "instruction": "get me some vintage cupcake picks for a birthday party. it should be in black with a 1992 theme.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [ "black 1992" ] }, "asin": "B09CNWNV7M" }, { "task_id": "ws_B086H69F1T_5609", "instruction": "i am looking for certified organic herbal tea which is caffeine free.", "target_attributes": { "attributes": [ "caffeine free", "certified organic" ], "options": [] }, "asin": "B086H69F1T" }, { "task_id": "ws_B07NXMQ987_5610", "instruction": "find me a grain free, non gmo, and gluten free cake mix bundle with chocolate chip cookie flavor.", "target_attributes": { "attributes": [ "grain free", "non gmo", "gluten free" ], "options": [ "chocolate chip cookie" ] }, "asin": "B07NXMQ987" }, { "task_id": "ws_B07N26QLH3_5611", "instruction": "i want a medium sized classic fit men's shirt that is white in color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "white", "men", "medium" ] }, "asin": "B07N26QLH3" }, { "task_id": "ws_B013FAAEUW_5612", "instruction": "i want some low fat pretzel sticks.", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B013FAAEUW" }, { "task_id": "ws_B096NJ89C2_5613", "instruction": "i'm looking for home decor products for home accessories.", "target_attributes": { "attributes": [ "eco friendly", "easy install" ], "options": [] }, "asin": "B096NJ89C2" }, { "task_id": "ws_B096NJ89C2_5614", "instruction": "i am looking for multi colored glass window film that is eco friendly. the installation process should be easy as well.", "target_attributes": { "attributes": [ "eco friendly", "easy install" ], "options": [ "multi-07022" ] }, "asin": "B096NJ89C2" }, { "task_id": "ws_B07Y28ZGVJ_5615", "instruction": "i'm looking for oral care for seed oiul.", "target_attributes": { "attributes": [ "seed oil", "coconut oil" ], "options": [] }, "asin": "B07Y28ZGVJ" }, { "task_id": "ws_B09KQWHSJ8_5616", "instruction": "i\u2019m looking for a wireless headset with microphone , water proof, foldable bluetooth earphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black" ] }, "asin": "B09KQWHSJ8" }, { "task_id": "ws_B09Q13K3Z2_5617", "instruction": "i'm looking for a victorian bed frame, twin queen size with storage space.", "target_attributes": { "attributes": [ "queen size", "storage space" ], "options": [ "twin", "victorian" ] }, "asin": "B09Q13K3Z2" }, { "task_id": "ws_B0823FF5ZV_5618", "instruction": "i am looking for a star wars the mandalorian t-shirt which is machine washable and is in the baby blue color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "baby blue" ] }, "asin": "B0823FF5ZV" }, { "task_id": "ws_B086JMT1YY_5619", "instruction": "i would like a black 5xl tunic with short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "z1-black", "5x-large" ] }, "asin": "B086JMT1YY" }, { "task_id": "ws_B08CKJJYVP_5620", "instruction": "i ma looking for a wireless charging flip cases of midnight green color.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "midnight green" ] }, "asin": "B08CKJJYVP" }, { "task_id": "ws_B09JYQS7B4_5621", "instruction": "i want dailywear long sleeves big shirt with 20\" neck and 34\" sleeve. the color should be lavender 012(pink)", "target_attributes": { "attributes": [ "long sleeve", "daily wear" ], "options": [ "lt lavender 012 (pink)", "20\" neck 34\" sleeve", "big" ] }, "asin": "B09JYQS7B4" }, { "task_id": "ws_B084YYXLWG_5622", "instruction": "i would like a 66 inch matte black lamp floor lamp for my living room. i would also like a remote for the lamp.", "target_attributes": { "attributes": [ "living room" ], "options": [ "matte black", "66inch with remote control" ] }, "asin": "B084YYXLWG" }, { "task_id": "ws_B0872R4BPK_5623", "instruction": "i am looking for a 1.6 ounce (pack of 6) of cookies which is low carb, high protein, low sugar and gluten free.", "target_attributes": { "attributes": [ "low carb", "high protein", "low sugar", "gluten free" ], "options": [ "1.6 ounce (pack of 6)" ] }, "asin": "B0872R4BPK" }, { "task_id": "ws_B0872R4BPK_5624", "instruction": "i want low carb chipmonk keto lemon poppyseed cookies.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "lemon poppyseed" ] }, "asin": "B0872R4BPK" }, { "task_id": "ws_B07SJRN65L_5625", "instruction": "order for me a walnut computer desk 39.4 inches made of a solid wood and easy to clean.", "target_attributes": { "attributes": [ "easy clean", "solid wood" ], "options": [ "walnut", "39.4 inches" ] }, "asin": "B07SJRN65L" }, { "task_id": "ws_B09H2S4WJ5_5626", "instruction": "i am looking for a large size nylon spandex breathable underwear with elastic waistband .", "target_attributes": { "attributes": [ "nylon spandex", "elastic waistband" ], "options": [ "large" ] }, "asin": "B09H2S4WJ5" }, { "task_id": "ws_B09D8ZTYND_5627", "instruction": "i'm looking for a heavy duty table pads made of ecofriendly materials and also easy to clean for dining room. also, choose 48*60 inch in size new version clear 1.5 mm one.", "target_attributes": { "attributes": [ "heavy duty", "eco friendly", "easy clean", "dining room" ], "options": [ "new version clear 1.5mm", "48x60 inch" ] }, "asin": "B09D8ZTYND" }, { "task_id": "ws_B01HJWDOPE_5628", "instruction": "i am looking for a 1 pack of high speed hdmi cables.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "1 pack" ] }, "asin": "B01HJWDOPE" }, { "task_id": "ws_B082D827W8_5629", "instruction": "i need to buy two dozen individually wrapped gourmet cookies.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "1 | 2 dozen" ] }, "asin": "B082D827W8" }, { "task_id": "ws_B07H3ZCTR2_5630", "instruction": "i am looking for a non gmo gluten free spicy salad dressing ketchup", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [] }, "asin": "B07H3ZCTR2" }, { "task_id": "ws_B094CWXTJM_5631", "instruction": "i'm looking for hair extensions for hair loss for dark blonde.", "target_attributes": { "attributes": [ "easy use", "hair loss", "hair extensions" ], "options": [ "dark blonde" ] }, "asin": "B094CWXTJM" }, { "task_id": "ws_B01F6AQXCM_5632", "instruction": "i am looking for fluoride free and sulfate free toothpaste. please choose spearmint flavor..", "target_attributes": { "attributes": [ "fluoride free", "sulfate free", "tea tree" ], "options": [ "spearmint" ] }, "asin": "B01F6AQXCM" }, { "task_id": "ws_B000P257CO_5633", "instruction": "i am looking for a long lasting parfume gift set", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "gift set" ] }, "asin": "B000P257CO" }, { "task_id": "ws_B015SAX8ZA_5634", "instruction": "i would like a sugar free bottle of syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B015SAX8ZA" }, { "task_id": "ws_B097LVNXLB_5635", "instruction": "i looking yoga day classic fit ,machine wash ,heathers cotten women t-shirt color:royal blue size 3t", "target_attributes": { "attributes": [ "machine wash", "heathers cotton", "classic fit" ], "options": [ "royal blue", "women", "3t" ] }, "asin": "B097LVNXLB" }, { "task_id": "ws_B07Q33QSYT_5636", "instruction": "i'm looking for computer accessories it was silver in color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "silver" ] }, "asin": "B07Q33QSYT" }, { "task_id": "ws_B08MBRJPDQ_5637", "instruction": "i need a five by four foot light weight, easy to carry background for digital photography.", "target_attributes": { "attributes": [ "light weight", "easy carry", "digital photography" ], "options": [ "5x4ft" ] }, "asin": "B08MBRJPDQ" }, { "task_id": "ws_B07KKH48DG_5638", "instruction": "i am looking for 3 piece decorative quilted bedspread set with 2 pillow shams of violet color, that is fit for queen size bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "violet" ] }, "asin": "B07KKH48DG" }, { "task_id": "ws_B017ILW1OG_5639", "instruction": "i am looking for a fully assembled twin box spring and mattress set in king size", "target_attributes": { "attributes": [ "fully assembled", "king size" ], "options": [ "twin" ] }, "asin": "B017ILW1OG" }, { "task_id": "ws_B093YSF315_5640", "instruction": "i'm looking for travel laundry bag it will use for travel usage.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSF315" }, { "task_id": "ws_B08TWXQ5HN_5641", "instruction": "langwolf kids camera, 1080p hd digital camera with 32gb sd card, kids selfie video camera for 3 4 5 6 7 8 9 year olds boys tell me the best option of digital camera hd1080p with an sd card with at least 32gb for boys and girls in the range of 3 to 9 years. i saw a \"langwolf\" brand on tv. send me her features.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B08TWXQ5HN" }, { "task_id": "ws_B09293PTPM_5642", "instruction": "i'm looking for a ottoman 6 seater sofa.", "target_attributes": { "attributes": [ "living room" ], "options": [ "deep grey", "love seat couch" ] }, "asin": "B09293PTPM" }, { "task_id": "ws_B0892RWN9Y_5643", "instruction": "i am looking for a sunstone color eyeshadow with paraben free non toxic", "target_attributes": { "attributes": [ "paraben free", "non toxic" ], "options": [ "sunstone" ] }, "asin": "B0892RWN9Y" }, { "task_id": "ws_B0892RWN9Y_5644", "instruction": "i'm looking for gypsy amber eyeshadow.", "target_attributes": { "attributes": [ "non toxic", "long lasting" ], "options": [ "gypsy amber" ] }, "asin": "B0892RWN9Y" }, { "task_id": "ws_B07YD5PL4Y_5645", "instruction": "i need king size, machine washable, super soft duvet cover set in multi 41 color.", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "multi 41", "king" ] }, "asin": "B07YD5PL4Y" }, { "task_id": "ws_B07YD5PL4Y_5646", "instruction": "i want a twin size and machine washable feelyou blue rose floral duvet cover.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "twin" ] }, "asin": "B07YD5PL4Y" }, { "task_id": "ws_B07V8L4R61_5647", "instruction": "need me an electric blue, gluten free cake color gel, 1.06 ounces", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "electric blue" ] }, "asin": "B07V8L4R61" }, { "task_id": "ws_B07HRNGS3Q_5648", "instruction": "i am looking for a black power dental flossers for bad breath", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "black" ] }, "asin": "B07HRNGS3Q" }, { "task_id": "ws_B09L6B6HGN_5649", "instruction": "find me a case with tempered glass for apple watch 45mm color variety", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "black+silver+pink+rose gold+white+classic leopard", "only for 45mm" ] }, "asin": "B09L6B6HGN" }, { "task_id": "ws_B001UMV18M_5650", "instruction": "i need a deep chestnut brown hair dye that is permanent.", "target_attributes": { "attributes": [ "permanent hair", "hair dye" ], "options": [ "434 deep chestnut brown (chocolate chesnut)" ] }, "asin": "B001UMV18M" }, { "task_id": "ws_B001UMV18M_5651", "instruction": "i need a dark brown permanent hair dye. it should be easy to use.", "target_attributes": { "attributes": [ "easy use", "permanent hair", "hair dye" ], "options": [ "40 dark brown (dark chocolate)" ] }, "asin": "B001UMV18M" }, { "task_id": "ws_B083GGC2N9_5652", "instruction": "i am looking for modern high performance 3-way tower speaker, it should have left & right pair d17 speaker (black)", "target_attributes": { "attributes": [ "high performance" ], "options": [ "left & right pair d17 speaker (black)" ] }, "asin": "B083GGC2N9" }, { "task_id": "ws_B083GGC2N9_5653", "instruction": "i'm looking for d17(dedicated right, back) high performance 3-way tower speaker made with carbon fiber", "target_attributes": { "attributes": [ "high performance", "carbon fiber" ], "options": [ "d17\u00a0(dedicated right, black)" ] }, "asin": "B083GGC2N9" }, { "task_id": "ws_B09P56Q9FQ_5654", "instruction": "i would like a large pair of multicolored boxer briefs that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "multi *18", "large" ] }, "asin": "B09P56Q9FQ" }, { "task_id": "ws_B00H9V37Q2_5655", "instruction": "i am looking for a long lasting eau de parfum", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00H9V37Q2" }, { "task_id": "ws_B08R7W8QRK_5656", "instruction": "i need a valentines day chocolate gift box.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "chocolate gift box" ] }, "asin": "B08R7W8QRK" }, { "task_id": "ws_B07X7HPYNS_5657", "instruction": "i need some special hair conditioner for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B07X7HPYNS" }, { "task_id": "ws_B01LMMZY6O_5658", "instruction": "i am looking for a 2.53 fl oz hyaluronic acid cc creams", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "2.53 fl oz" ] }, "asin": "B01LMMZY6O" }, { "task_id": "ws_B09M91MRZS_5659", "instruction": "i'm looking for clothing its was short sleeve and regular fit. its easily to wear.", "target_attributes": { "attributes": [ "regular fit", "short sleeve" ], "options": [ "hi bite size | black" ] }, "asin": "B09M91MRZS" }, { "task_id": "ws_B007K649KO_5660", "instruction": "i need to satisfy my desire to eat g.h. cretors popcorn, the mix, 1.5 oz. (pack of 12). i prefer this brand because it is a healthy, gluten-free and non-gmo option. find the 8 ounce pack", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "buffalo & ranch", "8 ounce (pack of 12)" ] }, "asin": "B007K649KO" }, { "task_id": "ws_B07RML64XD_5661", "instruction": "i am looking for trader joe's apple sauce crushers.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B07RML64XD" }, { "task_id": "ws_B004JLGC12_5662", "instruction": "i am looking for a paraben free and dermatologist tested exfoliating body wash with pink lemon and mandarin orange extracts.", "target_attributes": { "attributes": [ "dermatologist tested", "paraben free" ], "options": [ "pink lemon and mandarin orange" ] }, "asin": "B004JLGC12" }, { "task_id": "ws_B004JLGC12_5663", "instruction": "i am looking fir paraben free body wash.please choose vanilla style.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "vanilla" ] }, "asin": "B004JLGC12" }, { "task_id": "ws_B0744ZJP2M_5664", "instruction": "find me a gold plated stereo audio cable that works well with a power amplifier and is 5ft long.", "target_attributes": { "attributes": [ "power amplifier", "gold plated" ], "options": [ "5ft" ] }, "asin": "B0744ZJP2M" }, { "task_id": "ws_B08YDRBP2J_5665", "instruction": "i'm looking for a high density gaming chair with lumbar support which is made of pu leather. also, choose cool blue colored one.", "target_attributes": { "attributes": [ "high density", "lumbar support", "pu leather" ], "options": [ "cool blue" ] }, "asin": "B08YDRBP2J" }, { "task_id": "ws_B00AY351OI_5666", "instruction": "i'm looking for a oil free, fragrance free pressed powder that should be long lasting when applied. also choose 290 natural ochre one.", "target_attributes": { "attributes": [ "oil free", "fragrance free", "long lasting" ], "options": [ "290 natural ochre" ] }, "asin": "B00AY351OI" }, { "task_id": "ws_B08P3P4KP9_5667", "instruction": "i need ready to shake high protein mocktail which is lactose, soy & gluten free.", "target_attributes": { "attributes": [ "lactose free", "soy free", "high protein", "gluten free" ], "options": [] }, "asin": "B08P3P4KP9" }, { "task_id": "ws_B00TB3QJ7U_5668", "instruction": "i need a ten pack of male to female hdmi cables that are three feet long, high speed, and gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "hdmi male to female", "3 ft" ] }, "asin": "B00TB3QJ7U" }, { "task_id": "ws_B00TB3QJ7U_5669", "instruction": "i am looking for high speed 8ft style hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "8 ft" ] }, "asin": "B00TB3QJ7U" }, { "task_id": "ws_B00TB3QJ7U_5670", "instruction": "i am looking for a 30 foot gold plated high speed hdmi cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "30 ft" ] }, "asin": "B00TB3QJ7U" }, { "task_id": "ws_B09MW7P4PH_5671", "instruction": "i'm looking for binoculars for bird watching even at so far.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09MW7P4PH" }, { "task_id": "ws_B07GR317N3_5672", "instruction": "i\u2019m looking for rockport lace up shoes for men", "target_attributes": { "attributes": [ "comfortable fit", "synthetic sole" ], "options": [ "dark brown tumbled leather", "12 narrow" ] }, "asin": "B07GR317N3" }, { "task_id": "ws_B08Y5YY53J_5673", "instruction": "i am in need of a sunflower piggy printed protection case cover for iphone 6 plus", "target_attributes": { "attributes": [ "case cover" ], "options": [ "sunflower piggy", "iphone 6 plus | 6s plus" ] }, "asin": "B08Y5YY53J" }, { "task_id": "ws_B08Y5YY53J_5674", "instruction": "i need iphone 11 wireless charging", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "iphone 11" ] }, "asin": "B08Y5YY53J" }, { "task_id": "ws_B07QFZ4FVH_5675", "instruction": "i want easy use high quality nail art equipment for nail art", "target_attributes": { "attributes": [ "easy use", "nail art" ], "options": [] }, "asin": "B07QFZ4FVH" }, { "task_id": "ws_B094F7PR1C_5676", "instruction": "please re order a 9188 -red brown leather duo motor recliner chair and should be of high density and easy to clean.", "target_attributes": { "attributes": [ "high density", "easy clean" ], "options": [ "9188-red-brown leather" ] }, "asin": "B094F7PR1C" }, { "task_id": "ws_B093YSSQ4W_5677", "instruction": "i am looking for a wallets for blouse hosiery & laundry bag", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YSSQ4W" }, { "task_id": "ws_B08JCJ2KFB_5678", "instruction": "i would like a plant based shampoo.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B08JCJ2KFB" }, { "task_id": "ws_B08FJ4H5LS_5679", "instruction": "i am looking for a travel size perfume with long lasting fragrance. also choose coco mademoiselle + j'adore impression scent.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "coco mademoiselle + j'adore impression" ] }, "asin": "B08FJ4H5LS" }, { "task_id": "ws_B09HW6VVVR_5680", "instruction": "i am looking for a tan memory foam slipper", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "tan" ] }, "asin": "B09HW6VVVR" }, { "task_id": "ws_B085NK43LF_5681", "instruction": "power cord cable outlet plug lead for fm stereo sound rider with output protection", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B085NK43LF" }, { "task_id": "ws_B08PN4HT3W_5682", "instruction": "in the last order i bought the sauce from the brand org\u00e2nicville organic, caesar sauce, the taste is very good .no dairy, 8 fz i want to repeat this order .", "target_attributes": { "attributes": [ "non dairy" ], "options": [] }, "asin": "B08PN4HT3W" }, { "task_id": "ws_B08PNNV9K8_5683", "instruction": "i looking hair styling fine mist sprayers refillable bottles color :pink", "target_attributes": { "attributes": [ "fine mist", "hair styling" ], "options": [ "pink | 10 ounce" ] }, "asin": "B08PNNV9K8" }, { "task_id": "ws_B07MP1QM5Y_5684", "instruction": "i'm looking for a rca 3-device universal remote control for repacement.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07MP1QM5Y" }, { "task_id": "ws_B088FLL9JY_5685", "instruction": "i am looking for a 50 ml leak proof bags & cases", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "50ml" ] }, "asin": "B088FLL9JY" }, { "task_id": "ws_B09FDW71SF_5686", "instruction": "i am looking for a black knee high mid-calf", "target_attributes": { "attributes": [ "knee high" ], "options": [] }, "asin": "B09FDW71SF" }, { "task_id": "ws_B09SQ79S1R_5687", "instruction": "i'm looking for skin buttock lifting clothing it can use for machine washing.", "target_attributes": { "attributes": [ "wide leg", "machine wash", "elastic closure" ], "options": [ "medium" ] }, "asin": "B09SQ79S1R" }, { "task_id": "ws_B01M278GOF_5688", "instruction": "find me natural hair gels that use seed oil as a main ingredient.", "target_attributes": { "attributes": [ "seed oil", "natural ingredients" ], "options": [] }, "asin": "B01M278GOF" }, { "task_id": "ws_B07ZFGY6H9_5689", "instruction": "i'm looking for palazzo pants its easy to wear and it was straight leg.", "target_attributes": { "attributes": [ "wide leg", "straight leg", "hand wash", "machine wash", "elastic waist", "high waist", "polyester spandex" ], "options": [ "blacklittledot" ] }, "asin": "B07ZFGY6H9" }, { "task_id": "ws_B0773T5G7Y_5690", "instruction": "i am looking for gluten free almond cranberry crunch.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "almond cranberry crunch" ] }, "asin": "B0773T5G7Y" }, { "task_id": "ws_B097PNKNSM_5691", "instruction": "i am looking for a nail art for practice hands & fingers.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "practice hand" ] }, "asin": "B097PNKNSM" }, { "task_id": "ws_B08YDNMW8S_5692", "instruction": "i'm looking for a 2.75 inch partywoo birthday blue candles .", "target_attributes": { "attributes": [ "party supplies", "birthday party" ], "options": [ "rose gold", "number 1" ] }, "asin": "B08YDNMW8S" }, { "task_id": "ws_B093YSDRGB_5693", "instruction": "i am looking for a wallets of blouse hosiery and laundry bag", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YSDRGB" }, { "task_id": "ws_B08VRCCK9V_5694", "instruction": "i need a 1 pack of high quality hair piece shaped like donuts . an i would prefer 30# color", "target_attributes": { "attributes": [ "high quality" ], "options": [ "30#", "1 count (pack of 1)" ] }, "asin": "B08VRCCK9V" }, { "task_id": "ws_B08TLVTW38_5695", "instruction": "i will like to have the low fat silver hills steady eddie bread, made with organic sprouted grains, non-gmo, the big 16", "target_attributes": { "attributes": [ "non gmo", "low fat" ], "options": [] }, "asin": "B08TLVTW38" }, { "task_id": "ws_B0035Q2Q12_5696", "instruction": "i am looking for flower glass shade floor lamp", "target_attributes": { "attributes": [ "glass shade" ], "options": [] }, "asin": "B0035Q2Q12" }, { "task_id": "ws_B09FSSFPR7_5697", "instruction": "i am looking for a 4g lte coaxial cable.", "target_attributes": { "attributes": [ "coaxial cable", "4g lte" ], "options": [] }, "asin": "B09FSSFPR7" }, { "task_id": "ws_B08KJGG1TY_5698", "instruction": "i would like a 3 pound bag of unsalted deluxe nut mix that are in a resealable bag.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "unsalted deluxe mix", "3 pound" ] }, "asin": "B08KJGG1TY" }, { "task_id": "ws_B095CGDBX3_5699", "instruction": "i am looking for small sized with eastic waist men short.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "small" ] }, "asin": "B095CGDBX3" }, { "task_id": "ws_B097H8P7MN_5700", "instruction": "i am looking for tempered glass screen protector for iphone xr.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [ "black" ] }, "asin": "B097H8P7MN" }, { "task_id": "ws_B09MLNM1T3_5701", "instruction": "i am looking for a breathable and slip resistant shoe with rubber sole for men. also choose size 8.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "8" ] }, "asin": "B09MLNM1T3" }, { "task_id": "ws_B09MN9BTFC_5702", "instruction": "am looking for a long lasting reddhoon metallic nail polish blue and purple colors", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "blue purple" ] }, "asin": "B09MN9BTFC" }, { "task_id": "ws_B08QHX9ZGK_5703", "instruction": "i am looking for a metal legs chair for living room which is east to assemble. also choose velvet black color.", "target_attributes": { "attributes": [ "easy assemble", "metal legs", "living room" ], "options": [ "velvet black" ] }, "asin": "B08QHX9ZGK" }, { "task_id": "ws_B08VW7Y2B8_5704", "instruction": "find me a watch band in hyper grape color that is made of stainless steel and goes with my apple iwatch.", "target_attributes": { "attributes": [ "compatible apple", "stainless steel" ], "options": [ "hyper grape" ] }, "asin": "B08VW7Y2B8" }, { "task_id": "ws_B01N9VRK5O_5705", "instruction": "i am looking for a single pack of 8 ounce dried cherries that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B01N9VRK5O" }, { "task_id": "ws_B01N9VRK5O_5706", "instruction": "i need wild blueberries that are dried and non gmo that is 8 oz.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "dried organic wild blueberries", "8 ounce" ] }, "asin": "B01N9VRK5O" }, { "task_id": "ws_B09PZC19WJ_5707", "instruction": "i'm looking for furniture to make my living room and dinning room so nice.", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [] }, "asin": "B09PZC19WJ" }, { "task_id": "ws_B07DRPSWX6_5708", "instruction": "i am looking for king size pillows in plum", "target_attributes": { "attributes": [ "king size" ], "options": [ "plum" ] }, "asin": "B07DRPSWX6" }, { "task_id": "ws_B019EGM8FU_5709", "instruction": "i am looking for a 12 count (pack of 1) of gluten free raspberry cashew & chia", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12 count (pack of 1)" ] }, "asin": "B019EGM8FU" }, { "task_id": "ws_B019EGM8FU_5710", "instruction": "i am looking for a 12 pack of gluten free bars that are dark chocolate almond", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "dark chocolate chili almond", "12 count (pack of 1)" ] }, "asin": "B019EGM8FU" }, { "task_id": "ws_B074YN5HNL_5711", "instruction": "i'm looking for a memias premium window sheer voile curtains", "target_attributes": { "attributes": [ "white item" ], "options": [ "butter cream", "54\"w x 63\"l" ] }, "asin": "B074YN5HNL" }, { "task_id": "ws_B09MHJSG85_5712", "instruction": "i'm looking for a portable nail clippers.", "target_attributes": { "attributes": [ "stainless steel", "dead skin" ], "options": [ "02" ] }, "asin": "B09MHJSG85" }, { "task_id": "ws_B09D59L59Y_5713", "instruction": "i am looking for a grey mules & clogs for day comfert", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "grey" ] }, "asin": "B09D59L59Y" }, { "task_id": "ws_B09K4575MQ_5714", "instruction": "i am looking for birthday cake toppers of black 65 pattern.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "black 65" ] }, "asin": "B09K4575MQ" }, { "task_id": "ws_B09DGR2TJC_5715", "instruction": "i would like some cake toppers for a baby shower or birthday party.", "target_attributes": { "attributes": [ "baby shower", "birthday party" ], "options": [] }, "asin": "B09DGR2TJC" }, { "task_id": "ws_B07WS7VZQJ_5716", "instruction": "i am in need of some cupcake toppers that have a birthday party theme and is meant for a baby shower.", "target_attributes": { "attributes": [ "birthday party", "baby shower" ], "options": [] }, "asin": "B07WS7VZQJ" }, { "task_id": "ws_B09NDWTV9B_5717", "instruction": "i want a hoodie for couple with quality polyester in size medium black", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "black", "medium" ] }, "asin": "B09NDWTV9B" }, { "task_id": "ws_B08CDP994X_5718", "instruction": "i'm looking for keto friendly it has low sugar its good for health.", "target_attributes": { "attributes": [ "grain free", "low sugar", "gluten free", "soy free", "keto friendly", "dairy free" ], "options": [ "coconut, almond & pecan" ] }, "asin": "B08CDP994X" }, { "task_id": "ws_B078SRYXM8_5719", "instruction": "i am looking for a general colored floor lamp for my living room. it should be easy to clean and assemble.", "target_attributes": { "attributes": [ "easy clean", "easy assemble", "living room" ], "options": [ "style-2 general" ] }, "asin": "B078SRYXM8" }, { "task_id": "ws_B00BNOQQEG_5720", "instruction": "help me find 2 fl oz (pack of 24) gluten free non gmo butter extract made without artificial colors.", "target_attributes": { "attributes": [ "non gmo", "gluten free", "artificial colors" ], "options": [ "butter extract", "2 fl oz (pack of 24)" ] }, "asin": "B00BNOQQEG" }, { "task_id": "ws_B08LH9PXPZ_5721", "instruction": "i would like a pair of women's size 14.5 black work shoes with a steel toe.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "black", "14.5 women | 13 men" ] }, "asin": "B08LH9PXPZ" }, { "task_id": "ws_B09KZTD2NB_5722", "instruction": "i'm looking for decorative pillows and covers for dinning room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "wood hockey rose" ] }, "asin": "B09KZTD2NB" }, { "task_id": "ws_B095S8341G_5723", "instruction": "i need a small spray fine mist with 100 ml amber for travel, makeup etc", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "amber", "100ml" ] }, "asin": "B095S8341G" }, { "task_id": "ws_B06WLPJPDZ_5724", "instruction": "i am looking for a fluoride free, paraben free toothpaste.", "target_attributes": { "attributes": [ "fluoride free", "paraben free" ], "options": [] }, "asin": "B06WLPJPDZ" }, { "task_id": "ws_B09S3QKSWW_5725", "instruction": "i am looking for 9pcs of hair growth essence spray.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "9pcs" ] }, "asin": "B09S3QKSWW" }, { "task_id": "ws_B00A2AX4Y2_5726", "instruction": "i am looking for a natural ingredients soap", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B00A2AX4Y2" }, { "task_id": "ws_B08P4LL9G2_5727", "instruction": "in hunt for a paraben free, weave tea tree and borage seed oil scalp treatment soother oil serum for scalps in a 2 ounce bottle for wigs made by the sheamoisture company.", "target_attributes": { "attributes": [ "paraben free", "tea tree", "seed oil", "damaged hair" ], "options": [] }, "asin": "B08P4LL9G2" }, { "task_id": "ws_B07YKBG1FD_5728", "instruction": "i would like a pair of size 12 black oxford shoes with a leather sole.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "3#black", "12" ] }, "asin": "B07YKBG1FD" }, { "task_id": "ws_B007D7DM08_5729", "instruction": "i'm looking for teeth whitening for prevention of oral care.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B007D7DM08" }, { "task_id": "ws_B09QX7T1PW_5730", "instruction": "i am looking for an easy apply concealer foundation makeup cosmetics that can cover dark circles. a light skin tone will work well for me.", "target_attributes": { "attributes": [ "easy apply", "dark circles" ], "options": [ "light skin tone" ] }, "asin": "B09QX7T1PW" }, { "task_id": "ws_B09QK4LW5H_5731", "instruction": "i'm looking for a portable computer speakers that has plug play and power amplifier.", "target_attributes": { "attributes": [ "plug play", "power amplifier" ], "options": [] }, "asin": "B09QK4LW5H" }, { "task_id": "ws_B094F7LXBS_5732", "instruction": "i'm looking for apple smartwatch acesseries it is easy to use.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "blue & white porcelain" ] }, "asin": "B094F7LXBS" }, { "task_id": "ws_B09KG2B4XX_5733", "instruction": "i am looking for a high performance 4g lte android tablet.", "target_attributes": { "attributes": [ "high performance", "4g lte" ], "options": [] }, "asin": "B09KG2B4XX" }, { "task_id": "ws_B09KG2B4XX_5734", "instruction": "i'm looking for 10 inch android tablet with dual 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09KG2B4XX" }, { "task_id": "ws_B08WHQ8SHJ_5735", "instruction": "i am looking for a low calorie, gluten free tortilla with chia and sesame seeds.", "target_attributes": { "attributes": [ "low calorie", "gluten free" ], "options": [] }, "asin": "B08WHQ8SHJ" }, { "task_id": "ws_B07KG3NLVH_5736", "instruction": "find me a long lasting and anti perspirant deodorant", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B07KG3NLVH" }, { "task_id": "ws_B00J8E93G6_5737", "instruction": "i'm looking for white colored plug play and it will use for video accesseories.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "white" ] }, "asin": "B00J8E93G6" }, { "task_id": "ws_B08792CRQ6_5738", "instruction": "universal smart controller with big buttons tool for tv stb dvd with aaa batteries", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B08792CRQ6" }, { "task_id": "ws_B09GFWF132_5739", "instruction": "show me a apple compatible white sport band made from stainless steel and in 40 mm size.", "target_attributes": { "attributes": [ "compatible apple", "stainless steel" ], "options": [ "lavender grey | cactus | black | white | hibiscus", "38 | 40 | 41mm s | m" ] }, "asin": "B09GFWF132" }, { "task_id": "ws_B08N4T81LQ_5740", "instruction": "i am looking for a pink cupcake toppers, cupcake picks for baby shower birthday party party supplies", "target_attributes": { "attributes": [ "cupcake picks", "baby shower", "birthday party", "party supplies" ], "options": [ "pink" ] }, "asin": "B08N4T81LQ" }, { "task_id": "ws_B08SM9QQJJ_5741", "instruction": "i want to find hair extensions that are strawberry blonde to medium brown, and they need to be 18 inches long.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#4 | 27 strawberry blonde to medium brown", "120g-18 inch" ] }, "asin": "B08SM9QQJJ" }, { "task_id": "ws_B09HCRF6RQ_5742", "instruction": "i'm looking for clothing long sleeve its for women's. it was easy to use.", "target_attributes": { "attributes": [ "long sleeve", "teen girls" ], "options": [ "a6-yellow" ] }, "asin": "B09HCRF6RQ" }, { "task_id": "ws_B09PGFDCZB_5743", "instruction": "i am looking for a black valentines day women\u2019s medium jumpsuit and should be a high quality material.", "target_attributes": { "attributes": [ "quality materials" ], "options": [] }, "asin": "B09PGFDCZB" }, { "task_id": "ws_B09SYTR26S_5744", "instruction": "i'm looking for a high quality, non toxic massage table sheets made of quality materials that is easy to clean for a beauty salon. also, choose 70 * 185 cm sized purple colored one.", "target_attributes": { "attributes": [ "high quality", "non toxic", "easy clean", "quality materials", "beauty salon" ], "options": [ "purple", "70*185cm" ] }, "asin": "B09SYTR26S" }, { "task_id": "ws_B09SYTR26S_5745", "instruction": "i would like a purple 70 by 190 cm linen for my beauty salon that is easy to clean.", "target_attributes": { "attributes": [ "easy clean", "beauty salon" ], "options": [ "purple", "70*190cm" ] }, "asin": "B09SYTR26S" }, { "task_id": "ws_B09KM5R2RX_5746", "instruction": "i need a warm winter coat for women with faux fur.", "target_attributes": { "attributes": [ "winter warm", "faux fur" ], "options": [ "fall winter women tops new arrivals - c309-blue" ] }, "asin": "B09KM5R2RX" }, { "task_id": "ws_B09JP4M2WW_5747", "instruction": "i'm looking for a 3 boho wall decor mid century modern wall art by gubiyu", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [ "teal and pink", "24x36 inch (60x90cm)*3pcs" ] }, "asin": "B09JP4M2WW" }, { "task_id": "ws_B094Q1893G_5748", "instruction": "i am looking for eco friendly scented candles", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "scented candles gift set - c" ] }, "asin": "B094Q1893G" }, { "task_id": "ws_B086JQS639_5749", "instruction": "i am looking for a 1082 white sports bras for daily casual.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "1082 white" ] }, "asin": "B086JQS639" }, { "task_id": "ws_B09RWRKNGM_5750", "instruction": "i am looking for a medium short sleeve control slips", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "medium" ] }, "asin": "B09RWRKNGM" }, { "task_id": "ws_B08BW4HZ7R_5751", "instruction": "i'm looking for protein crunch bars that are grain free, high in protein, and keto friendly. also they should be peanut cinnamon hemp flavor.", "target_attributes": { "attributes": [ "grain free", "keto friendly", "high protein" ], "options": [ "peanut cinnamon hemp" ] }, "asin": "B08BW4HZ7R" }, { "task_id": "ws_B00940MS5C_5752", "instruction": "i am looking for a craft table with steel frame that comes with a padded stool.", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B00940MS5C" }, { "task_id": "ws_B003G84QWQ_5753", "instruction": "parmcrisps - all parm crisps cheese, made simply with 100% real cheese | healthy keto snacks, low carb, high protein, gluten free, oven baked, keto-friendly find for me, parm crisps brand, as it is oven baked, gluten free, low carb. excellent product that helps me maintain my low carb diet. my favorite flavor is italian herb. find this flavor.", "target_attributes": { "attributes": [ "low carb", "gluten free" ], "options": [ "italian herb" ] }, "asin": "B003G84QWQ" }, { "task_id": "ws_B099N65WM4_5754", "instruction": "i need a dense cotton mattress cover.", "target_attributes": { "attributes": [ "high density" ], "options": [ "cotton" ] }, "asin": "B099N65WM4" }, { "task_id": "ws_B0861RT8HC_5755", "instruction": "i would like 18 bags of 1.25 croele party mix that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "creole", "1.25 ounce (pack of 18)" ] }, "asin": "B0861RT8HC" }, { "task_id": "ws_B07BJ1DGCP_5756", "instruction": "i looking a dark chocolate gift basket pack for valentine day size -2 pound", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [ "dark chocolate", "2 pound" ] }, "asin": "B07BJ1DGCP" }, { "task_id": "ws_B01LZI0UK9_5757", "instruction": "i need plant based and sulfate free shampoo which prevents hair loss and regenerates hair growth.", "target_attributes": { "attributes": [ "plant based", "sulfate free", "hair loss", "hair growth" ], "options": [] }, "asin": "B01LZI0UK9" }, { "task_id": "ws_B07P5QJGYB_5758", "instruction": "i am searching for beige color memory foam upholstered fabric platform bed", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "beige" ] }, "asin": "B07P5QJGYB" }, { "task_id": "ws_B082BHTXKJ_5759", "instruction": "i'm looking for clothing jeans it will use for easy to machinable wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "traditional jeans", "on that mountain" ] }, "asin": "B082BHTXKJ" }, { "task_id": "ws_B08YJTZQ3R_5760", "instruction": "i'm looking for butt lifting and the clothing for quick drying and high waist.", "target_attributes": { "attributes": [ "butt lifting", "quick drying", "high waist" ], "options": [ "z-zxzblue" ] }, "asin": "B08YJTZQ3R" }, { "task_id": "ws_B00PYUS4IQ_5761", "instruction": "i am looking a dark olive color oil free fine mist foundation", "target_attributes": { "attributes": [ "oil free", "fine mist" ], "options": [ "dark olive" ] }, "asin": "B00PYUS4IQ" }, { "task_id": "ws_B01M5AU5DH_5762", "instruction": "i'm looking for buy a rugs for kitchen rugs.", "target_attributes": { "attributes": [ "long lasting", "contemporary design" ], "options": [ "blue-taupe" ] }, "asin": "B01M5AU5DH" }, { "task_id": "ws_B01M5AU5DH_5763", "instruction": "i would like a 5 by 8 ft light blue runner rug for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light blue | ivory", "runner", "5 ft x 8 ft" ] }, "asin": "B01M5AU5DH" }, { "task_id": "ws_B000R4JHZS_5764", "instruction": "i am looking for a 0g trans bagels.", "target_attributes": { "attributes": [ "0g trans" ], "options": [] }, "asin": "B000R4JHZS" }, { "task_id": "ws_B07ZNTM2L5_5765", "instruction": "please re order deep conditioning hair treatment for my natural hair and should be 4.06 fl oz.", "target_attributes": { "attributes": [ "hair treatment", "natural hair" ], "options": [ "4.06 fl oz (pack of 1)" ] }, "asin": "B07ZNTM2L5" }, { "task_id": "ws_B07SXDCJ8Y_5766", "instruction": "i'm looking for optical zoom camera it contains stereo sound.", "target_attributes": { "attributes": [ "ultra hd", "optical zoom", "stereo sound" ], "options": [] }, "asin": "B07SXDCJ8Y" }, { "task_id": "ws_B09H4YFG3T_5767", "instruction": "i want to find a matte black hair removal trimmer.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "matte black" ] }, "asin": "B09H4YFG3T" }, { "task_id": "ws_B095PXPXY7_5768", "instruction": "i'm looking for a long lasting hydrating lip gloss that contains hyaluronic acid. also, choose name drop one.", "target_attributes": { "attributes": [ "long lasting", "hyaluronic acid" ], "options": [ "name drop" ] }, "asin": "B095PXPXY7" }, { "task_id": "ws_B07KGNDN6Q_5769", "instruction": "i would like a black nightstand for my kid that is made of engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "black", "childrens" ] }, "asin": "B07KGNDN6Q" }, { "task_id": "ws_B086CXB31T_5770", "instruction": "hey !order for me women\u2019s sun sandals size 10 and should come with a synthetic sole and a open toe.", "target_attributes": { "attributes": [ "open toe", "synthetic sole" ], "options": [ "10" ] }, "asin": "B086CXB31T" }, { "task_id": "ws_B08HHLN3V4_5771", "instruction": "i am looking for a 1.5mm anti aging cotton swabs", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "1.5mm" ] }, "asin": "B08HHLN3V4" }, { "task_id": "ws_B09HJ9L74K_5772", "instruction": "i want bowl to have in a bowl, soy wax scented candle which is lead free.", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [ "bowl to have in a bowl" ] }, "asin": "B09HJ9L74K" }, { "task_id": "ws_B09HJ9L74K_5773", "instruction": "i need some candles that are made with soy wax and that have a pretty scent.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "pretty is as pretty does" ] }, "asin": "B09HJ9L74K" }, { "task_id": "ws_B003K15U2Y_5774", "instruction": "i'm looking for clothing accessories for women's.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [] }, "asin": "B003K15U2Y" }, { "task_id": "ws_B09J8FXQKG_5775", "instruction": "i'm looking for a high quality salon and spa chair for hair and beauty salon. also, choose grey colored one.", "target_attributes": { "attributes": [ "high quality", "hair salon", "beauty salon" ], "options": [ "grey" ] }, "asin": "B09J8FXQKG" }, { "task_id": "ws_B07T94Q186_5776", "instruction": "looking for a cream | gray which is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "cream | gray" ] }, "asin": "B07T94Q186" }, { "task_id": "ws_B09LM1ZTM8_5777", "instruction": "i want a pink color easy assemble height adjustable 26\"h -2 chair bar stool", "target_attributes": { "attributes": [ "height adjustable", "easy assemble" ], "options": [] }, "asin": "B09LM1ZTM8" }, { "task_id": "ws_B09KBWR214_5778", "instruction": "i'm looking for a blue, 10.1 inch android tablet that has dual cameras and a long-lasting battery.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "blue" ] }, "asin": "B09KBWR214" }, { "task_id": "ws_B075SWK9DV_5779", "instruction": "i am looking for a blue classic fit shirts for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "blue" ] }, "asin": "B075SWK9DV" }, { "task_id": "ws_B09JC2MQMF_5780", "instruction": "i would like a some black camera batteries that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "b-black" ] }, "asin": "B09JC2MQMF" }, { "task_id": "ws_B09PBKBPCT_5781", "instruction": "i would like a women's 3xl black blouse that is long sleeved.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black", "3x-large", "women" ] }, "asin": "B09PBKBPCT" }, { "task_id": "ws_B07NHZSPY8_5782", "instruction": "hi there, can you search the web for the price of a 30 pack of sugar-free limon to drink while on my low-carb diet.", "target_attributes": { "attributes": [ "low carb", "zero sugar" ], "options": [ "limon", "0.38 ounce (pack of 30)" ] }, "asin": "B07NHZSPY8" }, { "task_id": "ws_B08C2NJYPJ_5783", "instruction": "i am looking for flat open toe slipper in z1-02 black", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z1-02 black" ] }, "asin": "B08C2NJYPJ" }, { "task_id": "ws_B096PGWDYN_5784", "instruction": "i am looking for eco friendly roller shades for windows in charcoal gray color", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "charcoal gray" ] }, "asin": "B096PGWDYN" }, { "task_id": "ws_B092J8JNQ1_5785", "instruction": "i'm looking for a 40 pieces hair satin foam rollers perm rods.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "0.6 inch (pack of 40)" ] }, "asin": "B092J8JNQ1" }, { "task_id": "ws_B09QJJPNMB_5786", "instruction": "i'm looking for a closed toe sandals with arch support and lace closure. also, choose 5.5 size black colored one.", "target_attributes": { "attributes": [ "lace closure", "closed toe", "arch support" ], "options": [ "black", "5.5" ] }, "asin": "B09QJJPNMB" }, { "task_id": "ws_B08DW5G5JX_5787", "instruction": "please order for me 6 packs of black eye peas that are gluten free and non gmo.", "target_attributes": { "attributes": [ "gluten free", "non gmo" ], "options": [ "black eye peas", "1 pound (pack of 6)" ] }, "asin": "B08DW5G5JX" }, { "task_id": "ws_B08DW5G5JX_5788", "instruction": "i'm looking for camellia brand dried field peas.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1 pound (pack of 12)" ] }, "asin": "B08DW5G5JX" }, { "task_id": "ws_B09KCJQ88D_5789", "instruction": "i would like a 30 x 40 inches multicolored super soft fleece throw.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "multi 2", "30 x 40 inches" ] }, "asin": "B09KCJQ88D" }, { "task_id": "ws_B095HDHRWV_5790", "instruction": "i want a solid wood sofa bed that goes in my living room. pick a 2 seater.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "2 seat" ] }, "asin": "B095HDHRWV" }, { "task_id": "ws_B0081E6YX4_5791", "instruction": "i'm looking for a clincally proven hyaluronic acid 20% vitamin c serum that helps with fine lines.", "target_attributes": { "attributes": [ "clinically proven", "hyaluronic acid", "fine lines" ], "options": [ "20% vitamin c serum" ] }, "asin": "B0081E6YX4" }, { "task_id": "ws_B09M6TRN3W_5792", "instruction": "i'm looking for engineered wood it was white finish grey in color.", "target_attributes": { "attributes": [ "white item", "easy clean", "white finish" ], "options": [ "grey" ] }, "asin": "B09M6TRN3W" }, { "task_id": "ws_B09M6TRN3W_5793", "instruction": "i want gray startogoo twin low bunk bed with wood frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "gray 2" ] }, "asin": "B09M6TRN3W" }, { "task_id": "ws_B07B5VSTNR_5794", "instruction": "i am looking for chocolate gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "chocolate" ] }, "asin": "B07B5VSTNR" }, { "task_id": "ws_B07B5VSTNR_5795", "instruction": "i am looking for chocolate flavor milk chocolate for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "chocolate" ] }, "asin": "B07B5VSTNR" }, { "task_id": "ws_B07B5VSTNR_5796", "instruction": "i want a 2lb box of old fashioned milk and dark chocolate nuts.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "mixed - milk (65%) & dark (35%)", "2 lb" ] }, "asin": "B07B5VSTNR" }, { "task_id": "ws_B07B5VSTNR_5797", "instruction": "i am looking for an old fashioned 1 pound peanut cluster milk chocolate", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "3 lb" ] }, "asin": "B07B5VSTNR" }, { "task_id": "ws_B01IYB6NOS_5798", "instruction": "i am looking for a hygiene tongue cleaner for fresh breath. also choose 6 count pack.", "target_attributes": { "attributes": [ "oral hygiene", "fresh breath" ], "options": [ "6 count (pack of 1)" ] }, "asin": "B01IYB6NOS" }, { "task_id": "ws_B07ND51YPC_5799", "instruction": "i am looking loose leaf green flavor non gmo usda organic herbal tea size:1 pouch (pack of 1)", "target_attributes": { "attributes": [ "usda organic", "non gmo" ], "options": [ "green", "1 pound (pack of 1)", "loose leaf" ] }, "asin": "B07ND51YPC" }, { "task_id": "ws_B07ND51YPC_5800", "instruction": "i want milk thistle tea bags. make sure that it has an usda organic label.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "milk thistle", "tea bags" ] }, "asin": "B07ND51YPC" }, { "task_id": "ws_B09RSXM68P_5801", "instruction": "i'm looking for a light weight fashion designed pure cotton men's briefs. also, choose medium sized b gray colored one.", "target_attributes": { "attributes": [ "light weight", "fashion design" ], "options": [ "b gray", "medium" ] }, "asin": "B09RSXM68P" }, { "task_id": "ws_B07DZW6GQV_5802", "instruction": "i need a pack of long lasting argan oil lotion. pick one that is 16.8 fl oz in size.", "target_attributes": { "attributes": [ "long lasting", "argan oil" ], "options": [ "16.8 fl oz (pack of 1)" ] }, "asin": "B07DZW6GQV" }, { "task_id": "ws_B09L2C7P75_5803", "instruction": "i would like a pendant light fixture.", "target_attributes": { "attributes": [ "pendant light", "light fixture" ], "options": [] }, "asin": "B09L2C7P75" }, { "task_id": "ws_B08T5PZHM9_5804", "instruction": "show me a bright green art wall sculptures for living room made through exquisite workmanship.", "target_attributes": { "attributes": [ "exquisite workmanship", "living room" ], "options": [ "bright green" ] }, "asin": "B08T5PZHM9" }, { "task_id": "ws_B095Z82R7X_5805", "instruction": "i would like a cube of individually wrapped sugarolly candy for a birthday party.", "target_attributes": { "attributes": [ "individually wrapped", "birthday party" ], "options": [ "sugarolly - big", "cube (7)" ] }, "asin": "B095Z82R7X" }, { "task_id": "ws_B08PCF2428_5806", "instruction": "i'm looking for clothing to wear comfortable and everyday wear.", "target_attributes": { "attributes": [ "comfortable fit", "everyday wear" ], "options": [ "black | white" ] }, "asin": "B08PCF2428" }, { "task_id": "ws_B07968GK3T_5807", "instruction": "order for me sour gummies that are dairy free,gluten free and with good quality ingredients.", "target_attributes": { "attributes": [ "gluten free", "quality ingredients" ], "options": [ "sour" ] }, "asin": "B07968GK3T" }, { "task_id": "ws_B08QYPJMQ3_5808", "instruction": "i'm looking for buy a chocolates and candys gits for valentines day a perfect gift.", "target_attributes": { "attributes": [ "valentine day", "perfect gift" ], "options": [ "1000 count (25 pound) bulk" ] }, "asin": "B08QYPJMQ3" }, { "task_id": "ws_B07J9Q794H_5809", "instruction": "crystal rhinestone phone ring and stand hands free in gold colour", "target_attributes": { "attributes": [ "hands free" ], "options": [ "gold | rainbow" ] }, "asin": "B07J9Q794H" }, { "task_id": "ws_B094D7Y7MS_5810", "instruction": "i'm looking for camera for digital photography. the camera was easy to carry at.", "target_attributes": { "attributes": [ "easy carry", "high definition", "digital photography" ], "options": [ "24x12in | 60x30cm" ] }, "asin": "B094D7Y7MS" }, { "task_id": "ws_B08XMHLGKS_5811", "instruction": "i am looking for an easy to use seasoning mix in the green raita flavor.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "green raita" ] }, "asin": "B08XMHLGKS" }, { "task_id": "ws_B07PPH541B_5812", "instruction": "i am searching for easy to use mascara brushes. also, choose the pink one.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B07PPH541B" }, { "task_id": "ws_B08QZM336G_5813", "instruction": "show me some long lasting honeysuckle jasmine colored candles made from soy wax.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [ "honeysuckle jasmine" ] }, "asin": "B08QZM336G" }, { "task_id": "ws_B004U6TMCM_5814", "instruction": "i am looking a eye cream for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B004U6TMCM" }, { "task_id": "ws_B01IPZCPXQ_5815", "instruction": "i'm looking for a permanent hair dye which is paraben free and should be cruelty free certified. also choose a pack of 1 with 3.99 fl oz and pillarbox red colored one.", "target_attributes": { "attributes": [ "paraben free", "cruelty free", "hair dye", "permanent hair" ], "options": [ "pillarbox red", "3.99 fl oz (pack of 1)" ] }, "asin": "B01IPZCPXQ" }, { "task_id": "ws_B09SGFC3ST_5816", "instruction": "i am looking for a hot pink machine washable bikinis sets", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "hot pink" ] }, "asin": "B09SGFC3ST" }, { "task_id": "ws_B09PFNQFJY_5817", "instruction": "i'm looking for long sleeve tops it can makes feel comfortable.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a02-green" ] }, "asin": "B09PFNQFJY" }, { "task_id": "ws_B07DP8SCK4_5818", "instruction": "i am looking for a water resistant minimalist shoe with rubber sole for a man. also choose storm navy color and size no 9.", "target_attributes": { "attributes": [ "water resistant", "rubber sole" ], "options": [ "storm navy", "10 women | 9 men" ] }, "asin": "B07DP8SCK4" }, { "task_id": "ws_B000YDE46Y_5819", "instruction": "i'm looking for a day comfort men's boots with synthetic sole. also, choose 12 size burnished gold colored one.", "target_attributes": { "attributes": [ "day comfort", "synthetic sole" ], "options": [ "burnished gold", "12" ] }, "asin": "B000YDE46Y" }, { "task_id": "ws_B084TJHF2F_5820", "instruction": "find me a super soft round table cloth that is 70\"x70\" in size.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "70\"x70\"(diameter 178cm)" ] }, "asin": "B084TJHF2F" }, { "task_id": "ws_B07R9LPVK9_5821", "instruction": "i am looking for non gmo chopped pecan nuts of 4 pound size.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "4 pound" ] }, "asin": "B07R9LPVK9" }, { "task_id": "ws_B07R9LPVK9_5822", "instruction": "i would like a 8 ounce pack of non gmo pecans.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B07R9LPVK9" }, { "task_id": "ws_B082Q61BS5_5823", "instruction": "i need a pre shampoo treatment for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "pre-shampoo" ] }, "asin": "B082Q61BS5" }, { "task_id": "ws_B07JVBSCWJ_5824", "instruction": "i am searching for a certified refurbished all-in-one printer with high performance.", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B07JVBSCWJ" }, { "task_id": "ws_B09LQ9SZPH_5825", "instruction": "i'm looking for furniture for living room that wood framed furniture is easy to use.", "target_attributes": { "attributes": [ "assembly required", "wood frame", "storage space", "living room" ], "options": [ "red" ] }, "asin": "B09LQ9SZPH" }, { "task_id": "ws_B07SG76JPK_5826", "instruction": "i'm looking for a keratin hair treatment kit which has anti aging property and made of natural ingredients. also, choose 3.4 fl oz one", "target_attributes": { "attributes": [ "anti aging", "natural ingredients", "hair treatment" ], "options": [ "3.4 fl oz kit" ] }, "asin": "B07SG76JPK" }, { "task_id": "ws_B07SG76JPK_5827", "instruction": "i use mostly natural ingredients for my skin in 10.1 fl oz", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "10.1 fl oz kit" ] }, "asin": "B07SG76JPK" }, { "task_id": "ws_B098QFDZDH_5828", "instruction": "i am looking for oil free foundation for dry skin. please choose mocha color.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "mocha" ] }, "asin": "B098QFDZDH" }, { "task_id": "ws_B07V4LPY51_5829", "instruction": "i am interested in purchasing a cruelty free lip enhancer with natural ingredients in the color teal.", "target_attributes": { "attributes": [ "cruelty free", "natural ingredients" ], "options": [ "teal" ] }, "asin": "B07V4LPY51" }, { "task_id": "ws_B07WF7ZYP6_5830", "instruction": "i want some headphone amplifiers with a power adapter.", "target_attributes": { "attributes": [ "high power", "power amplifier" ], "options": [] }, "asin": "B07WF7ZYP6" }, { "task_id": "ws_B09C5RCSN5_5831", "instruction": "i am looking non slip glass screen heavy duty protective case cover -purple", "target_attributes": { "attributes": [ "non slip", "case cover" ], "options": [ "purple" ] }, "asin": "B09C5RCSN5" }, { "task_id": "ws_B00P4GFA3C_5832", "instruction": "i want cacao powder 3 pound pack sugar free and certified organic", "target_attributes": { "attributes": [ "sugar free", "certified organic" ], "options": [ "cacao powder", "3 pound (pack of 1)" ] }, "asin": "B00P4GFA3C" }, { "task_id": "ws_B09GN891PR_5833", "instruction": "i'm looking for a glass case with fashion cute pattern design for iphone 13.", "target_attributes": { "attributes": [ "non slip", "tempered glass" ], "options": [ "colorful starry pineapple", "iphone 13 pro(6.1-inch)" ] }, "asin": "B09GN891PR" }, { "task_id": "ws_B09GN891PR_5834", "instruction": "i'm looking for an easy to install iphone 13 case with a colorful cactus pattern.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "colorful cactus", "iphone 13 pro max(6.7-inch)" ] }, "asin": "B09GN891PR" }, { "task_id": "ws_B097SLKSD3_5835", "instruction": "i am looking for a 3 vanity lights with with clear glass shade.", "target_attributes": { "attributes": [ "clear glass" ], "options": [ "3 lights" ] }, "asin": "B097SLKSD3" }, { "task_id": "ws_B07MWTMFX1_5836", "instruction": "i'm looking for clothing jeans for women's and the it was comfortable fit.", "target_attributes": { "attributes": [ "long lasting", "comfortable fit" ], "options": [ "dark stone" ] }, "asin": "B07MWTMFX1" }, { "task_id": "ws_B09CM422VM_5837", "instruction": "i'm looking for a hair shaving, household neck hair removal brush with rope for men", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09CM422VM" }, { "task_id": "ws_B09B45XJB9_5838", "instruction": "i'm looking for made for cupcakes to birthday party it is easy to make.", "target_attributes": { "attributes": [ "easy use", "cupcake picks", "birthday party" ], "options": [ "rose gold" ] }, "asin": "B09B45XJB9" }, { "task_id": "ws_B09R4318ZY_5839", "instruction": "i'm looking for pants for sports with a fleece lining and a relaxed fit in sky blue", "target_attributes": { "attributes": [ "fleece lined", "relaxed fit" ], "options": [ "sky blue" ] }, "asin": "B09R4318ZY" }, { "task_id": "ws_B095VMXFTV_5840", "instruction": "i would like a pair of size 46 black shoes made from quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "black", "46" ] }, "asin": "B095VMXFTV" }, { "task_id": "ws_B00XMZCOAY_5841", "instruction": "i'm looking for rice shaped pasta it contains low fiber fat it good for health.", "target_attributes": { "attributes": [ "low fat", "dietary fiber" ], "options": [ "26.5 ounce (pack of 4)" ] }, "asin": "B00XMZCOAY" }, { "task_id": "ws_B08LQ6SY18_5842", "instruction": "i am looking for a storage benches for living room of espresso color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "espresso" ] }, "asin": "B08LQ6SY18" }, { "task_id": "ws_B084NFNNBH_5843", "instruction": "i'm looking for trader joe for buying groceries products.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B084NFNNBH" }, { "task_id": "ws_B07G51W951_5844", "instruction": "i'm looking for oral care the prevention of dental care.", "target_attributes": { "attributes": [ "easy use", "fresh breath" ], "options": [] }, "asin": "B07G51W951" }, { "task_id": "ws_B093VQSY12_5845", "instruction": "i am looking for a high definition 24 inch tv", "target_attributes": { "attributes": [ "high definition" ], "options": [ "24in" ] }, "asin": "B093VQSY12" }, { "task_id": "ws_B094DKJ6ZS_5846", "instruction": "i am looking for a blue rubber outsole sneaker for men.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "blue" ] }, "asin": "B094DKJ6ZS" }, { "task_id": "ws_B079K9XTSV_5847", "instruction": "i am looking for a jet black #1 hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "jet black #1" ] }, "asin": "B079K9XTSV" }, { "task_id": "ws_B079K9XTSV_5848", "instruction": "i would like a 18 inch natural black hair extension.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "natural black #1b", "18 inch (120 gram)" ] }, "asin": "B079K9XTSV" }, { "task_id": "ws_B09GPJVQNT_5849", "instruction": "i need a relaxed fit daily wear gym pants for daily wear. pick an xx-large one.", "target_attributes": { "attributes": [ "relaxed fit", "daily wear" ], "options": [ "xx-large" ] }, "asin": "B09GPJVQNT" }, { "task_id": "ws_B08SQ88C1G_5850", "instruction": "i'm looking for a wooden upholstered daybed twin with trundle and backrest.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "twin with drawers" ] }, "asin": "B08SQ88C1G" }, { "task_id": "ws_B09PDP2SKW_5851", "instruction": "i would like some 22 inch hair extensions made of natural hair.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "22 inch" ] }, "asin": "B09PDP2SKW" }, { "task_id": "ws_B07CS4CBGM_5852", "instruction": "i'm looking for a italian ice fat free", "target_attributes": { "attributes": [ "fat free" ], "options": [] }, "asin": "B07CS4CBGM" }, { "task_id": "ws_B07CS4CBGM_5853", "instruction": "i want to buy some fat free freezer bars with real fruit.", "target_attributes": { "attributes": [ "fat free", "real fruit" ], "options": [] }, "asin": "B07CS4CBGM" }, { "task_id": "ws_B09RN5LG2B_5854", "instruction": "i'm looking for a open toe slip resistant sneakers with arch support and ankle strap. also, choose 7.5 size black one.", "target_attributes": { "attributes": [ "open toe", "slip resistant", "arch support", "ankle strap" ], "options": [ "black", "7.5" ] }, "asin": "B09RN5LG2B" }, { "task_id": "ws_B09921NBD4_5855", "instruction": "i am looking for a black faux leather bed frames.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "black" ] }, "asin": "B09921NBD4" }, { "task_id": "ws_B0924LVZ21_5856", "instruction": "i am looking for a 1 pack of cooling pads with high performance", "target_attributes": { "attributes": [ "high performance" ], "options": [ "1 pack" ] }, "asin": "B0924LVZ21" }, { "task_id": "ws_B06Y254L9J_5857", "instruction": "i would like a aqua blue applewatch charger.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "aqua blue" ] }, "asin": "B06Y254L9J" }, { "task_id": "ws_B09P1BN2CD_5858", "instruction": "i'm looking for a high-quality toothbrush in straw color(for 2-6 years) for sensitive teeth.", "target_attributes": { "attributes": [ "high quality", "sensitive teeth" ], "options": [ "straw color(for 2-6 years)" ] }, "asin": "B09P1BN2CD" }, { "task_id": "ws_B09F6HYVT6_5859", "instruction": "i am looking for a water proof outdoor ultra hd projector, also the color should be sport color.", "target_attributes": { "attributes": [ "water resistant", "ultra hd" ], "options": [ "sport" ] }, "asin": "B09F6HYVT6" }, { "task_id": "ws_B09F6HYVT6_5860", "instruction": "i need a sporty water resistant portable projector with usb port.", "target_attributes": { "attributes": [ "water resistant", "usb port" ], "options": [ "sport" ] }, "asin": "B09F6HYVT6" }, { "task_id": "ws_B08RZBK8XD_5861", "instruction": "i am looking for a white storage benches of grey wash color", "target_attributes": { "attributes": [ "white item" ], "options": [ "grey wash" ] }, "asin": "B08RZBK8XD" }, { "task_id": "ws_B092TNX1HL_5862", "instruction": "i am looking for a stainless steel shears.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B092TNX1HL" }, { "task_id": "ws_B09H67CSK6_5863", "instruction": "i would like a eye shadow makeup palette.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B09H67CSK6" }, { "task_id": "ws_B09ND9FLJ2_5864", "instruction": "i am looking for a sleep sets of medium size for daily wear.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "medium" ] }, "asin": "B09ND9FLJ2" }, { "task_id": "ws_B009R8D5QC_5865", "instruction": "i need a bag of alaska caught salmon jerkey.", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "garlic-pepper" ] }, "asin": "B009R8D5QC" }, { "task_id": "ws_B08DKWFB9K_5866", "instruction": "i am looking for computer desk drawing table that is easy to install", "target_attributes": { "attributes": [ "heavy duty", "easy install" ], "options": [] }, "asin": "B08DKWFB9K" }, { "task_id": "ws_B08314WBRN_5867", "instruction": "i am looking for a double sided stainless steel foot files for cleaning of dry skin.", "target_attributes": { "attributes": [ "double sided", "stainless steel", "dead skin" ], "options": [] }, "asin": "B08314WBRN" }, { "task_id": "ws_B07BVVPMVX_5868", "instruction": "i am looking for a 9.3 color for permanent hair color", "target_attributes": { "attributes": [ "permanent hair" ], "options": [] }, "asin": "B07BVVPMVX" }, { "task_id": "ws_B093YRJDBF_5869", "instruction": "i'm looking for laundry bags for it can use for move to another place.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YRJDBF" }, { "task_id": "ws_B00E86YKCG_5870", "instruction": "add to my list 6 packs of raspberry snackbar and should be nut free and has low sodium.", "target_attributes": { "attributes": [ "low sodium", "nut free" ], "options": [ "raspberry", "6 count (pack of 6)" ] }, "asin": "B00E86YKCG" }, { "task_id": "ws_B082SZDTBD_5871", "instruction": "i'm looking for a wide leg jeans with regular fit and tummy control. also, choose 3x large zz-zm black colored one.", "target_attributes": { "attributes": [ "wide leg", "tummy control", "regular fit" ], "options": [ "zz-zmblack", "3x-large" ] }, "asin": "B082SZDTBD" }, { "task_id": "ws_B082SZDTBD_5872", "instruction": "i am looking for wide leg black color bell bottom flare jegging sweatpants, but size in small", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "black" ] }, "asin": "B082SZDTBD" }, { "task_id": "ws_B08G5CQZ4B_5873", "instruction": "i'm looking for a rickaroons coconut energy bars with chocolate.", "target_attributes": { "attributes": [ "gluten free", "certified organic" ], "options": [ "mocha" ] }, "asin": "B08G5CQZ4B" }, { "task_id": "ws_B09D7RDLZM_5874", "instruction": "i need a ninety inch table runner. look for one that's eco-friendly and available in color \"poppie slop.\"", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "poppieslop5025", "(90''x13''+13''x19''*6)229x33cm+33x48cm*6" ] }, "asin": "B09D7RDLZM" }, { "task_id": "ws_B07XDP1RFL_5875", "instruction": "i want a wooden dining table that is multi color with a white finish. it will go in my dining room.", "target_attributes": { "attributes": [ "white finish", "dining room" ], "options": [ "multi color" ] }, "asin": "B07XDP1RFL" }, { "task_id": "ws_B09BXYG4Z6_5876", "instruction": "i would like a mint scent dental chewy that is bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "mint scent" ] }, "asin": "B09BXYG4Z6" }, { "task_id": "ws_B09G3FT4CY_5877", "instruction": "winter warm long sleeves jackets for women which is hand washable and in yellow colour", "target_attributes": { "attributes": [ "winter warm", "machine washable", "hand wash", "long sleeve" ], "options": [ "yellow" ] }, "asin": "B09G3FT4CY" }, { "task_id": "ws_B09CD32CBP_5878", "instruction": "i am looking for a iphone 11 pro 5.8 inches basic cases which is easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "iphone 11 pro 5.8 inches" ] }, "asin": "B09CD32CBP" }, { "task_id": "ws_B07KDXLQ3B_5879", "instruction": "i need a high power charger that charges fast and is white.", "target_attributes": { "attributes": [ "high power", "fast charging" ], "options": [ "white" ] }, "asin": "B07KDXLQ3B" }, { "task_id": "ws_B08L7DRLXN_5880", "instruction": "i am looking for manual toothbrush for sensitive teeth. please choose blue color.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "pink, blue, green, beige" ] }, "asin": "B08L7DRLXN" }, { "task_id": "ws_B091Q1Y26G_5881", "instruction": "i want to buy some vanity lights with brushed nickel trim and black color. it needs to be a two light style.", "target_attributes": { "attributes": [ "brushed nickel", "vanity light" ], "options": [ "black", "2 lights" ] }, "asin": "B091Q1Y26G" }, { "task_id": "ws_B07JHL2T8X_5882", "instruction": "i'm looking for a gray blue, apple compatible, case for apple airpods that also charges.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "gray blue" ] }, "asin": "B07JHL2T8X" }, { "task_id": "ws_B093F94SZK_5883", "instruction": "i want a heavy duty fine wood bookcase for living room color white", "target_attributes": { "attributes": [ "heavy duty", "storage unit", "living room" ], "options": [ "white" ] }, "asin": "B093F94SZK" }, { "task_id": "ws_B08R3HR7PN_5884", "instruction": "i'm looking for rubber sole for shoe for men's the color was blue.", "target_attributes": { "attributes": [ "steel toe", "rubber sole" ], "options": [ "blue" ] }, "asin": "B08R3HR7PN" }, { "task_id": "ws_B0833XSMM4_5885", "instruction": "i am looking for a multi purpose tripod for camera made up of aluminum alloy with quick release. also choose but2664 color and but2287 size.", "target_attributes": { "attributes": [ "quick release", "aluminum alloy" ], "options": [ "but2664", "but2287" ] }, "asin": "B0833XSMM4" }, { "task_id": "ws_B09Q65XZ7J_5886", "instruction": "i'm looking for black colored high quality hair removal cream it easy to use", "target_attributes": { "attributes": [ "high quality", "hair removal" ], "options": [ "black" ] }, "asin": "B09Q65XZ7J" }, { "task_id": "ws_B09JLQVW41_5887", "instruction": "i'm looking for a clear glass wall lamps with glass shade for living room. also, choose the lamp that has 3 lights and bronze colored one.", "target_attributes": { "attributes": [ "clear glass", "glass shade", "living room" ], "options": [ "bronze", "3-lights" ] }, "asin": "B09JLQVW41" }, { "task_id": "ws_B09CZ67T77_5888", "instruction": "i need apple compatible smartwatch band made of carbon fiber in elephant grey color and black buckle.", "target_attributes": { "attributes": [ "compatible apple", "carbon fiber" ], "options": [ "elephant grey-black buckle" ] }, "asin": "B09CZ67T77" }, { "task_id": "ws_B09JG66DXC_5889", "instruction": "i'm searching for super soft happy fall gnome orange plaid blanket", "target_attributes": { "attributes": [ "super soft" ], "options": [ "happy fall gnome orange plaid" ] }, "asin": "B09JG66DXC" }, { "task_id": "ws_B075JN83TX_5890", "instruction": "i need black flats that are slip resistant. they should also have leather soles.", "target_attributes": { "attributes": [ "slip resistant", "leather sole" ], "options": [ "black" ] }, "asin": "B075JN83TX" }, { "task_id": "ws_B08S47NGNJ_5891", "instruction": "i am looking for rubber sole men sneaker.please choose grey and navy color.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "grey | navy" ] }, "asin": "B08S47NGNJ" }, { "task_id": "ws_B08TQQ982S_5892", "instruction": "i am looking for king size pillowcases in leopard print color", "target_attributes": { "attributes": [ "king size" ], "options": [ "leopard print" ] }, "asin": "B08TQQ982S" }, { "task_id": "ws_B09JNS2BNK_5893", "instruction": "i would like a beige bookcase with a lot of storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "beige" ] }, "asin": "B09JNS2BNK" }, { "task_id": "ws_B09P1FB6LF_5894", "instruction": "i'm looking for a compact wireless bluetooth speaker.", "target_attributes": { "attributes": [ "water resistant", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B09P1FB6LF" }, { "task_id": "ws_B095XSTRVZ_5895", "instruction": "i'm looking for a set of 3 nesting end tables.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gray marble | gold" ] }, "asin": "B095XSTRVZ" }, { "task_id": "ws_B09GB2LF8R_5896", "instruction": "i am looking for a surveillance camera cables for output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B09GB2LF8R" }, { "task_id": "ws_B07KLZVCS3_5897", "instruction": "i am looking for a 7 wide synthetic sole of platforms & wedges", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "vintage slate lthr" ] }, "asin": "B07KLZVCS3" }, { "task_id": "ws_B07KLZVCS3_5898", "instruction": "i'd like to buy a pair of sandals with a synthetic sole and arch support. look for a pair that's size four, in slate.", "target_attributes": { "attributes": [ "synthetic sole", "arch support" ], "options": [ "vintage slate lthr", "4" ] }, "asin": "B07KLZVCS3" }, { "task_id": "ws_B09J7VZL38_5899", "instruction": "i would like a 64 gig dd4 ram mini desktop computer that has a dual band i7 core processor.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "core i7 1165g7", "64g ddr4 ram 1tb ssd" ] }, "asin": "B09J7VZL38" }, { "task_id": "ws_B09J7VZL38_5900", "instruction": "im looking for a mini dual band desktop pc that uses wireless bluetooth connectivity and has windows 11.", "target_attributes": { "attributes": [ "dual band", "wireless bluetooth" ], "options": [] }, "asin": "B09J7VZL38" }, { "task_id": "ws_B09N349WJ1_5901", "instruction": "i'm looking for grow a hair that was gives a hair extensions.", "target_attributes": { "attributes": [ "natural hair", "hair loss" ], "options": [ "#1b off black" ] }, "asin": "B09N349WJ1" }, { "task_id": "ws_B07D1CBVXY_5902", "instruction": "i am looking for a heavy duty foot soaking tub for dead skin removal. also choose blue one.", "target_attributes": { "attributes": [ "heavy duty", "dead skin" ], "options": [ "blue" ] }, "asin": "B07D1CBVXY" }, { "task_id": "ws_B09HXLGWBY_5903", "instruction": "i am looking for lead free candles for home, made up of soy wax. also choose lavender & geranium scented", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [ "lavender & geranium" ] }, "asin": "B09HXLGWBY" }, { "task_id": "ws_B084QXKRS5_5904", "instruction": "i'm looking for a hair conditioner for dry hair that stimulates hair growth. also, choose a pack of 1 contains 32 fl oz.", "target_attributes": { "attributes": [ "dry hair", "hair growth" ], "options": [ "32 fl oz (pack of 1)" ] }, "asin": "B084QXKRS5" }, { "task_id": "ws_B09HGCRV4F_5905", "instruction": "i am looking for a high performace tv antenna having usb port.", "target_attributes": { "attributes": [ "high performance", "usb port" ], "options": [] }, "asin": "B09HGCRV4F" }, { "task_id": "ws_B09BB4MBC2_5906", "instruction": "i want a 16 colour eyeshadow palette higly pigmented high quality long lasting eyeshadow pallet matte", "target_attributes": { "attributes": [ "long lasting", "highly pigmented", "high quality" ], "options": [] }, "asin": "B09BB4MBC2" }, { "task_id": "ws_B08RS11SB6_5907", "instruction": "i am looking for a 41mm | 42mm smartwatch bands which is easy install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "41mm | 42mm" ] }, "asin": "B08RS11SB6" }, { "task_id": "ws_B01MS5NP2G_5908", "instruction": "show me a digital camera, by panasonic is good for me. i need a high performance. i want memory card about 64gb , try this model: lumix 4k dmc-zs100", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B01MS5NP2G" }, { "task_id": "ws_B081RXQ8XG_5909", "instruction": "i'm looking for star wars for clothing for navy white colored.", "target_attributes": { "attributes": [ "officially licensed", "machine wash", "needle sleeve", "classic fit", "star wars" ], "options": [ "navy | white" ] }, "asin": "B081RXQ8XG" }, { "task_id": "ws_B08TR5SG7B_5910", "instruction": "i would like a 5xl a color blouse with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a", "5x-large" ] }, "asin": "B08TR5SG7B" }, { "task_id": "ws_B07WSFDSQF_5911", "instruction": "i am looking for a solid black duvet cover set that is queen size.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "solid-black", "queen(90\"\u00d790\")" ] }, "asin": "B07WSFDSQF" }, { "task_id": "ws_B08SQR474L_5912", "instruction": "i am looking for grain and gluten free chips.", "target_attributes": { "attributes": [ "grain free", "gluten free" ], "options": [] }, "asin": "B08SQR474L" }, { "task_id": "ws_B078SZCPK8_5913", "instruction": "let me have grocery & gourmet food dietary fibre", "target_attributes": { "attributes": [ "dietary fiber" ], "options": [] }, "asin": "B078SZCPK8" }, { "task_id": "ws_B09LRSJVCF_5914", "instruction": "i am looking for a high quality dark gray reclining barber chair for a hair salon.", "target_attributes": { "attributes": [ "high quality", "hair salon" ], "options": [ "dark gray" ] }, "asin": "B09LRSJVCF" }, { "task_id": "ws_B093Q5DCH6_5915", "instruction": "i am looking for a xx-large casual print shirt for women for gifting purpose. also choose wine color.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "wine", "xx-large" ] }, "asin": "B093Q5DCH6" }, { "task_id": "ws_B0925PXXNL_5916", "instruction": "i am looking for sulfate free in redwood", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "redwood" ] }, "asin": "B0925PXXNL" }, { "task_id": "ws_B08D36NGX6_5917", "instruction": "i need a gold plated, high definition digital optical cable that's five feet long.", "target_attributes": { "attributes": [ "gold plated", "high definition" ], "options": [ "5ft | 1.5m" ] }, "asin": "B08D36NGX6" }, { "task_id": "ws_B003EWPKGA_5918", "instruction": "i'm looking for a 60in (150cm) pro studio softbox with heavy duty construction. also ensure its style is broncolor impact.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "60in (150cm)", "broncolor impact" ] }, "asin": "B003EWPKGA" }, { "task_id": "ws_B003EWPKGA_5919", "instruction": "i'm looking for a heavy duty soft box, specifically with a quantum qflash lighting setting.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "quantum qflash" ] }, "asin": "B003EWPKGA" }, { "task_id": "ws_B08K2ML6WX_5920", "instruction": "i am looking for unicorn collection nail polish with glossy and matte top", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "unicorn" ] }, "asin": "B08K2ML6WX" }, { "task_id": "ws_B07JGZWVKX_5921", "instruction": "show me a king sized machine washable super soft pillow in yellow coral pattern and 30\" x 20\" size.", "target_attributes": { "attributes": [ "super soft", "machine washable", "king size" ], "options": [ "yellow coral", "30\" x 20\"" ] }, "asin": "B07JGZWVKX" }, { "task_id": "ws_B09BGGLY51_5922", "instruction": "i want hydration undereye & smile line jelly patches fragrance free cruelty free cream for eyes", "target_attributes": { "attributes": [ "fragrance free", "cruelty free" ], "options": [] }, "asin": "B09BGGLY51" }, { "task_id": "ws_B003VTGBC8_5923", "instruction": "i am looking for a box of 50 singles non-dairy coffee creamers that will add sugar-free hazelnut flavor to coffee drinks.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "sugar free hazelnut", "box of 50 singles" ] }, "asin": "B003VTGBC8" }, { "task_id": "ws_B088WN9NMS_5924", "instruction": "i am looking for a high performance home surveillance security camera that is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B088WN9NMS" }, { "task_id": "ws_B086ZFMFCF_5925", "instruction": "i am looking for a purple double-sided, eco friendly, and long handle bath body brush scrubber.", "target_attributes": { "attributes": [ "double sided", "eco friendly", "long handle" ], "options": [ "purple" ] }, "asin": "B086ZFMFCF" }, { "task_id": "ws_B07GDL839C_5926", "instruction": "i want an oil free foundation that is high in quality. find me the 410 caoouccino color.", "target_attributes": { "attributes": [ "oil free", "high quality" ], "options": [ "410 cappuccino" ] }, "asin": "B07GDL839C" }, { "task_id": "ws_B09KRBSG36_5927", "instruction": "i would like to buy a cupcake topper which has a laser gold pattern and is suitable for birthday parties.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "laser gold pattern" ] }, "asin": "B09KRBSG36" }, { "task_id": "ws_B09KRBSG36_5928", "instruction": "i'm looking for a 10 pcs jinxiao snowflake glitter cupcake topper.", "target_attributes": { "attributes": [ "birthday party", "party supplies" ], "options": [ "glitter gold" ] }, "asin": "B09KRBSG36" }, { "task_id": "ws_B09KRBSG36_5929", "instruction": "i want pearl white cake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pearl white" ] }, "asin": "B09KRBSG36" }, { "task_id": "ws_B09SF2PKSF_5930", "instruction": "i'm looking for open and close toe sandals for women's. need to buy it.", "target_attributes": { "attributes": [ "open toe", "high heel", "closed toe" ], "options": [ "a4 - black" ] }, "asin": "B09SF2PKSF" }, { "task_id": "ws_B09M36VJZ3_5931", "instruction": "i want an easy to assemble shoe rack that goes in my living room. pick a white one.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "white" ] }, "asin": "B09M36VJZ3" }, { "task_id": "ws_B093TPRQS3_5932", "instruction": "i am looking for a 5 gram non alcoholic for cocktail mixers", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "5 gram" ] }, "asin": "B093TPRQS3" }, { "task_id": "ws_B093TPRQS3_5933", "instruction": "i would like a non alcoholic cocktail mixer that is one ounce.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "1 ounce (28 gram)" ] }, "asin": "B093TPRQS3" }, { "task_id": "ws_B09KT8L94B_5934", "instruction": "i'm looking for beauty care accessories it is easy to clean and it was helpful for deadly skin.", "target_attributes": { "attributes": [ "double sided", "easy clean", "dead skin" ], "options": [ "yellow" ] }, "asin": "B09KT8L94B" }, { "task_id": "ws_B007HRLNJG_5935", "instruction": "i am looking for dried fruits in artificial colors with size 8 ounce", "target_attributes": { "attributes": [ "artificial colors" ], "options": [ "8 ounce (pack of 3)" ] }, "asin": "B007HRLNJG" }, { "task_id": "ws_B007HRLNJG_5936", "instruction": "i am looking for single pack of 8 ounce size containing artificial colors cherries.", "target_attributes": { "attributes": [ "artificial colors" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B007HRLNJG" }, { "task_id": "ws_B074SQBWLY_5937", "instruction": "i am looking far a 3 pack bloody mary non gmo margarita", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "3 pack bloody mary" ] }, "asin": "B074SQBWLY" }, { "task_id": "ws_B002HEXNU6_5938", "instruction": "i'm looking for a nuvo vanity", "target_attributes": { "attributes": [ "vanity light", "brushed nickel" ], "options": [ "mahogany bronze | frosted glass", "3-light d73" ] }, "asin": "B002HEXNU6" }, { "task_id": "ws_B002HEXNU6_5939", "instruction": "to improve my home lighting i'm searching for wall lights and 4lt brushed nickel vanity strip lights .", "target_attributes": { "attributes": [ "vanity light", "brushed nickel" ], "options": [ "4lt vanity strip" ] }, "asin": "B002HEXNU6" }, { "task_id": "ws_B002HEXNU6_5940", "instruction": "i would like a mahogany bronze pendant with frosted glass for my vanity light.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "mahogany bronze | champagne glass", "pendant with frosted glass," ] }, "asin": "B002HEXNU6" }, { "task_id": "ws_B002HEXNU6_5941", "instruction": "i need a vanity light that is mahogany bronze", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "mahogany bronze | frosted glass" ] }, "asin": "B002HEXNU6" }, { "task_id": "ws_B09R1PMDCC_5942", "instruction": "i'm looking for long sleeve and slim fit for dry clean for women's clothing.", "target_attributes": { "attributes": [ "slim fit", "long sleeve", "dry clean" ], "options": [ "001-white" ] }, "asin": "B09R1PMDCC" }, { "task_id": "ws_B09MLCQCWP_5943", "instruction": "i want a non slip pair of sport shoes that has rubber soles. i am a woman and my size is 15.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "15 women | 12 men" ] }, "asin": "B09MLCQCWP" }, { "task_id": "ws_B09MH8LFGC_5944", "instruction": "i want a belt-clip heavy duty holster case for my galaxy s22 plus in the color dark blue | pink+belt", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B09MH8LFGC" }, { "task_id": "ws_B07CT5Q656_5945", "instruction": "i want a clear glass mystic sand colored wall sconce. it will go in my living room.", "target_attributes": { "attributes": [ "clear glass", "living room" ], "options": [ "mystic sand" ] }, "asin": "B07CT5Q656" }, { "task_id": "ws_B09K7YCMYK_5946", "instruction": "i'm looking for a clip in hair extensions for hair styling. also choose f one.", "target_attributes": { "attributes": [ "hair extensions", "hair styling" ], "options": [ "f" ] }, "asin": "B09K7YCMYK" }, { "task_id": "ws_B098DL4XG9_5947", "instruction": "i am looking for a black wall lamps & sconces for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B098DL4XG9" }, { "task_id": "ws_B0823JRTJM_5948", "instruction": "i am looking for a candy & chocolate gifts box", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B0823JRTJM" }, { "task_id": "ws_B08ZS6M1T7_5949", "instruction": "i'm looking for a hollywood style vanity lights which is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B08ZS6M1T7" }, { "task_id": "ws_B07TVRDP96_5950", "instruction": "i am looking for am/fm radio with digital frequency display of hannlomax hx-506r portable am/fm radio which could play my favourite music from the smartphone or bluetooth enabled device on boombox by bluetooth streaming.suitable for indoor and outdoor.", "target_attributes": { "attributes": [ "batteries included", "usb port", "stereo sound" ], "options": [] }, "asin": "B07TVRDP96" }, { "task_id": "ws_B00BECJIYW_5951", "instruction": "i am looking for rubber soled men loafer. please choose size of 13.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "13-14" ] }, "asin": "B00BECJIYW" }, { "task_id": "ws_B09BQWG3DW_5952", "instruction": "i am looking for cupcake picks for baby shower birthday.", "target_attributes": { "attributes": [ "cupcake picks", "baby shower" ], "options": [] }, "asin": "B09BQWG3DW" }, { "task_id": "ws_B09KNHG351_5953", "instruction": "i need a large button closure shirt that is charcoal grey in color. pick the regular fit one.", "target_attributes": { "attributes": [ "regular fit", "button closure" ], "options": [ "charcoalgrey", "large" ] }, "asin": "B09KNHG351" }, { "task_id": "ws_B09QQ9WPMM_5954", "instruction": "i need a mens hairline hairpiece that can be used as replacement for hair lose. and please choose the medium brown with 130 desnsity", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "130 density #4 medium brown", "mens hairline" ] }, "asin": "B09QQ9WPMM" }, { "task_id": "ws_B09PKY9Q6R_5955", "instruction": "i'm looking for a natural hair cap to hide my hair loss", "target_attributes": { "attributes": [ "natural hair", "hair loss" ], "options": [] }, "asin": "B09PKY9Q6R" }, { "task_id": "ws_B08LP4T5GN_5956", "instruction": "i am shopping for a non alcoholic slush mix that is non alcoholic. i like the cherry flavor.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "cherry" ] }, "asin": "B08LP4T5GN" }, { "task_id": "ws_B09G2GNCPF_5957", "instruction": "i am looking for a 3x-large long sleeved sweatshirt that is hooded for everyday wear.", "target_attributes": { "attributes": [ "long sleeve", "everyday wear" ], "options": [ "3x-large" ] }, "asin": "B09G2GNCPF" }, { "task_id": "ws_B07F8PVCBQ_5958", "instruction": "i would like a extra large pair of peach butt purple shorts with a high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "b-peach butt purple", "x-large" ] }, "asin": "B07F8PVCBQ" }, { "task_id": "ws_B07F8PVCBQ_5959", "instruction": "i would like some peach high waisted shorts", "target_attributes": { "attributes": [ "high waist" ], "options": [ "b-peach butt blue" ] }, "asin": "B07F8PVCBQ" }, { "task_id": "ws_B083ZG5KTG_5960", "instruction": "i would like a pair of women's 6.5 black powder water shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "47 black powder", "6.5 women | 5 men" ] }, "asin": "B083ZG5KTG" }, { "task_id": "ws_B07C9BT98C_5961", "instruction": "i'm looking for a ready to use, fully assembled mattresses with box spring. also, choose beige colored california kig sized bed with 4\" split foundation one.", "target_attributes": { "attributes": [ "ready use", "fully assembled", "box spring" ], "options": [ "beige", "california king", "4\" split foundation" ] }, "asin": "B07C9BT98C" }, { "task_id": "ws_B07HH5XPZ9_5962", "instruction": "i would like some 18 inch 1b hair extensions made from synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "1b", "18 inch (pack of 6)" ] }, "asin": "B07HH5XPZ9" }, { "task_id": "ws_B09QL66D1G_5963", "instruction": "i am looking for long sleeve henley shirt. please choose orange color.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "orange" ] }, "asin": "B09QL66D1G" }, { "task_id": "ws_B082VQPQFT_5964", "instruction": "i am looking a heavy duty hdmi vedio cable size: 6-feet", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "6-foot" ] }, "asin": "B082VQPQFT" }, { "task_id": "ws_B08DYGBLBF_5965", "instruction": "i am looking for dermatologist tested and paraben free body cream with green tea extracts which is suitable for dry and sensitive skin.", "target_attributes": { "attributes": [ "paraben free", "dermatologist tested", "green tea", "dry skin", "sensitive skin" ], "options": [] }, "asin": "B08DYGBLBF" }, { "task_id": "ws_B09NVWFD91_5966", "instruction": "please re order a happy easter flannel fleece throw blanket for my coach.it should be super soft and easy to clean.", "target_attributes": { "attributes": [ "super soft", "easy clean", "fleece throw" ], "options": [ "happy eastersgd0761" ] }, "asin": "B09NVWFD91" }, { "task_id": "ws_B08Z312Q1L_5967", "instruction": "i am looking for non slip shoes in 10 size", "target_attributes": { "attributes": [ "non slip" ], "options": [ "10" ] }, "asin": "B08Z312Q1L" }, { "task_id": "ws_B08N5NCY6X_5968", "instruction": "i'm looking for regular outfit it can make feel comfortab;e.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "halo silver | carbon | grey three", "6.5" ] }, "asin": "B08N5NCY6X" }, { "task_id": "ws_B0143NQVP2_5969", "instruction": "are there any gluten free protein bars with very high protein content available in chocolate raspberry flavour?", "target_attributes": { "attributes": [ "gluten free", "high protein" ], "options": [ "chocolate raspberry" ] }, "asin": "B0143NQVP2" }, { "task_id": "ws_B0851CHGVF_5970", "instruction": "i would like a stained glass wall lamp with a bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "stained glass" ] }, "asin": "B0851CHGVF" }, { "task_id": "ws_B09LRS6MPF_5971", "instruction": "i am looking for a loose fit vest that is red and a 4-xlarge", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "03#red", "4x-large" ] }, "asin": "B09LRS6MPF" }, { "task_id": "ws_B0954WPWWY_5972", "instruction": "i want to buy an air purifier candle that's soy wax. it should be falling leaves colored and in a 3 pack.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "falling leaves", "3 pack" ] }, "asin": "B0954WPWWY" }, { "task_id": "ws_B08F5L5XLH_5973", "instruction": "i am looking for lock screen ad supported tablet in 1080p hd", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "lockscreen ad-supported" ] }, "asin": "B08F5L5XLH" }, { "task_id": "ws_B082G4QXDW_5974", "instruction": "i want something that will let me use my cell phone hands free and has the kansas city chiefs' logo on it. it should allow for wireless charging.", "target_attributes": { "attributes": [ "hands free", "wireless charging" ], "options": [ "kansas city chiefs logo" ] }, "asin": "B082G4QXDW" }, { "task_id": "ws_B07Z1KJ1NS_5975", "instruction": "i am looking for small sized women t-shirt. it should be machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "women", "x-small" ] }, "asin": "B07Z1KJ1NS" }, { "task_id": "ws_B08BR58B2V_5976", "instruction": "i would like a purple storage case for my nail polish.", "target_attributes": { "attributes": [ "storage case", "nail polish" ], "options": [ "purple" ] }, "asin": "B08BR58B2V" }, { "task_id": "ws_B01M71YUW3_5977", "instruction": "i'm looking for a bronze finish pendant light for high ceiling in dining room.", "target_attributes": { "attributes": [ "bronze finish", "pendant light", "dining room" ], "options": [] }, "asin": "B01M71YUW3" }, { "task_id": "ws_B09PYWJJH4_5978", "instruction": "i'm looking for stereo sound it was outside of noise pollution.", "target_attributes": { "attributes": [ "wireless charging", "stereo sound" ], "options": [] }, "asin": "B09PYWJJH4" }, { "task_id": "ws_B09F3QFR2M_5979", "instruction": "i am looking for a white02 high quality hair cutting kits", "target_attributes": { "attributes": [ "high quality" ], "options": [ "white01" ] }, "asin": "B09F3QFR2M" }, { "task_id": "ws_B09PYKMRCQ_5980", "instruction": "i am looking for long lasting 11oz ceramic tea cup", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B09PYKMRCQ" }, { "task_id": "ws_B08FJ45JPS_5981", "instruction": "i would like a cat sparkly cosmetic bag that is high quality and water resistant.", "target_attributes": { "attributes": [ "water resistant", "high quality" ], "options": [ "cat sparkly" ] }, "asin": "B08FJ45JPS" }, { "task_id": "ws_B08R6FZK5V_5982", "instruction": "seeking a men's tech pique botanical polo that is short-sleeved, moisture wickering in a size medium showing navy blazer-ocean depths color made by puma.", "target_attributes": { "attributes": [ "moisture wicking", "short sleeve" ], "options": [ "navy blazer-ocean depths", "medium" ] }, "asin": "B08R6FZK5V" }, { "task_id": "ws_B0882RZ4JC_5983", "instruction": "i'm looking for a ready-to-eat mild flavor seasoned pork meat with quality ingredients, choose 8.8 ounce (pack of 3)", "target_attributes": { "attributes": [ "ready eat", "quality ingredients" ], "options": [ "8.8 ounce (pack of 3)" ] }, "asin": "B0882RZ4JC" }, { "task_id": "ws_B0849Q9GPL_5984", "instruction": "i'm looking for a oat milk creamer by califia farms .", "target_attributes": { "attributes": [ "plant based", "non gmo", "non dairy", "low sugar", "gluten free" ], "options": [] }, "asin": "B0849Q9GPL" }, { "task_id": "ws_B09FYCSJ87_5985", "instruction": "i am looking for a hair mask and a hair conditioner that promotes hair growth and helps repair damaged hair.", "target_attributes": { "attributes": [ "damaged hair", "hair growth" ], "options": [] }, "asin": "B09FYCSJ87" }, { "task_id": "ws_B0727Z2B2P_5986", "instruction": "i want an xx-large gonxaga bulldogs sweatshirt. it should be officially licensed.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "xx-large", "gonzaga bulldogs" ] }, "asin": "B0727Z2B2P" }, { "task_id": "ws_B0727Z2B2P_5987", "instruction": "find the officially licensed top of the world fit light heather arch men's crew neck sweater. my son wants it with the team name: wisconsin badgers.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "wisconsin badgers" ] }, "asin": "B0727Z2B2P" }, { "task_id": "ws_B0727Z2B2P_5988", "instruction": "i want a medium machine washable top of the world men's fit sweatshirt.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "medium" ] }, "asin": "B0727Z2B2P" }, { "task_id": "ws_B09J2RZ26Q_5989", "instruction": "i looking a super soft fleece throw for small pets size;40*30 inch", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "40\"x30\" extra small for pet" ] }, "asin": "B09J2RZ26Q" }, { "task_id": "ws_B08RYT36YW_5990", "instruction": "i want to find a 42 millimeter long baby pink loop strap compatible with my apple watch band.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "baby pink", "42mm | 44mm | 45mm" ] }, "asin": "B08RYT36YW" }, { "task_id": "ws_B0184JRW1I_5991", "instruction": "i am shopping for a height adjustable blue desk with drawers.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "blue desk only", "desk" ] }, "asin": "B0184JRW1I" }, { "task_id": "ws_B00LLGSY82_5992", "instruction": "i would like a single spring 4mm jaw nail clippers made of stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "single spring 4mm jaw" ] }, "asin": "B00LLGSY82" }, { "task_id": "ws_B08X1V7V92_5993", "instruction": "i am looking for a hands free earbud headphones and color should be light grey or blue.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "light grey | blue" ] }, "asin": "B08X1V7V92" }, { "task_id": "ws_B08P572SR5_5994", "instruction": "i want a pair of non slip ballet flats with rubber sole. i need it in size 11.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "11" ] }, "asin": "B08P572SR5" }, { "task_id": "ws_B09B9CX9N1_5995", "instruction": "i am looking for a cruelty free makeup blender sponge which is easy to clean. also choose green color.", "target_attributes": { "attributes": [ "easy clean", "cruelty free" ], "options": [ "green" ] }, "asin": "B09B9CX9N1" }, { "task_id": "ws_B09MHVS36T_5996", "instruction": "i am looking for high quality rainbow9 color hair cap.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "rainbow9" ] }, "asin": "B09MHVS36T" }, { "task_id": "ws_B08ZRYFXZC_5997", "instruction": "i'm looking for clothing easy to machinable washes and it has unique design.", "target_attributes": { "attributes": [ "machine wash", "unique design", "tumble dry" ], "options": [ "multi4" ] }, "asin": "B08ZRYFXZC" }, { "task_id": "ws_B07N13MK4G_5998", "instruction": "im looking for women\u2019s beige skechers go walk 5-lucky sneaker in a size 10.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "beige taupe textile trim tpe", "10" ] }, "asin": "B07N13MK4G" }, { "task_id": "ws_B0891NDH4B_5999", "instruction": "i am looking for easy to use bath shower scrubber for men. please choose blue one.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "blue" ] }, "asin": "B0891NDH4B" }, { "task_id": "ws_B09R3TJ4ZZ_6000", "instruction": "find me a pair of anti slip high heel sandals in black. i am a size 6.", "target_attributes": { "attributes": [ "anti slip", "high heel" ], "options": [ "black", "6" ] }, "asin": "B09R3TJ4ZZ" }, { "task_id": "ws_B09FQZ8VW1_6001", "instruction": "i am looking for a alcohol free face wash for makeup removal which is easy to use. also choose eco friendly one.", "target_attributes": { "attributes": [ "alcohol free", "eco friendly", "easy use" ], "options": [] }, "asin": "B09FQZ8VW1" }, { "task_id": "ws_B07KJQDVM4_6002", "instruction": "i'm looking for rose gold hair coloring products for permanent hair.", "target_attributes": { "attributes": [ "easy use", "rose gold", "hair dye", "permanent hair" ], "options": [ "4.15" ] }, "asin": "B07KJQDVM4" }, { "task_id": "ws_B09S8KNGZ3_6003", "instruction": "i'm looking for open and closed toe sandals for buy it.", "target_attributes": { "attributes": [ "open toe", "closed toe" ], "options": [ "w1 - green" ] }, "asin": "B09S8KNGZ3" }, { "task_id": "ws_B009G74AXG_6004", "instruction": "this brand lorann blueberry ss (with natural flavors) is the one i always use, find the 16 oz bottle, for me the gluten free version.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry" ] }, "asin": "B009G74AXG" }, { "task_id": "ws_B009G74AXG_6005", "instruction": "i am looking for gluten free foods with hazelnut flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "hazelnut" ] }, "asin": "B009G74AXG" }, { "task_id": "ws_B009G74AXG_6006", "instruction": "i would like a 4 fluid ounce bottle of bpa free cookie butter extract.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "cookie butter", "4 fl oz" ] }, "asin": "B009G74AXG" }, { "task_id": "ws_B009G74AXG_6007", "instruction": "i'm looking for a bakery emulsion which should be free from bpa and gluten. also, choose 1 gallon maple flavored one.", "target_attributes": { "attributes": [ "bpa free", "gluten free" ], "options": [ "maple", "1 gallon" ] }, "asin": "B009G74AXG" }, { "task_id": "ws_B009G74AXG_6008", "instruction": "i need some gluten free orange extract", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "orange" ] }, "asin": "B009G74AXG" }, { "task_id": "ws_B09162G91K_6009", "instruction": "i am looking for a cupcake toppers for the birth day party of my daughter", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09162G91K" }, { "task_id": "ws_B07N33D4TH_6010", "instruction": "i am looking for a pack of 5 dark blonde hair dye touch up spray.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "dark blonde", "pack of 5" ] }, "asin": "B07N33D4TH" }, { "task_id": "ws_B09GYMZ7Y2_6011", "instruction": "i would like a pair of yellow size 8.5 boots that are comfortable during the day.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "yellow", "8.5" ] }, "asin": "B09GYMZ7Y2" }, { "task_id": "ws_B07DP7WNS9_6012", "instruction": "i am looking for gluten free snacks with strawberry flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "strawberry" ] }, "asin": "B07DP7WNS9" }, { "task_id": "ws_B09NKWML4K_6013", "instruction": "i am looking for a short sleeve top for a teenage girl. it should in xx-large size.", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "xx-large" ] }, "asin": "B09NKWML4K" }, { "task_id": "ws_B09DY4KL7F_6014", "instruction": "cosmetic craft glitter set for nail art in green colour", "target_attributes": { "attributes": [ "nail art" ], "options": [ "green" ] }, "asin": "B09DY4KL7F" }, { "task_id": "ws_B09JF3D6D3_6015", "instruction": "i need grey memory foam slippers with open toes.", "target_attributes": { "attributes": [ "open toe", "memory foam" ], "options": [ "c-gray" ] }, "asin": "B09JF3D6D3" }, { "task_id": "ws_B000KPO99I_6016", "instruction": "i am searching for an anti aging and dermatologist tested night cream. also, choose the 3.4 ounce size.", "target_attributes": { "attributes": [ "dermatologist tested", "anti aging" ], "options": [ "3.4 ounce" ] }, "asin": "B000KPO99I" }, { "task_id": "ws_B00RHH51P8_6017", "instruction": "show me twin sized bronze colored day bed made in canopy bed style.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "bronze", "twin", "canopy bed" ] }, "asin": "B00RHH51P8" }, { "task_id": "ws_B00RHH51P8_6018", "instruction": "i want to find a white and gold king-sized daybed.", "target_attributes": { "attributes": [ "white item" ], "options": [ "gold", "king", "bed" ] }, "asin": "B00RHH51P8" }, { "task_id": "ws_B093XKPQSJ_6019", "instruction": "i am looking for a suckers & lollipops of spiderman pop ups flavor for birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "spiderman pop ups" ] }, "asin": "B093XKPQSJ" }, { "task_id": "ws_B009PQB0KE_6020", "instruction": "i'm looking for hair removal of men's it was personal care in beauty.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B009PQB0KE" }, { "task_id": "ws_B085NDWSZW_6021", "instruction": "i'm looking for makeup accessories for deadly skin and easy to clean to skin.", "target_attributes": { "attributes": [ "easy clean", "dead skin" ], "options": [] }, "asin": "B085NDWSZW" }, { "task_id": "ws_B07YGLDGZV_6022", "instruction": "i am looking for men's machine washable alloy colored dress pants.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "alloy" ] }, "asin": "B07YGLDGZV" }, { "task_id": "ws_B005ME1PHQ_6023", "instruction": "i'm looking for need to buy a cookie butter and it was gluten free and it contains high protein.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cookie butter" ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B005ME1PHQ_6024", "instruction": "i would like a 128 fluid ounce bottle of princess cake and cookie that is bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "princess cake and cookie", "128 fl oz (pack of 1)" ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B005ME1PHQ_6025", "instruction": "show me lorann coffee bakery emulsion, red velvet flavor and gluten free. i need to add an order for this week.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "red velvet" ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B005ME1PHQ_6026", "instruction": "i'm looking for 4 ounce bottle of coffee bakery emulsion.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "16 fl oz." ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B005ME1PHQ_6027", "instruction": "i would like a 1 gallon bottle of blueberry imitation extract that is bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "blueberry", "1 gallon" ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B005ME1PHQ_6028", "instruction": "i want to get some cherry flavored imitation flavoring that is in a 4 oz six pack size.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cherry", "4 ounce, 6 pack" ] }, "asin": "B005ME1PHQ" }, { "task_id": "ws_B08PKGFW3L_6029", "instruction": "i am looking for birthday party gift supplies. she is a 15 year old girl.", "target_attributes": { "attributes": [ "birthday party", "party supplies", "perfect gift" ], "options": [] }, "asin": "B08PKGFW3L" }, { "task_id": "ws_B09RZN1YYP_6030", "instruction": "i'm looking for cellphone accessories for tempered glass. it was long lasting time.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "iphone 12 pro" ] }, "asin": "B09RZN1YYP" }, { "task_id": "ws_B09SCYZ17V_6031", "instruction": "i'm looking for a open toe slippers with ankle strap. also, choose 6 size wide, a8 white colored one", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "a8 - white", "6 wide" ] }, "asin": "B09SCYZ17V" }, { "task_id": "ws_B08QVLQ7VQ_6032", "instruction": "i am looking to buy pillow covers for my living room. i would like them to be 2 pieces of dimension 18\" x 18\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "2 pieces, 18\" x 18\"" ] }, "asin": "B08QVLQ7VQ" }, { "task_id": "ws_B09MCWQHB6_6033", "instruction": "i am looking for eco friendly window films that are multicolored.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "multi-05711" ] }, "asin": "B09MCWQHB6" }, { "task_id": "ws_B08L86MM2W_6034", "instruction": "i am looking for a heavy duty bedroom sets of full xl size", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "full xl", "heavy duty" ] }, "asin": "B08L86MM2W" }, { "task_id": "ws_B09KV8YFY9_6035", "instruction": "szitop women's yoga pants crossover yoga pants flare crossover high waist workout leggings yoga pants with stretch belly control bootcut do you know a szitop brand? i need flare yoga pants. for everyday wear, machine washable, high waist. look for size .xx-large.", "target_attributes": { "attributes": [ "machine wash", "high waist", "daily wear" ], "options": [ "xx-large" ] }, "asin": "B09KV8YFY9" }, { "task_id": "ws_B003YCN7B0_6036", "instruction": "find me an oil free dermatologist tested exfoliating facial scrub for dry skin with shien control feature and in 4.2 ounce (pack of 3) size.", "target_attributes": { "attributes": [ "oil free", "dermatologist tested", "dry skin" ], "options": [ "4.2 ounce (pack of 3)", "shine control" ] }, "asin": "B003YCN7B0" }, { "task_id": "ws_B085QMTTSC_6037", "instruction": "i need a chocolate coated wafers with a 4.41 ounce size. and i choose the caramel flavor", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "caramel", "4.41 ounce" ] }, "asin": "B085QMTTSC" }, { "task_id": "ws_B097SL3X81_6038", "instruction": "i am looking for a white tempered glass screen smartwatch bands which is compatible to apple", "target_attributes": { "attributes": [ "compatible apple", "tempered glass", "glass screen" ], "options": [ "white" ] }, "asin": "B097SL3X81" }, { "task_id": "ws_B09H6K6SZT_6039", "instruction": "i am looking for a blue color tablets with high performance.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "blue" ] }, "asin": "B09H6K6SZT" }, { "task_id": "ws_B0989N4SWC_6040", "instruction": "i'm looking for high definition 5 in 1 carrying case kit that has separate compartments for case cover, tempered glass and glass screen. also choose large blue colored one.", "target_attributes": { "attributes": [ "high definition", "glass screen", "tempered glass", "case cover", "carrying case" ], "options": [ "blue", "large" ] }, "asin": "B0989N4SWC" }, { "task_id": "ws_B0989N4SWC_6041", "instruction": "i would like a large blue switch case with a glass screen.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "blue", "large" ] }, "asin": "B0989N4SWC" }, { "task_id": "ws_B07ZK5YRBM_6042", "instruction": "i am looking for a curtain for living room which is washable in machine. also choose 52\" wide by 90\" length in size.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "52\" w by 90\" l" ] }, "asin": "B07ZK5YRBM" }, { "task_id": "ws_B08FTKG5HS_6043", "instruction": "a am looking vinyl acetate rose gold women sandal size 10", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "rose gold suede interest", "10" ] }, "asin": "B08FTKG5HS" }, { "task_id": "ws_B09SHRB1KG_6044", "instruction": "i am looking for a high definition android car stereo of quad core color.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "quad core" ] }, "asin": "B09SHRB1KG" }, { "task_id": "ws_B074VFLXWN_6045", "instruction": "i'm looking for high pigmented for long lasting beauty skin care.", "target_attributes": { "attributes": [ "highly pigmented", "long lasting" ], "options": [ "140 light tan" ] }, "asin": "B074VFLXWN" }, { "task_id": "ws_B08ZNCX4WB_6046", "instruction": "i'm looking for wall art pictures for hanging through the wall.", "target_attributes": { "attributes": [ "ready hang", "easy clean" ], "options": [] }, "asin": "B08ZNCX4WB" }, { "task_id": "ws_B08ZNCX4WB_6047", "instruction": "im looking for ready to hang, beach themed art work in size 14\u201d x 14\u201d.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "14x14inx4" ] }, "asin": "B08ZNCX4WB" }, { "task_id": "ws_B0787R6C51_6048", "instruction": "i'm looking for fragrance for men's its for long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B0787R6C51" }, { "task_id": "ws_B07KX9Y57X_6049", "instruction": "i am looking for a ready to hang print that is of sea and glass", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "sea & glass (1)" ] }, "asin": "B07KX9Y57X" }, { "task_id": "ws_B07NNT5XCJ_6050", "instruction": "earthy fragrance for women", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B07NNT5XCJ" }, { "task_id": "ws_B0876G6Z9P_6051", "instruction": "i am looking for low carb, gluten free keto red velvet brownie cookies", "target_attributes": { "attributes": [ "low carb", "gluten free" ], "options": [ "red velvet brownie" ] }, "asin": "B0876G6Z9P" }, { "task_id": "ws_B0876G6Z9P_6052", "instruction": "i want a 6 ounce peanut butter low carb snacks.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "peanut butter", "6 ounce (pack of 5)" ] }, "asin": "B0876G6Z9P" }, { "task_id": "ws_B09FLH9RFF_6053", "instruction": "i'm looking for super soft blankets and throws.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "wolf grey sky" ] }, "asin": "B09FLH9RFF" }, { "task_id": "ws_B009ZKZEDO_6054", "instruction": "i am looking for a glass shade candle sconces.", "target_attributes": { "attributes": [ "glass shade" ], "options": [] }, "asin": "B009ZKZEDO" }, { "task_id": "ws_B09MZFY93T_6055", "instruction": "i'm looking for cupcake decorations for parties and need to buy it.", "target_attributes": { "attributes": [ "hand crafted", "party supplies" ], "options": [] }, "asin": "B09MZFY93T" }, { "task_id": "ws_B07QLT232B_6056", "instruction": "i'm looking for stretch fabric rubber outsole", "target_attributes": { "attributes": [ "stretch fabric", "rubber outsole" ], "options": [ "marble" ] }, "asin": "B07QLT232B" }, { "task_id": "ws_B086MQ57DV_6057", "instruction": "i'm looking for gym workout wear for daily wear uses.", "target_attributes": { "attributes": [ "wash cold", "machine wash", "fashion design", "polyester cotton", "gym workout", "everyday wear" ], "options": [ "salmon" ] }, "asin": "B086MQ57DV" }, { "task_id": "ws_B09DD313B3_6058", "instruction": "i am looking a long handle bath body brush easy usable quality should be high", "target_attributes": { "attributes": [ "easy use", "high quality", "long handle" ], "options": [] }, "asin": "B09DD313B3" }, { "task_id": "ws_B015QHXVI4_6059", "instruction": "i'm looking for keto friendly have zero sugar.", "target_attributes": { "attributes": [ "keto friendly", "sugar free" ], "options": [ "1 pound" ] }, "asin": "B015QHXVI4" }, { "task_id": "ws_B09S5S2MZZ_6060", "instruction": "i want a high power binoculars with a large eyepiece for bird watching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B09S5S2MZZ" }, { "task_id": "ws_B09S5S2MZZ_6061", "instruction": "i want a pair of binoculars for bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09S5S2MZZ" }, { "task_id": "ws_B09QCWBPK5_6062", "instruction": "i would like a 38 mm smartwatch band for my applewatch that is a transparent black flower.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "transparent black flower", "38mm | 40mm | 41mm" ] }, "asin": "B09QCWBPK5" }, { "task_id": "ws_B07XYM11XS_6063", "instruction": "i'm looking for a adapter for wireless bluetooth speakers with output protection.", "target_attributes": { "attributes": [ "output protection", "wireless bluetooth" ], "options": [] }, "asin": "B07XYM11XS" }, { "task_id": "ws_B00GTQZNDS_6064", "instruction": "i am looking for a fully assembled storage unit made from plywood.", "target_attributes": { "attributes": [ "storage unit" ], "options": [ "fully assembled" ] }, "asin": "B00GTQZNDS" }, { "task_id": "ws_B0751NG9VN_6065", "instruction": "i need a tuna creations bold, rice and beans in soy free hot sauce flavored tapatio, 2.6 ounce (pack of 1)", "target_attributes": { "attributes": [ "soy free" ], "options": [ "tapatio", "2.6 ounce (pack of 1)" ] }, "asin": "B0751NG9VN" }, { "task_id": "ws_B093DJDL6T_6066", "instruction": "i am looking for washable easy clean non toxic hair chalk for girls", "target_attributes": { "attributes": [ "non toxic", "easy clean" ], "options": [] }, "asin": "B093DJDL6T" }, { "task_id": "ws_B07M6LWR7C_6067", "instruction": "i nee all natural but no artificial ingredients savory and spicy sauce, 3 pack with sweet kick mustard flavor.", "target_attributes": { "attributes": [ "artificial ingredients" ], "options": [ "sweet kick mustard", "3 pack" ] }, "asin": "B07M6LWR7C" }, { "task_id": "ws_B081JHXKWG_6068", "instruction": "i am looking for a cake toppers for birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B081JHXKWG" }, { "task_id": "ws_B0959MKXBR_6069", "instruction": "i'm looking for a twin bed frame with light brown color and white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "light brown", "twin" ] }, "asin": "B0959MKXBR" }, { "task_id": "ws_B09SSKKG32_6070", "instruction": "i am looking for a wide leg overall for women with long sleeve and high waist. also choose beige color and 3x large size.", "target_attributes": { "attributes": [ "wide leg", "high waist", "long sleeve" ], "options": [ "beige", "3x-large" ] }, "asin": "B09SSKKG32" }, { "task_id": "ws_B091F5JC1Y_6071", "instruction": "large size hand washable silk satin pajamas with elasticwaistband", "target_attributes": { "attributes": [ "hand wash", "elastic waistband" ], "options": [ "large" ] }, "asin": "B091F5JC1Y" }, { "task_id": "ws_B08ZQLXCTV_6072", "instruction": "i need black color and 15 ft long heavy duty surge protector power strip", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B08ZQLXCTV" }, { "task_id": "ws_B083LVF5PM_6073", "instruction": "i am looking for a wireless bluetooth 4.0 power amplifier board.", "target_attributes": { "attributes": [ "power amplifier", "wireless bluetooth" ], "options": [] }, "asin": "B083LVF5PM" }, { "task_id": "ws_B07BGDBMXC_6074", "instruction": "i need a mid century faux leather ottoman in walnut brown color.", "target_attributes": { "attributes": [ "mid century", "faux leather" ], "options": [] }, "asin": "B07BGDBMXC" }, { "task_id": "ws_B07DLQ2H98_6075", "instruction": "i would like a full sized day bed with a brushed bronze frame that's easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "brushed bronze", "full over twin size", "daybed and trundle" ] }, "asin": "B07DLQ2H98" }, { "task_id": "ws_B08ZGZZDCJ_6076", "instruction": "i'm looking for cakes it contains high protein and the low fat.", "target_attributes": { "attributes": [ "high protein", "low fat" ], "options": [ "gluten free" ] }, "asin": "B08ZGZZDCJ" }, { "task_id": "ws_B093BNSSHW_6077", "instruction": "i am lookin for black stereo sound computer speakers.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black" ] }, "asin": "B093BNSSHW" }, { "task_id": "ws_B09D7RBGLX_6078", "instruction": "i'm looking for hand painted decorative pillows for grey plant colored.", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "grey plant" ] }, "asin": "B09D7RBGLX" }, { "task_id": "ws_B008ZEEDBA_6079", "instruction": "i am looking for a x-large jacket fleece that is water resistant. and please get me the red color", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "red | white | blue", "x-large" ] }, "asin": "B008ZEEDBA" }, { "task_id": "ws_B09SPWBXNR_6080", "instruction": "i'm looking for open toe pillow slippers its make comfortable.", "target_attributes": { "attributes": [ "non slip", "open toe" ], "options": [ "camouflage", "5.5" ] }, "asin": "B09SPWBXNR" }, { "task_id": "ws_B08HWR6C22_6081", "instruction": "i'm looking for tripoid for electronics needed.", "target_attributes": { "attributes": [ "easy carry", "carrying case" ], "options": [] }, "asin": "B08HWR6C22" }, { "task_id": "ws_B076BC2CC2_6082", "instruction": "i would like 72 one ounce bags of bbq and pineapple jerky that is non-gmo.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "bbq & pineapple - natural pork", "1 ounce (pack of 72)" ] }, "asin": "B076BC2CC2" }, { "task_id": "ws_B09H8BY27C_6083", "instruction": "i am looking for a body scrubs for dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [] }, "asin": "B09H8BY27C" }, { "task_id": "ws_B00IPQ54KM_6084", "instruction": "i'm looking for a gift covered with chocolate and should be in a gift basket.", "target_attributes": { "attributes": [ "chocolate covered", "gift basket" ], "options": [] }, "asin": "B00IPQ54KM" }, { "task_id": "ws_B07SGHL6K2_6085", "instruction": "looking for travel accessories bottles for travel size", "target_attributes": { "attributes": [ "travel size", "travel bottles" ], "options": [] }, "asin": "B07SGHL6K2" }, { "task_id": "ws_B00GTC1HIW_6086", "instruction": "i am looking for a paraben free body wash that has a pink lemon and mandarin orange style.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "pink lemon and mandarin orange" ] }, "asin": "B00GTC1HIW" }, { "task_id": "ws_B00GTC1HIW_6087", "instruction": "i would like a 13.5 fluid ounce bottle of vanilla body wash that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "13.5 fl oz (pack of 1)", "vanilla" ] }, "asin": "B00GTC1HIW" }, { "task_id": "ws_B09MLHK36S_6088", "instruction": "storage cabinet white led buffet cabinet with 3 doors", "target_attributes": { "attributes": [ "high gloss", "dining room", "living room" ], "options": [ "black 1 door" ] }, "asin": "B09MLHK36S" }, { "task_id": "ws_B07L5ZM4YN_6089", "instruction": "i need a high heeled close toe shoes that is in size 9.", "target_attributes": { "attributes": [ "high heel", "closed toe" ], "options": [ "9" ] }, "asin": "B07L5ZM4YN" }, { "task_id": "ws_B09SPYJJX3_6090", "instruction": "i am looking for clinical strength anti perspirant for sensitive skin.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [] }, "asin": "B09SPYJJX3" }, { "task_id": "ws_B00WLJENOW_6091", "instruction": "i am looking for a 24 pack of high protein herbal tea", "target_attributes": { "attributes": [ "high protein" ], "options": [ "24 packs" ] }, "asin": "B00WLJENOW" }, { "task_id": "ws_B00WLJENOW_6092", "instruction": "i want high protein vitasoy soy milk drink.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "soy milk" ] }, "asin": "B00WLJENOW" }, { "task_id": "ws_B07XF1LN9H_6093", "instruction": "can i get a large size navy blue lightweight and breathable stretch fabric polo shirt for men?", "target_attributes": { "attributes": [ "stretch fabric" ], "options": [ "navy blue", "large" ] }, "asin": "B07XF1LN9H" }, { "task_id": "ws_B09DT2MSJR_6094", "instruction": "i need a hand painted storage case for my living room . it should be book shaped", "target_attributes": { "attributes": [ "hand painted", "living room" ], "options": [] }, "asin": "B09DT2MSJR" }, { "task_id": "ws_B08XMZDY39_6095", "instruction": "i am looking for a long lasting full size metal platform bed.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "full" ] }, "asin": "B08XMZDY39" }, { "task_id": "ws_B076Z63QBR_6096", "instruction": "i am looking for a atomic red orange mid century sofas & couches.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "atomic red orange" ] }, "asin": "B076Z63QBR" }, { "task_id": "ws_B01J445IUY_6097", "instruction": "i need a six pack of manual toothbrushes that are good for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "6 count (pack of 1)" ] }, "asin": "B01J445IUY" }, { "task_id": "ws_B09SB3RPJM_6098", "instruction": "open toe sexy high heels, non slip fashion for street wearing size 7", "target_attributes": { "attributes": [ "open toe", "non slip", "high heel" ], "options": [ "7" ] }, "asin": "B09SB3RPJM" }, { "task_id": "ws_B07M9Z1C8M_6099", "instruction": "i am looking for dairy free and apple variety pack of chips", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "apple variety pack" ] }, "asin": "B07M9Z1C8M" }, { "task_id": "ws_B09Q2SYZW6_6100", "instruction": "i'm looking for binocular for bird watching.", "target_attributes": { "attributes": [ "high resolution", "bird watching" ], "options": [] }, "asin": "B09Q2SYZW6" }, { "task_id": "ws_B087TP51X9_6101", "instruction": "encontrar uma linda \u00e9 a sand\u00e1lia de cristal haoricu para mulher. preciso comprar para presente. ache o tamanho 8,5 na cor preta.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "01-black", "8.5" ] }, "asin": "B087TP51X9" }, { "task_id": "ws_B08L3VTNQZ_6102", "instruction": "i'm looking for electronics for wearable technology and it was silver water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "silver aluminum case" ] }, "asin": "B08L3VTNQZ" }, { "task_id": "ws_B08L3VTNQZ_6103", "instruction": "i would like a 44 mm blue sport band smartwatch with gps and cellular. i would also like it to be water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "silver aluminium case with abyss blue sport band", "44mm", "gps+cellular" ] }, "asin": "B08L3VTNQZ" }, { "task_id": "ws_B08L3VTNQZ_6104", "instruction": "i want to find an apple watch that has a silver aluminum case and a white 40 millimeter band. it needs to be water resistant and come with a gps.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "silver aluminum case with white sport band", "40mm", "gps" ] }, "asin": "B08L3VTNQZ" }, { "task_id": "ws_B0918YYZBV_6105", "instruction": "i would like a 40mm black and clear apple watch screen protector made of tempered glass.", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "black and clear", "40mm" ] }, "asin": "B0918YYZBV" }, { "task_id": "ws_B07L1LQBHS_6106", "instruction": "i need red pump shoes for party or formal wear with rubber sole and size 7.5", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "red", "7.5" ] }, "asin": "B07L1LQBHS" }, { "task_id": "ws_B015RNIF8I_6107", "instruction": "i'm looking for a target reflections buffet", "target_attributes": { "attributes": [ "white item" ], "options": [ "blue" ] }, "asin": "B015RNIF8I" }, { "task_id": "ws_B093G1BD4P_6108", "instruction": "bacon jerky 15 pack", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "15 pack" ] }, "asin": "B093G1BD4P" }, { "task_id": "ws_B08YMYLMZJ_6109", "instruction": "i would like a bath brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B08YMYLMZJ" }, { "task_id": "ws_B09PZKBWJ4_6110", "instruction": "i'm looking for camera it was easy to carry and need to buy it.", "target_attributes": { "attributes": [ "easy carry", "carrying case" ], "options": [ "50cm" ] }, "asin": "B09PZKBWJ4" }, { "task_id": "ws_B00OGQY8Y8_6111", "instruction": "i need a heavy duty king sized bed frame.", "target_attributes": { "attributes": [ "heavy duty", "king size" ], "options": [ "king" ] }, "asin": "B00OGQY8Y8" }, { "task_id": "ws_B003EAC7ZY_6112", "instruction": "i need a small easy care shirt with long sleeves . and i prefer the clover color", "target_attributes": { "attributes": [ "easy care", "long sleeve" ], "options": [ "clover", "small" ] }, "asin": "B003EAC7ZY" }, { "task_id": "ws_B07NW8Q5FY_6113", "instruction": "i am looking for men classic fit t-shirt. please choose black color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "men" ] }, "asin": "B07NW8Q5FY" }, { "task_id": "ws_B088BBSTR1_6114", "instruction": "i am looking for a loose fit womens shirt with a short sleeve. also, i want the size of the shirt to be xx-large.", "target_attributes": { "attributes": [ "loose fit", "short sleeve" ], "options": [ "xx-large" ] }, "asin": "B088BBSTR1" }, { "task_id": "ws_B07ZFCWHCF_6115", "instruction": "i am looking for a high quality heeta 2-pack hair shampoo brush specifically for dry hair. i would be more inclined to take a pink & purple.", "target_attributes": { "attributes": [ "high quality", "dry hair" ], "options": [ "pink & purple" ] }, "asin": "B07ZFCWHCF" }, { "task_id": "ws_B083M7B6CJ_6116", "instruction": "i am looking for a s-dark black wireless bluetooth earbud headphones.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "s-dark black" ] }, "asin": "B083M7B6CJ" }, { "task_id": "ws_B093YSBNHN_6117", "instruction": "i would like a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSBNHN" }, { "task_id": "ws_B01647YILE_6118", "instruction": "i'm looking for fully cooked the flavor saquatch", "target_attributes": { "attributes": [ "fully cooked", "ready eat" ], "options": [ "sasquatch" ] }, "asin": "B01647YILE" }, { "task_id": "ws_B08F9BY4P2_6119", "instruction": "i'm looking for the hyaluronic acid it was non-toxic acid. it contains petals.", "target_attributes": { "attributes": [ "non toxic", "hyaluronic acid" ], "options": [ "petals | tropical pink" ] }, "asin": "B08F9BY4P2" }, { "task_id": "ws_B094YJFCY7_6120", "instruction": "i need a large square solid wood coffee table laced with upholstered tufted button linen, an ivory-ottoman color will be most preferred.", "target_attributes": { "attributes": [ "button tufted", "solid wood" ], "options": [ "ivory-ottoman" ] }, "asin": "B094YJFCY7" }, { "task_id": "ws_B09D7BZ1L6_6121", "instruction": "please order for me a black pure leather ottoman stool size 100x40x43 cm for my living room.", "target_attributes": { "attributes": [ "pu leather", "living room" ], "options": [ "black", "100x40x43cm" ] }, "asin": "B09D7BZ1L6" }, { "task_id": "ws_B005HV6RJA_6122", "instruction": "i'm looking for regular fit and the clothing was makes day comfort.", "target_attributes": { "attributes": [ "day comfort", "regular fit" ], "options": [ "white | charcoal stripe" ] }, "asin": "B005HV6RJA" }, { "task_id": "ws_B094NQB78B_6123", "instruction": "i'm looking for sandals for a women need to buy a yellow color rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "yellow 10cm" ] }, "asin": "B094NQB78B" }, { "task_id": "ws_B09FF7ZSFJ_6124", "instruction": "i am looking for a multicolor shower caps for hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "multicolor" ] }, "asin": "B09FF7ZSFJ" }, { "task_id": "ws_B08N5DD2CG_6125", "instruction": "i'm looking for wild caught seafood with no added genetically modified organisms in the ingredients.", "target_attributes": { "attributes": [ "wild caught", "non gmo" ], "options": [] }, "asin": "B08N5DD2CG" }, { "task_id": "ws_B07NZ7YPXB_6126", "instruction": "i am looking for a 2 ounce (pack of 4) of 2 ounce (pack of 4) jerky", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "2 ounce (pack of 4)" ] }, "asin": "B07NZ7YPXB" }, { "task_id": "ws_B07NZ7YPXB_6127", "instruction": "find high protein beef jerky's.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B07NZ7YPXB" }, { "task_id": "ws_B0945PXFDT_6128", "instruction": "i'm looking for moisturizes the skin the green tea gives skin care goodness.", "target_attributes": { "attributes": [ "green tea", "seed oil" ], "options": [ ".7 fl oz (pack of 1)" ] }, "asin": "B0945PXFDT" }, { "task_id": "ws_B0945PXFDT_6129", "instruction": "i want .5 fl oz of clinically proven vegan mia organic antioxidant face oil.", "target_attributes": { "attributes": [ "clinically proven" ], "options": [ ".5 fl oz (pack of 1)" ] }, "asin": "B0945PXFDT" }, { "task_id": "ws_B07NNXYHNM_6130", "instruction": "i'm looking for cruelty free, vitabath brand, bath and shower gel in the 32 ounce size.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "32 ounce" ] }, "asin": "B07NNXYHNM" }, { "task_id": "ws_B07NNXYHNM_6131", "instruction": "i am looking for a paraben free and cruelty free moisturizing body cleanser for dry skin. also choose size 32 fl oz.", "target_attributes": { "attributes": [ "paraben free", "cruelty free", "dry skin" ], "options": [ "32 fl oz (pack of 1)" ] }, "asin": "B07NNXYHNM" }, { "task_id": "ws_B07KYL4W5P_6132", "instruction": "i am looking for a red stereo sound earbud headphones", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "red" ] }, "asin": "B07KYL4W5P" }, { "task_id": "ws_B0931675TF_6133", "instruction": "i am looking for solid wood gaosoul wall art with wooden frame and size is 36x24in", "target_attributes": { "attributes": [ "wood frame", "solid wood" ], "options": [ "36x24in" ] }, "asin": "B0931675TF" }, { "task_id": "ws_B07L2K1H47_6134", "instruction": "i'm looking for a regular fit men's sneakers with rubber sole. also choose 6.5 size black colored one.", "target_attributes": { "attributes": [ "regular fit", "rubber sole" ], "options": [ "black (cblack | ftwwht | cblack cblack | ftwwh...", "6.5" ] }, "asin": "B07L2K1H47" }, { "task_id": "ws_B01C2CZWU6_6135", "instruction": "i want apple fruit sauce crushers that are certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [] }, "asin": "B01C2CZWU6" }, { "task_id": "ws_B092CTGJTY_6136", "instruction": "i am looking for a dual band dome cameras.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B092CTGJTY" }, { "task_id": "ws_B07SKN25VL_6137", "instruction": "i'm looking for hair extensions for natural hair and straight hair so need to buy it.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "ash blonde-straight(new)" ] }, "asin": "B07SKN25VL" }, { "task_id": "ws_B07N97QCX8_6138", "instruction": "i'm looking for gluten free it was contain high protein and need to buy it.", "target_attributes": { "attributes": [ "low carb", "non gmo", "gluten free" ], "options": [ "vodka" ] }, "asin": "B07N97QCX8" }, { "task_id": "ws_B07D2W2VZ4_6139", "instruction": "i'm looking for a 60\" floating tv console that will be best as media storage unit and has stone gray color.", "target_attributes": { "attributes": [ "storage unit" ], "options": [ "stone gray", "60\"" ] }, "asin": "B07D2W2VZ4" }, { "task_id": "ws_B09SGD4LLC_6140", "instruction": "i'm looking for binocular it will use for bird watching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [ "a" ] }, "asin": "B09SGD4LLC" }, { "task_id": "ws_B07KRWK5ZJ_6141", "instruction": "i am searching for a star war graphic tee in white.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "white" ] }, "asin": "B07KRWK5ZJ" }, { "task_id": "ws_B09DMGQT3Q_6142", "instruction": "i am looking for chocolate covered mint chip", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "mint chip" ] }, "asin": "B09DMGQT3Q" }, { "task_id": "ws_B00U9WMZ0W_6143", "instruction": "i am looking for vintage white bed in a king size", "target_attributes": { "attributes": [ "white item" ], "options": [ "vintage white", "california king" ] }, "asin": "B00U9WMZ0W" }, { "task_id": "ws_B078YFPSNW_6144", "instruction": "i'm looking for a tippleman's barrel aged cola syrup .", "target_attributes": { "attributes": [ "non alcoholic", "natural ingredients" ], "options": [ "burnt sugar" ] }, "asin": "B078YFPSNW" }, { "task_id": "ws_B09FQ2NGQD_6145", "instruction": "i really appreciate the cheese bros honey sriracha gouda b individually wrapped, royal aged cheese i will gift to my friend with the 6 oz. i want the 8 pack ready to eat she will serve at the party.", "target_attributes": { "attributes": [ "ready eat", "individually wrapped" ], "options": [ "8 pack" ] }, "asin": "B09FQ2NGQD" }, { "task_id": "ws_B09F6Y56TX_6146", "instruction": "i looking a men's short sleeve relaxed fit xx- large maroon /white color polo shirt", "target_attributes": { "attributes": [ "relaxed fit", "short sleeve" ], "options": [ "maroon | white", "xx-large" ] }, "asin": "B09F6Y56TX" }, { "task_id": "ws_B09F6Y56TX_6147", "instruction": "i would like a maroon and white medium nc state wolfpack short sleeved polo shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "maroon | white", "medium", "north carolina state wolfpack" ] }, "asin": "B09F6Y56TX" }, { "task_id": "ws_B07R9RK4X2_6148", "instruction": "bluetooth headset for cell phones with noise cancelling in black colour", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black" ] }, "asin": "B07R9RK4X2" }, { "task_id": "ws_B09KHDQGMV_6149", "instruction": "i am looking for a brushed nickel finish floor lamp.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish" ], "options": [] }, "asin": "B09KHDQGMV" }, { "task_id": "ws_B09QFMRDWC_6150", "instruction": "find me a x-large short sleeve dress in white with pockets", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "white", "x-large" ] }, "asin": "B09QFMRDWC" }, { "task_id": "ws_B0892JYS9N_6151", "instruction": "storage ottoman bench with hinged lid which size 40*40*43cm", "target_attributes": { "attributes": [ "storage space" ], "options": [ "40*40*43cm" ] }, "asin": "B0892JYS9N" }, { "task_id": "ws_B07GBBCKL7_6152", "instruction": "i need surgar free chocolate flavored cheesecake syrup, 3 pound (pack of 1)", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "chocolate", "3 pound (pack of 1)" ] }, "asin": "B07GBBCKL7" }, { "task_id": "ws_B07GBBCKL7_6153", "instruction": "i want davinci gourmet sugar-free hazelnut syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar-free hazelnut" ] }, "asin": "B07GBBCKL7" }, { "task_id": "ws_B07S14G6N1_6154", "instruction": "i'm looking for black video play for video acccesseories.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "black" ] }, "asin": "B07S14G6N1" }, { "task_id": "ws_B08MVT2WVK_6155", "instruction": "i'm looking for a silicone case cover for remote", "target_attributes": { "attributes": [ "case cover" ], "options": [] }, "asin": "B08MVT2WVK" }, { "task_id": "ws_B09GX4CCW2_6156", "instruction": "i'm looking for some permanent blue hair dye that's cruelty free.", "target_attributes": { "attributes": [ "cruelty free", "permanent hair", "hair dye" ], "options": [ "blue smoke" ] }, "asin": "B09GX4CCW2" }, { "task_id": "ws_B09P8DYFNT_6157", "instruction": "i want a high quality dual band streaming media player with warranty,4gb+64gb", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B09P8DYFNT" }, { "task_id": "ws_B08R63QV8P_6158", "instruction": "i'm looking for hair extensions for wigs and hair care.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "22inch" ] }, "asin": "B08R63QV8P" }, { "task_id": "ws_B07YBM36S1_6159", "instruction": "i'm looking for a medium color with natural ingredients concealers & neutralizers for dark circle.", "target_attributes": { "attributes": [ "natural ingredients", "dark circles" ], "options": [ "medium" ] }, "asin": "B07YBM36S1" }, { "task_id": "ws_B09L1FGCNY_6160", "instruction": "i am looking for a high density mattress in full size which is made up of memory foam.", "target_attributes": { "attributes": [ "high density", "memory foam" ], "options": [ "full" ] }, "asin": "B09L1FGCNY" }, { "task_id": "ws_B095H9BN24_6161", "instruction": "i need a plug and play compatible displayport to hdmi adapter.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "2x displayport 1x hdmi" ] }, "asin": "B095H9BN24" }, { "task_id": "ws_B09QQMCJ4W_6162", "instruction": "i need size 8 closed toe sandals with arch support. it should be in beige.", "target_attributes": { "attributes": [ "arch support", "closed toe" ], "options": [ "z3-beige", "8" ] }, "asin": "B09QQMCJ4W" }, { "task_id": "ws_B08RYTPXT3_6163", "instruction": "i'm looking for stereo sound it was outside of noise pollution.", "target_attributes": { "attributes": [ "stereo sound", "wireless bluetooth" ], "options": [ "red" ] }, "asin": "B08RYTPXT3" }, { "task_id": "ws_B09FQGXBFB_6164", "instruction": "i want to find hair serum that contains argan oil and treats damaged hair.", "target_attributes": { "attributes": [ "argan oil", "damaged hair", "hair treatment" ], "options": [] }, "asin": "B09FQGXBFB" }, { "task_id": "ws_B073JK81KY_6165", "instruction": "i am looking for a 7.7 ounce box of pecan gluten-free crackers", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pecan", "7.7 ounce (pack of 1)" ] }, "asin": "B073JK81KY" }, { "task_id": "ws_B0991MJXM2_6166", "instruction": "i would like a pair of women's 9.5 sized hot pink running shoes with a rubber outsole.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "hot pink", "9.5-10 women | 9.5-10 men" ] }, "asin": "B0991MJXM2" }, { "task_id": "ws_B0991MJXM2_6167", "instruction": "i'm looking for shoes of women men kenee high and the color in hot pink.", "target_attributes": { "attributes": [ "knee high", "steel toe", "rubber outsole" ], "options": [ "hot pink" ] }, "asin": "B0991MJXM2" }, { "task_id": "ws_B0843QGW1Z_6168", "instruction": "i'm looking for curved and rounded stainless steel scissors for trimming mustache, nose hair and beard. also silver color one.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "silver" ] }, "asin": "B0843QGW1Z" }, { "task_id": "ws_B09J39R644_6169", "instruction": "i am looking a soy wax lead free scented candle for home", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [] }, "asin": "B09J39R644" }, { "task_id": "ws_B09BTZGVVB_6170", "instruction": "i am looking for luxurious blanket for bedroom sofa that is machine washable and also choose in colorful bohemian pattern", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "colorful bohemian pattern" ] }, "asin": "B09BTZGVVB" }, { "task_id": "ws_B08N462C25_6171", "instruction": "i need caxxa amber glass fine mist spray bottles, size 12 refillable containers.", "target_attributes": { "attributes": [ "bpa free", "eco friendly" ], "options": [ "12" ] }, "asin": "B08N462C25" }, { "task_id": "ws_B00EKLPLU4_6172", "instruction": "i want non gmo sugar free keto friendly cocoa chocolate size: 1 pound", "target_attributes": { "attributes": [ "sugar free", "non gmo", "keto friendly" ], "options": [ "1 pound" ] }, "asin": "B00EKLPLU4" }, { "task_id": "ws_B00EKLPLU4_6173", "instruction": "i want non gmo healthworks cacao butter powder.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "cacao butter" ] }, "asin": "B00EKLPLU4" }, { "task_id": "ws_B004BYSR6K_6174", "instruction": "i would like two boxes of mocha ash brown hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "5ab mocha ash brown, 3-pack", "1 count (pack of 2)" ] }, "asin": "B004BYSR6K" }, { "task_id": "ws_B07RLSLZ3P_6175", "instruction": "i am looking for a white finish barstools and color should be antique white finish | black leather seat", "target_attributes": { "attributes": [ "white finish" ], "options": [ "antique white finish | black leather seat" ] }, "asin": "B07RLSLZ3P" }, { "task_id": "ws_B08DTJCR5M_6176", "instruction": "i need a bag of non-toxic refillable lip gloss tubes.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B08DTJCR5M" }, { "task_id": "ws_B07G28S4VV_6177", "instruction": "looking for long sleeve casual t-shirts that hand washable also choose yellow colour", "target_attributes": { "attributes": [ "hand wash", "long sleeve" ], "options": [ "a:yellow" ] }, "asin": "B07G28S4VV" }, { "task_id": "ws_B09578LY5V_6178", "instruction": "i am looking for noise cancelling headphones in a black color", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black" ] }, "asin": "B09578LY5V" }, { "task_id": "ws_B09PQN4F9T_6179", "instruction": "i am looking for sandals for high waist women with rubber sole and it color is black 4 and size is 7.5", "target_attributes": { "attributes": [ "high waist", "rubber sole" ], "options": [ "black 4", "7.5" ] }, "asin": "B09PQN4F9T" }, { "task_id": "ws_B08SJ8XVCM_6180", "instruction": "gel nail kit nail polish with 33 piece set", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "33 piece set" ] }, "asin": "B08SJ8XVCM" }, { "task_id": "ws_B0911J7P7G_6181", "instruction": "i am looking for high protein yogurt.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B0911J7P7G" }, { "task_id": "ws_B00IV0ZI1M_6182", "instruction": "i want to buy a shampoo and conditioner set for natural hair. my hair is on the dry side.", "target_attributes": { "attributes": [ "natural hair", "dry hair" ], "options": [ "conditioner" ] }, "asin": "B00IV0ZI1M" }, { "task_id": "ws_B08CHGCXLR_6183", "instruction": "i'm looking for twin sized bed room for bedroom", "target_attributes": { "attributes": [ "twin size", "easy assemble" ], "options": [ "espresso-1" ] }, "asin": "B08CHGCXLR" }, { "task_id": "ws_B08NDPSJ4J_6184", "instruction": "i am looking for a green solid wood chairs for living rooms.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "green" ] }, "asin": "B08NDPSJ4J" }, { "task_id": "ws_B01LXTJUAG_6185", "instruction": "find me a polo shirt with short sleeves and stretch fabric. pick something in sundress color.", "target_attributes": { "attributes": [ "stretch fabric", "short sleeve" ], "options": [ "sundress" ] }, "asin": "B01LXTJUAG" }, { "task_id": "ws_B01MR0TR0P_6186", "instruction": "i would like a long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B01MR0TR0P" }, { "task_id": "ws_B00PQFK67G_6187", "instruction": "find me a regular fit machine washable cargo pants with buttoned closure in 6057 apricot color and 29 size.", "target_attributes": { "attributes": [ "machine wash", "regular fit", "button closure" ], "options": [ "6057 apricot", "29" ] }, "asin": "B00PQFK67G" }, { "task_id": "ws_B07BZ2ZRFY_6188", "instruction": "i would like six bags of 3.25 ounce traditional snack mix that is low in sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "traditional snack mix", "3.25 ounce (6 pack)" ] }, "asin": "B07BZ2ZRFY" }, { "task_id": "ws_B07BZ2ZRFY_6189", "instruction": "i am looking for 6 pack of size 6 ounce snack mix resealable bag.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "6 ounce (6 pack)" ] }, "asin": "B07BZ2ZRFY" }, { "task_id": "ws_B002WK1FC8_6190", "instruction": "i would like a #8 foundation for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "8" ] }, "asin": "B002WK1FC8" }, { "task_id": "ws_B082CP4B4M_6191", "instruction": "i am looking for heavy duty bed frame of black color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black" ] }, "asin": "B082CP4B4M" }, { "task_id": "ws_B09BC5LJG5_6192", "instruction": "i am looking for a dark gray color steel coated bar stool with adjustable height option.", "target_attributes": { "attributes": [ "height adjustable", "coated steel" ], "options": [ "dark gray" ] }, "asin": "B09BC5LJG5" }, { "task_id": "ws_B08C6YC9F9_6193", "instruction": "i am looking for heavy duty clear glass spray bottles that are easy to clean.", "target_attributes": { "attributes": [ "heavy duty", "easy clean" ], "options": [ "clear" ] }, "asin": "B08C6YC9F9" }, { "task_id": "ws_B000KPVX0G_6194", "instruction": "i'm looking for hair coloring products for permanent hair.", "target_attributes": { "attributes": [ "permanent hair", "hair dye" ], "options": [ "pack of 3" ] }, "asin": "B000KPVX0G" }, { "task_id": "ws_B000KPVX0G_6195", "instruction": "i would like a three pack of hair color that is long lasting and comes in a pack of three that are brown.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "5 medium brown", "pack of 3" ] }, "asin": "B000KPVX0G" }, { "task_id": "ws_B09SV52TDY_6196", "instruction": "i need a high quality refillable spray bottle of 50 ml size. and i choose the black one", "target_attributes": { "attributes": [ "high quality" ], "options": [ "b", "50ml" ] }, "asin": "B09SV52TDY" }, { "task_id": "ws_B08XJ2PT2C_6197", "instruction": "i'm looking for a skull king barber cape with hook sucker.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "starry sky 5" ] }, "asin": "B08XJ2PT2C" }, { "task_id": "ws_B07SG6973V_6198", "instruction": "i am looking for a double sided pocket mirror with a watercolor flower pattern.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "watercolor flower" ] }, "asin": "B07SG6973V" }, { "task_id": "ws_B00XREG27G_6199", "instruction": "i want high heel lace closure black color women's pump size: 7.5", "target_attributes": { "attributes": [ "lace closure", "high heel" ], "options": [] }, "asin": "B00XREG27G" }, { "task_id": "ws_B0757Y3MF9_6200", "instruction": "i am looking for high quality tea tree essential face oil, 4 fl oz (pack of 1)", "target_attributes": { "attributes": [ "high quality" ], "options": [ "tea tree", "4 fl oz (pack of 1)" ] }, "asin": "B0757Y3MF9" }, { "task_id": "ws_B0757Y3MF9_6201", "instruction": "i would like a small bottle of grapefruit high quality face oil.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "grapefruit", "small" ] }, "asin": "B0757Y3MF9" }, { "task_id": "ws_B0747Y61RC_6202", "instruction": "i need a plant based tea tree face cream for sensitive skin.", "target_attributes": { "attributes": [ "plant based", "tea tree", "sensitive skin" ], "options": [] }, "asin": "B0747Y61RC" }, { "task_id": "ws_B098XG9Y6C_6203", "instruction": "looking for pet foam bottle that is easy to carry also choose in 60ml", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "60 ml" ] }, "asin": "B098XG9Y6C" }, { "task_id": "ws_B076WNJLLV_6204", "instruction": "need a 10ft cable usb with rs422/rs485 port", "target_attributes": { "attributes": [ "usb port" ], "options": [ "10ft" ] }, "asin": "B076WNJLLV" }, { "task_id": "ws_B095Y62XPR_6205", "instruction": "i need a double sided sharpening strap", "target_attributes": { "attributes": [ "double sided" ], "options": [] }, "asin": "B095Y62XPR" }, { "task_id": "ws_B0792T5STF_6206", "instruction": "i'm looking for a plant based protein drink that should be free from soy, gluten and dairy.", "target_attributes": { "attributes": [ "soy free", "plant based", "dairy free", "gluten free" ], "options": [] }, "asin": "B0792T5STF" }, { "task_id": "ws_B09HGNFL8G_6207", "instruction": "i am looking for a gluten free jerky", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B09HGNFL8G" }, { "task_id": "ws_B07VC8W1NG_6208", "instruction": "i am looking for a set of 7.4 inch size white lead free dessert salad plate which is easy to clean.", "target_attributes": { "attributes": [ "easy clean", "lead free", "white item" ], "options": [ "7.4 inch" ] }, "asin": "B07VC8W1NG" }, { "task_id": "ws_B096FH3W7S_6209", "instruction": "i want an easy to use tongue cleaner for eliminating bad breath.", "target_attributes": { "attributes": [ "easy use", "bad breath" ], "options": [] }, "asin": "B096FH3W7S" }, { "task_id": "ws_B08Z8JGF5M_6210", "instruction": "i need open toe sandles in red color for a teenage girl.", "target_attributes": { "attributes": [ "open toe", "teen girls" ], "options": [ "z5-red" ] }, "asin": "B08Z8JGF5M" }, { "task_id": "ws_B09CMKSM4V_6211", "instruction": "i am looking for a white item coffee tables for living room", "target_attributes": { "attributes": [ "white item", "living room" ], "options": [] }, "asin": "B09CMKSM4V" }, { "task_id": "ws_B0828WMRFX_6212", "instruction": "i am looking for a blue usb port cables", "target_attributes": { "attributes": [ "usb port" ], "options": [ "blue" ] }, "asin": "B0828WMRFX" }, { "task_id": "ws_B0982X1NJN_6213", "instruction": "i want a medium sized mini dress that is loose fit. it must be in navy blue color.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "navy blue", "medium" ] }, "asin": "B0982X1NJN" }, { "task_id": "ws_B07HQWQSHF_6214", "instruction": "i am looking for high resolution television", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B07HQWQSHF" }, { "task_id": "ws_B08W1GXSRS_6215", "instruction": "i'm looking for skin care for sensitive for men's scent citron and driftwood and coconut water.", "target_attributes": { "attributes": [ "non toxic", "natural ingredients", "sensitive skin" ], "options": [ "citron + driftwood and coconut water + sandalwood" ] }, "asin": "B08W1GXSRS" }, { "task_id": "ws_B08W1GXSRS_6216", "instruction": "i need men's non toxic deororizing body spray for sensitive skin. get the 2pack 3.4 ounce size.", "target_attributes": { "attributes": [ "non toxic", "sensitive skin" ], "options": [ "3.4 ounce (pack of 2)" ] }, "asin": "B08W1GXSRS" }, { "task_id": "ws_B010T6TQRW_6217", "instruction": "find me a yellow quick drying sarong wrap.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "yellow_ad412" ] }, "asin": "B010T6TQRW" }, { "task_id": "ws_B09K44ZHBG_6218", "instruction": "i am ordering best dad ever coach fleece throw with super soft features.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "best dad ever 3" ] }, "asin": "B09K44ZHBG" }, { "task_id": "ws_B07N3YYYQB_6219", "instruction": "i am looking for mini computer. it must have 16gb ram,512gd ssd hard disk and core i5 processor.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "16g ram 512g ssd 1tb hdd" ] }, "asin": "B07N3YYYQB" }, { "task_id": "ws_B07FMR71D7_6220", "instruction": "i'm looking for engineered wood for living room furniture. it was white finish color furniture.", "target_attributes": { "attributes": [ "white finish", "engineered wood" ], "options": [] }, "asin": "B07FMR71D7" }, { "task_id": "ws_B09S2RRH1W_6221", "instruction": "i buy a 3pcs natural hair", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "3pcs" ] }, "asin": "B09S2RRH1W" }, { "task_id": "ws_B07GTJ1B7J_6222", "instruction": "i am looking for a high definition filter set with carrying case. it should be easy to install.", "target_attributes": { "attributes": [ "easy install", "high definition", "carrying case" ], "options": [] }, "asin": "B07GTJ1B7J" }, { "task_id": "ws_B09NQ63BJV_6223", "instruction": "i'm looking for quality materials it was daily wear and need to buy it.", "target_attributes": { "attributes": [ "quality materials", "long sleeve", "daily wear" ], "options": [ "a4-colorful" ] }, "asin": "B09NQ63BJV" }, { "task_id": "ws_B004YG7LA8_6224", "instruction": "looking for yellow aaa battery in pack of 2", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [ "yellow", "2 pack" ] }, "asin": "B004YG7LA8" }, { "task_id": "ws_B09J8N49YH_6225", "instruction": "i need some colorful wall dividers to arrange my living room for a holiday.", "target_attributes": { "attributes": [ "assembly required", "living room" ], "options": [ "color15" ] }, "asin": "B09J8N49YH" }, { "task_id": "ws_B086PW7TWX_6226", "instruction": "i need some gourmet dining room curtains at around 52 inch width.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "52x90in" ] }, "asin": "B086PW7TWX" }, { "task_id": "ws_B00IJGQS30_6227", "instruction": "i'm looking for a blu ray dvd player with wifi support", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B00IJGQS30" }, { "task_id": "ws_B06XGBZQPY_6228", "instruction": "buy me a contemporary style tempered glass arm chair in white grey color.", "target_attributes": { "attributes": [ "contemporary style", "tempered glass" ], "options": [ "white gray", "armchair" ] }, "asin": "B06XGBZQPY" }, { "task_id": "ws_B09B9RHZ1K_6229", "instruction": "i'm looking for steel toe blue in color it was easy to use.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "blue" ] }, "asin": "B09B9RHZ1K" }, { "task_id": "ws_B09KBTRC6L_6230", "instruction": "i am looking for an easy install home office chair with lumbar support. i would prefer a grey colored one.", "target_attributes": { "attributes": [ "easy install", "lumbar support" ], "options": [ "grey" ] }, "asin": "B09KBTRC6L" }, { "task_id": "ws_B09KBTRC6L_6231", "instruction": "i want to find a yellow cle gaming chair that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "yellow", "cle" ] }, "asin": "B09KBTRC6L" }, { "task_id": "ws_B081TWKZMC_6232", "instruction": "i'm looking for a machine washable men's shorts made of nylon spandex stretchable fabric with imported zipper. also choose 32 sized dark ash colored one.", "target_attributes": { "attributes": [ "machine wash", "stretch fabric", "nylon spandex", "imported zipper" ], "options": [ "dark ash", "32" ] }, "asin": "B081TWKZMC" }, { "task_id": "ws_B08P4F727V_6233", "instruction": "i am looking for tv stand made of tempered glass that has fww color. and i would go for a size of 63\u201dwx17.7\u201d h x13.78\u201d d", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "fww", "63\u201dwx17.7\u201d h x13.78\u201d d" ] }, "asin": "B08P4F727V" }, { "task_id": "ws_B08P4F727V_6234", "instruction": "i am searching for a high gloss tv stand with additional storage space. also, choose an ob color.", "target_attributes": { "attributes": [ "high gloss", "storage space" ], "options": [ "ob" ] }, "asin": "B08P4F727V" }, { "task_id": "ws_B08P4F727V_6235", "instruction": "looking for high gloss storage space tv stand with led lights also choose colour black brown", "target_attributes": { "attributes": [ "high gloss", "storage space" ], "options": [ "brown black" ] }, "asin": "B08P4F727V" }, { "task_id": "ws_B085RCLWW3_6236", "instruction": "i am looking for large jar candles of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "large jar" ] }, "asin": "B085RCLWW3" }, { "task_id": "ws_B09922XCP2_6237", "instruction": "i am looking a white 1 posters & prints for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "white 1" ] }, "asin": "B09922XCP2" }, { "task_id": "ws_B09JZ84S8D_6238", "instruction": "i am looking for a creamy cellular shades for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "creamy" ] }, "asin": "B09JZ84S8D" }, { "task_id": "ws_B09JZ84S8D_6239", "instruction": "i need creamy shades for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "creamy" ] }, "asin": "B09JZ84S8D" }, { "task_id": "ws_B09G396CFQ_6240", "instruction": "i'm looking for spa stainless steel tool for hair salon.", "target_attributes": { "attributes": [ "stainless steel", "hair salon" ], "options": [ "grey" ] }, "asin": "B09G396CFQ" }, { "task_id": "ws_B09H6M5Q21_6241", "instruction": "i am looking for a super soft blankets & throws of 40\u201cx30 \" xsmall for pets.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "40\u201cx30 \" xsmall for pets" ] }, "asin": "B09H6M5Q21" }, { "task_id": "ws_B087LNDPNV_6242", "instruction": "i am looking for stainless steel grooming set", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B087LNDPNV" }, { "task_id": "ws_B08DCX4XGP_6243", "instruction": "i need daily wear white c large hoodie, which has a loose fit and made of polyester cotton.", "target_attributes": { "attributes": [ "loose fit", "polyester cotton", "daily wear" ], "options": [ "white c", "large" ] }, "asin": "B08DCX4XGP" }, { "task_id": "ws_B09BC6FBG9_6244", "instruction": "i am looking for a wireless portable bluetooth speakers", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09BC6FBG9" }, { "task_id": "ws_B06XRW3SYB_6245", "instruction": "i am looking for a 3x scrub bottoms for day comfort", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "3x" ] }, "asin": "B06XRW3SYB" }, { "task_id": "ws_B085LS1KZ7_6246", "instruction": "i am looking for a hairpiece made up of synthetic hair. also choose swedish blonde hair color one.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "r22 swedish blonde" ] }, "asin": "B085LS1KZ7" }, { "task_id": "ws_B09PHGZSC7_6247", "instruction": "i am in need of loose hip-hop blue color, x-large sized women's sweatpants that is fit for machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "blue", "x-large" ] }, "asin": "B09PHGZSC7" }, { "task_id": "ws_B099KD34N9_6248", "instruction": "i'm looking for natural ingredients for hair removal.", "target_attributes": { "attributes": [ "natural ingredients", "hair removal" ], "options": [] }, "asin": "B099KD34N9" }, { "task_id": "ws_B08P2RDV24_6249", "instruction": "i'm looking for a long lasting scented candles made of soy wax.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [] }, "asin": "B08P2RDV24" }, { "task_id": "ws_B0912VD9CH_6250", "instruction": "i need a gift set of gourmet collection spices & seasoning blends \u2013 hot & spicey collection.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "hot & spicey" ] }, "asin": "B0912VD9CH" }, { "task_id": "ws_B07XPFSCL3_6251", "instruction": "i'm looking for seed oil it was certified organic good for skin and flavor was organic peppermint.", "target_attributes": { "attributes": [ "certified organic", "seed oil" ], "options": [ "organic peppermint" ] }, "asin": "B07XPFSCL3" }, { "task_id": "ws_B082W4WNM7_6252", "instruction": "i'm looking for wheat color kitchen rugs it easy clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "wheat" ] }, "asin": "B082W4WNM7" }, { "task_id": "ws_B094P1NHW8_6253", "instruction": "i am looking for a high definition mirrorless digital camera with optical zoom.", "target_attributes": { "attributes": [ "high definition", "optical zoom" ], "options": [] }, "asin": "B094P1NHW8" }, { "task_id": "ws_B09SPXZF48_6254", "instruction": "show me a butt lifting tummy controlling high waisted green legging in medium size.", "target_attributes": { "attributes": [ "butt lifting", "tummy control", "high waist" ], "options": [ "z05 green", "medium" ] }, "asin": "B09SPXZF48" }, { "task_id": "ws_B08FMTLWH5_6255", "instruction": "in the tools & home improvement department, i am looking for matte black 24 inch vanity light using 14w led 3000k metal wall sconce (modern) that is easy to install, in the color of cool white 6000k.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [ "cool white 6000k" ] }, "asin": "B08FMTLWH5" }, { "task_id": "ws_B07BMLMXPP_6256", "instruction": "i'm looking for a real fruit bitters with zero sugar. also, choose a pack of 2 weights 32 ounce each with cranberry punch flavored one.", "target_attributes": { "attributes": [ "zero sugar", "real fruit" ], "options": [ "cranberry punch", "2pack - 32 ounce ea." ] }, "asin": "B07BMLMXPP" }, { "task_id": "ws_B07BMLMXPP_6257", "instruction": "i'm looking for margarita low sugared real fruit needed.", "target_attributes": { "attributes": [ "low sugar", "zero sugar", "real fruit" ], "options": [ "margarita" ] }, "asin": "B07BMLMXPP" }, { "task_id": "ws_B0861RQNRM_6258", "instruction": "i am looking for gluten free sesame edamame bean and nut snack mix in creole flavor, 1.25 ounce (pack of 18)", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "creole", "1.25 ounce (pack of 18)" ] }, "asin": "B0861RQNRM" }, { "task_id": "ws_B09BHZYWDG_6259", "instruction": "i am looking for tempered glass screen protector, color should be navy-n10", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "navy-n10" ] }, "asin": "B09BHZYWDG" }, { "task_id": "ws_B07XY4XNQW_6260", "instruction": "i am looking for a 1blue & 1green & 1orange with noaa | usb charger | usb cable | battery | lanyard color of two-way radios which is easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [ "3 or 4 pack" ] }, "asin": "B07XY4XNQW" }, { "task_id": "ws_B08223P86V_6261", "instruction": "i would like a medium sized blue windbreaker to keep me warm in the winter.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "blue", "medium" ] }, "asin": "B08223P86V" }, { "task_id": "ws_B08223P86V_6262", "instruction": "i need a red jacket that is quick drying and in an x-small.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "red", "x-small" ] }, "asin": "B08223P86V" }, { "task_id": "ws_B09PTBY841_6263", "instruction": "i am looking for a women's small long sleeve jumpsuit.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09PTBY841" }, { "task_id": "ws_B07TTC374M_6264", "instruction": "i'm looking for double sided hair extensions for hair care accessories.", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "#ba2 | 60" ] }, "asin": "B07TTC374M" }, { "task_id": "ws_B097PMDGCJ_6265", "instruction": "i am looking for a silver non slip hair clip for hair styling.", "target_attributes": { "attributes": [ "non slip", "hair styling" ], "options": [ "silver" ] }, "asin": "B097PMDGCJ" }, { "task_id": "ws_B075WXTQW8_6266", "instruction": "i'm looking for gluten free snack crackers in 4.25 ounce pack.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "4.25 ounce (pack of 1)" ] }, "asin": "B075WXTQW8" }, { "task_id": "ws_B097BBYP9G_6267", "instruction": "i am looking for 4 colors eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B097BBYP9G" }, { "task_id": "ws_B082WX621J_6268", "instruction": "i am looking for a high performance smart watch for unisex with water resistant. also choose 42mm face size and pearl white color.", "target_attributes": { "attributes": [ "water resistant", "high performance" ], "options": [ "pearl white", "42mm | 44mm | 45mm" ] }, "asin": "B082WX621J" }, { "task_id": "ws_B09B3NWZTV_6269", "instruction": "i'm looking for a hair roller for hair styling, it should be easy to use. also, choose 2.8 *2 inch pink colored one.", "target_attributes": { "attributes": [ "easy use", "hair styling" ], "options": [ "2.8x2inch-pink" ] }, "asin": "B09B3NWZTV" }, { "task_id": "ws_B09M64JZCL_6270", "instruction": "i am looking for a overall cover with tempered glass screen protector for my apple watch, preferably in rose gold color", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "rose gold | silver | midnight blue | clear" ] }, "asin": "B09M64JZCL" }, { "task_id": "ws_B07QGVJ9HV_6271", "instruction": "i need a high heeled sandals of 6.5 size for daily use . and please get me the gold-2 one", "target_attributes": { "attributes": [ "high heel" ], "options": [ "gold-2", "6.5" ] }, "asin": "B07QGVJ9HV" }, { "task_id": "ws_B09MTQBBZV_6272", "instruction": "i need to buy some gold cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 60" ] }, "asin": "B09MTQBBZV" }, { "task_id": "ws_B09MTQBBZV_6273", "instruction": "i would like a gold 35 cupcake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 35" ] }, "asin": "B09MTQBBZV" }, { "task_id": "ws_B09MTQBBZV_6274", "instruction": "i'm looking for pack of 24 happy 75th birthday party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "gold 15" ] }, "asin": "B09MTQBBZV" }, { "task_id": "ws_B09MTQBBZV_6275", "instruction": "i want to find gold cupcake toppers that i can use for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 70" ] }, "asin": "B09MTQBBZV" }, { "task_id": "ws_B0792KXFRV_6276", "instruction": "i looking a gluten free food and beverage gift pack for dinner party", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "dinner party" ] }, "asin": "B0792KXFRV" }, { "task_id": "ws_B07L738NLT_6277", "instruction": "i would like a pair of midnight green earbud headphones made of aluminum alloy.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "midnight green" ] }, "asin": "B07L738NLT" }, { "task_id": "ws_B092BYZSWK_6278", "instruction": "i am looking for a organic and gluten free almond nut butter with kosher certified. also choose chocolate favor and 4-pack size.", "target_attributes": { "attributes": [ "certified organic", "gluten free", "kosher certified" ], "options": [ "chocolate hazelnut", "4 pack" ] }, "asin": "B092BYZSWK" }, { "task_id": "ws_B01AR9V9HG_6279", "instruction": "i'm looking for furniture it was in living room the color was pastel blue.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "07.pastel_blue" ] }, "asin": "B01AR9V9HG" }, { "task_id": "ws_B01AR9V9HG_6280", "instruction": "i would like a 44 inch wide and 47 inch tall caramel roller shade for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "13.caramel", "w44 1 | 2 x h47 (inch)" ] }, "asin": "B01AR9V9HG" }, { "task_id": "ws_B06XP49SRM_6281", "instruction": "i would like a 3.5 ounce variety pack of pretzels that are nut free.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "variety pack (100 calorie)", "3.5 ounce (pack of 6)" ] }, "asin": "B06XP49SRM" }, { "task_id": "ws_B09G5WH3PR_6282", "instruction": "i am looking for a natural wood color floor lamps for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "natural wood color" ] }, "asin": "B09G5WH3PR" }, { "task_id": "ws_B09LHMWNW1_6283", "instruction": "i am looking for carplay ips touchscreen mirror link with 4 crore wifi 1g+16g", "target_attributes": { "attributes": [ "plug play" ], "options": [ "4 core wifi 1g+16g" ] }, "asin": "B09LHMWNW1" }, { "task_id": "ws_B08HH984SX_6284", "instruction": "i'm looking for green backdrop stand for digital photography", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "green" ] }, "asin": "B08HH984SX" }, { "task_id": "ws_B00FZGYP1O_6285", "instruction": "i want a pineapple flavor caffeine free soft drink size :67.6 fl oz", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "pineapple", "67.6 fl oz (pack of 1)" ] }, "asin": "B00FZGYP1O" }, { "task_id": "ws_B09KCMM4TP_6286", "instruction": "i am looking for a 2 bottle set of long lasting holographic glitter that is rose gold in color.", "target_attributes": { "attributes": [ "long lasting", "rose gold" ], "options": [ "#7 rose gold - (2 bottle)" ] }, "asin": "B09KCMM4TP" }, { "task_id": "ws_B000QDZ6KU_6287", "instruction": "i'm looking for soft sandal for habana oiled leather was fully used.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "habana oiled leather" ] }, "asin": "B000QDZ6KU" }, { "task_id": "ws_B000QDZ6KU_6288", "instruction": "i would like a pair of size 9.5 mocha sandals made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "mocha", "9-9.5" ] }, "asin": "B000QDZ6KU" }, { "task_id": "ws_B000QDZ6KU_6289", "instruction": "i'm looking for a pair of navy sandals for women that are made with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "navy" ] }, "asin": "B000QDZ6KU" }, { "task_id": "ws_B0983XCSRL_6290", "instruction": "i would like a pair of women's 7.5 black sandals with a open toe.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "p-black", "7.5" ] }, "asin": "B0983XCSRL" }, { "task_id": "ws_B06WWLNF9V_6291", "instruction": "i'm looking for lactose it made for sugar cup packets.", "target_attributes": { "attributes": [ "lactose free" ], "options": [] }, "asin": "B06WWLNF9V" }, { "task_id": "ws_B09STB36TK_6292", "instruction": "i am looking for a red slim fit robes for men.", "target_attributes": { "attributes": [ "slim fit" ], "options": [] }, "asin": "B09STB36TK" }, { "task_id": "ws_B07TNYSSM5_6293", "instruction": "i am looking for high speed video cable easy use multicolored size:10ft", "target_attributes": { "attributes": [ "high speed", "easy use" ], "options": [ "multicolored", "10ft" ] }, "asin": "B07TNYSSM5" }, { "task_id": "ws_B01NAW0D7B_6294", "instruction": "i am looking for a medium - large polyester cotton t shirts for men", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [] }, "asin": "B01NAW0D7B" }, { "task_id": "ws_B07CXJNH2S_6295", "instruction": "i am looking for a water resistant & carrying case bags, cases & sleeves of purple color.", "target_attributes": { "attributes": [ "water resistant", "carrying case" ], "options": [ "purple" ] }, "asin": "B07CXJNH2S" }, { "task_id": "ws_B09PV119JX_6296", "instruction": "i need a light weight and high resolution background photo for my studio. it should be in a12 color.", "target_attributes": { "attributes": [ "light weight", "high resolution" ], "options": [ "a12" ] }, "asin": "B09PV119JX" }, { "task_id": "ws_B07NDKPK27_6297", "instruction": "i would like a bag of a bpa free bacon snack.", "target_attributes": { "attributes": [ "bpa free" ], "options": [] }, "asin": "B07NDKPK27" }, { "task_id": "ws_B08JCK2419_6298", "instruction": "i want to buy some long lasting black nail polish.", "target_attributes": { "attributes": [ "long lasting", "nail polish" ], "options": [ "black" ] }, "asin": "B08JCK2419" }, { "task_id": "ws_B09RWKDMQJ_6299", "instruction": "i am hair cutting tool hair clipper accessories color :silver head", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "silver head" ] }, "asin": "B09RWKDMQJ" }, { "task_id": "ws_B09PYD8R4Z_6300", "instruction": "i would like a football temporary tattoo that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "football" ] }, "asin": "B09PYD8R4Z" }, { "task_id": "ws_B09PYD8R4Z_6301", "instruction": "i am looking for a non toxic green color temporary tattoos.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B09PYD8R4Z" }, { "task_id": "ws_B07SKT8TVB_6302", "instruction": "i am looking for 18 inch women synthetic hair extension of 8 packs.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "18 inch,8packs" ] }, "asin": "B07SKT8TVB" }, { "task_id": "ws_B07XD7KP9K_6303", "instruction": "i'm looking for home decor products and its for dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "rvw6200" ] }, "asin": "B07XD7KP9K" }, { "task_id": "ws_B017701FUE_6304", "instruction": "i'm looking for queen horizontal sized beds that wood framed structure .", "target_attributes": { "attributes": [ "queen size", "wood frame" ], "options": [ "queen - horizontal" ] }, "asin": "B017701FUE" }, { "task_id": "ws_B097F9KY3B_6305", "instruction": "i'm looking for made cup cakes for birthaday parteis.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "black&pink" ] }, "asin": "B097F9KY3B" }, { "task_id": "ws_B095HFMY55_6306", "instruction": "i'm looking for made a cookies for birthday parties.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B095HFMY55" }, { "task_id": "ws_B07JM8PKWW_6307", "instruction": "i'm looking for vanty lights for bathroom fixtures.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "39.37in" ] }, "asin": "B07JM8PKWW" }, { "task_id": "ws_B07VD9SQRC_6308", "instruction": "i would like some gluten free rice flour.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07VD9SQRC" }, { "task_id": "ws_B0199TEKPS_6309", "instruction": "can i get arm & hammer ultramax anti-perspirant deodorant with fresh scent", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "fresh" ] }, "asin": "B0199TEKPS" }, { "task_id": "ws_B0166LGNWU_6310", "instruction": "i'm looking for a 6-pack of certified organic herbal mint cool-refresh tea and it should be caffeine-free.", "target_attributes": { "attributes": [ "caffeine free", "certified organic" ], "options": [ "organic herbal mint cool-refresh tea (decaf)", "6-pack (150 tea bags)" ] }, "asin": "B0166LGNWU" }, { "task_id": "ws_B0166LGNWU_6311", "instruction": "i am looking for 100 count (pack of 4) tea bags that are caffeine free.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "100 count (pack of 4)" ] }, "asin": "B0166LGNWU" }, { "task_id": "ws_B07MHLL27V_6312", "instruction": "i need a pair of stainless hair cutting shears that is 6 inches and black in color.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [ "c-6.0 inch-black" ] }, "asin": "B07MHLL27V" }, { "task_id": "ws_B07R71K9F2_6313", "instruction": "i'm looking for clothing for women's for classic fit and needle sleeve need to buy it.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit" ], "options": [ "neon pink" ] }, "asin": "B07R71K9F2" }, { "task_id": "ws_B09RMSZDN2_6314", "instruction": "i need a closed toe khakhi sandal with ankle straps in size 10", "target_attributes": { "attributes": [ "closed toe", "ankle strap" ], "options": [ "khaki", "10" ] }, "asin": "B09RMSZDN2" }, { "task_id": "ws_B09NNB7Z41_6315", "instruction": "please add to my list baby boy silver cupcake picks for my son\u2019s birthday party.", "target_attributes": { "attributes": [ "birthday party", "cupcake picks" ], "options": [ "boy silver" ] }, "asin": "B09NNB7Z41" }, { "task_id": "ws_B07TGBYGL3_6316", "instruction": "i'm looking for a actloe women hoodie sweatshirt .", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "coffee", "large" ] }, "asin": "B07TGBYGL3" }, { "task_id": "ws_B084KTYG3M_6317", "instruction": "i am looking for a console table made up of wooden frame for living room. also choose espresso one.", "target_attributes": { "attributes": [ "wood frame", "living room" ], "options": [ "espresso" ] }, "asin": "B084KTYG3M" }, { "task_id": "ws_B07Y4V5XGS_6318", "instruction": "i want 18\" high quality hair extensions made with natural hair in color 882.", "target_attributes": { "attributes": [ "high quality", "hair extensions", "natural hair" ], "options": [ "882", "18\"" ] }, "asin": "B07Y4V5XGS" }, { "task_id": "ws_B09MW3C834_6319", "instruction": "i'm searching for purple color toppers to decorate the birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "purple" ] }, "asin": "B09MW3C834" }, { "task_id": "ws_B094DRJ1FP_6320", "instruction": "i need gluten free pizza with a soft centre and crispy edges.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B094DRJ1FP" }, { "task_id": "ws_B01IQGHBVK_6321", "instruction": "i'm looking for engineered wood that need to white finish furniture.", "target_attributes": { "attributes": [ "white finish", "engineered wood" ], "options": [] }, "asin": "B01IQGHBVK" }, { "task_id": "ws_B01IQGHBVK_6322", "instruction": "i want a queen panel bed in white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B01IQGHBVK" }, { "task_id": "ws_B09FGSQYLQ_6323", "instruction": "i'm looking for a hands free navigation system for my car, about 2+32 big and it should have 8 cores.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "8 core", "2+32" ] }, "asin": "B09FGSQYLQ" }, { "task_id": "ws_B08YGLDT3K_6324", "instruction": "i am looking for permanent hair color with natural ingredients and color: funky yellow (2 pack)", "target_attributes": { "attributes": [ "natural ingredients", "permanent hair" ], "options": [ "funky yellow (2 pack)" ] }, "asin": "B08YGLDT3K" }, { "task_id": "ws_B08SHLSN55_6325", "instruction": "i needed a 5-case gluten free multigrain table crackers.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B08SHLSN55" }, { "task_id": "ws_B09GLQFSXG_6326", "instruction": "i would like a twin sized espresso bed that is made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "espresso", "twin over twin" ] }, "asin": "B09GLQFSXG" }, { "task_id": "ws_B079CH6STL_6327", "instruction": "i'm looking for clothing for classic fit and needle and color was navy.", "target_attributes": { "attributes": [ "machine wash", "needle sleeve", "classic fit" ], "options": [ "navy" ] }, "asin": "B079CH6STL" }, { "task_id": "ws_B0834QQR5F_6328", "instruction": "i am looking for a electric pink zebra mules & clogs of ethylene vinyl.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "electric pink zebra" ] }, "asin": "B0834QQR5F" }, { "task_id": "ws_B083JN9J8M_6329", "instruction": "am looking for a non-alcoholic spirit that comes in a bottle size of 750ml made by the monday company called zero alcohol gin that should be found in the grocery & gourmet food department.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [] }, "asin": "B083JN9J8M" }, { "task_id": "ws_B094VSVPZV_6330", "instruction": "i am looking for a 48 piece nautical themed cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B094VSVPZV" }, { "task_id": "ws_B073HGKQDC_6331", "instruction": "i am looking for a 2'6\" x 14' area rugs for living rooms.", "target_attributes": { "attributes": [ "living room" ], "options": [ "2'6\" x 14'" ] }, "asin": "B073HGKQDC" }, { "task_id": "ws_B09NM62G51_6332", "instruction": "i'm looking for furnitures for kitchen dinning room the color need to buy pu-red brown.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "pu- red brown" ] }, "asin": "B09NM62G51" }, { "task_id": "ws_B09NM62G51_6333", "instruction": "i want easy assemble non slip button tufted bar stool color velvet -white", "target_attributes": { "attributes": [ "button tufted", "non slip", "easy assemble" ], "options": [ "velvet- white" ] }, "asin": "B09NM62G51" }, { "task_id": "ws_B093GSXWLK_6334", "instruction": "i would like a black bottle of nail polish with elastic bands.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "black | purple", "with elastic bands" ] }, "asin": "B093GSXWLK" }, { "task_id": "ws_B09FQ8CC79_6335", "instruction": "i am looking or grey throw for couch sofa with machine washable feature.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "grey | white" ] }, "asin": "B09FQ8CC79" }, { "task_id": "ws_B09LMNKRKX_6336", "instruction": "i would like a 8 pack of almond butter dates that are ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "almond butter dates", "8 pack" ] }, "asin": "B09LMNKRKX" }, { "task_id": "ws_B07N8RRPT1_6337", "instruction": "i am looking for a white coffee tables with nickel finish.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "white" ] }, "asin": "B07N8RRPT1" }, { "task_id": "ws_B07FKB9LPH_6338", "instruction": "i need multicolored hair bands that are non toxic.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "b-color" ] }, "asin": "B07FKB9LPH" }, { "task_id": "ws_B004QGG45E_6339", "instruction": "i'm looking for shoes for women's sandals and want to buy a black color.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "black" ] }, "asin": "B004QGG45E" }, { "task_id": "ws_B004QGG45E_6340", "instruction": "i'm looking for a slip resistant women clog with 9.5 in dark brown suede", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "dark brown suede flower", "9.5 wide" ] }, "asin": "B004QGG45E" }, { "task_id": "ws_B004QGG45E_6341", "instruction": "i'm looking for modern design shoes with additional features.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "luggage leop" ] }, "asin": "B004QGG45E" }, { "task_id": "ws_B09CQ8VNM6_6342", "instruction": "i need some grey and white, easy to clean collapsible storage bins in a four pack.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "grey & white", "4-pack" ] }, "asin": "B09CQ8VNM6" }, { "task_id": "ws_B09H6YC788_6343", "instruction": "i am looking for a long lasting hair extensions for natural hair. also choose 30# color and 14inch (pack 7) one.", "target_attributes": { "attributes": [ "long lasting", "hair extensions", "natural hair" ], "options": [ "30#", "14 inch (pack of 7)" ] }, "asin": "B09H6YC788" }, { "task_id": "ws_B07PQDFMWR_6344", "instruction": "i'm looking for a hyaluronic acid eye cream for dark circles.", "target_attributes": { "attributes": [ "hyaluronic acid", "dark circles" ], "options": [] }, "asin": "B07PQDFMWR" }, { "task_id": "ws_B095JV88NJ_6345", "instruction": "i am looking for a c type super fast charger for my samsung galaxy s21 mobile", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B095JV88NJ" }, { "task_id": "ws_B09SFD5HSG_6346", "instruction": "i am looking for a rose gold cartridges & refills for hair salon", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "rose gold" ] }, "asin": "B09SFD5HSG" }, { "task_id": "ws_B002GD3FU6_6347", "instruction": "i am interested in nut free bridal shower candy sticks, it should be low in calories and preferably be wrapped in individually.", "target_attributes": { "attributes": [ "nut free", "individually wrapped" ], "options": [] }, "asin": "B002GD3FU6" }, { "task_id": "ws_B07GCHXPDW_6348", "instruction": "i need a 5ft black color high speed usb 3.0 extension cable, a-male to a-female for usb flash drive", "target_attributes": { "attributes": [ "high speed" ], "options": [ "black", "5ft" ] }, "asin": "B07GCHXPDW" }, { "task_id": "ws_B089SQZ4S3_6349", "instruction": "i need eco friendly curtains that are 52\" by 45\"", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "1 piece, 52\"x45\"" ] }, "asin": "B089SQZ4S3" }, { "task_id": "ws_B088K6SFZ1_6350", "instruction": "iam looking for a grey-grey tempered glass conversation sets", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "grey-grey" ] }, "asin": "B088K6SFZ1" }, { "task_id": "ws_B009F646EQ_6351", "instruction": "i am looking for a teeth whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B009F646EQ" }, { "task_id": "ws_B08R1VZQ9D_6352", "instruction": "i am looking for 16 inch long synthetic hair extensions for women.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "16 inch (pack of 1)" ] }, "asin": "B08R1VZQ9D" }, { "task_id": "ws_B08R1VZQ9D_6353", "instruction": "i'm interested in one pack of 20-inch hair extensions that are easy to apply.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "black brown", "20 inch (pack of 1)" ] }, "asin": "B08R1VZQ9D" }, { "task_id": "ws_B09H3C1PHX_6354", "instruction": "i looking for a pepper flavor rich creamy protein serving 36 oz peanut", "target_attributes": { "attributes": [ "rich creamy", "protein serving" ], "options": [ "pepper", "36oz" ] }, "asin": "B09H3C1PHX" }, { "task_id": "ws_B08RJG4QGB_6355", "instruction": "help me buy a fog colored shoe with arch support and rubber sole in 12 size.", "target_attributes": { "attributes": [ "arch support", "rubber sole" ], "options": [ "fog", "12" ] }, "asin": "B08RJG4QGB" }, { "task_id": "ws_B07NSCNHSS_6356", "instruction": "i need natural hair wig in lighter red color", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "lighter red" ] }, "asin": "B07NSCNHSS" }, { "task_id": "ws_B07L3YMPPK_6357", "instruction": "i am looking for a black slip lasting walking shoes.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "black" ] }, "asin": "B07L3YMPPK" }, { "task_id": "ws_B08BX7FV5L_6358", "instruction": "i'm looking for hd tablets for style with keyboard-case and microsoft the color was black it was comes from long lasting.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "black", "with keyboard-case & microsoft 365" ] }, "asin": "B08BX7FV5L" }, { "task_id": "ws_B09P1K6P4S_6359", "instruction": "i would like a men's medium classic fit t-shirt in slate gray.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "slate", "men", "medium" ] }, "asin": "B09P1K6P4S" }, { "task_id": "ws_B084NVDFXZ_6360", "instruction": "i'm looking for a phocus caffeinated sparkling water .", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "yuzu & lime", "11.5 fl oz (pack of 12)" ] }, "asin": "B084NVDFXZ" }, { "task_id": "ws_B086MYGX4C_6361", "instruction": "i'm looking for a cactus cupcake toppers for birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B086MYGX4C" }, { "task_id": "ws_B06Y2ML7LG_6362", "instruction": "i'm looking for a rosehip seed oil for face and skin by kate blanc.", "target_attributes": { "attributes": [ "certified organic", "seed oil", "hair growth" ], "options": [ "4 fl oz (pack of 1)" ] }, "asin": "B06Y2ML7LG" }, { "task_id": "ws_B082SVDL5K_6363", "instruction": "i need a easy to use plug and play, power amplifier with bluetooth connectivity.", "target_attributes": { "attributes": [ "power amplifier", "plug play", "easy use" ], "options": [] }, "asin": "B082SVDL5K" }, { "task_id": "ws_B094FZ6R3J_6364", "instruction": "i'm shopping for memory foam slippers with a rubber sole in a moonlight blue colour.", "target_attributes": { "attributes": [ "memory foam", "rubber sole" ], "options": [ "moonlight" ] }, "asin": "B094FZ6R3J" }, { "task_id": "ws_B07R715F4Z_6365", "instruction": "i want a non slip futon mattress that is in 1.8x2m queen size.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "1.8x2m bed" ] }, "asin": "B07R715F4Z" }, { "task_id": "ws_B09HBS38K4_6366", "instruction": "i need to buy a long sleeve sweatshirt in red. look for a size small.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "red", "small" ] }, "asin": "B09HBS38K4" }, { "task_id": "ws_B09Q5YQXL2_6367", "instruction": "i would like a blue nasal spray that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "blue" ] }, "asin": "B09Q5YQXL2" }, { "task_id": "ws_B07Z8G98LT_6368", "instruction": "i want x- large tall machine wash short sleeve t- shirt for men color:ash plum 554/black", "target_attributes": { "attributes": [ "machine wash", "short sleeve" ], "options": [ "ash plum (554) | black", "x-large tall" ] }, "asin": "B07Z8G98LT" }, { "task_id": "ws_B09ND52DTH_6369", "instruction": "i am looking for a black winter warm fleece lined hiking boots", "target_attributes": { "attributes": [ "winter warm", "fleece lined" ], "options": [ "black" ] }, "asin": "B09ND52DTH" }, { "task_id": "ws_B078N4Q4FB_6370", "instruction": "i am looking for a twin xl twin size mattresses.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "twin xl size" ] }, "asin": "B078N4Q4FB" }, { "task_id": "ws_B08R3G2KH7_6371", "instruction": "i am searching for a 4g lte signal booster. it should be easy to install.", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [] }, "asin": "B08R3G2KH7" }, { "task_id": "ws_B07HMDVMFP_6372", "instruction": "i am looking for a easy to use and long lasting audio recorded it should be voice activated and have a date and time stamp option.", "target_attributes": { "attributes": [ "long lasting", "easy use" ], "options": [] }, "asin": "B07HMDVMFP" }, { "task_id": "ws_B09NFG5266_6373", "instruction": "i have an order for an android tablet 8 inches, 2gb ram, 32gb rom, quad core and in green color. i await your return.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "green" ] }, "asin": "B09NFG5266" }, { "task_id": "ws_B09SZJJT9X_6374", "instruction": "i am looking for home theater projector with high resolution and 1080p hd", "target_attributes": { "attributes": [ "1080p hd", "high resolution" ], "options": [] }, "asin": "B09SZJJT9X" }, { "task_id": "ws_B09DSQ2LYX_6375", "instruction": "i need a pink desk with lamp. it should be height adjustable and have storage space.", "target_attributes": { "attributes": [ "height adjustable", "storage space" ], "options": [ "pink with lamp" ] }, "asin": "B09DSQ2LYX" }, { "task_id": "ws_B08S48K2RB_6376", "instruction": "i am looking for hdmi cables high speed in 50 feet", "target_attributes": { "attributes": [ "high speed" ], "options": [ "50 feet" ] }, "asin": "B08S48K2RB" }, { "task_id": "ws_B09GVJ6N38_6377", "instruction": "i'm looking for plug play for camera electronics to the video and it will buy it.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "m100s 4core 1+16g" ] }, "asin": "B09GVJ6N38" }, { "task_id": "ws_B09LV71VNN_6378", "instruction": "i'm looking for dinning room for kitchen need to buy it.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "scenery-landscape-forest-tree--(28)" ] }, "asin": "B09LV71VNN" }, { "task_id": "ws_B00T2JY6MS_6379", "instruction": "i'm looking for electric kick scooter a water resistant.", "target_attributes": { "attributes": [ "output protection", "water resistant" ], "options": [] }, "asin": "B00T2JY6MS" }, { "task_id": "ws_B00T2JY6MS_6380", "instruction": "i want a water proof upbright ac/dc adapter compatible with segway ninebot.", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B00T2JY6MS" }, { "task_id": "ws_B00T2JY6MS_6381", "instruction": "i want a water resistant upbright ac/dc adapter compatible with segway ninebot.", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B00T2JY6MS" }, { "task_id": "ws_B0861MPK17_6382", "instruction": "i'm looking for a remote control replacement for a blu-ray player that's compatible with bdp-s3700.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B0861MPK17" }, { "task_id": "ws_B0861MPK17_6383", "instruction": "i am looking for a remote control for my blu ray player.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B0861MPK17" }, { "task_id": "ws_B07B6FFJMG_6384", "instruction": "i want to buy some cashew almond flavored chocolate covered gluten-free bars.", "target_attributes": { "attributes": [ "chocolate covered", "gluten free" ], "options": [ "cashew almond" ] }, "asin": "B07B6FFJMG" }, { "task_id": "ws_B07XSHZMMK_6385", "instruction": "find me a 2pcs of human hair with high quality in brown black color", "target_attributes": { "attributes": [ "high quality" ], "options": [ "brown black", "2pcs human hair" ] }, "asin": "B07XSHZMMK" }, { "task_id": "ws_B08HM9Y6V7_6386", "instruction": "i'm looking for gluten free it has contains high protein.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "9" ] }, "asin": "B08HM9Y6V7" }, { "task_id": "ws_B002U58PRI_6387", "instruction": "i am looking for a kiwi strawberry flavored sports drink with zero sugar.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "kiwi strawberry" ] }, "asin": "B002U58PRI" }, { "task_id": "ws_B08539BRBX_6388", "instruction": "find me a plant based body scrub to remove dead skin and which contains argon oil in toasted coconut coffee scent.", "target_attributes": { "attributes": [ "plant based", "argan oil", "dead skin" ], "options": [ "toasted coconut coffee" ] }, "asin": "B08539BRBX" }, { "task_id": "ws_B01HIRQ93Y_6389", "instruction": "i am searching for travel size quality fragrance oil for women, 0.34 ounce", "target_attributes": { "attributes": [ "travel size" ], "options": [ "0.34 ounce" ] }, "asin": "B01HIRQ93Y" }, { "task_id": "ws_B01HIRQ93Y_6390", "instruction": "i am looking for a travel size of quality fragrance oils in the scent named creed vanisia impression.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "creed vanisia impression" ] }, "asin": "B01HIRQ93Y" }, { "task_id": "ws_B01HIRQ93Y_6391", "instruction": "i am looking for long lasting women's fragrance oil of 0.34 ounce size.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "0.34 ounce" ] }, "asin": "B01HIRQ93Y" }, { "task_id": "ws_B075LRR7YG_6392", "instruction": "i'm looking for a waterloo naturally flavored sparkling water.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "original | black cherry | lemon-lime" ] }, "asin": "B075LRR7YG" }, { "task_id": "ws_B08ZHTWZF3_6393", "instruction": "i'm looking for king sized bed pillows that contains pink color.", "target_attributes": { "attributes": [ "king size" ], "options": [ "pink" ] }, "asin": "B08ZHTWZF3" }, { "task_id": "ws_B09PG91G27_6394", "instruction": "i'm looking for home decor products for living room and it can gives nice look.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52x90inx2" ] }, "asin": "B09PG91G27" }, { "task_id": "ws_B08RRZ2F57_6395", "instruction": "i'm looking for light weight headset it was outside of noise cancelling.", "target_attributes": { "attributes": [ "noise cancelling", "light weight" ], "options": [ "dual-usb c" ] }, "asin": "B08RRZ2F57" }, { "task_id": "ws_B096DMJDDW_6396", "instruction": "i'm looking for birthday cakes with superhero theme that is perfect for kids' birthday party.", "target_attributes": { "attributes": [ "birthday cake", "birthday party" ], "options": [] }, "asin": "B096DMJDDW" }, { "task_id": "ws_B08YMT7L52_6397", "instruction": "i'm looking for cosmetic high quality accessories and it will use for cosmetic bags.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "cool sunglass cat" ] }, "asin": "B08YMT7L52" }, { "task_id": "ws_B099N4P4D2_6398", "instruction": "i would like to buy a wallet case for my samsung s21 phone. i would like it to support wireless charging and in the color brown", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "brown" ] }, "asin": "B099N4P4D2" }, { "task_id": "ws_B003MQR9F8_6399", "instruction": "i'm looking for grocery for fat free.", "target_attributes": { "attributes": [ "fat free", "low fat" ], "options": [] }, "asin": "B003MQR9F8" }, { "task_id": "ws_B093T5WWL8_6400", "instruction": "i want a laundry bag for my blouse and hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093T5WWL8" }, { "task_id": "ws_B07535FBKX_6401", "instruction": "a men's closed toe rubber sole sandle size:11", "target_attributes": { "attributes": [ "closed toe", "rubber sole" ], "options": [ "11" ] }, "asin": "B07535FBKX" }, { "task_id": "ws_B093GGRKHS_6402", "instruction": "i am looking for skin care in hyaluronic acid", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [] }, "asin": "B093GGRKHS" }, { "task_id": "ws_B0742KPKZD_6403", "instruction": "i looking flavor syrups french vanilla flavour bpa free non gmo gluten free size 33.8 fl oz", "target_attributes": { "attributes": [ "bpa free", "non gmo", "gluten free" ], "options": [ "french vanilla", "33.8 fl oz (pack of 1)" ] }, "asin": "B0742KPKZD" }, { "task_id": "ws_B01N4MCED7_6404", "instruction": "i'm looking for a hot sauce gift set with the flavor lazy ass.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "lazy ass" ] }, "asin": "B01N4MCED7" }, { "task_id": "ws_B07MJVB31T_6405", "instruction": "i am looking for a perfect valentine gifting cake containing natural holiday flavor ingredients in 48 count size.", "target_attributes": { "attributes": [ "natural ingredients", "valentine day", "perfect gift" ], "options": [ "holiday flavors" ] }, "asin": "B07MJVB31T" }, { "task_id": "ws_B07FSGV3V2_6406", "instruction": "i'm looking for buy a binocular for bird watching.", "target_attributes": { "attributes": [ "easy carry", "bird watching" ], "options": [ "12x50mm" ] }, "asin": "B07FSGV3V2" }, { "task_id": "ws_B09BD7DJ55_6407", "instruction": "i need super king plus 120x120 (3pc duvet set) silver color silk decorative super soft pillow covers", "target_attributes": { "attributes": [ "super soft" ], "options": [ "silver", "super king plus 120x120 (3pc duvet set)" ] }, "asin": "B09BD7DJ55" }, { "task_id": "ws_B09BD7DJ55_6408", "instruction": "i want silver and super soft european pillow shams.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "silver" ] }, "asin": "B09BD7DJ55" }, { "task_id": "ws_B09DVFZYKL_6409", "instruction": "i want anti slip tennis shoes with rubber soles in size 13. it is for a man.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "15.5 women | 13 men" ] }, "asin": "B09DVFZYKL" }, { "task_id": "ws_B002F3QYZA_6410", "instruction": "i am looking for oil free toner", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B002F3QYZA" }, { "task_id": "ws_B01HHRRDTO_6411", "instruction": "i am looking for multi purpose for face in charcoal", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "charcoal" ] }, "asin": "B01HHRRDTO" }, { "task_id": "ws_B098SMFB4Y_6412", "instruction": "i need a pair of black eyebrow trimmers.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "black" ] }, "asin": "B098SMFB4Y" }, { "task_id": "ws_B07HB8F4XF_6413", "instruction": "i'm looking for a fruit snacks that is free from gluten and fat, also made of real fruits.", "target_attributes": { "attributes": [ "fat free", "gluten free", "real fruit" ], "options": [] }, "asin": "B07HB8F4XF" }, { "task_id": "ws_B07DFSHP3J_6414", "instruction": "i am looking for relaxed fit women clogs of size 13.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "13 women | 13 men" ] }, "asin": "B07DFSHP3J" }, { "task_id": "ws_B09984KFL2_6415", "instruction": "i want to buy a bundle of peanut butter cups for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B09984KFL2" }, { "task_id": "ws_B09Q8XK81W_6416", "instruction": "i need butt lifting yoga pants that also has a high waist. pick a blue one.", "target_attributes": { "attributes": [ "butt lifting", "high waist" ], "options": [ "blue" ] }, "asin": "B09Q8XK81W" }, { "task_id": "ws_B07J9K68QK_6417", "instruction": "i need some baby food that is non gmo and has no artificial flavors.", "target_attributes": { "attributes": [ "non gmo", "artificial flavors" ], "options": [] }, "asin": "B07J9K68QK" }, { "task_id": "ws_B09LC171P8_6418", "instruction": "i'm looking for wireless bluetooth and it will easy to use.", "target_attributes": { "attributes": [ "easy use", "wireless bluetooth" ], "options": [] }, "asin": "B09LC171P8" }, { "task_id": "ws_B07QYGZ5WC_6419", "instruction": "i looking heathers cotton machine wash men's classic fit x-large heater grey color t-shirt", "target_attributes": { "attributes": [ "machine wash", "heathers cotton", "classic fit" ], "options": [ "heather grey", "men", "x-large" ] }, "asin": "B07QYGZ5WC" }, { "task_id": "ws_B07FKHP9HQ_6420", "instruction": "i am looking for 4g lte android phone. please choose silver color.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "silver" ] }, "asin": "B07FKHP9HQ" }, { "task_id": "ws_B081FBJ25N_6421", "instruction": "i am looking for a tempered glass of basic cases for iphone 11 pro", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "iphone 11 pro" ] }, "asin": "B081FBJ25N" }, { "task_id": "ws_B07D3PD31P_6422", "instruction": "help me purchase black wireless headphones with high definition audio and quality stereo sound.", "target_attributes": { "attributes": [ "high definition", "stereo sound" ], "options": [ "black" ] }, "asin": "B07D3PD31P" }, { "task_id": "ws_B07BXWR3NJ_6423", "instruction": "i'm looking for a light weight backdrop with high resolution image for digital photography. also, choose 7*5 ft one.", "target_attributes": { "attributes": [ "light weight", "high resolution", "digital photography" ], "options": [ "7x5ft" ] }, "asin": "B07BXWR3NJ" }, { "task_id": "ws_B08VJJBX1L_6424", "instruction": "i need a valentine's day candy box", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B08VJJBX1L" }, { "task_id": "ws_B07K7HZ5BD_6425", "instruction": "find me a makeup case for travel, need to be easy to carry and choose the marble black color", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "marble black" ] }, "asin": "B07K7HZ5BD" }, { "task_id": "ws_B07L581MNW_6426", "instruction": "i want high quality hair extensions that is 26 inches long.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "26 inch" ] }, "asin": "B07L581MNW" }, { "task_id": "ws_B07L581MNW_6427", "instruction": "i am looking for sandy blonde extensions for my hair that are 24 inches long.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "sandy blonde & bleach blonde | curly", "24 inch (pack of 1)" ] }, "asin": "B07L581MNW" }, { "task_id": "ws_B08BS13S6M_6428", "instruction": "women's slip on sneakers that size 5.5", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "5.5" ] }, "asin": "B08BS13S6M" }, { "task_id": "ws_B09MSL36VK_6429", "instruction": "i am looking for high definition and clear tempered glass for iphone.", "target_attributes": { "attributes": [ "high definition", "tempered glass" ], "options": [ "clear" ] }, "asin": "B09MSL36VK" }, { "task_id": "ws_B07ZTTZP5N_6430", "instruction": "i am looking for a low sugar, non gmo seaweed snacks of 1.13 ounce (pack of 6) size.", "target_attributes": { "attributes": [ "low sugar", "non gmo" ], "options": [ "1.13 ounce (pack of 6)" ] }, "asin": "B07ZTTZP5N" }, { "task_id": "ws_B018GXGSBW_6431", "instruction": "i am looking for long lasting high definition dark cocoa concealer for dark circles coverage.", "target_attributes": { "attributes": [ "long lasting", "dark circles" ], "options": [ "dark cocoa" ] }, "asin": "B018GXGSBW" }, { "task_id": "ws_B08SHLLTVH_6432", "instruction": "i'm looking for steel toes shoes for construction working the color was black.", "target_attributes": { "attributes": [ "non slip", "steel toe" ], "options": [ "616black" ] }, "asin": "B08SHLLTVH" }, { "task_id": "ws_B07ZG4WNPM_6433", "instruction": "i'm looking for a perfect gifts that contains high protein preferably nuts . also choose a pack of 4 weights 7 ounce with savory flavored one.", "target_attributes": { "attributes": [ "high protein", "perfect gift" ], "options": [ "savory", "7 ounce (pack of 4)" ] }, "asin": "B07ZG4WNPM" }, { "task_id": "ws_B004HO58L6_6434", "instruction": "i'm looking for finepix 14 mp digital camera with optical zoom len, also purple one.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "purple" ] }, "asin": "B004HO58L6" }, { "task_id": "ws_B08MJ86NTG_6435", "instruction": "i'm looking for a medium floral long sleeve shirt in purple", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "b purple", "medium" ] }, "asin": "B08MJ86NTG" }, { "task_id": "ws_B0861CRGQV_6436", "instruction": "i am looking for individually wrapped cakes for a birthday party.", "target_attributes": { "attributes": [ "individually wrapped", "birthday party" ], "options": [] }, "asin": "B0861CRGQV" }, { "task_id": "ws_B07YJ9Z8Z5_6437", "instruction": "i am looking for a gluten free musk melon drink.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "musk melon" ] }, "asin": "B07YJ9Z8Z5" }, { "task_id": "ws_B09PNL7JRN_6438", "instruction": "i am looking for ladies large size black06 colored jeans with straight leg fit.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "black06", "large" ] }, "asin": "B09PNL7JRN" }, { "task_id": "ws_B08N9QCM2F_6439", "instruction": "i am looking for a leakproof travel bottle . and i choose the one with keychain", "target_attributes": { "attributes": [ "travel bottles" ], "options": [] }, "asin": "B08N9QCM2F" }, { "task_id": "ws_B08NSYTYNX_6440", "instruction": "order for me cupcake toppers decorations for celebrating a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B08NSYTYNX" }, { "task_id": "ws_B07PLPRNMS_6441", "instruction": "i am looking for a 10.5 size non slip flip-flops", "target_attributes": { "attributes": [ "non slip" ], "options": [ "10.5" ] }, "asin": "B07PLPRNMS" }, { "task_id": "ws_B09DCN6S39_6442", "instruction": "metal pendant light that is height adjustable also choose in metal", "target_attributes": { "attributes": [ "height adjustable", "pendant light" ], "options": [ "metal" ] }, "asin": "B09DCN6S39" }, { "task_id": "ws_B082XVWW57_6443", "instruction": "i'm looking for women's clothing for classic fit and needle fit.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit" ], "options": [ "white" ] }, "asin": "B082XVWW57" }, { "task_id": "ws_B09T1MR8ZZ_6444", "instruction": "i want sweet and salty mini popcorn balls that are nut and gluten free.", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [] }, "asin": "B09T1MR8ZZ" }, { "task_id": "ws_B08HQXX3C4_6445", "instruction": "i am looking for silver cupcake toppers for baby shower birthday party.", "target_attributes": { "attributes": [ "birthday party", "baby shower" ], "options": [ "silver" ] }, "asin": "B08HQXX3C4" }, { "task_id": "ws_B091DLJ4B5_6446", "instruction": "i'm looking for a meals with zero added sugar and also free from gluten and bpa. also, choose applesauce flavored one.", "target_attributes": { "attributes": [ "bpa free", "gluten free", "zero sugar" ], "options": [ "applesauce" ] }, "asin": "B091DLJ4B5" }, { "task_id": "ws_B00BOEEX04_6447", "instruction": "i am looking for permanent hair color with color 5.12", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "5.12" ] }, "asin": "B00BOEEX04" }, { "task_id": "ws_B08JKFMQD9_6448", "instruction": "i would like to order a pink harajuku 3x-large unisex printed hoodie that is made of polyester cotton.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "pink", "3x-large" ] }, "asin": "B08JKFMQD9" }, { "task_id": "ws_B019IOEQQ2_6449", "instruction": "i am looking for high speed hdmi cable male to male .", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to male" ] }, "asin": "B019IOEQQ2" }, { "task_id": "ws_B019IOEQQ2_6450", "instruction": "i am looking for a 5 pack of 12 foot gold plated hdmi cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "5 pack", "12 feet (3 pack)" ] }, "asin": "B019IOEQQ2" }, { "task_id": "ws_B001B2N3QE_6451", "instruction": "i would like a old version of a 3 count ultra light sun blonde hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "03 ultra light sun blonde", "3 count (pack of 1)", "old version" ] }, "asin": "B001B2N3QE" }, { "task_id": "ws_B001B2N3QE_6452", "instruction": "i am looking for a long lasting permanent hair dye in light auburn color.", "target_attributes": { "attributes": [ "long lasting", "hair dye", "permanent hair" ], "options": [ "053 light auburn" ] }, "asin": "B001B2N3QE" }, { "task_id": "ws_B001B2N3QE_6453", "instruction": "i'm looking for a permanent hair dye with keratin in the brand of revlon.", "target_attributes": { "attributes": [ "hair dye", "permanent hair" ], "options": [ "pack of 1" ] }, "asin": "B001B2N3QE" }, { "task_id": "ws_B0816WX3B7_6454", "instruction": "i am looking for an intel quad core i5 tower pc with windows 10 pro.", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [] }, "asin": "B0816WX3B7" }, { "task_id": "ws_B0824CD7K7_6455", "instruction": "i want to find pink floral pillow covers for the pillows in my living room that are 22 inches by 22 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "flower pink", "22 x 22 inches" ] }, "asin": "B0824CD7K7" }, { "task_id": "ws_B07TGDQLVJ_6456", "instruction": "i am looking for memory foam canvas slip in a black color size 14", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black", "14" ] }, "asin": "B07TGDQLVJ" }, { "task_id": "ws_B07YY2ZCFF_6457", "instruction": "i am looking for cupcake toppers for baby shower birthday party.", "target_attributes": { "attributes": [ "baby shower", "birthday party" ], "options": [] }, "asin": "B07YY2ZCFF" }, { "task_id": "ws_B00J1NO5CG_6458", "instruction": "i'm looking for a keto friendly sugar free chocolate syrup which should be fat and gluten free. also, choose a pack of 1 contains 25.4 fl oz with sugar free s'mores one.", "target_attributes": { "attributes": [ "sugar free", "keto friendly", "fat free", "gluten free" ], "options": [ "sugar free s'mores", "25.4 fl oz (pack of 1)" ] }, "asin": "B00J1NO5CG" }, { "task_id": "ws_B00J1NO5CG_6459", "instruction": "i'm looking for a pack of 4 in 25.4 ounce sugar and gluten free chocolate syrup", "target_attributes": { "attributes": [ "sugar free", "gluten free" ], "options": [ "sugar free irish cream", "25.4 ounce (pack of 4)" ] }, "asin": "B00J1NO5CG" }, { "task_id": "ws_B0823M3GTC_6460", "instruction": "i would like to buy a pink makeup brush that is high quality and easy to clean and carry.", "target_attributes": { "attributes": [ "easy carry", "easy clean", "high quality" ], "options": [ "1-pink" ] }, "asin": "B0823M3GTC" }, { "task_id": "ws_B0823M3GTC_6461", "instruction": "i would like a crimson brush set that is high quality.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "2-crimson" ] }, "asin": "B0823M3GTC" }, { "task_id": "ws_B076X189T6_6462", "instruction": "i'm looking for kitchen curtains it easy to use for machinable washes.", "target_attributes": { "attributes": [ "machine washable", "printing technology" ], "options": [ "blue and dark orange" ] }, "asin": "B076X189T6" }, { "task_id": "ws_B00JL248RY_6463", "instruction": "i'm looking for home audio that contain batteries included. it was blue in color.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "blue" ] }, "asin": "B00JL248RY" }, { "task_id": "ws_B000LWCR26_6464", "instruction": "i am looking for caffeine free organic tea flavored chocolate rooibos", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "chocolate rooibos" ] }, "asin": "B000LWCR26" }, { "task_id": "ws_B000LWCR26_6465", "instruction": "i would like a box of 18 de tress herbal tea bags that are individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "de-stress", "18 count (pack of 3)" ] }, "asin": "B000LWCR26" }, { "task_id": "ws_B000LWCR26_6466", "instruction": "i am looking for a 18 count (pack of 1) caffeine free herbal tea", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "18 count (pack of 1)" ] }, "asin": "B000LWCR26" }, { "task_id": "ws_B07W98K1Y2_6467", "instruction": "i'm looking for rubber stole shoes for light wearing it was brown in color", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown" ] }, "asin": "B07W98K1Y2" }, { "task_id": "ws_B085WB9KBK_6468", "instruction": "i am looking a varity pack seafood tuna fish high protein gluten free non gmo bpa free size 4.25 ounce", "target_attributes": { "attributes": [ "high protein", "bpa free", "non gmo", "gluten free" ], "options": [ "variety pack", "4.25 ounce (pack of 4)" ] }, "asin": "B085WB9KBK" }, { "task_id": "ws_B09CTHQLZ1_6469", "instruction": "i am looking for a 46\" x 16\" x 25\" vanities & vanity benches for living rooms.", "target_attributes": { "attributes": [ "living room" ], "options": [ "46\" x 16\" x 25\"" ] }, "asin": "B09CTHQLZ1" }, { "task_id": "ws_B07CYKYVW7_6470", "instruction": "i'm looking for furniture in engineered wood for living room and it was in white in color.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "white & anthracite" ] }, "asin": "B07CYKYVW7" }, { "task_id": "ws_B09GYCPCJ4_6471", "instruction": "i am looking for high gloss buffet sideboard for kitchen with white led light.", "target_attributes": { "attributes": [ "high gloss" ], "options": [ "white" ] }, "asin": "B09GYCPCJ4" }, { "task_id": "ws_B0759B7KLH_6472", "instruction": "i'm looking for certified organic seeds pack of six.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "8.5 ounce (pack of 6)" ] }, "asin": "B0759B7KLH" }, { "task_id": "ws_B0078DV1XW_6473", "instruction": "i am looking for sulfate free hair oil serum pack", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "hair oil serum - 1 pack" ] }, "asin": "B0078DV1XW" }, { "task_id": "ws_B077GWCCC8_6474", "instruction": "i want sugar free, 10 pound classic flavour chocolate discs", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "classic", "10 pound" ] }, "asin": "B077GWCCC8" }, { "task_id": "ws_B09FY2C67G_6475", "instruction": "looking for ceramic drink coasters that is set of 6 with cup holder", "target_attributes": { "attributes": [ "living room" ], "options": [ "set of 6 with cup holder" ] }, "asin": "B09FY2C67G" }, { "task_id": "ws_B07XM8TFP4_6476", "instruction": "i am looking for gluten free potato chips.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "kettle-style original chips" ] }, "asin": "B07XM8TFP4" }, { "task_id": "ws_B09QRVRZKK_6477", "instruction": "i would like a pair of black earbud headphones that are fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "black" ] }, "asin": "B09QRVRZKK" }, { "task_id": "ws_B08MFCQK96_6478", "instruction": "i am looking for non slip, steel toe women shoe. also, choose the black b color and 42 size.", "target_attributes": { "attributes": [ "non slip", "steel toe" ], "options": [ "blackb", "42" ] }, "asin": "B08MFCQK96" }, { "task_id": "ws_B07K726RVQ_6479", "instruction": "i want to buy a fifty-two pack of fava bean snacks that are low in sugar and fat. they should also be non-gmo.", "target_attributes": { "attributes": [ "low sugar", "low fat", "non gmo" ], "options": [ "1 ounce (pack of 52)" ] }, "asin": "B07K726RVQ" }, { "task_id": "ws_B09LJXXCYJ_6480", "instruction": "i'm looking for clothing for classic fit for women classic fit.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit" ], "options": [ "asphalt" ] }, "asin": "B09LJXXCYJ" }, { "task_id": "ws_B08TVFLHNK_6481", "instruction": "i need a heavy duty wall plate cover that is high gloss. i want something in a rocker combo style.", "target_attributes": { "attributes": [ "heavy duty", "high gloss" ], "options": [ "outlet | rocker combo" ] }, "asin": "B08TVFLHNK" }, { "task_id": "ws_B07K4WQXB8_6482", "instruction": "i am looking for a 3 pink long sleeve fashion hoodies & sweatshirts.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "3 pink" ] }, "asin": "B07K4WQXB8" }, { "task_id": "ws_B001Q1FRZ0_6483", "instruction": "i want to buy a bronze finish pendant light, in brushed nickle color.", "target_attributes": { "attributes": [ "bronze finish", "pendant light" ], "options": [ "brushed nickel" ] }, "asin": "B001Q1FRZ0" }, { "task_id": "ws_B08X6Y1SVV_6484", "instruction": "search and add 20\"x20\" throw pillow covers used as decorative cushion covers in my living room to my shopping cart. make sure they are dark green.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark green", "20\"x20\"" ] }, "asin": "B08X6Y1SVV" }, { "task_id": "ws_B08X6Y1SVV_6485", "instruction": "i want a set of solid wine red throw pillow covers for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "wine red" ] }, "asin": "B08X6Y1SVV" }, { "task_id": "ws_B074N44TTT_6486", "instruction": "i want skateboarding shoes that have rubber outsoles. pick something in blue color.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "blue" ] }, "asin": "B074N44TTT" }, { "task_id": "ws_B09B25LW1P_6487", "instruction": "i'm looking for women's clothing need to buy medium sized dresses.", "target_attributes": { "attributes": [ "wide leg", "quality materials", "high waist", "daily wear" ], "options": [ "heart a1" ] }, "asin": "B09B25LW1P" }, { "task_id": "ws_B075FSHGVB_6488", "instruction": "throw pillows cover spot clean lumbar support color beach house cotton coastal blue", "target_attributes": { "attributes": [ "spot clean", "lumbar support" ], "options": [ "beach house, cotton coastal blue" ] }, "asin": "B075FSHGVB" }, { "task_id": "ws_B075FSHGVB_6489", "instruction": "i need a bolster pillow hypoallergenic for lombar support in cotton blue", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "coastline, cotton blue", "bolster pillow" ] }, "asin": "B075FSHGVB" }, { "task_id": "ws_B07BNZ8PR3_6490", "instruction": "i am looking for a blue ottomans for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue" ] }, "asin": "B07BNZ8PR3" }, { "task_id": "ws_B09P754R7V_6491", "instruction": "i need a replacement remote control for the blue ray disk player.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B09P754R7V" }, { "task_id": "ws_B07FPC4F39_6492", "instruction": "i want a certified organic clear lip balm made with coconut oil.", "target_attributes": { "attributes": [ "certified organic", "coconut oil" ], "options": [ "clear" ] }, "asin": "B07FPC4F39" }, { "task_id": "ws_B092PDJLH1_6493", "instruction": "i would like a pair of size 10.5 dark brown cheetah clogs with a non slip rubber sole.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "dark brown cheetah", "10.5" ] }, "asin": "B092PDJLH1" }, { "task_id": "ws_B086LGB4QV_6494", "instruction": "i need a clear fine mist spray bottle for essential oils which is easy to carry during travel.", "target_attributes": { "attributes": [ "easy carry", "fine mist" ], "options": [ "clear" ] }, "asin": "B086LGB4QV" }, { "task_id": "ws_B0933MGT9J_6495", "instruction": "i need an ultra hd security camera which comes with plug and play option.", "target_attributes": { "attributes": [ "ultra hd", "plug play" ], "options": [] }, "asin": "B0933MGT9J" }, { "task_id": "ws_B07T1GX1JY_6496", "instruction": "pick a pack of long lasting scented candles made of soy wax. it should be of teakwood color.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [ "teakwood", "1 pack" ] }, "asin": "B07T1GX1JY" }, { "task_id": "ws_B08QGPCZDS_6497", "instruction": "i am looking for a 9.5 sized men's running shoes with synthetic sole . and i choose the 7-black red color", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "7-black red", "9.5" ] }, "asin": "B08QGPCZDS" }, { "task_id": "ws_B071LLSKLF_6498", "instruction": "hey, can you find me that high quality anti-aging cream that is a special blend made by dr. lancer? and please get the largest tube they make! if the tube comes in different colors, i want purple!", "target_attributes": { "attributes": [ "anti aging", "high quality" ], "options": [] }, "asin": "B071LLSKLF" }, { "task_id": "ws_B08LNSS2L5_6499", "instruction": "i want a black fast charging and high speed usb cable.", "target_attributes": { "attributes": [ "fast charging", "high speed" ], "options": [ "black" ] }, "asin": "B08LNSS2L5" }, { "task_id": "ws_B07WDTD26G_6500", "instruction": "i am looking for steel frame coffee table in pewter color", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "pewter" ] }, "asin": "B07WDTD26G" }, { "task_id": "ws_B07N7TXD25_6501", "instruction": "i'm looking for queen size and twin sized furniture need to buy it.", "target_attributes": { "attributes": [ "queen size", "twin size" ], "options": [ "brown" ] }, "asin": "B07N7TXD25" }, { "task_id": "ws_B09SD6P473_6502", "instruction": "i'm looking for grocery snacks for make great and perfect gifts.", "target_attributes": { "attributes": [ "great gift", "perfect gift" ], "options": [] }, "asin": "B09SD6P473" }, { "task_id": "ws_B09K3WY267_6503", "instruction": "i'm looking for blankets the color was boho colorful geometric pattern decor.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "boho colorful geometric pattern decor" ] }, "asin": "B09K3WY267" }, { "task_id": "ws_B08YDYMV23_6504", "instruction": "i want a quad core 7\" android kids tablet with iwawa ls, dc, bt, wifi etc", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B08YDYMV23" }, { "task_id": "ws_B09H3ND94G_6505", "instruction": "i am looking for a 32gb 1tb ssd pcle nvme m.2 size intel core minis.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "32gb 1tb ssd pcle nvme m.2" ] }, "asin": "B09H3ND94G" }, { "task_id": "ws_B08FG98N4P_6506", "instruction": "i'm looking for a 6ft usb to hdmi adapter cable.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B08FG98N4P" }, { "task_id": "ws_B07TQZPJK8_6507", "instruction": "i am looking for disney frozen machine wash, heathers cotton kristoff olaf premium t-shirt for women", "target_attributes": { "attributes": [ "machine wash", "heathers cotton" ], "options": [ "women" ] }, "asin": "B07TQZPJK8" }, { "task_id": "ws_B09JS19BSF_6508", "instruction": "i'm looking for a tablet with a high performance 8 inch screen", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B09JS19BSF" }, { "task_id": "ws_B01FV5KX2S_6509", "instruction": "i'm looking for organic, gluten free dutch cocoa chocolate sauce with a syrup pump", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "syrup pump" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B01FV5KX2S_6510", "instruction": "i would like one organic raspberry syrup pump that is certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "organic raspberry", "pack of 1", "syrup pump" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B01FV5KX2S_6511", "instruction": "i need dark chocolate organic syrup", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "organic dutch cocoa dark chocolate" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B01FV5KX2S_6512", "instruction": "i would like a peach syrup that is organic", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "organic peach" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B01FV5KX2S_6513", "instruction": "i would like a 25.4 fluid ounce bottle of chocolate syrup made with non gmo organic candy cane mint.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "organic candy cane mint", "25.4 fl oz (pack of 1)", "syrup" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B01FV5KX2S_6514", "instruction": "i'm looking for a pack of three non-gmo organic flavor syrups with a pump. look for the pumpkin pie spice flavor.", "target_attributes": { "attributes": [ "certified organic", "non gmo" ], "options": [ "organic pumpkin pie spice", "pack of 3", "syrup pump" ] }, "asin": "B01FV5KX2S" }, { "task_id": "ws_B098JPBMPP_6515", "instruction": "i'm looking for clothing has long sleeve it was dry cleaned it was ed in color.", "target_attributes": { "attributes": [ "wash cold", "hand wash", "machine wash", "long sleeve", "dry clean" ], "options": [ "7-red" ] }, "asin": "B098JPBMPP" }, { "task_id": "ws_B075FGY7G2_6516", "instruction": "i'm looking for a 37 inch metal and wood platform bed frame with chestnut brown, queen by zinus suzanne", "target_attributes": { "attributes": [ "box spring", "solid wood" ], "options": [ "bed frame + mattress, queen", "37 inch (chestnut brown)" ] }, "asin": "B075FGY7G2" }, { "task_id": "ws_B09QV7VDBX_6517", "instruction": "i am looking for a black color dust proof and heavy duty protection phone case cover for samsung galaxy s22.", "target_attributes": { "attributes": [ "heavy duty", "dust proof", "case cover" ], "options": [ "black" ] }, "asin": "B09QV7VDBX" }, { "task_id": "ws_B08NX177PT_6518", "instruction": "i'm looking for cellphone accessories for wireless charging.", "target_attributes": { "attributes": [ "easy install", "wireless charging" ], "options": [ "green" ] }, "asin": "B08NX177PT" }, { "task_id": "ws_B0989RT3L7_6519", "instruction": "get me a slim fit hand washable black long sleeved men's suit's jacket in 4x size.", "target_attributes": { "attributes": [ "slim fit", "hand wash", "long sleeve" ], "options": [ "black1", "4x" ] }, "asin": "B0989RT3L7" }, { "task_id": "ws_B08BXTQX6R_6520", "instruction": "i'm looking for a soft gray women's shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "soft grey" ] }, "asin": "B08BXTQX6R" }, { "task_id": "ws_B07WTW4X4R_6521", "instruction": "i am looking for dual band computers", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B07WTW4X4R" }, { "task_id": "ws_B07WTW4X4R_6522", "instruction": "i need dual band computer accessories.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B07WTW4X4R" }, { "task_id": "ws_B0777CTZF6_6523", "instruction": "i would like a purple barstool that is easy to clean and assemble.", "target_attributes": { "attributes": [ "easy clean", "easy assemble" ], "options": [ "purple" ] }, "asin": "B0777CTZF6" }, { "task_id": "ws_B09LM8RF2G_6524", "instruction": "i need a long lasting walnut curio cabinet with adjustable tempered glass to grace my room.", "target_attributes": { "attributes": [ "long lasting", "tempered glass" ], "options": [ "walnut" ] }, "asin": "B09LM8RF2G" }, { "task_id": "ws_B08XX95LLV_6525", "instruction": "i would like a 6 pack of dental floss good for my oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "pack of 6, essential" ] }, "asin": "B08XX95LLV" }, { "task_id": "ws_B09FJCV7ZV_6526", "instruction": "a throw pillow covers set for living room color natural-w", "target_attributes": { "attributes": [ "living room" ], "options": [ "natural-w" ] }, "asin": "B09FJCV7ZV" }, { "task_id": "ws_B082D3D9DW_6527", "instruction": "i'm looking for a wall mobile bookshelf .", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B082D3D9DW" }, { "task_id": "ws_B09LQ8V928_6528", "instruction": "i need wine colored winter warm boxers. pick something in wine color.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "wine", "x-large" ] }, "asin": "B09LQ8V928" }, { "task_id": "ws_B097FGJ473_6529", "instruction": "i want a keto friendly, white chocolate spread which is sugar and gluten free.", "target_attributes": { "attributes": [ "keto friendly", "sugar free", "gluten free" ], "options": [ "white chocolate" ] }, "asin": "B097FGJ473" }, { "task_id": "ws_B07PW4KZBW_6530", "instruction": "i am looking for a posters & prints for living rooms", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B07PW4KZBW" }, { "task_id": "ws_B09KLCZPXR_6531", "instruction": "i am looking for easy to clean double sided velvet pads.", "target_attributes": { "attributes": [ "double sided", "easy clean" ], "options": [ "velvet" ] }, "asin": "B09KLCZPXR" }, { "task_id": "ws_B09BK6K6XB_6532", "instruction": "find me a twin size bunk bed that's white and made from engineered wood.", "target_attributes": { "attributes": [ "twin size", "white item", "engineered wood" ], "options": [ "bunk bed" ] }, "asin": "B09BK6K6XB" }, { "task_id": "ws_B07C7KQQN9_6533", "instruction": "i need a slip resistant tactical boot with rubber soles. it should be in size 6.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "6" ] }, "asin": "B07C7KQQN9" }, { "task_id": "ws_B09R4JVD58_6534", "instruction": "i would like a w35.4\" x l78.7\" hunter green window film that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "hunter and green 13", "w35.4\" x l78.7\"" ] }, "asin": "B09R4JVD58" }, { "task_id": "ws_B0992DN2BK_6535", "instruction": "i am looking for golden edge storage bench of faux leather for living room.", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "golden edge bench" ] }, "asin": "B0992DN2BK" }, { "task_id": "ws_B07BP14H9C_6536", "instruction": "i'm looking for want to buy a camera for digital photography. it also easy to carry.", "target_attributes": { "attributes": [ "easy carry", "digital photography" ], "options": [ "10x8ft" ] }, "asin": "B07BP14H9C" }, { "task_id": "ws_B09QD1G4JC_6537", "instruction": "i am looking for a long sleeve t-shirts of large size.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B09QD1G4JC" }, { "task_id": "ws_B09P1NQDFZ_6538", "instruction": "i would like a extra large yellow button down shirt that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "#06-yellow", "x-large" ] }, "asin": "B09P1NQDFZ" }, { "task_id": "ws_B09PG9R7TX_6539", "instruction": "i am looking for a 52x84inx2 panels for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52x84inx2" ] }, "asin": "B09PG9R7TX" }, { "task_id": "ws_B07YMW9BYH_6540", "instruction": "i'm looking for a double size, super soft blanket. also, choose 90*90\" black colored one.", "target_attributes": { "attributes": [ "double sided", "super soft" ], "options": [ "black", "90x90\"" ] }, "asin": "B07YMW9BYH" }, { "task_id": "ws_B09DVQY1RT_6541", "instruction": "i am looking for light fixture hanging pendant light with color is black-a", "target_attributes": { "attributes": [ "pendant light", "light fixture" ], "options": [ "black-a" ] }, "asin": "B09DVQY1RT" }, { "task_id": "ws_B09285ZVMV_6542", "instruction": "i want double horn bluetooth wireless speakers which is portable and easy to carry", "target_attributes": { "attributes": [ "easy carry", "wireless bluetooth" ], "options": [ "double horn" ] }, "asin": "B09285ZVMV" }, { "task_id": "ws_B094663P3J_6543", "instruction": "i am looking for a 6 pack of cookie assortments which is keto friendly grain free and sugar free", "target_attributes": { "attributes": [ "keto friendly", "grain free", "sugar free" ], "options": [ "6 pack" ] }, "asin": "B094663P3J" }, { "task_id": "ws_B09PC1WJBJ_6544", "instruction": "i am looking for a long sleeved medium sized sweatshirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09PC1WJBJ" }, { "task_id": "ws_B06ZZ5ZNDQ_6545", "instruction": "my sister have natural hair in 15 inch", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "15 inch" ] }, "asin": "B06ZZ5ZNDQ" }, { "task_id": "ws_B005S4J2OS_6546", "instruction": "i want a 10 ounce bottle of low calorie fries seasonings.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "10 ounce (pack of 1)" ] }, "asin": "B005S4J2OS" }, { "task_id": "ws_B005S4J2OS_6547", "instruction": "i want a ready to eat 9 ounce pack of fries seasoning bottle. it should be low in calories.", "target_attributes": { "attributes": [ "low calorie", "ready eat" ], "options": [ "9 ounce (pack of 1)" ] }, "asin": "B005S4J2OS" }, { "task_id": "ws_B005S4J2OS_6548", "instruction": "i am really looking for a low sugar flame grilled bbq meat seasoning that comes in 8 ounces", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "8 ounce (pack of 1)", "flame grilled bbq" ] }, "asin": "B005S4J2OS" }, { "task_id": "ws_B08PG3FKPY_6549", "instruction": "i'm looking for open toe shoes for women's it was blue in color.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "blue" ] }, "asin": "B08PG3FKPY" }, { "task_id": "ws_B00IHO11FE_6550", "instruction": "i am looking for trader joe and chocolate covered blueberries", "target_attributes": { "attributes": [ "trader joe", "chocolate covered" ], "options": [] }, "asin": "B00IHO11FE" }, { "task_id": "ws_B00IHO11FE_6551", "instruction": "i would like a chocolate covered fruit from trader joes.", "target_attributes": { "attributes": [ "trader joe", "chocolate covered" ], "options": [] }, "asin": "B00IHO11FE" }, { "task_id": "ws_B09QPKTKP6_6552", "instruction": "a men's winter warm loose fit made from quality polyester xx- large casual pant color: gray", "target_attributes": { "attributes": [ "loose fit", "winter warm", "quality polyester" ], "options": [ "gray", "xx-large" ] }, "asin": "B09QPKTKP6" }, { "task_id": "ws_B09N9LKT3L_6553", "instruction": "i am looking for high definition high power pink colour portable bluetooth speakers", "target_attributes": { "attributes": [ "high definition", "high power" ], "options": [ "pink" ] }, "asin": "B09N9LKT3L" }, { "task_id": "ws_B082W1GZVL_6554", "instruction": "i am looking for leak proof soap dispenser. please select white one.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "white" ] }, "asin": "B082W1GZVL" }, { "task_id": "ws_B091N91BZ8_6555", "instruction": "i am looking for a white power dental flossers for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "white" ] }, "asin": "B091N91BZ8" }, { "task_id": "ws_B09LMC456K_6556", "instruction": "i'm looking for bench it can easily assemble a living room.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "pink" ] }, "asin": "B09LMC456K" }, { "task_id": "ws_B09LYMF164_6557", "instruction": "i am looking for an easy to use yellow children's toothbrush.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "yellow" ] }, "asin": "B09LYMF164" }, { "task_id": "ws_B07ZXMXZF6_6558", "instruction": "i'm looking for a tea bags which is sugar free and gluten free and also of good quality ingredients. also choose a pack of 1 weights 1.32 ounce, coconut with green tea flavored one.", "target_attributes": { "attributes": [ "sugar free", "gluten free", "quality ingredients" ], "options": [ "coconut with green tea", "1.32 ounce (pack of 1)" ] }, "asin": "B07ZXMXZF6" }, { "task_id": "ws_B00VC3681O_6559", "instruction": "i am searching for individually wrapped gummy candies.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B00VC3681O" }, { "task_id": "ws_B08PL59YNK_6560", "instruction": "i want a long lasting comforter that is super soft and paw patrol colored.", "target_attributes": { "attributes": [ "super soft", "long lasting" ], "options": [ "paw patrol" ] }, "asin": "B08PL59YNK" }, { "task_id": "ws_B09KY9P8CD_6561", "instruction": "i'm looking for nail polish for nail art to make our nail look beautiful.", "target_attributes": { "attributes": [ "nail polish", "nail art" ], "options": [ "pink" ] }, "asin": "B09KY9P8CD" }, { "task_id": "ws_B09NXV65LV_6562", "instruction": "i am looking for a long sleeve jumpsuits of 001-red.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "001-red" ] }, "asin": "B09NXV65LV" }, { "task_id": "ws_B094W12V1M_6563", "instruction": "i'm looking for a nightstand with tempered glass for living room, size 19.7x11.8x23\" in retro brown color", "target_attributes": { "attributes": [ "tempered glass", "living room" ], "options": [ "retro brown", "19.7\"x11.8\"x23.6\"" ] }, "asin": "B094W12V1M" }, { "task_id": "ws_B099RSZNWJ_6564", "instruction": "i am looking for a fully cooked bow-tie of spaghetti pasta flavor", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "spaghetti pasta" ] }, "asin": "B099RSZNWJ" }, { "task_id": "ws_B07VJLBD4J_6565", "instruction": "i am looking for gluten free turquoise edible glitter for cakes.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "turquoise" ] }, "asin": "B07VJLBD4J" }, { "task_id": "ws_B07VJLBD4J_6566", "instruction": "i need a one pound bag of pink glitter that is kosher.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "deep pink", "454g (1lb)" ] }, "asin": "B07VJLBD4J" }, { "task_id": "ws_B07GQ711QJ_6567", "instruction": "i'm looking for a waterproof carrying case that can help secure my binoculars while bird watching.", "target_attributes": { "attributes": [ "carrying case", "bird watching" ], "options": [] }, "asin": "B07GQ711QJ" }, { "task_id": "ws_B09LM1WPPS_6568", "instruction": "i'm looking for made a cup cakes for birthday parties.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [ "rose gold hello 2022" ] }, "asin": "B09LM1WPPS" }, { "task_id": "ws_B08L5716H4_6569", "instruction": "i am looking for lake blue ridge parkway artwork-14 paintings for living room and its size is 48''wx24''h", "target_attributes": { "attributes": [ "living room" ], "options": [ "artwork-14", "48''wx24''h" ] }, "asin": "B08L5716H4" }, { "task_id": "ws_B075WR97Q1_6570", "instruction": "i'm looking for a standard plug and play computer mouse that is wired, preferably black.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "gmaergbt15 black", "wired" ] }, "asin": "B075WR97Q1" }, { "task_id": "ws_B001EAYN44_6571", "instruction": "i want to buy a bronze wall scone with a bronze finish also. i would like it in the large size.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "bronze", "large" ] }, "asin": "B001EAYN44" }, { "task_id": "ws_B098VVZ7F7_6572", "instruction": "show me a day comfort knee high open toe z8-khaki open toe boots in 5.5 size made with quality materials.", "target_attributes": { "attributes": [ "knee high", "day comfort", "open toe" ], "options": [ "z8-khaki", "5.5" ] }, "asin": "B098VVZ7F7" }, { "task_id": "ws_B073RG7HYZ_6573", "instruction": "i need high quality hair extensions that are 18 inches in size.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "18 inch (pack of 1)" ] }, "asin": "B073RG7HYZ" }, { "task_id": "ws_B07CMBP6W2_6574", "instruction": "i'm interested in this product, show me eye makeup remover, earth science, 4 fl oz (pack of 1), with green tea, hyaluronic acid.", "target_attributes": { "attributes": [ "green tea", "hyaluronic acid" ], "options": [ "4 fl oz (pack of 1)" ] }, "asin": "B07CMBP6W2" }, { "task_id": "ws_B07KYK1KCK_6575", "instruction": "i'm looking for a usb rechargeable lithium d batteries.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "d cell 2 pack" ] }, "asin": "B07KYK1KCK" }, { "task_id": "ws_B09MF9SMHM_6576", "instruction": "i am looking for black-1029 coaxial cable for smart tv.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "black-1029" ] }, "asin": "B09MF9SMHM" }, { "task_id": "ws_B01HJW66RW_6577", "instruction": "i am looking for gold plated cables with size of 8 feet", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "8 feet (5-pack)" ] }, "asin": "B01HJW66RW" }, { "task_id": "ws_B07DDDHX7J_6578", "instruction": "i would like a small midweight beige thermal underwear top that has long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "3. heavyweight beige 1 top", "small", "200 - midweight" ] }, "asin": "B07DDDHX7J" }, { "task_id": "ws_B07DDDHX7J_6579", "instruction": "i want a small fleece lined long sleeve crew neck shirt.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "small" ] }, "asin": "B07DDDHX7J" }, { "task_id": "ws_B09FQ8GYM5_6580", "instruction": "find me a long sleeve top for my teenage girl. she is x-large.", "target_attributes": { "attributes": [ "long sleeve", "teen girls" ], "options": [ "x-large" ] }, "asin": "B09FQ8GYM5" }, { "task_id": "ws_B01N96L9BB_6581", "instruction": "i am looking for cal 100w eupen metal adjustable floor lamp with assembly required", "target_attributes": { "attributes": [ "assembly required" ], "options": [] }, "asin": "B01N96L9BB" }, { "task_id": "ws_B075Q4N3T7_6582", "instruction": "i am looking for men\u2019s running shoes size 10 which are light weight and slip resisistance.", "target_attributes": { "attributes": [ "light weight", "slip resistant" ], "options": [ "10" ] }, "asin": "B075Q4N3T7" }, { "task_id": "ws_B01HYA8V86_6583", "instruction": "i'm looking for hair products to white strong spray for hair loss products. it can very easy method.", "target_attributes": { "attributes": [ "easy apply", "hair loss" ], "options": [ "white + strong spray" ] }, "asin": "B01HYA8V86" }, { "task_id": "ws_B01HYA8V86_6584", "instruction": "i am looking for hair building fibers that are light brown for hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "light brown + strong spray" ] }, "asin": "B01HYA8V86" }, { "task_id": "ws_B09CM2NX9N_6585", "instruction": "i am looking for non toxic storage case for for travel usage", "target_attributes": { "attributes": [ "non toxic", "storage case" ], "options": [] }, "asin": "B09CM2NX9N" }, { "task_id": "ws_B07GXYHZ2D_6586", "instruction": "i am looking for apple ipad mini 4, 1080p hd and color is silver", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "silver" ] }, "asin": "B07GXYHZ2D" }, { "task_id": "ws_B095J6KZYR_6587", "instruction": "i'm looking for a ten pack of dairy free, non-gmo plant based sausage breakfast sandwiches.", "target_attributes": { "attributes": [ "plant based", "dairy free", "non gmo" ], "options": [ "veggie", "5.5 ounce (pack of 10)" ] }, "asin": "B095J6KZYR" }, { "task_id": "ws_B01LK0PRUQ_6588", "instruction": "i am looking for fine mist women fragrance.", "target_attributes": { "attributes": [ "fine mist" ], "options": [] }, "asin": "B01LK0PRUQ" }, { "task_id": "ws_B00EF4G6FK_6589", "instruction": "i am looking for a black home office desk chairs for lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "black" ] }, "asin": "B00EF4G6FK" }, { "task_id": "ws_B08R6XR5DF_6590", "instruction": "i am looking for a z-5 green long sleeve women clothing", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z-5 green" ] }, "asin": "B08R6XR5DF" }, { "task_id": "ws_B09LDC4N41_6591", "instruction": "i would like a pair of size 9 grey snow boots that are water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "grey", "9" ] }, "asin": "B09LDC4N41" }, { "task_id": "ws_B08L1WD434_6592", "instruction": "i'm looking for furniture for kitchen a buy a desk for home office and coated steel and need buy it.", "target_attributes": { "attributes": [ "easy clean", "coated steel" ], "options": [ "vintage and black" ] }, "asin": "B08L1WD434" }, { "task_id": "ws_B08L1WD434_6593", "instruction": "i need 55 inch , teak color and easy clean modern simple style desk for home office", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "teak", "55 inch" ] }, "asin": "B08L1WD434" }, { "task_id": "ws_B09MCNYCH1_6594", "instruction": "i'm looking for multi colored home decor products.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi-01563" ] }, "asin": "B09MCNYCH1" }, { "task_id": "ws_B07MBZTLVJ_6595", "instruction": "i would like a bundle set of earbud headphones that are water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "bundle" ] }, "asin": "B07MBZTLVJ" }, { "task_id": "ws_B095NN1RHK_6596", "instruction": "i am looking for hair trimmer for beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B095NN1RHK" }, { "task_id": "ws_B08T1RWS5Q_6597", "instruction": "i need a pair of nice indigo pants for hand wash only.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "blue fish" ] }, "asin": "B08T1RWS5Q" }, { "task_id": "ws_B07TXLYSRV_6598", "instruction": "i'm looking for temporary tattoos for women's and it was sensitive skin and it also with dry skin.", "target_attributes": { "attributes": [ "easy apply", "long lasting", "coconut oil", "dry skin", "sensitive skin" ], "options": [ "white henna" ] }, "asin": "B07TXLYSRV" }, { "task_id": "ws_B07CRQD2HF_6599", "instruction": "looking for women's plus size fineline denim jegging which is machine washable and have regular fit and colour must be radiant purple", "target_attributes": { "attributes": [ "machine wash", "regular fit" ], "options": [ "radiant purple" ] }, "asin": "B07CRQD2HF" }, { "task_id": "ws_B09PLGRKBR_6600", "instruction": "i want long lasting eye shadow in color c.", "target_attributes": { "attributes": [ "long lasting", "eye shadow" ], "options": [ "c" ] }, "asin": "B09PLGRKBR" }, { "task_id": "ws_B07J5S57B9_6601", "instruction": "i want a desktop computer with intel quad core i5 processor.", "target_attributes": { "attributes": [ "core i5", "quad core" ], "options": [] }, "asin": "B07J5S57B9" }, { "task_id": "ws_B07R5C65BW_6602", "instruction": "i am looking for a low fat low calorie jerky", "target_attributes": { "attributes": [ "low fat", "low calorie" ], "options": [] }, "asin": "B07R5C65BW" }, { "task_id": "ws_B09FQ693YW_6603", "instruction": "i am looking for a round w | glass top coffee tables for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "round w | glass top" ] }, "asin": "B09FQ693YW" }, { "task_id": "ws_B00LYHHE7A_6604", "instruction": "i am looking for chocolate covered cream bon in a 8 ounce, holly box", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "holly box", "8 ounce" ] }, "asin": "B00LYHHE7A" }, { "task_id": "ws_B093YVQFH4_6605", "instruction": "i'm looking for a laundry bag", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YVQFH4" }, { "task_id": "ws_B09H6ZRY27_6606", "instruction": "i'm looking for skin care for lip care products want to buy.", "target_attributes": { "attributes": [ "easy carry", "long lasting" ], "options": [] }, "asin": "B09H6ZRY27" }, { "task_id": "ws_B07GW6PTJN_6607", "instruction": "looking for bamboo toothbrush with charcoal bristles", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "kids! soft - flat - charcoal bristles" ] }, "asin": "B07GW6PTJN" }, { "task_id": "ws_B009GUNDTU_6608", "instruction": "i want high performance 6 ft usb 2.0 male to male cable color black", "target_attributes": { "attributes": [ "high performance" ], "options": [ "black", "cable + 6ft usb 2.0 a male to b male cable" ] }, "asin": "B009GUNDTU" }, { "task_id": "ws_B077JT9MWC_6609", "instruction": "i am looking for leak proof travel bottle. please choose pack of 50.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [ "pack of 50" ] }, "asin": "B077JT9MWC" }, { "task_id": "ws_B077JT9MWC_6610", "instruction": "i'm looking for a pack of 96 eight-ounce amber-colored travel bottles that are bpa free.", "target_attributes": { "attributes": [ "bpa free", "travel bottles" ], "options": [ "amber", "pack of 96" ] }, "asin": "B077JT9MWC" }, { "task_id": "ws_B0928MYN4B_6611", "instruction": "i'm looking for black colored round table accent table for bedroom uses.", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "black walnut" ] }, "asin": "B0928MYN4B" }, { "task_id": "ws_B00XS4M5NU_6612", "instruction": "i am looking for a wild orchid round lip gross which is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "wild orchid" ] }, "asin": "B00XS4M5NU" }, { "task_id": "ws_B09Q91CSQW_6613", "instruction": "i'm looking for open toe pillow slippers for need to buy it.", "target_attributes": { "attributes": [ "open toe", "knee high", "high heel" ], "options": [ "p-aa-khaki" ] }, "asin": "B09Q91CSQW" }, { "task_id": "ws_B083FWFFZ9_6614", "instruction": "i'm looking for hair removal for women's for rose gold it easy to use.", "target_attributes": { "attributes": [ "rose gold" ], "options": [] }, "asin": "B083FWFFZ9" }, { "task_id": "ws_B00BPBCHEU_6615", "instruction": "i'm looking for a pack of towelette deodorant long lasting with 10 in sensitive scent", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "sensitive", "10 count (pack of 1)" ] }, "asin": "B00BPBCHEU" }, { "task_id": "ws_B08LNWS2QJ_6616", "instruction": "i am looking for an assorted chocolate gift set that i can present to a friend.", "target_attributes": { "attributes": [ "gift set" ], "options": [] }, "asin": "B08LNWS2QJ" }, { "task_id": "ws_B09QHR4TMP_6617", "instruction": "i am looking for long lasting disney cinderella kids 3.4oz edt spray", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B09QHR4TMP" }, { "task_id": "ws_B000YOU23C_6618", "instruction": "i'm looking for a cruelty free certified body wash which is made of natural ingredients for dry skin. also, choose pack of 1 with 16 fl oz one.", "target_attributes": { "attributes": [ "cruelty free", "natural ingredients", "dry skin" ], "options": [ "16 fl oz (pack of 1)" ] }, "asin": "B000YOU23C" }, { "task_id": "ws_B092VTRBLX_6619", "instruction": "i need a black colored shower sponge with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "black 60g" ] }, "asin": "B092VTRBLX" }, { "task_id": "ws_B081YY68XK_6620", "instruction": "i would like some 54w x 29l rose straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "the rose (waterless)", "54w x 29l" ] }, "asin": "B081YY68XK" }, { "task_id": "ws_B081YY68XK_6621", "instruction": "i am looking for men's jeans of unleaded medium indigo color that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "unleaded - medium indigo" ] }, "asin": "B081YY68XK" }, { "task_id": "ws_B081YY68XK_6622", "instruction": "i would like some straight leg jeans that are a size 52w by 28l", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "52w x 28l" ] }, "asin": "B081YY68XK" }, { "task_id": "ws_B09BJFKS2R_6623", "instruction": "i'm looking for skin care products that color black i need to buy.", "target_attributes": { "attributes": [ "easy carry", "easy use" ], "options": [ "black" ] }, "asin": "B09BJFKS2R" }, { "task_id": "ws_B08SJ52X11_6624", "instruction": "i'm looking for assembly required for home office chairs with wheels and it want to buy it.", "target_attributes": { "attributes": [ "assembly required", "lumbar support" ], "options": [ "blue" ] }, "asin": "B08SJ52X11" }, { "task_id": "ws_B00PG32AZO_6625", "instruction": "i'm looking for 3.17 ounce coconut chips with tropical mango flavor and it should be soy free", "target_attributes": { "attributes": [ "soy free" ], "options": [ "tropical mango", "3.17 ounce (pack of 12)" ] }, "asin": "B00PG32AZO" }, { "task_id": "ws_B08R3MDTTQ_6626", "instruction": "i am looking for an easy to install iphone 12 case with a butterfly orchid design on it.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "butterfly orchid" ] }, "asin": "B08R3MDTTQ" }, { "task_id": "ws_B0993BSYGB_6627", "instruction": "i need a dust proof carrying case for my vr head set.", "target_attributes": { "attributes": [ "dust proof", "carrying case" ], "options": [] }, "asin": "B0993BSYGB" }, { "task_id": "ws_B07TK36W5Z_6628", "instruction": "i am looking for a sulfate & paraben free shampoo", "target_attributes": { "attributes": [ "paraben free", "sulfate free" ], "options": [ "shampoo" ] }, "asin": "B07TK36W5Z" }, { "task_id": "ws_B00MG4X33Y_6629", "instruction": "i need a king size bed with faux leather upholstery. pick one in dark brown.", "target_attributes": { "attributes": [ "faux leather", "king size" ], "options": [ "dark brown" ] }, "asin": "B00MG4X33Y" }, { "task_id": "ws_B00MG4X33Y_6630", "instruction": "i am looking for a contemporary designed california king faux leather bed.", "target_attributes": { "attributes": [ "faux leather", "contemporary design" ], "options": [ "california king" ] }, "asin": "B00MG4X33Y" }, { "task_id": "ws_B0851J4RR2_6631", "instruction": "i'm looking for pink colored rectangular kitchen rugs for dinning table.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "pink", "rectangular" ] }, "asin": "B0851J4RR2" }, { "task_id": "ws_B09DV92FT3_6632", "instruction": "i am looking for a medium long sleeve shirts for men", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09DV92FT3" }, { "task_id": "ws_B09C8D6JL9_6633", "instruction": "i am looking for nickel color pendant lights that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "nickel" ] }, "asin": "B09C8D6JL9" }, { "task_id": "ws_B0831R944X_6634", "instruction": "tropical fruit punch drink", "target_attributes": { "attributes": [ "source vitamin" ], "options": [ "tropical fruit punch" ] }, "asin": "B0831R944X" }, { "task_id": "ws_B08F4S851D_6635", "instruction": "can i get a wireless charging station dock for my iphone xr which is fast charging ?", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [] }, "asin": "B08F4S851D" }, { "task_id": "ws_B09HBLKBX7_6636", "instruction": "i'm looking for a 6pcs amosfun heart cake toppers.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pink" ] }, "asin": "B09HBLKBX7" }, { "task_id": "ws_B08PDP4LVH_6637", "instruction": "looking for phone ring light with aaa batteries", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B08PDP4LVH" }, { "task_id": "ws_B07YG49L5F_6638", "instruction": "i am looking for a women's arch support ankle boots which contain soft memory foam. also choose brown in color and us 9 size.", "target_attributes": { "attributes": [ "arch support", "memory foam" ], "options": [ "brown", "us:9" ] }, "asin": "B07YG49L5F" }, { "task_id": "ws_B09784RRXP_6639", "instruction": "i am looking for a 3x large breeches for wide legs", "target_attributes": { "attributes": [ "wide leg" ], "options": [] }, "asin": "B09784RRXP" }, { "task_id": "ws_B096TFX9G3_6640", "instruction": "i am looking for a long sleeve sweater for a teen girl which is able to do cold wash. also choose red in color and large size.", "target_attributes": { "attributes": [ "wash cold", "long sleeve", "teen girls" ], "options": [ "2-red", "large" ] }, "asin": "B096TFX9G3" }, { "task_id": "ws_B07FYT2X18_6641", "instruction": "i am searching for 3 dozen baked fresh cookie gifts which should be wrapped individually.", "target_attributes": { "attributes": [ "baked fresh", "individually wrapped" ], "options": [ "3 dozen" ] }, "asin": "B07FYT2X18" }, { "task_id": "ws_B09QKL7MNP_6642", "instruction": "i'm looking for high heel and sandal for drying shower.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "black" ] }, "asin": "B09QKL7MNP" }, { "task_id": "ws_B09SLZ21XY_6643", "instruction": "i would like a h color natural hairpiece.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "h" ] }, "asin": "B09SLZ21XY" }, { "task_id": "ws_B09BVH7353_6644", "instruction": "i'm looking for high definition it was easy to use.", "target_attributes": { "attributes": [ "high definition", "4g lte" ], "options": [] }, "asin": "B09BVH7353" }, { "task_id": "ws_B00AVO4SFI_6645", "instruction": "i want to buy a product and i need your help. find this henna brand: henna hair & beard dye also chooses an auburn color.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "auburn", "pack of 1" ] }, "asin": "B00AVO4SFI" }, { "task_id": "ws_B09T31DD3R_6646", "instruction": "i am looking for ultra hd android box with 4gb ram and 32gb rom.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "4gb+32gb" ] }, "asin": "B09T31DD3R" }, { "task_id": "ws_B08S7FJ1PR_6647", "instruction": "i would like a 6 by 9 foot printed photo backdrop for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 01", "6x9 ft" ] }, "asin": "B08S7FJ1PR" }, { "task_id": "ws_B08S7FJ1PR_6648", "instruction": "i need a printed backdrop that is for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 02" ] }, "asin": "B08S7FJ1PR" }, { "task_id": "ws_B0032GMRBO_6649", "instruction": "i am looking for high fructose chocolate bar. please choose peanut butter flavor.", "target_attributes": { "attributes": [ "high fructose" ], "options": [ "peanut butter" ] }, "asin": "B0032GMRBO" }, { "task_id": "ws_B09FY3T27X_6650", "instruction": "i am looking for a pair of women's size 5.5 knee high snow boots.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "5.5" ] }, "asin": "B09FY3T27X" }, { "task_id": "ws_B07JJF83L3_6651", "instruction": "i am looking for professional water resistant airbrush makeup foundation having light golden luminous color, .5 fl oz", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "light golden luminous", ".5 fl oz" ] }, "asin": "B07JJF83L3" }, { "task_id": "ws_B07HHMJJ7G_6652", "instruction": "i want a non toxic sulfate free cruelty free shampoo for healthy hair", "target_attributes": { "attributes": [ "non toxic", "cruelty free" ], "options": [] }, "asin": "B07HHMJJ7G" }, { "task_id": "ws_B08CD9H351_6653", "instruction": "i am looking for elastics & ties of black color for hair styling", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "black" ] }, "asin": "B08CD9H351" }, { "task_id": "ws_B004BCX8JS_6654", "instruction": "i am looking for highly pigmented lipstick in seine sunset color", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "seine sunset" ] }, "asin": "B004BCX8JS" }, { "task_id": "ws_B004BCX8JS_6655", "instruction": "i am looking for highly pigmented lipstick in golden grape color", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "golden grape" ] }, "asin": "B004BCX8JS" }, { "task_id": "ws_B004BCX8JS_6656", "instruction": "i'm looking for a volcanic reds lipstick with argan oil", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "volcanic", "reds" ] }, "asin": "B004BCX8JS" }, { "task_id": "ws_B004BCX8JS_6657", "instruction": "am looking for highly pigmented l'oreal paris makeup colour riche original creamy, british red color", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "british red" ] }, "asin": "B004BCX8JS" }, { "task_id": "ws_B099JH5LW4_6658", "instruction": "i am looking for bathroom laundry room wood framed decor.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "bathroom - 1" ] }, "asin": "B099JH5LW4" }, { "task_id": "ws_B01MU8Z4FX_6659", "instruction": "i am looking for gluten free chocolate with blueberry flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B01MU8Z4FX" }, { "task_id": "ws_B09BK48GJZ_6660", "instruction": "vegan beard and stache balm paraben free", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "vegan beard wax" ] }, "asin": "B09BK48GJZ" }, { "task_id": "ws_B0785W9DZJ_6661", "instruction": "i am looking for a short sleeve t shirts for men of venom red (690) | black color.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "venom red (690) | black" ] }, "asin": "B0785W9DZJ" }, { "task_id": "ws_B0785W9DZJ_6662", "instruction": "i am looking for one size t-shirts having short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "one size" ] }, "asin": "B0785W9DZJ" }, { "task_id": "ws_B097HSHC8C_6663", "instruction": "i am looking for a 2 pack of ready to eat turkey", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "2 pack" ] }, "asin": "B097HSHC8C" }, { "task_id": "ws_B097HSHC8C_6664", "instruction": "i'm looking for a fully cooked meat loaf that comes in a four pack and has tomato sauce.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "meatloaf with tomato sauce", "4 pack" ] }, "asin": "B097HSHC8C" }, { "task_id": "ws_B09MS76DBX_6665", "instruction": "i am looking for makeup remover for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B09MS76DBX" }, { "task_id": "ws_B01HJWDKPI_6666", "instruction": "i would like a 12 foot gold plated hdmi male to male cable. and can i have 10 of them.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10 pack", "12 feet (single pack)", "hdmi male to female" ] }, "asin": "B01HJWDKPI" }, { "task_id": "ws_B01HJWDKPI_6667", "instruction": "i need a gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [] }, "asin": "B01HJWDKPI" }, { "task_id": "ws_B01HJWDKPI_6668", "instruction": "i need a high speed hdmi male to male cable which is gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "hdmi male to male" ] }, "asin": "B01HJWDKPI" }, { "task_id": "ws_B09Q88VLSZ_6669", "instruction": "men's tuxedo t-shirt for daily wear also choose white colour", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "white" ] }, "asin": "B09Q88VLSZ" }, { "task_id": "ws_B0168IVTN4_6670", "instruction": "i want a pair of moisture wicking outdoor pants which is also machine washable. get me something in adaptive green versastretch color.", "target_attributes": { "attributes": [ "moisture wicking", "machine wash" ], "options": [ "adaptive green versastretch" ] }, "asin": "B0168IVTN4" }, { "task_id": "ws_B09S1591W1_6671", "instruction": "i am looking for a large short sleeve t shirt for women", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B09S1591W1" }, { "task_id": "ws_B09PTH1DRG_6672", "instruction": "hp slim tower desktop pc intel core j4025 processor (32gb/1tb hdd/1 tb ssd wired keyboard)", "target_attributes": { "attributes": [ "intel core" ], "options": [ "32gb ram | 1tb hdd + 1tb ssd" ] }, "asin": "B09PTH1DRG" }, { "task_id": "ws_B097RGR7PF_6673", "instruction": "i'm looking for smartwatch accessories for compatible apple and glass screen and need to buy it.", "target_attributes": { "attributes": [ "compatible apple", "glass screen" ], "options": [ "golden&grey&black" ] }, "asin": "B097RGR7PF" }, { "task_id": "ws_B09F574B6R_6674", "instruction": "i am looking for fragrance free lotion for dry skin", "target_attributes": { "attributes": [ "fragrance free", "dry skin" ], "options": [] }, "asin": "B09F574B6R" }, { "task_id": "ws_B09QPM1MWH_6675", "instruction": "i would like a white full size stairway bunk bed with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "white", "full", "twin over full stairway bunk beds with t..." ] }, "asin": "B09QPM1MWH" }, { "task_id": "ws_B09QPM1MWH_6676", "instruction": "i am looking for grey color steel metal bedframe that is heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "grey" ] }, "asin": "B09QPM1MWH" }, { "task_id": "ws_B09QPM1MWH_6677", "instruction": "i'm looking for heavy duty twin solid wood triple bunk bed with 2 drawer.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "twin", "solid wood triple bunk bed with 2 drawer..." ] }, "asin": "B09QPM1MWH" }, { "task_id": "ws_B09QPM1MWH_6678", "instruction": "i want an espresso colored cotoala twin size daybed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "espresso" ] }, "asin": "B09QPM1MWH" }, { "task_id": "ws_B09BQQ3KMY_6679", "instruction": "i looking foot files for removing dead foot skin stainless steel can clean easly set of 20 pcs", "target_attributes": { "attributes": [ "easy clean", "stainless steel", "dead skin" ], "options": [ "20pcs" ] }, "asin": "B09BQQ3KMY" }, { "task_id": "ws_B0877PX27D_6680", "instruction": "i am looking for an alcohol free night cream for my face. make sure it is for sensitive skin.", "target_attributes": { "attributes": [ "alcohol free", "sensitive skin" ], "options": [ "night" ] }, "asin": "B0877PX27D" }, { "task_id": "ws_B08HCVLVJ8_6681", "instruction": "i need two lounge chairs for outdoors. it should be in grey, easy to assemble with a steel frame.", "target_attributes": { "attributes": [ "easy assemble", "steel frame" ], "options": [ "grey", "2" ] }, "asin": "B08HCVLVJ8" }, { "task_id": "ws_B09FW83GBK_6682", "instruction": "gummy and candy corn 5 pound with resealable bag", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "5 pound (bulk)" ] }, "asin": "B09FW83GBK" }, { "task_id": "ws_B01D7SO5AW_6683", "instruction": "i'm looking for a anti perspirant deodorant that is long lasting.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B01D7SO5AW" }, { "task_id": "ws_B09SYT5CX8_6684", "instruction": "help me find a high quality, easy clean set of massage table covers in blue.", "target_attributes": { "attributes": [ "high quality", "easy clean" ], "options": [ "blue" ] }, "asin": "B09SYT5CX8" }, { "task_id": "ws_B004Y9GY44_6685", "instruction": "i am looking for a 120 light concealers & neutralizers for dark circles", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "120 light" ] }, "asin": "B004Y9GY44" }, { "task_id": "ws_B07B3RJZMJ_6686", "instruction": "i'm looking for eye shadow for eye makeup.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "k" ] }, "asin": "B07B3RJZMJ" }, { "task_id": "ws_B09T2Z324R_6687", "instruction": "i need a high quality bed cover that is easy to clean. find something in purple.", "target_attributes": { "attributes": [ "high quality", "easy clean" ], "options": [ "purple" ] }, "asin": "B09T2Z324R" }, { "task_id": "ws_B09NRDMBFB_6688", "instruction": "i'm looking for temper glass and glass screen for cell phones acesseries and the color fray need to buy it.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "gray" ] }, "asin": "B09NRDMBFB" }, { "task_id": "ws_B08NTY56S6_6689", "instruction": "i am looking for hair growth oil with natural ingredients", "target_attributes": { "attributes": [ "natural ingredients", "hair growth", "hair treatment" ], "options": [] }, "asin": "B08NTY56S6" }, { "task_id": "ws_B0973JHGNF_6690", "instruction": "i am looking for a cake toppers for party supplies and flavor must be new cake toy- cheese flavor (girls).", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "new cake toy- cheese flavor (girls)" ] }, "asin": "B0973JHGNF" }, { "task_id": "ws_B097F2ZZ2T_6691", "instruction": "i'm looking for soy wax for candles and its for long lasting.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [] }, "asin": "B097F2ZZ2T" }, { "task_id": "ws_B09HJGNLSW_6692", "instruction": "i would like a standing shelf unit for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09HJGNLSW" }, { "task_id": "ws_B07HLW5F1L_6693", "instruction": "i need a vegan smoothie in chocolate strawberry flavor. it should be soy and lactose free.", "target_attributes": { "attributes": [ "soy free", "lactose free" ], "options": [ "vegan chocolate strawberry" ] }, "asin": "B07HLW5F1L" }, { "task_id": "ws_B07DVDQZ8C_6694", "instruction": "i would like a 3.52 ounce bottle of baby blue and pink body glitter that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "baby blue with pink", "3.52 ounce (pack of 1)" ] }, "asin": "B07DVDQZ8C" }, { "task_id": "ws_B07GWH4SDR_6695", "instruction": "i am looking for 4 packs of fat free chicken meat.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "4" ] }, "asin": "B07GWH4SDR" }, { "task_id": "ws_B08HPTTWTT_6696", "instruction": "i need a sugar free and gluten free salami pack with a barolo flavor.", "target_attributes": { "attributes": [ "sugar free", "gluten free" ], "options": [ "barolo" ] }, "asin": "B08HPTTWTT" }, { "task_id": "ws_B00TPLLJMI_6697", "instruction": "i'm looking for high speed accessories and three product of packaging.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 pack" ] }, "asin": "B00TPLLJMI" }, { "task_id": "ws_B00TPLLJMI_6698", "instruction": "i want a 2 pack of 80 foot long gold plated hdmi male to male cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "2 pack", "80 feet", "hdmi male to female" ] }, "asin": "B00TPLLJMI" }, { "task_id": "ws_B08M92FCMD_6699", "instruction": "i am looking for refurbished bluetooth speaker.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B08M92FCMD" }, { "task_id": "ws_B093B59MGM_6700", "instruction": "i am looking for a slide scanner with usb and aaa batteries included. it should be easy to carry as well.", "target_attributes": { "attributes": [ "easy carry", "aaa batteries" ], "options": [] }, "asin": "B093B59MGM" }, { "task_id": "ws_B07D6HRK4X_6701", "instruction": "i would like to buy a large poster for the living room of size 70\"wx40\"h that is easy to install.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "70\"wx40\"h" ] }, "asin": "B07D6HRK4X" }, { "task_id": "ws_B08F4YS4H6_6702", "instruction": "i want a primer face plant based and oil free", "target_attributes": { "attributes": [ "oil free", "plant based" ], "options": [] }, "asin": "B08F4YS4H6" }, { "task_id": "ws_B09GPDV5TY_6703", "instruction": "i am searching for high gloss storage cabinet organizer for living room", "target_attributes": { "attributes": [ "high gloss", "living room" ], "options": [] }, "asin": "B09GPDV5TY" }, { "task_id": "ws_B0042JVEVY_6704", "instruction": "i am looking for a dresser. it should be made of engineered wood and please choose jamocha wood finish.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "jamocha wood finish" ] }, "asin": "B0042JVEVY" }, { "task_id": "ws_B000HDJXGW_6705", "instruction": "i am looking for a dairy free soft baked cookies with soy free. also choose gingerbread spice flavor and 1 ounce (pack of 36) one.", "target_attributes": { "attributes": [ "soy free", "dairy free" ], "options": [ "gingerbread spice", "1 ounce (pack of 36)" ] }, "asin": "B000HDJXGW" }, { "task_id": "ws_B07M68GDP8_6706", "instruction": "i am looking for a blue linen contemporary design beds.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "blue linen" ] }, "asin": "B07M68GDP8" }, { "task_id": "ws_B09MH9XB39_6707", "instruction": "i'm looking for a 4 pounds bag of individually wrapped chocolate candies.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "4 pounds" ] }, "asin": "B09MH9XB39" }, { "task_id": "ws_B07LBY4S4G_6708", "instruction": "i need a facial scrub that is anti aging and is made of natural ingredients.", "target_attributes": { "attributes": [ "anti aging", "natural ingredients" ], "options": [] }, "asin": "B07LBY4S4G" }, { "task_id": "ws_B09R264MPH_6709", "instruction": "i am looking for a non-slip slide sandals shoes that has 8 wide size. ad please get me the black one", "target_attributes": { "attributes": [ "non slip" ], "options": [ "black", "8 wide" ] }, "asin": "B09R264MPH" }, { "task_id": "ws_B004QC6VAG_6710", "instruction": "find me a light weight monopod made of carbon fiber.", "target_attributes": { "attributes": [ "light weight", "carbon fiber" ], "options": [] }, "asin": "B004QC6VAG" }, { "task_id": "ws_B07WQ1VH72_6711", "instruction": "i want to find a plum fire hd 8 tablet with a quad core and 32 gigabytes of storage space. it needs to have a lock screen and come with a case and screen protector.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "plum", "32 gb", "lockscreen ad-supported", "with case & screen protector (2-pack)" ] }, "asin": "B07WQ1VH72" }, { "task_id": "ws_B07WQ1VH72_6712", "instruction": "i need 8\" hd display, 64 gb quad core tablet with lockscreen ad-supported", "target_attributes": { "attributes": [ "quad core" ], "options": [ "64 gb", "lockscreen ad-supported" ] }, "asin": "B07WQ1VH72" }, { "task_id": "ws_B07WQ1VH72_6713", "instruction": "i would like a black 64 gigabyte tablet with a case and screen protector. it also needs to be able to be hands free and have a ad supported lockscreen.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "black", "64 gb", "lockscreen ad-supported", "with case & screen protector (2-pack)" ] }, "asin": "B07WQ1VH72" }, { "task_id": "ws_B07B51WS9B_6714", "instruction": "i'm looking for nickel finish for living room.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish", "living room" ], "options": [ "earth palette" ] }, "asin": "B07B51WS9B" }, { "task_id": "ws_B074Q3H6X7_6715", "instruction": "i am looking for an organic shampoo which is effective my hair lose . and i choose the 4 ounce hair treatment", "target_attributes": { "attributes": [ "certified organic", "hair loss" ], "options": [ "hair treatment 4 ounce" ] }, "asin": "B074Q3H6X7" }, { "task_id": "ws_B074Q3H6X7_6716", "instruction": "i am looking for a shampoo 17.5 ounce for hair growth hair loss", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "shampoo 17.5 ounce" ] }, "asin": "B074Q3H6X7" }, { "task_id": "ws_B074Q3H6X7_6717", "instruction": "i want a 2 ounce shampoo bottle of hormonal balance made from argan oil.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "shampoo 2 ounce", "hormonal balance+hair treatment" ] }, "asin": "B074Q3H6X7" }, { "task_id": "ws_B074Q3H6X7_6718", "instruction": "i want a bottle of flower power laritelle organic shampoo.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "flower power" ] }, "asin": "B074Q3H6X7" }, { "task_id": "ws_B0086UI2GU_6719", "instruction": "i am looking healthy crispy chips snacks gluten free low fat high protein size: 4 ounce (pack of 6)", "target_attributes": { "attributes": [ "gluten free", "low fat", "high protein" ], "options": [ "4 ounce (pack of 6)" ] }, "asin": "B0086UI2GU" }, { "task_id": "ws_B01N2W63JO_6720", "instruction": "i am looking for a ac adapters for wireless bluetooth", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B01N2W63JO" }, { "task_id": "ws_B00DQQQOGY_6721", "instruction": "i am looking for a white engineered wood for bookcases", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "white" ] }, "asin": "B00DQQQOGY" }, { "task_id": "ws_B07D5GQJZG_6722", "instruction": "i need chandelier light fixture for dining room which should have bronze finish and glass shades.", "target_attributes": { "attributes": [ "bronze finish", "glass shade", "light fixture", "dining room" ], "options": [] }, "asin": "B07D5GQJZG" }, { "task_id": "ws_B07YW75RT3_6723", "instruction": "i am looking for a set of 2 velvet fabric dining chairs for my dining room . and i choose the teal one", "target_attributes": { "attributes": [ "dining room" ], "options": [ "teal" ] }, "asin": "B07YW75RT3" }, { "task_id": "ws_B018F6PGY0_6724", "instruction": "i need to buy some old fashioned cocktail bitters for a gift. look for the \"mole negro\" flavor.", "target_attributes": { "attributes": [ "old fashioned", "perfect gift" ], "options": [ "mole negro" ] }, "asin": "B018F6PGY0" }, { "task_id": "ws_B09H7LSHMY_6725", "instruction": "i'm looking for short sleeve outfit large sized.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "a8-blue", "large" ] }, "asin": "B09H7LSHMY" }, { "task_id": "ws_B07ZTS8NQP_6726", "instruction": "i am looking for a fragrance free lip glosses of sweet escape color.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "sweet escape" ] }, "asin": "B07ZTS8NQP" }, { "task_id": "ws_B09F5LHLH2_6727", "instruction": "i am looking for an oral hygiene toothbrush. it should be easy to carry.", "target_attributes": { "attributes": [ "easy carry", "oral hygiene" ], "options": [] }, "asin": "B09F5LHLH2" }, { "task_id": "ws_B08QVBQ9DP_6728", "instruction": "i am searching for a long lasting high quality hair drying towel to dry my hair.", "target_attributes": { "attributes": [ "long lasting", "high quality", "dry hair" ], "options": [] }, "asin": "B08QVBQ9DP" }, { "task_id": "ws_B09QHKSR5W_6729", "instruction": "i want a quick release watch band in grey, black, white or blue.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "grey black white blue" ] }, "asin": "B09QHKSR5W" }, { "task_id": "ws_B096VD3PRG_6730", "instruction": "i'm looking for queen sized wood frames for bed frames.", "target_attributes": { "attributes": [ "box spring", "metal legs", "memory foam", "wood frame" ], "options": [ "queen" ] }, "asin": "B096VD3PRG" }, { "task_id": "ws_B08XWZ8CFC_6731", "instruction": "i am looking for gluten-free, lactose-free, dairy free, non-gmo salami.", "target_attributes": { "attributes": [ "lactose free", "gluten free", "dairy free", "non gmo" ], "options": [] }, "asin": "B08XWZ8CFC" }, { "task_id": "ws_B07P8YHFHJ_6732", "instruction": "men's small size soft material elastic clouser comfertable briefs", "target_attributes": { "attributes": [ "soft material", "elastic closure" ], "options": [ "tiger", "small" ] }, "asin": "B07P8YHFHJ" }, { "task_id": "ws_B07GW2GQSS_6733", "instruction": "i'm looking for a 7 ounce chunk chicken creast in pack of 2 and fat free", "target_attributes": { "attributes": [ "fat free" ], "options": [ "7 ounce (pack of 2)" ] }, "asin": "B07GW2GQSS" }, { "task_id": "ws_B09CLLNY85_6734", "instruction": "i am looking for sugar cookies in a gift basket", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B09CLLNY85" }, { "task_id": "ws_B08RBSM3W2_6735", "instruction": "i need heavy duty blackout curtains for my living room. pick something in beige.", "target_attributes": { "attributes": [ "heavy duty", "living room" ], "options": [ "beige" ] }, "asin": "B08RBSM3W2" }, { "task_id": "ws_B09SL2P135_6736", "instruction": "i want high quality hair in water wave bundles with closure. it should remedy my hair loss.", "target_attributes": { "attributes": [ "high quality", "hair loss" ], "options": [ "water wave bundles with closure" ] }, "asin": "B09SL2P135" }, { "task_id": "ws_B09SL2P135_6737", "instruction": "i am looking for a curly lace frontal that is effective for hair loss. an i choose the 22 24 26+20\"closure with water wave bundles", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "water wave bundles with closure", "22 24 26+20\"closure" ] }, "asin": "B09SL2P135" }, { "task_id": "ws_B09SL2P135_6738", "instruction": "can you find a high quality brazilian 13x4 curly lace frontal in size 24 24 24?", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B09SL2P135" }, { "task_id": "ws_B09SL2P135_6739", "instruction": "order me four bundles of high quality curly hair extensions.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "curly hair 4 bundles" ] }, "asin": "B09SL2P135" }, { "task_id": "ws_B07TKMGM6R_6740", "instruction": "i am looking for a long sleeve hoodies of medium size for men.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B07TKMGM6R" }, { "task_id": "ws_B07D2HSH4D_6741", "instruction": "i'm looking for a high performance hdmi to displayport adapter cable that's easy to use.", "target_attributes": { "attributes": [ "high performance", "easy use" ], "options": [] }, "asin": "B07D2HSH4D" }, { "task_id": "ws_B08QCCRLTH_6742", "instruction": "i am looking for a noise cancelling computer headsets.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B08QCCRLTH" }, { "task_id": "ws_B08C9ZCWVW_6743", "instruction": "i looking a maroon color ceiling lights haning pandent fixture for living room", "target_attributes": { "attributes": [ "light fixture", "living room" ], "options": [] }, "asin": "B08C9ZCWVW" }, { "task_id": "ws_B09JBVY7JD_6744", "instruction": "i want to shop for a two pack of glass lamp shades for pendant lamps.", "target_attributes": { "attributes": [ "glass shade", "pendant light" ], "options": [ "2 pack" ] }, "asin": "B09JBVY7JD" }, { "task_id": "ws_B07955HD69_6745", "instruction": "i would like a rose gold single wireless bluetooth speaker that is hands free.", "target_attributes": { "attributes": [ "hands free", "wireless bluetooth" ], "options": [ "rose gold single" ] }, "asin": "B07955HD69" }, { "task_id": "ws_B079X4CPKD_6746", "instruction": "i'm looking for a pack of 24 count of breakfast bars gluten free", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry almond", "24 count (pack of 1)" ] }, "asin": "B079X4CPKD" }, { "task_id": "ws_B079X4CPKD_6747", "instruction": "i'm looking for healthy breakfast bars enriched with peanut butter.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "24 count (pack of 1)" ] }, "asin": "B079X4CPKD" }, { "task_id": "ws_B003Q4TVK2_6748", "instruction": "i'm looking for caffeine free for coffee and tea.", "target_attributes": { "attributes": [ "caffeine free", "sugar free" ], "options": [ "turmeric latte" ] }, "asin": "B003Q4TVK2" }, { "task_id": "ws_B003Q4TVK2_6749", "instruction": "i want to buy chai tea which is caffeine free and has vanilla flavor, and it's in pack of 1 of 64 ounce.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "vanilla", "64 ounce (pack of 1)" ] }, "asin": "B003Q4TVK2" }, { "task_id": "ws_B087RDLZSG_6750", "instruction": "i would like a size 24 brown shelves for my living room wall.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown", "24" ] }, "asin": "B087RDLZSG" }, { "task_id": "ws_B001E5D0GQ_6751", "instruction": "i am looking for a fluoride free toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B001E5D0GQ" }, { "task_id": "ws_B07VTCL2JV_6752", "instruction": "i am looking for a synthetic sole flip flop. also, choose munsell white color and 5 narrow size.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "neo flame | munsell white", "5 narrow" ] }, "asin": "B07VTCL2JV" }, { "task_id": "ws_B07DN85MVR_6753", "instruction": "i would like a pair of small black sleep bottoms that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "black#1-a31", "small" ] }, "asin": "B07DN85MVR" }, { "task_id": "ws_B07Q5K4V3S_6754", "instruction": "i'm looking for skin care for nail polish that color was aphrdesie neede.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "aphrodesie" ] }, "asin": "B07Q5K4V3S" }, { "task_id": "ws_B07Z4PX5T5_6755", "instruction": "i am looking for a nylon spandex swimsuits & cover ups of 20 plus size.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "20 plus" ] }, "asin": "B07Z4PX5T5" }, { "task_id": "ws_B07H3BR9D2_6756", "instruction": "men's daily use slip resistance rubber sole shoe color reddish brown size: 8", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "reddish brown", "8" ] }, "asin": "B07H3BR9D2" }, { "task_id": "ws_B095CSL3SY_6757", "instruction": "i am looking for a polyester cotton board short which is washable in machine. also choose grey one and 38 size.", "target_attributes": { "attributes": [ "machine washable", "polyester cotton" ], "options": [ "grey - recycled fabric", "38" ] }, "asin": "B095CSL3SY" }, { "task_id": "ws_B099WVV8PM_6758", "instruction": "i would like a full size grey bunk bed with a wooden frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "grey with slide", "full" ] }, "asin": "B099WVV8PM" }, { "task_id": "ws_B00RM5NPPS_6759", "instruction": "i am looking for gluten free red dog rub gourmet spice blends.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "red dog rub" ] }, "asin": "B00RM5NPPS" }, { "task_id": "ws_B00RM5NPPS_6760", "instruction": "i am looking for gluten free wow-a chihuahua gourmet spice blend.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "wow-a chihuahua" ] }, "asin": "B00RM5NPPS" }, { "task_id": "ws_B09GF81JCB_6761", "instruction": "looking for new version of modern glass dining table set for dining room", "target_attributes": { "attributes": [ "long lasting", "dining room" ], "options": [ "new version" ] }, "asin": "B09GF81JCB" }, { "task_id": "ws_B096L8CY62_6762", "instruction": "i am looking for a black fast wireless universal charging stand.", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [ "black" ] }, "asin": "B096L8CY62" }, { "task_id": "ws_B00H0HBBBI_6763", "instruction": "i'm looking for hair extension for hair growth it was high quality and need to buy it.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "strawberry blonde mix #26h613 g36a" ] }, "asin": "B00H0HBBBI" }, { "task_id": "ws_B07ZK4J929_6764", "instruction": "looking for machine washable 52 w by 52 cute pet window curtains", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "52\" w by 52\" l" ] }, "asin": "B07ZK4J929" }, { "task_id": "ws_B09HCRY1F6_6765", "instruction": "i'm looking for long sleeve clothing and it was easy to wash the color red is attractive.", "target_attributes": { "attributes": [ "wash cold", "long sleeve", "short sleeve", "teen girls" ], "options": [ "red#d01" ] }, "asin": "B09HCRY1F6" }, { "task_id": "ws_B07XP6H6DN_6766", "instruction": "i would like a 2xl women's navy tank top with a officially licensed star wars logo.", "target_attributes": { "attributes": [ "officially licensed", "star wars" ], "options": [ "navy", "women", "xx-large" ] }, "asin": "B07XP6H6DN" }, { "task_id": "ws_B077T3SP3V_6767", "instruction": "i am in a search for sugar free soft drink mixes of fruit punch flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "fruit punch" ] }, "asin": "B077T3SP3V" }, { "task_id": "ws_B088D1XNG5_6768", "instruction": "i'm looking for tablets for my uses and i want red color. it was long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "red" ] }, "asin": "B088D1XNG5" }, { "task_id": "ws_B07W71VWF7_6769", "instruction": "i am looking for an intel quad core computer with 16 gb ram, 256 gb ssd and also a 1tb hdd.", "target_attributes": { "attributes": [ "intel core", "quad core" ], "options": [ "16gb ram 256gb ssd 1tb hdd" ] }, "asin": "B07W71VWF7" }, { "task_id": "ws_B07W71VWF7_6770", "instruction": "mini pc with intel core i7 processor", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B07W71VWF7" }, { "task_id": "ws_B07L788143_6771", "instruction": "i need a grey or light blue colored area rug that is suitable for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey | light blue" ] }, "asin": "B07L788143" }, { "task_id": "ws_B08RJ7CJG7_6772", "instruction": "i'm looking for soy wax it can use make for candles.", "target_attributes": { "attributes": [ "long lasting", "eco friendly", "soy wax" ], "options": [ "jar brown" ] }, "asin": "B08RJ7CJG7" }, { "task_id": "ws_B08RJ7CJG7_6773", "instruction": "i want special glass soy wax scented candles.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "glass 2" ] }, "asin": "B08RJ7CJG7" }, { "task_id": "ws_B0828M96S7_6774", "instruction": "i am looking for a silver water and birch style of anti perspirant deodorant", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "silver water and birch" ] }, "asin": "B0828M96S7" }, { "task_id": "ws_B0828M96S7_6775", "instruction": "i am looking for long lasting sage and citrus anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [ "sage and citrus" ] }, "asin": "B0828M96S7" }, { "task_id": "ws_B079M1L3GN_6776", "instruction": "i am looking for a 3 inch queen size memory foam mattress toppers.", "target_attributes": { "attributes": [ "queen size", "memory foam" ], "options": [ "3 inch" ] }, "asin": "B079M1L3GN" }, { "task_id": "ws_B06XVDHJQG_6777", "instruction": "i am searching for dark brown synthetic hair extensions with the size of 22 inch and pack of 1.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "dark brown", "22 inch (pack of 1)" ] }, "asin": "B06XVDHJQG" }, { "task_id": "ws_B09MQFZT7G_6778", "instruction": "i need a white storage cabinet tv stand that is easy to assemble and goes in my living room. it should be highly glossy.", "target_attributes": { "attributes": [ "easy assemble", "high gloss", "living room" ], "options": [ "63\" white-2 cabinet" ] }, "asin": "B09MQFZT7G" }, { "task_id": "ws_B07QFL1S9C_6779", "instruction": "i need a high quality perfume atomizer bottle that is easy to carry and has 1 color.", "target_attributes": { "attributes": [ "easy carry", "high quality" ], "options": [ "1" ] }, "asin": "B07QFL1S9C" }, { "task_id": "ws_B09FGLB9L8_6780", "instruction": "i would like a 20m digital 4g lte coaxial cable that's male to female.", "target_attributes": { "attributes": [ "coaxial cable", "4g lte" ], "options": [ "n male to n female", "20m" ] }, "asin": "B09FGLB9L8" }, { "task_id": "ws_B09FGLB9L8_6781", "instruction": "i am looking for a cable extension that is male to male and supports 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "n male to n male" ] }, "asin": "B09FGLB9L8" }, { "task_id": "ws_B01MCV2G56_6782", "instruction": "i'm looking for furniture was in living room the color was crystal gray furniture was so good.", "target_attributes": { "attributes": [ "living room" ], "options": [ "frosted crystal gray" ] }, "asin": "B01MCV2G56" }, { "task_id": "ws_B0049YMA9W_6783", "instruction": "i'm looking for a great river organic milling flour.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "flour + dark rye flour", "50 pound (pack of 1)", "graham" ] }, "asin": "B0049YMA9W" }, { "task_id": "ws_B08T6YGGGX_6784", "instruction": "i'm looking for a vanity mirror easy to install 40x32 with light led", "target_attributes": { "attributes": [ "easy install" ], "options": [ "inlaid-40x32" ] }, "asin": "B08T6YGGGX" }, { "task_id": "ws_B08PYG5KJ2_6785", "instruction": "i am looking for an empty lip gloss tube 5ml which is of high quality and leak proof.", "target_attributes": { "attributes": [ "high quality", "leak proof" ], "options": [] }, "asin": "B08PYG5KJ2" }, { "task_id": "ws_B07NSFKJFC_6786", "instruction": "i am looking for a zero sugar flavor syrups of banana split", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "banana split" ] }, "asin": "B07NSFKJFC" }, { "task_id": "ws_B0843SFXGL_6787", "instruction": "i am looking for steel frame chairs in grey color", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "3011-grey" ] }, "asin": "B0843SFXGL" }, { "task_id": "ws_B09P3PYJJJ_6788", "instruction": "can i get a green women short sleeve dandelion printed blouse thats is loose fit and desirable for day comfort?", "target_attributes": { "attributes": [ "loose fit", "day comfort", "short sleeve" ], "options": [ "z14-green" ] }, "asin": "B09P3PYJJJ" }, { "task_id": "ws_B07RRWQQB9_6789", "instruction": "i'm looking for walnut color home accessories its very easy to clean.", "target_attributes": { "attributes": [ "easy clean", "easy assemble" ], "options": [ "walnut" ] }, "asin": "B07RRWQQB9" }, { "task_id": "ws_B09MLZ254V_6790", "instruction": "i am looking for anti slip athletic sneakers in black yellow", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "black yellow black-5" ] }, "asin": "B09MLZ254V" }, { "task_id": "ws_B084LPGQ46_6791", "instruction": "i'm looking for a fresh baked snack cakes made with good quality ingredients. also choose pack of 1 with weight 4 ounce one.", "target_attributes": { "attributes": [ "baked fresh", "quality ingredients" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B084LPGQ46" }, { "task_id": "ws_B084LPGQ46_6792", "instruction": "i would like two pounds of baked fresh snack cakes.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B084LPGQ46" }, { "task_id": "ws_B07JB8FRGT_6793", "instruction": "i'm looking for midnight bakck smartwatch accessories. its can long lasting product.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "midnight black & white, black" ] }, "asin": "B07JB8FRGT" }, { "task_id": "ws_B08XN9RKQV_6794", "instruction": "i'm looking for short and long sleeve for women men its for slim fit.", "target_attributes": { "attributes": [ "loose fit", "slim fit", "short sleeve", "long sleeve" ], "options": [ "black" ] }, "asin": "B08XN9RKQV" }, { "task_id": "ws_B08TC36KJL_6795", "instruction": "i seek a tripod stand that is compatible with my iphone and is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B08TC36KJL" }, { "task_id": "ws_B07QZFKFT9_6796", "instruction": "i am searching for a z2 black colored swimsuit cover up wide leg pants. also, choose the loose fit.", "target_attributes": { "attributes": [ "wide leg", "loose fit" ], "options": [ "z2-black" ] }, "asin": "B07QZFKFT9" }, { "task_id": "ws_B09Q1NWKL8_6797", "instruction": "i am looking for 6 boxes of cookies. these should be individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "6 boxes" ] }, "asin": "B09Q1NWKL8" }, { "task_id": "ws_B07VZVYG4C_6798", "instruction": "i am looking for a gluten free nut bars of almond blueberry flavor", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "almond blueberry" ] }, "asin": "B07VZVYG4C" }, { "task_id": "ws_B0953BBDT4_6799", "instruction": "i saw the butterfly flower nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "butterflyflower" ] }, "asin": "B0953BBDT4" }, { "task_id": "ws_B093B54PCJ_6800", "instruction": "alex evenings a-line women's long dress is what i want to buy today, with hood draped in the back, help find this model in dark plum, hand wash.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "dark plum", "10" ] }, "asin": "B093B54PCJ" }, { "task_id": "ws_B09Q951VRW_6801", "instruction": "i'm looking for a butt lifting yoga pants with high waist tummy control band. also, choose large size black colored one.", "target_attributes": { "attributes": [ "butt lifting", "tummy control", "high waist" ], "options": [ "black", "large" ] }, "asin": "B09Q951VRW" }, { "task_id": "ws_B09PXDCS4G_6802", "instruction": "i am looking for a black portable bluetooth speakers which is easy carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "black" ] }, "asin": "B09PXDCS4G" }, { "task_id": "ws_B08TX29XY9_6803", "instruction": "i am looking for an underwater themed 6 foot by 9 foot light weight vinyl photography backdrop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "6x9 ft" ] }, "asin": "B08TX29XY9" }, { "task_id": "ws_B08TX29XY9_6804", "instruction": "i am looking for a 6x9 ft backgrounds for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "6x9 ft" ] }, "asin": "B08TX29XY9" }, { "task_id": "ws_B012H0BI7O_6805", "instruction": "i am looking for high quality long lasting mudslide colored liquid lipstick.", "target_attributes": { "attributes": [ "long lasting", "high quality" ], "options": [ "mudslide" ] }, "asin": "B012H0BI7O" }, { "task_id": "ws_B09SV5Z81W_6806", "instruction": "i am looking for a antiperspirant deodorant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B09SV5Z81W" }, { "task_id": "ws_B086JQP3JN_6807", "instruction": "i am looking long totally cruelty-free,reusable &handmade high quality color xmz212 size :3 pair", "target_attributes": { "attributes": [ "cruelty free", "high quality" ], "options": [ "xmz212", "3 pair (pack of 1)" ] }, "asin": "B086JQP3JN" }, { "task_id": "ws_B0091K993O_6808", "instruction": "i am looking for paraben free makeup powder. please choose copper color.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "copper" ] }, "asin": "B0091K993O" }, { "task_id": "ws_B01451UXUG_6809", "instruction": "i am looking for anti aging serum for dry skin.", "target_attributes": { "attributes": [ "anti aging", "dry skin" ], "options": [] }, "asin": "B01451UXUG" }, { "task_id": "ws_B001BCXI14_6810", "instruction": "i'm looking for a 24 pack ro-tel mild diced tomatoes and green chilies.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "mild" ] }, "asin": "B001BCXI14" }, { "task_id": "ws_B084QHSD15_6811", "instruction": "i am looking for a easy assemble bookcases", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B084QHSD15" }, { "task_id": "ws_B0912QMLM6_6812", "instruction": "i'm looking for a omysalon all purpose hydraulic barber chair .", "target_attributes": { "attributes": [ "heavy duty", "height adjustable", "beauty salon" ], "options": [ "red" ] }, "asin": "B0912QMLM6" }, { "task_id": "ws_B09GK1QJFW_6813", "instruction": "ultra long carbon fiber pole monopod 106\" upgraded selfie stick", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "106\" upgraded selfie stick" ] }, "asin": "B09GK1QJFW" }, { "task_id": "ws_B088VRGYLS_6814", "instruction": "i need 6 fresh baked shortbread cookies that are individually wrapped.", "target_attributes": { "attributes": [ "baked fresh", "individually wrapped" ], "options": [ "6" ] }, "asin": "B088VRGYLS" }, { "task_id": "ws_B08GWS7NY4_6815", "instruction": "i am looking for a c- -coffee collection color acrylic nail tools for mnail art", "target_attributes": { "attributes": [ "nail art" ], "options": [ "c-coffee collection" ] }, "asin": "B08GWS7NY4" }, { "task_id": "ws_B07PGSRPHY_6816", "instruction": "i'm looking for a button-tufted stitched sofa that offers a mid-century look. i would prefer one with a clay gold finish.", "target_attributes": { "attributes": [ "mid century", "button tufted" ], "options": [] }, "asin": "B07PGSRPHY" }, { "task_id": "ws_B08RS1WGV9_6817", "instruction": "i'm looking for a breakfast cereal bars in a gift box. also, choose pack of 1 which weighs 5.4 ounce with fluffernutter crispies flavored one.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "fluffernutter crispies", "5.4 ounce (pack of 1)" ] }, "asin": "B08RS1WGV9" }, { "task_id": "ws_B08RS1WGV9_6818", "instruction": "i'm looking for rice crispy treats by bunch of munchies.", "target_attributes": { "attributes": [ "great gift" ], "options": [] }, "asin": "B08RS1WGV9" }, { "task_id": "ws_B08RS1WGV9_6819", "instruction": "i want by a gift easter basket with the og crispie - gourmet rice crispy, 5.9 ounce (pack of 1).", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "the og crispies", "5.9 ounce (pack of 1)" ] }, "asin": "B08RS1WGV9" }, { "task_id": "ws_B07DPVGL5G_6820", "instruction": "i need a high protein snack which is gluten and grain free. i really like the smoky serrano flavor.", "target_attributes": { "attributes": [ "high protein", "grain free", "gluten free" ], "options": [ "smoky serrano" ] }, "asin": "B07DPVGL5G" }, { "task_id": "ws_B0192BWQV8_6821", "instruction": "i'm looking for hair care for hair extenions its for permanent hair.", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "b05 steel blue" ] }, "asin": "B0192BWQV8" }, { "task_id": "ws_B09L5XKVZC_6822", "instruction": "i am looking for a green ottomans for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green" ] }, "asin": "B09L5XKVZC" }, { "task_id": "ws_B08GLV1RYQ_6823", "instruction": "i am looking for a nautical color of fruit juice for party supplies", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "nautical" ] }, "asin": "B08GLV1RYQ" }, { "task_id": "ws_B08FBK3N18_6824", "instruction": "i'm looking for furniture it was for living room furniture.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "sofa, loveseat and 2 ottoman living room..." ] }, "asin": "B08FBK3N18" }, { "task_id": "ws_B09HLCBY4S_6825", "instruction": "i need a rose gold tattoo machine for permanent makeup.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "machine" ] }, "asin": "B09HLCBY4S" }, { "task_id": "ws_B09MVK3JG4_6826", "instruction": "i am looking for small sized sweatshirt. it should be machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "small" ] }, "asin": "B09MVK3JG4" }, { "task_id": "ws_B001M0MN0C_6827", "instruction": "i need small boxer briefs that are quick dry and white.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "white", "small" ] }, "asin": "B001M0MN0C" }, { "task_id": "ws_B07T43L34M_6828", "instruction": "i am looking for a clinically proven face moisturizer cream which supports anti aging", "target_attributes": { "attributes": [ "clinically proven", "anti aging" ], "options": [] }, "asin": "B07T43L34M" }, { "task_id": "ws_B0828P658S_6829", "instruction": "i am looking for a 4.0 rustic brown 1 color home office desk that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "4.0 rustic brown 1" ] }, "asin": "B0828P658S" }, { "task_id": "ws_B09NSPLRC1_6830", "instruction": "i'm looking for skin care products for hair styling products.", "target_attributes": { "attributes": [ "hair salon", "hair styling" ], "options": [ "d type | red with leg" ] }, "asin": "B09NSPLRC1" }, { "task_id": "ws_B09F8WTGQN_6831", "instruction": "i am looking for forest green teal blue 6 colors nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "glitter\uff1aforest green teal blue 6 colors" ] }, "asin": "B09F8WTGQN" }, { "task_id": "ws_B097GYX5VD_6832", "instruction": "womens like high quality and dark color make up accessories", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B097GYX5VD" }, { "task_id": "ws_B017DVGX1I_6833", "instruction": "i want to find a brown wall mounted wall sconce with a bronze finish.", "target_attributes": { "attributes": [ "wall mounted", "bronze finish" ], "options": [ "brown" ] }, "asin": "B017DVGX1I" }, { "task_id": "ws_B09D2YLDZ9_6834", "instruction": "i am looking for new clear and easy clean tablecloth top protection cover", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "new clear" ] }, "asin": "B09D2YLDZ9" }, { "task_id": "ws_B01MTRVZ1V_6835", "instruction": "i am looking for a multicolor runner area rug to go in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi", "runner" ] }, "asin": "B01MTRVZ1V" }, { "task_id": "ws_B09JHW1HML_6836", "instruction": "a super soft and warm flash light weight machine washable blanket for leaving room size:80\"60\"", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "80\"x60\"" ] }, "asin": "B09JHW1HML" }, { "task_id": "ws_B01MSX5462_6837", "instruction": "i am looking for golden blonde human hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "p-light blonde highlighted golden blonde #16 | 22" ] }, "asin": "B01MSX5462" }, { "task_id": "ws_B07XDTGNQL_6838", "instruction": "i'm looking for aluminum tripod light weighted products because it can easy to carry.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B07XDTGNQL" }, { "task_id": "ws_B07BVWFCNH_6839", "instruction": "i'm looking for hair rose gold colored products.", "target_attributes": { "attributes": [ "rose gold", "hair dye" ], "options": [ "7.2" ] }, "asin": "B07BVWFCNH" }, { "task_id": "ws_B089QBLHBL_6840", "instruction": "i need a gift basket of gluten free food items for my family. and i would prefer 16 bars & card size", "target_attributes": { "attributes": [ "gluten free", "gift basket" ], "options": [ "16 bars & card" ] }, "asin": "B089QBLHBL" }, { "task_id": "ws_B07SS5LM81_6841", "instruction": "i am looking for individually wrapped lollipops jar. it should be in pearl kiwi green and green apple flavor.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "pearl kiwi green - green apple" ] }, "asin": "B07SS5LM81" }, { "task_id": "ws_B095C9MFHH_6842", "instruction": "i'm looking for high power monocular telescope with smartphone holder and tripod", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B095C9MFHH" }, { "task_id": "ws_B07MKB1HLV_6843", "instruction": "i am looking for vanity wall lamp of 2 pack.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "2-pack" ] }, "asin": "B07MKB1HLV" }, { "task_id": "ws_B09GB4CSW7_6844", "instruction": "i am looking ac adapters with good output production", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B09GB4CSW7" }, { "task_id": "ws_B09GB4CSW7_6845", "instruction": "i would like a ac adapter that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B09GB4CSW7" }, { "task_id": "ws_B0992XPRW7_6846", "instruction": "i'm looking for one cocktail mix gluten free and natural ingredients spicy bloody mary flavor in pack of 2 with 32 fl oz", "target_attributes": { "attributes": [ "gluten free", "natural ingredients" ], "options": [ "spicy bloody mary variety pack", "32 fl oz (pack of 2)" ] }, "asin": "B0992XPRW7" }, { "task_id": "ws_B09368SY2Q_6847", "instruction": "i need 3v long lasting and high performance batteries in a pack of 6", "target_attributes": { "attributes": [ "long lasting", "high performance" ], "options": [ "6 pack" ] }, "asin": "B09368SY2Q" }, { "task_id": "ws_B0868LDR64_6848", "instruction": "i'm looking for high heeled shoes and open toe it will easy to wear", "target_attributes": { "attributes": [ "open toe", "ankle strap", "high heel" ], "options": [ "y-03 black" ] }, "asin": "B0868LDR64" }, { "task_id": "ws_B09LT57M8J_6849", "instruction": "i am looking for birthday cake in black 40", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "black 40" ] }, "asin": "B09LT57M8J" }, { "task_id": "ws_B081J14LT6_6850", "instruction": "i'm looking for wall art for hanging through the wall.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "custom metal print h03" ] }, "asin": "B081J14LT6" }, { "task_id": "ws_B081J14LT6_6851", "instruction": "i need a custom metal print poster for my living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "custom metal print h17" ] }, "asin": "B081J14LT6" }, { "task_id": "ws_B08TWPVRNK_6852", "instruction": "i'm looking for grey colored men's closed toe sports sandals in size 8 please.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "grey", "8" ] }, "asin": "B08TWPVRNK" }, { "task_id": "ws_B07CJW395Z_6853", "instruction": "i looking a solid wood home furnishing 2 drawer nightstand", "target_attributes": { "attributes": [ "solid wood", "home furnishings" ], "options": [ "2 drawer nightstand" ] }, "asin": "B07CJW395Z" }, { "task_id": "ws_B091G7H187_6854", "instruction": "i'm looking for some vinyl women's clogs in taupe color, size 9.", "target_attributes": { "attributes": [ "ethylene vinyl", "vinyl acetate" ], "options": [ "taupe", "9 women | 7 men" ] }, "asin": "B091G7H187" }, { "task_id": "ws_B098LHMX6X_6855", "instruction": "i need a matcha green team exfoliating scrub that is effective for removing dead skin from the surface of the skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "matcha green team" ] }, "asin": "B098LHMX6X" }, { "task_id": "ws_B09GYG7R75_6856", "instruction": "show me trail running shoes with a rubber sole. it should be 4.5 for men.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "6.5 women | 4.5 men" ] }, "asin": "B09GYG7R75" }, { "task_id": "ws_B097GVZ2RN_6857", "instruction": "i am looking for a 05 red color women sneakers for day comfort", "target_attributes": { "attributes": [ "day comfort" ], "options": [] }, "asin": "B097GVZ2RN" }, { "task_id": "ws_B08CK6XD3G_6858", "instruction": "i'm looking for a yaliaprint dragonfly blackout curtains.", "target_attributes": { "attributes": [ "white item" ], "options": [ "color18", "72\" w x 63\" l" ] }, "asin": "B08CK6XD3G" }, { "task_id": "ws_B08JY6ZPSS_6859", "instruction": "i'm looking for navy colored large sized jackets it can use for winter warm.", "target_attributes": { "attributes": [ "winter warm", "machine wash" ], "options": [ "navy", "large" ] }, "asin": "B08JY6ZPSS" }, { "task_id": "ws_B09NLMYPR4_6860", "instruction": "i need a golden colored coffee table that is easy to assemble. choose one for my living room.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "golden" ] }, "asin": "B09NLMYPR4" }, { "task_id": "ws_B09ST1YZGV_6861", "instruction": "i want to buy a hairbrush that increases hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B09ST1YZGV" }, { "task_id": "ws_B084YQXS27_6862", "instruction": "i want to get a high performance security camera with ultra hd resolution.", "target_attributes": { "attributes": [ "ultra hd", "high performance" ], "options": [] }, "asin": "B084YQXS27" }, { "task_id": "ws_B00U7BZDFO_6863", "instruction": "i am interested in a six pack of non gmo crackers.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "4 ounce (pack of 6)" ] }, "asin": "B00U7BZDFO" }, { "task_id": "ws_B09LVGMZW4_6864", "instruction": "i'm looking for accent furniture for living room.", "target_attributes": { "attributes": [ "mid century", "easy install", "living room" ], "options": [ "beige" ] }, "asin": "B09LVGMZW4" }, { "task_id": "ws_B000WCZN9Y_6865", "instruction": "i'm looking for a amy's soup.", "target_attributes": { "attributes": [ "low fat", "gluten free", "certified organic" ], "options": [] }, "asin": "B000WCZN9Y" }, { "task_id": "ws_B083GKZWVX_6866", "instruction": "i want a doorbell camera that's 1080p and has motion detection.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B083GKZWVX" }, { "task_id": "ws_B07B5NKTTG_6867", "instruction": "i'm looking for decor room for living room its full of wood finish and want to buy it.", "target_attributes": { "attributes": [ "faux leather", "wood finish" ], "options": [ "cream | walnut" ] }, "asin": "B07B5NKTTG" }, { "task_id": "ws_B08N525ZVS_6868", "instruction": "find me a kitchen table with metal legs in black oak with 39.37\" for dining room", "target_attributes": { "attributes": [ "metal legs", "dining room" ], "options": [ "black oak", "39.37\u201c" ] }, "asin": "B08N525ZVS" }, { "task_id": "ws_B08PVMTPKG_6869", "instruction": "i am looking for a 2 manual toothbrushes for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B08PVMTPKG" }, { "task_id": "ws_B09NHVNSM1_6870", "instruction": "i'm looking for snacks fully cooked no preservatives and need to buy it.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "chipotle habanero" ] }, "asin": "B09NHVNSM1" }, { "task_id": "ws_B094H3G7V2_6871", "instruction": "i'm looking for accessories for women's for dead skin adn need to buy it.", "target_attributes": { "attributes": [ "double sided", "rose gold", "dead skin", "beauty salon" ], "options": [] }, "asin": "B094H3G7V2" }, { "task_id": "ws_B09PG876ZQ_6872", "instruction": "i'm looking for machine washable, daily wear boxer briefs with elastic waistband and has unique design. also choose x-large, love with hearts black colored one.", "target_attributes": { "attributes": [ "machine wash", "unique design", "elastic waistband", "daily wear" ], "options": [ "love with hearts black", "x-large" ] }, "asin": "B09PG876ZQ" }, { "task_id": "ws_B07JBP95WQ_6873", "instruction": "i'm looking for intel core has install at any at easy and it will high perfomanced.", "target_attributes": { "attributes": [ "high performance", "intel core" ], "options": [] }, "asin": "B07JBP95WQ" }, { "task_id": "ws_B09JRXHZWX_6874", "instruction": "i am looking for a medium slim fit tops.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "medium" ] }, "asin": "B09JRXHZWX" }, { "task_id": "ws_B08QDV64XV_6875", "instruction": "i am looking for a high power soundbar and it should be dust proof.", "target_attributes": { "attributes": [ "dust proof", "high power" ], "options": [] }, "asin": "B08QDV64XV" }, { "task_id": "ws_B077KLT1CT_6876", "instruction": "i need bacon cheddar crisps that are not only keto friendly but also gluten free and low carb.", "target_attributes": { "attributes": [ "keto friendly", "gluten free", "low carb" ], "options": [ "bacon cheddar" ] }, "asin": "B077KLT1CT" }, { "task_id": "ws_B07V1CR4HS_6877", "instruction": "i am looking orange almond muffin flavour baking mix with low carb,sugar free,gluten free made with natural ingredient", "target_attributes": { "attributes": [ "low carb", "gluten free", "sugar free", "natural ingredients" ], "options": [ "orange almond muffin" ] }, "asin": "B07V1CR4HS" }, { "task_id": "ws_B07V1CR4HS_6878", "instruction": "i want to get some keto friendly blueberry baking mix that's made from all-natural ingredients.", "target_attributes": { "attributes": [ "keto friendly", "natural ingredients" ], "options": [ "blueberry" ] }, "asin": "B07V1CR4HS" }, { "task_id": "ws_B08D7559V3_6879", "instruction": "i'm looking for need to buy a machine washable and it easy to use it.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "deepteal" ] }, "asin": "B08D7559V3" }, { "task_id": "ws_B07ZNQBNCZ_6880", "instruction": "i am looking for dual band cellular booster", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B07ZNQBNCZ" }, { "task_id": "ws_B081CDTRPD_6881", "instruction": "i am looking for a 15 foot gold plated interconnect cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "15 feet" ] }, "asin": "B081CDTRPD" }, { "task_id": "ws_B081CDTRPD_6882", "instruction": "i want to find a female to dual cable that is 3.3 feet long. it needs to also come with a power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "3.3 feet", "xlr female to dual 1 | 4 ts male" ] }, "asin": "B081CDTRPD" }, { "task_id": "ws_B08VNG4HJ6_6883", "instruction": "i'm looking for capacity in white plug play it was need to buy it.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "white" ] }, "asin": "B08VNG4HJ6" }, { "task_id": "ws_B09S9WL9B4_6884", "instruction": "i am looking for a pair of women's size 7.5 open toe outdoor sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "7.5" ] }, "asin": "B09S9WL9B4" }, { "task_id": "ws_B00VHAW406_6885", "instruction": "i'm looking for bedspreads it was easy to wash it was machine washable", "target_attributes": { "attributes": [ "machine washable", "king size" ], "options": [ "white" ] }, "asin": "B00VHAW406" }, { "task_id": "ws_B09LS2LS8T_6886", "instruction": "i'm looking for a slim fit dress shirt with a button closure. it should come in a 4 x large with a blue plaid pattern.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "plaid pattern blue", "4x-large" ] }, "asin": "B09LS2LS8T" }, { "task_id": "ws_B08PPNPJ9Q_6887", "instruction": "i need a white mid century table for my living room. it should be 15.6x23 inches in size.", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [ "white", "15.6x23.5inch" ] }, "asin": "B08PPNPJ9Q" }, { "task_id": "ws_B073214G9J_6888", "instruction": "i am looking for a dark taupe home office desks with metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "dark taupe" ] }, "asin": "B073214G9J" }, { "task_id": "ws_B08M3WKJ3W_6889", "instruction": "i need a high speed plug and play external optical drive with usb. pick a black one.", "target_attributes": { "attributes": [ "plug play", "high speed" ], "options": [ "black" ] }, "asin": "B08M3WKJ3W" }, { "task_id": "ws_B071K4WP3P_6890", "instruction": "i am looking for machine washable throw pillow cushion cover. please select peach mint color.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "peach mint" ] }, "asin": "B071K4WP3P" }, { "task_id": "ws_B07NVWVV9R_6891", "instruction": "i'm looking for skin care moisturizing seed oil need to buy it.", "target_attributes": { "attributes": [ "seed oil", "dry skin" ], "options": [] }, "asin": "B07NVWVV9R" }, { "task_id": "ws_B08TVCFNPN_6892", "instruction": "wall plate cover in toggle combo", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "outlet | toggle combo" ] }, "asin": "B08TVCFNPN" }, { "task_id": "ws_B08FZTH28C_6893", "instruction": "i am looking for white floral scent dab 002 in travel size", "target_attributes": { "attributes": [ "travel size" ], "options": [ "dab 002" ] }, "asin": "B08FZTH28C" }, { "task_id": "ws_B081GBD1G8_6894", "instruction": "i want to buy canvas prints for the living room preferably having airplanes on them.", "target_attributes": { "attributes": [ "living room" ], "options": [ "2810 - airplanes" ] }, "asin": "B081GBD1G8" }, { "task_id": "ws_B09MSLSLNP_6895", "instruction": "i want to buy a six pack of snickerdoodle flavored hot chocolate. make sure it's gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "snickerdoodle", "14.8 ounce (pack of 6)" ] }, "asin": "B09MSLSLNP" }, { "task_id": "ws_B07NDKS1X4_6896", "instruction": "i'm looking for the furniture for bed room the color was beige.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "beige" ] }, "asin": "B07NDKS1X4" }, { "task_id": "ws_B07QD5NS5V_6897", "instruction": "i'm looking for grey colored queen sized pillowcases and want to buy it.", "target_attributes": { "attributes": [ "queen size", "super soft" ], "options": [ "light grey" ] }, "asin": "B07QD5NS5V" }, { "task_id": "ws_B091HDH5YS_6898", "instruction": "i'm looking for wall art for living room the color was inspirational.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "inspirational-14" ] }, "asin": "B091HDH5YS" }, { "task_id": "ws_B0987J6TV8_6899", "instruction": "i need an easy to carry tripod made of carbon fiber for my camera.", "target_attributes": { "attributes": [ "easy carry", "carbon fiber" ], "options": [] }, "asin": "B0987J6TV8" }, { "task_id": "ws_B086PFNJ5K_6900", "instruction": "find me an easy to carry and easy to use 60cm double sided high quality body brush in green color.", "target_attributes": { "attributes": [ "double sided", "easy carry", "easy use", "high quality" ], "options": [ "72purple and green", "60cm" ] }, "asin": "B086PFNJ5K" }, { "task_id": "ws_B07J5S5Z9D_6901", "instruction": "i am looking a eco friendly long lasting jar candle 6 oz butteercream vanilla cupcake", "target_attributes": { "attributes": [ "long lasting", "eco friendly" ], "options": [ "buttercream vanilla cupcake", "6 oz." ] }, "asin": "B07J5S5Z9D" }, { "task_id": "ws_B07J5S5Z9D_6902", "instruction": "i would like a two pack of soy candles", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "9 oz. 2 pack" ] }, "asin": "B07J5S5Z9D" }, { "task_id": "ws_B09FDY7L9Q_6903", "instruction": "i'm looking to buy a rose gold 1-in flat iron.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "1 inch" ] }, "asin": "B09FDY7L9Q" }, { "task_id": "ws_B08547BBF5_6904", "instruction": "i am looking for a cleanser and rmakeup remover for my sensitive skin. i want it in travel size.", "target_attributes": { "attributes": [ "travel size", "sensitive skin" ], "options": [] }, "asin": "B08547BBF5" }, { "task_id": "ws_B08JPBQ73S_6905", "instruction": "i am searching for a motion detection security camera.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B08JPBQ73S" }, { "task_id": "ws_B07BHLXJM8_6906", "instruction": "i am looking for a nail art carrying travel case. it should be easy to clean.", "target_attributes": { "attributes": [ "easy clean", "nail art" ], "options": [] }, "asin": "B07BHLXJM8" }, { "task_id": "ws_B09M3LNF8P_6907", "instruction": "i am looking for easy clean and lumbar support home office chair", "target_attributes": { "attributes": [ "easy clean", "lumbar support" ], "options": [] }, "asin": "B09M3LNF8P" }, { "task_id": "ws_B08V1S29CZ_6908", "instruction": "i am looking for gluten free tea.please choose berry flavour.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "berry" ] }, "asin": "B08V1S29CZ" }, { "task_id": "ws_B09SF1YB4V_6909", "instruction": "i would like a pair of size 7.5 wide khaki flat sandals with a closed toe.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "a3 - khaki", "7.5 wide" ] }, "asin": "B09SF1YB4V" }, { "task_id": "ws_B07PB18T74_6910", "instruction": "i looking a beauty product leak proof travel size case for 288 bottles color yellow", "target_attributes": { "attributes": [ "leak proof", "travel size" ], "options": [ "yellow", "288 bottles" ] }, "asin": "B07PB18T74" }, { "task_id": "ws_B09S169XYP_6911", "instruction": "i need an x-large t-shirt blouse that has short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "x-large" ] }, "asin": "B09S169XYP" }, { "task_id": "ws_B01FQBPOMG_6912", "instruction": "need a bag of creamy shake candy with 120 units cappuccino flavor and gluten free", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cappuccino", "120 count (pack of 1)" ] }, "asin": "B01FQBPOMG" }, { "task_id": "ws_B01FQBPOMG_6913", "instruction": "i would like a bag of 180 honeydew candies that are gluten free and low sugar.", "target_attributes": { "attributes": [ "low sugar", "gluten free" ], "options": [ "honeydew", "180 count (pack of 1)" ] }, "asin": "B01FQBPOMG" }, { "task_id": "ws_B07FYB92QR_6914", "instruction": "i'm looking for optical zoom for camera it was in ultra hd camera.", "target_attributes": { "attributes": [ "ultra hd", "optical zoom" ], "options": [] }, "asin": "B07FYB92QR" }, { "task_id": "ws_B06XGR98MK_6915", "instruction": "i am looking for a low calorie non alcoholic drink in the moscow mule flavor.", "target_attributes": { "attributes": [ "non alcoholic", "low calorie" ], "options": [ "moscow mule" ] }, "asin": "B06XGR98MK" }, { "task_id": "ws_B081D973ZF_6916", "instruction": "i am looking for cranberry health mix which contains natural ingredients only, 26 ounce (pack of 4)", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "cranberry health mix", "26 ounce (pack of 4)" ] }, "asin": "B081D973ZF" }, { "task_id": "ws_B096LJXJRD_6917", "instruction": "i want to find a red standing computer desk that i can adjust the height for.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "red" ] }, "asin": "B096LJXJRD" }, { "task_id": "ws_B099KM511M_6918", "instruction": "i would like a 60\"x80\" ref and black fringe fleece throw.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "c:with pompom fringe:red and black", "60\"x80\"" ] }, "asin": "B099KM511M" }, { "task_id": "ws_B0924JS3YG_6919", "instruction": "i am looking for makeup brush set that is suitable for synthetic hair. and i would prefer the pink one", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "pink" ] }, "asin": "B0924JS3YG" }, { "task_id": "ws_B071166T4K_6920", "instruction": "i'm looking for flip flops it will comfort to wear.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "grey charcoal grey 189" ] }, "asin": "B071166T4K" }, { "task_id": "ws_B08HV6Y1N9_6921", "instruction": "women's multi pockets utility cargo pant relaxed fit for daily wear colour must bordeaux", "target_attributes": { "attributes": [ "straight leg", "relaxed fit", "daily wear" ], "options": [ "bordeaux" ] }, "asin": "B08HV6Y1N9" }, { "task_id": "ws_B09PVBX674_6922", "instruction": "add to my list cupcake toppers decorations for my birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09PVBX674" }, { "task_id": "ws_B07FYP14DR_6923", "instruction": "i am looking for xx-large youth fit black color halloween t-shirt of needle sleeve", "target_attributes": { "attributes": [ "needle sleeve" ], "options": [ "black", "youth", "xx-large" ] }, "asin": "B07FYP14DR" }, { "task_id": "ws_B0792N9J4S_6924", "instruction": "i am looking for a paraben and bpa free cinnamon colored natural tooth gel.", "target_attributes": { "attributes": [ "bpa free" ], "options": [] }, "asin": "B0792N9J4S" }, { "task_id": "ws_B09D93PVFX_6925", "instruction": "i'm looking for white item make my room look so nice.", "target_attributes": { "attributes": [ "white item", "easy clean" ], "options": [ "white" ] }, "asin": "B09D93PVFX" }, { "task_id": "ws_B07Q7NKCS7_6926", "instruction": "i am looking for anti slip women sandals. please choose black one.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "black1-women" ] }, "asin": "B07Q7NKCS7" }, { "task_id": "ws_B07Q7NKCS7_6927", "instruction": "i want pink and non slip luffymomo womens shower slippers.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "pink-women" ] }, "asin": "B07Q7NKCS7" }, { "task_id": "ws_B0721QQDC8_6928", "instruction": "i'm looking for long lasting beauty accessories for making skin glow.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "tie dye" ] }, "asin": "B0721QQDC8" }, { "task_id": "ws_B09D33BXHL_6929", "instruction": "i need a heavy duty office chair which is easy to install and has lumbar support.", "target_attributes": { "attributes": [ "heavy duty", "easy install", "lumbar support" ], "options": [] }, "asin": "B09D33BXHL" }, { "task_id": "ws_B09Q9D1K69_6930", "instruction": "i am searching for a high quality long handle tongue cleaner.", "target_attributes": { "attributes": [ "high quality", "long handle" ], "options": [] }, "asin": "B09Q9D1K69" }, { "task_id": "ws_B097ZLKZCS_6931", "instruction": "i need blue high heels with open toes. the size should be a 10.", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "c1-blue", "10" ] }, "asin": "B097ZLKZCS" }, { "task_id": "ws_B083JNJX1Z_6932", "instruction": "i'm looking for a jet-4 bluetooth portable speaker", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "grey" ] }, "asin": "B083JNJX1Z" }, { "task_id": "ws_B09GV2RJRZ_6933", "instruction": "level 9 unlocked birthday boy game black t shirt machine wash classic fit cotton heater small size", "target_attributes": { "attributes": [ "machine wash", "cotton heather", "classic fit" ], "options": [ "black", "small" ] }, "asin": "B09GV2RJRZ" }, { "task_id": "ws_B08176NP1R_6934", "instruction": "i am looking for a intel quad core i5 desktops", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [] }, "asin": "B08176NP1R" }, { "task_id": "ws_B000A33KQ8_6935", "instruction": "i am looking for medium sized women knee high over calf.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "medium (1 pair)" ] }, "asin": "B000A33KQ8" }, { "task_id": "ws_B09J2M6GVK_6936", "instruction": "i need to buy a three piece living room set with a sofa, armchair, and loveseat. make sure it's easy to assemble and has solid wood frames.", "target_attributes": { "attributes": [ "easy assemble", "wood frame", "solid wood" ], "options": [] }, "asin": "B09J2M6GVK" }, { "task_id": "ws_B08XYJQP6N_6937", "instruction": "i'm looking for electronics accessories it was long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "green" ] }, "asin": "B08XYJQP6N" }, { "task_id": "ws_B091BK6L57_6938", "instruction": "i would like a mango sparkling water bottle has has low calories.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "mango" ] }, "asin": "B091BK6L57" }, { "task_id": "ws_B09QKYQLKV_6939", "instruction": "i am looking for men t-shirt. please choose royal blue color.", "target_attributes": { "attributes": [ "heathers cotton" ], "options": [ "royal blue" ] }, "asin": "B09QKYQLKV" }, { "task_id": "ws_B07J5LMT7L_6940", "instruction": "i am looking for wireless bluetooth noise cancelling over-ear headphones.", "target_attributes": { "attributes": [ "noise cancelling", "wireless bluetooth" ], "options": [] }, "asin": "B07J5LMT7L" }, { "task_id": "ws_B089YK478M_6941", "instruction": "i need a small black short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "5-black" ] }, "asin": "B089YK478M" }, { "task_id": "ws_B09J4SV6WX_6942", "instruction": "i am looking for a x-large high waist tummy control breeches", "target_attributes": { "attributes": [ "high waist", "tummy control" ], "options": [ "x-large" ] }, "asin": "B09J4SV6WX" }, { "task_id": "ws_B076B2QYZZ_6943", "instruction": "i want low fat cajan pit-smoked beef jerky.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "cajan" ] }, "asin": "B076B2QYZZ" }, { "task_id": "ws_B09NR629D2_6944", "instruction": "i am looking for a wallet case with tempered glass protection. please select the rose gold color", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "rose gold" ] }, "asin": "B09NR629D2" }, { "task_id": "ws_B09KCR46RV_6945", "instruction": "i'm looking for stereo headphones it will use for outside noise cancelling.", "target_attributes": { "attributes": [ "noise cancelling", "stereo sound" ], "options": [] }, "asin": "B09KCR46RV" }, { "task_id": "ws_B09KV7CYMX_6946", "instruction": "i want window curtain panel for leaving room easy clean size :52*72in color peacock 4lop0447", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "peacock4lop0447", "52x72in" ] }, "asin": "B09KV7CYMX" }, { "task_id": "ws_B07Z65TZ2Y_6947", "instruction": "i would like a small mens cranberry t shirt with a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "cranberry", "men", "small" ] }, "asin": "B07Z65TZ2Y" }, { "task_id": "ws_B09QXLSVPX_6948", "instruction": "i'm looking for clothing long and short sleeve for women's dresses the color was purple.", "target_attributes": { "attributes": [ "long sleeve", "short sleeve" ], "options": [ "c6-purple" ] }, "asin": "B09QXLSVPX" }, { "task_id": "ws_B09LQVQPNG_6949", "instruction": "i am looking for non slip closed toe high heel woman boot color black", "target_attributes": { "attributes": [ "non slip", "closed toe" ], "options": [ "winter shoes for womens - gf04--black" ] }, "asin": "B09LQVQPNG" }, { "task_id": "ws_B07PXS5L8S_6950", "instruction": "i am looking for a pack of birthday cake candles. also, i am looking for a golden colored number 9 shaped candle.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "golden number candle9" ] }, "asin": "B07PXS5L8S" }, { "task_id": "ws_B093BJK2CS_6951", "instruction": "i am looking for a rechargable facial cleansing spin brush set for sensitive skin. also choose fuchsia pink color.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "fuchsia pink" ] }, "asin": "B093BJK2CS" }, { "task_id": "ws_B09P8G9378_6952", "instruction": "i'm looking for a jean jacket with thicker collar size medium in color pink for daily wear use", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "pink", "medium" ] }, "asin": "B09P8G9378" }, { "task_id": "ws_B07N1G15Y4_6953", "instruction": "i'm looking for a 2 pack push down pump dispenser bottles for nail polish and facial makeup remover", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B07N1G15Y4" }, { "task_id": "ws_B09CT55WJW_6954", "instruction": "find me a motion detection high definition outdoor camera with 1080p hd definition.", "target_attributes": { "attributes": [ "1080p hd", "high definition", "motion detection" ], "options": [] }, "asin": "B09CT55WJW" }, { "task_id": "ws_B002VLESHC_6955", "instruction": "i'm looking for a long lasting perfumes.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B002VLESHC" }, { "task_id": "ws_B08LR1PBKD_6956", "instruction": "i'm looking for n all-in-one computer. i want one that's high performance and has a 1080p screen. it should also have an intel processor.", "target_attributes": { "attributes": [ "high performance", "intel core" ], "options": [] }, "asin": "B08LR1PBKD" }, { "task_id": "ws_B09FXPW9LV_6957", "instruction": "i am looking for red rose hair dye for women.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "rose red" ] }, "asin": "B09FXPW9LV" }, { "task_id": "ws_B09HZT5CNG_6958", "instruction": "i need anti slip mary jane oxfords with retro round toe size 5 and wine red color wedge heel women shoe", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "wine red", "5" ] }, "asin": "B09HZT5CNG" }, { "task_id": "ws_B006YB5S6U_6959", "instruction": "i am looking for a 30 in solid wood directors chairs", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "30 in" ] }, "asin": "B006YB5S6U" }, { "task_id": "ws_B006YB5S6U_6960", "instruction": "i'm looking for a 18\" directors chair with solid wood and a natural frame.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "natural frame - solid wood" ] }, "asin": "B006YB5S6U" }, { "task_id": "ws_B09P1J4YJT_6961", "instruction": "i'm looking for furniture engineered wood at the living room the color was grey.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "grey" ] }, "asin": "B09P1J4YJT" }, { "task_id": "ws_B09S4SK8V1_6962", "instruction": "i'm looking for non alcoholic drink for bottled beverages.", "target_attributes": { "attributes": [ "non alcoholic", "ready use" ], "options": [ "margarita" ] }, "asin": "B09S4SK8V1" }, { "task_id": "ws_B09N95HQZM_6963", "instruction": "i'm looking for a space saving storage cabinets for dining room. also, choose black colored one.", "target_attributes": { "attributes": [ "space saving", "living room" ], "options": [ "black" ] }, "asin": "B09N95HQZM" }, { "task_id": "ws_B09SPZ8HC2_6964", "instruction": "i am looking for a size: 7 - pack natural ingredients of jerky", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "7 - pack" ] }, "asin": "B09SPZ8HC2" }, { "task_id": "ws_B09SPZ8HC2_6965", "instruction": "i am looking for a 5 pack of fully cooked and easy to prepare chicken breast strips.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "5 - pack" ] }, "asin": "B09SPZ8HC2" }, { "task_id": "ws_B09B54J7PZ_6966", "instruction": "am actually looking for a twin size loft bed with slide, gray color with headboard", "target_attributes": { "attributes": [ "twin size" ], "options": [ "gray with headboard", "twin" ] }, "asin": "B09B54J7PZ" }, { "task_id": "ws_B09QX9S3DB_6967", "instruction": "we want a twin over twin kids beds easy assemble box spring color : silver", "target_attributes": { "attributes": [ "easy assemble", "box spring" ], "options": [ "silver (style d)", "twin over twin" ] }, "asin": "B09QX9S3DB" }, { "task_id": "ws_B09MH7PXZS_6968", "instruction": "i am lookig for king size box spring easy assemble heavy duty bed frame", "target_attributes": { "attributes": [ "box spring", "king size" ], "options": [] }, "asin": "B09MH7PXZS" }, { "task_id": "ws_B09M17NH24_6969", "instruction": "i'm looking for teeth whitening for oral health care.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09M17NH24" }, { "task_id": "ws_B08NPY23XH_6970", "instruction": "i am looking for eyelash extension tool set for beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B08NPY23XH" }, { "task_id": "ws_B00V1ILTNM_6971", "instruction": "i am looking for non diary rich creamy creamers.", "target_attributes": { "attributes": [ "rich creamy", "non dairy" ], "options": [] }, "asin": "B00V1ILTNM" }, { "task_id": "ws_B09PYS81X6_6972", "instruction": "i am looking for a green long handle bath & body brushes", "target_attributes": { "attributes": [ "long handle" ], "options": [ "green" ] }, "asin": "B09PYS81X6" }, { "task_id": "ws_B084D5NYQT_6973", "instruction": "i am looking for crunchy indian snack sticks that have no artificial flavors or colors.", "target_attributes": { "attributes": [ "artificial colors", "artificial flavors" ], "options": [] }, "asin": "B084D5NYQT" }, { "task_id": "ws_B08DH5TFCJ_6974", "instruction": "i would like a car in dash gps device that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B08DH5TFCJ" }, { "task_id": "ws_B07B8HKVXR_6975", "instruction": "i wanted to get a compatible apple watch with a black carbon fiber buckle to match with my phone's cover.", "target_attributes": { "attributes": [ "compatible apple", "carbon fiber" ], "options": [ "black carbon fiber w | matte black hardware" ] }, "asin": "B07B8HKVXR" }, { "task_id": "ws_B09PFPW5VD_6976", "instruction": "i'm looking for hair removal its inly used for natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "hair removal" ], "options": [] }, "asin": "B09PFPW5VD" }, { "task_id": "ws_B08DHDS93Q_6977", "instruction": "i'm looking for individually wrapped green raspberry 30 count bulk lollipop pack", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "green" ] }, "asin": "B08DHDS93Q" }, { "task_id": "ws_B07MPTK3GY_6978", "instruction": "i'm looking for the pendant lights for ceiling lights for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "antique" ] }, "asin": "B07MPTK3GY" }, { "task_id": "ws_B0777W3C8B_6979", "instruction": "i'm looking for a mrs. fields cookies .", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "60 count (pack of 3)" ] }, "asin": "B0777W3C8B" }, { "task_id": "ws_B07JVLYV5Z_6980", "instruction": "i need a red allgala 60x45 super soft, machine wash flannel plush light weight throw blanket", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "red", "45x60" ] }, "asin": "B07JVLYV5Z" }, { "task_id": "ws_B0851GZM55_6981", "instruction": "i am looking for a counter height size barstools of faux leather", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "counter height" ] }, "asin": "B0851GZM55" }, { "task_id": "ws_B093362GNX_6982", "instruction": "i want a keyboard skin that is dust proof and long lasting. choose a rainbow color.", "target_attributes": { "attributes": [ "dust proof", "long lasting" ], "options": [ "rainbow" ] }, "asin": "B093362GNX" }, { "task_id": "ws_B0991ZW4R4_6983", "instruction": "i want quick release water resistant smart watch band color purple mist", "target_attributes": { "attributes": [ "quick release", "water resistant" ], "options": [ "purple mist" ] }, "asin": "B0991ZW4R4" }, { "task_id": "ws_B09SGHZWWV_6984", "instruction": "i'm looking for a noldares women's high heel shoes.", "target_attributes": { "attributes": [ "high heel", "ankle strap" ], "options": [ "beige", "6" ] }, "asin": "B09SGHZWWV" }, { "task_id": "ws_B079W3VRKZ_6985", "instruction": "i am looking for a women's beverly pump with leather sole. also choose ruby kid suede color and 5 size.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "ruby kid suede", "5" ] }, "asin": "B079W3VRKZ" }, { "task_id": "ws_B07JFZBP8R_6986", "instruction": "i would like a long lasting men's fragrance set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07JFZBP8R" }, { "task_id": "ws_B07FKFJP1Q_6987", "instruction": "i found this bracelet from toyouths which is fitbit versa/versa compatible in stainless steel i need it to match the saddle color brown.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "saddle brown" ] }, "asin": "B07FKFJP1Q" }, { "task_id": "ws_B082N5YV7R_6988", "instruction": "i'm looking for keto friendly double cholate cup cake it was sued in parties.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "keto friendly double chocolate cake cup" ] }, "asin": "B082N5YV7R" }, { "task_id": "ws_B07DCXCVFM_6989", "instruction": "i looking a rose gold orgnizer display for lipstic, eye shadow,lip gloss ,blush color clear /soft brass size 8*4*2", "target_attributes": { "attributes": [ "rose gold", "eye shadow" ], "options": [ "clear | soft brass", "8 x 4 x 2" ] }, "asin": "B07DCXCVFM" }, { "task_id": "ws_B07R124WRK_6990", "instruction": "show me machine washable officially licensed disney jungle book t-shirt for men in color baby blues and size 3t.", "target_attributes": { "attributes": [ "officially licensed", "machine wash" ], "options": [ "baby blue", "men", "3t" ] }, "asin": "B07R124WRK" }, { "task_id": "ws_B09P582MFG_6991", "instruction": "i am looking for a grey toy chests & organizers for storage space", "target_attributes": { "attributes": [ "storage space" ], "options": [ "grey" ] }, "asin": "B09P582MFG" }, { "task_id": "ws_B01E9HPVUS_6992", "instruction": "i am looking for a 1 count (pack of 12) hand masks for anti aging and dry skin.", "target_attributes": { "attributes": [ "anti aging", "dry skin" ], "options": [ "1 count (pack of 12)" ] }, "asin": "B01E9HPVUS" }, { "task_id": "ws_B09QWXVB3T_6993", "instruction": "i would like a medium sized black bikini with short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "a1-black", "medium" ] }, "asin": "B09QWXVB3T" }, { "task_id": "ws_B0734ZVZHP_6994", "instruction": "i would like a quad core desktop processor tower.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B0734ZVZHP" }, { "task_id": "ws_B095LJRYRY_6995", "instruction": "i'm looking for tempered glass for phone accessories the color was black and need to buy it.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "black" ] }, "asin": "B095LJRYRY" }, { "task_id": "ws_B088QTGX5F_6996", "instruction": "i\u2019m looking for a white window covering that is 72\u201d wide and 63\u201d long. also would prefer the covering had bears on it.", "target_attributes": { "attributes": [ "white item" ], "options": [ "72\"w x 63\"l" ] }, "asin": "B088QTGX5F" }, { "task_id": "ws_B07R6NMPXW_6997", "instruction": "i am looking for a gluten free and non gmo bakery & dessert gifts of peanut butter flavour", "target_attributes": { "attributes": [ "gluten free", "non gmo" ], "options": [ "peanut butter" ] }, "asin": "B07R6NMPXW" }, { "task_id": "ws_B07KY3MQ1Y_6998", "instruction": "i am looking for a gluten-free and usda organic labled fruit juice.", "target_attributes": { "attributes": [ "usda organic", "gluten free" ], "options": [] }, "asin": "B07KY3MQ1Y" }, { "task_id": "ws_B07SB464N4_6999", "instruction": "i'm looking for a pexfix full length floor mirror with standing holder .", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "sliver (arched-top)", "65''x22''" ] }, "asin": "B07SB464N4" }, { "task_id": "ws_B09CZCRLJR_7000", "instruction": "i'm looking for cell phone accessories for tempered class and it was high definition.", "target_attributes": { "attributes": [ "high definition", "tempered glass" ], "options": [ "black" ] }, "asin": "B09CZCRLJR" }, { "task_id": "ws_B08W4HYRF1_7001", "instruction": "i'm looking for make up for eye shadow to skin care products.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B08W4HYRF1" }, { "task_id": "ws_B01M0JY15V_7002", "instruction": "i am looking for a usb 4g lte wifi modem for internet connection.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B01M0JY15V" }, { "task_id": "ws_B00BIFNTMC_7003", "instruction": "wireless vertical ergonomic optical mouse with aaa batteries", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B00BIFNTMC" }, { "task_id": "ws_B08TWKLT7N_7004", "instruction": "i'm looking for long sleeve lightweight buy a c-blue weather.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "c-blue heather" ] }, "asin": "B08TWKLT7N" }, { "task_id": "ws_B09NVTSXPN_7005", "instruction": "i am looking for sego mono base hair topper with bangs 100% real human hair which creating the most lustrous and realistic natural effects, the hair extensions clip-in design makes it easier to wear. color platinum blonde-b in size 10 inch-130% density preferable", "target_attributes": { "attributes": [ "easy use" ], "options": [ "platinum blonde-b", "10 inch-130% density" ] }, "asin": "B09NVTSXPN" }, { "task_id": "ws_B07TYS4TCR_7006", "instruction": "i am looking for high quality nail cleaning brush. please choose color b .", "target_attributes": { "attributes": [ "high quality" ], "options": [ "color b" ] }, "asin": "B07TYS4TCR" }, { "task_id": "ws_B0967GX3P9_7007", "instruction": "i'm looking for clothing for closet storage and it was easy to clean.", "target_attributes": { "attributes": [ "space saving", "easy clean" ], "options": [ "grey" ] }, "asin": "B0967GX3P9" }, { "task_id": "ws_B09K6CWZNX_7008", "instruction": "i'm looking for grey flannel home and kitchen products for decore it.", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "grey flannel" ] }, "asin": "B09K6CWZNX" }, { "task_id": "ws_B0939SPCFF_7009", "instruction": "i need a 60 inch projector screen with an aspect ratio of 4:3 that mounts on the wall. it should be easy to install it.", "target_attributes": { "attributes": [ "wall mounted", "easy install" ], "options": [ "60in\uff084\uff1a3\uff09" ] }, "asin": "B0939SPCFF" }, { "task_id": "ws_B082JGZSMS_7010", "instruction": "i am looking for a paraben free conditioner for natural hair. also choose leave-in conditioner style", "target_attributes": { "attributes": [ "paraben free", "natural hair" ], "options": [ "leave in conditioner" ] }, "asin": "B082JGZSMS" }, { "task_id": "ws_B083ZG9Y7K_7011", "instruction": "i'm looking for a handyulong womens high waist bootcut yoga pants", "target_attributes": { "attributes": [ "high waist" ], "options": [ "x-zmint green", "3x-large" ] }, "asin": "B083ZG9Y7K" }, { "task_id": "ws_B09JNY3W9D_7012", "instruction": "find me a lift top coffee table in cherry for my living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "cherry" ] }, "asin": "B09JNY3W9D" }, { "task_id": "ws_B07JH4F11B_7013", "instruction": "i looking a body scrubs eco friendly for removing dead skin", "target_attributes": { "attributes": [ "eco friendly", "dead skin" ], "options": [] }, "asin": "B07JH4F11B" }, { "task_id": "ws_B0897ZFHX2_7014", "instruction": "i'm looking for hyaluronic acid for skin care moisturizers.", "target_attributes": { "attributes": [ "cruelty free", "hyaluronic acid" ], "options": [] }, "asin": "B0897ZFHX2" }, { "task_id": "ws_B08YDHFQ2X_7015", "instruction": "i'm looking for vegetables and dried vegetables for low carb. it is easy to use.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "hwago - grade s (140g)" ] }, "asin": "B08YDHFQ2X" }, { "task_id": "ws_B09R917TMV_7016", "instruction": "i'm looking for optical zoom electronic for digital cameras need to to buy it.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B09R917TMV" }, { "task_id": "ws_B07MVKQHBJ_7017", "instruction": "i'm looking for a french macarons cookies birthday gift variety pack .", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "holiday flavors", "12 count" ] }, "asin": "B07MVKQHBJ" }, { "task_id": "ws_B01DJ6TM8M_7018", "instruction": "i am looking for a dummy surveillance camera for ceiling with batteries included. also choose which is supporting aaa size batteries.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B01DJ6TM8M" }, { "task_id": "ws_B003ZXEBOK_7019", "instruction": "i'm looking for a ready to eat baked snacks which should be individually wrapped.", "target_attributes": { "attributes": [ "ready eat", "individually wrapped" ], "options": [] }, "asin": "B003ZXEBOK" }, { "task_id": "ws_B08FVG2M1J_7020", "instruction": "i need a high quality gomu 500 pack - 2 oz / 60 ml clear refillable flip top pet plastic travel bottle container", "target_attributes": { "attributes": [ "high quality" ], "options": [ "500 pack" ] }, "asin": "B08FVG2M1J" }, { "task_id": "ws_B07V13MY6X_7021", "instruction": "i want a pair of ethylene vinyl trainers that is black in color. get me a size 8.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "black", "8" ] }, "asin": "B07V13MY6X" }, { "task_id": "ws_B09DP9NSP8_7022", "instruction": "i'm looking for gray wireless headphones it can reduce outside noise pollution.", "target_attributes": { "attributes": [ "high definition", "wireless bluetooth" ], "options": [ "gray" ] }, "asin": "B09DP9NSP8" }, { "task_id": "ws_B09K7YV36Y_7023", "instruction": "i am looking for a medium size winter warm jackets", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "medium" ] }, "asin": "B09K7YV36Y" }, { "task_id": "ws_B08YNPT4CD_7024", "instruction": "i am looking for a cupcake toppers for birthday party birthday cake", "target_attributes": { "attributes": [ "birthday party", "birthday cake" ], "options": [] }, "asin": "B08YNPT4CD" }, { "task_id": "ws_B09L7JNKXW_7025", "instruction": "i would like some old fashioned bake mix made from natural ingredients.", "target_attributes": { "attributes": [ "old fashioned", "natural ingredients" ], "options": [] }, "asin": "B09L7JNKXW" }, { "task_id": "ws_B09J43KD51_7026", "instruction": "i need a yellow facial sponge for sensitive skin", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "yellow" ] }, "asin": "B09J43KD51" }, { "task_id": "ws_B09B9B4JNX_7027", "instruction": "teeth whitening toothpaste with natural ingredients only 1 pcs", "target_attributes": { "attributes": [ "teeth whitening", "natural ingredients" ], "options": [ "1pcs" ] }, "asin": "B09B9B4JNX" }, { "task_id": "ws_B07R9KFCKY_7028", "instruction": "i am looking set of 4 black velvet mid century chair for dining room", "target_attributes": { "attributes": [ "mid century", "dining room" ], "options": [ "black velvet", "set of 4" ] }, "asin": "B07R9KFCKY" }, { "task_id": "ws_B08PFJP5S2_7029", "instruction": "for my eyes i need a color 10 eyeshadow which should be easy to use.\u2075", "target_attributes": { "attributes": [ "easy apply", "eye shadow" ], "options": [ "10" ] }, "asin": "B08PFJP5S2" }, { "task_id": "ws_B08SLRG76Y_7030", "instruction": "find me a tempered glass camera lens protector for iphone 12 pro max in blue", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "blue", "iphone 12 pro max" ] }, "asin": "B08SLRG76Y" }, { "task_id": "ws_B07XZ5VPK9_7031", "instruction": "i am looking for hair growth serum for men.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B07XZ5VPK9" }, { "task_id": "ws_B08Y6VZFT6_7032", "instruction": "i'm looking for a light pink long handle back loofah shower brush.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "light pink" ] }, "asin": "B08Y6VZFT6" }, { "task_id": "ws_B09DSCTNG1_7033", "instruction": "cowboy boots for women non slip choose in brown colour", "target_attributes": { "attributes": [ "knee high", "non slip" ], "options": [ "brown" ] }, "asin": "B09DSCTNG1" }, { "task_id": "ws_B09MCKF3S7_7034", "instruction": "i would like a light weight computer speaker that is easy to carry.", "target_attributes": { "attributes": [ "light weight", "easy carry" ], "options": [] }, "asin": "B09MCKF3S7" }, { "task_id": "ws_B07M6T48M7_7035", "instruction": "i need some high quality blue body paint.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "poseidon deep blue" ] }, "asin": "B07M6T48M7" }, { "task_id": "ws_B07WZMBRJ4_7036", "instruction": "i am looking for an apple compatible case cover that is clear green or has silver glitter in it.", "target_attributes": { "attributes": [ "compatible apple", "case cover" ], "options": [ "green clear | silver glitter" ] }, "asin": "B07WZMBRJ4" }, { "task_id": "ws_B09434QK1N_7037", "instruction": "i am looking for a 8 size walking shoes for daily wear", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "8" ] }, "asin": "B09434QK1N" }, { "task_id": "ws_B091DCM8YQ_7038", "instruction": "i am looking for a women's socks made up of polyester cotton which is washable in machine. also choose black or semi mint rush green color.", "target_attributes": { "attributes": [ "machine wash", "polyester cotton" ], "options": [ "black | semi turbo pink | semi mint rush green" ] }, "asin": "B091DCM8YQ" }, { "task_id": "ws_B08D7VZ5GB_7039", "instruction": "i am looking for a media player that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B08D7VZ5GB" }, { "task_id": "ws_B00J074W7Q_7040", "instruction": "i would like a ice coffee flavor protein powder that is usda organic and non gmo.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "iced coffee, 2 lb" ] }, "asin": "B00J074W7Q" }, { "task_id": "ws_B08P54GQZM_7041", "instruction": "i would like a 2xl white v neck shirt that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "white | black soot | grey flannel (crew 3-pack)", "v-neck t-shirts", "xx-large" ] }, "asin": "B08P54GQZM" }, { "task_id": "ws_B09PDTL31Y_7042", "instruction": "i need a green x-large sweater that comes in a soft material.", "target_attributes": { "attributes": [ "soft material" ], "options": [ "x-05#1green", "x-large" ] }, "asin": "B09PDTL31Y" }, { "task_id": "ws_B09FLNSZ8G_7043", "instruction": "find me a black red headphone bluetooth and wireless", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black+red" ] }, "asin": "B09FLNSZ8G" }, { "task_id": "ws_B09H15M5MT_7044", "instruction": "i am looking for dates that are low calorie", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "variety pack dates" ] }, "asin": "B09H15M5MT" }, { "task_id": "ws_B09GPDQWD2_7045", "instruction": "i need to find a black gaming headset with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black blue" ] }, "asin": "B09GPDQWD2" }, { "task_id": "ws_B08S33J873_7046", "instruction": "i am looking for round shape table top cover for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "round" ] }, "asin": "B08S33J873" }, { "task_id": "ws_B07THJ72YQ_7047", "instruction": "i am looking for long sleeve women tunic of gray color.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "gray" ] }, "asin": "B07THJ72YQ" }, { "task_id": "ws_B09472PX4V_7048", "instruction": "i would like a non toxic nail polish set.", "target_attributes": { "attributes": [ "non toxic", "nail polish" ], "options": [] }, "asin": "B09472PX4V" }, { "task_id": "ws_B08YYLRD89_7049", "instruction": "i am looking a classic style table lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "classic" ] }, "asin": "B08YYLRD89" }, { "task_id": "ws_B08XWF3BHQ_7050", "instruction": "i am looking for barber shop height adjustable beauty salon chair. also green one", "target_attributes": { "attributes": [ "height adjustable", "beauty salon" ], "options": [ "g" ] }, "asin": "B08XWF3BHQ" }, { "task_id": "ws_B09M31ZFWN_7051", "instruction": "i would like a 198 bt power amplifier with wireless bluetooth.", "target_attributes": { "attributes": [ "power amplifier", "wireless bluetooth" ], "options": [ "198bt" ] }, "asin": "B09M31ZFWN" }, { "task_id": "ws_B01HIX1EHO_7052", "instruction": "i'm looking for a large upholstered bench that is contemporary style and has solid wood. also, it should be gray.", "target_attributes": { "attributes": [ "contemporary style", "solid wood" ], "options": [ "light gray", "bench-large" ] }, "asin": "B01HIX1EHO" }, { "task_id": "ws_B08T24PXZY_7053", "instruction": "i would like a 2 pound bag of chocolate covered gluten free bars.", "target_attributes": { "attributes": [ "chocolate covered", "gluten free" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B08T24PXZY" }, { "task_id": "ws_B01B7AGX2U_7054", "instruction": "i would like to have anti-aging moisturizer which has 10 ivory fair.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "10 ivory fair" ] }, "asin": "B01B7AGX2U" }, { "task_id": "ws_B01N47U1VI_7055", "instruction": "i need a pair of white bluetooth speakers that have stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "white" ] }, "asin": "B01N47U1VI" }, { "task_id": "ws_B004W55Y9Q_7056", "instruction": "i would like a single pack of rooblos vanilla certified organic tea.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "roobios vanilla", "pack of 1" ] }, "asin": "B004W55Y9Q" }, { "task_id": "ws_B00YOSJ4B0_7057", "instruction": "i am looking for a high quality 3g/3ml round clear jar with bpa free. also choose green color and size with 50 jars.", "target_attributes": { "attributes": [ "bpa free", "high quality" ], "options": [ "green", "50 jars" ] }, "asin": "B00YOSJ4B0" }, { "task_id": "ws_B07992CMQT_7058", "instruction": "i am looking for body sprays alcohol free in persian rose-pack of 1", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "persian rose - pack of 1" ] }, "asin": "B07992CMQT" }, { "task_id": "ws_B08QPXD1QK_7059", "instruction": "i want something to treat my hair loss that also promotes hair growth.", "target_attributes": { "attributes": [ "hair growth", "hair loss" ], "options": [] }, "asin": "B08QPXD1QK" }, { "task_id": "ws_B08HQTD5ND_7060", "instruction": "i would like a #6 nail whitener for nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "6" ] }, "asin": "B08HQTD5ND" }, { "task_id": "ws_B09P711941_7061", "instruction": "i need a tripod that is made of carbon fiber.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B09P711941" }, { "task_id": "ws_B07M9ZM2XB_7062", "instruction": "i want a long lasting remote control with batteries included.", "target_attributes": { "attributes": [ "batteries included", "long lasting" ], "options": [] }, "asin": "B07M9ZM2XB" }, { "task_id": "ws_B087NCCDN3_7063", "instruction": "i am looking for women's cover up dress of black color with long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black" ] }, "asin": "B087NCCDN3" }, { "task_id": "ws_B09F6Q2228_7064", "instruction": "looking for cup cake picks for party supplies of rose gold colour", "target_attributes": { "attributes": [ "cupcake picks", "party supplies" ], "options": [ "rose gold" ] }, "asin": "B09F6Q2228" }, { "task_id": "ws_B092ZHNZ53_7065", "instruction": "i am looking for a power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B092ZHNZ53" }, { "task_id": "ws_B004AI97MA_7066", "instruction": "i'm looking for all skin type body moisturizer oil to prevent body from scars and stretchmarks,etc.,", "target_attributes": { "attributes": [ "clinically proven" ], "options": [ "trial size bundle - oil & gel" ] }, "asin": "B004AI97MA" }, { "task_id": "ws_B09GX9R9MX_7067", "instruction": "i want big size living room", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09GX9R9MX" }, { "task_id": "ws_B09JWXX6PT_7068", "instruction": "i am looking for a black end table for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B09JWXX6PT" }, { "task_id": "ws_B09CLGZ7F8_7069", "instruction": "i would like some soy free candles", "target_attributes": { "attributes": [ "soy wax" ], "options": [] }, "asin": "B09CLGZ7F8" }, { "task_id": "ws_B0773R4JWX_7070", "instruction": "i need some slim fitting pants that are desert rose colored and are a size 8 short.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "desert rose", "8 short" ] }, "asin": "B0773R4JWX" }, { "task_id": "ws_B00CO8YH5U_7071", "instruction": "i am looking for womens size socks that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "womens" ] }, "asin": "B00CO8YH5U" }, { "task_id": "ws_B09Q63T5ZF_7072", "instruction": "i am looking for a large, grey, men's pullover sweater with an elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "grey", "large" ] }, "asin": "B09Q63T5ZF" }, { "task_id": "ws_B08DL6BRT9_7073", "instruction": "i would like a 4.22 ounce variety pack of non gmo gluten free smoothie pouches.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "variety pack", "4.22 ounce (pack of 6)" ] }, "asin": "B08DL6BRT9" }, { "task_id": "ws_B07R1VYDRW_7074", "instruction": "i'm looking for a long lasting 3 wick candle that has soy wax and is sweet delight scented.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [ "sweet delight" ] }, "asin": "B07R1VYDRW" }, { "task_id": "ws_B09M7BPPCQ_7075", "instruction": "i am looking for xx-large size stylish water resistant padded coat thicken winter warm outerwear. also blue one", "target_attributes": { "attributes": [ "winter warm", "water resistant" ], "options": [ "c-blue", "xx-large" ] }, "asin": "B09M7BPPCQ" }, { "task_id": "ws_B094FQCRKV_7076", "instruction": "i'm looking for a black hair loss concealer", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "black" ] }, "asin": "B094FQCRKV" }, { "task_id": "ws_B0991FC8BG_7077", "instruction": "i would like a green tea mask.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B0991FC8BG" }, { "task_id": "ws_B001B2KXIA_7078", "instruction": "i'm looking for permanent hair dye in black. i want a three pack.", "target_attributes": { "attributes": [ "hair dye", "permanent hair" ], "options": [ "020 brown black", "3 count (pack of 1)" ] }, "asin": "B001B2KXIA" }, { "task_id": "ws_B07H1VDWLX_7079", "instruction": "i need a red ball gown with a lace closure in a size twelve.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "red", "12" ] }, "asin": "B07H1VDWLX" }, { "task_id": "ws_B07RPQRK3V_7080", "instruction": "i am looking for strawberry & apple flavor fruit snack pack that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "strawberry & apple" ] }, "asin": "B07RPQRK3V" }, { "task_id": "ws_B09NCJ5XWF_7081", "instruction": "i would like a hair trimmer that is stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09NCJ5XWF" }, { "task_id": "ws_B0018OL2YA_7082", "instruction": "i need straight leg jeans in a medium that are big and tall.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "comfort stretch medium", "big & tall" ] }, "asin": "B0018OL2YA" }, { "task_id": "ws_B0018OL2YA_7083", "instruction": "i am looking for levi's men's 550 regular relaxed fit jeans.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "regular" ] }, "asin": "B0018OL2YA" }, { "task_id": "ws_B00ISAORHQ_7084", "instruction": "i would like a 13.25 by 8 inch vanity light with a glass shade and a satin nickel finish.", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "satin nickel finish", "13.25 by 8-inch" ] }, "asin": "B00ISAORHQ" }, { "task_id": "ws_B098N7SGRD_7085", "instruction": "i'm looking for an easy to install bathroom vanity light in color black.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [ "black" ] }, "asin": "B098N7SGRD" }, { "task_id": "ws_B09JG2NPSG_7086", "instruction": "my mom need wood frame twin size", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "twin" ] }, "asin": "B09JG2NPSG" }, { "task_id": "ws_B08FBL7P7S_7087", "instruction": "i am lookig for a light weight clover color womens pullover.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "clover" ] }, "asin": "B08FBL7P7S" }, { "task_id": "ws_B09NJ39F9R_7088", "instruction": "i want a non slip steel toe black men's shoe size :6.5", "target_attributes": { "attributes": [ "non slip", "steel toe" ], "options": [] }, "asin": "B09NJ39F9R" }, { "task_id": "ws_B01N2N0ZWV_7089", "instruction": "i need to get some gluten free coffee and it should be one pack of 8 ounces.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B01N2N0ZWV" }, { "task_id": "ws_B096DWZGD2_7090", "instruction": "i would like a sulfate free conditioner", "target_attributes": { "attributes": [ "sulfate free" ], "options": [] }, "asin": "B096DWZGD2" }, { "task_id": "ws_B082V1QQCM_7091", "instruction": "i am looking for a 10x6.5ft backgrounds for digital photography", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "10x6.5ft" ] }, "asin": "B082V1QQCM" }, { "task_id": "ws_B07W1P8CK2_7092", "instruction": "waterproof hair styling cape hairdressing cape for hairdressing salon hairdressing cut adjustable neckline makeup", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B07W1P8CK2" }, { "task_id": "ws_B09H455HTL_7093", "instruction": "i want a screen protector that is easy to install. pick something with leopard patterns.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "fashion leopard" ] }, "asin": "B09H455HTL" }, { "task_id": "ws_B008ODE4YI_7094", "instruction": "i'm looking for vanilla flavored chai tea mix that's sugar free, non-gmo, and gluten free. look for a pack that's around six ounces.", "target_attributes": { "attributes": [ "sugar free", "non gmo", "gluten free" ], "options": [ "vanilla", "5.64 ounce (pack of 1)" ] }, "asin": "B008ODE4YI" }, { "task_id": "ws_B07XH6Z9NV_7095", "instruction": "i would like a pair of small leggings with a high waist and tummy control for women.", "target_attributes": { "attributes": [ "high waist", "tummy control" ], "options": [ "small" ] }, "asin": "B07XH6Z9NV" }, { "task_id": "ws_B09SBHLF4H_7096", "instruction": "i would like a pair of size 7.5 white sandals with a ankle strap.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "white", "7.5" ] }, "asin": "B09SBHLF4H" }, { "task_id": "ws_B093239RZC_7097", "instruction": "i would like two grey chairs and a end table with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "grey", "2pc 1 seat", "2 chairs end table" ] }, "asin": "B093239RZC" }, { "task_id": "ws_B093239RZC_7098", "instruction": "i would like a grey ottoman that has a steel frame", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "grey" ] }, "asin": "B093239RZC" }, { "task_id": "ws_B0897J9528_7099", "instruction": "i'm looking for a full size platform bed storage with two drawers.", "target_attributes": { "attributes": [ "solid wood", "storage space" ], "options": [ "white", "full" ] }, "asin": "B0897J9528" }, { "task_id": "ws_B08DD91VNS_7100", "instruction": "i would like a grey twin size bunk bed made of solid wood.", "target_attributes": { "attributes": [ "twin size", "solid wood" ], "options": [ "grey" ] }, "asin": "B08DD91VNS" }, { "task_id": "ws_B07Q4DK92V_7101", "instruction": "i would like a white face belt that is anti aging.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "white" ] }, "asin": "B07Q4DK92V" }, { "task_id": "ws_B09PG4Y9CR_7102", "instruction": "i need a pair of low rise yellow briefs in a large.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "122-yellow", "large" ] }, "asin": "B09PG4Y9CR" }, { "task_id": "ws_B00FZGZ6GC_7103", "instruction": "please find me a gluten free coffee creamer.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B00FZGZ6GC" }, { "task_id": "ws_B07DWBHBWR_7104", "instruction": "i am looking for king size bed with pocket spring mattress", "target_attributes": { "attributes": [ "king size" ], "options": [ "brighton + pocket spring mattress" ] }, "asin": "B07DWBHBWR" }, { "task_id": "ws_B09RN93XLV_7105", "instruction": "i am looking for a s size manual toothbrushes for sensitive teeth", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "s" ] }, "asin": "B09RN93XLV" }, { "task_id": "ws_B08R1CWC8V_7106", "instruction": "i need a living room wall lamp that is in black.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B08R1CWC8V" }, { "task_id": "ws_B07KDWDHKJ_7107", "instruction": "i need a red iphone 7/8 / se 2020 case with card holder and[ screen protector tempered glass", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "red" ] }, "asin": "B07KDWDHKJ" }, { "task_id": "ws_B07G3PXTKT_7108", "instruction": "i am looking for a low sugar ans dairy free vanilla flavored creamer, with added collagen.", "target_attributes": { "attributes": [ "dairy free", "low sugar" ], "options": [ "vanilla" ] }, "asin": "B07G3PXTKT" }, { "task_id": "ws_B07H23LPBB_7109", "instruction": "i need a 14 inch natural hair hair extension in #2 color.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "#2", "14 inch" ] }, "asin": "B07H23LPBB" }, { "task_id": "ws_B08G1B3LFJ_7110", "instruction": "i'm looking for a flats made of ethylene vinyl. choose the ones in tan color and size 9.5 narrow.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "tan leather metallic synthetic", "9.5 narrow" ] }, "asin": "B08G1B3LFJ" }, { "task_id": "ws_B07ZSFG9CK_7111", "instruction": "i want to find gluten-free sunrise crunchy maple cereal. it needs to be a 10.6 ounce box in a pack of six.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sunrise crunchy maple - gf", "10.6 ounce (pack of 6)" ] }, "asin": "B07ZSFG9CK" }, { "task_id": "ws_B077Z4T5VD_7112", "instruction": "i am looking for a short sleeve deep v neck solid color crop top.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "multicoloured plants" ] }, "asin": "B077Z4T5VD" }, { "task_id": "ws_B07QYWKFLL_7113", "instruction": "i need some gym shorts that are black and are in a 3x-large.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "black", "3x-large" ] }, "asin": "B07QYWKFLL" }, { "task_id": "ws_B08TH9XBMC_7114", "instruction": "i would like a pair of 8.5 wide brown leather shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown leather & tan duck", "8.5 wide" ] }, "asin": "B08TH9XBMC" }, { "task_id": "ws_B07TPBW1MW_7115", "instruction": "i am looking for white color bookcase having exquisite workmanship.", "target_attributes": { "attributes": [ "exquisite workmanship" ], "options": [ "white" ] }, "asin": "B07TPBW1MW" }, { "task_id": "ws_B08C5LJ2W9_7116", "instruction": "looking for birthday party baby shower cupcake in colour blue", "target_attributes": { "attributes": [ "baby shower", "birthday party" ], "options": [ "blue" ] }, "asin": "B08C5LJ2W9" }, { "task_id": "ws_B088NPZJ98_7117", "instruction": "i am looking for a 2-tier chandelier for the dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "2-tier" ] }, "asin": "B088NPZJ98" }, { "task_id": "ws_B08LYSV2DT_7118", "instruction": "look for high density warm beige curtains for my living room.", "target_attributes": { "attributes": [ "high density", "living room" ], "options": [ "warm beige" ] }, "asin": "B08LYSV2DT" }, { "task_id": "ws_B09NDT2Q37_7119", "instruction": "i would like a water resistant bluetooth headset.", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B09NDT2Q37" }, { "task_id": "ws_B09PR9C6B7_7120", "instruction": "i'm looking for a dining room table that's made out of solid wood and easy to assemble.", "target_attributes": { "attributes": [ "easy assemble", "solid wood", "dining room" ], "options": [] }, "asin": "B09PR9C6B7" }, { "task_id": "ws_B07BNH7XMM_7121", "instruction": "i am looking for a 3x-large sized 3d digital printed pattern short sleeve t-shirt", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "3x-large" ] }, "asin": "B07BNH7XMM" }, { "task_id": "ws_B01G2B8D7W_7122", "instruction": "i'm looking for a snack of protein balls gluten free pack size of 14.5 ounce", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "14.5 ounce (pack of 1)" ] }, "asin": "B01G2B8D7W" }, { "task_id": "ws_B095JHKLGD_7123", "instruction": "look for a pair of open toed sandals with an ankle strap. i want them in beige, size 8.", "target_attributes": { "attributes": [ "open toe", "ankle strap" ], "options": [ "0 # beige", "8" ] }, "asin": "B095JHKLGD" }, { "task_id": "ws_B09PNMMLCS_7124", "instruction": "i need to buy a children's toothbrush that's easy to use and appropriate for sensitive teeth. buy the color option \"a.\"", "target_attributes": { "attributes": [ "easy use", "sensitive teeth" ], "options": [ "a" ] }, "asin": "B09PNMMLCS" }, { "task_id": "ws_B089W86S39_7125", "instruction": "i'm looking for high density of furniture home office chairs.", "target_attributes": { "attributes": [ "high density", "lumbar support" ], "options": [ "black" ] }, "asin": "B089W86S39" }, { "task_id": "ws_B00ARKH10U_7126", "instruction": "i'm looking for one red/orange henna hair dye", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "red | orange", "pack of 1" ] }, "asin": "B00ARKH10U" }, { "task_id": "ws_B0861BLTXS_7127", "instruction": "i am looking for soy free , gluten free ocean's halo tangy in flavor wasabi-style ranch", "target_attributes": { "attributes": [ "soy free", "gluten free" ], "options": [ "wasabi-style ranch" ] }, "asin": "B0861BLTXS" }, { "task_id": "ws_B07R8218SY_7128", "instruction": "i am looking for men's shirts of small size having short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "small" ] }, "asin": "B07R8218SY" }, { "task_id": "ws_B0963D384N_7129", "instruction": "i'm looking for rubber sole its for easy to use high heel shoe for woman's", "target_attributes": { "attributes": [ "water resistant", "rubber sole" ], "options": [ "thick black" ] }, "asin": "B0963D384N" }, { "task_id": "ws_B08BC2WY1Y_7130", "instruction": "i would like a medium gy tank top with a unique design.", "target_attributes": { "attributes": [ "unique design" ], "options": [ "gy", "medium" ] }, "asin": "B08BC2WY1Y" }, { "task_id": "ws_B08NDBKVYR_7131", "instruction": "i am looking for 30g of organic matcha.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "30g" ] }, "asin": "B08NDBKVYR" }, { "task_id": "ws_B092697R22_7132", "instruction": "i'm looking for size 9 womens beach sandals that are non slip, quick drying and have a rubber sole. also, they should be silver.", "target_attributes": { "attributes": [ "non slip", "quick drying", "rubber sole" ], "options": [ "silver", "9" ] }, "asin": "B092697R22" }, { "task_id": "ws_B0054YWM1M_7133", "instruction": "i need some eye cream for anti aging.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B0054YWM1M" }, { "task_id": "ws_B099RDX3Z3_7134", "instruction": "looking for motion detection with 1080p hd wireless mini hidden camera", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B099RDX3Z3" }, { "task_id": "ws_B07KG93KMK_7135", "instruction": "i'm looking for a lip pencil high pigmented for long lasting and melrose place color", "target_attributes": { "attributes": [ "long lasting", "highly pigmented" ], "options": [ "melrose place" ] }, "asin": "B07KG93KMK" }, { "task_id": "ws_B09BYWRDJP_7136", "instruction": "i want to buy a pair of honey colored size nine hiking boots with a non-slip rubber sole.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "3-honey", "9" ] }, "asin": "B09BYWRDJP" }, { "task_id": "ws_B09HRSZGCH_7137", "instruction": "i would like a queen size blue bed and box spring mattress.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "blue", "queen" ] }, "asin": "B09HRSZGCH" }, { "task_id": "ws_B09D3HYBB1_7138", "instruction": "i would like a black travel size cosmetic bag.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "black" ] }, "asin": "B09D3HYBB1" }, { "task_id": "ws_B01L1UR5ZA_7139", "instruction": "i am looking for a rustic gray color home office desks for longlasting", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "rustic gray" ] }, "asin": "B01L1UR5ZA" }, { "task_id": "ws_B09K58B3ST_7140", "instruction": "a light weight high speed usb wall charger for iphone11 color 3pack -back", "target_attributes": { "attributes": [ "light weight", "high speed" ], "options": [ "3pack-black" ] }, "asin": "B09K58B3ST" }, { "task_id": "ws_B091SWM9ZX_7141", "instruction": "i am looking for a coconut water birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B091SWM9ZX" }, { "task_id": "ws_B09HZZZCZN_7142", "instruction": "i am looking for a 10ml (0.33 ounce) anti oxidant booster size of alcohol free oils", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "10ml (0.33 ounce) anti oxidant booster" ] }, "asin": "B09HZZZCZN" }, { "task_id": "ws_B09P8KCQB4_7143", "instruction": "i need a teeth whitening kit for sensitive teeth that comes in seven pairs.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "7 pairs" ] }, "asin": "B09P8KCQB4" }, { "task_id": "ws_B09CTN88LK_7144", "instruction": "i would like a white nightstand made of solid wood.", "target_attributes": { "attributes": [ "white item", "easy assemble" ], "options": [ "white" ] }, "asin": "B09CTN88LK" }, { "task_id": "ws_B00XK9CN3U_7145", "instruction": "i am looking for a flat sheet for a twin size bed. also choose navy color.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "navy" ] }, "asin": "B00XK9CN3U" }, { "task_id": "ws_B098KVHFQD_7146", "instruction": "let me have the high performance band4u compatible with samsung galaxy watch 3 bands, 20mm size.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "20mm" ] }, "asin": "B098KVHFQD" }, { "task_id": "ws_B08W3FLWVL_7147", "instruction": "i want to buy a wooden chandelier for my dining room. it should be easy to install. get the 22 inch size.", "target_attributes": { "attributes": [ "easy install", "dining room" ], "options": [ "22\"" ] }, "asin": "B08W3FLWVL" }, { "task_id": "ws_B086HX7L1B_7148", "instruction": "i am interested in a 12 pack of dill pickle chips that are low carb", "target_attributes": { "attributes": [ "low carb" ], "options": [ "dill pickle", "pack of 12" ] }, "asin": "B086HX7L1B" }, { "task_id": "ws_B0958ZH8X2_7149", "instruction": "i need some active shorts that are in the color of equator and are a medium", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "equator", "medium" ] }, "asin": "B0958ZH8X2" }, { "task_id": "ws_B07TBG89NL_7150", "instruction": "i am looking for a two pack of deodorant that is clinically proven.", "target_attributes": { "attributes": [ "clinically proven" ], "options": [ "1.69 fl oz (pack of 2)" ] }, "asin": "B07TBG89NL" }, { "task_id": "ws_B073R3XKJT_7151", "instruction": "get me a brushed nickel finish 3-light chandelier.", "target_attributes": { "attributes": [ "nickel finish", "brushed nickel" ], "options": [ "3-light chandelier" ] }, "asin": "B073R3XKJT" }, { "task_id": "ws_B07G8MMR53_7152", "instruction": "i would like a clinically proven hair growth treatment.", "target_attributes": { "attributes": [ "clinically proven", "hair growth", "hair treatment" ], "options": [] }, "asin": "B07G8MMR53" }, { "task_id": "ws_B091FLGF1T_7153", "instruction": "i need some shorts that are pink, have a high waist, and a drawstring closure. get the size 14.", "target_attributes": { "attributes": [ "drawstring closure", "high waist" ], "options": [ "bpink", "14" ] }, "asin": "B091FLGF1T" }, { "task_id": "ws_B09D13H4KQ_7154", "instruction": "i would like a quad intel core i5 desktop tower.", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [] }, "asin": "B09D13H4KQ" }, { "task_id": "ws_B0779HP36L_7155", "instruction": "i'm looking for a round accent table for the living room that is fully assembled and ready to use. also, it should be gray and rose gold colored.", "target_attributes": { "attributes": [ "ready use", "fully assembled", "living room" ], "options": [] }, "asin": "B0779HP36L" }, { "task_id": "ws_B0987JP84S_7156", "instruction": "i want to buy wall art decor which is high gloss and suitable for dining room, and the color of which is sword, b.", "target_attributes": { "attributes": [ "high gloss", "dining room" ], "options": [ "sword,b" ] }, "asin": "B0987JP84S" }, { "task_id": "ws_B000VCBXN0_7157", "instruction": "i'm looking for a 8 ounce of quality ingredient ranch dressing.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "buttermilk" ] }, "asin": "B000VCBXN0" }, { "task_id": "ws_B00VMXZXTM_7158", "instruction": "i am looking for ultime permanent hair color cream, 5.22 ruby red", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "5.22 ruby red" ] }, "asin": "B00VMXZXTM" }, { "task_id": "ws_B09Q177KDP_7159", "instruction": "get me 2 metal legs barstools with back & arm with easy to assemble function in grey color.", "target_attributes": { "attributes": [ "easy assemble", "metal legs" ], "options": [ "grey", "2 barstools with back & arm" ] }, "asin": "B09Q177KDP" }, { "task_id": "ws_B09F2CMB4T_7160", "instruction": "i would like a silver signal converter with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "silver" ] }, "asin": "B09F2CMB4T" }, { "task_id": "ws_B07DK4987C_7161", "instruction": "i'm looking for a two pack of tea tree deodorant that's been tested by a dermatologist. it should last a long time and come in the scent \"rise.\"", "target_attributes": { "attributes": [ "dermatologist tested", "long lasting", "tea tree" ], "options": [ "rise", "2.7 ounce (pack of 2)" ] }, "asin": "B07DK4987C" }, { "task_id": "ws_B09RQ514CM_7162", "instruction": "i'm looking for clothing for needle sleeve and classic fit for women's it is easy to wear it.", "target_attributes": { "attributes": [ "machine wash", "needle sleeve", "classic fit" ], "options": [ "royal blue" ] }, "asin": "B09RQ514CM" }, { "task_id": "ws_B07Q4QY2B3_7163", "instruction": "i am looking for gluten free, non gmo butter chocolates made with vanilla and cashew. and i choose the 12 count packet with salty chocolate flavor", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "12-pack salty chocolate", "12 count (pack of 1)" ] }, "asin": "B07Q4QY2B3" }, { "task_id": "ws_B081YWZWQW_7164", "instruction": "i want to buy a pair of machine washable jeans. look for them in size 33 short with a standard fit. get the \"cast shadows\" color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "cast shadows", "standard", "33 short" ] }, "asin": "B081YWZWQW" }, { "task_id": "ws_B07FDZ7BCD_7165", "instruction": "looking for because it is you perfurme long lasting effect", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07FDZ7BCD" }, { "task_id": "ws_B00K8V2QNU_7166", "instruction": "i am looking for a 4 pack of long lasting, high performance 12v batteries.", "target_attributes": { "attributes": [ "long lasting", "high performance" ], "options": [ "4 pack" ] }, "asin": "B00K8V2QNU" }, { "task_id": "ws_B00ZS8O4QA_7167", "instruction": "i need a cruelty free face mist", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B00ZS8O4QA" }, { "task_id": "ws_B09MK1L322_7168", "instruction": "i would like a 32 gigabyte desktop computer with a intel core.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "32gb ddr4 i 1tb ssd i 1tb hdd" ] }, "asin": "B09MK1L322" }, { "task_id": "ws_B09FFW4QWR_7169", "instruction": "i need a 4 oz sprinkle for my birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "4 oz" ] }, "asin": "B09FFW4QWR" }, { "task_id": "ws_B091JCM72C_7170", "instruction": "hunting for a natural deodorant that is aluminum and baking soda free, hypoallergenic, safe for sensitive skin, underarms, and private parts in a 2 pk 3 ounce tube. prefer either clean tangerine or lavender sage scent.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "lavender sage" ] }, "asin": "B091JCM72C" }, { "task_id": "ws_B000GCQ04C_7171", "instruction": "i need a toner for sensitive skin that is 16 fl oz", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "16 fl oz (pack of 1)", "pore perfecting toner" ] }, "asin": "B000GCQ04C" }, { "task_id": "ws_B09MVWWZWC_7172", "instruction": "i am looking for a 2pcs set cosmetic bags which is easy to carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "2pcs set" ] }, "asin": "B09MVWWZWC" }, { "task_id": "ws_B079HHHQ3S_7173", "instruction": "i am looking for nut free and gluten free chocolate.", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [ "fair trade, nut free, gluten free" ] }, "asin": "B079HHHQ3S" }, { "task_id": "ws_B087C2R5KL_7174", "instruction": "i'm looking for an easy-to-clean desk cover protector for my round dining room table; it should be frosted and about 34 x 48 inches in size.", "target_attributes": { "attributes": [ "easy clean", "dining room" ], "options": [ "round new frosted 2mm", "34 x 48 inches" ] }, "asin": "B087C2R5KL" }, { "task_id": "ws_B087C2R5KL_7175", "instruction": "i need round table pads that are heavy duty and are a size 33.5 by 55.1 inches", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "round new clear 2mm", "33.5 x 55.1 inches" ] }, "asin": "B087C2R5KL" }, { "task_id": "ws_B07N12XY6N_7176", "instruction": "i need a pair of machine washable black sneakers in a 13 wide.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "black | black", "13 wide" ] }, "asin": "B07N12XY6N" }, { "task_id": "ws_B001SYZXFY_7177", "instruction": "i am looking for a pack of powder blush that can be applied easily . and i choose the pack of 3 with soft sable color", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "soft sable", "0.12 ounce (pack of 3)" ] }, "asin": "B001SYZXFY" }, { "task_id": "ws_B08C5LVXPM_7178", "instruction": "i'm looking for a fudule sandals for women.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "y-5 begie", "11.5" ] }, "asin": "B08C5LVXPM" }, { "task_id": "ws_B0964BFQXK_7179", "instruction": "i am looking for a high density mattress.", "target_attributes": { "attributes": [ "high density" ], "options": [] }, "asin": "B0964BFQXK" }, { "task_id": "ws_B07RKJKJGC_7180", "instruction": "i'm looking for a grey 4k gold plated hdmi cable that is high speed and 6.6 feet long.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "grey", "6.6 feet" ] }, "asin": "B07RKJKJGC" }, { "task_id": "ws_B01ANA4T7G_7181", "instruction": "i need pink color hair removal", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "bubblegum pink" ] }, "asin": "B01ANA4T7G" }, { "task_id": "ws_B00ZCL4F6W_7182", "instruction": "i am looking for a food bar of organic blueberry lemon flavor having low sugar.", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "organic blueberry lemon" ] }, "asin": "B00ZCL4F6W" }, { "task_id": "ws_B076HVZ1HK_7183", "instruction": "i am looking for non gmo certified organic ghee.", "target_attributes": { "attributes": [ "certified organic", "non gmo" ], "options": [] }, "asin": "B076HVZ1HK" }, { "task_id": "ws_B096YKT25N_7184", "instruction": "i would like a wine red stool cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "wine red" ] }, "asin": "B096YKT25N" }, { "task_id": "ws_B086BM7JPL_7185", "instruction": "i would like a long lasting foundation for my line lines.", "target_attributes": { "attributes": [ "long lasting", "fine lines" ], "options": [] }, "asin": "B086BM7JPL" }, { "task_id": "ws_B000G7YO2M_7186", "instruction": "i want fat free and toffee almond nonni's biscottis.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "toffee almond" ] }, "asin": "B000G7YO2M" }, { "task_id": "ws_B000G7YO2M_7187", "instruction": "i am interested in buying biscotti which are fat free, and individually wrapped while their flavor should be cioccolati and packed as 12 in 8-count boxes.", "target_attributes": { "attributes": [ "fat free", "individually wrapped" ], "options": [ "cioccolati", "8-count boxes (pack of 12)" ] }, "asin": "B000G7YO2M" }, { "task_id": "ws_B076JPZPHH_7188", "instruction": "i am looking for some gluten free snack foods that are pumpkin pie flavored.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pumpkin pie" ] }, "asin": "B076JPZPHH" }, { "task_id": "ws_B09SCT1NLY_7189", "instruction": "i'd like to buy some open toed, high heeled sandals with an ankle strap. look for 6 wides in khaki.", "target_attributes": { "attributes": [ "open toe", "high heel", "ankle strap" ], "options": [ "a6 - khaki", "6 wide" ] }, "asin": "B09SCT1NLY" }, { "task_id": "ws_B07Y5GG5Q2_7190", "instruction": "i will like to have trader joe's fiberful granola bars rolled oats & chocolate chips", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B07Y5GG5Q2" }, { "task_id": "ws_B07Y5GG5Q2_7191", "instruction": "i am looking for trader joe's granola bars.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B07Y5GG5Q2" }, { "task_id": "ws_B0836HNRKP_7192", "instruction": "i need some makeup remover pads for sensitive skin. get style two.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "makeup remover pads | style 2" ] }, "asin": "B0836HNRKP" }, { "task_id": "ws_B09HC76MQF_7193", "instruction": "i'm looking for twin sized furniture for bedroom furniture.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B09HC76MQF" }, { "task_id": "ws_B07VJC71BN_7194", "instruction": "i'm looking for a queen pillow shams set of 2 pinch and to be super soft and white", "target_attributes": { "attributes": [ "queen size", "super soft" ], "options": [ "white" ] }, "asin": "B07VJC71BN" }, { "task_id": "ws_B083VZN11N_7195", "instruction": "i would like a 6 ounce variety of grain free cacao granola.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "variety of cacao, matcha, original", "6 ounce (pack of 1)" ] }, "asin": "B083VZN11N" }, { "task_id": "ws_B079WHF7B9_7196", "instruction": "i am looking for some non gmo popcorn.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B079WHF7B9" }, { "task_id": "ws_B08MWJ1FY1_7197", "instruction": "i'm looking for a party supplies cupcake toppers, preferably red graduation toppers.", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "red graduation toppers" ] }, "asin": "B08MWJ1FY1" }, { "task_id": "ws_B091YB6MRZ_7198", "instruction": "i need to buy some easy to apply nail glitter. get color h8.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "h8" ] }, "asin": "B091YB6MRZ" }, { "task_id": "ws_B07PRD8LFJ_7199", "instruction": "i am looking for medium sized underwear bottom with machine washable feature.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "medium" ] }, "asin": "B07PRD8LFJ" }, { "task_id": "ws_B09RDVZFT6_7200", "instruction": "i am looking for a slim fitting red polo that is in a xx-large.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "1-red", "xx-large" ] }, "asin": "B09RDVZFT6" }, { "task_id": "ws_B009ZJHEEM_7201", "instruction": "i am looking for 7.2 ounce (pack of 1) spicy white chocolate truffle for great gift", "target_attributes": { "attributes": [ "great gift" ], "options": [ "spice", "7.2 ounce (pack of 1)" ] }, "asin": "B009ZJHEEM" }, { "task_id": "ws_B09JG87XL1_7202", "instruction": "i'm looking for cupcakes for birthday parties.", "target_attributes": { "attributes": [ "birthday party", "birthday cake", "party supplies" ], "options": [] }, "asin": "B09JG87XL1" }, { "task_id": "ws_B087RWWZ5J_7203", "instruction": "i would like a pack of salted butternut squash stalks that is gluten free and contains other plant based ingredients.", "target_attributes": { "attributes": [ "plant based", "gluten free" ], "options": [ "salted" ] }, "asin": "B087RWWZ5J" }, { "task_id": "ws_B073X2WRSV_7204", "instruction": "i am looking for a dermatologist tested foundation that is in the color of soft honey.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "soft honey", "1 fl oz (pack of 1)" ] }, "asin": "B073X2WRSV" }, { "task_id": "ws_B073X2WRSV_7205", "instruction": "i want to buy liquid makeup which has been tested by dermatologists and it has honey color, i prefer it to be at 1 fl oz at pack of 1 size.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "honey", "1 fl oz (pack of 1)" ] }, "asin": "B073X2WRSV" }, { "task_id": "ws_B073X2WRSV_7206", "instruction": "i am looking for a dermatologist tested liquid makeup of chestnut color.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "chestnut" ] }, "asin": "B073X2WRSV" }, { "task_id": "ws_B073X2WRSV_7207", "instruction": "i need some foundation in a buff color. look for a two pack of one ounce bottles. it should be dermatologist tested.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "buff", "1 fl. oz (pack of 2)" ] }, "asin": "B073X2WRSV" }, { "task_id": "ws_B00JSLKCB4_7208", "instruction": "i'm looking for a pair of pants that's easy to care for and come in a classic fit. i need them in black, size 40w x 32l.", "target_attributes": { "attributes": [ "easy care", "classic fit" ], "options": [ "black", "40w x 32l" ] }, "asin": "B00JSLKCB4" }, { "task_id": "ws_B09SF217NB_7209", "instruction": "i need a brown 6 wide sandal with ankle strap", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "a5 - brown", "6 wide" ] }, "asin": "B09SF217NB" }, { "task_id": "ws_B096X1F7VK_7210", "instruction": "i want a dual band serveillance bullet camera waterproof motion detection", "target_attributes": { "attributes": [ "dual band", "motion detection" ], "options": [] }, "asin": "B096X1F7VK" }, { "task_id": "ws_B07DYGT4N5_7211", "instruction": "i am looking for a double sided white apron for shaving and trimming.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "white" ] }, "asin": "B07DYGT4N5" }, { "task_id": "ws_B08PZGFNGC_7212", "instruction": "i am looking for an old bronze vanity light", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "old bronze" ] }, "asin": "B08PZGFNGC" }, { "task_id": "ws_B081B7GHV5_7213", "instruction": "nikon digital camera with red optical zoom", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B081B7GHV5" }, { "task_id": "ws_B07BG65PL3_7214", "instruction": "i'm looking for a heavy duty mattress with box spring. also choose split king sized mattress + platform bed styled with cool gel designed one.", "target_attributes": { "attributes": [ "heavy duty", "box spring" ], "options": [ "cool gel", "split king", "mattress + platform bed" ] }, "asin": "B07BG65PL3" }, { "task_id": "ws_B09MFGM4S2_7215", "instruction": "i am looking for a network antenna that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09MFGM4S2" }, { "task_id": "ws_B01MQSLK2Z_7216", "instruction": "i want a high performance lenovo yoga book - fhd 10.1\" android tablet - 2 in 1 tablet windows os", "target_attributes": { "attributes": [ "high performance" ], "options": [ "windows os" ] }, "asin": "B01MQSLK2Z" }, { "task_id": "ws_B09RMTJTBJ_7217", "instruction": "i would like a full xl 4\" foundation for a box spring and mattress set.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "full xl", "4\" foundation" ] }, "asin": "B09RMTJTBJ" }, { "task_id": "ws_B0967WDH66_7218", "instruction": "i need to buy a silver eight light chandelier for my living room. i want one that's easy to install.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "silver-8 light" ] }, "asin": "B0967WDH66" }, { "task_id": "ws_B0744GPMNS_7219", "instruction": "i want steel frame in grey color", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B0744GPMNS" }, { "task_id": "ws_B08TQWXY9B_7220", "instruction": "i am looking for a wireless charging cradles of silence phone holder mount color", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B08TQWXY9B" }, { "task_id": "ws_B09P4QBZN8_7221", "instruction": "need a large sleepwear pajamas in gray with elastic closure", "target_attributes": { "attributes": [ "elastic closure" ], "options": [ "gray", "large" ] }, "asin": "B09P4QBZN8" }, { "task_id": "ws_B08NW4TVGY_7222", "instruction": "i would like a meat substitute flavored with sea salt that is ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "sea salt | black pepper" ] }, "asin": "B08NW4TVGY" }, { "task_id": "ws_B00EO23OKI_7223", "instruction": "i would like a 2.25 bottle of men's single shower fresh alcohol free antiperspirant.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "shower fresh", "single", "2.25 ounce (pack of 1)", "men" ] }, "asin": "B00EO23OKI" }, { "task_id": "ws_B00EO23OKI_7224", "instruction": "i'm looking for a stick of men's mountain air scented deodorant that is alcohol free.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "mountain air" ] }, "asin": "B00EO23OKI" }, { "task_id": "ws_B00BQ76XK2_7225", "instruction": "i am looking for a green tea makeup brushes & tools", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B00BQ76XK2" }, { "task_id": "ws_B09QHXLZQY_7226", "instruction": "i would like a extra large green short sleeve t shirt", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "b3-green", "x-large" ] }, "asin": "B09QHXLZQY" }, { "task_id": "ws_B09QHXLZQY_7227", "instruction": "i want a gray floral graphic long sleeve shirt for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "b2-gray" ] }, "asin": "B09QHXLZQY" }, { "task_id": "ws_B01I1C9F0E_7228", "instruction": "i am looking for aluminum alloy video camera tripod", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B01I1C9F0E" }, { "task_id": "ws_B00QQKPIC8_7229", "instruction": "i am looking for some 18 inch pearl platinum synthetic hair extensions.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "pearl platinum", "18 inch (pack of 1)" ] }, "asin": "B00QQKPIC8" }, { "task_id": "ws_B00QQKPIC8_7230", "instruction": "i am looking for 16 inch light golden blonde color synthetic hair extensions hairpieces for women", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "light golden blonde", "16 inch (pack of 1)" ] }, "asin": "B00QQKPIC8" }, { "task_id": "ws_B00QQKPIC8_7231", "instruction": "i am interested in pale blonde hair extensions that are 18 inches long", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "light pale blonde", "18 inch (pack of 1)" ] }, "asin": "B00QQKPIC8" }, { "task_id": "ws_B09H5J9FGZ_7232", "instruction": "i am looking for a camcorder that is easy to carry and have optical zoom.", "target_attributes": { "attributes": [ "easy carry", "optical zoom" ], "options": [] }, "asin": "B09H5J9FGZ" }, { "task_id": "ws_B09H5J9FGZ_7233", "instruction": "i would like a camcorder with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B09H5J9FGZ" }, { "task_id": "ws_B00JP62FBM_7234", "instruction": "i need long lasting kenzo l'eau par kenzo toilet spray for women", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00JP62FBM" }, { "task_id": "ws_B09Q8MQ5FF_7235", "instruction": "i am looking for a 0.07d-15mm size cruelty free false eyelashes & adhesives", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "0.07d-15mm" ] }, "asin": "B09Q8MQ5FF" }, { "task_id": "ws_B09Q8MQ5FF_7236", "instruction": "i want to find 0.7-14 millimeter long lash extensions in pink. they must be easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "pink+red+blue+purple +white+green+brown", "0.07d-14mm" ] }, "asin": "B09Q8MQ5FF" }, { "task_id": "ws_B0959B21HW_7237", "instruction": "i\u2019m looking for modern and natural platform bed frames for twin beds. i don\u2019t mind if there\u2019s some assembly required.", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "natural", "twin" ] }, "asin": "B0959B21HW" }, { "task_id": "ws_B093SZ7QMH_7238", "instruction": "i would like a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SZ7QMH" }, { "task_id": "ws_B09NLRKKHJ_7239", "instruction": "i am looking for a lightweight background that is 10 by 10 ft", "target_attributes": { "attributes": [ "light weight" ], "options": [ "10x10ft | 3x3m" ] }, "asin": "B09NLRKKHJ" }, { "task_id": "ws_B07VB1CGXW_7240", "instruction": "i would like a men's extra small navy officially licensed mario shirt.", "target_attributes": { "attributes": [ "cotton heather" ], "options": [] }, "asin": "B07VB1CGXW" }, { "task_id": "ws_B097PJV6CJ_7241", "instruction": "i need lightweight navy shoes that are in a size 11", "target_attributes": { "attributes": [ "light weight" ], "options": [ "navy blue | mix", "11" ] }, "asin": "B097PJV6CJ" }, { "task_id": "ws_B081ZW6KT2_7242", "instruction": "i am looking for a men's baby blue classic fit shirt", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "baby blue", "men" ] }, "asin": "B081ZW6KT2" }, { "task_id": "ws_B01MRBW7EO_7243", "instruction": "i'm looking for a pair of flat front stretch corduroy pants with a classic fit in dark grey. size needs to be 31 long with a 40 waist.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "dark grey", "40w x 31l" ] }, "asin": "B01MRBW7EO" }, { "task_id": "ws_B07T9QC7RT_7244", "instruction": "i am looking for a foundation that is metallic gold and has natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "#02 metallic gold" ] }, "asin": "B07T9QC7RT" }, { "task_id": "ws_B0992C1J45_7245", "instruction": "i would like a box of individually wrapped chocolate cereal bars.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "chocolate" ] }, "asin": "B0992C1J45" }, { "task_id": "ws_B0721MGWLC_7246", "instruction": "i need a black case cover for my iphone", "target_attributes": { "attributes": [ "case cover" ], "options": [ "black" ] }, "asin": "B0721MGWLC" }, { "task_id": "ws_B08DFXSL8Y_7247", "instruction": "i am looking for a automatic rotating styling tool with metallic ionic barrel and smart anti-stuck sensor for long and medium length hair.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "black" ] }, "asin": "B08DFXSL8Y" }, { "task_id": "ws_B07BSWXFWY_7248", "instruction": "i need a digital camera that has a high optical zoom", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B07BSWXFWY" }, { "task_id": "ws_B07Y2QZ191_7249", "instruction": "i need to buy a two pack of beige memory foam chair pads for my dining room.", "target_attributes": { "attributes": [ "memory foam", "dining room" ], "options": [ "bradford beige | brown", "2 count (pack of 1)" ] }, "asin": "B07Y2QZ191" }, { "task_id": "ws_B000Q5K1O4_7250", "instruction": "i am looking for a 24 pack of shelf stable fruit juices.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "8.4 fl oz (pack of 24)" ] }, "asin": "B000Q5K1O4" }, { "task_id": "ws_B09NPXWNMY_7251", "instruction": "i am looking for light weight safety shoes for men of black color.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "black" ] }, "asin": "B09NPXWNMY" }, { "task_id": "ws_B07X4TQXB3_7252", "instruction": "i need a 4-light brushed nickel fixture. it should have a wood finish.", "target_attributes": { "attributes": [ "wood finish", "brushed nickel", "light fixture" ], "options": [ "4-light" ] }, "asin": "B07X4TQXB3" }, { "task_id": "ws_B00DOVR7ZI_7253", "instruction": "i need an 8 ounce package of freeze dried tomatoes", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B00DOVR7ZI" }, { "task_id": "ws_B08CXFN5QM_7254", "instruction": "i need brown flats that are a size 7 and are anti-slip", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "z91-brown", "7" ] }, "asin": "B08CXFN5QM" }, { "task_id": "ws_B08QRTXNJC_7255", "instruction": "i would like a 3 lights conical lampshade that is easy to put on.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "conical lampshade", "3-lights" ] }, "asin": "B08QRTXNJC" }, { "task_id": "ws_B07BJKYB79_7256", "instruction": "im looking for light khaki brown men\u2019s jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "light khaki brown" ] }, "asin": "B07BJKYB79" }, { "task_id": "ws_B07BJKYB79_7257", "instruction": "i am looking for machine washable athletic fit jeans that are olive in color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "olive" ] }, "asin": "B07BJKYB79" }, { "task_id": "ws_B09DYV3YD4_7258", "instruction": "i want 1080p hd hidden camera 32 gb memory recorder", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "32gb" ] }, "asin": "B09DYV3YD4" }, { "task_id": "ws_B07WH58X7T_7259", "instruction": "i'm looking a 6.5\" navy blue case for iphone 11 pro max with carbon fiber", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "iphone 11 pro max 6.5\",navy blue" ] }, "asin": "B07WH58X7T" }, { "task_id": "ws_B09MCWCKYB_7260", "instruction": "i would like a high quality cosmetic bag decorated with cow and flowers.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "cow with flowers-blue", "bag" ] }, "asin": "B09MCWCKYB" }, { "task_id": "ws_B0852XLRMD_7261", "instruction": "i would like a triple chocolate gluten free keto friendly cake mix.", "target_attributes": { "attributes": [ "gluten free", "keto friendly" ], "options": [ "triple chocolate" ] }, "asin": "B0852XLRMD" }, { "task_id": "ws_B004R8WJHS_7262", "instruction": "i would like a long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004R8WJHS" }, { "task_id": "ws_B06Y96N1KG_7263", "instruction": "i am looking for non gmo sea salt smoked", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "smoked classics" ] }, "asin": "B06Y96N1KG" }, { "task_id": "ws_B06Y96N1KG_7264", "instruction": "i want to find a 3-count pack of 4-ounce containers of natural sea salt. the salt needs to be non-gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "natural salts", "4 ounce (3 count)" ] }, "asin": "B06Y96N1KG" }, { "task_id": "ws_B06Y96N1KG_7265", "instruction": "i want to find a six-pack of 4-ounce bottles of vegetarian, gluten-free smoked sea salt.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vegetarian smoked", "4 ounce (pack of 6)" ] }, "asin": "B06Y96N1KG" }, { "task_id": "ws_B08X4J2X2V_7266", "instruction": "i'm looking for tousled hair extensions that come two to a pack. they should be light brown and ash blonde.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "t-light brown & ash blonde", "2 piece tousled (45g)" ] }, "asin": "B08X4J2X2V" }, { "task_id": "ws_B09JP3ZLQQ_7267", "instruction": "looking for eco friendly toothbrushes for sensitive teeth also choose paper package super soft", "target_attributes": { "attributes": [ "eco friendly", "sensitive teeth" ], "options": [ "paper package-super soft" ] }, "asin": "B09JP3ZLQQ" }, { "task_id": "ws_B09GBBGX3J_7268", "instruction": "i would like a pair of women's 8.5 toffee shoe with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "toffee", "8.5" ] }, "asin": "B09GBBGX3J" }, { "task_id": "ws_B000EY5COG_7269", "instruction": "i am looking for powdered milk that is gluten free and nonfat", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "nonfat powdered" ] }, "asin": "B000EY5COG" }, { "task_id": "ws_B08GY9D56X_7270", "instruction": "i am looking for rectangular shape shaggy with tassels rug for a living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "rectangular" ] }, "asin": "B08GY9D56X" }, { "task_id": "ws_B08GY9D56X_7271", "instruction": "i need a blue area rug for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue" ] }, "asin": "B08GY9D56X" }, { "task_id": "ws_B08GY9D56X_7272", "instruction": "i want an off-white rectangular area rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "off-white", "rectangular" ] }, "asin": "B08GY9D56X" }, { "task_id": "ws_B08VBN9C3H_7273", "instruction": "i need 16 cups of gluten free organic hummus in black olive color.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "16 cups large ripe pitted black olives" ] }, "asin": "B08VBN9C3H" }, { "task_id": "ws_B09RHCSPXH_7274", "instruction": "i am in need of a royal blue men's classic fit tank that is in a large.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "royal blue", "men", "large" ] }, "asin": "B09RHCSPXH" }, { "task_id": "ws_B09H3BQRZY_7275", "instruction": "i need a 50\" by 40\" living room throw", "target_attributes": { "attributes": [ "living room" ], "options": [ "50\"x40\"\uff08throw\uff09kids" ] }, "asin": "B09H3BQRZY" }, { "task_id": "ws_B082WJ54KG_7276", "instruction": "i'm looking for a haori jacket that's machine wash and comes in black. i need a size extra small.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "s-black", "x-small" ] }, "asin": "B082WJ54KG" }, { "task_id": "ws_B07K46V79T_7277", "instruction": "i'm looking for gluten free and soy free it was contain high protein.", "target_attributes": { "attributes": [ "soy free", "dairy free", "gluten free" ], "options": [ "hot chili pepper" ] }, "asin": "B07K46V79T" }, { "task_id": "ws_B09BJNFTC1_7278", "instruction": "i'm looking for a pair of women's pumps that have an ankle strap and a leather sole. look for them in black, size twelve and a half.", "target_attributes": { "attributes": [ "ankle strap", "rubber sole" ], "options": [ "black", "12.5" ] }, "asin": "B09BJNFTC1" }, { "task_id": "ws_B083S5CNQ7_7279", "instruction": "i need a red phone case that comes with a tempered glass screen protector.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "red" ] }, "asin": "B083S5CNQ7" }, { "task_id": "ws_B0143WCTO0_7280", "instruction": "i would like a pack of raisin challah bread that is gluten and soy free.", "target_attributes": { "attributes": [ "gluten free", "soy free" ], "options": [ "raisin challah", "1 pack" ] }, "asin": "B0143WCTO0" }, { "task_id": "ws_B07QD7ZRDV_7281", "instruction": "i need a nine by twelve foot ivory colored rug for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "ivory | multi", "9 ft x 12 ft" ] }, "asin": "B07QD7ZRDV" }, { "task_id": "ws_B07MYBVRY2_7282", "instruction": "i need a pack of lip balm that is made of coconut oil", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "1-pack lip balm" ] }, "asin": "B07MYBVRY2" }, { "task_id": "ws_B08LYC1254_7283", "instruction": "i want a soft silicone mask for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B08LYC1254" }, { "task_id": "ws_B088H5CYXF_7284", "instruction": "i need an executive chair that is black and made of pu leather", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "black" ] }, "asin": "B088H5CYXF" }, { "task_id": "ws_B078GR42XX_7285", "instruction": "i am looking for sc665 handset for mobile phone with noise cancelling feature.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "sc665" ] }, "asin": "B078GR42XX" }, { "task_id": "ws_B00SKVJK1G_7286", "instruction": "i would like a high speed pack of 5 hdmi cables", "target_attributes": { "attributes": [ "high speed" ], "options": [ "5 pack" ] }, "asin": "B00SKVJK1G" }, { "task_id": "ws_B00SKVJK1G_7287", "instruction": "i am looking for a 10 pack of 10 feet long high speed gold plated hdmi cables.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "10 feet (10-pack)" ] }, "asin": "B00SKVJK1G" }, { "task_id": "ws_B00SKVJK1G_7288", "instruction": "i want a c&e high speed hdmi male to male cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to male" ] }, "asin": "B00SKVJK1G" }, { "task_id": "ws_B0013OSK8Q_7289", "instruction": "i would like 38 servings of unflavored whey protein that is low in fat.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "unflavored", "38 servings (pack of 1)" ] }, "asin": "B0013OSK8Q" }, { "task_id": "ws_B087K1S6M3_7290", "instruction": "i'm looking for a size 32x32 living room abstract canvas.", "target_attributes": { "attributes": [ "living room" ], "options": [ "32x32" ] }, "asin": "B087K1S6M3" }, { "task_id": "ws_B07BH76HZ4_7291", "instruction": "i'm looking for a small gift basket of milk chocolate mint truffles for valentine's day; about 4oz.", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [ "chocolate", ".25 lb (4 oz)" ] }, "asin": "B07BH76HZ4" }, { "task_id": "ws_B09QKWFB31_7292", "instruction": "buy me anti aging long lasting easy to use ice roller for face in aqua blue color.", "target_attributes": { "attributes": [ "anti aging", "long lasting", "easy use" ], "options": [ "aqua blue" ] }, "asin": "B09QKWFB31" }, { "task_id": "ws_B01J8A8CBG_7293", "instruction": "i would like some wild caught crab.", "target_attributes": { "attributes": [ "wild caught" ], "options": [] }, "asin": "B01J8A8CBG" }, { "task_id": "ws_B01M0LOBNV_7294", "instruction": "i would like a box of rubine hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "rubine" ] }, "asin": "B01M0LOBNV" }, { "task_id": "ws_B083NN8VRR_7295", "instruction": "i need blue color 11.5 size long sleeve", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue", "11.5" ] }, "asin": "B083NN8VRR" }, { "task_id": "ws_B092CD4Q8K_7296", "instruction": "i'm looking for headphones are color it was wireless charging it was outside of noise cancellation.", "target_attributes": { "attributes": [ "noise cancelling", "wireless charging" ], "options": [ "pink" ] }, "asin": "B092CD4Q8K" }, { "task_id": "ws_B09MCXBFW1_7297", "instruction": "i am looking for a multi-colored blackout window film for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi-13124" ] }, "asin": "B09MCXBFW1" }, { "task_id": "ws_B071S1RR6H_7298", "instruction": "i am looking for nail polish that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B071S1RR6H" }, { "task_id": "ws_B07QS369Z7_7299", "instruction": "i'm looking for a pair of sweatpants with a drawstring waist in space grey. i need them in size large.", "target_attributes": { "attributes": [ "drawstring waist" ], "options": [ "space dye grey", "large" ] }, "asin": "B07QS369Z7" }, { "task_id": "ws_B07YNW1JZJ_7300", "instruction": "looking for gift set of handmade italian biscottis with natural ingredients", "target_attributes": { "attributes": [ "natural ingredients", "gift set" ], "options": [] }, "asin": "B07YNW1JZJ" }, { "task_id": "ws_B09F5YS8D2_7301", "instruction": "i would like 10 brown coat hooks for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown", "10 hook" ] }, "asin": "B09F5YS8D2" }, { "task_id": "ws_B06WW1MXDZ_7302", "instruction": "i am looking for a high performance dslr camera lenses that are certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B06WW1MXDZ" }, { "task_id": "ws_B07XPJSP2N_7303", "instruction": "i need to buy a six pack of sugar free, keto friendly, non-gmo cheese crisps in the original flavor.", "target_attributes": { "attributes": [ "keto friendly", "sugar free", "non gmo" ], "options": [ "original", "pack of 6" ] }, "asin": "B07XPJSP2N" }, { "task_id": "ws_B00QNLS26O_7304", "instruction": "i would like some old fashioned summer sausage.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [] }, "asin": "B00QNLS26O" }, { "task_id": "ws_B092MZLG4B_7305", "instruction": "i am looking for an electrolyte drink that is low carb and in the berry flavor.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "berry" ] }, "asin": "B092MZLG4B" }, { "task_id": "ws_B07FL52HPF_7306", "instruction": "i would like a 12 ounce bottle of mango conditioner that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "12 ounce", "mango" ] }, "asin": "B07FL52HPF" }, { "task_id": "ws_B07FL52HPF_7307", "instruction": "i need a conditioner that is 12 ounces and is paraben free with a coconut scent.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "12 ounce", "coconut" ] }, "asin": "B07FL52HPF" }, { "task_id": "ws_B07RWDMGSX_7308", "instruction": "i am looking for a red blonde natural hair for wigs", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "red blonde" ] }, "asin": "B07RWDMGSX" }, { "task_id": "ws_B09BPVM1P5_7309", "instruction": "looking for dual band output protection ac adapter", "target_attributes": { "attributes": [ "dual band", "output protection" ], "options": [] }, "asin": "B09BPVM1P5" }, { "task_id": "ws_B08TKJVY47_7310", "instruction": "i would like a valentines day snack gift basket.", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [] }, "asin": "B08TKJVY47" }, { "task_id": "ws_B09GVWK6FX_7311", "instruction": "i am looking for some storage cabinets for storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [] }, "asin": "B09GVWK6FX" }, { "task_id": "ws_B08BLCBNQ1_7312", "instruction": "i am looking for ultra hd surveillance dvr kits", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B08BLCBNQ1" }, { "task_id": "ws_B082WZ282J_7313", "instruction": "i am looking a chocolate gift box for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B082WZ282J" }, { "task_id": "ws_B082YMS9LN_7314", "instruction": "i'm looking for a high quality cosmetic bag. also the c mermaid scales color is what i prefer.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "c mermaid scales" ] }, "asin": "B082YMS9LN" }, { "task_id": "ws_B082YMS9LN_7315", "instruction": "i would like a corgi dog cosmetic bag for my nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "corgi dog" ] }, "asin": "B082YMS9LN" }, { "task_id": "ws_B087JD3R9C_7316", "instruction": "i would like a pair of size 10 grey pumps with a high heel.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "grey", "10" ] }, "asin": "B087JD3R9C" }, { "task_id": "ws_B085Y1D9PX_7317", "instruction": "find me a anti slip size 6 black color womens platform sandals", "target_attributes": { "attributes": [ "anti slip" ], "options": [] }, "asin": "B085Y1D9PX" }, { "task_id": "ws_B09JCMW4F6_7318", "instruction": "i am looking for a red faux fur jacket that is in a small.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "red", "small" ] }, "asin": "B09JCMW4F6" }, { "task_id": "ws_B08XPYZ2TH_7319", "instruction": "im looking for a black alarm clock radio that displays the temperature and uses a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B08XPYZ2TH" }, { "task_id": "ws_B09RSSX4C7_7320", "instruction": "i would like a peach flavored high fructose margarita mix.", "target_attributes": { "attributes": [ "high fructose" ], "options": [ "peach" ] }, "asin": "B09RSSX4C7" }, { "task_id": "ws_B09PBPR95R_7321", "instruction": "i need a green sweatshirt that is loose fit and is a medium", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "#03-green", "medium" ] }, "asin": "B09PBPR95R" }, { "task_id": "ws_B088SJ4C4X_7322", "instruction": "i am looking for root beer flavor syrup that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "root beer" ] }, "asin": "B088SJ4C4X" }, { "task_id": "ws_B075QGP9Z1_7323", "instruction": "i would like a twin size indigo pink duvet cover set that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "indigo pink", "twin size" ] }, "asin": "B075QGP9Z1" }, { "task_id": "ws_B08SK39NHH_7324", "instruction": "i am looking for shell mosaic color pendant light chandeliers", "target_attributes": { "attributes": [ "pendant light" ], "options": [ "shell mosaic" ] }, "asin": "B08SK39NHH" }, { "task_id": "ws_B07GCV2K39_7325", "instruction": "i am looking for wild caught smoked fish.", "target_attributes": { "attributes": [ "wild caught" ], "options": [] }, "asin": "B07GCV2K39" }, { "task_id": "ws_B08R1MJL3H_7326", "instruction": "i am looking for a soy wax candle that is white sage and 14 oz.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "white sage", "14.1 oz-1 pack" ] }, "asin": "B08R1MJL3H" }, { "task_id": "ws_B082166NKL_7327", "instruction": "i want a 3 pack of trader joe's cookie thins.", "target_attributes": { "attributes": [ "trader joe" ], "options": [ "3 pack" ] }, "asin": "B082166NKL" }, { "task_id": "ws_B082166NKL_7328", "instruction": "i am looking for a 4 pack of trader joe's ginger cookies.", "target_attributes": { "attributes": [ "trader joe" ], "options": [ "4 pack" ] }, "asin": "B082166NKL" }, { "task_id": "ws_B07RVDW2Z2_7329", "instruction": "i am looking for candles for a birthday cake in the style t.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "t" ] }, "asin": "B07RVDW2Z2" }, { "task_id": "ws_B07RVDW2Z2_7330", "instruction": "i need birthday candles for my birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B07RVDW2Z2" }, { "task_id": "ws_B07JC99BGV_7331", "instruction": "i am looking for non slip chair pads that are chocolate and come in an 8 pack.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "chocolate", "8 pack" ] }, "asin": "B07JC99BGV" }, { "task_id": "ws_B08F8K9ZMK_7332", "instruction": "i need some espresso box spring twin beds", "target_attributes": { "attributes": [ "box spring" ], "options": [ "espresso", "twin" ] }, "asin": "B08F8K9ZMK" }, { "task_id": "ws_B07YM1WS37_7333", "instruction": "i am looking for a conditioner bar for my dry hair that is having kookabara scent.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "kookabara" ] }, "asin": "B07YM1WS37" }, { "task_id": "ws_B09T2LGNV3_7334", "instruction": "i'm looking for a grey 3 seater living room sofa.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey" ] }, "asin": "B09T2LGNV3" }, { "task_id": "ws_B07W8YKZRL_7335", "instruction": "i would like a mens 3xl baby blue t shirt made of heather cotton.", "target_attributes": { "attributes": [ "heathers cotton" ], "options": [ "baby blue", "men", "3x-large" ] }, "asin": "B07W8YKZRL" }, { "task_id": "ws_B09L47HSZD_7336", "instruction": "i am looking for red color hard pc anti-slip phone tempered glass for iphone 11", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "red" ] }, "asin": "B09L47HSZD" }, { "task_id": "ws_B07P53YMMD_7337", "instruction": "i want to buy a 12 count package of individually wrapped sour candies for a birthday party.", "target_attributes": { "attributes": [ "individually wrapped", "birthday party" ], "options": [ "12 count (pack of 1)" ] }, "asin": "B07P53YMMD" }, { "task_id": "ws_B087C8CCRT_7338", "instruction": "i am interested in buying a hairdressing apron which is long lasting and easy to clean in the color ba or pe.", "target_attributes": { "attributes": [ "easy clean", "long lasting" ], "options": [ "ba | pe" ] }, "asin": "B087C8CCRT" }, { "task_id": "ws_B0756CYWWD_7339", "instruction": "i would like a pair of silver noise cancelling headphones with wireless bluetooth.", "target_attributes": { "attributes": [ "noise cancelling", "wireless bluetooth" ], "options": [ "silver" ] }, "asin": "B0756CYWWD" }, { "task_id": "ws_B094L52FKW_7340", "instruction": "i am looking for cranberry almond color cookie that is fat free.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "cranberry almond" ] }, "asin": "B094L52FKW" }, { "task_id": "ws_B08LNZY1SD_7341", "instruction": "i need a machine washable light gray t-shirt", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "jet gray light heather (010) | black" ] }, "asin": "B08LNZY1SD" }, { "task_id": "ws_B09HH2ZDPX_7342", "instruction": "order for me clear 2l -brass & glass globe shade for light fixture in my living room.", "target_attributes": { "attributes": [ "clear glass", "light fixture", "living room" ], "options": [ "2l-brass & clear globe" ] }, "asin": "B09HH2ZDPX" }, { "task_id": "ws_B09HH2ZDPX_7343", "instruction": "i'm looking for wall sconces for living room, with clear glass and brushed nickel in 2l-bronze color and clear cone.", "target_attributes": { "attributes": [ "clear glass", "brushed nickel", "living room" ], "options": [ "2l-brass & clear cone" ] }, "asin": "B09HH2ZDPX" }, { "task_id": "ws_B094GG73C7_7344", "instruction": "i'm losing my hair, so i need to buy a bright red wig.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "bright red rooted medium brown" ] }, "asin": "B094GG73C7" }, { "task_id": "ws_B01J5UC1Q6_7345", "instruction": "i would like a 0.25 fluid ounces of oil free 090 foundation.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "090", "0.25 fl oz (pack of 1)" ] }, "asin": "B01J5UC1Q6" }, { "task_id": "ws_B08D6GLL32_7346", "instruction": "looking for contemporary wingback fabric barstools faux leather", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "faux leather" ] }, "asin": "B08D6GLL32" }, { "task_id": "ws_B0196BENJW_7347", "instruction": "can i have pierre's apothecary macadamia hydrating restoring conditioner with omega 7 and coconut oil", "target_attributes": { "attributes": [ "coconut oil" ], "options": [] }, "asin": "B0196BENJW" }, { "task_id": "ws_B07HKK3PQN_7348", "instruction": "i need to buy some running shoes. they should fit comfortably and have a synthetic sole. look for them in white, size 13.", "target_attributes": { "attributes": [ "comfortable fit", "synthetic sole" ], "options": [ "white (100) | white", "13" ] }, "asin": "B07HKK3PQN" }, { "task_id": "ws_B01M8L3I4E_7349", "instruction": "i'm looking for a royal 14 plus denim shorts butt lifting", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "royal", "14 plus" ] }, "asin": "B01M8L3I4E" }, { "task_id": "ws_B01JOKWJF0_7350", "instruction": "looking for pack of 1 nail polish", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "pack of 1" ] }, "asin": "B01JOKWJF0" }, { "task_id": "ws_B01JOKWJF0_7351", "instruction": "i search 550 hunger flames nail polish", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "529 | 550 hunger flames" ] }, "asin": "B01JOKWJF0" }, { "task_id": "ws_B07WTY16LH_7352", "instruction": "i want a variety pack of grass fed collagen creamers.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "variety" ] }, "asin": "B07WTY16LH" }, { "task_id": "ws_B00FL9DFB6_7353", "instruction": "i want a queen sized and faux leather platform bed.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "queen" ] }, "asin": "B00FL9DFB6" }, { "task_id": "ws_B07T55DL33_7354", "instruction": "i would like a high performance memory card reader.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B07T55DL33" }, { "task_id": "ws_B07CTSFKJL_7355", "instruction": "i'm looking for a delicious danish kringle pair a pecan and cream cheesecake.", "target_attributes": { "attributes": [ "baked fresh", "gift basket" ], "options": [] }, "asin": "B07CTSFKJL" }, { "task_id": "ws_B09D8MYY7P_7356", "instruction": "i'm looking for packaged fruits that flavor name was peaches-vanilla.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "peaches - vanilla" ] }, "asin": "B09D8MYY7P" }, { "task_id": "ws_B09M956CQG_7357", "instruction": "i want to easy to use and bush blonde l'oreal paris hair gloss.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "blush blonde" ] }, "asin": "B09M956CQG" }, { "task_id": "ws_B00TYPVRTA_7358", "instruction": "i would like 250 bags of strawberry sugar free tea.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "strawberry", "250 count" ] }, "asin": "B00TYPVRTA" }, { "task_id": "ws_B00TYPVRTA_7359", "instruction": "am searching for the republic of tea peppermint cuppa chocolate tea, 36 tea bags and sugar free", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "36 count (pack of 1)" ] }, "asin": "B00TYPVRTA" }, { "task_id": "ws_B099DPQBH9_7360", "instruction": "i'm looking for double sided nail hand for nail art its easy to use.", "target_attributes": { "attributes": [ "double sided", "nail art" ], "options": [] }, "asin": "B099DPQBH9" }, { "task_id": "ws_B07JMPC8J1_7361", "instruction": "i am looking for throw pillow covers of size 18 x 18 inches for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "18 x 18 inches" ] }, "asin": "B07JMPC8J1" }, { "task_id": "ws_B09CTRMZVR_7362", "instruction": "i am looking for casual rubber sole hot pink 7 color running shoes for women, 5 sized.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "h-pink 7", "5" ] }, "asin": "B09CTRMZVR" }, { "task_id": "ws_B09BZN6CBP_7363", "instruction": "help me purchase a high definition digital tv antenna with coaxial cable and easy to install.", "target_attributes": { "attributes": [ "easy install", "coaxial cable" ], "options": [] }, "asin": "B09BZN6CBP" }, { "task_id": "ws_B09HJJZ4HV_7364", "instruction": "i would like a 50 x 80 inch fleece throw with a valentines day inn design.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "valentine's dayinn4893", "50x80inch" ] }, "asin": "B09HJJZ4HV" }, { "task_id": "ws_B00EMKRPAC_7365", "instruction": "i would like a long lasting face toner for dry skin.", "target_attributes": { "attributes": [ "long lasting", "dry skin" ], "options": [] }, "asin": "B00EMKRPAC" }, { "task_id": "ws_B09N7BNH7R_7366", "instruction": "i'm looking for 4 color eyeshadow palette colorful matte and shimmer.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "#01" ] }, "asin": "B09N7BNH7R" }, { "task_id": "ws_B08NJF2PFP_7367", "instruction": "i want a light gray and machine washable 100% blackout window curtain panel.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "light gray" ] }, "asin": "B08NJF2PFP" }, { "task_id": "ws_B09DTPGMLC_7368", "instruction": "i need a package of one hundred gray zip ties. they should be eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "smokey gray 12\"x12\"", "8'' inch ziptie 100 pieces" ] }, "asin": "B09DTPGMLC" }, { "task_id": "ws_B09CLS963D_7369", "instruction": "i want pineapple flavor gluten free nut free 8 ounce cooking and baking powder", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pineapple", "8 ounce (pack of 1)" ] }, "asin": "B09CLS963D" }, { "task_id": "ws_B099R8BCTX_7370", "instruction": "i'm looking for a body hair remover cream.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B099R8BCTX" }, { "task_id": "ws_B092XBQVSV_7371", "instruction": "looking for natural flavors whole grain cheddar", "target_attributes": { "attributes": [ "natural flavors" ], "options": [] }, "asin": "B092XBQVSV" }, { "task_id": "ws_B09G983D7Q_7372", "instruction": "i would like a silver phone case with a glass tempered screen.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "silver" ] }, "asin": "B09G983D7Q" }, { "task_id": "ws_B093STM1BR_7373", "instruction": "i need a non slip carpet with 47 inches x 31 inches dimension.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "47 in x 31 in" ] }, "asin": "B093STM1BR" }, { "task_id": "ws_B093STM1BR_7374", "instruction": "i am interested in a non slip area rug that is 70 by 55 inch", "target_attributes": { "attributes": [ "non slip" ], "options": [ "70 in x 55 in" ] }, "asin": "B093STM1BR" }, { "task_id": "ws_B00CWTZ6GU_7375", "instruction": "i need some sugar free gingerbread flavor syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar free gingerbread" ] }, "asin": "B00CWTZ6GU" }, { "task_id": "ws_B09F8XTR6C_7376", "instruction": "i am interested in a paraben free eyeshadow", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B09F8XTR6C" }, { "task_id": "ws_B088KHF9S2_7377", "instruction": "i need a beauty salon makeup palette", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "size 1" ] }, "asin": "B088KHF9S2" }, { "task_id": "ws_B076HH25ZF_7378", "instruction": "i would like a queen size blue linen bed with drawers with a contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "blue linen", "queen", "bed with storage drawers" ] }, "asin": "B076HH25ZF" }, { "task_id": "ws_B07VXDK4B4_7379", "instruction": "i'm looking for a individually wrapped cake topper for birthday party.", "target_attributes": { "attributes": [ "individually wrapped", "birthday party" ], "options": [] }, "asin": "B07VXDK4B4" }, { "task_id": "ws_B09L7QJ54B_7380", "instruction": "looking for high quality silicone body scrubber for sensitive skin also choose colour grey", "target_attributes": { "attributes": [ "high quality", "sensitive skin" ], "options": [ "gray" ] }, "asin": "B09L7QJ54B" }, { "task_id": "ws_B08GPCY4BJ_7381", "instruction": "i am looking for a black-1 water resistant snow boots", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "black-1" ] }, "asin": "B08GPCY4BJ" }, { "task_id": "ws_B081DJRTJ1_7382", "instruction": "ethylene vinyl women's running shoes also choose size 8", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "8" ] }, "asin": "B081DJRTJ1" }, { "task_id": "ws_B09NQHBFPF_7383", "instruction": "i would like a yellow hair clip for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "yellow" ] }, "asin": "B09NQHBFPF" }, { "task_id": "ws_B07DLRD3TG_7384", "instruction": "i would like a king sized bed with a 8 inch mattress and storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "king", "8 inch mattress" ] }, "asin": "B07DLRD3TG" }, { "task_id": "ws_B086Z2QK25_7385", "instruction": "i am looking for gingerbread and white chocolate granola in resealable bags. it should not contain any artificial flavors.", "target_attributes": { "attributes": [ "resealable bag", "artificial flavors" ], "options": [ "gingerbread white chocolate" ] }, "asin": "B086Z2QK25" }, { "task_id": "ws_B086Z2QK25_7386", "instruction": "find a granola pack with low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [] }, "asin": "B086Z2QK25" }, { "task_id": "ws_B086Z2QK25_7387", "instruction": "i would like a four pack of mocha granola that has all natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "mocha", "7.5 ounce (pack of 4)" ] }, "asin": "B086Z2QK25" }, { "task_id": "ws_B09238H1R4_7388", "instruction": "i am looking for low carb hight proteintrue meat snack sticks of southwest verde venison. size is 12 packs of 1 oz", "target_attributes": { "attributes": [ "high protein", "low carb" ], "options": [ "southwest verde venison", "1oz-12 pack" ] }, "asin": "B09238H1R4" }, { "task_id": "ws_B09238H1R4_7389", "instruction": "i am looking for a high protein and low carb beef snack stick. i also need it to be gluten free and be made of natural ingredients.", "target_attributes": { "attributes": [ "gluten free", "high protein", "low carb", "natural ingredients" ], "options": [ "original beef" ] }, "asin": "B09238H1R4" }, { "task_id": "ws_B07HPP27S7_7390", "instruction": "i'm looking for a mary's gone crackers real thin crackers.", "target_attributes": { "attributes": [ "gluten free", "certified organic" ], "options": [ "garlic rosemary", "5 ounce (pack of 1)" ] }, "asin": "B07HPP27S7" }, { "task_id": "ws_B0872VP8QR_7391", "instruction": "i'm looking for some hot cocoa mix that comes in a pack of three and is non-gmo and sugar free.", "target_attributes": { "attributes": [ "sugar free", "non gmo" ], "options": [ "hot cocoa mix", "9 ounce (pack of 3)" ] }, "asin": "B0872VP8QR" }, { "task_id": "ws_B08LZ65XF6_7392", "instruction": "i am looking for a 12x10 ft high resolution backdrop of spring garden leaves.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "5x3ft" ] }, "asin": "B08LZ65XF6" }, { "task_id": "ws_B0943N574G_7393", "instruction": "i would like some champagne rhinestones for my nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "champagne" ] }, "asin": "B0943N574G" }, { "task_id": "ws_B07NGHB486_7394", "instruction": "i'm looking for a cruelty free eyeshadow palette with division color.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "division" ] }, "asin": "B07NGHB486" }, { "task_id": "ws_B008CUVP1I_7395", "instruction": "i'm looking for a perfect natural hair treatment with rice protein.", "target_attributes": { "attributes": [ "hair treatment", "natural hair" ], "options": [ "rice protein" ] }, "asin": "B008CUVP1I" }, { "task_id": "ws_B07ZFGMYF1_7396", "instruction": "i would like a color d wall lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "d" ] }, "asin": "B07ZFGMYF1" }, { "task_id": "ws_B09PF1W3FB_7397", "instruction": "i am looking for woman gym workout non slip arch support pink color shoe size :8", "target_attributes": { "attributes": [ "non slip", "arch support", "gym workout" ], "options": [ "pink", "8" ] }, "asin": "B09PF1W3FB" }, { "task_id": "ws_B09H3CF2MW_7398", "instruction": "looking for hand crafted cranberry pumpkin seed choose pack of 12", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "pack of 12" ] }, "asin": "B09H3CF2MW" }, { "task_id": "ws_B0951CJKB1_7399", "instruction": "i need some boots in a seven wide that have leather soles. the color should be \"i mocka.\"", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "l mocka", "7 wide" ] }, "asin": "B0951CJKB1" }, { "task_id": "ws_B075BLC569_7400", "instruction": "am looking for a long lasting chanel gabrielle women edp spray 1.7 oz", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B075BLC569" }, { "task_id": "ws_B08PKTDP5C_7401", "instruction": "looking for a gift for valentines day: custom funny face, comfortable fit kiss me boxer shorts novelty photo printed underwear. its size is 4x bigger.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "4x-large" ] }, "asin": "B08PKTDP5C" }, { "task_id": "ws_B094D7Y66B_7402", "instruction": "i am looking for chocolate filled flavor cookies having low sugar and low fat.", "target_attributes": { "attributes": [ "low sugar", "low fat" ], "options": [ "chocolate filled" ] }, "asin": "B094D7Y66B" }, { "task_id": "ws_B00NTT974E_7403", "instruction": "i am looking for a large size grey color light weight women's sleeveless pullover sweater with unique design.", "target_attributes": { "attributes": [ "light weight", "unique design" ], "options": [ "grey", "large" ] }, "asin": "B00NTT974E" }, { "task_id": "ws_B084Q246B2_7404", "instruction": "i need an engineered wood end table", "target_attributes": { "attributes": [ "engineered wood" ], "options": [] }, "asin": "B084Q246B2" }, { "task_id": "ws_B09PR67BMX_7405", "instruction": "i\u2019m looking for a mini dual band desktop computer that supports ultra hd and has at least 16 gigabytes of ram.", "target_attributes": { "attributes": [ "dual band", "ultra hd" ], "options": [] }, "asin": "B09PR67BMX" }, { "task_id": "ws_B095NN5K4W_7406", "instruction": "i would like a oversize 60 x 30 in color a wall posted to hang in the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "a", "oversize 60 x 30 in" ] }, "asin": "B095NN5K4W" }, { "task_id": "ws_B085VP8ZDB_7407", "instruction": "i am looking for men's slippers of size 8 that are long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "8" ] }, "asin": "B085VP8ZDB" }, { "task_id": "ws_B09S5QYF4P_7408", "instruction": "tv rack up to 55 inches living room white", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B09S5QYF4P" }, { "task_id": "ws_B09165NLQL_7409", "instruction": "im looking for hair clips and a hair pad for my hair extensions in the color dark brown.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark brown" ] }, "asin": "B09165NLQL" }, { "task_id": "ws_B011B6PHTA_7410", "instruction": "i need a pack of 12 easy to prepare noodle dishes", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "pack of 12" ] }, "asin": "B011B6PHTA" }, { "task_id": "ws_B011B6PHTA_7411", "instruction": "i want an easy to prepare knorr pasta butter and herb side dish.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "butter & herb" ] }, "asin": "B011B6PHTA" }, { "task_id": "ws_B00A6S31DO_7412", "instruction": "i would like a white twin size bed.", "target_attributes": { "attributes": [ "twin size", "white item" ], "options": [ "white" ] }, "asin": "B00A6S31DO" }, { "task_id": "ws_B07TTQNQRQ_7413", "instruction": "i would like a storage case for my dentures.", "target_attributes": { "attributes": [ "storage case" ], "options": [] }, "asin": "B07TTQNQRQ" }, { "task_id": "ws_B09MFB67P6_7414", "instruction": "i'm looking for hair extensions to prevention of hair falling its for hair care.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "183-t1b-30" ] }, "asin": "B09MFB67P6" }, { "task_id": "ws_B09DFN74Y7_7415", "instruction": "i'm looking for a super soft throw blanket with skulls on it that's fifty by forty inches.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "skull1", "50\"x40\"" ] }, "asin": "B09DFN74Y7" }, { "task_id": "ws_B09DFN74Y7_7416", "instruction": "i am looking for a black queen size blanket for kids.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "black" ] }, "asin": "B09DFN74Y7" }, { "task_id": "ws_B07PRZF5GM_7417", "instruction": "i need green tea pack 1", "target_attributes": { "attributes": [ "green tea" ], "options": [ "5 fl oz (pack of 1)" ] }, "asin": "B07PRZF5GM" }, { "task_id": "ws_B073RF8CKX_7418", "instruction": "i want a black soulaca smart tv with usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B073RF8CKX" }, { "task_id": "ws_B06XRT9TSM_7419", "instruction": "i want solid wood espresso color queen size bed from modus furniture", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "nevis veneto - espresso", "queen" ] }, "asin": "B06XRT9TSM" }, { "task_id": "ws_B08P34YR81_7420", "instruction": "i would like to buy an amplifier that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B08P34YR81" }, { "task_id": "ws_B09PVC53FP_7421", "instruction": "i'm looking for clothing quality and high waist for woman's.", "target_attributes": { "attributes": [ "fleece lined", "wide leg", "straight leg", "slim fit", "high waist", "tummy control" ], "options": [ "multicolor" ] }, "asin": "B09PVC53FP" }, { "task_id": "ws_B07H9HV2JQ_7422", "instruction": "i am looking for a cover that has a glass screen and is blue", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "blue | black" ] }, "asin": "B07H9HV2JQ" }, { "task_id": "ws_B09QQ9GSZY_7423", "instruction": "i am looking for an open toe sandals that has high heel. please choose the 8.5 size with white color", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "sandals 17 white", "8.5" ] }, "asin": "B09QQ9GSZY" }, { "task_id": "ws_B09SQ74NTW_7424", "instruction": "i am looking for a o color shampoos for hair losses", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "o" ] }, "asin": "B09SQ74NTW" }, { "task_id": "ws_B07MW2D7W3_7425", "instruction": "i'm looking for hair loss control drops that will help with hair growth.", "target_attributes": { "attributes": [ "hair loss", "hair growth" ], "options": [] }, "asin": "B07MW2D7W3" }, { "task_id": "ws_B08CR81GHW_7426", "instruction": "i am looking for a high definition sound bar that is camouflage.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "camouflage" ] }, "asin": "B08CR81GHW" }, { "task_id": "ws_B07WL7C1ZM_7427", "instruction": "i would love to buy a 12 count , low carb keto bars made with quality ingredients and keto friendly.", "target_attributes": { "attributes": [ "keto friendly", "low carb", "quality ingredients" ], "options": [ "12 count (pack of 1)" ] }, "asin": "B07WL7C1ZM" }, { "task_id": "ws_B07BMNFXRZ_7428", "instruction": "i am looking for 12 pcs bpa free plastic spray bottle of amber color", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "amber (12pcs)" ] }, "asin": "B07BMNFXRZ" }, { "task_id": "ws_B08T1RX4WS_7429", "instruction": "i am looking to buy a quick release, non slip, travel tripod stand and it has to be silver.", "target_attributes": { "attributes": [ "quick release", "non slip" ], "options": [ "silver" ] }, "asin": "B08T1RX4WS" }, { "task_id": "ws_B079FVQ9J9_7430", "instruction": "i need to buy a satin nickel finished vanity light that's thirty inches long.", "target_attributes": { "attributes": [ "nickel finish", "vanity light" ], "options": [ "satin nickel", "9 x 30\"" ] }, "asin": "B079FVQ9J9" }, { "task_id": "ws_B017610BG8_7431", "instruction": "i would like a paraben and sulfate free body wash.", "target_attributes": { "attributes": [ "sulfate free", "paraben free" ], "options": [] }, "asin": "B017610BG8" }, { "task_id": "ws_B009P2IUZQ_7432", "instruction": "i need a 1.43 ounce (pack of 12) soy free non gmo plant based gluten free original flavored chips.", "target_attributes": { "attributes": [ "non gmo", "soy free", "plant based", "gluten free" ], "options": [ "original", "1.43 ounce (pack of 12)" ] }, "asin": "B009P2IUZQ" }, { "task_id": "ws_B009P2IUZQ_7433", "instruction": "i am looking for dang toasted coconut chips with soy free, gluten free , non gmo and plant based with size 3.17 ounce", "target_attributes": { "attributes": [ "soy free", "plant based", "gluten free" ], "options": [ "3.17 ounce (pack of 1)" ] }, "asin": "B009P2IUZQ" }, { "task_id": "ws_B07KLSQGS2_7434", "instruction": "i'm interested in contemporary style barstools for the living room that are easy to clean and non-slip.", "target_attributes": { "attributes": [ "non slip", "easy clean", "contemporary style", "living room" ], "options": [ "black" ] }, "asin": "B07KLSQGS2" }, { "task_id": "ws_B08DDFM5GC_7435", "instruction": "i am looking for a low fat black bean soup", "target_attributes": { "attributes": [ "low fat" ], "options": [ "black bean soup" ] }, "asin": "B08DDFM5GC" }, { "task_id": "ws_B07N8R9WKN_7436", "instruction": "i am looking for brass color coffee table for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brass" ] }, "asin": "B07N8R9WKN" }, { "task_id": "ws_B07ZLV1F37_7437", "instruction": "i want kerastim pro hair loss treatment for men & women.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B07ZLV1F37" }, { "task_id": "ws_B07NH3Q1VJ_7438", "instruction": "i'm looking for a size 2.55 ounce anti aging hydra-nutrition day cream.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "2.55 ounce (pack of 1)" ] }, "asin": "B07NH3Q1VJ" }, { "task_id": "ws_B09P8B2L8V_7439", "instruction": "i am looking women hairpiece of 80cm size that are of high quality and easy to use.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [ "80cm" ] }, "asin": "B09P8B2L8V" }, { "task_id": "ws_B07BL31V9T_7440", "instruction": "i need to buy some work shoes with a slip resistant rubber sole. i want them in gray, size nine wide.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "gray | royal", "9 wide" ] }, "asin": "B07BL31V9T" }, { "task_id": "ws_B097XWJ1KM_7441", "instruction": "i need a super soft twin throw that is multicolored", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 15", "twin" ] }, "asin": "B097XWJ1KM" }, { "task_id": "ws_B09SGQZHP4_7442", "instruction": "i would like an intel core desktop that has 32gb of ram and 2tb of storage.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "32gb | 1tb ssd + 1tb hdd" ] }, "asin": "B09SGQZHP4" }, { "task_id": "ws_B07RGXDVCV_7443", "instruction": "i am interested in buying a demi-permanent hair color which is neon red, and that i can apply easily, also i want it to be cruelty free product.", "target_attributes": { "attributes": [ "easy apply", "cruelty free" ], "options": [ "neon red" ] }, "asin": "B07RGXDVCV" }, { "task_id": "ws_B09SQ5RK1H_7444", "instruction": "i would like a 6 pack of easy to prepare breakfast foods.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "6 - pack" ] }, "asin": "B09SQ5RK1H" }, { "task_id": "ws_B07WNVTV22_7445", "instruction": "i would like a a monocular for bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B07WNVTV22" }, { "task_id": "ws_B09FJT52MT_7446", "instruction": "i am looking for a fits round tables up to 42 diameter size of machine washable tablecloths", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "fits round tables up to 42 diameter" ] }, "asin": "B09FJT52MT" }, { "task_id": "ws_B01L0VIN8S_7447", "instruction": "i would like a aluminum alloy high speed coaxial tip.", "target_attributes": { "attributes": [ "high speed", "aluminum alloy" ], "options": [] }, "asin": "B01L0VIN8S" }, { "task_id": "ws_B09D9RXRPG_7448", "instruction": "i want the pinole project high protein oatmeal.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B09D9RXRPG" }, { "task_id": "ws_B083ZRCCXD_7449", "instruction": "i need a wall sconce with two lights in brushed nickel.", "target_attributes": { "attributes": [ "brushed nickel", "nickel finish" ], "options": [ "brushed nickel", "2-light" ] }, "asin": "B083ZRCCXD" }, { "task_id": "ws_B000UD3XJC_7450", "instruction": "i would like to buy a slip resistant women's clog having rubber sole in size 11.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "11" ] }, "asin": "B000UD3XJC" }, { "task_id": "ws_B078JHLSWT_7451", "instruction": "i need a blue body brush for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "blue" ] }, "asin": "B078JHLSWT" }, { "task_id": "ws_B07Z7DBGLZ_7452", "instruction": "i need a classic fit t-shirt . and i would prefer medium size with purple color", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "purple", "medium" ] }, "asin": "B07Z7DBGLZ" }, { "task_id": "ws_B07SBXXH9Y_7453", "instruction": "i want to buy an easy to use plug and play usb flash drive in black. get the 512 megabyte size.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "black", "512mb" ] }, "asin": "B07SBXXH9Y" }, { "task_id": "ws_B01GS1BOK4_7454", "instruction": "for home furnishing, i need a rectangular rug in ivory grey color, measuring 11ft x 15ft.", "target_attributes": { "attributes": [ "home furnishings" ], "options": [ "ivory | grey", "rectangular", "11 ft x 15 ft" ] }, "asin": "B01GS1BOK4" }, { "task_id": "ws_B09Q35XGYF_7455", "instruction": "i would like a white twin sized bunk bed with a wood frame.", "target_attributes": { "attributes": [ "twin size", "white item", "wood frame" ], "options": [ "white", "twin bunk beds" ] }, "asin": "B09Q35XGYF" }, { "task_id": "ws_B09J52HRL8_7456", "instruction": "i am looking for a high quality trolley cart for a beauty salon, which is in 4tier size.", "target_attributes": { "attributes": [ "high quality", "beauty salon" ], "options": [ "4tier" ] }, "asin": "B09J52HRL8" }, { "task_id": "ws_B07X1YS8D7_7457", "instruction": "looking for long lasting string curtain window choose colour yellow", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "yellow" ] }, "asin": "B07X1YS8D7" }, { "task_id": "ws_B09LTSRLBX_7458", "instruction": "i need 2 pieces anti aging ice face roller gua sha", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B09LTSRLBX" }, { "task_id": "ws_B08XZ7N4NL_7459", "instruction": "i would like some eco friendly nail cleaning brushes.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [] }, "asin": "B08XZ7N4NL" }, { "task_id": "ws_B09HZYGRM9_7460", "instruction": "i'm looking for a digital power amplifier board that's high performance and has stereo sound.", "target_attributes": { "attributes": [ "power amplifier", "high performance", "stereo sound" ], "options": [] }, "asin": "B09HZYGRM9" }, { "task_id": "ws_B0918MVYBC_7461", "instruction": "i'm looking for a mini pc intel core desktop computer which supports with windows 11.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "i5-10210u 16gb ddr4 +512g nvme ssd+wifi6" ] }, "asin": "B0918MVYBC" }, { "task_id": "ws_B09MLY7B9D_7462", "instruction": "i would like a pair of small purple jogging pants that are for the gym.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "purple", "small" ] }, "asin": "B09MLY7B9D" }, { "task_id": "ws_B09JSWXSBZ_7463", "instruction": "i would like a living room poster that is 16 by 20 inches", "target_attributes": { "attributes": [ "living room" ], "options": [ "16x20 inch" ] }, "asin": "B09JSWXSBZ" }, { "task_id": "ws_B075G3RJDZ_7464", "instruction": "i want lubriderm fragrance free body lotion for dry skin", "target_attributes": { "attributes": [ "fragrance free", "dry skin" ], "options": [] }, "asin": "B075G3RJDZ" }, { "task_id": "ws_B09MNHMGJK_7465", "instruction": "i need a pink dust-proof cover for my fire stick tv remote.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "pink" ] }, "asin": "B09MNHMGJK" }, { "task_id": "ws_B09PPF15NX_7466", "instruction": "i would like a high speed wireless charging station for my iphone.", "target_attributes": { "attributes": [ "compatible apple", "high speed", "wireless charging" ], "options": [] }, "asin": "B09PPF15NX" }, { "task_id": "ws_B0873WY5YG_7467", "instruction": "i would like a sky blue 12 inch throw pillow for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "sky blue", "12 inch (pack of 1)" ] }, "asin": "B0873WY5YG" }, { "task_id": "ws_B09NNV93GR_7468", "instruction": "i am looking for a body brush for dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "blue" ] }, "asin": "B09NNV93GR" }, { "task_id": "ws_B07D7N4QB8_7469", "instruction": "i would like to buy a white colored easy to assemble book case for my living room.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B07D7N4QB8" }, { "task_id": "ws_B09NX3SMLB_7470", "instruction": "i'm looking for computer accessories its easy to use it can install at any", "target_attributes": { "attributes": [ "dual band", "high definition" ], "options": [] }, "asin": "B09NX3SMLB" }, { "task_id": "ws_B09RHVVMJM_7471", "instruction": "i'm looking for groceries for great gift and gift basket.", "target_attributes": { "attributes": [ "great gift", "gift basket" ], "options": [] }, "asin": "B09RHVVMJM" }, { "task_id": "ws_B0888H96Q8_7472", "instruction": "i would like a slim fit black tank that is in a medium", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "e-black", "medium" ] }, "asin": "B0888H96Q8" }, { "task_id": "ws_B081FWD6Q3_7473", "instruction": "i need some vanity lights that are brushed nickel", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "brushed nickel" ] }, "asin": "B081FWD6Q3" }, { "task_id": "ws_B09PFGVTGM_7474", "instruction": "order for me a black marvel men\u2019s t shirt that is made of cotton heather.", "target_attributes": { "attributes": [ "cotton heather" ], "options": [ "black", "men" ] }, "asin": "B09PFGVTGM" }, { "task_id": "ws_B09QC7GZZC_7475", "instruction": "i am looking for pink color electric tooth brush which is easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B09QC7GZZC" }, { "task_id": "ws_B09LHKTXH2_7476", "instruction": "i am looking for a 47 piece farm animal cake topper set for a birthday cake, we are having a birthday party.", "target_attributes": { "attributes": [ "birthday cake", "party supplies", "birthday party" ], "options": [] }, "asin": "B09LHKTXH2" }, { "task_id": "ws_B06VSXQXPX_7477", "instruction": "i would like a blue mk desk and chair that is height adjustable.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "blue desk only", "mk desk + chair" ] }, "asin": "B06VSXQXPX" }, { "task_id": "ws_B08HJ9X29W_7478", "instruction": "i want a twin size box spring bed for kids color black", "target_attributes": { "attributes": [ "twin size", "box spring" ], "options": [ "black" ] }, "asin": "B08HJ9X29W" }, { "task_id": "ws_B09KQ6TQY5_7479", "instruction": "i want plant based gluten free protein serving burgers & patties size ;5- pack", "target_attributes": { "attributes": [ "plant based", "protein serving", "gluten free" ], "options": [ "5 - pack" ] }, "asin": "B09KQ6TQY5" }, { "task_id": "ws_B08VND52S2_7480", "instruction": "i would like a floor lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B08VND52S2" }, { "task_id": "ws_B08BJVJG1S_7481", "instruction": "i'm looking for men hair removal cream.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B08BJVJG1S" }, { "task_id": "ws_B0945BPCZL_7482", "instruction": "i am looking for variety pack sparkling water that is soy and gluten free.", "target_attributes": { "attributes": [ "soy free", "gluten free" ], "options": [ "variety pack" ] }, "asin": "B0945BPCZL" }, { "task_id": "ws_B08F5MXVYL_7483", "instruction": "i need to buy a sky blue fire tablet for a child. it should have a 1080p screen and a blue tooth keyboard.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "sky blue", "with kids bluetooth keyboard" ] }, "asin": "B08F5MXVYL" }, { "task_id": "ws_B09NNXGRHX_7484", "instruction": "i would like a medium sized black women's top with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z91-black", "medium" ] }, "asin": "B09NNXGRHX" }, { "task_id": "ws_B08P7MN5VS_7485", "instruction": "i am looking for an easy to assemble bunk bed full over twin trundle would like gray in color.", "target_attributes": { "attributes": [ "easy assemble", "solid wood" ], "options": [ "twin with headboard trundle" ] }, "asin": "B08P7MN5VS" }, { "task_id": "ws_B07VL8Z6V9_7486", "instruction": "i'm looking for a pendant light with brushed nickel finish. choose the ones in antique gold color.", "target_attributes": { "attributes": [ "pendant light", "nickel finish", "brushed nickel" ], "options": [ "antique gold" ] }, "asin": "B07VL8Z6V9" }, { "task_id": "ws_B09GJZZDQP_7487", "instruction": "i want silver and noise cancelling earbuds.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "white-silver" ] }, "asin": "B09GJZZDQP" }, { "task_id": "ws_B0932PMPM2_7488", "instruction": "i need four mid century green chairs", "target_attributes": { "attributes": [ "mid century" ], "options": [ "26\" green", "4 chairs" ] }, "asin": "B0932PMPM2" }, { "task_id": "ws_B00WR97BC2_7489", "instruction": "i would like a yellow 6\" around area rug that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "yellow", "6' round" ] }, "asin": "B00WR97BC2" }, { "task_id": "ws_B08HGQ484X_7490", "instruction": "i am looking for steel frame night stand with white finish", "target_attributes": { "attributes": [ "steel frame", "white finish" ], "options": [ "white | gray" ] }, "asin": "B08HGQ484X" }, { "task_id": "ws_B08JCFL127_7491", "instruction": "i would like a cookies gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "cookies, vanilla halva,cream crackers, orino sesame pasteli" ] }, "asin": "B08JCFL127" }, { "task_id": "ws_B0837SDRNN_7492", "instruction": "i need an easy to assemble coat rack.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B0837SDRNN" }, { "task_id": "ws_B09J53L7VT_7493", "instruction": "i would like a 9 card slots zipper dark green phone flip case cover.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "9 card slots zipper dark green" ] }, "asin": "B09J53L7VT" }, { "task_id": "ws_B0999KX9M6_7494", "instruction": "can i get an open toe eduavar flat casual sandals for women, size 6.5-7", "target_attributes": { "attributes": [ "open toe" ], "options": [ "6.5-7" ] }, "asin": "B0999KX9M6" }, { "task_id": "ws_B01FUI7H4I_7495", "instruction": "i would like a 400 lb bulk bag of certified organic gluten free oatmeal.", "target_attributes": { "attributes": [ "gluten free", "certified organic" ], "options": [ "400 ounce (pack of 1)", "bulk bag" ] }, "asin": "B01FUI7H4I" }, { "task_id": "ws_B00LX0HPV8_7496", "instruction": "i am looking for long sleeve shirt in smoke grey", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "smoke grey" ] }, "asin": "B00LX0HPV8" }, { "task_id": "ws_B09H7D62DM_7497", "instruction": "i am looking for a fully cooked chicken & turkey", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B09H7D62DM" }, { "task_id": "ws_B07TL67TQ7_7498", "instruction": "i am looking for an olive machine washable t shirt for youth that is in a xx-large", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "olive", "youth", "xx-large" ] }, "asin": "B07TL67TQ7" }, { "task_id": "ws_B08CV5HKHD_7499", "instruction": "i need a black tank top that is classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black" ] }, "asin": "B08CV5HKHD" }, { "task_id": "ws_B08V1J8S36_7500", "instruction": "i'm looking for a small straight leg women athletic yoga shorts.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "small" ] }, "asin": "B08V1J8S36" }, { "task_id": "ws_B07C9HG46D_7501", "instruction": "i'm looking for high heels shoes for women men it is easy to wear.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "navy suede" ] }, "asin": "B07C9HG46D" }, { "task_id": "ws_B00I47QQ9U_7502", "instruction": "i am looking for a citron scent deodorant that is non toxic and cruelty free.", "target_attributes": { "attributes": [ "non toxic", "cruelty free" ], "options": [ "citron" ] }, "asin": "B00I47QQ9U" }, { "task_id": "ws_B081TX8J78_7503", "instruction": "i need my large dress by machine wash", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "large" ] }, "asin": "B081TX8J78" }, { "task_id": "ws_B0842NKZ44_7504", "instruction": "i need a heavy duty, height adjustable office chair in pink color", "target_attributes": { "attributes": [ "height adjustable", "heavy duty" ], "options": [ "pink" ] }, "asin": "B0842NKZ44" }, { "task_id": "ws_B09LH2827W_7505", "instruction": "i want a easy install roller sades window tretment size w45*h56 in color pastel blue", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "07.pastel_blue", "w45 x h56 (inch)" ] }, "asin": "B09LH2827W" }, { "task_id": "ws_B07L6Y8C6Q_7506", "instruction": "i would like a forest green wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "forest green" ] }, "asin": "B07L6Y8C6Q" }, { "task_id": "ws_B07RTJ5ZLR_7507", "instruction": "i would like a 24 inch black barstool that is fully assembled.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "black", "24 inch" ] }, "asin": "B07RTJ5ZLR" }, { "task_id": "ws_B01CQD0DC8_7508", "instruction": "i would like a high performance label printer.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B01CQD0DC8" }, { "task_id": "ws_B07NXW1VQP_7509", "instruction": "get me a machine washable men's classic fit star wars t-shirt in medium size and royal blue color.", "target_attributes": { "attributes": [ "machine wash", "classic fit", "star wars" ], "options": [ "royal blue", "men", "medium" ] }, "asin": "B07NXW1VQP" }, { "task_id": "ws_B003Q4TPAI_7510", "instruction": "i'm looking for usda organic and gluten free chai tea that is caffeine and sugar free and also has natural ingredients. it also should be matcha latte flavor.", "target_attributes": { "attributes": [ "caffeine free", "usda organic", "sugar free", "gluten free", "natural ingredients" ], "options": [ "matcha latte", "20 count (pack of 6)" ] }, "asin": "B003Q4TPAI" }, { "task_id": "ws_B00RWV58J8_7511", "instruction": "look for butter pasta noodles with no artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "butter pasta" ] }, "asin": "B00RWV58J8" }, { "task_id": "ws_B00RWV58J8_7512", "instruction": "i am looking for an easy to prepare thai sweet chili lo mein flavored pasta.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "thai sweet chili lo mein" ] }, "asin": "B00RWV58J8" }, { "task_id": "ws_B00RWV58J8_7513", "instruction": "i am looking for knorr pasta sides cheddar broccoli that is easy to prepare and in a 12 pack of the butter and herb flavor.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "butter & herb" ] }, "asin": "B00RWV58J8" }, { "task_id": "ws_B084DF85Q2_7514", "instruction": "i need some perfume that is long lasting and smells like a rainy day", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "rain day" ] }, "asin": "B084DF85Q2" }, { "task_id": "ws_B07FZYHJGT_7515", "instruction": "i am looking for snow boots rubber sole in 6-blue", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "6-blue" ] }, "asin": "B07FZYHJGT" }, { "task_id": "ws_B07Z8QGSHR_7516", "instruction": "i'm looking for a womens large lightweight jacket that has soft material and faux fur it should also be red plaid colored.", "target_attributes": { "attributes": [ "soft material", "faux fur" ], "options": [ "p-red plaid", "large" ] }, "asin": "B07Z8QGSHR" }, { "task_id": "ws_B081MCMXSN_7517", "instruction": "i am looking for a new balance men's sneaker for daily comfort.", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "18 wide" ] }, "asin": "B081MCMXSN" }, { "task_id": "ws_B07RZP1S1R_7518", "instruction": "i'm looking for a royal blue star wars t-shirt in a youth size double x large. it needs to be machine washable.", "target_attributes": { "attributes": [ "machine wash", "star wars" ], "options": [ "royal blue", "youth", "xx-large" ] }, "asin": "B07RZP1S1R" }, { "task_id": "ws_B07P2YQDS3_7519", "instruction": "i am looking for 450 mocha color face makeup that is oil free.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "450 mocha" ] }, "asin": "B07P2YQDS3" }, { "task_id": "ws_B09M6NL5F7_7520", "instruction": "i would like a pair of wireless bluetooth earbud headphones.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09M6NL5F7" }, { "task_id": "ws_B07MV5B2XB_7521", "instruction": "i need a single light brown hair inch extension that's twenty inches long and made from synthetic fibers.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "light golden brown", "20 inch (pack of 1)" ] }, "asin": "B07MV5B2XB" }, { "task_id": "ws_B07MV5B2XB_7522", "instruction": "i would like a 18 inch wig that is made of natural blonde synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "natural blonde", "18 inch (pack of 1)" ] }, "asin": "B07MV5B2XB" }, { "task_id": "ws_B096NGXFM5_7523", "instruction": "i am looking for vintage style pendant light for a living room", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [ "a style" ] }, "asin": "B096NGXFM5" }, { "task_id": "ws_B0792QVCH8_7524", "instruction": "i'm looking for some antiperspirant for sensitive skin.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [] }, "asin": "B0792QVCH8" }, { "task_id": "ws_B095YJJ79K_7525", "instruction": "i am looking for some grey anti slip flats that are 8.5 in size.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "7006-211 grey flats", "8.5" ] }, "asin": "B095YJJ79K" }, { "task_id": "ws_B085NW4CKC_7526", "instruction": "looking for heavy duty wooden frame barstools also choose colour brown", "target_attributes": { "attributes": [ "heavy duty", "wood frame" ], "options": [ "brown" ] }, "asin": "B085NW4CKC" }, { "task_id": "ws_B000GW67G8_7527", "instruction": "i need to buy some fat free jerky. make it sweet & hot.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "sweet & hot" ] }, "asin": "B000GW67G8" }, { "task_id": "ws_B09BJL1232_7528", "instruction": "i would like a black heavy duty hair cutting kit.", "target_attributes": { "attributes": [ "heavy duty", "hair cutting" ], "options": [ "black" ] }, "asin": "B09BJL1232" }, { "task_id": "ws_B078Z6T13T_7529", "instruction": "i am looking for a cargo pant made up of polyester cotton which is washable in machine. also choose coyote brown color and 36w x 32l size.", "target_attributes": { "attributes": [ "machine wash", "polyester cotton" ], "options": [ "coyote brown", "36w x 32l" ] }, "asin": "B078Z6T13T" }, { "task_id": "ws_B094ZQ4WXZ_7530", "instruction": "i need some easy to install cellular shades that have beige-light filtering and are a size 61\"w by 72\"h", "target_attributes": { "attributes": [ "easy install" ], "options": [ "beige-light filtering", "61\"w x 72\"h" ] }, "asin": "B094ZQ4WXZ" }, { "task_id": "ws_B07T8PZWQT_7531", "instruction": "i need some size ten and a half clogs with arch support and a rubber sole. find them in black.", "target_attributes": { "attributes": [ "arch support", "rubber sole" ], "options": [ "black", "10.5" ] }, "asin": "B07T8PZWQT" }, { "task_id": "ws_B073SYSBTG_7532", "instruction": "i am looking for petrol blue. coastal themed drapes that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "petrol blue" ] }, "asin": "B073SYSBTG" }, { "task_id": "ws_B07PXNPMVL_7533", "instruction": "i'm looking for nickel finish is for ceiling fan its living room.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "gold" ] }, "asin": "B07PXNPMVL" }, { "task_id": "ws_B07MF241KR_7534", "instruction": "i'm looking for low rise in skinny leg in women's", "target_attributes": { "attributes": [ "low rise" ], "options": [ "exgm set sail" ] }, "asin": "B07MF241KR" }, { "task_id": "ws_B0828QN4TX_7535", "instruction": "im looking for a synthetic hair ponytail extension in the color ginger brown.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "ginger brown" ] }, "asin": "B0828QN4TX" }, { "task_id": "ws_B09984L72W_7536", "instruction": "i would like two lights gold wall mounted vanity light.", "target_attributes": { "attributes": [ "wall mounted", "vanity light" ], "options": [ "2 lights gold" ] }, "asin": "B09984L72W" }, { "task_id": "ws_B078PL897H_7537", "instruction": "i need a box spring california king mattress", "target_attributes": { "attributes": [ "box spring" ], "options": [ "california king" ] }, "asin": "B078PL897H" }, { "task_id": "ws_B01JAXJ5DA_7538", "instruction": "i need to buy some moisturizer that's good for fine lines and has anti-aging properties. find some that's paraben free and cruelty free. it should contain natural ingredients.", "target_attributes": { "attributes": [ "anti aging", "paraben free", "cruelty free", "natural ingredients", "fine lines" ], "options": [] }, "asin": "B01JAXJ5DA" }, { "task_id": "ws_B08Y79GX45_7539", "instruction": "i'm looking for a night fishing wall art picasso for living room in size 31\"x24\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "night fishing", "31\"w x 24\"h" ] }, "asin": "B08Y79GX45" }, { "task_id": "ws_B08Y79GX45_7540", "instruction": "i would like a 47\"w x 31\"h joie de vivre poster for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "joie-de-vivre", "47\"w x 31\"h" ] }, "asin": "B08Y79GX45" }, { "task_id": "ws_B07V5J4494_7541", "instruction": "i am looking for hd quad core 10.1\" android tablet with 16gb storage capacity and alexa enabled charging dock", "target_attributes": { "attributes": [ "quad core" ], "options": [ "2gb | 16gb" ] }, "asin": "B07V5J4494" }, { "task_id": "ws_B093KPKTBG_7542", "instruction": "i want a set of 2 mesh laundry bags with day of the dead skull designs.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KPKTBG" }, { "task_id": "ws_B09HXCP5GT_7543", "instruction": "i'm looking for vanity light for laundry room.", "target_attributes": { "attributes": [ "glass shade", "vanity light", "light fixture" ], "options": [ "5 lights" ] }, "asin": "B09HXCP5GT" }, { "task_id": "ws_B08DGRFVPH_7544", "instruction": "i need a space saving white full sized bed", "target_attributes": { "attributes": [ "space saving" ], "options": [ "white", "full" ] }, "asin": "B08DGRFVPH" }, { "task_id": "ws_B07RQW3PTY_7545", "instruction": "i'm looking for an officially licensed captain marvel tank top in heather grey. i need a size medium.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "heather grey", "women", "medium" ] }, "asin": "B07RQW3PTY" }, { "task_id": "ws_B093CVDS6G_7546", "instruction": "i'm looking for a chair for hair salons in color b.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "b" ] }, "asin": "B093CVDS6G" }, { "task_id": "ws_B08863WYVL_7547", "instruction": "i'm looking for a pair of knee high rubber soled boots in coffee colored microfiber. i need them in a size six.", "target_attributes": { "attributes": [ "knee high", "rubber sole" ], "options": [ "coffee pu_microfiber", "6" ] }, "asin": "B08863WYVL" }, { "task_id": "ws_B002SVNCJK_7548", "instruction": "i am looking for two pack size shampoo that are good for my hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "two pack" ] }, "asin": "B002SVNCJK" }, { "task_id": "ws_B0828D3MMZ_7549", "instruction": "i'm looking for a organizer for aaa batteries", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B0828D3MMZ" }, { "task_id": "ws_B09JV9NH3M_7550", "instruction": "i am looking for white cheddar flavor cheese powder that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "white cheddar" ] }, "asin": "B09JV9NH3M" }, { "task_id": "ws_B09SLFSY95_7551", "instruction": "i would like a high quality shower cap.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09SLFSY95" }, { "task_id": "ws_B09JL35FSR_7552", "instruction": "i need a high quality storage case compatible for my infinitipro. please select the extra small oval brush", "target_attributes": { "attributes": [ "high quality", "storage case" ], "options": [] }, "asin": "B09JL35FSR" }, { "task_id": "ws_B01FGG0BRO_7553", "instruction": "i'm looking for kitchen rugs for kitchen its very clean and contemporary design.", "target_attributes": { "attributes": [ "easy clean", "contemporary design" ], "options": [ "purple | beige" ] }, "asin": "B01FGG0BRO" }, { "task_id": "ws_B08134QHQS_7554", "instruction": "i would like a hair cutting kit with stainless steel sheers.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B08134QHQS" }, { "task_id": "ws_B09JCM6HP8_7555", "instruction": "find me a knee high anti slip open toe ankle booties in black color and size 6.5.", "target_attributes": { "attributes": [ "knee high", "anti slip", "open toe" ], "options": [ "black", "6.5" ] }, "asin": "B09JCM6HP8" }, { "task_id": "ws_B09FFV4CQJ_7556", "instruction": "i looking for 8 oz resealable bag in 4 oz", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "4 oz" ] }, "asin": "B09FFV4CQJ" }, { "task_id": "ws_B0798LFCHQ_7557", "instruction": "i am looking for gmo free peanut butter.size should be 2.65 ounce and pack of 48.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "2.65 ounce (pack of 48)" ] }, "asin": "B0798LFCHQ" }, { "task_id": "ws_B09RMVQC2S_7558", "instruction": "i would like a s blue toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "blue", "s" ] }, "asin": "B09RMVQC2S" }, { "task_id": "ws_B07ZW2WP2S_7559", "instruction": "i am looking for fluoride free toothpaste that is made with coconut oil", "target_attributes": { "attributes": [ "fluoride free", "coconut oil" ], "options": [] }, "asin": "B07ZW2WP2S" }, { "task_id": "ws_B08S7KZVFX_7560", "instruction": "i would like a 16 ounce ultra gold sugar free energy drink,", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "ultra gold", "16 ounce (pack of 24)" ] }, "asin": "B08S7KZVFX" }, { "task_id": "ws_B00LYD49OU_7561", "instruction": "i am looking for chocolate covered cakes of size 1 pound.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "1 pound" ] }, "asin": "B00LYD49OU" }, { "task_id": "ws_B07ZWJP934_7562", "instruction": "i'm looking for some sulfate free, paraben free conditioner with argan oil for dry hair.", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "argan oil", "dry hair" ], "options": [] }, "asin": "B07ZWJP934" }, { "task_id": "ws_B09CM83LD6_7563", "instruction": "i'm looking for a two in one multifunctional led wall lamp.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "black-1pcs" ] }, "asin": "B09CM83LD6" }, { "task_id": "ws_B07YBGFM6S_7564", "instruction": "fully cooked shredded chicken taco kit", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B07YBGFM6S" }, { "task_id": "ws_B08ZCMJ9J1_7565", "instruction": "i am looking for a plant based lip balm that is effective for dry lips", "target_attributes": { "attributes": [ "plant based" ], "options": [ "04 sunset garden (tinted)" ] }, "asin": "B08ZCMJ9J1" }, { "task_id": "ws_B08FT5KP1M_7566", "instruction": "i am looking for signal antenna booster stickers that are easy to carry and install.", "target_attributes": { "attributes": [ "easy carry", "easy install" ], "options": [] }, "asin": "B08FT5KP1M" }, { "task_id": "ws_B00L1ISK48_7567", "instruction": "i am looking for brushed nickel in amber", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "amber | brushed nickel" ] }, "asin": "B00L1ISK48" }, { "task_id": "ws_B09CKX151Z_7568", "instruction": "i'm looking for something that is easily cleaned.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09CKX151Z" }, { "task_id": "ws_B08H5SPHMQ_7569", "instruction": "i want a tea tree conditioner that is sulfate and paraben free. pick a pack of 2 containing 6 ounce.", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "tea tree" ], "options": [ "6 ounce (pack of 2)" ] }, "asin": "B08H5SPHMQ" }, { "task_id": "ws_B081W1D8H7_7570", "instruction": "i'm looking for a pack of high quality hair extensions that are 20 inches long. can you pick the silver one.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "#1b | silver | 1b", "20 inch (pack of 1)" ] }, "asin": "B081W1D8H7" }, { "task_id": "ws_B00CQ7ZAK0_7571", "instruction": "i would like a conditioner that is made with all natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B00CQ7ZAK0" }, { "task_id": "ws_B09FJFHRYF_7572", "instruction": "i would like a gray toiletry bag that is water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "gray" ] }, "asin": "B09FJFHRYF" }, { "task_id": "ws_B0754DL6N6_7573", "instruction": "i'm looking for a size 30\" x 20\" king size pillow case.", "target_attributes": { "attributes": [ "king size" ], "options": [ "30\" x 20\"" ] }, "asin": "B0754DL6N6" }, { "task_id": "ws_B08Q256HCX_7574", "instruction": "look for a 120 count box of denture cleaning tablets that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "120 count (pack of 1)" ] }, "asin": "B08Q256HCX" }, { "task_id": "ws_B07PH1WPZ7_7575", "instruction": "i am looking for brown color medium size star wars men's t-shirt. the cloth must be classic fit and needle sleeve.", "target_attributes": { "attributes": [ "needle sleeve", "classic fit", "star wars" ], "options": [ "brown", "men", "medium" ] }, "asin": "B07PH1WPZ7" }, { "task_id": "ws_B08PB2MNHY_7576", "instruction": "i am searching for a gold color smart watch bands compatible for apple and any one of the sizes 38mm | 40mm | 41mm", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "black red gold", "38mm | 40mm | 41mm-l" ] }, "asin": "B08PB2MNHY" }, { "task_id": "ws_B09NMR2494_7577", "instruction": "i'm looking for a gift basket of cookies which i believe will be a perfect gift for my wife.", "target_attributes": { "attributes": [ "perfect gift", "gift basket" ], "options": [] }, "asin": "B09NMR2494" }, { "task_id": "ws_B0841QLKFN_7578", "instruction": "i would like a women's vesper perfume in a travel size bottle.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "vesper \u2640\u2642", "women" ] }, "asin": "B0841QLKFN" }, { "task_id": "ws_B092MKGSW3_7579", "instruction": "i'm looking for a size 7 non slip hedgehog running shoes", "target_attributes": { "attributes": [ "non slip" ], "options": [ "anime 05b", "7" ] }, "asin": "B092MKGSW3" }, { "task_id": "ws_B09T3BRHBY_7580", "instruction": "i want a stainless steel ronyme camera tripod screw.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09T3BRHBY" }, { "task_id": "ws_B07ZYSXHX4_7581", "instruction": "i'm looking for a pair of size six high heels with a rubber sole. look for them in black.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "black-standard pump", "6" ] }, "asin": "B07ZYSXHX4" }, { "task_id": "ws_B083FK5F3G_7582", "instruction": "i would like a deepgold automobile charger that is fast wireless charging.", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [ "deepgold" ] }, "asin": "B083FK5F3G" }, { "task_id": "ws_B00AXJA2V0_7583", "instruction": "i will love to have the fragrance free almay smart shade mousse makeup with deep color.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "deep" ] }, "asin": "B00AXJA2V0" }, { "task_id": "ws_B08PTRVDB5_7584", "instruction": "i want a easy to use soundbar with stereo sound.", "target_attributes": { "attributes": [ "easy use", "stereo sound" ], "options": [] }, "asin": "B08PTRVDB5" }, { "task_id": "ws_B09BYSRP2V_7585", "instruction": "i need to buy a chair for my living room with a solid wood frame and lumbar support. it should have brown fabric.", "target_attributes": { "attributes": [ "lumbar support", "wood frame", "solid wood", "living room" ], "options": [ "cognac brown", "fabric" ] }, "asin": "B09BYSRP2V" }, { "task_id": "ws_B08BND9C5J_7586", "instruction": "i am looking for pink running shoes that have a rubber sole and are in a size 14", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "oxygen blue | pink", "14" ] }, "asin": "B08BND9C5J" }, { "task_id": "ws_B08JJWK856_7587", "instruction": "i am looking for an antioxidant mix of mixed nuts that are non gmo and come in a pack of 15.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "antioxidant mix", "1 ounce (pack of 15)" ] }, "asin": "B08JJWK856" }, { "task_id": "ws_B08JJWK856_7588", "instruction": "i am looking for some gluten free honey roasted mixed nuts.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "honey roasted mixed nuts" ] }, "asin": "B08JJWK856" }, { "task_id": "ws_B08CGXY2XQ_7589", "instruction": "i am looking for a high definition tempered glass screen protector.", "target_attributes": { "attributes": [ "high definition", "tempered glass" ], "options": [] }, "asin": "B08CGXY2XQ" }, { "task_id": "ws_B07KW3HQLX_7590", "instruction": "i am looking for brown color classic fit t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "brown" ] }, "asin": "B07KW3HQLX" }, { "task_id": "ws_B0854DBKRB_7591", "instruction": "i am looking for women's golf skorts of medium size with elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "medium" ] }, "asin": "B0854DBKRB" }, { "task_id": "ws_B09NNM44JW_7592", "instruction": "get me leak proof and easy to carry pump dispenser bottle for nail polish and make up removing.", "target_attributes": { "attributes": [ "leak proof", "easy carry", "nail polish" ], "options": [] }, "asin": "B09NNM44JW" }, { "task_id": "ws_B00RM5NPAS_7593", "instruction": "i am looking for some gluten free yellow dog sweet shake flavored gourmet spice blends.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "yellow dog sweet shake" ] }, "asin": "B00RM5NPAS" }, { "task_id": "ws_B00RM5NPAS_7594", "instruction": "gluten-free spice seasonings", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B00RM5NPAS" }, { "task_id": "ws_B00RM5NPAS_7595", "instruction": "i'm looking for gourmet spice blends and shake.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "3.5 ounce (pack of 1)" ] }, "asin": "B00RM5NPAS" }, { "task_id": "ws_B084RRBLJ2_7596", "instruction": "i am looking for a argan oil hair color. also choose chrome - 3oz one.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "chrome - 3oz" ] }, "asin": "B084RRBLJ2" }, { "task_id": "ws_B09P2R22LF_7597", "instruction": "i am looking for high quality hair care center to exten my hair without hair loss. hair extensions must be body wave and 5x5 lace closure .", "target_attributes": { "attributes": [ "high quality", "hair loss" ], "options": [ "body wave 5x5 lace closure" ] }, "asin": "B09P2R22LF" }, { "task_id": "ws_B09P2R22LF_7598", "instruction": "i need some high quality 12 inch extensions", "target_attributes": { "attributes": [ "high quality" ], "options": [ "12 inch" ] }, "asin": "B09P2R22LF" }, { "task_id": "ws_B09P2R22LF_7599", "instruction": "i need to buy high quality hair extensions. look for them in the pineapple color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pineapple deep wave" ] }, "asin": "B09P2R22LF" }, { "task_id": "ws_B00KSMJZD8_7600", "instruction": "i am looking for outdoor speakers of 300w and with powerful bass.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B00KSMJZD8" }, { "task_id": "ws_B081SGNY71_7601", "instruction": "i need fluoide free toothpaste for fresh breath.", "target_attributes": { "attributes": [ "fluoride free", "fresh breath" ], "options": [] }, "asin": "B081SGNY71" }, { "task_id": "ws_B07H6V8Q75_7602", "instruction": "i would like a 2xl navy grey shirt i can wash in a machine.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy grey", "xx-large" ] }, "asin": "B07H6V8Q75" }, { "task_id": "ws_B01MG9KT77_7603", "instruction": "i need 18 inch hair extensions", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "18 inch" ] }, "asin": "B01MG9KT77" }, { "task_id": "ws_B09MTYXSBM_7604", "instruction": "i am in need of some high quality toothbrushes that are blue for ages 2-6", "target_attributes": { "attributes": [ "high quality" ], "options": [ "blue", "aged 2-6" ] }, "asin": "B09MTYXSBM" }, { "task_id": "ws_B097JLBD2M_7605", "instruction": "i am looking for 8 cupcake toppers that are black for teen girls", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "z-bo-black", "8" ] }, "asin": "B097JLBD2M" }, { "task_id": "ws_B09GV5Y88D_7606", "instruction": "i need some high quality stainless steel hair cutting shears that are six inches long.", "target_attributes": { "attributes": [ "high quality", "stainless steel", "hair cutting" ], "options": [ "6inch cutting" ] }, "asin": "B09GV5Y88D" }, { "task_id": "ws_B08DQX3HXF_7607", "instruction": "i am looking to buy a black throw blanket that is 80 in x 60 in for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black11", "80 in x 60 in" ] }, "asin": "B08DQX3HXF" }, { "task_id": "ws_B099LLV3WN_7608", "instruction": "where can i find this special sauce? please help me .keto barbecue bbq sauce by yo mama's foods. carefully read all the features i need on the label. low carb, low sugar, gluten free, non gmo, classic pizza sauce flavor. if you can't find it let me know soon.", "target_attributes": { "attributes": [ "low carb", "low sugar", "gluten free", "non gmo" ], "options": [ "classic pizza sauce" ] }, "asin": "B099LLV3WN" }, { "task_id": "ws_B00WJY5QA4_7609", "instruction": "i need a remote control with aaa betteries", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B00WJY5QA4" }, { "task_id": "ws_B07MTMZC83_7610", "instruction": "i would like a tan faux leather armchair.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "tan", "armchair" ] }, "asin": "B07MTMZC83" }, { "task_id": "ws_B093FVJ8Z6_7611", "instruction": "i am looking for a dome cameras batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B093FVJ8Z6" }, { "task_id": "ws_B08T1VSSL5_7612", "instruction": "i need a purple tie-dyed dresser with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "tie-dye purple" ] }, "asin": "B08T1VSSL5" }, { "task_id": "ws_B07CZ7BGGT_7613", "instruction": "i'm looking for perfect men's trail running.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "7.5 m uk" ] }, "asin": "B07CZ7BGGT" }, { "task_id": "ws_B095YYL9GJ_7614", "instruction": "i would like a blue cupcake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "blue" ] }, "asin": "B095YYL9GJ" }, { "task_id": "ws_B08HH7VTSL_7615", "instruction": "add to my cart polo red men by ralph lauren edt spray and should have a long lasting scent.", "target_attributes": { "attributes": [ "design house", "long lasting" ], "options": [] }, "asin": "B08HH7VTSL" }, { "task_id": "ws_B09LR9LHPG_7616", "instruction": "i am looking for a sulfate free shampoo set that is 13.5 fl oz", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "13.5 fl oz" ] }, "asin": "B09LR9LHPG" }, { "task_id": "ws_B00FHXH5LC_7617", "instruction": "i'm looking for an easy to clean coffee table for my living room. i want one that's in a modern style with natural wood.", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "natural", "modern" ] }, "asin": "B00FHXH5LC" }, { "task_id": "ws_B09SXQJ94X_7618", "instruction": "i looking a high power telescope for bird watching with smartphone adapter and tripod", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B09SXQJ94X" }, { "task_id": "ws_B09QHL1LDY_7619", "instruction": "i'm looking for a 5 pieces metal decorative loops for apple watch series 7/6/5/4/3/2/1 band silicon strap.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "# x" ] }, "asin": "B09QHL1LDY" }, { "task_id": "ws_B09S8MFC3R_7620", "instruction": "i'm looking for 8.5 wide open toe women sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "8.5 wide" ] }, "asin": "B09S8MFC3R" }, { "task_id": "ws_B005FO8MFG_7621", "instruction": "i'm looking for a camellia seed oil conditioner, fragance free", "target_attributes": { "attributes": [ "fragrance free", "seed oil" ], "options": [] }, "asin": "B005FO8MFG" }, { "task_id": "ws_B08X2QWP6M_7622", "instruction": "i would like some peanut butter cookies that are ready to eat.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "peanut butter" ] }, "asin": "B08X2QWP6M" }, { "task_id": "ws_B08C73M2QH_7623", "instruction": "i would like a bath brush for dead and dry skin.", "target_attributes": { "attributes": [ "dry skin", "dead skin" ], "options": [] }, "asin": "B08C73M2QH" }, { "task_id": "ws_B0836KS1QC_7624", "instruction": "i am looking for a mid century metal floor lamp with a brushed nickel finish.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "brushed nickel" ] }, "asin": "B0836KS1QC" }, { "task_id": "ws_B0758K4MPX_7625", "instruction": "i need a 1.7 ounce perfume set that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "1.7 ounce" ] }, "asin": "B0758K4MPX" }, { "task_id": "ws_B098THDLMD_7626", "instruction": "i need a stainless steel pedicure tool to remove dead skin and i would like an 8 piece black set if possible.", "target_attributes": { "attributes": [ "stainless steel", "dead skin" ], "options": [ "8pcs-black" ] }, "asin": "B098THDLMD" }, { "task_id": "ws_B09QT1YBXB_7627", "instruction": "i would like an xx-large black long sleeve shirt for daily casual wear, thanks", "target_attributes": { "attributes": [ "daily casual", "long sleeve" ], "options": [ "black", "xx-large" ] }, "asin": "B09QT1YBXB" }, { "task_id": "ws_B06Y3Z56DR_7628", "instruction": "i would like a 2.4 ounce bottle of deodorant that is made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "2.4 ounce (pack of 3)" ] }, "asin": "B06Y3Z56DR" }, { "task_id": "ws_B09N72QX3Z_7629", "instruction": "i would like a 4g lte tablet with a high resolution.", "target_attributes": { "attributes": [ "high resolution", "4g lte" ], "options": [] }, "asin": "B09N72QX3Z" }, { "task_id": "ws_B08SR3JNGT_7630", "instruction": "i'm looking for a pair of running shorts made out of polyester spandex with an elastic waistband. i want them in red, size small.", "target_attributes": { "attributes": [ "polyester spandex", "elastic waistband" ], "options": [ "red", "small" ] }, "asin": "B08SR3JNGT" }, { "task_id": "ws_B09NBZ4LFC_7631", "instruction": "i am looking for wireless bluetooth speakers in the color a.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "a" ] }, "asin": "B09NBZ4LFC" }, { "task_id": "ws_B077JJ6Q3G_7632", "instruction": "i would like a twin size blue bunk bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "blue", "twin" ] }, "asin": "B077JJ6Q3G" }, { "task_id": "ws_B09J81RMLD_7633", "instruction": "i am looking for teeth whitening toothbrush in green bear size", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "b01#green bear" ] }, "asin": "B09J81RMLD" }, { "task_id": "ws_B07Q98YNYF_7634", "instruction": "i am looking for some noise cancelling earbud headphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B07Q98YNYF" }, { "task_id": "ws_B074524C3Y_7635", "instruction": "i'm looking for sheer window curtains that are machine washable and 55 in x 108 in. also, they should be mint color.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "mint", "55 in x 108 in" ] }, "asin": "B074524C3Y" }, { "task_id": "ws_B094SLNNGD_7636", "instruction": "i am looking for cruelty free lip balm having 3pk warm flavors scent .", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "3pk warm flavors" ] }, "asin": "B094SLNNGD" }, { "task_id": "ws_B099PBZ3WK_7637", "instruction": "i'm looking for portable android tablet with dual speaker.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "golden" ] }, "asin": "B099PBZ3WK" }, { "task_id": "ws_B09J7NJ2LN_7638", "instruction": "i am looking for a loose fit blue top that is a small.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "gtp1 - zi7-blue", "small" ] }, "asin": "B09J7NJ2LN" }, { "task_id": "ws_B07NV7S8M3_7639", "instruction": "i would like a 10 by 8 foot photo backdrop that is light weight and easy to carry.", "target_attributes": { "attributes": [ "light weight", "easy carry" ], "options": [ "10x8ft" ] }, "asin": "B07NV7S8M3" }, { "task_id": "ws_B0849Q9FGM_7640", "instruction": "i am looking for an intel core all in one pc.", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B0849Q9FGM" }, { "task_id": "ws_B000QSOC4Q_7641", "instruction": "i need some coconut milk that is rich and creamy", "target_attributes": { "attributes": [ "rich creamy" ], "options": [] }, "asin": "B000QSOC4Q" }, { "task_id": "ws_B0986W42KJ_7642", "instruction": "i am looking for dust proof monoculars having high definition.", "target_attributes": { "attributes": [ "dust proof" ], "options": [] }, "asin": "B0986W42KJ" }, { "task_id": "ws_B07T75MQTL_7643", "instruction": "i want glitter crown cupcake picks.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [] }, "asin": "B07T75MQTL" }, { "task_id": "ws_B081QXQNVQ_7644", "instruction": "i am looking for a tv stand and console that has storage shelves. i choose the sargent oak color for for my 55\" tv", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "sargent oak", "50\" kenton w | fireplace" ] }, "asin": "B081QXQNVQ" }, { "task_id": "ws_B09B7B6ZZB_7645", "instruction": "i am looking for a heel booties pump with leather sole . also choose black color and size no 9.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "black", "9" ] }, "asin": "B09B7B6ZZB" }, { "task_id": "ws_B07M754CQY_7646", "instruction": "i am looking a light brown natural hair extention 20 inch long", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "20 inch" ] }, "asin": "B07M754CQY" }, { "task_id": "ws_B013ILQ0IS_7647", "instruction": "i would like a navy medium short scrub bottoms with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "navy", "medium short" ] }, "asin": "B013ILQ0IS" }, { "task_id": "ws_B08S3BPLWX_7648", "instruction": "i want grey color lumbar support, pu leather swivel adjustable executive chair with flip-up arms", "target_attributes": { "attributes": [ "pu leather", "lumbar support" ], "options": [ "grey" ] }, "asin": "B08S3BPLWX" }, { "task_id": "ws_B09P8GG6JY_7649", "instruction": "i'm looking for a toothpaste for teeth whitening", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09P8GG6JY" }, { "task_id": "ws_B083FLHGP5_7650", "instruction": "i am looking for yellow color hoodies for daily wear.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "yellow" ] }, "asin": "B083FLHGP5" }, { "task_id": "ws_B09PH7CTCH_7651", "instruction": "i'm looking for a bath brush in beige with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "beige" ] }, "asin": "B09PH7CTCH" }, { "task_id": "ws_B07CK3LTB2_7652", "instruction": "i would like a pair of size 10 bronze sneakers with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "bronze", "10" ] }, "asin": "B07CK3LTB2" }, { "task_id": "ws_B09N8PRHNG_7653", "instruction": "looking for long sleeve and loose fit sweatshirt for women also choose colour gray", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "gray" ] }, "asin": "B09N8PRHNG" }, { "task_id": "ws_B07GB9MX2J_7654", "instruction": "i am looking for french vanilla flavor syrup that is sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "french vanilla" ] }, "asin": "B07GB9MX2J" }, { "task_id": "ws_B07GB9MX2J_7655", "instruction": "hello, may you direct me to a pack of black cherry syrup? natural is preferable please", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "3 pound (pack of 1)" ] }, "asin": "B07GB9MX2J" }, { "task_id": "ws_B079K45PSB_7656", "instruction": "i need heeled sandals that have a rubber sole and are a size 6.5 with silver glitter on them", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "silver glitter", "6.5" ] }, "asin": "B079K45PSB" }, { "task_id": "ws_B08GSTVLNZ_7657", "instruction": "i want a gift box of assorted fresh gourmet nuts and dried fruits.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08GSTVLNZ" }, { "task_id": "ws_B0777LZTTG_7658", "instruction": "i need some machine washable curtains for my kitchen in white or black.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "white black" ] }, "asin": "B0777LZTTG" }, { "task_id": "ws_B01LVZZQY8_7659", "instruction": "i'm looking for a perfect waterproof eyeshadow stick with bronze shimmer", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "04 blush pink metallic" ] }, "asin": "B01LVZZQY8" }, { "task_id": "ws_B085CF2ZHB_7660", "instruction": "looking for samsung galaxy a11 red brushed tpu case cover also choose non slip quality", "target_attributes": { "attributes": [ "non slip", "case cover" ], "options": [ "samsung galaxy a11 red brushed tpu case" ] }, "asin": "B085CF2ZHB" }, { "task_id": "ws_B085CF2ZHB_7661", "instruction": "i am looking for a case cover for my samsung galaxy a11", "target_attributes": { "attributes": [ "case cover" ], "options": [ "samsung galaxy a11 gray brushed tpu case" ] }, "asin": "B085CF2ZHB" }, { "task_id": "ws_B09J2CMY2R_7662", "instruction": "i need some binoculars for bird watching", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09J2CMY2R" }, { "task_id": "ws_B07GFPY5Q5_7663", "instruction": "i'm looking for a spa gift set that's good for dry skin and hasn't been tested on animals.", "target_attributes": { "attributes": [ "animal testing", "dry skin" ], "options": [] }, "asin": "B07GFPY5Q5" }, { "task_id": "ws_B0916HVCC8_7664", "instruction": "i am looking for earbud headphones in noise cancelling", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B0916HVCC8" }, { "task_id": "ws_B08Y6R25N5_7665", "instruction": "i would like a 6.6 foot long gold plated fiber optic cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "6.6ft | 2m" ] }, "asin": "B08Y6R25N5" }, { "task_id": "ws_B09NGWMH8Y_7666", "instruction": "i would like a 28x16x18inch yellow storage bench made from engineered wood and a faux leather top.", "target_attributes": { "attributes": [ "faux leather", "engineered wood" ], "options": [ "yellow", "70x40x45cm(28x16x18inch)" ] }, "asin": "B09NGWMH8Y" }, { "task_id": "ws_B09NGWMH8Y_7667", "instruction": "i'm interested in a button-tufted, faux leather, dark green bench in size 39x16x18inch.", "target_attributes": { "attributes": [ "button tufted", "faux leather" ], "options": [ "dark green", "100x40x45cm(39x16x18inch)" ] }, "asin": "B09NGWMH8Y" }, { "task_id": "ws_B09NGWMH8Y_7668", "instruction": "i want a grey modern button tufted bed end bench.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "grey" ] }, "asin": "B09NGWMH8Y" }, { "task_id": "ws_B09FQ7W2G3_7669", "instruction": "i would like a pattern 21 cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "21" ] }, "asin": "B09FQ7W2G3" }, { "task_id": "ws_B07MP1KSVR_7670", "instruction": "i'm looking for a perfect valentine gift for my loved one with this strawberry love cookie cake.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "snickerdoodle" ] }, "asin": "B07MP1KSVR" }, { "task_id": "ws_B08WPBGH6T_7671", "instruction": "i would like a pair of 18 plus chocolate regular fit jeans.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "chocolate", "18 plus" ] }, "asin": "B08WPBGH6T" }, { "task_id": "ws_B07WJWBDZ3_7672", "instruction": "i need a refurbished pc that is an i5 and has 8gb of ram", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [ "1) i5, 8gb, 256gb ssd" ] }, "asin": "B07WJWBDZ3" }, { "task_id": "ws_B078GTKVXY_7673", "instruction": "i would like a 3 ounce bottle of bright citrus deodorant for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "bright citrus", "3 ounce (pack of 1)" ] }, "asin": "B078GTKVXY" }, { "task_id": "ws_B091K7DN8S_7674", "instruction": "i need a black wall mouinted mirror for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B091K7DN8S" }, { "task_id": "ws_B01FE73OSS_7675", "instruction": "i need a high power car stereo receiver.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B01FE73OSS" }, { "task_id": "ws_B09NMXYMRC_7676", "instruction": "i'm looking for pajama pants with an elastic waistband. they should be machine washable and come in a size large.", "target_attributes": { "attributes": [ "machine wash", "elastic waistband" ], "options": [ "large" ] }, "asin": "B09NMXYMRC" }, { "task_id": "ws_B072K5197P_7677", "instruction": "i need machine washable pillow covers. it should be in turquoise blue.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "turquoise blue" ] }, "asin": "B072K5197P" }, { "task_id": "ws_B078N9319K_7678", "instruction": "i need to buy a full sized mattress and box spring set. it should come fully assembled. look for style 225zf-4.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "full xl", "225zf-4 | 6xl-2s" ] }, "asin": "B078N9319K" }, { "task_id": "ws_B08FRLXKH9_7679", "instruction": "i would like fruit and nut bars that are soy free.", "target_attributes": { "attributes": [ "soy free" ], "options": [] }, "asin": "B08FRLXKH9" }, { "task_id": "ws_B08X71XX1N_7680", "instruction": "smart tv flat screen stereo sound", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B08X71XX1N" }, { "task_id": "ws_B09HH9G6N9_7681", "instruction": "looking for roasted carob powder with caffeine free and gluten free choose 1 pack", "target_attributes": { "attributes": [ "caffeine free", "gluten free" ], "options": [ "1 pack" ] }, "asin": "B09HH9G6N9" }, { "task_id": "ws_B08LCQHS8V_7682", "instruction": "i am looking fore a 24 pack of individually wrapped chocolates.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "24 count" ] }, "asin": "B08LCQHS8V" }, { "task_id": "ws_B081GGTX12_7683", "instruction": "i am looking for a wireless charger", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B081GGTX12" }, { "task_id": "ws_B06WW7XRFP_7684", "instruction": "i'm looking for a king platform bed with solid wood in taylan style", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "king", "taylan" ] }, "asin": "B06WW7XRFP" }, { "task_id": "ws_B08QD45PHZ_7685", "instruction": "i would like a 2.8 mm dome camera that is in ultra hd.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "2.8mm poe-4k" ] }, "asin": "B08QD45PHZ" }, { "task_id": "ws_B098Q9MZ83_7686", "instruction": "i would like a 52\" w x 84\" white window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "white", "52\" w x 84\" l" ] }, "asin": "B098Q9MZ83" }, { "task_id": "ws_B01H4EX6FA_7687", "instruction": "i would like a long lasting eye cruelty free shadow base.", "target_attributes": { "attributes": [ "cruelty free", "long lasting" ], "options": [] }, "asin": "B01H4EX6FA" }, { "task_id": "ws_B08MLLY79Y_7688", "instruction": "i am looking for slifm fit adidas women's essentials fleece tapered cuff pants in black color", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "black" ] }, "asin": "B08MLLY79Y" }, { "task_id": "ws_B07NQJD1NN_7689", "instruction": "i am looking for banana pecan fruit snacks that are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "banana pecan" ] }, "asin": "B07NQJD1NN" }, { "task_id": "ws_B019JNH6NM_7690", "instruction": "i am looking for thai chilli style tuna that has jalapeno flavor. it should be gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "jalapeno" ] }, "asin": "B019JNH6NM" }, { "task_id": "ws_B019JNH6NM_7691", "instruction": "i need wild caught salmon that comes in a pack of 12", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "2.6 ounce (pack of 12)" ] }, "asin": "B019JNH6NM" }, { "task_id": "ws_B082Z6XVLX_7692", "instruction": "i am looking for a scalp massager brush for hair growth which is easy to use. also choose black color", "target_attributes": { "attributes": [ "easy use", "hair growth" ], "options": [ "black" ] }, "asin": "B082Z6XVLX" }, { "task_id": "ws_B0838D7YNZ_7693", "instruction": "i am looking for a black 24inch size vanity light fixture", "target_attributes": { "attributes": [ "vanity light", "light fixture" ], "options": [ "black 24inch" ] }, "asin": "B0838D7YNZ" }, { "task_id": "ws_B07ZDVNYXD_7694", "instruction": "i would like a queen sized black bed with a box spring mattress.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "black", "queen" ] }, "asin": "B07ZDVNYXD" }, { "task_id": "ws_B0179DYV0U_7695", "instruction": "i am looking for tan colored queen folding mattresses with high density foam.", "target_attributes": { "attributes": [ "high density" ], "options": [ "tan" ] }, "asin": "B0179DYV0U" }, { "task_id": "ws_B00BDJODWI_7696", "instruction": "i want aveda scalp benefits balancing shampoo, plant based and size of 33.81 fl oz", "target_attributes": { "attributes": [ "plant based" ], "options": [ "33.81 fl oz (pack of 1)" ] }, "asin": "B00BDJODWI" }, { "task_id": "ws_B00BDJODWI_7697", "instruction": "i want a bottle of shampoo that's at least thirty ounces, smells like rosemary, and is plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "rosemary", "33.8 fl oz (pack of 1)" ] }, "asin": "B00BDJODWI" }, { "task_id": "ws_B07WLYKJB6_7698", "instruction": "i'm looking for xx-large long sleeve polo shirts for men that are hand washable and regular fit. also, i want it to be grey.", "target_attributes": { "attributes": [ "hand wash", "long sleeve", "regular fit" ], "options": [ "grey", "xx-large" ] }, "asin": "B07WLYKJB6" }, { "task_id": "ws_B09B1GDM5G_7699", "instruction": "i am interested in a plant based energy drink that is cucumber lime flavor.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "cucumber lime" ] }, "asin": "B09B1GDM5G" }, { "task_id": "ws_B09RZYGLT4_7700", "instruction": "i need some slim fitting white jeans that are an x-large.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "01-white", "x-large" ] }, "asin": "B09RZYGLT4" }, { "task_id": "ws_B0792MF532_7701", "instruction": "i'm looking for a pack of 12 cans of zesty lemon tuna in olive oil; it must be kosher certified.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "zesty lemon", "12-pack" ] }, "asin": "B0792MF532" }, { "task_id": "ws_B08YL39SKQ_7702", "instruction": "i'm looking for non toxic personal care for women's it easy to use.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "glow down" ] }, "asin": "B08YL39SKQ" }, { "task_id": "ws_B09KQF5YL1_7703", "instruction": "i need a tempered glass screen protector for my iphone 13 pro. it should be easy to install.", "target_attributes": { "attributes": [ "easy install", "tempered glass" ], "options": [ "iphone 13 pro" ] }, "asin": "B09KQF5YL1" }, { "task_id": "ws_B09P4PR2WM_7704", "instruction": "i am looking for a high quality gold color eye shadow brush set which is easy to carry.", "target_attributes": { "attributes": [ "easy carry", "high quality", "eye shadow" ], "options": [ "gold" ] }, "asin": "B09P4PR2WM" }, { "task_id": "ws_B0982B9JVG_7705", "instruction": "i'm looking for a small womens solid color long sleeve v neck sweater that has a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit", "long sleeve" ], "options": [ "small" ] }, "asin": "B0982B9JVG" }, { "task_id": "ws_B08ZJBSLN7_7706", "instruction": "i am interested in buying a laptop carrying case with colorful faces.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "colorful faces" ] }, "asin": "B08ZJBSLN7" }, { "task_id": "ws_B0892JGJWB_7707", "instruction": "im looking for a large, rectangular storage ottoman made out of faux leather.", "target_attributes": { "attributes": [ "faux leather", "storage space" ], "options": [] }, "asin": "B0892JGJWB" }, { "task_id": "ws_B000R9X6LO_7708", "instruction": "i am looking for english muffins in high fructose", "target_attributes": { "attributes": [ "high fructose" ], "options": [] }, "asin": "B000R9X6LO" }, { "task_id": "ws_B08J8DJF6S_7709", "instruction": "i am looking for a poster of size 12\"x12\" with wood frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "12\"x12\"" ] }, "asin": "B08J8DJF6S" }, { "task_id": "ws_B08V1VTKL6_7710", "instruction": "i'm looking for a quad core android tablet in black.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "black" ] }, "asin": "B08V1VTKL6" }, { "task_id": "ws_B09FTZMG9Y_7711", "instruction": "i would like a large black faux fur vest.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "$07 black", "large" ] }, "asin": "B09FTZMG9Y" }, { "task_id": "ws_B083G5KQ31_7712", "instruction": "i am looking for hands free car stereo receivers", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B083G5KQ31" }, { "task_id": "ws_B079D51JGR_7713", "instruction": "i'm looking for a pair of black men's oxfords with a rubber outsole. i need a size eleven and a half.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "lk black", "11.5" ] }, "asin": "B079D51JGR" }, { "task_id": "ws_B09QXQ6C97_7714", "instruction": "i am looking for caramel flavor chocolate candy for valentine day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "caramel" ] }, "asin": "B09QXQ6C97" }, { "task_id": "ws_B09QXQ6C97_7715", "instruction": "i am looking for 2 pounds of individually wrapped milk chocolate candy.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "2 pound" ] }, "asin": "B09QXQ6C97" }, { "task_id": "ws_B09SF1QP1J_7716", "instruction": "i need a black open toe pair of flat sandals. it should be 7.5 in width.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "a9 - black", "7.5 wide" ] }, "asin": "B09SF1QP1J" }, { "task_id": "ws_B08KVX5DPB_7717", "instruction": "i'm looking for a space-saving ottoman bench to match my blue living room. pick that one that's 100x45x45cm.", "target_attributes": { "attributes": [ "space saving", "living room" ], "options": [ "blue", "100x45x45cm" ] }, "asin": "B08KVX5DPB" }, { "task_id": "ws_B093SNC4Y4_7718", "instruction": "i want x-small heynuts hawthorn athletic women's high waist yoga shorts.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "x-small" ] }, "asin": "B093SNC4Y4" }, { "task_id": "ws_B07SCXCP4S_7719", "instruction": "i would like a hair growth treatment.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B07SCXCP4S" }, { "task_id": "ws_B09QPQPWZD_7720", "instruction": "i need a medium low rise thong that is yellow", "target_attributes": { "attributes": [ "low rise" ], "options": [ "yellow", "medium" ] }, "asin": "B09QPQPWZD" }, { "task_id": "ws_B09C7TRDLB_7721", "instruction": "i would like a red light high power light string.", "target_attributes": { "attributes": [ "high power" ], "options": [ "red, pisa leaning tower type" ] }, "asin": "B09C7TRDLB" }, { "task_id": "ws_B09JWHF531_7722", "instruction": "i would like a cupcake pick toppers for a birthday party.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [] }, "asin": "B09JWHF531" }, { "task_id": "ws_B09PZG5T25_7723", "instruction": "i'm looking for a wireless bluetooth speaker that is easy to use and is also black.", "target_attributes": { "attributes": [ "easy use", "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09PZG5T25" }, { "task_id": "ws_B09KTY1MHD_7724", "instruction": "i am looking for women nail art decorations that are non toxic.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B09KTY1MHD" }, { "task_id": "ws_B092CGQ7MF_7725", "instruction": "i would like some black brushes that are made of synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "black" ] }, "asin": "B092CGQ7MF" }, { "task_id": "ws_B01NBRKJ0N_7726", "instruction": "i am looking for v8 splash with natural pineapple coconut flavor. 64 oz bottles (pack of 6).", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "mango peach" ] }, "asin": "B01NBRKJ0N" }, { "task_id": "ws_B085ZF4KM2_7727", "instruction": "i'm looking for gluten free that flavor was vanilla cream its so good.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vanilla cream" ] }, "asin": "B085ZF4KM2" }, { "task_id": "ws_B09QMM4HDH_7728", "instruction": "i want to buy a long sleeved lace bodysuit in red. look for size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "red", "medium" ] }, "asin": "B09QMM4HDH" }, { "task_id": "ws_B088H41ZHJ_7729", "instruction": "i would like a temporary tattoo that is easy to apply and is in the 06 pattern", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "pattern 06" ] }, "asin": "B088H41ZHJ" }, { "task_id": "ws_B094FMFL9D_7730", "instruction": "i am looking for a hollow side console table that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "hollow side" ] }, "asin": "B094FMFL9D" }, { "task_id": "ws_B088LGSRTG_7731", "instruction": "i am looking for a conditioner that comes in a pack of three for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "7 fl oz (pack of 3)", "conditioner" ] }, "asin": "B088LGSRTG" }, { "task_id": "ws_B07QNBKBVC_7732", "instruction": "i'm looking for a size 35 straight leg men denim jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "35" ] }, "asin": "B07QNBKBVC" }, { "task_id": "ws_B06XR72LGR_7733", "instruction": "i'm looking for some trader joe's gluten free cornbread mix.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [] }, "asin": "B06XR72LGR" }, { "task_id": "ws_B09GB463Y2_7734", "instruction": "i'm looking for long sleeve clothing its for blue in clor.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue" ] }, "asin": "B09GB463Y2" }, { "task_id": "ws_B07MGX59S6_7735", "instruction": "i would like a late night drone right lipstick that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "13- late night done right" ] }, "asin": "B07MGX59S6" }, { "task_id": "ws_B071XXVMX2_7736", "instruction": "i'm looking for a copper wall mounted sconce with clear glass shades.", "target_attributes": { "attributes": [ "wall mounted", "glass shade", "clear glass" ], "options": [ "copper" ] }, "asin": "B071XXVMX2" }, { "task_id": "ws_B07Z6NG5PG_7737", "instruction": "i would like a 4 ounce bag of regular old fashioned jerky.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "regular", "4 oz" ] }, "asin": "B07Z6NG5PG" }, { "task_id": "ws_B00BEV82RC_7738", "instruction": "find me a high power waterproof binoculars for bird watching.", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B00BEV82RC" }, { "task_id": "ws_B08GQYQ9D1_7739", "instruction": "i need a core i5 computer with gtx1650 graphics and 16g+256gb+1t", "target_attributes": { "attributes": [ "core i5" ], "options": [ "gtx1650", "16g+256g+1t" ] }, "asin": "B08GQYQ9D1" }, { "task_id": "ws_B0872P6WRB_7740", "instruction": "i am looking for monoculars that are for bird watching", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B0872P6WRB" }, { "task_id": "ws_B08Z6TCQTD_7741", "instruction": "i want brushed nickel linea di liara teramo island lighting for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "brushed nickel | clear" ] }, "asin": "B08Z6TCQTD" }, { "task_id": "ws_B07Y59L1Z2_7742", "instruction": "i would like a quad core streaming media player.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B07Y59L1Z2" }, { "task_id": "ws_B097MM9XDP_7743", "instruction": "i would like a pair of women's 11.5 colorful sugar skull sneakers with a anti slip sole.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "colourful sugar skull white-2", "11.5 women | 10 men" ] }, "asin": "B097MM9XDP" }, { "task_id": "ws_B07PP8X2DS_7744", "instruction": "i am looking for tripod stand that is non slippable.", "target_attributes": { "attributes": [ "non slip" ], "options": [] }, "asin": "B07PP8X2DS" }, { "task_id": "ws_B088X52CZR_7745", "instruction": "i would like a 3 pack set of non gmo tree nuts.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "tree nut", "3 pack set" ] }, "asin": "B088X52CZR" }, { "task_id": "ws_B09PD9N2R2_7746", "instruction": "i'm looking for a body brush to remove dead skin", "target_attributes": { "attributes": [ "dead skin" ], "options": [] }, "asin": "B09PD9N2R2" }, { "task_id": "ws_B08CCT3JN2_7747", "instruction": "i need red sneakers that have a leather sole and are a size 7 x-wide", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "dark red", "7 x-wide" ] }, "asin": "B08CCT3JN2" }, { "task_id": "ws_B07SLNLB9D_7748", "instruction": "i want ready hang living room poster size 61*41cm the bridges of amsterdam", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "the bridges of amsterdam", "61 x 41 cm (24 x 16 in)" ] }, "asin": "B07SLNLB9D" }, { "task_id": "ws_B08968B883_7749", "instruction": "i need easy to use, water resistant eye shadow in dark brown color.", "target_attributes": { "attributes": [ "water resistant", "easy use", "eye shadow" ], "options": [ "dark brown" ] }, "asin": "B08968B883" }, { "task_id": "ws_B07CYK25W8_7750", "instruction": "i am interested in acquiring a bookcase which will last me a long time and i prefer to have it in anthracite color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "anthracite" ] }, "asin": "B07CYK25W8" }, { "task_id": "ws_B07VWR4HT1_7751", "instruction": "i am looking for a black video projector that is 1080p", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "black" ] }, "asin": "B07VWR4HT1" }, { "task_id": "ws_B09KRP73M2_7752", "instruction": "i need style 5 hair salon", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "style 5" ] }, "asin": "B09KRP73M2" }, { "task_id": "ws_B08QDRKQPL_7753", "instruction": "i am looking for high power and dust proof sound bar.", "target_attributes": { "attributes": [ "dust proof", "high power" ], "options": [] }, "asin": "B08QDRKQPL" }, { "task_id": "ws_B06WD5R33H_7754", "instruction": "i'm looking for one hundred and eight inch brown curtains that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "brown", "108\" x 84\"" ] }, "asin": "B06WD5R33H" }, { "task_id": "ws_B097PTCQ44_7755", "instruction": "i'm looking for a thirty inch mirror for my living room that's easy to install. it should also turn into a lighted lunar picture.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "lunar", "30\"" ] }, "asin": "B097PTCQ44" }, { "task_id": "ws_B01FU0230Y_7756", "instruction": "i am looking for a 32 inch by 48 inch ready to hang hand painted painting.", "target_attributes": { "attributes": [ "hand painted", "ready hang" ], "options": [ "32x48inchesx1" ] }, "asin": "B01FU0230Y" }, { "task_id": "ws_B09JFNXRDR_7757", "instruction": "i need a super soft easy to clean blanket in bible verse trust in the lord color and 50x40 small size for kid.", "target_attributes": { "attributes": [ "super soft", "easy clean" ], "options": [ "bible verse trust in the lord", "50x40 small for kid" ] }, "asin": "B09JFNXRDR" }, { "task_id": "ws_B07HYKGNHN_7758", "instruction": "i need lace closure in bliss blue color", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "bliss blue hrtg cvs" ] }, "asin": "B07HYKGNHN" }, { "task_id": "ws_B09Q6DWRZH_7759", "instruction": "i am looking for a loose fit small size women's t shirt.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "small" ] }, "asin": "B09Q6DWRZH" }, { "task_id": "ws_B06XKBJR74_7760", "instruction": "buy me a cruelty free solid perfume with a flirt scent.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "flirt" ] }, "asin": "B06XKBJR74" }, { "task_id": "ws_B078KGBP2N_7761", "instruction": "i am looking for men scrubs pant of pewter color that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pewter" ] }, "asin": "B078KGBP2N" }, { "task_id": "ws_B07CKNJ3P7_7762", "instruction": "i'm looking for high waist biker shorts for women with pockets tummy.", "target_attributes": { "attributes": [ "high waist", "tummy control" ], "options": [ "deep navy-9\" inseam" ] }, "asin": "B07CKNJ3P7" }, { "task_id": "ws_B09HTZZ45V_7763", "instruction": "i need to find a strawberry-flavoured toothpaste for my child to keep her breath fresh; make sure it only has natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "fresh breath" ], "options": [ "strawberry" ] }, "asin": "B09HTZZ45V" }, { "task_id": "ws_B07X5K7QB3_7764", "instruction": "i want to buy underwear boxer for men which are low rise and are hand washable, as for the color i want them yellow and at 3x-large size.", "target_attributes": { "attributes": [ "low rise", "hand wash" ], "options": [ "yellow 3 pack", "3x-large" ] }, "asin": "B07X5K7QB3" }, { "task_id": "ws_B00XENXJTO_7765", "instruction": "i would like a 100 count bamboo charcoal oil free blotting paper.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "mirror-pack | bamboo-charcoal", "100 count (pack of 2)" ] }, "asin": "B00XENXJTO" }, { "task_id": "ws_B074J4XDTQ_7766", "instruction": "i need some yellow curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dimgray yellow" ] }, "asin": "B074J4XDTQ" }, { "task_id": "ws_B07R4VNCRC_7767", "instruction": "i am looking for ethylene vinyl cat color women road running shoes , and size is 6", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "cat-1", "6" ] }, "asin": "B07R4VNCRC" }, { "task_id": "ws_B07QCD9W67_7768", "instruction": "i'm looking for toddler smoothie pouches that are non-gmo, certified organic, and bpa free.", "target_attributes": { "attributes": [ "certified organic", "non gmo", "bpa free" ], "options": [] }, "asin": "B07QCD9W67" }, { "task_id": "ws_B07Y2RKJ9G_7769", "instruction": "i want a large and classic fit phineas and ferb perry the platypus shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "large" ] }, "asin": "B07Y2RKJ9G" }, { "task_id": "ws_B09MY498ZT_7770", "instruction": "i am looking for a manual toothbrush for easy use to oral hygiene. also choose violet color.", "target_attributes": { "attributes": [ "easy use", "oral hygiene" ], "options": [ "violet" ] }, "asin": "B09MY498ZT" }, { "task_id": "ws_B09MRYN7WH_7771", "instruction": "i am looking for twin sized bunk beds that are white.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "white", "triple bunk beds" ] }, "asin": "B09MRYN7WH" }, { "task_id": "ws_B09MRYN7WH_7772", "instruction": "i am looking for an easy to assemble brown triple bunk beds.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "brown", "triple bunk beds" ] }, "asin": "B09MRYN7WH" }, { "task_id": "ws_B09K432WXZ_7773", "instruction": "i'm looking for women's bootcut pants in the brand of tapata.", "target_attributes": { "attributes": [ "fashion design", "regular fit", "daily wear" ], "options": [ "30 inseam (regular) [fits 5'5\"-5'8\"]", "large" ] }, "asin": "B09K432WXZ" }, { "task_id": "ws_B07VBWTZLV_7774", "instruction": "i want one pack of paraben free hair styling spray in size 5.5 ounce.", "target_attributes": { "attributes": [ "paraben free", "hair styling" ], "options": [ "5.5 ounce (pack of 1)" ] }, "asin": "B07VBWTZLV" }, { "task_id": "ws_B07VBWTZLV_7775", "instruction": "i want to find 5.5 ounces of hair styling spray that is certified organic.", "target_attributes": { "attributes": [ "certified organic", "hair styling" ], "options": [ "5.5 ounce (pack of 1)" ] }, "asin": "B07VBWTZLV" }, { "task_id": "ws_B07MQD33ZZ_7776", "instruction": "i would like a 104''w x 84'' l trianglwxf4152 window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "trianglewxf4152", "104''w x 84'' l" ] }, "asin": "B07MQD33ZZ" }, { "task_id": "ws_B09KH6SS25_7777", "instruction": "i'm looking for a high performance tablet with quad core processor. also, choose 4g+64gb emmc one.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [ "4g+64gb emmc" ] }, "asin": "B09KH6SS25" }, { "task_id": "ws_B07MCMHT7R_7778", "instruction": "i am looking for gluten free and crispy potato snacks with barbecue flavour .", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "barbecue" ] }, "asin": "B07MCMHT7R" }, { "task_id": "ws_B08YR1VP2C_7779", "instruction": "i am searching for fluffy faux fur duvet cover set of queen size and aqua color", "target_attributes": { "attributes": [ "queen size" ], "options": [ "tie dye aqua" ] }, "asin": "B08YR1VP2C" }, { "task_id": "ws_B08YR1VP2C_7780", "instruction": "i need queen size turquoise color fluffy faux fur duvet cover set", "target_attributes": { "attributes": [ "queen size" ], "options": [ "tie dye turquoise" ] }, "asin": "B08YR1VP2C" }, { "task_id": "ws_B001IZM92I_7781", "instruction": "hi i'm going to barbecue sausage, i want you to find the special summer gluten free sausage old wisconsin beef sausages low carb flavored beef 8oz (pack of 3).", "target_attributes": { "attributes": [ "high protein", "gluten free" ], "options": [ "beef", "8 ounce" ] }, "asin": "B001IZM92I" }, { "task_id": "ws_B09L33P12S_7782", "instruction": "i'm interested in a pair of off-white, rubber-soled sneakers in a size 6 with memory foam.", "target_attributes": { "attributes": [ "memory foam", "rubber sole" ], "options": [ "off white", "6" ] }, "asin": "B09L33P12S" }, { "task_id": "ws_B09SWJLF5M_7783", "instruction": "i am looking for a personalized, metal hair and beauty signage or artwork.", "target_attributes": { "attributes": [ "hair salon", "beauty salon" ], "options": [] }, "asin": "B09SWJLF5M" }, { "task_id": "ws_B0897T87S2_7784", "instruction": "i am looking for pink non slip shoes that are a 10.5", "target_attributes": { "attributes": [ "non slip" ], "options": [ "pink-dm", "10.5" ] }, "asin": "B0897T87S2" }, { "task_id": "ws_B07PGK27KK_7785", "instruction": "i am looking for canalis 3 mini pendant lighting led hanging light fixture.", "target_attributes": { "attributes": [ "light fixture" ], "options": [] }, "asin": "B07PGK27KK" }, { "task_id": "ws_B00825IBGU_7786", "instruction": "i'm looking for a ready to hang wall mounted mirror for my living room. it should be round and come in silver brushed nickel.", "target_attributes": { "attributes": [ "ready hang", "brushed nickel", "living room" ], "options": [ "round" ] }, "asin": "B00825IBGU" }, { "task_id": "ws_B08MBD8573_7787", "instruction": "i'm looking for a height adjustable laptop stand with tempered glass and walnut colored wood.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "walnut", "tempered glass (24\")" ] }, "asin": "B08MBD8573" }, { "task_id": "ws_B09R1X5Y7Q_7788", "instruction": "i would like a 11.1 by 4.5 by 4.5 cm transparent makeup case for my nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "transparent 2", "11.1x4.5x4.5cm" ] }, "asin": "B09R1X5Y7Q" }, { "task_id": "ws_B07QPC3454_7789", "instruction": "i am looking for gluten free snacks that made up by sea salt", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sea salt" ] }, "asin": "B07QPC3454" }, { "task_id": "ws_B08N4YVGBG_7790", "instruction": "i am looking for brown black throw pillow case that is double sided and super soft.", "target_attributes": { "attributes": [ "double sided", "super soft" ], "options": [ "brown black" ] }, "asin": "B08N4YVGBG" }, { "task_id": "ws_B08V134QWR_7791", "instruction": "i want to buy a waterproof security camera with an optical zoom and motion detection.", "target_attributes": { "attributes": [ "optical zoom", "motion detection" ], "options": [] }, "asin": "B08V134QWR" }, { "task_id": "ws_B08DYZTSC5_7792", "instruction": "i want some margherita pizza that's gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B08DYZTSC5" }, { "task_id": "ws_B072J36KT1_7793", "instruction": "i am looking for a elastic waistband small size active shorts for man", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "small" ] }, "asin": "B072J36KT1" }, { "task_id": "ws_B00BB683XS_7794", "instruction": "i'm looking for a ultimate hand care cream for dry skin", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "ultimate care hand cream" ] }, "asin": "B00BB683XS" }, { "task_id": "ws_B09CT74QK2_7795", "instruction": "i am looking for short sleeve animal graphic t shirts.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "z04 beige" ] }, "asin": "B09CT74QK2" }, { "task_id": "ws_B08521SGW3_7796", "instruction": "i'm looking for short and long sleeve and the elastic waist for women's the color was black.", "target_attributes": { "attributes": [ "short sleeve", "elastic closure", "elastic waist" ], "options": [ "a-black" ] }, "asin": "B08521SGW3" }, { "task_id": "ws_B08521SGW3_7797", "instruction": "i am looking for a xx-large short sleeves sleep & lounge for teen girls", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "xx-large" ] }, "asin": "B08521SGW3" }, { "task_id": "ws_B07FN25TCW_7798", "instruction": "im looking for men\u2019s small boxer briefs, long leg style that are moisture wicking.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "small" ] }, "asin": "B07FN25TCW" }, { "task_id": "ws_B01MSKUTNP_7799", "instruction": "i am looking for a six pack of gluten free jerky", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "6" ] }, "asin": "B01MSKUTNP" }, { "task_id": "ws_B09JNTH5XL_7800", "instruction": "i am looking for a loose fit shirt that is black and in a xx-large.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "a1_black", "xx-large" ] }, "asin": "B09JNTH5XL" }, { "task_id": "ws_B09NTCSB7G_7801", "instruction": "i need some knee high boots that are black and in a size 5", "target_attributes": { "attributes": [ "knee high" ], "options": [ "b-black", "5" ] }, "asin": "B09NTCSB7G" }, { "task_id": "ws_B09NTCSB7G_7802", "instruction": "am looking for a knee high runmte platform boots for women high boots size 9", "target_attributes": { "attributes": [ "knee high" ], "options": [ "9" ] }, "asin": "B09NTCSB7G" }, { "task_id": "ws_B08L769ZS8_7803", "instruction": "i am looking for hemp regular and gluten free vegan granola.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "hemp regular" ] }, "asin": "B08L769ZS8" }, { "task_id": "ws_B00VHYE5AO_7804", "instruction": "i am looking for distressed gaelic label short sleeve t-shits.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "black-gaelic" ] }, "asin": "B00VHYE5AO" }, { "task_id": "ws_B09HBV98LV_7805", "instruction": "i would like a 3 piece set of natural ingredient hair growth treatments.", "target_attributes": { "attributes": [ "natural ingredients", "hair growth" ], "options": [ "3pcs" ] }, "asin": "B09HBV98LV" }, { "task_id": "ws_B07ZZS34HH_7806", "instruction": "i need an elastic waist active short that is an x-large", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "x-large | 8\" inseam" ] }, "asin": "B07ZZS34HH" }, { "task_id": "ws_B07ZZS34HH_7807", "instruction": "i want a small and long lasting columbia men's pair of shorts.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "small x 6\" inseam" ] }, "asin": "B07ZZS34HH" }, { "task_id": "ws_B07ZZS34HH_7808", "instruction": "many engineers choose long lasting, quality materials in alternate team color", "target_attributes": { "attributes": [ "long lasting", "quality materials" ], "options": [ "alternate team color" ] }, "asin": "B07ZZS34HH" }, { "task_id": "ws_B004KXH8XK_7809", "instruction": "i buy a design house in white color", "target_attributes": { "attributes": [ "design house" ], "options": [] }, "asin": "B004KXH8XK" }, { "task_id": "ws_B09F1S8HL4_7810", "instruction": "most people like sensitive skin in red color", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B09F1S8HL4" }, { "task_id": "ws_B008YQEOMM_7811", "instruction": "i want to buy an argan oil hair treatment for damaged hair.", "target_attributes": { "attributes": [ "argan oil", "damaged hair" ], "options": [] }, "asin": "B008YQEOMM" }, { "task_id": "ws_B07L394Q5L_7812", "instruction": "i am looking for rose gold fine mist, soothing and refreshing face spray, 3 pack - 3.4 fl oz", "target_attributes": { "attributes": [ "fine mist", "rose gold" ], "options": [ ".3 pack - 3.4 fl oz" ] }, "asin": "B07L394Q5L" }, { "task_id": "ws_B09Q313XLN_7813", "instruction": "i want the orange color, 2 pcs of v34 color correction tooth whitening sensitive toothpaste for sensitive teeth and bad breath.", "target_attributes": { "attributes": [ "sensitive teeth", "bad breath" ], "options": [ "orange" ] }, "asin": "B09Q313XLN" }, { "task_id": "ws_B08HGQMJ7S_7814", "instruction": "i'm looking for furniture for space saving in living room.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B08HGQMJ7S" }, { "task_id": "ws_B09PBN5BVW_7815", "instruction": "i want a temporary tooth repair kit for teeth whitening.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09PBN5BVW" }, { "task_id": "ws_B09BLB3BFM_7816", "instruction": "looking for a honiway decorative wall mirror 12.3 inch rustic wood frame for living room. keep in touch", "target_attributes": { "attributes": [ "wood frame", "living room" ], "options": [] }, "asin": "B09BLB3BFM" }, { "task_id": "ws_B097XG3P7X_7817", "instruction": "i am looking to buy a multi color birthday candles for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "multicolor" ] }, "asin": "B097XG3P7X" }, { "task_id": "ws_B09MW563KN_7818", "instruction": "i am looking for blue color toothbrushes that helps to maintain my oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "blue" ] }, "asin": "B09MW563KN" }, { "task_id": "ws_B07NB2K1PJ_7819", "instruction": "i need a white classic fit shirt that is in an xx-large for youth", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "white", "youth", "xx-large" ] }, "asin": "B07NB2K1PJ" }, { "task_id": "ws_B09LYW87WH_7820", "instruction": "i would like a 40 by 50 inch fleece throw with valentine's day trucks.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "valentine's day trucks", "40x50 inch" ] }, "asin": "B09LYW87WH" }, { "task_id": "ws_B07JKQX4J3_7821", "instruction": "i am looking for 40 oz. ready eat triple berry nut trail mix", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B07JKQX4J3" }, { "task_id": "ws_B09QRVDTG1_7822", "instruction": "i'm looking for a orange toothpaste for teeth whitening and color correction", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "orange" ] }, "asin": "B09QRVDTG1" }, { "task_id": "ws_B09P47D7X3_7823", "instruction": "i need a fully cooked two whole slabs with dry rubbed (seasoned) baby backs.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "two whole slabs" ] }, "asin": "B09P47D7X3" }, { "task_id": "ws_B09P47D7X3_7824", "instruction": "i need four half slabs of seasoned ribs that are fully cooked.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "dry rubbed (seasoned) st louis style", "four half slabs" ] }, "asin": "B09P47D7X3" }, { "task_id": "ws_B092NV1R6G_7825", "instruction": "i'm looking for a high quality anti-static hair brush", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B092NV1R6G" }, { "task_id": "ws_B00DU76CHK_7826", "instruction": "like to buy a memory foam flat with rubber sole in taupe color and 8 wide size.", "target_attributes": { "attributes": [ "memory foam", "rubber sole" ], "options": [ "taupe", "8 wide" ] }, "asin": "B00DU76CHK" }, { "task_id": "ws_B09NM4XQ7W_7827", "instruction": "i am interested in buying a remote control repeater which supports blu ray streaming.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B09NM4XQ7W" }, { "task_id": "ws_B099WCPFJP_7828", "instruction": "hello, i'm looking for a sweater that's slim fit and comes in black? size medium too, please", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "black", "medium" ] }, "asin": "B099WCPFJP" }, { "task_id": "ws_B000QSPX58_7829", "instruction": "find me a jar of baby food that is certified organic. it should also be non gmo.", "target_attributes": { "attributes": [ "certified organic", "non gmo" ], "options": [] }, "asin": "B000QSPX58" }, { "task_id": "ws_B07SFX4BPR_7830", "instruction": "i need some relaxed fit pants that are gray and are a size 3x.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "gray yoga trousers", "3x" ] }, "asin": "B07SFX4BPR" }, { "task_id": "ws_B0954V82WH_7831", "instruction": "i would like some original flavor plant based meat.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "original" ] }, "asin": "B0954V82WH" }, { "task_id": "ws_B09QGK3M3S_7832", "instruction": "i need gold plated red rca cables that are 1.6 feet.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "red", "1.6 feet" ] }, "asin": "B09QGK3M3S" }, { "task_id": "ws_B000E1HVCA_7833", "instruction": "i am looking for chocolate sugar free fat free pistachio flavored pudding and pie filling mix", "target_attributes": { "attributes": [ "sugar free", "fat free" ], "options": [ "pistachio" ] }, "asin": "B000E1HVCA" }, { "task_id": "ws_B09CV83TC3_7834", "instruction": "i am looking for men comfortable fit sweatpants of black color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black" ] }, "asin": "B09CV83TC3" }, { "task_id": "ws_B09GNBMZ8R_7835", "instruction": "i need glass screen grey color", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "grey" ] }, "asin": "B09GNBMZ8R" }, { "task_id": "ws_B09KGT3XVC_7836", "instruction": "i want case cover in american flag deer color", "target_attributes": { "attributes": [ "case cover" ], "options": [ "american flag deer" ] }, "asin": "B09KGT3XVC" }, { "task_id": "ws_B09KGT3XVC_7837", "instruction": "i need a cell phone case that is easy to install and is astronaut colored", "target_attributes": { "attributes": [ "easy install" ], "options": [ "astronaut" ] }, "asin": "B09KGT3XVC" }, { "task_id": "ws_B08HLR225R_7838", "instruction": "i need a bpa free jar that is black", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "black" ] }, "asin": "B08HLR225R" }, { "task_id": "ws_B01M21KDSN_7839", "instruction": "find me a 5-pack of natural water enhancer that is keto-friendly and does not contain any sugar. i'll take the skinny orange citrus flavor.", "target_attributes": { "attributes": [ "keto friendly", "sugar free" ], "options": [ "skinny orange citrus", "1.62 fl oz (pack of 5)" ] }, "asin": "B01M21KDSN" }, { "task_id": "ws_B07R926VLW_7840", "instruction": "i would like 2 packs and rinse of alcohol free mouthwash and toothpaste.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "2 pack + rinse" ] }, "asin": "B07R926VLW" }, { "task_id": "ws_B09LLVKS26_7841", "instruction": "i need an ac adapter that has output protection", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B09LLVKS26" }, { "task_id": "ws_B071HH7B9T_7842", "instruction": "i'm looking for a wall mounted mirror with a silver painted wooden frame. the size should be eighteen by twenty-four inches.", "target_attributes": { "attributes": [ "wall mounted", "wood frame" ], "options": [ "vegas silver", "glass size 18x24" ] }, "asin": "B071HH7B9T" }, { "task_id": "ws_B09J2N4KMC_7843", "instruction": "i need a black wireless earbuds bluetooth", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09J2N4KMC" }, { "task_id": "ws_B07K9JK92F_7844", "instruction": "i am looking for a set of 2 easy to install sea teal colored curtains that are machine washable.", "target_attributes": { "attributes": [ "machine washable", "easy install" ], "options": [ "sea teal" ] }, "asin": "B07K9JK92F" }, { "task_id": "ws_B09JB2M7BZ_7845", "instruction": "i am interested in buying a mai tai mix which is ready to use and is not alcoholic.", "target_attributes": { "attributes": [ "ready use", "non alcoholic" ], "options": [] }, "asin": "B09JB2M7BZ" }, { "task_id": "ws_B07NP7JW66_7846", "instruction": "i need an ac adapter with output protection", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07NP7JW66" }, { "task_id": "ws_B09DSYQMXM_7847", "instruction": "i am looking for antislip shoes that are a 6.5 for women", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "6.5 women | 4.5 men" ] }, "asin": "B09DSYQMXM" }, { "task_id": "ws_B092FCM7L1_7848", "instruction": "i would like a gluten free sweet and sour chicken dinner.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B092FCM7L1" }, { "task_id": "ws_B07XGH1DFM_7849", "instruction": "i am looking for brown color ottoman bench for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown" ] }, "asin": "B07XGH1DFM" }, { "task_id": "ws_B09G6ZZFXH_7850", "instruction": "i need a solid wood white bed frame.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "white" ] }, "asin": "B09G6ZZFXH" }, { "task_id": "ws_B09DCS16FJ_7851", "instruction": "i want twin size black pants", "target_attributes": { "attributes": [ "twin size" ], "options": [ "black" ] }, "asin": "B09DCS16FJ" }, { "task_id": "ws_B09DCS16FJ_7852", "instruction": "i am looking for black twin size bunk beds.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "black" ] }, "asin": "B09DCS16FJ" }, { "task_id": "ws_B0946PM7VK_7853", "instruction": "i'm looking for a pair of women's size seven steel toed boots that are water resistant and come in black.", "target_attributes": { "attributes": [ "water resistant", "steel toe" ], "options": [ "black-80", "7 women | 5.5 men" ] }, "asin": "B0946PM7VK" }, { "task_id": "ws_B000774DQI_7854", "instruction": "i want fluoride free ayurvedic herbal toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B000774DQI" }, { "task_id": "ws_B09P4NKXYH_7855", "instruction": "i would like a black pair of earbud headphones that are able to be wirelessly charged.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "black" ] }, "asin": "B09P4NKXYH" }, { "task_id": "ws_B07W7S31HC_7856", "instruction": "i would like a strawberry sunrise lip balm that is paraben and cruelty free.", "target_attributes": { "attributes": [ "paraben free", "cruelty free" ], "options": [ "strawberry sunrise" ] }, "asin": "B07W7S31HC" }, { "task_id": "ws_B01BZ4D2AO_7857", "instruction": "i am looking for brown hiking boots that are size 10.5 wide with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "brown", "10.5 wide" ] }, "asin": "B01BZ4D2AO" }, { "task_id": "ws_B09DPG79J2_7858", "instruction": "i am looking for a replacement tv remote control with the aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B09DPG79J2" }, { "task_id": "ws_B0008EOGE4_7859", "instruction": "i'm looking for a pair of straight leg jeans with a button closure that comes in the \"silo\" color. i need them with a forty inch waist and a twenty nine inch length.", "target_attributes": { "attributes": [ "straight leg", "button closure" ], "options": [ "silo", "40w x 29l" ] }, "asin": "B0008EOGE4" }, { "task_id": "ws_B09R9826YV_7860", "instruction": "i am looking for a great gift chocolate box packed in silver foil box color.", "target_attributes": { "attributes": [ "great gift" ], "options": [ "silver foil box" ] }, "asin": "B09R9826YV" }, { "task_id": "ws_B08KDPSJYK_7861", "instruction": "i am looking for a non alcoholic cocktail syrup with coconut flavour.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "coconut" ] }, "asin": "B08KDPSJYK" }, { "task_id": "ws_B07DWQ3RWY_7862", "instruction": "i would like a 40 w by 28 l grill pant with a elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "grill", "40w x 28l" ] }, "asin": "B07DWQ3RWY" }, { "task_id": "ws_B09MWH6FBW_7863", "instruction": "i need a space saving ottoman that is purple", "target_attributes": { "attributes": [ "space saving" ], "options": [ "purple" ] }, "asin": "B09MWH6FBW" }, { "task_id": "ws_B08JY4DGB1_7864", "instruction": "i'm looking for a long lasting samsung cell phone.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B08JY4DGB1" }, { "task_id": "ws_B0068RE8XO_7865", "instruction": "i would like some non gno amaretto almond biscotti.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "amaretto almond biscotti" ] }, "asin": "B0068RE8XO" }, { "task_id": "ws_B0068RE8XO_7866", "instruction": "i want a creme brulee truffle coffee that is gmo free.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "creme brulee truffle" ] }, "asin": "B0068RE8XO" }, { "task_id": "ws_B01LXHXJF9_7867", "instruction": "i need an 8 ft navy area rug for the living room that is round.", "target_attributes": { "attributes": [ "living room" ], "options": [ "navy | teal", "round", "8 ft" ] }, "asin": "B01LXHXJF9" }, { "task_id": "ws_B01LXHXJF9_7868", "instruction": "i want an area rug to go in my living room. pick something in either white or royal blue.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white | royal blue" ] }, "asin": "B01LXHXJF9" }, { "task_id": "ws_B0928MPG7R_7869", "instruction": "i'm looking for a high definition screen protector for my smart watch.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B0928MPG7R" }, { "task_id": "ws_B09NLXNYKZ_7870", "instruction": "i am searching for 3 colors makeup naked long lasting eye shadow", "target_attributes": { "attributes": [ "long lasting", "eye shadow" ], "options": [ "03" ] }, "asin": "B09NLXNYKZ" }, { "task_id": "ws_B08DFTK4WT_7871", "instruction": "i would like a pair of extra large darkgrey sweatpants with a elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "darkgrey (closed bottom)", "x-large" ] }, "asin": "B08DFTK4WT" }, { "task_id": "ws_B08SJ4HVSY_7872", "instruction": "i am looking for an arabic javy cold brew coffee concentrate.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "caramel" ] }, "asin": "B08SJ4HVSY" }, { "task_id": "ws_B07CH44FCJ_7873", "instruction": "i would like a foot cream made from seed oil.", "target_attributes": { "attributes": [ "seed oil" ], "options": [] }, "asin": "B07CH44FCJ" }, { "task_id": "ws_B08GLM774B_7874", "instruction": "i'm looking for some 3 x large high waisted tummy control leggings in wine red polyester spandex.", "target_attributes": { "attributes": [ "tummy control", "high waist", "polyester spandex" ], "options": [ "#1 s-melange wine red", "3x-large" ] }, "asin": "B08GLM774B" }, { "task_id": "ws_B07BMH2TFF_7875", "instruction": "i'm looking for a large novelty pajama set for my husband who likes blue stripes; i must be able to machine wash it cold.", "target_attributes": { "attributes": [ "wash cold", "machine wash" ], "options": [ "with blue strpe pant", "large" ] }, "asin": "B07BMH2TFF" }, { "task_id": "ws_B09M8H138L_7876", "instruction": "i'm looking for oral care tooth brushes with accessories.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "c- green" ] }, "asin": "B09M8H138L" }, { "task_id": "ws_B004UT3E82_7877", "instruction": "i'm looking for after wax lotion that is cruelty free and is also an epilating trial pack pattern.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "epilating trial pack" ] }, "asin": "B004UT3E82" }, { "task_id": "ws_B07YQHHK9F_7878", "instruction": "i am looking for star wars large size navy color bounty hunter wrap around logo raglan baseball t-shirt", "target_attributes": { "attributes": [ "star wars" ], "options": [ "navy | white", "large" ] }, "asin": "B07YQHHK9F" }, { "task_id": "ws_B09KBW7Y9L_7879", "instruction": "so i would like to find a men's blazer. it needs to be a size 40 and it has to have buttons for those cold windy days. ideally, make sure it is grey with a slim fit as well.", "target_attributes": { "attributes": [ "slim fit", "button closure" ], "options": [ "grey", "40" ] }, "asin": "B09KBW7Y9L" }, { "task_id": "ws_B09FB1NBWD_7880", "instruction": "i am looking for modern mid century droplet accent table lamp for living room", "target_attributes": { "attributes": [ "mid century", "living room" ], "options": [] }, "asin": "B09FB1NBWD" }, { "task_id": "ws_B082WLFJPV_7881", "instruction": "i need medipharma cosmetics eyebrow booster serum paraben & silicon free", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B082WLFJPV" }, { "task_id": "ws_B01F7MCTBS_7882", "instruction": "i am looking for superfood low carb snack tropical mix cubed of 4 pound (pack of 1)", "target_attributes": { "attributes": [ "low carb" ], "options": [ "tropical mix cubed", "4 pound (pack of 1)" ] }, "asin": "B01F7MCTBS" }, { "task_id": "ws_B09NMYSG5G_7883", "instruction": "i'm looking for a set of machine washable long sleeved pajamas that come in a men's small.", "target_attributes": { "attributes": [ "machine wash", "long sleeve" ], "options": [ "small" ] }, "asin": "B09NMYSG5G" }, { "task_id": "ws_B09ND5W2FR_7884", "instruction": "i would like a auto charger with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B09ND5W2FR" }, { "task_id": "ws_B01CU5ZJIU_7885", "instruction": "i would like 72 pieces of a variety of sugar free bubblegum.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "variety", "72 count (pack of 3)" ] }, "asin": "B01CU5ZJIU" }, { "task_id": "ws_B01CU5ZJIU_7886", "instruction": "i am looking for sugar free wintergreen chewing gum.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "wintergreen" ] }, "asin": "B01CU5ZJIU" }, { "task_id": "ws_B07PQJ1PF2_7887", "instruction": "i am looking for string curtain of rose color that are eco friendly and easy to install.", "target_attributes": { "attributes": [ "eco friendly", "easy install" ], "options": [ "rose" ] }, "asin": "B07PQJ1PF2" }, { "task_id": "ws_B08BX7C5BY_7888", "instruction": "i want a blue color synthetic sole vinyl acetate women clogs size 6.5", "target_attributes": { "attributes": [ "vinyl acetate", "synthetic sole" ], "options": [ "blue" ] }, "asin": "B08BX7C5BY" }, { "task_id": "ws_B08D6B3CFK_7889", "instruction": "i would like a glass screen scanner.", "target_attributes": { "attributes": [ "glass screen" ], "options": [] }, "asin": "B08D6B3CFK" }, { "task_id": "ws_B07XYXC1Z7_7890", "instruction": "i'm looking for a red folding ottoman bench for the living room that has storage space and is easy to assemble and easy to clean.", "target_attributes": { "attributes": [ "easy assemble", "easy clean", "storage space", "living room" ], "options": [ "red" ] }, "asin": "B07XYXC1Z7" }, { "task_id": "ws_B09QG84JT4_7891", "instruction": "i am looking for medium size, white color and short sleeve aloha beach shirt", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "l-white", "medium" ] }, "asin": "B09QG84JT4" }, { "task_id": "ws_B0987MDSG3_7892", "instruction": "i am looking for desktop having 8gb ram and 64gb ssd and core i5 processor.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "8g ram 64g ssd" ] }, "asin": "B0987MDSG3" }, { "task_id": "ws_B083VY7NS5_7893", "instruction": "i am looking for herbal ginger tea in small packs.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "15 count (pack of 2)" ] }, "asin": "B083VY7NS5" }, { "task_id": "ws_B08YNK3KD9_7894", "instruction": "i need a 3 ft fast charging lightning cable that is purple.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "purple", "3 ft" ] }, "asin": "B08YNK3KD9" }, { "task_id": "ws_B01J8S6X2I_7895", "instruction": "i need six feet of hdmi high performance cables in a ten pack", "target_attributes": { "attributes": [ "high performance" ], "options": [ "6 feet", "10-pack" ] }, "asin": "B01J8S6X2I" }, { "task_id": "ws_B092NH4PT6_7896", "instruction": "i am looking for women classic fit t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "women" ] }, "asin": "B092NH4PT6" }, { "task_id": "ws_B06XCKNR17_7897", "instruction": "i would like a quad core tablet.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B06XCKNR17" }, { "task_id": "ws_B09P1J4K9Z_7898", "instruction": "i would like a b04 toothbrush for kid's 6-12 sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "b04", "age 6-12" ] }, "asin": "B09P1J4K9Z" }, { "task_id": "ws_B09F9RM3LM_7899", "instruction": "i want wireless charging in white color", "target_attributes": { "attributes": [ "wireless charging" ], "options": [] }, "asin": "B09F9RM3LM" }, { "task_id": "ws_B081SWDLF6_7900", "instruction": "looking for lumbar support massage gaming chair choose colour yellow", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "yellow" ] }, "asin": "B081SWDLF6" }, { "task_id": "ws_B081SWDLF6_7901", "instruction": "i am looking for a grey home office desk chair that is height adjustable and has lumbar support.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "grey" ] }, "asin": "B081SWDLF6" }, { "task_id": "ws_B095XYGKVX_7902", "instruction": "i am interested in buying a screen protector which is tempered glass, and has rose gold color.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "rose gold" ] }, "asin": "B095XYGKVX" }, { "task_id": "ws_B09K3WGHPQ_7903", "instruction": "i'm looking for small high performance silicone watch bands that are quick release.", "target_attributes": { "attributes": [ "quick release", "high performance" ], "options": [ "small" ] }, "asin": "B09K3WGHPQ" }, { "task_id": "ws_B09MK8S41Y_7904", "instruction": "i am looking for a small long sleeve fashion hoodies & sweatshirts", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B09MK8S41Y" }, { "task_id": "ws_B08KT687HP_7905", "instruction": "i am interested in buying an artwork for the living room. i would love it in the artwork-02 color.", "target_attributes": { "attributes": [ "living room" ], "options": [ "artwork-02" ] }, "asin": "B08KT687HP" }, { "task_id": "ws_B000V1LXU4_7906", "instruction": "i want gluten free valley fresh 100% natural white chicken breast.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chicken breast" ] }, "asin": "B000V1LXU4" }, { "task_id": "ws_B09C8HN13D_7907", "instruction": "i would like a pair of size 8 shoes with a leather sole.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "8" ] }, "asin": "B09C8HN13D" }, { "task_id": "ws_B09L7WP5TR_7908", "instruction": "i want to buy a giant popsicle which is low calorie and fat free with orange flavor and is 51 ounce.", "target_attributes": { "attributes": [ "low calorie", "fat free" ], "options": [ "orange", "powder + powder, 51 ounce" ] }, "asin": "B09L7WP5TR" }, { "task_id": "ws_B096H8SXS2_7909", "instruction": "i am looking for gluten free original caramel perfect premium gourmet popcorn", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "original caramel" ] }, "asin": "B096H8SXS2" }, { "task_id": "ws_B09GJXM4DX_7910", "instruction": "i need some white bluetooth speakers that are easy to carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "white" ] }, "asin": "B09GJXM4DX" }, { "task_id": "ws_B0748FN9QT_7911", "instruction": "i'm looking for trail cameras its is easy to use it can batteries inlcuded.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "grey x1" ] }, "asin": "B0748FN9QT" }, { "task_id": "ws_B0090OWWYO_7912", "instruction": "i am looking for sindhi biryani spice powder that is easy to prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "sindhi biryani" ] }, "asin": "B0090OWWYO" }, { "task_id": "ws_B0090OWWYO_7913", "instruction": "i need 6 packs of bombay biryani easy prepare seasoning mix flavored punjabi yakhni pilau", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "punjabi yakhni pilau", "pack of 6" ] }, "asin": "B0090OWWYO" }, { "task_id": "ws_B07DKH94JR_7914", "instruction": "i am looking for a brown wood finish end table.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "brown" ] }, "asin": "B07DKH94JR" }, { "task_id": "ws_B07WRD84GY_7915", "instruction": "i am looking for feather color jogging pants having elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "feather" ] }, "asin": "B07WRD84GY" }, { "task_id": "ws_B09LS3RCZ2_7916", "instruction": "i am looking for a high quality and long lasting makeup kit for women.", "target_attributes": { "attributes": [ "long lasting", "high quality" ], "options": [] }, "asin": "B09LS3RCZ2" }, { "task_id": "ws_B087PVSGS4_7917", "instruction": "i need a size 6 closed toe high heel pump shoe. the color should be cheetah leopard red.", "target_attributes": { "attributes": [ "high heel", "closed toe" ], "options": [ "cheetah leopard red", "6" ] }, "asin": "B087PVSGS4" }, { "task_id": "ws_B07CBKJ7TS_7918", "instruction": "i am looking for resealable snak club antioxidant trail mix. 5.5oz packs of six.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "1.37 pound (pack of 1)" ] }, "asin": "B07CBKJ7TS" }, { "task_id": "ws_B093KVXNYS_7919", "instruction": "i want a travel organiser for blouse hosiery underwear lingeries laundry bag", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093KVXNYS" }, { "task_id": "ws_B00CQB2VR6_7920", "instruction": "i am looking for warm film video lighting kit for my digital photography. i prefer the 3200k lighting with 2400 watt", "target_attributes": { "attributes": [ "digital photography" ], "options": [] }, "asin": "B00CQB2VR6" }, { "task_id": "ws_B095S1MVRG_7921", "instruction": "look for a long lasting shaving cream that is fragrance free. i also have a sensitive skin.", "target_attributes": { "attributes": [ "fragrance free", "long lasting", "sensitive skin" ], "options": [] }, "asin": "B095S1MVRG" }, { "task_id": "ws_B098JFR3FK_7922", "instruction": "i'm looking for an easy to use electric foot grinder in blue.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "blue" ] }, "asin": "B098JFR3FK" }, { "task_id": "ws_B09MSH8K6T_7923", "instruction": "i am ordering a grey plus size women long sleeved t -shirt .", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x02-gray" ] }, "asin": "B09MSH8K6T" }, { "task_id": "ws_B08PKFH373_7924", "instruction": "i would like a aircraft cake topper for a kids birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "aircraft" ] }, "asin": "B08PKFH373" }, { "task_id": "ws_B09CDRDPRX_7925", "instruction": "i am looking for a grey full daybed with 2 drawers and should be made of a solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "full daybed with 2 drawers" ] }, "asin": "B09CDRDPRX" }, { "task_id": "ws_B099DQDTN9_7926", "instruction": "i am looking for a easy to use hair extension that has elastic rubber band. and i choose the curly bun with strawberry blonde color", "target_attributes": { "attributes": [ "easy use" ], "options": [ "27#(strawberry blonde)", "curly bun" ] }, "asin": "B099DQDTN9" }, { "task_id": "ws_B099DQDTN9_7927", "instruction": "i am looking for a tousled bun hairpieces for hair salon", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "tousled bun" ] }, "asin": "B099DQDTN9" }, { "task_id": "ws_B0977NLTWY_7928", "instruction": "i am looking for a ladder bookshelf having steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B0977NLTWY" }, { "task_id": "ws_B09C1D546R_7929", "instruction": "i am looking for a wall mounted mirror for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09C1D546R" }, { "task_id": "ws_B086D53WFX_7930", "instruction": "i need a eco friendly green tea mask for sensitive sikn", "target_attributes": { "attributes": [ "eco friendly", "green tea", "sensitive skin" ], "options": [] }, "asin": "B086D53WFX" }, { "task_id": "ws_B07TVHJ7KY_7931", "instruction": "looking for loose fit medium size casual basic tee shirts", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "medium" ] }, "asin": "B07TVHJ7KY" }, { "task_id": "ws_B08BYH6J6Z_7932", "instruction": "i would like a pair of size 5 leather oxfords with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "porcelain glazed croco | leather", "5" ] }, "asin": "B08BYH6J6Z" }, { "task_id": "ws_B0989DND8F_7933", "instruction": "i'm looking for a silicon exfoliating body scrubber which would be easy to use.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "blue+yellow" ] }, "asin": "B0989DND8F" }, { "task_id": "ws_B09FPRSY7Q_7934", "instruction": "i need a high power soundbar with stereo sound. it should include the audio line.", "target_attributes": { "attributes": [ "high power", "stereo sound" ], "options": [ "audio line included" ] }, "asin": "B09FPRSY7Q" }, { "task_id": "ws_B09B6KYFB8_7935", "instruction": "i like soy wax in freesia & gardenia", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "freesia & gardenia" ] }, "asin": "B09B6KYFB8" }, { "task_id": "ws_B01DK5GE1U_7936", "instruction": "i'm looking for a size 48 in vanity light comtemporary cylinder.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "48 in" ] }, "asin": "B01DK5GE1U" }, { "task_id": "ws_B0185HLNIW_7937", "instruction": "i am looking for an easy to clean wobble stool for kids, i would like a 20 inch seat, and black in color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "20\" h" ] }, "asin": "B0185HLNIW" }, { "task_id": "ws_B08JPVZG7X_7938", "instruction": "i am looking for kids blanket of size 50x60 inch for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "50x60 inch" ] }, "asin": "B08JPVZG7X" }, { "task_id": "ws_B09DDCP3PR_7939", "instruction": "i want wildcat leopard impo stretch boots with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "wildcat leopard" ] }, "asin": "B09DDCP3PR" }, { "task_id": "ws_B09P8L6DKB_7940", "instruction": "i need red party supplies", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "red" ] }, "asin": "B09P8L6DKB" }, { "task_id": "ws_B078X4FYKH_7941", "instruction": "i want a classic fit best cruise director ever shirt for men.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "men" ] }, "asin": "B078X4FYKH" }, { "task_id": "ws_B001QZZ1J8_7942", "instruction": "i would like a pack of six chocolate cake mixes that are non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "chocolate", "12 ounce (pack of 6)" ] }, "asin": "B001QZZ1J8" }, { "task_id": "ws_B07YXYCXSG_7943", "instruction": "i am looking for women's sandals of 8 size having leather sole.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "8" ] }, "asin": "B07YXYCXSG" }, { "task_id": "ws_B08RNCQN19_7944", "instruction": "i would like a portable bluetooth speaker with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B08RNCQN19" }, { "task_id": "ws_B089GWSZ56_7945", "instruction": "i am looking for a wireless hidden camera that can be easily used with shirt's pocket", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B089GWSZ56" }, { "task_id": "ws_B093KMSTW2_7946", "instruction": "i'm looking for golden decorated birthday cupcake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "golden" ] }, "asin": "B093KMSTW2" }, { "task_id": "ws_B0774GXDMB_7947", "instruction": "i would like 42 bags of 100% colombian rich and creamy single serve coffee cups.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "100% colombian, donut shop, morning blen...", "42 count (pack of 2)" ] }, "asin": "B0774GXDMB" }, { "task_id": "ws_B0774GXDMB_7948", "instruction": "i want a 200 count pack of hot cocoa cups that is rich and creamy. ensure that it is gluten free.", "target_attributes": { "attributes": [ "rich creamy", "gluten free" ], "options": [ "200 count (pack of 1)" ] }, "asin": "B0774GXDMB" }, { "task_id": "ws_B082YZ2M39_7949", "instruction": "i am looking for a large light blue dress shirt that is long sleeved", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "d-light blue no tie", "large" ] }, "asin": "B082YZ2M39" }, { "task_id": "ws_B09PRNYHKP_7950", "instruction": "i want size 7 ankle strap in metal", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "7" ] }, "asin": "B09PRNYHKP" }, { "task_id": "ws_B09G36DP9B_7951", "instruction": "i'm looking for a 26cm hand painted wicker woven basket.", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "26cm" ] }, "asin": "B09G36DP9B" }, { "task_id": "ws_B09T39SXP5_7952", "instruction": "i'm looking for a carbon fiber tripods for cameras", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B09T39SXP5" }, { "task_id": "ws_B073RK32S6_7953", "instruction": "i would like a small rustic brown tv stand made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "rustic brown", "small" ] }, "asin": "B073RK32S6" }, { "task_id": "ws_B09SKR3H1J_7954", "instruction": "i'm looking for solid wooden furniture for kitchen, dinning and table chair set.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "rustic brown" ] }, "asin": "B09SKR3H1J" }, { "task_id": "ws_B092VN7WGH_7955", "instruction": "i'm looking for some leak proof, easy to clean travel bodies that are non-toxic and have hearts on them.", "target_attributes": { "attributes": [ "leak proof", "non toxic", "easy clean", "travel bottles" ], "options": [ "heart style" ] }, "asin": "B092VN7WGH" }, { "task_id": "ws_B08Y8HB36D_7956", "instruction": "i need some beige storage bins that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "beige 16\"" ] }, "asin": "B08Y8HB36D" }, { "task_id": "ws_B097C7F3PF_7957", "instruction": "i would like a variety pack of low calorie microwave popcorn.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "variety pack" ] }, "asin": "B097C7F3PF" }, { "task_id": "ws_B08PQ792TD_7958", "instruction": "i am looking for candle having jungle guava scent and should be lead free.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "jungle guava" ] }, "asin": "B08PQ792TD" }, { "task_id": "ws_B08PQ792TD_7959", "instruction": "i want a tropic mist lead free single wick candle.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "tropic mist" ] }, "asin": "B08PQ792TD" }, { "task_id": "ws_B08KRQ6JBN_7960", "instruction": "i'm looking for pure mulberry silk underwear for men.", "target_attributes": { "attributes": [ "elastic waistband", "classic fit" ], "options": [] }, "asin": "B08KRQ6JBN" }, { "task_id": "ws_B0953QCJ3H_7961", "instruction": "looking for tatami floor mat for living room also choose size180x200cm(71*79inch)", "target_attributes": { "attributes": [ "living room" ], "options": [ "180x200cm(71*79inch)" ] }, "asin": "B0953QCJ3H" }, { "task_id": "ws_B08THG9FDG_7962", "instruction": "i am looking for ultra hd motion detection surveillance dome camera color black size :6mp wdr 2.8 mm", "target_attributes": { "attributes": [ "ultra hd", "motion detection" ], "options": [ "black", "6mp wdr 2.8mm" ] }, "asin": "B08THG9FDG" }, { "task_id": "ws_B097C6SVG6_7963", "instruction": "i need to buy a light weight, machine washable tank top in brown, size small.", "target_attributes": { "attributes": [ "light weight", "machine washable" ], "options": [ "z5-brown", "small" ] }, "asin": "B097C6SVG6" }, { "task_id": "ws_B01DQ8VYHA_7964", "instruction": "i would like a source vitamin soft drink mix.", "target_attributes": { "attributes": [ "source vitamin" ], "options": [] }, "asin": "B01DQ8VYHA" }, { "task_id": "ws_B077V2Q32W_7965", "instruction": "i would like a 2x poolside sebastion plaid shirt that is easy to take care of.", "target_attributes": { "attributes": [ "easy care" ], "options": [ "poolside sebastion plaid", "2x" ] }, "asin": "B077V2Q32W" }, { "task_id": "ws_B09NBWK214_7966", "instruction": "i am looing for a fog color hair drying towels which is easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [ "fog" ] }, "asin": "B09NBWK214" }, { "task_id": "ws_B09129QLGX_7967", "instruction": "i need to buy a queen sized duvet cover. i want one that's machine washable.", "target_attributes": { "attributes": [ "queen size", "machine washable" ], "options": [ "queen" ] }, "asin": "B09129QLGX" }, { "task_id": "ws_B00L7S3FJ2_7968", "instruction": "i'm looking for a cruelty free body wash, preferably citrus and mint scent.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "citrus and mint" ] }, "asin": "B00L7S3FJ2" }, { "task_id": "ws_B07HZHJGY7_7969", "instruction": "i am looking for a tablet of plum color having quad core processor.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "plum" ] }, "asin": "B07HZHJGY7" }, { "task_id": "ws_B095KSXGZX_7970", "instruction": "i am looking for a roller shade that is gray and for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout classic gray" ] }, "asin": "B095KSXGZX" }, { "task_id": "ws_B095KSXGZX_7971", "instruction": "i want to find white blackout window shades that i can put in my living room, and they need to be 2 inches in width and 64 inches in height.", "target_attributes": { "attributes": [ "white item", "living room" ], "options": [ "blackout white", "74 1 | 2\"w x 64\"h" ] }, "asin": "B095KSXGZX" }, { "task_id": "ws_B01NAWGUXD_7972", "instruction": "i need a mid century coffee table.", "target_attributes": { "attributes": [ "mid century" ], "options": [] }, "asin": "B01NAWGUXD" }, { "task_id": "ws_B08NSQG7P3_7973", "instruction": "i'm looking for a three pack of grey pendant lights for my dining room.", "target_attributes": { "attributes": [ "pendant light", "dining room" ], "options": [ "grey,3 pack" ] }, "asin": "B08NSQG7P3" }, { "task_id": "ws_B09B3Q8T5W_7974", "instruction": "i'm looking for a high definition wireless bluetooth radio with fast charging capacity. also choose white star one.", "target_attributes": { "attributes": [ "fast charging", "high definition", "wireless bluetooth" ], "options": [ "white star" ] }, "asin": "B09B3Q8T5W" }, { "task_id": "ws_B08DR1NNJ4_7975", "instruction": "i am interested in buying a universal remote control which has batteries included and is compatible with smart tvs.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B08DR1NNJ4" }, { "task_id": "ws_B09B2164QM_7976", "instruction": "i would like some 12 inch balayage dark brown mixed with walnut brown and strawberry blonde hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "balayage dark brown mixed with walnut brown and strawberry blonde #b2 | 3 | 27", "12 inch" ] }, "asin": "B09B2164QM" }, { "task_id": "ws_B07RC19HNW_7977", "instruction": "i would like a pack of dome cameras that have motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "1 pack" ] }, "asin": "B07RC19HNW" }, { "task_id": "ws_B09NR8NCTD_7978", "instruction": "i want to find a barber cape that can be used in a hair salon. it needs to have a pepperoni pizza pattern to it.", "target_attributes": { "attributes": [ "hair cutting", "hair salon" ], "options": [ "pepperoni pizza" ] }, "asin": "B09NR8NCTD" }, { "task_id": "ws_B091MXTQYH_7979", "instruction": "i would like some travel bottles for my cosmetics.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [] }, "asin": "B091MXTQYH" }, { "task_id": "ws_B01HHKB888_7980", "instruction": "i need an ac adapter with output protection", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B01HHKB888" }, { "task_id": "ws_B06XD34LMS_7981", "instruction": "i am searching for a bronze finish lighting fixture.", "target_attributes": { "attributes": [ "bronze finish", "light fixture" ], "options": [ "bronze | dark" ] }, "asin": "B06XD34LMS" }, { "task_id": "ws_B09DK9G19W_7982", "instruction": "i'm looking for elastic bands that are easily adjustable, please. something good for beginners", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09DK9G19W" }, { "task_id": "ws_B09Q2Z5HBF_7983", "instruction": "i'm looking for a 4g lte tablet", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09Q2Z5HBF" }, { "task_id": "ws_B07953TM6H_7984", "instruction": "i would like a extra large dark blue sweatshirt that is long sleeved.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "dark blue", "x-large" ] }, "asin": "B07953TM6H" }, { "task_id": "ws_B09965W7GD_7985", "instruction": "i am searching for 2 packs of gluten free chewy chocolate chip granola bars", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "2 pack" ] }, "asin": "B09965W7GD" }, { "task_id": "ws_B09965W7GD_7986", "instruction": "i am looking for 3 packs gluten free chocolate bars.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "3 pack" ] }, "asin": "B09965W7GD" }, { "task_id": "ws_B07D3RSVLM_7987", "instruction": "i am looking for a contemporary home office chair", "target_attributes": { "attributes": [ "contemporary design" ], "options": [] }, "asin": "B07D3RSVLM" }, { "task_id": "ws_B0936BZ1Q2_7988", "instruction": "i need some hair extensions that are dark brown and 18 inches", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark brown #2", "18 inch" ] }, "asin": "B0936BZ1Q2" }, { "task_id": "ws_B07NL3VBYK_7989", "instruction": "i'm looking for a rug with contemporary design in black/ivory color sized 10x14 ft", "target_attributes": { "attributes": [ "contemporary design" ], "options": [] }, "asin": "B07NL3VBYK" }, { "task_id": "ws_B07NL3VBYK_7990", "instruction": "i am looking for contemporary designed rug of 3.ftx 5ft.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "3 ft x 5 ft" ] }, "asin": "B07NL3VBYK" }, { "task_id": "ws_B07NL3VBYK_7991", "instruction": "i need an 8ft round contemporary area rug that is silver and ivory.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "silver | ivory", "8 ft round" ] }, "asin": "B07NL3VBYK" }, { "task_id": "ws_B005IGVXRU_7992", "instruction": "i am looking for blue color digital camera having optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "blue" ] }, "asin": "B005IGVXRU" }, { "task_id": "ws_B09L1GFM58_7993", "instruction": "i want a black walnut entryway console table with metal legs and 40 inches long.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "40 inches" ] }, "asin": "B09L1GFM58" }, { "task_id": "ws_B09MVFYD7C_7994", "instruction": "i want a pink water dental oral irrigator for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "pink" ] }, "asin": "B09MVFYD7C" }, { "task_id": "ws_B08YF51NZ8_7995", "instruction": "i'm looking for a leak proof soap container for kids.", "target_attributes": { "attributes": [ "leak proof" ], "options": [] }, "asin": "B08YF51NZ8" }, { "task_id": "ws_B09PRLF1YQ_7996", "instruction": "i am looking for wireless bluethooth for my compact radios and stereos- hands free electronic.", "target_attributes": { "attributes": [ "hands free", "wireless bluetooth" ], "options": [] }, "asin": "B09PRLF1YQ" }, { "task_id": "ws_B09QPK32M1_7997", "instruction": "i am looking for a 7.5 no. high heel for women", "target_attributes": { "attributes": [ "high heel" ], "options": [ "7.5" ] }, "asin": "B09QPK32M1" }, { "task_id": "ws_B099F1QYFM_7998", "instruction": "i am looking for a high quality hairpieces. also choose 250# darkest brown with 50% synthetic grey color and 8x10''-80% light density in size", "target_attributes": { "attributes": [ "high quality" ], "options": [ "250# darkest brown with 50% synthetic grey", "8x10''-80% light density" ] }, "asin": "B099F1QYFM" }, { "task_id": "ws_B08DKK753Y_7999", "instruction": "i'm looking for a black storage case for my hair dryer.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "black" ] }, "asin": "B08DKK753Y" }, { "task_id": "ws_B08KXXM3QK_8000", "instruction": "i am looking for quick drying x-large size leggings.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "x-large" ] }, "asin": "B08KXXM3QK" }, { "task_id": "ws_B09Q31YKPN_8001", "instruction": "i need some women's shoes with a non-slip rubber sole. look for them in white, size eleven.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "white", "11" ] }, "asin": "B09Q31YKPN" }, { "task_id": "ws_B08BJCGY82_8002", "instruction": "i need a shampoo set that is paraben free", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B08BJCGY82" }, { "task_id": "ws_B09L5SHDG9_8003", "instruction": "i am interested in buying a grey colored rocking chair with memory foam and lumbar support.", "target_attributes": { "attributes": [ "lumbar support", "memory foam" ], "options": [ "grey" ] }, "asin": "B09L5SHDG9" }, { "task_id": "ws_B07V65SLS7_8004", "instruction": "i am looking for a chocolate gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B07V65SLS7" }, { "task_id": "ws_B085PL9LP4_8005", "instruction": "i am looking for clinically proven deodorants . the men's deodorants with anitperspirants -long lasting performance and z-discontinued.", "target_attributes": { "attributes": [ "clinically proven", "long lasting" ], "options": [ "z- discontinued" ] }, "asin": "B085PL9LP4" }, { "task_id": "ws_B08G1F4RPC_8006", "instruction": "i need a high power sound bar in a natural color", "target_attributes": { "attributes": [ "high power" ], "options": [ "natural" ] }, "asin": "B08G1F4RPC" }, { "task_id": "ws_B095HZJZS2_8007", "instruction": "i would like a 201 by 153 cm high definition protection screen.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "201*153cm" ] }, "asin": "B095HZJZS2" }, { "task_id": "ws_B07YXG3FX7_8008", "instruction": "i would like a women's extra large heather grey cotton tank top.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "heather grey", "women", "x-large" ] }, "asin": "B07YXG3FX7" }, { "task_id": "ws_B07MDLKPXY_8009", "instruction": "i'm looking for a universal remote control with batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B07MDLKPXY" }, { "task_id": "ws_B09RCHJTN7_8010", "instruction": "i am looking for a quad core desktop that has 16gb of ram and 2tb storage", "target_attributes": { "attributes": [ "quad core" ], "options": [ "16gb ram | 2tb ssd" ] }, "asin": "B09RCHJTN7" }, { "task_id": "ws_B01CZVEUIE_8011", "instruction": "i need a 1.6ft gold cable usb c for fast charging", "target_attributes": { "attributes": [ "fast charging", "usb port" ], "options": [ "gold", "1", "1.6ft" ] }, "asin": "B01CZVEUIE" }, { "task_id": "ws_B09QG12W87_8012", "instruction": "i want children's mousse teeth whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09QG12W87" }, { "task_id": "ws_B09JGQZ3VQ_8013", "instruction": "i'm looking for a outdoor camera with optical zoom and ultra hd", "target_attributes": { "attributes": [ "ultra hd", "optical zoom" ], "options": [] }, "asin": "B09JGQZ3VQ" }, { "task_id": "ws_B09LY9HDNL_8014", "instruction": "i drink for red wine quick release for me", "target_attributes": { "attributes": [ "quick release" ], "options": [ "wine red" ] }, "asin": "B09LY9HDNL" }, { "task_id": "ws_B08286X2WQ_8015", "instruction": "i need 12 packs of gluten free cajun rice mix.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "12" ] }, "asin": "B08286X2WQ" }, { "task_id": "ws_B08DMYJMB8_8016", "instruction": "i would like a black smartwatch quick release band.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "black-red" ] }, "asin": "B08DMYJMB8" }, { "task_id": "ws_B07KWHNHF6_8017", "instruction": "i am looking for 3t size, olive color cotton heather men shirts .the cloth must be machine wash.", "target_attributes": { "attributes": [ "machine wash", "cotton heather" ], "options": [ "olive", "3t" ] }, "asin": "B07KWHNHF6" }, { "task_id": "ws_B08G1SZVW6_8018", "instruction": "i need heavy duty yellow bed frames.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "yellow" ] }, "asin": "B08G1SZVW6" }, { "task_id": "ws_B07QQKCQD7_8019", "instruction": "i am in need of 8.5 sized pink color rubber sole women round toe lace up oxford shoes", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "pink", "8.5" ] }, "asin": "B07QQKCQD7" }, { "task_id": "ws_B09PYRFKT9_8020", "instruction": "i want a high quality, eco friendly cart for a beauty salon.", "target_attributes": { "attributes": [ "high quality", "eco friendly", "beauty salon" ], "options": [] }, "asin": "B09PYRFKT9" }, { "task_id": "ws_B09445M1TR_8021", "instruction": "i would like some beige throw pillow covers for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige" ] }, "asin": "B09445M1TR" }, { "task_id": "ws_B08QJC9D1K_8022", "instruction": "i would like a carrying case for my vita.", "target_attributes": { "attributes": [ "carrying case" ], "options": [] }, "asin": "B08QJC9D1K" }, { "task_id": "ws_B085S7F1DB_8023", "instruction": "i am interested in buying a desktop pc which is high performance and has a quad core i5 processor.", "target_attributes": { "attributes": [ "high performance", "core i5", "quad core" ], "options": [] }, "asin": "B085S7F1DB" }, { "task_id": "ws_B08CXMCCTQ_8024", "instruction": "im looking for a synthetic hair ponytail in the color ash blonde.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "ash blonde" ] }, "asin": "B08CXMCCTQ" }, { "task_id": "ws_B0855DYXTG_8025", "instruction": "my grandma use sugar free honey gram flavor", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "honey graham" ] }, "asin": "B0855DYXTG" }, { "task_id": "ws_B08CXS6ZZ7_8026", "instruction": "i am looking for back exfoliating scrubber easy use in purple", "target_attributes": { "attributes": [ "easy use" ], "options": [ "purple" ] }, "asin": "B08CXS6ZZ7" }, { "task_id": "ws_B09MYF5VVL_8027", "instruction": "i need cupcake toppers for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B09MYF5VVL" }, { "task_id": "ws_B0731XBXX8_8028", "instruction": "i am looking for a pair of easy to use stainless steel monitoring headphones.", "target_attributes": { "attributes": [ "easy use", "stainless steel" ], "options": [] }, "asin": "B0731XBXX8" }, { "task_id": "ws_B0195C0HKQ_8029", "instruction": "i would like a high glossy white desk with metal legs.", "target_attributes": { "attributes": [ "white item", "high gloss", "white finish", "metal legs" ], "options": [ "glossy white" ] }, "asin": "B0195C0HKQ" }, { "task_id": "ws_B09P5HZGZF_8030", "instruction": "i would like a desktop dual band mini with a intel core i7 and 64 gigs of ram.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "intel core i7-9850h", "64g ram 512g ssd 2tb hdd" ] }, "asin": "B09P5HZGZF" }, { "task_id": "ws_B09P5HZGZF_8031", "instruction": "i'm looking for a mini computer with 32g ram, 512gb sdd and 1tb hd with a intel core i9 for high definition", "target_attributes": { "attributes": [ "high definition" ], "options": [ "intel core i9-10880h", "32g ram 512g ssd 1tb hdd" ] }, "asin": "B09P5HZGZF" }, { "task_id": "ws_B09P5HZGZF_8032", "instruction": "i would like a desktop mini with a dual band intel i7 core and with 128 g of ssd.", "target_attributes": { "attributes": [ "dual band" ], "options": [ "intel core i7-9850h", "8g ram 128g ssd" ] }, "asin": "B09P5HZGZF" }, { "task_id": "ws_B088PHWLNL_8033", "instruction": "i'm looking for a easy install protective band strap in gray color", "target_attributes": { "attributes": [ "easy install" ], "options": [ "gray" ] }, "asin": "B088PHWLNL" }, { "task_id": "ws_B09BB45XYV_8034", "instruction": "i would like a long lasting minocular for bird watching.", "target_attributes": { "attributes": [ "long lasting", "bird watching" ], "options": [] }, "asin": "B09BB45XYV" }, { "task_id": "ws_B09PHLMDHC_8035", "instruction": "looking for a x-large in red slim fit pants for valentine's day", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "red", "x-large" ] }, "asin": "B09PHLMDHC" }, { "task_id": "ws_B0831RHZP2_8036", "instruction": "i would like a 15 count herbal tea pack that is non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "15 count" ] }, "asin": "B0831RHZP2" }, { "task_id": "ws_B0831RHZP2_8037", "instruction": "i would like a box of 15 palace tea that is caffeine free.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "palace", "15 count (pack of 1)" ] }, "asin": "B0831RHZP2" }, { "task_id": "ws_B0831RHZP2_8038", "instruction": "i want a 3 pack of gluten free paromi cinnamon chai rooibos.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "15 count (pack of 3)" ] }, "asin": "B0831RHZP2" }, { "task_id": "ws_B0831RHZP2_8039", "instruction": "i am looking for organic caffeine-free chai blends rich rooibos and a sultry blend of spices.; piquant cloves, nutmeg, and cinnamon mingle with sweet allspice, ginger, and a kiss of cardamom organic paromi cinnamon chai rooibos, a chamomile tea,numi which has the floral, herbaceous, and rich herbal teas that's craving. 15 count pack of 1 preferable.", "target_attributes": { "attributes": [ "caffeine free", "certified organic", "non gmo", "gluten free" ], "options": [ "herbal", "15 count (pack of 1)" ] }, "asin": "B0831RHZP2" }, { "task_id": "ws_B083FTXVYC_8040", "instruction": "i am looking for multi018 color short sleeve shirts.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "multi018" ] }, "asin": "B083FTXVYC" }, { "task_id": "ws_B09N968TTK_8041", "instruction": "i'm looking for a dual layer window 70% blackout hemp fabric zebra roller shades.", "target_attributes": { "attributes": [ "living room" ], "options": [ "70% blackout-violet" ] }, "asin": "B09N968TTK" }, { "task_id": "ws_B087MD5MYH_8042", "instruction": "i am looking for a high speed laptop wall charger of black color.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "black(100w)" ] }, "asin": "B087MD5MYH" }, { "task_id": "ws_B07R18DG65_8043", "instruction": "i am looking for lemon cake perfume body mist, in a 4 fl oz container.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B07R18DG65" }, { "task_id": "ws_B08LP7K6G7_8044", "instruction": "i would like a medium dark pink robe made from a soft material.", "target_attributes": { "attributes": [ "soft material" ], "options": [ "dark pink", "medium" ] }, "asin": "B08LP7K6G7" }, { "task_id": "ws_B09FQ8LHD3_8045", "instruction": "i am looking for a 3x-large long sleeve t shirts for man", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "3x-large" ] }, "asin": "B09FQ8LHD3" }, { "task_id": "ws_B06WLKRWCH_8046", "instruction": "i am looking for a quad core tablet that is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "quad core" ], "options": [] }, "asin": "B06WLKRWCH" }, { "task_id": "ws_B093YSVY9K_8047", "instruction": "i want a set of 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSVY9K" }, { "task_id": "ws_B09FPJ3DLB_8048", "instruction": "i am looking for a height adjustable makeup mirror for cutting hair. it should come with a light.", "target_attributes": { "attributes": [ "height adjustable", "hair cutting" ], "options": [ "with light" ] }, "asin": "B09FPJ3DLB" }, { "task_id": "ws_B09N6ZLMRY_8049", "instruction": "i am looking for a nightstand that is easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09N6ZLMRY" }, { "task_id": "ws_B09GM11T53_8050", "instruction": "i am looking for heavy duty flip case for samsung galaxy mobile and color should be olive.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "olive" ] }, "asin": "B09GM11T53" }, { "task_id": "ws_B00RLUQ2YK_8051", "instruction": "i need cruelty free body lotion that is medium dark olive color", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "medium dark olive" ] }, "asin": "B00RLUQ2YK" }, { "task_id": "ws_B09DR6BS9P_8052", "instruction": "i am looking for long lasting hair dye if blue and black color.", "target_attributes": { "attributes": [ "long lasting", "hair dye" ], "options": [ "ash - 1.1 blue black" ] }, "asin": "B09DR6BS9P" }, { "task_id": "ws_B07XJ29K93_8053", "instruction": "find me a joe west character flash case compatible with apple phone", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "joe west" ] }, "asin": "B07XJ29K93" }, { "task_id": "ws_B09QKSHFCB_8054", "instruction": "i want a 9 pack of hairrebirth herbal spray for hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "9pcs" ] }, "asin": "B09QKSHFCB" }, { "task_id": "ws_B09BKJ813P_8055", "instruction": "i would like a pair of 38 mens grey hiking shoes with a rubber outsole.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "grey", "38 m eu" ] }, "asin": "B09BKJ813P" }, { "task_id": "ws_B093WNXZZB_8056", "instruction": "i'm looking for an easy to use stainless steel nail clipper set.", "target_attributes": { "attributes": [ "easy use", "stainless steel" ], "options": [] }, "asin": "B093WNXZZB" }, { "task_id": "ws_B073Q2PS8Q_8057", "instruction": "i am looking for non toxic lip gloss that has organic certificate. please select the rose one", "target_attributes": { "attributes": [ "certified organic", "non toxic" ], "options": [ "ros\u00e9" ] }, "asin": "B073Q2PS8Q" }, { "task_id": "ws_B075GFMP3C_8058", "instruction": "i'm looking for a replacement remote control for my sharp aquos tv that comes with aaa batteries.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B075GFMP3C" }, { "task_id": "ws_B09QTWZV8L_8059", "instruction": "i am looking for a snowy white high speed wifi booster.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "snowy white" ] }, "asin": "B09QTWZV8L" }, { "task_id": "ws_B0963ZR8VH_8060", "instruction": "i want a xyyssm barber chair for my beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B0963ZR8VH" }, { "task_id": "ws_B09N3RLDK5_8061", "instruction": "i am looking for lobsters ready eat and size 2-pack(1 box of each)", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "2 - pack (1 box of each)" ] }, "asin": "B09N3RLDK5" }, { "task_id": "ws_B08CD4Y4R1_8062", "instruction": "i would like a high resolution background that is 7 by 5 ft.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "7x5ft" ] }, "asin": "B08CD4Y4R1" }, { "task_id": "ws_B09M6TR17G_8063", "instruction": "find me a nightstand in off-white color with storage space", "target_attributes": { "attributes": [ "storage space" ], "options": [ "off-white" ] }, "asin": "B09M6TR17G" }, { "task_id": "ws_B07Q2PC166_8064", "instruction": "i am looking for earbud headphone having deep bass stereo sound.please choose black color.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "black" ] }, "asin": "B07Q2PC166" }, { "task_id": "ws_B003U3A428_8065", "instruction": "i would like a surveillance camera with aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B003U3A428" }, { "task_id": "ws_B07MJM2ZKY_8066", "instruction": "i am looking for stainless steel hair cutting scissors of 7 inch size.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "7 inch" ] }, "asin": "B07MJM2ZKY" }, { "task_id": "ws_B08MXJXM8L_8067", "instruction": "i would like a black lavender candle made from soy.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "black lavender" ] }, "asin": "B08MXJXM8L" }, { "task_id": "ws_B07RZVLVBV_8068", "instruction": "i would like a chrome power amplifier", "target_attributes": { "attributes": [ "power amplifier" ], "options": [ "chrome pushbuttons, chrome dot knobs" ] }, "asin": "B07RZVLVBV" }, { "task_id": "ws_B0773RT6TY_8069", "instruction": "i would like a trail mix that is almond cranberry crunch and is non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "almond cranberry crunch" ] }, "asin": "B0773RT6TY" }, { "task_id": "ws_B07CHBR14C_8070", "instruction": "i need a high speed black usb cable", "target_attributes": { "attributes": [ "high speed" ], "options": [ "black" ] }, "asin": "B07CHBR14C" }, { "task_id": "ws_B08TQTZYT7_8071", "instruction": "i want an easy assemble wampat farmhouse coffee table with storage drawers, modern coffee table for living room, center table with double storage spaces, metal legs, grey,", "target_attributes": { "attributes": [ "easy assemble", "metal legs", "storage space", "living room" ], "options": [] }, "asin": "B08TQTZYT7" }, { "task_id": "ws_B07K474FMH_8072", "instruction": "i'm looking for nail drill bits for nail art", "target_attributes": { "attributes": [ "nail art" ], "options": [] }, "asin": "B07K474FMH" }, { "task_id": "ws_B002NU8W1O_8073", "instruction": "i'm looking for modern kitchen with the latest design.", "target_attributes": { "attributes": [ "brushed nickel", "dining room", "living room" ], "options": [] }, "asin": "B002NU8W1O" }, { "task_id": "ws_B086X5DCDB_8074", "instruction": "i am looking for amber vanila scented shampoo and conditioner set containing argan oil.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "amber vanila" ] }, "asin": "B086X5DCDB" }, { "task_id": "ws_B01L9HQ1IM_8075", "instruction": "i am looking for a sulfate free conditioner", "target_attributes": { "attributes": [ "sulfate free" ], "options": [] }, "asin": "B01L9HQ1IM" }, { "task_id": "ws_B07VY9JYJW_8076", "instruction": "i am looking for a linen pants with elastic waist. and i choose the xx-large size with wine color", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "wine", "xx-large" ] }, "asin": "B07VY9JYJW" }, { "task_id": "ws_B06XT3R53B_8077", "instruction": "i am looking for aaa batteries remote control for tv.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B06XT3R53B" }, { "task_id": "ws_B017AHH0IK_8078", "instruction": "i want to buy ballet shoes which have rubber sole in grey suede color and a size of 6.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "grey suede", "6" ] }, "asin": "B017AHH0IK" }, { "task_id": "ws_B08DFRWV7B_8079", "instruction": "i am looking for a women's medium long sleeve sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B08DFRWV7B" }, { "task_id": "ws_B083WNYPFC_8080", "instruction": "i would like a 2 pound bag of individually wrapped candy.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B083WNYPFC" }, { "task_id": "ws_B09MZFPKXZ_8081", "instruction": "find me a paraben free long lasting lip gloss", "target_attributes": { "attributes": [ "paraben free", "long lasting" ], "options": [] }, "asin": "B09MZFPKXZ" }, { "task_id": "ws_B00HKIBEMS_8082", "instruction": "i am looking for a gluten free rice ramen & miso soup. choose a pack of 10 with jade pearl color", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "jade pearl", "2.8 ounce (pack of 10)" ] }, "asin": "B00HKIBEMS" }, { "task_id": "ws_B096XJ6N2Z_8083", "instruction": "i want to buy ceiling chandeliers which are stainless steel, and suitable for dining room, while the color should be 345-variable light.", "target_attributes": { "attributes": [ "stainless steel", "dining room" ], "options": [ "345-variabel light" ] }, "asin": "B096XJ6N2Z" }, { "task_id": "ws_B09JMVRXRG_8084", "instruction": "i am looking for arabic anti aging coffee scrub.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "himalayan salt" ] }, "asin": "B09JMVRXRG" }, { "task_id": "ws_B09SFXQ9QG_8085", "instruction": "i am looking for green tea face masks for adults.", "target_attributes": { "attributes": [ "green tea" ], "options": [ "b#-50pc" ] }, "asin": "B09SFXQ9QG" }, { "task_id": "ws_B093T18DFQ_8086", "instruction": "looking for laundry bags with imported zipper", "target_attributes": { "attributes": [ "imported zipper", "laundry bag" ], "options": [] }, "asin": "B093T18DFQ" }, { "task_id": "ws_B09H6MNXFG_8087", "instruction": "i am looking for large size sweater pullover having long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B09H6MNXFG" }, { "task_id": "ws_B01F1760HS_8088", "instruction": "i am looking for a travel size whitening toothpaste.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B01F1760HS" }, { "task_id": "ws_B087YS6TRY_8089", "instruction": "i'm looking for a large butt lifting women workout short.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "large" ] }, "asin": "B087YS6TRY" }, { "task_id": "ws_B09JGSWVJH_8090", "instruction": "i am looking for a lead free limoncello scented jar candle that uses soy wax.", "target_attributes": { "attributes": [ "lead free", "soy wax" ], "options": [ "limoncello 21704" ] }, "asin": "B09JGSWVJH" }, { "task_id": "ws_B0788C3L56_8091", "instruction": "i am looking for a dresser that is mid century style", "target_attributes": { "attributes": [ "mid century" ], "options": [] }, "asin": "B0788C3L56" }, { "task_id": "ws_B07SS54KX2_8092", "instruction": "i'm looking for a perfect quality modern wall light sconce led brushed nickel hardwired in the brand of natalya.", "target_attributes": { "attributes": [ "brushed nickel", "living room" ], "options": [ "chrome" ] }, "asin": "B07SS54KX2" }, { "task_id": "ws_B07D9835GF_8093", "instruction": "i would like a 100g copper holographic body glitter that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "copper holographic", "chunky - 100g | 3.5oz" ] }, "asin": "B07D9835GF" }, { "task_id": "ws_B0982NGF1H_8094", "instruction": "i am looking for an easy to use wireless nanny camera that features motion detection and night vision.", "target_attributes": { "attributes": [ "easy use", "motion detection" ], "options": [] }, "asin": "B0982NGF1H" }, { "task_id": "ws_B08MTY5BJP_8095", "instruction": "i am looking for a pair of 80 inch wide by 84 inch long machine washable curtains for my living room.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "80w x 84l inch" ] }, "asin": "B08MTY5BJP" }, { "task_id": "ws_B07YM81LFQ_8096", "instruction": "i'm looking for a perfect furniture item.", "target_attributes": { "attributes": [ "white item" ], "options": [ "low loft + staircase" ] }, "asin": "B07YM81LFQ" }, { "task_id": "ws_B09LLLC65G_8097", "instruction": "looking for bookshelves and bookcases for living room of vintage black colour", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "vintage black" ] }, "asin": "B09LLLC65G" }, { "task_id": "ws_B095MP65P5_8098", "instruction": "i would like some 18 inch high quality synthetic hair extensions that are gray.", "target_attributes": { "attributes": [ "high quality", "synthetic hair" ], "options": [ "1b | gray", "18 inch" ] }, "asin": "B095MP65P5" }, { "task_id": "ws_B095MP65P5_8099", "instruction": "please find a multi-pack of 18\" synthetic hair extensions that are curly enough to be suitable for black women.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "18 inch" ] }, "asin": "B095MP65P5" }, { "task_id": "ws_B006OY1LZ4_8100", "instruction": "i would like a old version of a 730 golden caramel foundation that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "730 golden caramel", "old version" ] }, "asin": "B006OY1LZ4" }, { "task_id": "ws_B07MFN6KSB_8101", "instruction": "i'm looking for a snack with 3 seed mix in 1 pack of 4 pound and non gmo product", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "3 seed mix", "4 pound (pack of 1)" ] }, "asin": "B07MFN6KSB" }, { "task_id": "ws_B08L7SCJDR_8102", "instruction": "i am looking for an easy to install computer table for my living room.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "computer table" ] }, "asin": "B08L7SCJDR" }, { "task_id": "ws_B07PTKWRLR_8103", "instruction": "looking for fresh breath organic toothpaste", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B07PTKWRLR" }, { "task_id": "ws_B07PTKWRLR_8104", "instruction": "i would like a fluoride free toothpaste to give me fresh breath.", "target_attributes": { "attributes": [ "fluoride free", "fresh breath" ], "options": [] }, "asin": "B07PTKWRLR" }, { "task_id": "ws_B09H4FDQ63_8105", "instruction": "i'm looking for a blanket with a shark tooth printed in 60x80\"", "target_attributes": { "attributes": [ "printing technology" ], "options": [ "shark tooth", "60\"x80\"" ] }, "asin": "B09H4FDQ63" }, { "task_id": "ws_B09NPJPQCW_8106", "instruction": "i am lookinf for high quality scrubbing strap that is easy to use.", "target_attributes": { "attributes": [ "easy use", "high quality" ], "options": [] }, "asin": "B09NPJPQCW" }, { "task_id": "ws_B094DD5CM1_8107", "instruction": "i want windmill birthday cake toppers.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B094DD5CM1" }, { "task_id": "ws_B009URK5JK_8108", "instruction": "i want katz gluten free cinnamon donut holes.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cinnamon" ] }, "asin": "B009URK5JK" }, { "task_id": "ws_B097CMW66M_8109", "instruction": "i am looking for a cell phone that is fast charging and is cream colored", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "cream" ] }, "asin": "B097CMW66M" }, { "task_id": "ws_B097CMW66M_8110", "instruction": "i would like a z flip 3 256gb phantom black cell phone that is fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "phantom black", "256gb", "z flip 3 + phone case" ] }, "asin": "B097CMW66M" }, { "task_id": "ws_B09D2T94JT_8111", "instruction": "i want a green couch for my living room. make sure that it is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "green" ] }, "asin": "B09D2T94JT" }, { "task_id": "ws_B009PCNTPM_8112", "instruction": "i need dark chocolate made by trader joe", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B009PCNTPM" }, { "task_id": "ws_B07C1VP88H_8113", "instruction": "i am looking for a cd drive that is silver and easier to use", "target_attributes": { "attributes": [ "easy use" ], "options": [ "silver" ] }, "asin": "B07C1VP88H" }, { "task_id": "ws_B093FQ8SJ9_8114", "instruction": "i need blue clogs that are made of vinyl and are a size 9", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "blue", "9 women | 8 men" ] }, "asin": "B093FQ8SJ9" }, { "task_id": "ws_B0829QZFM7_8115", "instruction": "i am looking for fruit snack pack having fuji & red apple flavor and are gluten and fat free.", "target_attributes": { "attributes": [ "gluten free", "fat free" ], "options": [ "fuji & reds apple" ] }, "asin": "B0829QZFM7" }, { "task_id": "ws_B0829QZFM7_8116", "instruction": "i want 24 bags of non gmo bare baked crunchy apple fruit snacks.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "24 snack bags" ] }, "asin": "B0829QZFM7" }, { "task_id": "ws_B08HX6QMT9_8117", "instruction": "i would like a brown phone case with tempered glass.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "brown" ] }, "asin": "B08HX6QMT9" }, { "task_id": "ws_B09LS4LYWV_8118", "instruction": "i would like to a buy a glass window film of the color multi-020884 for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi-020884" ] }, "asin": "B09LS4LYWV" }, { "task_id": "ws_B0086UI36O_8119", "instruction": "i am looking for gluten free, low fat protein chips , chili nacho cheese", "target_attributes": { "attributes": [ "gluten free", "low fat" ], "options": [ "protein chips - chili nacho cheese" ] }, "asin": "B0086UI36O" }, { "task_id": "ws_B013BZTW22_8120", "instruction": "i want gluten free yummy earth organic fruit lollipops.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B013BZTW22" }, { "task_id": "ws_B07QRYVRPF_8121", "instruction": "i would like a 20 by 26 inch dark green pillow throw cover for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark green", "20\"x26\"" ] }, "asin": "B07QRYVRPF" }, { "task_id": "ws_B09LSW7DJ1_8122", "instruction": "i am looking for pink color long lasting cube ice face roller for facial treatment to tighten ,tone skin and de-puff the eye area", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "pink" ] }, "asin": "B09LSW7DJ1" }, { "task_id": "ws_B082YPVYX6_8123", "instruction": "i need some lipstick that is long lasting and is cherry colored", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "11- cherry bomb" ] }, "asin": "B082YPVYX6" }, { "task_id": "ws_B09M837LNL_8124", "instruction": "i'm looking for outdoor security camera with audio.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "5mp single bullet" ] }, "asin": "B09M837LNL" }, { "task_id": "ws_B09M837LNL_8125", "instruction": "i am looking for 16 pcs 4k bullet hd outdoor security ip camera with mic/audio and motion detection", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "16ch 16pcs 4k bullet" ] }, "asin": "B09M837LNL" }, { "task_id": "ws_B07YT5TRSV_8126", "instruction": "i am looking for east west furniture dlt-ana-tp dublin dining table made of acacia ,a beautiful round dining table makes a cozy addition to any kitchen or classic dining room. the remarkable dining table which facilitates an affectionate family emotion. the frame of this dining room table which will increase the beauty of your living area. the wood table which gives high-quality style with a touch of class to add a powerful appeal. measurements of the great hardwood wood kitchen table length 42; width 42; height 29.5 in dmt-wbk-tp color preferable.", "target_attributes": { "attributes": [ "mid century", "easy clean", "solid wood", "dining room" ], "options": [ "dmt-wbk-tp", "table + dining chairs" ] }, "asin": "B07YT5TRSV" }, { "task_id": "ws_B08VMYJQBT_8127", "instruction": "i am looking for rubber sole backless slip on loafer shoes for women of size :8", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "8" ] }, "asin": "B08VMYJQBT" }, { "task_id": "ws_B016KWUP3I_8128", "instruction": "i want a 2 pack argan oil shampoo and conditioner set.", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "10 fl oz (pack of 2)" ] }, "asin": "B016KWUP3I" }, { "task_id": "ws_B0017JVMS2_8129", "instruction": "i am looking for a plant based peppermint scented soap.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "peppermint" ] }, "asin": "B0017JVMS2" }, { "task_id": "ws_B08ZJFWNPH_8130", "instruction": "i would like a pair of size 9 walking shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "9" ] }, "asin": "B08ZJFWNPH" }, { "task_id": "ws_B01NC0O22H_8131", "instruction": "i want to buy walkie talkie which has batteries included and come in pack of 3 in black color.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "3 pack - black" ] }, "asin": "B01NC0O22H" }, { "task_id": "ws_B09DFLT1VJ_8132", "instruction": "i want a 24w led light with high power lamp. it should mount on a wall.", "target_attributes": { "attributes": [ "wall mounted", "high power" ], "options": [ "24w" ] }, "asin": "B09DFLT1VJ" }, { "task_id": "ws_B09R7W36Q3_8133", "instruction": "i want a small and easy to use u-shaped toothbrush for kids.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "s" ] }, "asin": "B09R7W36Q3" }, { "task_id": "ws_B076YTK3FV_8134", "instruction": "i would like a 2 bottles of flathead cherry jerry gluten free jam.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "flathead cherry jelly", "2 pack" ] }, "asin": "B076YTK3FV" }, { "task_id": "ws_B09QLSZHCP_8135", "instruction": "i would like a brush set for synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [] }, "asin": "B09QLSZHCP" }, { "task_id": "ws_B00LI3SBU4_8136", "instruction": "i want degree men anti-perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B00LI3SBU4" }, { "task_id": "ws_B09NR7TK9C_8137", "instruction": "looking for high density black colour gaming chair", "target_attributes": { "attributes": [ "high density" ], "options": [ "black" ] }, "asin": "B09NR7TK9C" }, { "task_id": "ws_B07N91GKH1_8138", "instruction": "i want a cottage grey and long lasting 6-drawer double dresser.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "cottage grey" ] }, "asin": "B07N91GKH1" }, { "task_id": "ws_B098KKFQZH_8139", "instruction": "i would like a sofa with a solid wood frame.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "sofa, chair, ottoman" ] }, "asin": "B098KKFQZH" }, { "task_id": "ws_B09HCKSXZW_8140", "instruction": "i am looking for 03#beige color women shoes having high heels.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "03#beige" ] }, "asin": "B09HCKSXZW" }, { "task_id": "ws_B00JZYJBIY_8141", "instruction": "i would like a pair of 14 short red pants made from nylon spandex.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "red", "14 short" ] }, "asin": "B00JZYJBIY" }, { "task_id": "ws_B09S6PJ5BF_8142", "instruction": "i am looking for a black bikini set that is an xx-large and a comfortable fit", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black", "xx-large" ] }, "asin": "B09S6PJ5BF" }, { "task_id": "ws_B09RDXNHYG_8143", "instruction": "looking for babydoll mini bodysuit of quality polyester choose size xx large", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "xx-large" ] }, "asin": "B09RDXNHYG" }, { "task_id": "ws_B0871JYQ1J_8144", "instruction": "i need a non toxic and high quality empty bottle for cosmetic", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [] }, "asin": "B0871JYQ1J" }, { "task_id": "ws_B07S7BSPKW_8145", "instruction": "i want a machine washable contemporary 52\"w*52\"l curtain panel for living room color mandala 7rvw0093", "target_attributes": { "attributes": [ "machine washable", "contemporary design", "living room" ], "options": [ "mandala7rvw0093", "52\" w by 52\" l" ] }, "asin": "B07S7BSPKW" }, { "task_id": "ws_B07S7BSPKW_8146", "instruction": "i am looking for contemporary designed window treatment curtains that are 52 inches long.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "52\" w by 84\" l" ] }, "asin": "B07S7BSPKW" }, { "task_id": "ws_B08M5ZCYBY_8147", "instruction": "i want a white 16.9oz hair dye bottle from segbeauty.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "white" ] }, "asin": "B08M5ZCYBY" }, { "task_id": "ws_B07Z7SZ2JR_8148", "instruction": "i am looking for a light fixture for my dining room in the weather wood shade.", "target_attributes": { "attributes": [ "light fixture", "dining room" ], "options": [ "weather wood" ] }, "asin": "B07Z7SZ2JR" }, { "task_id": "ws_B08R3FV6P8_8149", "instruction": "i need a floral window curtain for my living room . and i choose the 52x72in with skulllop3455", "target_attributes": { "attributes": [ "living room" ], "options": [ "skulllop3455", "52x72in" ] }, "asin": "B08R3FV6P8" }, { "task_id": "ws_B08R3FV6P8_8150", "instruction": "i want to find a 52 x 84 inch set of living room curtains that are snowman colored.", "target_attributes": { "attributes": [ "living room" ], "options": [ "snowmangirl1lop5222", "52x84in" ] }, "asin": "B08R3FV6P8" }, { "task_id": "ws_B09RKDJ5DR_8151", "instruction": "i need pumps that are black and closed toe in a 7.5 size", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "black", "7.5" ] }, "asin": "B09RKDJ5DR" }, { "task_id": "ws_B08LKV674T_8152", "instruction": "i am looking for stainless steel gold color wall mounted mirror.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "gold" ] }, "asin": "B08LKV674T" }, { "task_id": "ws_B095J4Q3XC_8153", "instruction": "i am searching for modern contemporary high density and left facing sofa with massage vibration and usb port", "target_attributes": { "attributes": [ "high density" ], "options": [ "left facing" ] }, "asin": "B095J4Q3XC" }, { "task_id": "ws_B002U7YZXY_8154", "instruction": "i am interested in purchasing keto friendly protein power in creamy vanilla and raspberry lemonade flavor.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "creamy vanilla & raspberry lemonade" ] }, "asin": "B002U7YZXY" }, { "task_id": "ws_B002U7YZXY_8155", "instruction": "i need protein powder that comes in 3 lbs and is keto friendly", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "3 pound (pack of 1)" ] }, "asin": "B002U7YZXY" }, { "task_id": "ws_B07ZWGHFXC_8156", "instruction": "i would like a king size extra firm 12 inch mattress with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "12 inch", "king", "extra firm" ] }, "asin": "B07ZWGHFXC" }, { "task_id": "ws_B07S92Q8TB_8157", "instruction": "i want non gmo cauliflower bites 1.4 ounce 2 packs", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "salted" ] }, "asin": "B07S92Q8TB" }, { "task_id": "ws_B0836QNTNJ_8158", "instruction": "may i please have teal colored curtains ideally for my living room? size 52x63 is fine", "target_attributes": { "attributes": [ "living room" ], "options": [ "52x63" ] }, "asin": "B0836QNTNJ" }, { "task_id": "ws_B08L7QL9GV_8159", "instruction": "i am looking 4g lte antenna that can be wall mounted.", "target_attributes": { "attributes": [ "wall mounted", "4g lte" ], "options": [] }, "asin": "B08L7QL9GV" }, { "task_id": "ws_B0816FY959_8160", "instruction": "i'm looking for a hair extension anniston hairpiece preferably color 13#", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "13#" ] }, "asin": "B0816FY959" }, { "task_id": "ws_B008NZ88KS_8161", "instruction": "i am looking for four pounds of protein powder that is chocolate and kosher.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "chocolate", "4 pound (pack of 1)" ] }, "asin": "B008NZ88KS" }, { "task_id": "ws_B07ZPC9SSP_8162", "instruction": "i want a portable wireless bluetooth waterproof speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B07ZPC9SSP" }, { "task_id": "ws_B09336C6C5_8163", "instruction": "i'm looking for some women's flat mules that i can wear every day for walking; i'm a size 5.5 and like the colour apricot.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "apricot", "5.5" ] }, "asin": "B09336C6C5" }, { "task_id": "ws_B077NTX823_8164", "instruction": "i need high quality makeup bag for my eyeshadow. it should be beach pineapple in color.", "target_attributes": { "attributes": [ "high quality", "eye shadow" ], "options": [ "beach pineapple" ] }, "asin": "B077NTX823" }, { "task_id": "ws_B09P4V271L_8165", "instruction": "i would like 3 pieces of white and gold bpa free toiletry travel bottles.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "white&gold", "3 pcs" ] }, "asin": "B09P4V271L" }, { "task_id": "ws_B09T6W1JLR_8166", "instruction": "i would like a 2xl gray romper that has a high drawstring waist.", "target_attributes": { "attributes": [ "drawstring waist", "high waist" ], "options": [ "gray", "xx-large" ] }, "asin": "B09T6W1JLR" }, { "task_id": "ws_B08T9NCP9K_8167", "instruction": "please help me find a violet hair dye in a 500ml bottle; pick a herbal one that has only natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "hair dye" ], "options": [ "violet", "500ml" ] }, "asin": "B08T9NCP9K" }, { "task_id": "ws_B077PR9TL4_8168", "instruction": "i am looking for mn4 color foundation for my sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "mn4" ] }, "asin": "B077PR9TL4" }, { "task_id": "ws_B0787DBB6G_8169", "instruction": "i would like some blueberry acai jelly beans in a resealable bag.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "blueberry acai" ] }, "asin": "B0787DBB6G" }, { "task_id": "ws_B09QL3BLPD_8170", "instruction": "i would like a #1 lip stain that is paraben and alcohol free.", "target_attributes": { "attributes": [ "alcohol free", "paraben free" ], "options": [ "1#" ] }, "asin": "B09QL3BLPD" }, { "task_id": "ws_B014LMNBUS_8171", "instruction": "i would like a perfect bread gift.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [] }, "asin": "B014LMNBUS" }, { "task_id": "ws_B09STKPSQN_8172", "instruction": "i would like some yellow stainless steel nail clippers", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "lion" ] }, "asin": "B09STKPSQN" }, { "task_id": "ws_B07Y66241R_8173", "instruction": "get me fleece lined khaki pants with elastic band in x-large size.", "target_attributes": { "attributes": [ "fleece lined", "elastic waist" ], "options": [ "khaki", "x-large" ] }, "asin": "B07Y66241R" }, { "task_id": "ws_B09NBQ9WG3_8174", "instruction": "i want gray milin 100% blackout roller shades for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gray" ] }, "asin": "B09NBQ9WG3" }, { "task_id": "ws_B09NBQ9WG3_8175", "instruction": "i am looking for some light brown easy to install roller shades for my living room.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "light brown" ] }, "asin": "B09NBQ9WG3" }, { "task_id": "ws_B08NVPGTWT_8176", "instruction": "i am looking for a pair of women's size small pants that are machine washable and made of stretch fabric.", "target_attributes": { "attributes": [ "machine wash", "stretch fabric" ], "options": [ "small" ] }, "asin": "B08NVPGTWT" }, { "task_id": "ws_B00EIMWAE0_8177", "instruction": "i want pink and black machine washable nufoot ballet flats.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "pink and black" ] }, "asin": "B00EIMWAE0" }, { "task_id": "ws_B07RVCYKVD_8178", "instruction": "i would like a island strawberry gluten free drink mix.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "island strawberry" ] }, "asin": "B07RVCYKVD" }, { "task_id": "ws_B07STZ8LQ2_8179", "instruction": "i would like a pair of 4xl gray pants with a elastic closure.", "target_attributes": { "attributes": [ "elastic closure" ], "options": [ "gray -buttons cuff", "4x-large" ] }, "asin": "B07STZ8LQ2" }, { "task_id": "ws_B09HSWZ3ZF_8180", "instruction": "i am looking for a truffle garlic oil gift set", "target_attributes": { "attributes": [ "gift set" ], "options": [ "garlic oil" ] }, "asin": "B09HSWZ3ZF" }, { "task_id": "ws_B07DBXYCLS_8181", "instruction": "i would like a blue green water resistant toiletry bag.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "blue green (with shoulder strap)" ] }, "asin": "B07DBXYCLS" }, { "task_id": "ws_B07KN925H5_8182", "instruction": "i am looking for low sugar, low carb cocoa flavored peanut butter puffs,1 ounce (pack of 12)", "target_attributes": { "attributes": [ "low sugar", "low carb" ], "options": [ "cocoa", "1 ounce (pack of 12)" ] }, "asin": "B07KN925H5" }, { "task_id": "ws_B07G3RPYLG_8183", "instruction": "i am looking for a classic fit medium t-shirt that is cranberry colored", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "cranberry", "medium" ] }, "asin": "B07G3RPYLG" }, { "task_id": "ws_B099NVLYY3_8184", "instruction": "i want a sugar free prodough chocolate keto muffin mix.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "chocolate keto" ] }, "asin": "B099NVLYY3" }, { "task_id": "ws_B08GPWWVT4_8185", "instruction": "i'm looking for a light fixture farmhouse pendant light, preferably the white color.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "white" ] }, "asin": "B08GPWWVT4" }, { "task_id": "ws_B07VCH69RC_8186", "instruction": "i'm looking for a vinyl acetate women athletic shoes. preferably the pink color.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "pink" ] }, "asin": "B07VCH69RC" }, { "task_id": "ws_B07FXL6YH9_8187", "instruction": "braided synthetic hair bundle", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [] }, "asin": "B07FXL6YH9" }, { "task_id": "ws_B07YJPPMXK_8188", "instruction": "i'm looking for a small black t-shirt for women with alpaca design and manchine wash", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "black", "women", "small" ] }, "asin": "B07YJPPMXK" }, { "task_id": "ws_B092W7D67K_8189", "instruction": "i would like a lemonade made with real fruit and natural flavors.", "target_attributes": { "attributes": [ "natural flavors", "real fruit" ], "options": [] }, "asin": "B092W7D67K" }, { "task_id": "ws_B08Z6TCTTM_8190", "instruction": "i'm looking for farmhouse chandelier light with clear glass.", "target_attributes": { "attributes": [ "clear glass" ], "options": [ "satin brass | frosted" ] }, "asin": "B08Z6TCTTM" }, { "task_id": "ws_B07ZKMQPV6_8191", "instruction": "i am looking for 2 light grey chairs made of high density solid wood.", "target_attributes": { "attributes": [ "high density", "solid wood" ], "options": [ "light grey", "2 chairs" ] }, "asin": "B07ZKMQPV6" }, { "task_id": "ws_B0030Y7MLS_8192", "instruction": "i'm looking for a nickel finish valley lightning, preferably the old bronze color.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "old bronze" ] }, "asin": "B0030Y7MLS" }, { "task_id": "ws_B01NBVOGUJ_8193", "instruction": "i would like a winter white floor lamp made with brushed nickel.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "winter white" ] }, "asin": "B01NBVOGUJ" }, { "task_id": "ws_B09J8F7JRX_8194", "instruction": "i need a bag for my hair styling tools", "target_attributes": { "attributes": [ "hair styling" ], "options": [] }, "asin": "B09J8F7JRX" }, { "task_id": "ws_B07GNC5FPV_8195", "instruction": "i am looking for an easy to assemble 4 light vanity light.", "target_attributes": { "attributes": [ "easy assemble", "nickel finish" ], "options": [ "4 lights" ] }, "asin": "B07GNC5FPV" }, { "task_id": "ws_B0912Y7Z5R_8196", "instruction": "i would like a d20\u201dx h 30\u201d silver chandelier for the dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "silver", "d20\u201dx h 30\u201d" ] }, "asin": "B0912Y7Z5R" }, { "task_id": "ws_B09NMFPJGN_8197", "instruction": "i'm looking for colorful rainbow gradient lattice window coverings film.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "960766437466963000" ] }, "asin": "B09NMFPJGN" }, { "task_id": "ws_B097K2QPV8_8198", "instruction": "i'm looking for a beauty salon table towel.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B097K2QPV8" }, { "task_id": "ws_B00LJSGWCW_8199", "instruction": "you can help me find on the web men's guide gear cargo joggers sweatpants, jogger pants, straight leg and for a gift. size has to be medium", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "medium" ] }, "asin": "B00LJSGWCW" }, { "task_id": "ws_B093K3D12G_8200", "instruction": "i want a set of 2 mesh laundry bags sea turtle.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093K3D12G" }, { "task_id": "ws_B09QLWV2JX_8201", "instruction": "i would like a wired 8 cam motion detection surveillance camera.", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "wired-8cam+2tb" ] }, "asin": "B09QLWV2JX" }, { "task_id": "ws_B08Z35MGD6_8202", "instruction": "toothpaste for dental cleaning - 60ml fresh breath freeorr", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B08Z35MGD6" }, { "task_id": "ws_B07XTNQX7P_8203", "instruction": "i am looking for a variety pack of keto friendly energy drinks", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "variety" ] }, "asin": "B07XTNQX7P" }, { "task_id": "ws_B09DPKXRKM_8204", "instruction": "i want luxshiny 72pcs halloween cupcake picks.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [] }, "asin": "B09DPKXRKM" }, { "task_id": "ws_B08S6XVM4R_8205", "instruction": "i want navy skechers men's gowalk shoes made with vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "navy | orange 2" ] }, "asin": "B08S6XVM4R" }, { "task_id": "ws_B09M1HNN22_8206", "instruction": "i'm looking for a fluoride free toothpaste which is clinically proven for sensitive teeth.", "target_attributes": { "attributes": [ "fluoride free", "clinically proven", "sensitive teeth" ], "options": [] }, "asin": "B09M1HNN22" }, { "task_id": "ws_B09MTFD4KQ_8207", "instruction": "i'm looking for a glass screen protector for samsung galaxy a13 5g.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "galaxy a13 5g case navy blue" ] }, "asin": "B09MTFD4KQ" }, { "task_id": "ws_B082J572X8_8208", "instruction": "show me a silver colored 2.4ghz intel core i5 laptop with 1.4ghz processor - 8gb ram 256gb ssd capacity.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "1.4ghz processor - 8gb ram | 256gb ssd", "silver", "2.4ghz intel\u00a0core\u00a0i5" ] }, "asin": "B082J572X8" }, { "task_id": "ws_B09MQFCJ9X_8209", "instruction": "i would like a presentation remote that is easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09MQFCJ9X" }, { "task_id": "ws_B00XN076VA_8210", "instruction": "i am looking for a nut and gluten free wild blueberry preserve.", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [ "wild blueberry preserve" ] }, "asin": "B00XN076VA" }, { "task_id": "ws_B005GP9ECE_8211", "instruction": "i m looking for a 8 no. vinyl acetate man's sandals", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "8" ] }, "asin": "B005GP9ECE" }, { "task_id": "ws_B000QSOCHS_8212", "instruction": "i want earth's best organic baby food.", "target_attributes": { "attributes": [ "certified organic" ], "options": [] }, "asin": "B000QSOCHS" }, { "task_id": "ws_B00D267KMK_8213", "instruction": "i'm looking for perfect waterproof digital camera with 2.5 inch lcd screen.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B00D267KMK" }, { "task_id": "ws_B09NCJH6D6_8214", "instruction": "i would like a ginger boost gluten free bottle.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "ginger boost" ] }, "asin": "B09NCJH6D6" }, { "task_id": "ws_B09R4LDMSS_8215", "instruction": "i am looking for black color heeled sandals containing rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black" ] }, "asin": "B09R4LDMSS" }, { "task_id": "ws_B079YYHVVB_8216", "instruction": "i need a slip on shoes with rubber sole . and i choose the 14\" size with burgundy color", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "burgundy", "14" ] }, "asin": "B079YYHVVB" }, { "task_id": "ws_B01FV5KVAM_8217", "instruction": "i am looking for non gmo , gluten free organic cinnamon syrup", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "organic cinnamon" ] }, "asin": "B01FV5KVAM" }, { "task_id": "ws_B09HC37HYB_8218", "instruction": "i want a large and short sleeve womens down vest.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B09HC37HYB" }, { "task_id": "ws_B08KKZ52F1_8219", "instruction": "i am looking for a men's size 14 sneaker with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "14" ] }, "asin": "B08KKZ52F1" }, { "task_id": "ws_B07QDK5V1G_8220", "instruction": "i would like a long lasting lipstick in the color emma", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "color 523 (emma)" ] }, "asin": "B07QDK5V1G" }, { "task_id": "ws_B08SWDDDLX_8221", "instruction": "i am looking for a black quad core tablets", "target_attributes": { "attributes": [ "quad core" ], "options": [ "black" ] }, "asin": "B08SWDDDLX" }, { "task_id": "ws_B0973422R6_8222", "instruction": "i would like a galaxy a12 pink phone case with a tempered glass screen.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "pink", "galaxy a12 | a12 5g" ] }, "asin": "B0973422R6" }, { "task_id": "ws_B003WM2V4G_8223", "instruction": "i would like a pair of small olive scrub bottoms with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "olive", "small" ] }, "asin": "B003WM2V4G" }, { "task_id": "ws_B09LSJW1TR_8224", "instruction": "i am interested in some monoculars that have optical zoom", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B09LSJW1TR" }, { "task_id": "ws_B098DL2LS5_8225", "instruction": "i would like a fluoride free mouth wash made with natural ingredients.", "target_attributes": { "attributes": [ "fluoride free", "natural ingredients" ], "options": [] }, "asin": "B098DL2LS5" }, { "task_id": "ws_B09P83W6PP_8226", "instruction": "i want a earbud wireless bluetooth", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09P83W6PP" }, { "task_id": "ws_B07W621KSF_8227", "instruction": "i need a 038 | honey beige long lasting foundation which is cruelty,oil,alcohol and paraben free.", "target_attributes": { "attributes": [ "cruelty free", "oil free", "alcohol free", "long lasting" ], "options": [ "038 | honey beige" ] }, "asin": "B07W621KSF" }, { "task_id": "ws_B09SHZ239R_8228", "instruction": "i want blue egg gender reveal cupcake toppers for my baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "one-blue" ] }, "asin": "B09SHZ239R" }, { "task_id": "ws_B09PH5CP53_8229", "instruction": "i would like a 2 piece window film set for the dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "(width\uff0935.4in x (length)35.4in x 2pcs" ] }, "asin": "B09PH5CP53" }, { "task_id": "ws_B0024WNS0G_8230", "instruction": "i am looking for a pack of 720 high performance aaa batteries.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "720 count (pack of 1)", "aaa" ] }, "asin": "B0024WNS0G" }, { "task_id": "ws_B0024WNS0G_8231", "instruction": "i need a high performance 48 count set a batteries", "target_attributes": { "attributes": [ "high performance" ], "options": [ "48 count (pack of 1)" ] }, "asin": "B0024WNS0G" }, { "task_id": "ws_B08SLNJVWT_8232", "instruction": "let's buy a light weight cell phone case.", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B08SLNJVWT" }, { "task_id": "ws_B093YS61WL_8233", "instruction": "i need a wallet that goes with my blouse", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093YS61WL" }, { "task_id": "ws_B0968MW8H3_8234", "instruction": "i want a red machine washable slow down men's ultra lightweight jacket.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "red" ] }, "asin": "B0968MW8H3" }, { "task_id": "ws_B09S1CLQYR_8235", "instruction": "i am looking for ready to use gluten free tomato stew sauce made with extra virgin olive oil. and i choose a packet of 4 with mama's everything sauce", "target_attributes": { "attributes": [ "ready use", "gluten free" ], "options": [ "mama's everything sauce - 4 pack" ] }, "asin": "B09S1CLQYR" }, { "task_id": "ws_B08TM3LCN8_8236", "instruction": "i would like two strawberry and 2 peach lip balms that are made from seed oil.", "target_attributes": { "attributes": [ "seed oil" ], "options": [ "four pack" ] }, "asin": "B08TM3LCN8" }, { "task_id": "ws_B09GM9C88P_8237", "instruction": "i would like non toxic press on nails that are the color jp939", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "jp939" ] }, "asin": "B09GM9C88P" }, { "task_id": "ws_B08ZN8G7JV_8238", "instruction": "hello, i want a music stereo for my car. bluetooth please. i would appreciate it being hands free as well", "target_attributes": { "attributes": [ "hands free", "usb port" ], "options": [] }, "asin": "B08ZN8G7JV" }, { "task_id": "ws_B09S152XNC_8239", "instruction": "i want a large summer o neck women's short sleeve blouse.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B09S152XNC" }, { "task_id": "ws_B00LVQPDGI_8240", "instruction": "i am looking for certified organic regular rolled oats, 25 pound (pack of 1)", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "25 pound (pack of 1)" ] }, "asin": "B00LVQPDGI" }, { "task_id": "ws_B01N9JIUAS_8241", "instruction": "i would like some wild caught sardines that are in water", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "water - pack of 4" ] }, "asin": "B01N9JIUAS" }, { "task_id": "ws_B08JZ5CPRT_8242", "instruction": "i am looking for a travel mirror that is easy to carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B08JZ5CPRT" }, { "task_id": "ws_B094DPFX6Q_8243", "instruction": "i'm looking for a set of 14 inch human hair extensions in #3t613 ombre dark brown to bleach blonde color.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "14 inch" ] }, "asin": "B094DPFX6Q" }, { "task_id": "ws_B09MJLV1J2_8244", "instruction": "find mouthwash, tartar stain removal, fresh breath, for daily life, for my bad breath !", "target_attributes": { "attributes": [ "bad breath" ], "options": [] }, "asin": "B09MJLV1J2" }, { "task_id": "ws_B099MXRP49_8245", "instruction": "i would like a 12 fluid ounce blonde low calorie non alcoholic drink.", "target_attributes": { "attributes": [ "non alcoholic", "low calorie" ], "options": [ "blonde", "12 fl oz (pack of 24)" ] }, "asin": "B099MXRP49" }, { "task_id": "ws_B072L1636F_8246", "instruction": "i would like to buy a nail buffer to take care of dead skin and in style1.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "style1" ] }, "asin": "B072L1636F" }, { "task_id": "ws_B084R89D4Z_8247", "instruction": "i'm looking for milk based organic formula for baby.", "target_attributes": { "attributes": [ "usda organic" ], "options": [] }, "asin": "B084R89D4Z" }, { "task_id": "ws_B07BPV6FPT_8248", "instruction": "i need a slim fit t-shirt that is blue and a large", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "royal blue a", "large" ] }, "asin": "B07BPV6FPT" }, { "task_id": "ws_B005GVEHIO_8249", "instruction": "i would like to buy machine washable leggings in size 16 plus with an elastic waistband.", "target_attributes": { "attributes": [ "machine wash", "elastic waistband" ], "options": [ "16 plus" ] }, "asin": "B005GVEHIO" }, { "task_id": "ws_B093FGHNYM_8250", "instruction": "i would like a cake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B093FGHNYM" }, { "task_id": "ws_B08K2V17DD_8251", "instruction": "i would like some black high heels that are a size 6.5", "target_attributes": { "attributes": [ "high heel" ], "options": [ "black", "6.5" ] }, "asin": "B08K2V17DD" }, { "task_id": "ws_B086JW9KL8_8252", "instruction": "i am looking for toiletries kit bag with water resistant feature and color should be green.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "bottle green" ] }, "asin": "B086JW9KL8" }, { "task_id": "ws_B093GV68LQ_8253", "instruction": "i want 42x84 inch, baby pink and gold color gorgeous unicorn eyelash print curtain for living or bed rooms.", "target_attributes": { "attributes": [ "living room" ], "options": [ "baby pink and gold", "42x84 in" ] }, "asin": "B093GV68LQ" }, { "task_id": "ws_B086G51TH9_8254", "instruction": "i need 5ft power cord cable for blu ray player and home theater system", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B086G51TH9" }, { "task_id": "ws_B08MXZXKQ6_8255", "instruction": "i am looking for a living room poster of fruit", "target_attributes": { "attributes": [ "living room" ], "options": [ "fruit pictures-1" ] }, "asin": "B08MXZXKQ6" }, { "task_id": "ws_B08MXZXKQ6_8256", "instruction": "i am looking for a green plants color wall art for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "green plants" ] }, "asin": "B08MXZXKQ6" }, { "task_id": "ws_B06X3W4PZ8_8257", "instruction": "i am looking for peanut butter chocolate cookie assortments that are dairy free", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "peanut butter chocolate" ] }, "asin": "B06X3W4PZ8" }, { "task_id": "ws_B01M5ANC4W_8258", "instruction": "i would like a desk made from engineered wood.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [] }, "asin": "B01M5ANC4W" }, { "task_id": "ws_B082J7BWYJ_8259", "instruction": "i'm looking for an individually wrapped bar snack cakes.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B082J7BWYJ" }, { "task_id": "ws_B093Z28QMN_8260", "instruction": "i am looking for khaki colored house slippers with a non-slip grip in the size 11 wide.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "03khaki", "11 wide" ] }, "asin": "B093Z28QMN" }, { "task_id": "ws_B0981Y1FLG_8261", "instruction": "i am looking for a high resolution car stereo system with mp-800 and the latest phonelink.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "mp-800 with latest phonelink" ] }, "asin": "B0981Y1FLG" }, { "task_id": "ws_B08QRVN886_8262", "instruction": "i want to buy frame for bed platform which is eco friendly and with box spring, while the color i would prefer for it to be black and as for the size it should be king size.", "target_attributes": { "attributes": [ "eco friendly", "box spring" ], "options": [ "black pu", "king" ] }, "asin": "B08QRVN886" }, { "task_id": "ws_B07KVZJGBW_8263", "instruction": "i need a classic fir t-shirt that is suitable for my wife. and i choose the orange one", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "orange", "women" ] }, "asin": "B07KVZJGBW" }, { "task_id": "ws_B07CQ4BZQR_8264", "instruction": "i would like a 40 by 84 inch round frosted table pad for the dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "upgraded frosted 1.5mm", "round", "40 x 84 inches" ] }, "asin": "B07CQ4BZQR" }, { "task_id": "ws_B09PD6NWCN_8265", "instruction": "i would like some flouride free toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "2-2" ] }, "asin": "B09PD6NWCN" }, { "task_id": "ws_B085GCJ1YK_8266", "instruction": "i am looking for a black bike short that is made of nylon spandex. pick a size 16.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "black", "16" ] }, "asin": "B085GCJ1YK" }, { "task_id": "ws_B09PN95H7B_8267", "instruction": "looking for leather sole womans sandals with arch support also choose size 7 wide", "target_attributes": { "attributes": [ "arch support", "leather sole" ], "options": [ "7 wide" ] }, "asin": "B09PN95H7B" }, { "task_id": "ws_B08YRGRXDZ_8268", "instruction": "find me a white tablet with high performance with quad core", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [ "white" ] }, "asin": "B08YRGRXDZ" }, { "task_id": "ws_B09KT1ZG57_8269", "instruction": "i'm looking for a coral velvet microfiber hair towel wrap for women.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "aquamarine" ] }, "asin": "B09KT1ZG57" }, { "task_id": "ws_B08KDNRWCD_8270", "instruction": "i'm looking for new year cupcake with glitter dessert muffins.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "rose gold" ] }, "asin": "B08KDNRWCD" }, { "task_id": "ws_B006XMHPF2_8271", "instruction": "i would like a volumizing pomegranate conditioner made from seed oil.", "target_attributes": { "attributes": [ "seed oil" ], "options": [ "volumizing pomegranate conditioner" ] }, "asin": "B006XMHPF2" }, { "task_id": "ws_B08YBGCBT6_8272", "instruction": "i want a white emma + oliver kids 3 piece solid hardwood table and chair set for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "white" ] }, "asin": "B08YBGCBT6" }, { "task_id": "ws_B087MSRM1R_8273", "instruction": "i am looking for women's woodland texapore low rise hiking shoes. also ebony blue one.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "ebony blue" ] }, "asin": "B087MSRM1R" }, { "task_id": "ws_B00QUKS6NW_8274", "instruction": "i would like a 4 ounce face moisturizer made with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B00QUKS6NW" }, { "task_id": "ws_B08TVVVXVG_8275", "instruction": "can i get the heavy duty 2-gang, outlet toggle combination wall plate cover.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "toggle | outlet combo" ] }, "asin": "B08TVVVXVG" }, { "task_id": "ws_B096YCWV5H_8276", "instruction": "hello, i would like a gift set of chocolates with peanut products in it? preferably dusted chocolate toffee flavor", "target_attributes": { "attributes": [ "great gift", "gift set" ], "options": [ "dustted chocolate toffee" ] }, "asin": "B096YCWV5H" }, { "task_id": "ws_B06XK5TMTD_8277", "instruction": "i am looking for ac dc adapter charger for my wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B06XK5TMTD" }, { "task_id": "ws_B004M8SVGQ_8278", "instruction": "i need a bronze colored high resolution digital camera that also has optical zoom lens.", "target_attributes": { "attributes": [ "high resolution", "optical zoom" ], "options": [ "bronze" ] }, "asin": "B004M8SVGQ" }, { "task_id": "ws_B0087N3MOI_8279", "instruction": "i'm looking for vanilla meringues cookies, fat and gluten free", "target_attributes": { "attributes": [ "fat free", "gluten free" ], "options": [] }, "asin": "B0087N3MOI" }, { "task_id": "ws_B09N9QHVHK_8280", "instruction": "i'm looking for gyufise glitter mounted butterfly cupcake toppers butterfly cupcake pick, pattern name: 1-multicolor birthday party decorations if you find it let me know soon", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "1-multicolor" ] }, "asin": "B09N9QHVHK" }, { "task_id": "ws_B0842TRS8B_8281", "instruction": "i want non gmo triscuit dill sea salt and olive oil crackers.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "dill sea salt and olive oil" ] }, "asin": "B0842TRS8B" }, { "task_id": "ws_B091SV7HJ7_8282", "instruction": "i want a grey 3-piece faux leather tufted sectional sofa.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "grey" ] }, "asin": "B091SV7HJ7" }, { "task_id": "ws_B08SJ16N4D_8283", "instruction": "i want a 0.27 fl oz perfume bottle that is high in quality. it should be in travel size.", "target_attributes": { "attributes": [ "travel size", "high quality" ], "options": [ "0.27 fl oz (pack of 1)" ] }, "asin": "B08SJ16N4D" }, { "task_id": "ws_B094687BW9_8284", "instruction": "i would like a long lasting men's fragrance.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B094687BW9" }, { "task_id": "ws_B075817VBP_8285", "instruction": "i would like 10 ml of lavender face oil that's high quality.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "lavender", "10 ml (pack of 1)" ] }, "asin": "B075817VBP" }, { "task_id": "ws_B07YQJ68W6_8286", "instruction": "i want a silver star wars the mandalorian muted warrior t-shirt.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "silver" ] }, "asin": "B07YQJ68W6" }, { "task_id": "ws_B07PNRZ353_8287", "instruction": "i need easy to install white trim led light in pack of 18. tye color should be daylight 5000k.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "daylight 5000k", "white trim (18 pack)" ] }, "asin": "B07PNRZ353" }, { "task_id": "ws_B09QFH1FQC_8288", "instruction": "would you find this curtain more easily than i can? fangsosolong dragon bedroom curtains with window cover decoration superior noise blocking reduce , machine washable for my boy's bedroom 63\" rod pocket w 52 l 95", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "rod pocket-w 52 l 95" ] }, "asin": "B09QFH1FQC" }, { "task_id": "ws_B08RZ3B76K_8289", "instruction": "get me a 10g protein per serving chocolate and peanut butter bars.", "target_attributes": { "attributes": [ "protein serving" ], "options": [] }, "asin": "B08RZ3B76K" }, { "task_id": "ws_B07Y4XM3VZ_8290", "instruction": "i am looking of a balms & moisturizers for fine lines", "target_attributes": { "attributes": [ "fine lines" ], "options": [] }, "asin": "B07Y4XM3VZ" }, { "task_id": "ws_B09BB2WGGF_8291", "instruction": "i would like a l5538-1 nail tip that is easy to apply", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "l5538-1" ] }, "asin": "B09BB2WGGF" }, { "task_id": "ws_B07GYJSMW3_8292", "instruction": "searching to purchase a men's zerogrand hiker boot that is water resistant with rubber outsole in a size 10 1/2, either dark coffee or black in coloring. cole haan.", "target_attributes": { "attributes": [ "water resistant", "rubber outsole" ], "options": [ "dark coffee | black", "10.5" ] }, "asin": "B07GYJSMW3" }, { "task_id": "ws_B09NQ3SVTB_8293", "instruction": "i am interested in a c colored cruelty free blush alongside a nailpolish", "target_attributes": { "attributes": [ "cruelty free", "nail polish" ], "options": [ "c" ] }, "asin": "B09NQ3SVTB" }, { "task_id": "ws_B09P9W683K_8294", "instruction": "i am interested in a grey solid wood nightstand", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey", "nightstand" ] }, "asin": "B09P9W683K" }, { "task_id": "ws_B093JLXRB6_8295", "instruction": "i am looking for kosher certified ready to eat reese quartered artichoke hearts, in size 7 ounce (pack of 12)", "target_attributes": { "attributes": [ "ready eat", "kosher certified" ], "options": [ "7 ounce (pack of 12)" ] }, "asin": "B093JLXRB6" }, { "task_id": "ws_B09SPHJXGC_8296", "instruction": "i am looking for dining chairs of g-gray color for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "g-gray" ] }, "asin": "B09SPHJXGC" }, { "task_id": "ws_B01JTHDPP6_8297", "instruction": "i want anti aging collagen boosting serum.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B01JTHDPP6" }, { "task_id": "ws_B09DKB37BS_8298", "instruction": "i am looking for a classic fit army green color shirts.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "army green" ] }, "asin": "B09DKB37BS" }, { "task_id": "ws_B08TB8PCRL_8299", "instruction": "i am looking for medium size elastic waist loose fit workout running sweatpants for men", "target_attributes": { "attributes": [ "loose fit", "elastic waist" ], "options": [ "medium" ] }, "asin": "B08TB8PCRL" }, { "task_id": "ws_B08M9QFNKC_8300", "instruction": "i am looking for a comfortable desk chair without wheels, for my living room, or dining room. i would like for it to have golden legs.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "blue, fur&golden legs" ] }, "asin": "B08M9QFNKC" }, { "task_id": "ws_B09QJ2PBMJ_8301", "instruction": "i want a bag of high protein thailand unique jamaican crickets.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "jamaican crickets bag" ] }, "asin": "B09QJ2PBMJ" }, { "task_id": "ws_B07QQKRHR1_8302", "instruction": "find some 5 ounce gluten free herbs.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "5 ounce (pack of 1)" ] }, "asin": "B07QQKRHR1" }, { "task_id": "ws_B09JR2KSKZ_8303", "instruction": "i want an intel i5 core desktop with 32 gb ram and 256 gb nvme ssd.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B09JR2KSKZ" }, { "task_id": "ws_B092Q2WQWW_8304", "instruction": "i am looking for 5x-large party casual short sleeve loose tunic dress", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "5x-large" ] }, "asin": "B092Q2WQWW" }, { "task_id": "ws_B07T7399JK_8305", "instruction": "i'm looking for a ultra hd digital camera with optical zoom lens.", "target_attributes": { "attributes": [ "ultra hd", "optical zoom" ], "options": [] }, "asin": "B07T7399JK" }, { "task_id": "ws_B09MQVPBKV_8306", "instruction": "i need some whitening toothpaste", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B09MQVPBKV" }, { "task_id": "ws_B083JTJXG7_8307", "instruction": "i want to buy a brush for facial cleansing which is suitable for sensitive skin and it's blue color.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "blue" ] }, "asin": "B083JTJXG7" }, { "task_id": "ws_B09NS3HYLV_8308", "instruction": "i am looking for variety truffles style - 4pc. of dairy free chocolate truffles", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "variety truffles - 4pc." ] }, "asin": "B09NS3HYLV" }, { "task_id": "ws_B09FL9593D_8309", "instruction": "im looking for the long lasting soy wax jar candles in lavender scent.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [] }, "asin": "B09FL9593D" }, { "task_id": "ws_B08HN4MPNH_8310", "instruction": "i want a beige colored storage bench for my living room. it should be 40 inches in size.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige", "40 inches" ] }, "asin": "B08HN4MPNH" }, { "task_id": "ws_B07HGKTMCZ_8311", "instruction": "can i get a hedgehog garden ornament collection which has a longlasting battery .", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "hedgehog" ] }, "asin": "B07HGKTMCZ" }, { "task_id": "ws_B07XBV3VZC_8312", "instruction": "i want a lenovo thinkcentre quad core desktop pc.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B07XBV3VZC" }, { "task_id": "ws_B08CTS4P7B_8313", "instruction": "i need a bag that can carry my travel bottles", "target_attributes": { "attributes": [ "travel bottles" ], "options": [] }, "asin": "B08CTS4P7B" }, { "task_id": "ws_B08M47K2VY_8314", "instruction": "find me a pair of women's jogger sweatpants with an elastic band and drawstring. i want a medium sized black pair.", "target_attributes": { "attributes": [ "drawstring closure", "elastic waistband" ], "options": [ "black", "medium" ] }, "asin": "B08M47K2VY" }, { "task_id": "ws_B08H7PJKML_8315", "instruction": "i am looking for 03 yellow square pattern eco friendly shower caps.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "03 yellow square" ] }, "asin": "B08H7PJKML" }, { "task_id": "ws_B091D648LZ_8316", "instruction": "i am looking for some long lasting ruby colored lip gloss .", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "611 ruby sheen" ] }, "asin": "B091D648LZ" }, { "task_id": "ws_B091D648LZ_8317", "instruction": "i am looking for a french chic color lip gloss that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "french chic" ] }, "asin": "B091D648LZ" }, { "task_id": "ws_B091D648LZ_8318", "instruction": "i am interested in a long lasting lip gloss set", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "set" ] }, "asin": "B091D648LZ" }, { "task_id": "ws_B09PYMQ217_8319", "instruction": "i am looking for height adjustable blue color children's study desk table chair set with drawer and bookstand.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "blue-4" ] }, "asin": "B09PYMQ217" }, { "task_id": "ws_B07KW8MDVZ_8320", "instruction": "i am looking for a 3x large heathers cotton t-shirts for boys", "target_attributes": { "attributes": [ "heathers cotton" ], "options": [] }, "asin": "B07KW8MDVZ" }, { "task_id": "ws_B09N79LQQF_8321", "instruction": "i would like some non gmo gluten free snack food.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [] }, "asin": "B09N79LQQF" }, { "task_id": "ws_B07VPDDQXV_8322", "instruction": "i am interested in buying an ottoman for coffee table which is of high density and solid wood, and i want it's color to be distressed dark blue, and has a 36 inch dimension.", "target_attributes": { "attributes": [ "high density", "solid wood" ], "options": [ "distressed dark blue", "36 inch" ] }, "asin": "B07VPDDQXV" }, { "task_id": "ws_B09KM6MR46_8323", "instruction": "i want brown pgojuni womens open toe booties.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "f-1 brown" ] }, "asin": "B09KM6MR46" }, { "task_id": "ws_B08KTQGV2H_8324", "instruction": "i am looking for long lasting blackout curtains. and i choose the 55\" w x 72\" l with color 17", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "color17", "55\" w x 72\" l" ] }, "asin": "B08KTQGV2H" }, { "task_id": "ws_B09KLQ1Q3D_8325", "instruction": "i'm looking for a high heel stiletto shoes with ankle strap and deep purple color size 10", "target_attributes": { "attributes": [ "ankle strap", "high heel" ], "options": [ "deep purple", "10" ] }, "asin": "B09KLQ1Q3D" }, { "task_id": "ws_B07S1L3BV5_8326", "instruction": "i would like to find gluten free barbecue sauce with flavor of smokey mesquite", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "smokey mesquite" ] }, "asin": "B07S1L3BV5" }, { "task_id": "ws_B01DCHQMOK_8327", "instruction": "i am looking for some oil free baby powder", "target_attributes": { "attributes": [ "oil free" ], "options": [ "baby powder" ] }, "asin": "B01DCHQMOK" }, { "task_id": "ws_B07YD83DNZ_8328", "instruction": "i am interested in a white alarm clock that has batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "white" ] }, "asin": "B07YD83DNZ" }, { "task_id": "ws_B097MYVHHV_8329", "instruction": "i'm looking for a fluoride free toothpaste that prevents bad breath. also choose a pack of 2, 50g blue colored one.", "target_attributes": { "attributes": [ "fluoride free", "bad breath" ], "options": [ "blue", "50g*2" ] }, "asin": "B097MYVHHV" }, { "task_id": "ws_B07QCD9YM6_8330", "instruction": "i am looking for a macaroni & cheese with rich creamy and non gmo.", "target_attributes": { "attributes": [ "non gmo", "rich creamy" ], "options": [] }, "asin": "B07QCD9YM6" }, { "task_id": "ws_B07NPCS939_8331", "instruction": "i am looking for a beige sectional sofa set for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige" ] }, "asin": "B07NPCS939" }, { "task_id": "ws_B07J4XNCSZ_8332", "instruction": "i would like some non gmo watermelon fruit snacks", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "watermelon" ] }, "asin": "B07J4XNCSZ" }, { "task_id": "ws_B09MTQH8MX_8333", "instruction": "i want blue travel toothbrushes with long handles.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "blue" ] }, "asin": "B09MTQH8MX" }, { "task_id": "ws_B09H79FB9V_8334", "instruction": "i am looking for easy clean and space saving kitchen trash cabinet of hm-gb01gy model", "target_attributes": { "attributes": [ "space saving", "easy clean" ], "options": [ "hm-gb01gy" ] }, "asin": "B09H79FB9V" }, { "task_id": "ws_B09D8T75XX_8335", "instruction": "i am looking for non gmo ocean's halo seaweed snacks. 1 case of 20 units.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B09D8T75XX" }, { "task_id": "ws_B08HWR1D16_8336", "instruction": "i want a large royal blue golf and bourbon enjoyer tank top for women for machine wash", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "royal blue", "women", "large" ] }, "asin": "B08HWR1D16" }, { "task_id": "ws_B015QLCI7A_8337", "instruction": "i'm looking for the original gypsy color 5 light crystal white flush mount chandelier.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "multicolor" ] }, "asin": "B015QLCI7A" }, { "task_id": "ws_B071HNJ2T7_8338", "instruction": "i am seeking a high quality toothpaste which ensure that i have long lasting fresh breath", "target_attributes": { "attributes": [ "high quality", "fresh breath" ], "options": [] }, "asin": "B071HNJ2T7" }, { "task_id": "ws_B09NRNNG1Q_8339", "instruction": "i am looking for 2pink color anti slip women sandals.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "2pink" ] }, "asin": "B09NRNNG1Q" }, { "task_id": "ws_B09CF1YNVX_8340", "instruction": "i am looking for a toning treatment that is fragrance free", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "prox anti-aging tone treatment, 1.3 oz" ] }, "asin": "B09CF1YNVX" }, { "task_id": "ws_B09CTY29KJ_8341", "instruction": "i am looking for white color wood frame triple bunk bed with ladder", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "white" ] }, "asin": "B09CTY29KJ" }, { "task_id": "ws_B07DKHV65Q_8342", "instruction": "i am looking for a lavender women's party dress in the size x-large.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "lavender", "x-large" ] }, "asin": "B07DKHV65Q" }, { "task_id": "ws_B09H2QFSKP_8343", "instruction": "i want easy clean high quality pink linens for beauty salon size :60*180 cm", "target_attributes": { "attributes": [ "easy clean", "high quality", "beauty salon" ], "options": [ "pink", "60*180cm round head" ] }, "asin": "B09H2QFSKP" }, { "task_id": "ws_B09H2QFSKP_8344", "instruction": "i am looking for easy clean yellow color beauty bedspreads massage table skirt", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "yellow" ] }, "asin": "B09H2QFSKP" }, { "task_id": "ws_B09631NVQT_8345", "instruction": "i am looking for flower fairy giel with pink wing elves pillow cover for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09631NVQT" }, { "task_id": "ws_B08MN7Y8Y8_8346", "instruction": "i am looking for venice color lip gloss containing natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "venice" ] }, "asin": "B08MN7Y8Y8" }, { "task_id": "ws_B08MN7Y8Y8_8347", "instruction": "i need a liquid lip gloss that has natural ingredients and is in the color rabida.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "rabida", "liquid" ] }, "asin": "B08MN7Y8Y8" }, { "task_id": "ws_B09H6VRJYY_8348", "instruction": "i need an orange faux leather office chair", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "orange" ] }, "asin": "B09H6VRJYY" }, { "task_id": "ws_B09CZ72MJV_8349", "instruction": "i'm looking for a high waisted jeans for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "b03-blue" ] }, "asin": "B09CZ72MJV" }, { "task_id": "ws_B01LR0OOBC_8350", "instruction": "i am looking for hands free and dark blue bluetooth stereo wireless music earphones headset", "target_attributes": { "attributes": [ "hands free" ], "options": [ "g6" ] }, "asin": "B01LR0OOBC" }, { "task_id": "ws_B082J5FK1B_8351", "instruction": "i am looking for clinical strength solid deodorant for men.it should be paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "clinical strength solid (2 pack)" ] }, "asin": "B082J5FK1B" }, { "task_id": "ws_B07BSC84T2_8352", "instruction": "i need a medium sized classic fit t-shirt. it should be black in color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "medium" ] }, "asin": "B07BSC84T2" }, { "task_id": "ws_B07JGSMJGS_8353", "instruction": "i would like a body scrub that is eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [] }, "asin": "B07JGSMJGS" }, { "task_id": "ws_B07CB94P73_8354", "instruction": "i am looking for nuts & chews milk chocolate with quality ingredients for valentine day. also choose dark-chocolate flavor and 56 pound (9 ounce) size.", "target_attributes": { "attributes": [ "quality ingredients", "valentine day" ], "options": [ "dark-chocolate", ".56 pound (9 ounce)" ] }, "asin": "B07CB94P73" }, { "task_id": "ws_B08781CRRS_8355", "instruction": "i would like a chandelier with pendant lights.", "target_attributes": { "attributes": [ "pendant light" ], "options": [] }, "asin": "B08781CRRS" }, { "task_id": "ws_B08N9XVKWK_8356", "instruction": "i am interested in buying a king sized bed with memory foam and which provides lumbar support.", "target_attributes": { "attributes": [ "memory foam", "lumbar support" ], "options": [ "king" ] }, "asin": "B08N9XVKWK" }, { "task_id": "ws_B09CNHSXDC_8357", "instruction": "i need ethylene vinyl slippers in size 8.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "8" ] }, "asin": "B09CNHSXDC" }, { "task_id": "ws_B09NFG77CY_8358", "instruction": "i would like a purple classic fit t-shirt that is a x-large", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "purple", "x-large" ] }, "asin": "B09NFG77CY" }, { "task_id": "ws_B09JMJP427_8359", "instruction": "i am looking for high quality hair cutting scissor make up of thinning shears.", "target_attributes": { "attributes": [ "high quality", "hair cutting" ], "options": [ "thinning" ] }, "asin": "B09JMJP427" }, { "task_id": "ws_B09QXXZNDJ_8360", "instruction": "i would like a extra large pair of sleep bottoms with buttons.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "x-large" ] }, "asin": "B09QXXZNDJ" }, { "task_id": "ws_B08DGQDX38_8361", "instruction": "i am looking for a sconce light with a black metal base and a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [] }, "asin": "B08DGQDX38" }, { "task_id": "ws_B096VP5JJS_8362", "instruction": "i am looking for toilet storage cabinet that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B096VP5JJS" }, { "task_id": "ws_B07G75YY2F_8363", "instruction": "i would like 30 bpa free amber travel bottles.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "amber", "pack of 30" ] }, "asin": "B07G75YY2F" }, { "task_id": "ws_B07G75YY2F_8364", "instruction": "i am looking for some high quality clear travel bottles.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "clear" ] }, "asin": "B07G75YY2F" }, { "task_id": "ws_B07G75YY2F_8365", "instruction": "i want amber and bpa free moyo natural labs 8 oz boston round travel bottles.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "amber" ] }, "asin": "B07G75YY2F" }, { "task_id": "ws_B08ZCHWBFW_8366", "instruction": "i am interested in buying a rug for the living room with diameter of 6ft, 72 inches and 183 cms.", "target_attributes": { "attributes": [ "living room" ], "options": [ "round diameter:6ft=72in=183cm" ] }, "asin": "B08ZCHWBFW" }, { "task_id": "ws_B07VPR4HN9_8367", "instruction": "i want a gray non slip dining chair cushion.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "gray" ] }, "asin": "B07VPR4HN9" }, { "task_id": "ws_B07H8VDQ5K_8368", "instruction": "i am looking for an intel i5 core desktop computer that has 4gb ram and 64gb ssd.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "4gb ram 64gb ssd" ] }, "asin": "B07H8VDQ5K" }, { "task_id": "ws_B01N21GL66_8369", "instruction": "i need to get a dark beige ottoman for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark beige" ] }, "asin": "B01N21GL66" }, { "task_id": "ws_B00THW4ZB2_8370", "instruction": "i need a machine wash, red tooloud italian flag the medium size", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "red", "medium" ] }, "asin": "B00THW4ZB2" }, { "task_id": "ws_B08NGC1KYS_8371", "instruction": "i'm looking for a telescope with high power for bird watching", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B08NGC1KYS" }, { "task_id": "ws_B08NDYH53P_8372", "instruction": "i'm looking for wireless bluetooth headphones.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "dark grey" ] }, "asin": "B08NDYH53P" }, { "task_id": "ws_B0777RQR33_8373", "instruction": "i would like a 10.6 ounce coffee crumble that is low calorie.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "coffee crumble", "10.6 ounce (pack of 2)" ] }, "asin": "B0777RQR33" }, { "task_id": "ws_B0777RQR33_8374", "instruction": "i want to find a two-pack of 12-count coffee-crumble flavored sweet delights. they need to be individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "coffee crumble", "12 count (pack of 2)" ] }, "asin": "B0777RQR33" }, { "task_id": "ws_B074VD1GP5_8375", "instruction": "i am looking for matte ink long lasting liquid lipstick having 15 lover color", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "15 lover" ] }, "asin": "B074VD1GP5" }, { "task_id": "ws_B086533GWT_8376", "instruction": "i'm looking for a room divider panel in silver with wood frame", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "silver" ] }, "asin": "B086533GWT" }, { "task_id": "ws_B00WFDKDIO_8377", "instruction": "i am looking for a gluten free non gmo fig bar packet of 7. and i choose the variety pack", "target_attributes": { "attributes": [ "gluten free", "non gmo" ], "options": [ "variety pack", "12 count (pack of 7)" ] }, "asin": "B00WFDKDIO" }, { "task_id": "ws_B085T5HZJV_8378", "instruction": "i want a tv stand made of wood and has a storage space. it should be suitable for my living room.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "wood" ] }, "asin": "B085T5HZJV" }, { "task_id": "ws_B09GPYFH3C_8379", "instruction": "i would like a awesome violet 4g lte cell phone", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "awesome violet" ] }, "asin": "B09GPYFH3C" }, { "task_id": "ws_B08NQ3Y9TK_8380", "instruction": "i want a hp elite desktop pc with intel quad core i5.", "target_attributes": { "attributes": [ "quad core" ], "options": [] }, "asin": "B08NQ3Y9TK" }, { "task_id": "ws_B08LKV9N89_8381", "instruction": "i am looking for a tabletop decorative mirror size 60cm /24inch for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "60cm | 24inch" ] }, "asin": "B08LKV9N89" }, { "task_id": "ws_B089TMLFR4_8382", "instruction": "i am looking for a men's body wash that uses seed oil and is burmese sandalwood scented.", "target_attributes": { "attributes": [ "seed oil" ], "options": [ "burmese sandalwood" ] }, "asin": "B089TMLFR4" }, { "task_id": "ws_B095C4XZCW_8383", "instruction": "i want a black playstation 1 console airpods water proof case.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "black-style6" ] }, "asin": "B095C4XZCW" }, { "task_id": "ws_B000UI6U8I_8384", "instruction": "i want da vinci sugar free huckleberry syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "huckleberry" ] }, "asin": "B000UI6U8I" }, { "task_id": "ws_B08PPRK2T8_8385", "instruction": "i am looking for beauty soaps that contain cocounut oil.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [] }, "asin": "B08PPRK2T8" }, { "task_id": "ws_B08BXG1NC8_8386", "instruction": "i am looking for fully assembled file cabinets.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [] }, "asin": "B08BXG1NC8" }, { "task_id": "ws_B001F1PV1G_8387", "instruction": "i would like a 8 pack of original fresh scent coconut oil soap that's fragrance free.", "target_attributes": { "attributes": [ "fragrance free", "coconut oil" ], "options": [ "original fresh scent", "pack of 8" ] }, "asin": "B001F1PV1G" }, { "task_id": "ws_B09R4V5J3R_8388", "instruction": "am looking for low rise lam kwongy sexy yoga shorts for women, blue color.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "blue" ] }, "asin": "B09R4V5J3R" }, { "task_id": "ws_B09HHBDGKV_8389", "instruction": "i am interested in a high definition yellow playstation", "target_attributes": { "attributes": [ "high definition" ], "options": [ "yellow-64g" ] }, "asin": "B09HHBDGKV" }, { "task_id": "ws_B0837JNX9T_8390", "instruction": "i want a black hands free denon home 250 wireless speaker.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "black" ] }, "asin": "B0837JNX9T" }, { "task_id": "ws_B083FTBZ6Q_8391", "instruction": "looking for short sleeve tumble dry shirt for men also choose size large", "target_attributes": { "attributes": [ "short sleeve", "tumble dry" ], "options": [ "large" ] }, "asin": "B083FTBZ6Q" }, { "task_id": "ws_B09K41V6QJ_8392", "instruction": "i am looking for wall art of size 24\" x 36\" black for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "24\" x 36\" black" ] }, "asin": "B09K41V6QJ" }, { "task_id": "ws_B08ML5LCGD_8393", "instruction": "i need an easy to install pendant light for ceiling.", "target_attributes": { "attributes": [ "easy install", "pendant light" ], "options": [] }, "asin": "B08ML5LCGD" }, { "task_id": "ws_B097H6BHL9_8394", "instruction": "find me a medium sized romper with short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "medium" ] }, "asin": "B097H6BHL9" }, { "task_id": "ws_B079K861JP_8395", "instruction": "i would like a 19\" tall floor lamp with a white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "19\" height" ] }, "asin": "B079K861JP" }, { "task_id": "ws_B08TM8DKFR_8396", "instruction": "looking for cookie favor gifts with natural ingredients choose size 4 bars", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "4 bars" ] }, "asin": "B08TM8DKFR" }, { "task_id": "ws_B095C9KMNL_8397", "instruction": "i would like a pair of size 11.5 dark blue sandals that are open toe.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z#01-dark blue", "11.5" ] }, "asin": "B095C9KMNL" }, { "task_id": "ws_B095C9KMNL_8398", "instruction": "i'm looking for women's summer sandals, non-slip, high heels in z#02red color.", "target_attributes": { "attributes": [ "non slip", "high heel" ], "options": [ "z#02red" ] }, "asin": "B095C9KMNL" }, { "task_id": "ws_B09HWRDK1W_8399", "instruction": "i would like a 38 mm gold apple watch band.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "gold", "38 | 40 | 41mm" ] }, "asin": "B09HWRDK1W" }, { "task_id": "ws_B07TTJHC2N_8400", "instruction": "i'm looking for a perfect slip-on active sneaker for women.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "blush" ] }, "asin": "B07TTJHC2N" }, { "task_id": "ws_B09KMYJ6HC_8401", "instruction": "i want a black and heavy duty pots and pans organizer.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black" ] }, "asin": "B09KMYJ6HC" }, { "task_id": "ws_B09NRFQLRJ_8402", "instruction": "i am looking for a wireless fast charger that goes with my iphone.", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [] }, "asin": "B09NRFQLRJ" }, { "task_id": "ws_B08RWRCZM4_8403", "instruction": "i am looking for a 4gb android 10.0 tv box.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B08RWRCZM4" }, { "task_id": "ws_B09L5FJ1Q5_8404", "instruction": "i want a spicy beef meat and cheese gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "spicy beef" ] }, "asin": "B09L5FJ1Q5" }, { "task_id": "ws_B09RWP246B_8405", "instruction": "i am looking for slim fit men t-shirts of black color.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "black" ] }, "asin": "B09RWP246B" }, { "task_id": "ws_B095BQG7PM_8406", "instruction": "i need a large 3-wick bucket mult-color floral print soy wax candle for summer", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "mult-color floral print candle" ] }, "asin": "B095BQG7PM" }, { "task_id": "ws_B09L6QB5FC_8407", "instruction": "i'm looking for a wings set of 2 white finish heavy home office desk.", "target_attributes": { "attributes": [ "white finish" ], "options": [ "copper" ] }, "asin": "B09L6QB5FC" }, { "task_id": "ws_B09P4WGX3Z_8408", "instruction": "i am looking for cimota pu leather dining chairs in a set of 2.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "set of 4" ] }, "asin": "B09P4WGX3Z" }, { "task_id": "ws_B001BBQCRC_8409", "instruction": "i want tiger lily bareminerals eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "tiger lily" ] }, "asin": "B001BBQCRC" }, { "task_id": "ws_B09R5R4K7N_8410", "instruction": "i'm looking for a tempered glass screen protector that is compatible with a 42 mm size apple watch.", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "42 mm" ] }, "asin": "B09R5R4K7N" }, { "task_id": "ws_B08N5CCYD6_8411", "instruction": "i am looking for a non gmo mojito cocktail mixer", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "mojito" ] }, "asin": "B08N5CCYD6" }, { "task_id": "ws_B09MK17G3P_8412", "instruction": "get football shoes with size 5.5. it should have a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "5.5" ] }, "asin": "B09MK17G3P" }, { "task_id": "ws_B07GPHFDVS_8413", "instruction": "i want seeds of change organic whole grain brown basmati rice.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "whole grain brown basmati rice" ] }, "asin": "B07GPHFDVS" }, { "task_id": "ws_B07WFSTXRP_8414", "instruction": "i am looking for casual button-down shirts of burgundy color having long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "burgundy" ] }, "asin": "B07WFSTXRP" }, { "task_id": "ws_B072L3ZQ6W_8415", "instruction": "i am looking for a 21 inch high quality hairpiece used for hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "21 inch" ] }, "asin": "B072L3ZQ6W" }, { "task_id": "ws_B07WGYLN6G_8416", "instruction": "i would like a t6b83a premier edition printer with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "t6b83a - premier edition (w | hp brochure..." ] }, "asin": "B07WGYLN6G" }, { "task_id": "ws_B08TB7HMMS_8417", "instruction": "i'm looking for tablet pc with 32gb storage, android 9.0, dual sim slots and dual camera.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "black" ] }, "asin": "B08TB7HMMS" }, { "task_id": "ws_B08VWG7WB6_8418", "instruction": "i want a black cordless water flosser for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "\u3010new\u3011black" ] }, "asin": "B08VWG7WB6" }, { "task_id": "ws_B07NW8RGJ8_8419", "instruction": "i am looking self tanner for removal my dry and dead skin", "target_attributes": { "attributes": [ "dead skin", "dry skin" ], "options": [] }, "asin": "B07NW8RGJ8" }, { "task_id": "ws_B0163JJMU0_8420", "instruction": "i would like an assorted bag of individually wrapped caramels", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "assorted" ] }, "asin": "B0163JJMU0" }, { "task_id": "ws_B07H38CYD2_8421", "instruction": "i would like the perfect jam gift.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [] }, "asin": "B07H38CYD2" }, { "task_id": "ws_B09QGGG627_8422", "instruction": "i'm looking for heavy weight paper plates.", "target_attributes": { "attributes": [ "lactose free" ], "options": [ "pathways design" ] }, "asin": "B09QGGG627" }, { "task_id": "ws_B09H7MSD9W_8423", "instruction": "i am interested in acquiring women shirt which is gray color and x-large size, while also i want it to be machine washable and be a loose fit.", "target_attributes": { "attributes": [ "machine washable", "loose fit" ], "options": [ "gray", "x-large" ] }, "asin": "B09H7MSD9W" }, { "task_id": "ws_B077L2N9CC_8424", "instruction": "i looking for strawberry&blueberry artificial flavors in variety pack apple cinnamon &strawberry", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "variety pack, apple cinnamon & strawberry" ] }, "asin": "B077L2N9CC" }, { "task_id": "ws_B097Y8WNLK_8425", "instruction": "i'm looking for disposable razors for hair removal in multiple colors", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "rose red, blue, yellow" ] }, "asin": "B097Y8WNLK" }, { "task_id": "ws_B09LVNHDLT_8426", "instruction": "i am looking for a easily cleanable toothbrush with travel case that has extra soft feature. and i choose the white one", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "white" ] }, "asin": "B09LVNHDLT" }, { "task_id": "ws_B01LTHLD9Y_8427", "instruction": "i am looking for 040 medium ash brown color hair dye that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "040 medium ash brown" ] }, "asin": "B01LTHLD9Y" }, { "task_id": "ws_B0001EL4DC_8428", "instruction": "i am looking for some honey dark colored paraben free powder foundation.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "honey dark" ] }, "asin": "B0001EL4DC" }, { "task_id": "ws_B0748DZCZ7_8429", "instruction": "i'm looking for a green tea full coverage concealer for dark circles", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "green tea" ] }, "asin": "B0748DZCZ7" }, { "task_id": "ws_B08R5YH95C_8430", "instruction": "i'm looking for boxer briefs for men.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "love heart" ] }, "asin": "B08R5YH95C" }, { "task_id": "ws_B09MLYM9YN_8431", "instruction": "i'm interested in a long-sleeved, size large hooded sweatshirt made from quality polyester.", "target_attributes": { "attributes": [ "quality polyester", "long sleeve" ], "options": [ "large" ] }, "asin": "B09MLYM9YN" }, { "task_id": "ws_B09J4GSH9J_8432", "instruction": "i would like some non toxic body glitter in the color ch138", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "ch138" ] }, "asin": "B09J4GSH9J" }, { "task_id": "ws_B09H9NDB1S_8433", "instruction": "i'm looking for a 2t royal blue t-shirt encanto movie officially licensed for men", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "royal blue", "men", "2t" ] }, "asin": "B09H9NDB1S" }, { "task_id": "ws_B089VSHQQV_8434", "instruction": "i want a light blue and funut case cover compatible with the macbook pro.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "light blue" ] }, "asin": "B089VSHQQV" }, { "task_id": "ws_B09133G83G_8435", "instruction": "i would like some non gmo sugar", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sugarcane" ] }, "asin": "B09133G83G" }, { "task_id": "ws_B09133G83G_8436", "instruction": "i would like a one pound bag of non-gmo amla.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "amla", "1 pound (pack of 1)" ] }, "asin": "B09133G83G" }, { "task_id": "ws_B099CPDVHK_8437", "instruction": "find this dynasty mattress fully adjustable bed frame with custom headband, bluetooth & usb ports + memory foam mattress set\u2026 for a fair price", "target_attributes": { "attributes": [ "memory foam" ], "options": [] }, "asin": "B099CPDVHK" }, { "task_id": "ws_B087Y28XLM_8438", "instruction": "i am looking fresh scent body lotion for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "fresh" ] }, "asin": "B087Y28XLM" }, { "task_id": "ws_B015M8V3ZA_8439", "instruction": "i am looking for loose fit small size pajama pant.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "small" ] }, "asin": "B015M8V3ZA" }, { "task_id": "ws_B09QRNQCFL_8440", "instruction": "i want hands free and bluetooth headphones.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B09QRNQCFL" }, { "task_id": "ws_B087TQFKRF_8441", "instruction": "i want black and comfortable under armour ansa slide sandals.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black (011) | black" ] }, "asin": "B087TQFKRF" }, { "task_id": "ws_B07YJRVW8H_8442", "instruction": "i am looking for a long handle red color toothbrush which is eco friendly and long lasting.", "target_attributes": { "attributes": [ "eco friendly", "long lasting", "long handle" ], "options": [ "red" ] }, "asin": "B07YJRVW8H" }, { "task_id": "ws_B08G8DY2LH_8443", "instruction": "i want a qivynsry filter carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [] }, "asin": "B08G8DY2LH" }, { "task_id": "ws_B07JYTS2DM_8444", "instruction": "find a 1 pound bag snowy river holiday cocktail sugar - all natural festive cocktail rimmer gluten free, non gmo, i want to make a good impression on guests.", "target_attributes": { "attributes": [ "gmo free", "gluten free" ], "options": [ "1 pound bag" ] }, "asin": "B07JYTS2DM" }, { "task_id": "ws_B07Q9JQQ8H_8445", "instruction": "i would like wall lamps that have two heads and are made of glass", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "2 heads" ] }, "asin": "B07Q9JQQ8H" }, { "task_id": "ws_B093YSNS24_8446", "instruction": "i am looking for a medium size laundry bag for my wife", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSNS24" }, { "task_id": "ws_B004EJRU9M_8447", "instruction": "i would like a long lasting men's perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B004EJRU9M" }, { "task_id": "ws_B08TRR5993_8448", "instruction": "i am looking for a mango matic flavored performance drink that has zero sugar.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "mango matic" ] }, "asin": "B08TRR5993" }, { "task_id": "ws_B000W5NUV4_8449", "instruction": "i am looking for a boat shoe that has rubber sole. and i would prefer the 8.5 size with blue color", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "blue", "8.5" ] }, "asin": "B000W5NUV4" }, { "task_id": "ws_B09RWH7SF6_8450", "instruction": "i need to get blue tongue cleaner that is stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black,blue" ] }, "asin": "B09RWH7SF6" }, { "task_id": "ws_B003NX8C6K_8451", "instruction": "i would like a xlarge plus red camellia fleece jacket that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "red camellia", "x-large plus" ] }, "asin": "B003NX8C6K" }, { "task_id": "ws_B01GUIJMO0_8452", "instruction": "i need a two pack of peanut butter that is non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "6.5 ounce (pack of 2)" ] }, "asin": "B01GUIJMO0" }, { "task_id": "ws_B08HV8PR1B_8453", "instruction": "i need a fast charging charging station that is space black", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "space black" ] }, "asin": "B08HV8PR1B" }, { "task_id": "ws_B09JXQYP1Y_8454", "instruction": "i am looking for queen size beds.", "target_attributes": { "attributes": [ "queen size" ], "options": [] }, "asin": "B09JXQYP1Y" }, { "task_id": "ws_B09NN5NH1H_8455", "instruction": "i want white non slip women's wedges cowboy boots.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "white" ] }, "asin": "B09NN5NH1H" }, { "task_id": "ws_B09SR165B1_8456", "instruction": "i am looking for home theatres plug connectors that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09SR165B1" }, { "task_id": "ws_B00EG3XIOM_8457", "instruction": "i am looking for a 50 ft | 15m size ultra hd gold plated hdmi cables", "target_attributes": { "attributes": [ "ultra hd", "gold plated" ], "options": [ "50 ft | 15m" ] }, "asin": "B00EG3XIOM" }, { "task_id": "ws_B08LXP8VCB_8458", "instruction": "i need meat seasoning that is made in usa . and i would prefer the one with peppered sea salt", "target_attributes": { "attributes": [ "natural flavors" ], "options": [] }, "asin": "B08LXP8VCB" }, { "task_id": "ws_B093YSFQSX_8459", "instruction": "i need a laundry bag for my travel", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSFQSX" }, { "task_id": "ws_B09899K4L6_8460", "instruction": "i need a bluetooth keyboard with aaa batteries in gold color", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [ "gold" ] }, "asin": "B09899K4L6" }, { "task_id": "ws_B0080DFOG4_8461", "instruction": "i'm looking for gift basket for teachers.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B0080DFOG4" }, { "task_id": "ws_B0080DFOG4_8462", "instruction": "i am looking for a gift basket for teacher which is hand crafted.", "target_attributes": { "attributes": [ "hand crafted", "gift basket" ], "options": [] }, "asin": "B0080DFOG4" }, { "task_id": "ws_B08MFG44TV_8463", "instruction": "i am looking for a 5 piece glass dining table with metal legs for my dining room. it should have faux leather dining chairs.", "target_attributes": { "attributes": [ "faux leather", "metal legs", "dining room" ], "options": [ "5 piece glass" ] }, "asin": "B08MFG44TV" }, { "task_id": "ws_B00DB8KKDK_8464", "instruction": "i am looking for a grain free pumpkin bread mix", "target_attributes": { "attributes": [ "grain free" ], "options": [ "pumpkin muffin & bread mix" ] }, "asin": "B00DB8KKDK" }, { "task_id": "ws_B09JSYTC4Q_8465", "instruction": "i want a khaki phone case for apple phones.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "khaki" ] }, "asin": "B09JSYTC4Q" }, { "task_id": "ws_B08BSV5VM7_8466", "instruction": "i am looking for a 3 pack of trader joe's shelf stable whapping cream in 8 fl oz, three pack -set of two.", "target_attributes": { "attributes": [ "trader joe", "shelf stable" ], "options": [] }, "asin": "B08BSV5VM7" }, { "task_id": "ws_B017RXMKUA_8467", "instruction": "looking for drying hair turban choose one size", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "one size" ] }, "asin": "B017RXMKUA" }, { "task_id": "ws_B08B12P6CS_8468", "instruction": "i am looking for a blue computer gaming chair that is height adjustable and has lumbar support.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "blue" ] }, "asin": "B08B12P6CS" }, { "task_id": "ws_B01MQVD7WQ_8469", "instruction": "i want a 2 pack of fragrance free hair detangler spray.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "2 pack" ] }, "asin": "B01MQVD7WQ" }, { "task_id": "ws_B083XYZ3GR_8470", "instruction": "i'm looking a pocket telescope with high definition for bird watching", "target_attributes": { "attributes": [ "high definition", "bird watching" ], "options": [] }, "asin": "B083XYZ3GR" }, { "task_id": "ws_B09MJZ7GV4_8471", "instruction": "i need a stereo headset with fast charging capacity. and i choose the green one", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "green" ] }, "asin": "B09MJZ7GV4" }, { "task_id": "ws_B07MXPQFCT_8472", "instruction": "i'm looking for a gluten free cauliflower cizza crust", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07MXPQFCT" }, { "task_id": "ws_B0971CHBSM_8473", "instruction": "i am looking for 100th birthday cake toppers.", "target_attributes": { "attributes": [ "birthday party", "birthday cake" ], "options": [] }, "asin": "B0971CHBSM" }, { "task_id": "ws_B09DYZ9G64_8474", "instruction": "i am looking for watermelon flavored mango dragon fruit tea refresher having high fructose", "target_attributes": { "attributes": [ "high fructose" ], "options": [ "watermelon lime" ] }, "asin": "B09DYZ9G64" }, { "task_id": "ws_B01A99GE8I_8475", "instruction": "i am looking for kosher certified irish fortune cookies with pattern name :halloween", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "halloween" ] }, "asin": "B01A99GE8I" }, { "task_id": "ws_B07DK3TDFJ_8476", "instruction": "i am looking for certified organic loose leaf containing spirit herbal herbal tea flavor tea.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "spirit herbal herbal tea" ] }, "asin": "B07DK3TDFJ" }, { "task_id": "ws_B084XT44LP_8477", "instruction": "i would like a 18 individually wrapped hunnybrush tea bags.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "honeybush", "18 count (pack of 3)" ] }, "asin": "B084XT44LP" }, { "task_id": "ws_B084XT44LP_8478", "instruction": "i need18 count box of tea bags (pack of 3) caffeine free herbal tea", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "18 count (pack of 3)" ] }, "asin": "B084XT44LP" }, { "task_id": "ws_B084XT44LP_8479", "instruction": "i would like a pack of 3 herbal teas that are immune boosting.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "immune boost", "18 count (pack of 3)" ] }, "asin": "B084XT44LP" }, { "task_id": "ws_B08776TNBT_8480", "instruction": "i would like to have bike shorts with elastic waist which are in bold blue color and x-large in size.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "bold blue | white", "x-large" ] }, "asin": "B08776TNBT" }, { "task_id": "ws_B08TTWTVQR_8481", "instruction": "i would like a african american pretty girl hair kit for home hair cutting.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "african american pretty girl" ] }, "asin": "B08TTWTVQR" }, { "task_id": "ws_B09LGX32ZW_8482", "instruction": "looking for generic led bedside table set for living room also choose set of 2", "target_attributes": { "attributes": [ "living room" ], "options": [ "set of 2" ] }, "asin": "B09LGX32ZW" }, { "task_id": "ws_B08DFH72GP_8483", "instruction": "i am interested in buying a biege colored diner chai which is easy to assemble and ideal for the dining room.", "target_attributes": { "attributes": [ "easy assemble", "dining room" ], "options": [ "beige" ] }, "asin": "B08DFH72GP" }, { "task_id": "ws_B09PR7H15R_8484", "instruction": "i am looking for a super soft fleece throw that has the constellation zodiac scorpio color.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "constellation zodiac scorpio" ] }, "asin": "B09PR7H15R" }, { "task_id": "ws_B098JKB4Y9_8485", "instruction": "i am looking for large size soft material women's cardigans with pockets", "target_attributes": { "attributes": [ "soft material" ], "options": [ "large" ] }, "asin": "B098JKB4Y9" }, { "task_id": "ws_B07WPXV9MD_8486", "instruction": "i am looking for black color twisted x men\u2019s rubber outsole slip-on of size 12.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "black", "12 wide" ] }, "asin": "B07WPXV9MD" }, { "task_id": "ws_B09S3C8H4B_8487", "instruction": "i am interested in buying a xx-large sized onesie pajamas which is ideal for teen girls and is long sleeved.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "xx-large" ] }, "asin": "B09S3C8H4B" }, { "task_id": "ws_B09377V4Q9_8488", "instruction": "i am looking for drawstring closure denim pants that have an elastic waist, in the size large.", "target_attributes": { "attributes": [ "elastic waist", "drawstring closure" ], "options": [ "large" ] }, "asin": "B09377V4Q9" }, { "task_id": "ws_B08G3S9TND_8489", "instruction": "i am looking for long lasting dark navy color noise cancelling headphones.", "target_attributes": { "attributes": [ "noise cancelling", "long lasting" ], "options": [ "dark navy" ] }, "asin": "B08G3S9TND" }, { "task_id": "ws_B07MSM9DQN_8490", "instruction": "i would like a ultra hd usb hub.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [] }, "asin": "B07MSM9DQN" }, { "task_id": "ws_B083XRVRLB_8491", "instruction": "i want an ivory safavieh tulum rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "turquoise | ivory" ] }, "asin": "B083XRVRLB" }, { "task_id": "ws_B0855CNSB6_8492", "instruction": "i want cruelty free good chemistry silver coast body spray.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "body spray" ] }, "asin": "B0855CNSB6" }, { "task_id": "ws_B083BWCBCV_8493", "instruction": "i am looking for a spot clean roman shade window blinds which is easy to install. also choose size 24 w x 48 h.", "target_attributes": { "attributes": [ "spot clean", "easy install" ], "options": [ "24 w x 48 h" ] }, "asin": "B083BWCBCV" }, { "task_id": "ws_B083BWCBCV_8494", "instruction": "i am looking for easy install roman window blinds that are light filtering", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B083BWCBCV" }, { "task_id": "ws_B09PGX4H72_8495", "instruction": "i want gray aodong open toe sandals for women.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "a04-gray" ] }, "asin": "B09PGX4H72" }, { "task_id": "ws_B09RZDMDFJ_8496", "instruction": "i am searching for navy color x-large silk smooth slim fit long sleeve shirt for men", "target_attributes": { "attributes": [ "slim fit", "long sleeve" ], "options": [ "navy1", "x-large" ] }, "asin": "B09RZDMDFJ" }, { "task_id": "ws_B092T4BLQM_8497", "instruction": "i want dalang soy wax scented candles.", "target_attributes": { "attributes": [ "soy wax" ], "options": [] }, "asin": "B092T4BLQM" }, { "task_id": "ws_B07HKK54RY_8498", "instruction": "i'm looking for a rich creamy, ready to eat buttermilk syrup made from quality ingredients. also, choose a pack of 4 with maple flavored one.", "target_attributes": { "attributes": [ "rich creamy", "ready eat", "quality ingredients" ], "options": [ "maple", "4 pack" ] }, "asin": "B07HKK54RY" }, { "task_id": "ws_B084DLMXM9_8499", "instruction": "i am looking for a solid wood bed frames of espresso color", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "espresso" ] }, "asin": "B084DLMXM9" }, { "task_id": "ws_B0847CHSKF_8500", "instruction": "i need red colored cocktail glitter that is gmo free.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "red" ] }, "asin": "B0847CHSKF" }, { "task_id": "ws_B09H7LR8KT_8501", "instruction": "i am looking for an anti slip pair of booties with rubber sole. it should be a size 6 and coffee colored.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "coffee", "6" ] }, "asin": "B09H7LR8KT" }, { "task_id": "ws_B09SF2S8TZ_8502", "instruction": "i want beige flip flop open toe slippers.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "a2 - beige" ] }, "asin": "B09SF2S8TZ" }, { "task_id": "ws_B07XSJS2C3_8503", "instruction": "i am looking for long lasting lip balm stick with pack of 2.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "2 count (pack of 2)" ] }, "asin": "B07XSJS2C3" }, { "task_id": "ws_B09JW1K51V_8504", "instruction": "i am looking for a universal remote control with the aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B09JW1K51V" }, { "task_id": "ws_B09P3MCJW3_8505", "instruction": "i want a blanket that's quirky and is fleece throw. i would appreciate it if it was easy to clean too please", "target_attributes": { "attributes": [ "easy clean", "fleece throw" ], "options": [] }, "asin": "B09P3MCJW3" }, { "task_id": "ws_B07932ZN6V_8506", "instruction": "i would like some grey sneakers in a 7.5 that have a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "dk grey | lt grey", "7.5" ] }, "asin": "B07932ZN6V" }, { "task_id": "ws_B08H8T2GL3_8507", "instruction": "i would like a medium sized classic fit tank top for a girl.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "medium" ] }, "asin": "B08H8T2GL3" }, { "task_id": "ws_B09R4GN7P7_8508", "instruction": "get me a black t-shirt with short sleeves. i am an xx-large sized man.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "black", "xx-large" ] }, "asin": "B09R4GN7P7" }, { "task_id": "ws_B0981TPJ1Z_8509", "instruction": "i want a tree hut sugar body scrub for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B0981TPJ1Z" }, { "task_id": "ws_B07K125Z37_8510", "instruction": "i would like 2 thirty inch barstools with a dark gray tunic cover for the dining room.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "dark gray fabric", "2 pack", "30 inch" ] }, "asin": "B07K125Z37" }, { "task_id": "ws_B08BVTBHFC_8511", "instruction": "i want a seabear wild caught alaskan smoked salmon gift box.", "target_attributes": { "attributes": [ "wild caught" ], "options": [] }, "asin": "B08BVTBHFC" }, { "task_id": "ws_B08NFDZSYN_8512", "instruction": "i am looking for a storage cabinet for the kitchen which has a white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B08NFDZSYN" }, { "task_id": "ws_B08R6RYX4J_8513", "instruction": "i am looking for central park ombre window curtain panel's in gray 50'' x 84'' set of two for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "50\"x95\"x2" ] }, "asin": "B08R6RYX4J" }, { "task_id": "ws_B000SQQ2D0_8514", "instruction": "i am looking for a 450 mocha color oil free fragrance free face makeup", "target_attributes": { "attributes": [ "oil free", "fragrance free" ], "options": [ "450 mocha" ] }, "asin": "B000SQQ2D0" }, { "task_id": "ws_B099RPD1Y9_8515", "instruction": "i would like a pink body scrub for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "pink" ] }, "asin": "B099RPD1Y9" }, { "task_id": "ws_B099RPD1Y9_8516", "instruction": "i'm looking for a body scrub for dead and dry skin. also choose black colored one.", "target_attributes": { "attributes": [ "dead skin", "dry skin" ], "options": [ "black" ] }, "asin": "B099RPD1Y9" }, { "task_id": "ws_B09DPSQSX2_8517", "instruction": "i want to buy phone glass screen protector which is tempered glass and compatible with apple, the color should be clear, and suitable for iphone 11 pro.", "target_attributes": { "attributes": [ "compatible apple", "tempered glass" ], "options": [ "clear", "iphone 11 pro" ] }, "asin": "B09DPSQSX2" }, { "task_id": "ws_B09PLDZ4PH_8518", "instruction": "i want a small womens summer short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "small" ] }, "asin": "B09PLDZ4PH" }, { "task_id": "ws_B07D7T27T2_8519", "instruction": "i am looking for 16 size short satin homecoming unique design dress", "target_attributes": { "attributes": [ "unique design" ], "options": [ "16" ] }, "asin": "B07D7T27T2" }, { "task_id": "ws_B00AKSCXES_8520", "instruction": "i want small and machine washable champion men's shorts.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "small" ] }, "asin": "B00AKSCXES" }, { "task_id": "ws_B07QT9M8DL_8521", "instruction": "i am looking for classic fit dark heather color tank top.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "dark heather" ] }, "asin": "B07QT9M8DL" }, { "task_id": "ws_B08KBTZBRF_8522", "instruction": "i want x-large and machine washable leggings depot pajama pants.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "x-large" ] }, "asin": "B08KBTZBRF" }, { "task_id": "ws_B094QNSQ3V_8523", "instruction": "i would like a 8.5 inch wide black non slip platform wedge pair.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "tzz7-3_black", "8.5 wide" ] }, "asin": "B094QNSQ3V" }, { "task_id": "ws_B073PT96NN_8524", "instruction": "i wan a high speed micro usb cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B073PT96NN" }, { "task_id": "ws_B09KLVZXZC_8525", "instruction": "i want dual band and quad core smart streaming media tv box with high speed ,which is 4gb +64gb storage capacity", "target_attributes": { "attributes": [ "dual band", "high speed", "quad core" ], "options": [ "4gb+64gb" ] }, "asin": "B09KLVZXZC" }, { "task_id": "ws_B082DHB26W_8526", "instruction": "i am looking for a chocolate candy suitable for valentine day. and i choose kisses pink style", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "kisses pink" ] }, "asin": "B082DHB26W" }, { "task_id": "ws_B084Z7CNH9_8527", "instruction": "i am looking for noise cancelling on ear headphone of black color.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "black" ] }, "asin": "B084Z7CNH9" }, { "task_id": "ws_B06XNP64KD_8528", "instruction": "i want to buy loose leaf tea which is certified organic and has sleepytime bundle flavor and comes in 4 pack of 40 servings.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "sleepytime bundle", "4-pack (40 servings)" ] }, "asin": "B06XNP64KD" }, { "task_id": "ws_B06XNP64KD_8529", "instruction": "i want to buy a ten count tea sampler that's certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "10 count (pack of 3)" ] }, "asin": "B06XNP64KD" }, { "task_id": "ws_B07LCGV1K8_8530", "instruction": "i am looking for a portable artist storage bag for nail polish and makeup things. also choose corgi-1 color.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "corgi-1" ] }, "asin": "B07LCGV1K8" }, { "task_id": "ws_B073V9FL3F_8531", "instruction": "i need an 8 oz coffee substitute that is caffeine free", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "8 ounce (pack of 1)" ] }, "asin": "B073V9FL3F" }, { "task_id": "ws_B073V9FL3F_8532", "instruction": "order for me cocoa blend caffein free drink with natural ingredients.", "target_attributes": { "attributes": [ "caffeine free", "natural ingredients" ], "options": [ "cocoa blend" ] }, "asin": "B073V9FL3F" }, { "task_id": "ws_B09575PQ3Y_8533", "instruction": "i am looking for a long lasting eye shadow pen having 7#violet color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "7#violet" ] }, "asin": "B09575PQ3Y" }, { "task_id": "ws_B014P0KPZK_8534", "instruction": "i am looking for some ready to eat graham crackers.", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B014P0KPZK" }, { "task_id": "ws_B07YDMRQRT_8535", "instruction": "i need a bath brush with a long handle that is green", "target_attributes": { "attributes": [ "long handle" ], "options": [ "green" ] }, "asin": "B07YDMRQRT" }, { "task_id": "ws_B08BJ1RKYM_8536", "instruction": "i would like a 50 by 60 inch fleece throw decorated with a tractor.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "tractor", "50\" x 60\"" ] }, "asin": "B08BJ1RKYM" }, { "task_id": "ws_B07T9GKCPC_8537", "instruction": "i'm looking for hair care solutions.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "treatment" ] }, "asin": "B07T9GKCPC" }, { "task_id": "ws_B071QZ7RMJ_8538", "instruction": "i want paraben free and oatmeal shampoo.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "oatmeal, milk & honey" ] }, "asin": "B071QZ7RMJ" }, { "task_id": "ws_B01N0OQMC7_8539", "instruction": "i need a high resolution decal sticker skin for my ps4. it should be long lasting.", "target_attributes": { "attributes": [ "long lasting", "high resolution" ], "options": [] }, "asin": "B01N0OQMC7" }, { "task_id": "ws_B09PH88J47_8540", "instruction": "i'm looking for a long sleeve sweatshirts black flower for valentines", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black flower", "xx-large" ] }, "asin": "B09PH88J47" }, { "task_id": "ws_B07PJXGY87_8541", "instruction": "i am looking for always women high waisted capri leggings.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "small" ] }, "asin": "B07PJXGY87" }, { "task_id": "ws_B086FP44F4_8542", "instruction": "i am looking for a 12 fl oz (pack of 4) of non alcoholic low calorie soft drinks", "target_attributes": { "attributes": [ "non alcoholic", "low calorie" ], "options": [ "12 fl oz (pack of 4)" ] }, "asin": "B086FP44F4" }, { "task_id": "ws_B01BMP2VBM_8543", "instruction": "i would like a 10 gram packet of crimson long lasting nail glitter.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "crimson", "10 gram" ] }, "asin": "B01BMP2VBM" }, { "task_id": "ws_B0935ZKGDQ_8544", "instruction": "i am looking for a height adjustable barstool with footrest. i want something in brown.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "brown" ] }, "asin": "B0935ZKGDQ" }, { "task_id": "ws_B098NWSMVT_8545", "instruction": "i want to get the elastic waistband mofiz women golf short knee-length lounge shorts, khaki color.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "khaki" ] }, "asin": "B098NWSMVT" }, { "task_id": "ws_B09F72DMWB_8546", "instruction": "i need an easy to use trail camera", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09F72DMWB" }, { "task_id": "ws_B01F5W3IFQ_8547", "instruction": "i am looking for wireless bluetooth speaker.please choose gray one.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "gray" ] }, "asin": "B01F5W3IFQ" }, { "task_id": "ws_B09PLDNV8N_8548", "instruction": "i want to buy knee high boots in color brown and having size 8.5.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "brown", "8.5" ] }, "asin": "B09PLDNV8N" }, { "task_id": "ws_B09G2YMNLC_8549", "instruction": "i would like a ac adapter that has output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B09G2YMNLC" }, { "task_id": "ws_B08DK4ZKVM_8550", "instruction": "i am looking for a wall mounted book shelf . ad i would prefer the driftwood color", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "driftwood", "book shelf" ] }, "asin": "B08DK4ZKVM" }, { "task_id": "ws_B09PGGRFRD_8551", "instruction": "get me a hand washable short sleeved loose fit top in army green color and 3x-large size.", "target_attributes": { "attributes": [ "loose fit", "hand wash", "short sleeve" ], "options": [ "army\u00a0green", "3x-large" ] }, "asin": "B09PGGRFRD" }, { "task_id": "ws_B007HQNIFO_8552", "instruction": "i would like a two pack of chicken that is shelf stable", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "2 pack" ] }, "asin": "B007HQNIFO" }, { "task_id": "ws_B07MXPLFSH_8553", "instruction": "i would like 100 bags of green usda organic tea.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "green", "100 count (pack of 1)" ] }, "asin": "B07MXPLFSH" }, { "task_id": "ws_B07MXPLFSH_8554", "instruction": "i would like 10 bags of peach green tea usda organic tea.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "peach green", "10 count (pack of 1)" ] }, "asin": "B07MXPLFSH" }, { "task_id": "ws_B09Q83RGBW_8555", "instruction": "i'm looking for a mini desktop computer with 16 gigs of ram and that comes equipped with intel core i5.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "16g ram 128g ssd" ] }, "asin": "B09Q83RGBW" }, { "task_id": "ws_B09Q83RGBW_8556", "instruction": "i want an i5 intel core mini pc. it should be 10300h", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "i5 10300h" ] }, "asin": "B09Q83RGBW" }, { "task_id": "ws_B09HNMGGPR_8557", "instruction": "i would like a beige concealer for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "04 beige" ] }, "asin": "B09HNMGGPR" }, { "task_id": "ws_B08QRW7T8M_8558", "instruction": "i'm looking for this product : qumox wireless pro controller remote control pro gamepad joystick with dual vibration if you find it let me know soon i need wireless bluetooth", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B08QRW7T8M" }, { "task_id": "ws_B00638B5XE_8559", "instruction": "i'm looking for a high protein meat jerky which should be free from gluten, soy and dairy products.", "target_attributes": { "attributes": [ "gluten free", "soy free", "high protein", "dairy free" ], "options": [] }, "asin": "B00638B5XE" }, { "task_id": "ws_B07HN56LFJ_8560", "instruction": "i would like a polyester cotton hoodie with flowers on it.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "flower-bk-best" ] }, "asin": "B07HN56LFJ" }, { "task_id": "ws_B08JCCGYHX_8561", "instruction": "i would like some pink birthday candles for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "pink" ] }, "asin": "B08JCCGYHX" }, { "task_id": "ws_B09QX6TZ84_8562", "instruction": "find me a black 3x-large mens t-shit with button closure aloha theme", "target_attributes": { "attributes": [ "button closure" ], "options": [ "black", "3x-large" ] }, "asin": "B09QX6TZ84" }, { "task_id": "ws_B07HFGJ198_8563", "instruction": "i need flouride free toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B07HFGJ198" }, { "task_id": "ws_B097QXRFK1_8564", "instruction": "i'm looking for a medium skirt with side pockets in polyester spandex, choose navy blue color", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "navy blue", "medium" ] }, "asin": "B097QXRFK1" }, { "task_id": "ws_B08YHMV46N_8565", "instruction": "i am looking for a wicked hot gluten free salsas", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "wicked hot" ] }, "asin": "B08YHMV46N" }, { "task_id": "ws_B00Y7X9WI2_8566", "instruction": "i need a cinewhite projector screen that is ultra hd and light weight.", "target_attributes": { "attributes": [ "ultra hd", "light weight" ], "options": [ "cinewhite" ] }, "asin": "B00Y7X9WI2" }, { "task_id": "ws_B0983BYQ5B_8567", "instruction": "i am looking for height adjustable, mid century crystal chandelier lighting for living room, gold color, size 23.6\"", "target_attributes": { "attributes": [ "height adjustable", "mid century", "living room" ], "options": [] }, "asin": "B0983BYQ5B" }, { "task_id": "ws_B07DPKKDMT_8568", "instruction": "my son needs a mattress, look for the greaton brand, fully assembled, box spring. includes 8\" split base | full xl size...", "target_attributes": { "attributes": [ "fully assembled", "box spring" ], "options": [ "includes 8\" split foundation | full xl siz..." ] }, "asin": "B07DPKKDMT" }, { "task_id": "ws_B08ZXT2J28_8569", "instruction": "i am looking for solo loop dark grey band compatible with apple watch bands 38mm 40mm", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "dark gray", "38mm | 40mm" ] }, "asin": "B08ZXT2J28" }, { "task_id": "ws_B08523PPK3_8570", "instruction": "i would like a leo candle made of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "leo candle" ] }, "asin": "B08523PPK3" }, { "task_id": "ws_B08523PPK3_8571", "instruction": "i would like a sagittarius candle that has soy wax", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "sagittarius candle" ] }, "asin": "B08523PPK3" }, { "task_id": "ws_B07D5ZYQDD_8572", "instruction": "please look for peet's iced espresso vanilla latte 8 oz can with quality ingredients.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [] }, "asin": "B07D5ZYQDD" }, { "task_id": "ws_B01MYDEK74_8573", "instruction": "i am looking for 5.9 fl oz eau de parfum - fragrance mist for women", "target_attributes": { "attributes": [ "long lasting", "fine mist" ], "options": [ "5.9 fl oz" ] }, "asin": "B01MYDEK74" }, { "task_id": "ws_B00083HDGS_8574", "instruction": "i want a black bellagio european outdoor carriage light fixture.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "black - clear - double bridge" ] }, "asin": "B00083HDGS" }, { "task_id": "ws_B01EFOZHB8_8575", "instruction": "i'm looking for pomegranate blueberry flavored energy drinks. preferably with vitamins. i want a pack too", "target_attributes": { "attributes": [ "source vitamin" ], "options": [ "8 fl oz (pack of 6)" ] }, "asin": "B01EFOZHB8" }, { "task_id": "ws_B08NXFTJDK_8576", "instruction": "i would like to buy men's briefs which is easy care and of stripe color and a unique design.", "target_attributes": { "attributes": [ "easy care", "unique design" ], "options": [ "stripe" ] }, "asin": "B08NXFTJDK" }, { "task_id": "ws_B093SX96B7_8577", "instruction": "i want a set of 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SX96B7" }, { "task_id": "ws_B074G399NJ_8578", "instruction": "i want cruelty free illuminating makeup mist.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B074G399NJ" }, { "task_id": "ws_B076DLGKK9_8579", "instruction": "i would like a pair of size 6 black luster satin pumps with a open toe.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black luster satin", "6 wide" ] }, "asin": "B076DLGKK9" }, { "task_id": "ws_B08HR995R3_8580", "instruction": "i am interested in gray faux leather barstools", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "gray | black" ] }, "asin": "B08HR995R3" }, { "task_id": "ws_B08HR995R3_8581", "instruction": "i need a faux leather barstool that is 30\" in height.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "30\" bar height" ] }, "asin": "B08HR995R3" }, { "task_id": "ws_B00NW4QK5A_8582", "instruction": "i am looking for certified organic sandwich crackers.", "target_attributes": { "attributes": [ "certified organic" ], "options": [] }, "asin": "B00NW4QK5A" }, { "task_id": "ws_B093YS4MDR_8583", "instruction": "i want a set of 2 mesh laundry bags with deer floral arrows design.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YS4MDR" }, { "task_id": "ws_B07K9C1J7G_8584", "instruction": "i am looking for a pc build that's a linux and it is core i5. size: no ram please and thank you", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "no ram | ssd | hdd" ] }, "asin": "B07K9C1J7G" }, { "task_id": "ws_B00EE3XEN4_8585", "instruction": "i would like to buy individually wrapped hand crafted olive oil tortas. i would prefer them in packs of 10.", "target_attributes": { "attributes": [ "hand crafted", "individually wrapped" ], "options": [ "pack of 10" ] }, "asin": "B00EE3XEN4" }, { "task_id": "ws_B075CSVYBK_8586", "instruction": "i am looking for some gluten free berries.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B075CSVYBK" }, { "task_id": "ws_B09NR8VT9K_8587", "instruction": "i want a black hazel velvet king sized bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "black" ] }, "asin": "B09NR8VT9K" }, { "task_id": "ws_B09N725812_8588", "instruction": "i am looking for medium size tank tops for women that can be washed through hands.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "medium" ] }, "asin": "B09N725812" }, { "task_id": "ws_B08ZS5C61B_8589", "instruction": "i am looking for a stainless steel watch bands for my smart watch. and i choose the 18mm size with black color", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black", "18mm" ] }, "asin": "B08ZS5C61B" }, { "task_id": "ws_B08F1V39HN_8590", "instruction": "i need a super soft baby sized blanket throw for my living room.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "baby(30\"x40\")" ] }, "asin": "B08F1V39HN" }, { "task_id": "ws_B07W7SQN53_8591", "instruction": "i need a sugar free lemon cream with raspberry lemonade flavor", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "raspberry lemonade" ] }, "asin": "B07W7SQN53" }, { "task_id": "ws_B07W7SQN53_8592", "instruction": "i would like a mango flavored salt water taffy that is old fashioned.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "mango" ] }, "asin": "B07W7SQN53" }, { "task_id": "ws_B09FLSP4J4_8593", "instruction": "i need a white queen sized bed with storage space.", "target_attributes": { "attributes": [ "queen size", "storage space" ], "options": [ "white", "queen" ] }, "asin": "B09FLSP4J4" }, { "task_id": "ws_B07QK461YX_8594", "instruction": "i am looking for blueberry muffin scent candles that are long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "blueberry muffin" ] }, "asin": "B07QK461YX" }, { "task_id": "ws_B08H8PKF88_8595", "instruction": "i am interested in a wall mounted candle holder scone which has a glass shade.", "target_attributes": { "attributes": [ "wall mounted", "glass shade" ], "options": [] }, "asin": "B08H8PKF88" }, { "task_id": "ws_B084VGH8R2_8596", "instruction": "i need eco friendly fully assembled and red color 3 drawer rolling file cabinet", "target_attributes": { "attributes": [ "fully assembled", "eco friendly" ], "options": [ "orange" ] }, "asin": "B084VGH8R2" }, { "task_id": "ws_B09SKTG812_8597", "instruction": "i am looking for red color, 3x-large pajamas polyester cotton nightgowns for women", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "red", "3x-large" ] }, "asin": "B09SKTG812" }, { "task_id": "ws_B09QSZ5KX3_8598", "instruction": "looking for long sleeve regular fit shirts for men that's colour black", "target_attributes": { "attributes": [ "machine wash", "long sleeve", "regular fit" ], "options": [ "black" ] }, "asin": "B09QSZ5KX3" }, { "task_id": "ws_B091C8JKQQ_8599", "instruction": "i am looking for an 18 light chandelier for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "18-light" ] }, "asin": "B091C8JKQQ" }, { "task_id": "ws_B00I5437GM_8600", "instruction": "i am looking for some anti aging revitalizing shampoo and conditioner with natural ingredients.", "target_attributes": { "attributes": [ "anti aging", "natural ingredients" ], "options": [ "conditioner" ] }, "asin": "B00I5437GM" }, { "task_id": "ws_B09BQT2899_8601", "instruction": "i am looking for ottomans that are round and made of pu leather", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "round" ] }, "asin": "B09BQT2899" }, { "task_id": "ws_B095Y6LXDV_8602", "instruction": "i need tamanu scented vitamin e oil for my face to reduce fine lines. i have dry skin.", "target_attributes": { "attributes": [ "fine lines", "dry skin" ], "options": [ "tamanu" ] }, "asin": "B095Y6LXDV" }, { "task_id": "ws_B09R4RJSFP_8603", "instruction": "i need a 120 ml hair mask treatment", "target_attributes": { "attributes": [ "hair treatment" ], "options": [ "120ml" ] }, "asin": "B09R4RJSFP" }, { "task_id": "ws_B09PY394BJ_8604", "instruction": "i need small black ,one count easy to use dental guard", "target_attributes": { "attributes": [ "easy use" ], "options": [ "small black 1 count" ] }, "asin": "B09PY394BJ" }, { "task_id": "ws_B0894K3JRR_8605", "instruction": "i am looking for gluten free norwegian crispbread.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B0894K3JRR" }, { "task_id": "ws_B098QB8QZD_8606", "instruction": "i'm looking for stretch jeggings for women.", "target_attributes": { "attributes": [ "slim fit", "high waist" ], "options": [ "large" ] }, "asin": "B098QB8QZD" }, { "task_id": "ws_B092MR8TWP_8607", "instruction": "i want to buy a dress for women which i can machine wash and has yellow color, as for the size i want it to be 4x-large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "z7-yellow", "4x-large" ] }, "asin": "B092MR8TWP" }, { "task_id": "ws_B07Q434SD2_8608", "instruction": "i'm looking for a organic tea tree oil. also, choose vanilla flavored one.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "vanilla" ] }, "asin": "B07Q434SD2" }, { "task_id": "ws_B096ZXYXYZ_8609", "instruction": "i would like a heart sunflower heavy duty phone case.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "heart sunflower" ] }, "asin": "B096ZXYXYZ" }, { "task_id": "ws_B098B35RV4_8610", "instruction": "i need black colored natural hair extensions.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "black" ] }, "asin": "B098B35RV4" }, { "task_id": "ws_B098B35RV4_8611", "instruction": "i need some hair extensions that are blue and pink", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "blue | pink" ] }, "asin": "B098B35RV4" }, { "task_id": "ws_B09Q94HNBX_8612", "instruction": "hello, i would like to have leggings that could go up to my waist please? also, pick purple", "target_attributes": { "attributes": [ "high waist" ], "options": [ "purple" ] }, "asin": "B09Q94HNBX" }, { "task_id": "ws_B08THCKV97_8613", "instruction": "i would like a 52 inch wide and 63 inch long pair of light grey window panels for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light grey", "w 52 x l 63 | pair" ] }, "asin": "B08THCKV97" }, { "task_id": "ws_B089FMKLB9_8614", "instruction": "i want a 5x7ft vinyl shabby wooden loft background for digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "5x7ft" ] }, "asin": "B089FMKLB9" }, { "task_id": "ws_B08JKWLXTD_8615", "instruction": "i want a gold plated 85ft usb-c to 2 rca stereo audio cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "85ft" ] }, "asin": "B08JKWLXTD" }, { "task_id": "ws_B08JKWLXTD_8616", "instruction": "gold plated stereo sound cable input usb port", "target_attributes": { "attributes": [ "gold plated", "usb port", "stereo sound" ], "options": [] }, "asin": "B08JKWLXTD" }, { "task_id": "ws_B08R4TGCYJ_8617", "instruction": "i am looking for 6 packs of nut free, soy free, dairy free chocolate candy variety pack", "target_attributes": { "attributes": [ "dairy free", "nut free", "soy free" ], "options": [ "variety pack", "15 count (pack of 6)" ] }, "asin": "B08R4TGCYJ" }, { "task_id": "ws_B08VVMNDD3_8618", "instruction": "i am looking for low calorie gelatin mix.", "target_attributes": { "attributes": [ "low calorie" ], "options": [] }, "asin": "B08VVMNDD3" }, { "task_id": "ws_B084NZ2GKF_8619", "instruction": "i am looking for the perfect wedding gift of chocolates that has 27 pieces", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "box of 27" ] }, "asin": "B084NZ2GKF" }, { "task_id": "ws_B09QG6QB9K_8620", "instruction": "i want a teeth whitening toothpaste that removes bad breath. pick an orange one.", "target_attributes": { "attributes": [ "teeth whitening", "bad breath" ], "options": [ "orange" ] }, "asin": "B09QG6QB9K" }, { "task_id": "ws_B098KN2L32_8621", "instruction": "i would like some grass fed spicy jerky", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "sweet & spicy beef jerky" ] }, "asin": "B098KN2L32" }, { "task_id": "ws_B09SH3RXVC_8622", "instruction": "i'm looking for monocular telescope tripod phone mount binoculars.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09SH3RXVC" }, { "task_id": "ws_B07PSSYVJ4_8623", "instruction": "find me a x-small white slipknot t-shirt classic fit for men", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "white", "men", "x-small" ] }, "asin": "B07PSSYVJ4" }, { "task_id": "ws_B0999D5BKP_8624", "instruction": "i am looking for a refresher spray for the curl hair of my wife that is suitable for hair growth. and i choose the a pack of 3", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "8.12 fl oz (pack of 3)" ] }, "asin": "B0999D5BKP" }, { "task_id": "ws_B08BJ5RYSD_8625", "instruction": "i need you to get me slip resistant shoes that has open toes and is white in color. pick a size 4.", "target_attributes": { "attributes": [ "slip resistant", "open toe" ], "options": [ "white", "4" ] }, "asin": "B08BJ5RYSD" }, { "task_id": "ws_B09HL5PF8X_8626", "instruction": "i am looking for non alcoholic sparkling refreshments in the sauvignon blanc flavor.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "sauvignon blanc" ] }, "asin": "B09HL5PF8X" }, { "task_id": "ws_B09HL5PF8X_8627", "instruction": "i would like a 12 pack of non alcoholic rose seltzer water.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "ros\u00e9 (sparkling)", "pack of 12" ] }, "asin": "B09HL5PF8X" }, { "task_id": "ws_B074Q2C6ZP_8628", "instruction": "i am looking for anti aging cream with green tea and hyaluronic acid. i want it to be effective for dark circles", "target_attributes": { "attributes": [ "anti aging", "hyaluronic acid", "green tea", "dark circles" ], "options": [] }, "asin": "B074Q2C6ZP" }, { "task_id": "ws_B095JYNXS1_8629", "instruction": "i need a royal blue dress with draw string closure. i am a size 17.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "royal blue", "17" ] }, "asin": "B095JYNXS1" }, { "task_id": "ws_B0014CWPQA_8630", "instruction": "i need 12 ounce hormel spam that is cooked fully", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B0014CWPQA" }, { "task_id": "ws_B07BGS3QYM_8631", "instruction": "i want violet and hands free walkie talkies for adults.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "m880 violet" ] }, "asin": "B07BGS3QYM" }, { "task_id": "ws_B09RMKGTC8_8632", "instruction": "i want a twin xl long lasting memory form 6 in mattress for bed", "target_attributes": { "attributes": [ "long lasting", "memory foam" ], "options": [ "twin xl" ] }, "asin": "B09RMKGTC8" }, { "task_id": "ws_B09QQQWN1R_8633", "instruction": "i am looking for women's sandals of a7-green color that are non slippable.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "a7-green" ] }, "asin": "B09QQQWN1R" }, { "task_id": "ws_B01HJWC5FE_8634", "instruction": "i am looking for a high speed hdmi male to female cable that is 30 feet long. pick a 2 pack one.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "30-feet (2-pack)", "hdmi male to female" ] }, "asin": "B01HJWC5FE" }, { "task_id": "ws_B01HJWC5FE_8635", "instruction": "i would like two packs of three foot long gold plated hdmi male to male cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "2 pack", "3 feet (10 pack)", "hdmi male to female" ] }, "asin": "B01HJWC5FE" }, { "task_id": "ws_B08X9Q5CPC_8636", "instruction": "i want lundberg organic white chocolate thin stackers.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "white chocolate lemon poppy seed" ] }, "asin": "B08X9Q5CPC" }, { "task_id": "ws_B09SWGQL2Y_8637", "instruction": "i want 1 biotin thickening herbal serum for hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "1 pcs" ] }, "asin": "B09SWGQL2Y" }, { "task_id": "ws_B00KOUK3SK_8638", "instruction": "i need blue and yellow headphones that have batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "blue | yellow" ] }, "asin": "B00KOUK3SK" }, { "task_id": "ws_B08BS5LW7X_8639", "instruction": "i'm looking for a desktop computer with inel core core i5 10th generation.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "10th gen intel core i3" ] }, "asin": "B08BS5LW7X" }, { "task_id": "ws_B08BY7S34M_8640", "instruction": "i'm looking for electric hair clipper for men.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [] }, "asin": "B08BY7S34M" }, { "task_id": "ws_B07MZ8T6TK_8641", "instruction": "i am looking for caribbean blue color non slippable silicone cases that are compatible with apple iphone.", "target_attributes": { "attributes": [ "non slip", "compatible apple" ], "options": [ "caribbean blue" ] }, "asin": "B07MZ8T6TK" }, { "task_id": "ws_B08PC3KRFT_8642", "instruction": "i need a slim fitting short sleeved t-shirt in copper color. pick one in xx-large tall size.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "copper", "xx-large tall" ] }, "asin": "B08PC3KRFT" }, { "task_id": "ws_B07KXV5WKD_8643", "instruction": "i am interested in buying sweatpants for men which can be machine washed have navy color, and are large size.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy", "large" ] }, "asin": "B07KXV5WKD" }, { "task_id": "ws_B09KQZ9GTK_8644", "instruction": "i am looking for terrace garden style conditioner that are eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "terrace garden" ] }, "asin": "B09KQZ9GTK" }, { "task_id": "ws_B075DL8NTG_8645", "instruction": "i would like a pair of small blue shorts made of nylon spandex.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "blue", "small" ] }, "asin": "B075DL8NTG" }, { "task_id": "ws_B076MH2RS8_8646", "instruction": "i would like to purchase gramzero banana suger free fooding mix specially low calorie dessert vanilla flavor .", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B076MH2RS8" }, { "task_id": "ws_B08D8D2Q1N_8647", "instruction": "i'm looking for safety boots for men and women.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "blue" ] }, "asin": "B08D8D2Q1N" }, { "task_id": "ws_B093D3GL6X_8648", "instruction": "i need long lasting wax candles that is scented with lemon verbera", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [] }, "asin": "B093D3GL6X" }, { "task_id": "ws_B098SQRW4Z_8649", "instruction": "i would like a 32 gb ram intel i5 core desktop mini.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "32gb ram | 1tb ssd + 1tb hdd" ] }, "asin": "B098SQRW4Z" }, { "task_id": "ws_B08289BWBK_8650", "instruction": "i'm looking for a contemporary style coffee table with tempered glass.", "target_attributes": { "attributes": [ "contemporary style", "tempered glass" ], "options": [] }, "asin": "B08289BWBK" }, { "task_id": "ws_B09NPXFG3L_8651", "instruction": "i want to buy usb cable for fast charging iphone, and is high speed, also it should be 3ft long, while the type should be usb c.", "target_attributes": { "attributes": [ "fast charging", "high speed" ], "options": [ "3ft", "usb c" ] }, "asin": "B09NPXFG3L" }, { "task_id": "ws_B09F5Q16WG_8652", "instruction": "i'm looking for high waisted denim shorts distressed jeans for women.", "target_attributes": { "attributes": [ "slim fit", "button closure" ], "options": [ "large" ] }, "asin": "B09F5Q16WG" }, { "task_id": "ws_B01326VR0U_8653", "instruction": "i want gold and jade fresh collagen eye roller serum for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "gold + jade, gua sha combo" ] }, "asin": "B01326VR0U" }, { "task_id": "ws_B09PH1XZG8_8654", "instruction": "i would like a large tops a4c4 army green short sleeve t shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "tops a4c4 army green", "large" ] }, "asin": "B09PH1XZG8" }, { "task_id": "ws_B09KCB2HVL_8655", "instruction": "i am looking for a high quality waterproof makeup bag that can be cleaned easily", "target_attributes": { "attributes": [ "easy clean", "high quality" ], "options": [] }, "asin": "B09KCB2HVL" }, { "task_id": "ws_B09PG34T51_8656", "instruction": "i want white wall decoration for my beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "white 4" ] }, "asin": "B09PG34T51" }, { "task_id": "ws_B09PG34T51_8657", "instruction": "i need some white nail polish that i would find at a beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "white 5" ] }, "asin": "B09PG34T51" }, { "task_id": "ws_B096V19HPV_8658", "instruction": "i am interesed in buying a 12 pack travel size storage organizer.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "12 pack" ] }, "asin": "B096V19HPV" }, { "task_id": "ws_B092VRWTC7_8659", "instruction": "i am looking non slip vinyl acetate women walking shoe size 13.5 color grey _black_white", "target_attributes": { "attributes": [ "non slip", "vinyl acetate" ], "options": [ "grey_black_white", "13.5 women | 11 men" ] }, "asin": "B092VRWTC7" }, { "task_id": "ws_B07H8KZVGS_8660", "instruction": "i like to get a king size bedspread with high density. pick an orange cream one.", "target_attributes": { "attributes": [ "high density", "king size" ], "options": [ "orange cream", "king" ] }, "asin": "B07H8KZVGS" }, { "task_id": "ws_B09FVM644T_8661", "instruction": "i need a slim fit gray colored coat that has long sleeves. it should be in x-large size.", "target_attributes": { "attributes": [ "slim fit", "long sleeve", "daily wear" ], "options": [ "gray", "x-large" ] }, "asin": "B09FVM644T" }, { "task_id": "ws_B08HS8PFXK_8662", "instruction": "i want a black and easy to use cluster mascara wand.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "black" ] }, "asin": "B08HS8PFXK" }, { "task_id": "ws_B08C2BYZ12_8663", "instruction": "i want a white tommy hilfiger men's long sleeve button down shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "white print" ] }, "asin": "B08C2BYZ12" }, { "task_id": "ws_B084JQFVLX_8664", "instruction": "i am looking for grey color 4 drawers console sofa entry table for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey" ] }, "asin": "B084JQFVLX" }, { "task_id": "ws_B09NNRN32Y_8665", "instruction": "i am interested in buying a blue colored noise cancelling headphones with wireless bluetooth available.", "target_attributes": { "attributes": [ "noise cancelling", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B09NNRN32Y" }, { "task_id": "ws_B09C2D7VFN_8666", "instruction": "i would like a antique gray twin size bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "antique gray+normal white(without ladder)" ] }, "asin": "B09C2D7VFN" }, { "task_id": "ws_B08Z8CBK34_8667", "instruction": "i would love to buy a heavy duty dust proof case for my iphone xs in black and gray color.", "target_attributes": { "attributes": [ "heavy duty", "dust proof" ], "options": [ "black & gray" ] }, "asin": "B08Z8CBK34" }, { "task_id": "ws_B097LPYD9Z_8668", "instruction": "i'm looking for heels cupcake toppers for gender reveal party baby shower birthday.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "characters | shape" ] }, "asin": "B097LPYD9Z" }, { "task_id": "ws_B07YJMPX7T_8669", "instruction": "i am looking for long sleeve x-large crew neck caramel color casual pullover", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "01 caramel", "x-large" ] }, "asin": "B07YJMPX7T" }, { "task_id": "ws_B09PD1GNT5_8670", "instruction": "i am interested in buying sandals for women which have open toe, are knee high, and are in white color, while the size should be 6.5.", "target_attributes": { "attributes": [ "open toe", "knee high" ], "options": [ "d white", "6.5" ] }, "asin": "B09PD1GNT5" }, { "task_id": "ws_B085DP1X9F_8671", "instruction": "i will like to have a synthetic sole, memory foam cc corso como women's denice, size 5.5 and tan color", "target_attributes": { "attributes": [ "synthetic sole", "memory foam" ], "options": [ "tan", "5.5" ] }, "asin": "B085DP1X9F" }, { "task_id": "ws_B07461B3JK_8672", "instruction": "i am looking for women's pants of wine red color with elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "wine red" ] }, "asin": "B07461B3JK" }, { "task_id": "ws_B07LCFSV4H_8673", "instruction": "i am looking for a prom dresse with unique design. and i choose the 8\" size with plum color", "target_attributes": { "attributes": [ "unique design" ], "options": [ "plum", "8" ] }, "asin": "B07LCFSV4H" }, { "task_id": "ws_B08XNHLLBS_8674", "instruction": "i need a set of 4 dining chairs for my dining room. it should be light grey in color.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "light grey", "dining chairs set of 4" ] }, "asin": "B08XNHLLBS" }, { "task_id": "ws_B07T5B23NB_8675", "instruction": "i want a 30 ml sized travel bottle which is leak proof.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [ "30ml | 1 ounce" ] }, "asin": "B07T5B23NB" }, { "task_id": "ws_B095VRQH5M_8676", "instruction": "i want to buy workout sets outfits for women which are high waist and machine washable while their color should be grey, and with the size of x-large.", "target_attributes": { "attributes": [ "machine washable", "high waist" ], "options": [ "grey", "x-large" ] }, "asin": "B095VRQH5M" }, { "task_id": "ws_B093KDK7V9_8677", "instruction": "i want a travel friendly imported zipper laundry bag for blouse, hosiery ,lingeries", "target_attributes": { "attributes": [ "blouse hosiery", "imported zipper", "laundry bag" ], "options": [] }, "asin": "B093KDK7V9" }, { "task_id": "ws_B013WHJDGY_8678", "instruction": "i am looking for gluten free banana flavored original protein shake", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "banana" ] }, "asin": "B013WHJDGY" }, { "task_id": "ws_B00BJKPR9Y_8679", "instruction": "looking for freeze dried green fruit snacks also choose size: 0.36 ounce (pack of 24)", "target_attributes": { "attributes": [ "freeze dried" ], "options": [] }, "asin": "B00BJKPR9Y" }, { "task_id": "ws_B019WYQM9M_8680", "instruction": "i want a herbal magic hair loss treatment for promoting hair growth. make sure that it is non-toxic.", "target_attributes": { "attributes": [ "non toxic", "hair loss" ], "options": [ "herbal magic" ] }, "asin": "B019WYQM9M" }, { "task_id": "ws_B019WYQM9M_8681", "instruction": "i want to find a 16 ounce box of certified organic hair loss treatment with an herbal magic scent.", "target_attributes": { "attributes": [ "certified organic", "hair loss" ], "options": [ "16 ounce", "herbal magic" ] }, "asin": "B019WYQM9M" }, { "task_id": "ws_B019WYQM9M_8682", "instruction": "i used herbal magi shampoo for hair growth", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "herbal magic" ] }, "asin": "B019WYQM9M" }, { "task_id": "ws_B019WYQM9M_8683", "instruction": "i want laritelle organic hair loss treatment.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "hair treatment" ] }, "asin": "B019WYQM9M" }, { "task_id": "ws_B08TW3NHZG_8684", "instruction": "i am interested in a fresh breath spray of peppermint flavor.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B08TW3NHZG" }, { "task_id": "ws_B07TJ9XBFJ_8685", "instruction": "i need a speaker wireless with usb port in green color", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "green" ] }, "asin": "B07TJ9XBFJ" }, { "task_id": "ws_B08LQXTWLX_8686", "instruction": "i want black skechers sport women's d'lites memory foam shoes.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black | multi" ] }, "asin": "B08LQXTWLX" }, { "task_id": "ws_B08NVQSL1L_8687", "instruction": "i want an easy to use pair of moisturizing gloves to remedy rough skin.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B08NVQSL1L" }, { "task_id": "ws_B09T6LC973_8688", "instruction": "i would like a two piece hair treatment for hair growth", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "2pcs" ] }, "asin": "B09T6LC973" }, { "task_id": "ws_B08QDT3S6Y_8689", "instruction": "i am looking for high power sound bar that is also dust proof.", "target_attributes": { "attributes": [ "dust proof", "high power" ], "options": [] }, "asin": "B08QDT3S6Y" }, { "task_id": "ws_B09PMF152X_8690", "instruction": "i'm looking for a blue power bank with a usb port and wireless charging", "target_attributes": { "attributes": [ "usb port", "wireless charging" ], "options": [ "blue" ] }, "asin": "B09PMF152X" }, { "task_id": "ws_B07KM6LT41_8691", "instruction": "i want a black 1080p hd mini projector.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "black-white" ] }, "asin": "B07KM6LT41" }, { "task_id": "ws_B08M9M92HF_8692", "instruction": "i would like a queen sized multicolored comforter set that's easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "multi 47", "queen" ] }, "asin": "B08M9M92HF" }, { "task_id": "ws_B09PDCS3GZ_8693", "instruction": "i am interested in buying a short sleeve blouse for men which i can wash in a washing machine and it's f red in color with a size of 3x-large.", "target_attributes": { "attributes": [ "machine washable", "short sleeve" ], "options": [ "f red", "3x-large" ] }, "asin": "B09PDCS3GZ" }, { "task_id": "ws_B08NP79M17_8694", "instruction": "i need a super soft throw blanket for my living room. it should be 80\"x60\" in size.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "80\"x60" ] }, "asin": "B08NP79M17" }, { "task_id": "ws_B071NF45HP_8695", "instruction": "i am looking for optical zoom digital camera with flexible 12\" tripod and hdmi cable", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B071NF45HP" }, { "task_id": "ws_B09MTSQ9YX_8696", "instruction": "i am looking for men's jacket of white-01 color having short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "white-01" ] }, "asin": "B09MTSQ9YX" }, { "task_id": "ws_B002LA7WDU_8697", "instruction": "i'm looking for a long lasting eye shadow made from natural ingredients which should be fragrance free. also, choose rose gold colored one.", "target_attributes": { "attributes": [ "fragrance free", "long lasting", "natural ingredients", "eye shadow" ], "options": [ "rose gold" ] }, "asin": "B002LA7WDU" }, { "task_id": "ws_B004FOU34A_8698", "instruction": "for living room i need brushed nickel finish table lamp in black hardback shade. it should be a set of two and should include wifi smart socket.", "target_attributes": { "attributes": [ "brushed nickel", "living room" ], "options": [ "black hardback shade", "set of two - wifi smart socket included" ] }, "asin": "B004FOU34A" }, { "task_id": "ws_B09436PGKF_8699", "instruction": "can you direct me to an office desk that's easy to assemble and the size is 40x24? thank you", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "40x24" ] }, "asin": "B09436PGKF" }, { "task_id": "ws_B09M6BQ4GN_8700", "instruction": "am trying to find an easy install floor lamps with shelves tropical green palm leaves, color 1", "target_attributes": { "attributes": [ "easy install" ], "options": [ "color1" ] }, "asin": "B09M6BQ4GN" }, { "task_id": "ws_B085181MVT_8701", "instruction": "i would like a 32 inch light good mirror that is wall mounted.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "light gold (stainless steel frame)", "32in" ] }, "asin": "B085181MVT" }, { "task_id": "ws_B08ZN23X8Q_8702", "instruction": "i am looking for an easy to use facial cleaning brush that is high quality and double sided.", "target_attributes": { "attributes": [ "easy use", "double sided", "high quality" ], "options": [] }, "asin": "B08ZN23X8Q" }, { "task_id": "ws_B000M51NRM_8703", "instruction": "i would like a 20 foot long 4 pack of gold plated hdmi male to male cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "4 pack", "20 feet (single pack)", "hdmi male to female" ] }, "asin": "B000M51NRM" }, { "task_id": "ws_B000M51NRM_8704", "instruction": "i am looking for 3 feet (5 pack) size high speed hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 feet (5 pack)" ] }, "asin": "B000M51NRM" }, { "task_id": "ws_B07GZK147G_8705", "instruction": "i would like to buy a 5x5 feet easy to clean grass mat for the lawn which is eco friendly.", "target_attributes": { "attributes": [ "eco friendly", "easy clean" ], "options": [ "5 x 5 feet" ] }, "asin": "B07GZK147G" }, { "task_id": "ws_B07GZK147G_8706", "instruction": "i want to find a 4 x 50 foot artificial glass turf that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "4 x 50 feet" ] }, "asin": "B07GZK147G" }, { "task_id": "ws_B07LGYG1MH_8707", "instruction": "i am interested in buying brownies which are plant based and gluten free, with a 4 flavor variety pack, and come in pack of 8 of 1.9 ounce.", "target_attributes": { "attributes": [ "plant based", "gluten free" ], "options": [ "4 flavor variety pack", "1.9 ounce (pack of 8)" ] }, "asin": "B07LGYG1MH" }, { "task_id": "ws_B09SPSFZ1S_8708", "instruction": "i need closed toe flats that are red in a size 5.5", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "red", "5.5" ] }, "asin": "B09SPSFZ1S" }, { "task_id": "ws_B077TTY6D9_8709", "instruction": "i need a 3x-large porg star wars t-shirt with charcoal heather 070", "target_attributes": { "attributes": [ "star wars" ], "options": [ "charcoal heather 070", "3x-large" ] }, "asin": "B077TTY6D9" }, { "task_id": "ws_B07Y46SC5W_8710", "instruction": "i would like a navy men's classic fit cami.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "navy", "men" ] }, "asin": "B07Y46SC5W" }, { "task_id": "ws_B077ZBM5NF_8711", "instruction": "i'm looking for a rejuvenating oil serum for damaged hair", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B077ZBM5NF" }, { "task_id": "ws_B08513K2H6_8712", "instruction": "i want 4 pack of old fashioned sophia italian crackers.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "4-pack" ] }, "asin": "B08513K2H6" }, { "task_id": "ws_B096S7JQ8L_8713", "instruction": "i need a machine washable decorative elastic edged square fitted tablecloth fit for square table 42\"x42\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "square tablecover 15", "fitted tablecolth-fit square table 42\"x42\"" ] }, "asin": "B096S7JQ8L" }, { "task_id": "ws_B09PFYL3TX_8714", "instruction": "i am looking glitter eyeshadow long lasting easy apply color #15", "target_attributes": { "attributes": [ "long lasting", "easy apply", "eye shadow" ], "options": [ "color # 15" ] }, "asin": "B09PFYL3TX" }, { "task_id": "ws_B09QKVGF9R_8715", "instruction": "i am interested in acquiring a mattress which is fully assembled and of high density, and it should be only mattress in twin style.", "target_attributes": { "attributes": [ "fully assembled", "high density" ], "options": [ "mattress only", "twin" ] }, "asin": "B09QKVGF9R" }, { "task_id": "ws_B081RKGG84_8716", "instruction": "i need a storage case for false teeth. make sure that it is leak proof.", "target_attributes": { "attributes": [ "leak proof", "storage case" ], "options": [] }, "asin": "B081RKGG84" }, { "task_id": "ws_B07YB4LXM7_8717", "instruction": "i am looking for contemporary design privacy protected panel for living room, its size should be 52\" wide by 90\" length", "target_attributes": { "attributes": [ "contemporary design", "living room" ], "options": [ "52\" w by 90\" l" ] }, "asin": "B07YB4LXM7" }, { "task_id": "ws_B07PP7JXBM_8718", "instruction": "i am looking for a lavender scented foot peel mask suitable for dry skin which removes dead skin and fine lines.", "target_attributes": { "attributes": [ "dead skin", "fine lines", "dry skin" ], "options": [ "lavender" ] }, "asin": "B07PP7JXBM" }, { "task_id": "ws_B08H4SXMWS_8719", "instruction": "i am looking for a large women's long sleeve tunic with pockets and is machine washable.", "target_attributes": { "attributes": [ "machine washable", "long sleeve" ], "options": [ "large" ] }, "asin": "B08H4SXMWS" }, { "task_id": "ws_B07NFRZ7RV_8720", "instruction": "i am looking for x-large navy color lion king jungle trio graphic machine wash t-shirt for men", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy", "men", "x-large" ] }, "asin": "B07NFRZ7RV" }, { "task_id": "ws_B08Q2WDK2B_8721", "instruction": "i need a fragrance free facial wash", "target_attributes": { "attributes": [ "fragrance free" ], "options": [] }, "asin": "B08Q2WDK2B" }, { "task_id": "ws_B07R5PTBY2_8722", "instruction": "i'm looking for hollister festival nite men spray.", "target_attributes": { "attributes": [ "design house" ], "options": [] }, "asin": "B07R5PTBY2" }, { "task_id": "ws_B096M5KV1H_8723", "instruction": "i need a wall mounted white coat hook", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "whiteblack2" ] }, "asin": "B096M5KV1H" }, { "task_id": "ws_B096FM43Y4_8724", "instruction": "i want to buy medium sized hand washable casual trousers which can be used for daily wear.", "target_attributes": { "attributes": [ "hand wash", "polyester spandex" ], "options": [ "medium" ] }, "asin": "B096FM43Y4" }, { "task_id": "ws_B09S8TQN8N_8725", "instruction": "i would like a sparkling dry moscato that is non alcoholic.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "sparkling dry moscato" ] }, "asin": "B09S8TQN8N" }, { "task_id": "ws_B09HL6VRRR_8726", "instruction": "i want a modern home luxe spyder height adjustable bar stool.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [] }, "asin": "B09HL6VRRR" }, { "task_id": "ws_B09QGGQ4Q6_8727", "instruction": "i want a small sized t-shirt that has long sleeves. it is for a teenage girl.", "target_attributes": { "attributes": [ "long sleeve", "teen girls" ], "options": [ "small" ] }, "asin": "B09QGGQ4Q6" }, { "task_id": "ws_B09H48GXQ9_8728", "instruction": "i'm looking for long sleeve open front chunky knit draped sweaters.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09H48GXQ9" }, { "task_id": "ws_B09PRLRZ88_8729", "instruction": "i am looking for a pink colored body brush with long handle. it should suit my sensitive skin.", "target_attributes": { "attributes": [ "long handle", "sensitive skin" ], "options": [ "pink" ] }, "asin": "B09PRLRZ88" }, { "task_id": "ws_B07PWC3T3T_8730", "instruction": "i am looking for a canvas giclee print art suitable for my living room . and i choose the 28\"x40\" size", "target_attributes": { "attributes": [ "living room" ], "options": [ "28\"x40\"" ] }, "asin": "B07PWC3T3T" }, { "task_id": "ws_B06XWJ4TZC_8731", "instruction": "i am looking for a oil free face wash", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B06XWJ4TZC" }, { "task_id": "ws_B00I4WT6QU_8732", "instruction": "i'm looking for a heavy duty wall mountable projection screen with ultra hd resolution. also, choose 16:9, 200\", high contrast material one,", "target_attributes": { "attributes": [ "wall mounted", "ultra hd", "heavy duty" ], "options": [ "high contrast material", "16:9, 200\"" ] }, "asin": "B00I4WT6QU" }, { "task_id": "ws_B019IOGR4Q_8733", "instruction": "i would like two 100 foot long gold plated hdmi male to male cables.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "2 pack", "100-feet (single pack)", "hdmi male to male" ] }, "asin": "B019IOGR4Q" }, { "task_id": "ws_B019IOGR4Q_8734", "instruction": "i am looking for a high speed male to female hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to female" ] }, "asin": "B019IOGR4Q" }, { "task_id": "ws_B019IOGR4Q_8735", "instruction": "i need a high speed hdmi male to female gold plated cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "hdmi male to female" ] }, "asin": "B019IOGR4Q" }, { "task_id": "ws_B07Y375BJ7_8736", "instruction": "i am looking for brown color, sleeveless polyester cotton jumpsuit and size is large", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "large" ] }, "asin": "B07Y375BJ7" }, { "task_id": "ws_B084C131WS_8737", "instruction": "i would like some aluminum alloy binoculars.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B084C131WS" }, { "task_id": "ws_B07NMTMJNK_8738", "instruction": "i would like 30 x 30 x 46 cm blue ottoman with a solid wood frame.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "blue", "30x30x46cm" ] }, "asin": "B07NMTMJNK" }, { "task_id": "ws_B09J2T7GCT_8739", "instruction": "i can't find this product, please help! smart remote control, htt381 htct380 htct381 remote control replacement for office with batteries included asap, i'm waiting for your reply in minutes", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09J2T7GCT" }, { "task_id": "ws_B01K5SBF7I_8740", "instruction": "i am looking for low sugar, low calorie, gmo free, gluten free , soy free , vanilla caramel protein bars", "target_attributes": { "attributes": [ "low sugar", "low calorie", "gmo free", "gluten free", "soy free" ], "options": [ "vanilla caramel" ] }, "asin": "B01K5SBF7I" }, { "task_id": "ws_B093BKNKM3_8741", "instruction": "i want an army green modos logicos case for apple phones.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "armygreen(ml002)" ] }, "asin": "B093BKNKM3" }, { "task_id": "ws_B07XD615H3_8742", "instruction": "i want a maui moisture shine conditioner for dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "conditioner" ] }, "asin": "B07XD615H3" }, { "task_id": "ws_B01HZ20R9Y_8743", "instruction": "i want a stereo sound wired gaming headset.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B01HZ20R9Y" }, { "task_id": "ws_B00T90UPAC_8744", "instruction": "i want a white amanti wall mounted mirror.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "sonoma white wash" ] }, "asin": "B00T90UPAC" }, { "task_id": "ws_B00ON1HJ8S_8745", "instruction": "i would like to buy a peach high 490 colored long lasting lipstick.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "peach high 490" ] }, "asin": "B00ON1HJ8S" }, { "task_id": "ws_B08VDWHY7X_8746", "instruction": "i am looking for a high definition binoculars & scopes", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B08VDWHY7X" }, { "task_id": "ws_B095JH58ZN_8747", "instruction": "i need a high heel sandal of size 6.5\"", "target_attributes": { "attributes": [ "high heel" ], "options": [ "6.5" ] }, "asin": "B095JH58ZN" }, { "task_id": "ws_B09NRJKQ84_8748", "instruction": "i need a yellow colored slim fit t-shirt that has short sleeves.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "yellow" ] }, "asin": "B09NRJKQ84" }, { "task_id": "ws_B09BZSMPX8_8749", "instruction": "i am looking for an easy to install high speed 4g lte signal booster.", "target_attributes": { "attributes": [ "easy install", "high speed", "4g lte" ], "options": [] }, "asin": "B09BZSMPX8" }, { "task_id": "ws_B08BZKS922_8750", "instruction": "i am looking for contemporary design polyester fabric storage ottoman bench with legs in white color", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "white" ] }, "asin": "B08BZKS922" }, { "task_id": "ws_B09NTCCVGX_8751", "instruction": "i want to buy a folding storage box ottoman which i can easily install and has faux leather, the size of it should be 60x40x40cm.", "target_attributes": { "attributes": [ "easy install", "faux leather" ], "options": [ "60x40x40cm" ] }, "asin": "B09NTCCVGX" }, { "task_id": "ws_B07JMK7Q8H_8752", "instruction": "i am looking for low calorie, gluten free protein smoothie squeeze pouch of variety pack with all five flavors, 4.5 ounce (pack of 9)", "target_attributes": { "attributes": [ "low calorie", "gluten free" ], "options": [ "variety-all whey flavors", "4.5 ounce (pack of 9)" ] }, "asin": "B07JMK7Q8H" }, { "task_id": "ws_B09NP6YFHW_8753", "instruction": "i ma interested in buying a pack of 6, gluten free chocolate gems.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "5 ounce (pack of 6)" ] }, "asin": "B09NP6YFHW" }, { "task_id": "ws_B089YTQ21G_8754", "instruction": "i am looking for a hair scalp brush that stimulates hair growth and exfoliates dandruff.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B089YTQ21G" }, { "task_id": "ws_B07ZK9F9DH_8755", "instruction": "i need a 15 feet coaxial cable that is compatible with apple tv.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "15feet" ] }, "asin": "B07ZK9F9DH" }, { "task_id": "ws_B08XLV5GCK_8756", "instruction": "i would like a cosmetic case for my nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B08XLV5GCK" }, { "task_id": "ws_B09M74H6QX_8757", "instruction": "i am looking for a white platform bed that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B09M74H6QX" }, { "task_id": "ws_B07QW1G8MW_8758", "instruction": "i need some kosher sea salt", "target_attributes": { "attributes": [ "kosher certified" ], "options": [] }, "asin": "B07QW1G8MW" }, { "task_id": "ws_B07N1CN1FQ_8759", "instruction": "i am looking for a purple toiletry bag that is water resistant", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "denim purple" ] }, "asin": "B07N1CN1FQ" }, { "task_id": "ws_B09LR2JWBG_8760", "instruction": "i would like a b type vr headset that has aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [ "b type" ] }, "asin": "B09LR2JWBG" }, { "task_id": "ws_B07MG8XM7R_8761", "instruction": "search for unsalted pretzels that are individually wrapped. it should also be shelf stable.", "target_attributes": { "attributes": [ "individually wrapped", "shelf stable" ], "options": [ "unsalted" ] }, "asin": "B07MG8XM7R" }, { "task_id": "ws_B07MG8XM7R_8762", "instruction": "i need some unsalted pretzels that are individually wrapped in a pack of 25.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "unsalted", "6 ounce (pack of 25)" ] }, "asin": "B07MG8XM7R" }, { "task_id": "ws_B0968QW5TN_8763", "instruction": "i would like a two pack of tempered glass screen protectors", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "2 pack" ] }, "asin": "B0968QW5TN" }, { "task_id": "ws_B08XXFRVHV_8764", "instruction": "i need an all-in-one cleanser that is dermatologist tested.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "all-in-one cleanser" ] }, "asin": "B08XXFRVHV" }, { "task_id": "ws_B08H6P5677_8765", "instruction": "i am looking for some gluten free pudina party flavored puffed snacks.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pudina party" ] }, "asin": "B08H6P5677" }, { "task_id": "ws_B08JJ8Z6ZQ_8766", "instruction": "i am looking for a pair of women's size 11 sandals with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "11" ] }, "asin": "B08JJ8Z6ZQ" }, { "task_id": "ws_B07NPG61K4_8767", "instruction": "i would like a 24 inch dark blonde mix hair extension.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark blonde mix bleach blonde", "24 inch" ] }, "asin": "B07NPG61K4" }, { "task_id": "ws_B09Q93F425_8768", "instruction": "i am looking for a green colored high definition tablet pc.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "green" ] }, "asin": "B09Q93F425" }, { "task_id": "ws_B09MDH6FV2_8769", "instruction": "i am looking for golden tooth hygiene kit made up of stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "golden" ] }, "asin": "B09MDH6FV2" }, { "task_id": "ws_B002XULCB6_8770", "instruction": "i'm looking for a ready to drink protein shake which should be free from gluten and has low sugar and fat. also choose strawberry cream one.", "target_attributes": { "attributes": [ "low sugar", "low fat", "gluten free" ], "options": [ "strawberry cream" ] }, "asin": "B002XULCB6" }, { "task_id": "ws_B07ZCK7PXZ_8771", "instruction": "i am interested in a 8 by 6ft digital photography background", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "8x6ft" ] }, "asin": "B07ZCK7PXZ" }, { "task_id": "ws_B09QSBH418_8772", "instruction": "i am looking for some high quality reusable spray bottles that are easy to clean.", "target_attributes": { "attributes": [ "easy clean", "high quality" ], "options": [] }, "asin": "B09QSBH418" }, { "task_id": "ws_B07TTLSPTW_8773", "instruction": "i want 24\" x 24\" pink purple throw pillow cover for living room sofa", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink purple", "24\"x24\"" ] }, "asin": "B07TTLSPTW" }, { "task_id": "ws_B07TTLSPTW_8774", "instruction": "i want to find 24x24 inch dark blue decorative pillow covers that i can use in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark blue", "24\"x24\"" ] }, "asin": "B07TTLSPTW" }, { "task_id": "ws_B09RWHH1TF_8775", "instruction": "i want to buy a cabinet which i can put in living room and it's easy to clean, while it's color should be light brown.", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "light brown" ] }, "asin": "B09RWHH1TF" }, { "task_id": "ws_B09NLTFT8R_8776", "instruction": "i need wireless bluetooth noise cancelling headphone in black 2 color", "target_attributes": { "attributes": [ "noise cancelling", "wireless bluetooth" ], "options": [ "black 2" ] }, "asin": "B09NLTFT8R" }, { "task_id": "ws_B005CN6ORI_8777", "instruction": "looking for long-wear eyeliner that is easy to apply also choose barrow street", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "barrow street" ] }, "asin": "B005CN6ORI" }, { "task_id": "ws_B078TL8M4B_8778", "instruction": "i want double sided throw pillow cover in blue mustard color.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "blue mustard" ] }, "asin": "B078TL8M4B" }, { "task_id": "ws_B09L7X5B9P_8779", "instruction": "i need a laptop with intel quad core i5 processor. it should also have 8gb ddr4 ram and 512 gb pcie ssd.", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [ "8gb ddr4 ram, 512gb pcie ssd" ] }, "asin": "B09L7X5B9P" }, { "task_id": "ws_B08H1RRNGK_8780", "instruction": "i need black hair cutting shears", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "waterproof black" ] }, "asin": "B08H1RRNGK" }, { "task_id": "ws_B08H12XR6B_8781", "instruction": "i'm looking for professional hair cutting barber scissors.", "target_attributes": { "attributes": [ "easy use", "hair cutting" ], "options": [ "silver" ] }, "asin": "B08H12XR6B" }, { "task_id": "ws_B01HJWDJG8_8782", "instruction": "i want to buy a male to male hdmi cable which supports high speed data transfer. it would be good if it is gold plated.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 pack" ] }, "asin": "B01HJWDJG8" }, { "task_id": "ws_B000IZ8KZ4_8783", "instruction": "i would like anti-dandruff shampoo that is tea tree.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "anti-dandruff" ] }, "asin": "B000IZ8KZ4" }, { "task_id": "ws_B0999FNKDM_8784", "instruction": "i need memory foam slippers that are black in a size 11-11.5", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black", "11-11.5" ] }, "asin": "B0999FNKDM" }, { "task_id": "ws_B07CTC8F3F_8785", "instruction": "i would like a large champagne colored shower cap for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "champagne", "large" ] }, "asin": "B07CTC8F3F" }, { "task_id": "ws_B07CKMBDQQ_8786", "instruction": "i would like a turquoise makeup crayon that is fragrance free.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "turquoise" ] }, "asin": "B07CKMBDQQ" }, { "task_id": "ws_B08DYCQL3M_8787", "instruction": "i would like almond butter that is keto friendly and comes in a gift box", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "gift box" ] }, "asin": "B08DYCQL3M" }, { "task_id": "ws_B07KFHH7RX_8788", "instruction": "i want a morden art paint throw pillow cover size 20\"*20\" color 02", "target_attributes": { "attributes": [ "living room" ], "options": [ "color 02", "20\"x20\"" ] }, "asin": "B07KFHH7RX" }, { "task_id": "ws_B089SXR1ZX_8789", "instruction": "i need high waisted grey pants.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "deep grey" ] }, "asin": "B089SXR1ZX" }, { "task_id": "ws_B08XJWLLKQ_8790", "instruction": "i am looking for a green tea detox & repair shampoo", "target_attributes": { "attributes": [ "green tea" ], "options": [ "detox & repair shampoo" ] }, "asin": "B08XJWLLKQ" }, { "task_id": "ws_B0734476MY_8791", "instruction": "i would like a king sized grey umbria daybed with a box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "grey (faux leather)", "king", "umbria (daybed)" ] }, "asin": "B0734476MY" }, { "task_id": "ws_B07RTBG8ZQ_8792", "instruction": "i want a white anferstore simple modern coffee table for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B07RTBG8ZQ" }, { "task_id": "ws_B088JVB7SD_8793", "instruction": "get me a ready to eat cheese popcorn bag.", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B088JVB7SD" }, { "task_id": "ws_B0744K87NJ_8794", "instruction": "i am interested in buying a steel bed frame with memory foam.", "target_attributes": { "attributes": [ "memory foam", "steel frame" ], "options": [] }, "asin": "B0744K87NJ" }, { "task_id": "ws_B09SDDHQMW_8795", "instruction": "i want a high heel open toe pink color women shoe with ankel strap size :4.5 wide", "target_attributes": { "attributes": [ "open toe", "high heel" ], "options": [ "a1 - pink", "4.5 wide" ] }, "asin": "B09SDDHQMW" }, { "task_id": "ws_B08WYP4H2J_8796", "instruction": "i am looking for gluten free protein granola for my keto diet", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [] }, "asin": "B08WYP4H2J" }, { "task_id": "ws_B07H5VZG6M_8797", "instruction": "i would like a refurbished laser printer", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07H5VZG6M" }, { "task_id": "ws_B07GSRNX97_8798", "instruction": "i am in need of a button tufted sofa for my living room. it should be grey in color.", "target_attributes": { "attributes": [ "button tufted", "living room" ], "options": [ "gery" ] }, "asin": "B07GSRNX97" }, { "task_id": "ws_B00AB0MC9Q_8799", "instruction": "i would like a bronze finish table lamp", "target_attributes": { "attributes": [ "bronze finish" ], "options": [] }, "asin": "B00AB0MC9Q" }, { "task_id": "ws_B08K4GFDTG_8800", "instruction": "i am interested in highly pigmented eyeshadow", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [] }, "asin": "B08K4GFDTG" }, { "task_id": "ws_B097DZZXGX_8801", "instruction": "i am interested in buying a rustic brown entertainment center with a steel frame for the living room.", "target_attributes": { "attributes": [ "steel frame", "living room" ], "options": [ "rustic brown" ] }, "asin": "B097DZZXGX" }, { "task_id": "ws_B07MCH9HPB_8802", "instruction": "i am searching for cupcake picks for a birthday party.", "target_attributes": { "attributes": [ "cupcake picks", "birthday party" ], "options": [] }, "asin": "B07MCH9HPB" }, { "task_id": "ws_B09N3J4LB9_8803", "instruction": "i'm looking for a mini display port adapter with ultra hd high resolution feature. also, choose 0.65 ft one.", "target_attributes": { "attributes": [ "high resolution", "ultra hd" ], "options": [ "0.65ft" ] }, "asin": "B09N3J4LB9" }, { "task_id": "ws_B08J4F7S9V_8804", "instruction": "i'm looking for screen protection for apple iphone 12.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [] }, "asin": "B08J4F7S9V" }, { "task_id": "ws_B0032HM6JG_8805", "instruction": "i am looking for a noise cancelling headset.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B0032HM6JG" }, { "task_id": "ws_B09MVQ7B58_8806", "instruction": "i need non-slip lack pillow slippers that is suitable for pool bathing . and i choose the f size with green color", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "green", "f" ] }, "asin": "B09MVQ7B58" }, { "task_id": "ws_B084ZT7Q8H_8807", "instruction": "i'm looking for a full size heavy duty bed frame.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "full" ] }, "asin": "B084ZT7Q8H" }, { "task_id": "ws_B005LURDJK_8808", "instruction": "i need some fat free popsicles", "target_attributes": { "attributes": [ "fat free" ], "options": [] }, "asin": "B005LURDJK" }, { "task_id": "ws_B07GDL1MDQ_8809", "instruction": "i would like a women's medium sized slate gray t shirt made from heather cotton.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "slate", "women", "medium" ] }, "asin": "B07GDL1MDQ" }, { "task_id": "ws_B08LN9F4NK_8810", "instruction": "i am looking for a multi 6 color super soft throws", "target_attributes": { "attributes": [ "super soft" ], "options": [ "multi 6" ] }, "asin": "B08LN9F4NK" }, { "task_id": "ws_B09PRFGCN3_8811", "instruction": "i am looking for a teeth whitening toothpaste in b color. it should be for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [ "b" ] }, "asin": "B09PRFGCN3" }, { "task_id": "ws_B08Y924NQ6_8812", "instruction": "i need some x-large dark blue jeans that are straight leg/", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "k-dark blue", "x-large" ] }, "asin": "B08Y924NQ6" }, { "task_id": "ws_B07ZWC2S7G_8813", "instruction": "i want a 2.5 pound pack of sugar free candies.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "2.5 pound (pack of 1)" ] }, "asin": "B07ZWC2S7G" }, { "task_id": "ws_B07H9TZL3Q_8814", "instruction": "i am looking for an easy to use hair dye with natural ingredients.", "target_attributes": { "attributes": [ "easy use", "natural ingredients", "hair dye" ], "options": [] }, "asin": "B07H9TZL3Q" }, { "task_id": "ws_B00VXQGY1Y_8815", "instruction": "i would like a 9 ounce tub of non gmo grass fed ghee.", "target_attributes": { "attributes": [ "grass fed", "non gmo" ], "options": [ "9 ounce (pack of 1)" ] }, "asin": "B00VXQGY1Y" }, { "task_id": "ws_B002GVJZS4_8816", "instruction": "i would like to buy kosher certified greek yogurt.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [] }, "asin": "B002GVJZS4" }, { "task_id": "ws_B00YZ56PGY_8817", "instruction": "i need a sleeveless hem that is machine washable . and i choose the 3x size with grey mix color", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "grey mix", "3x" ] }, "asin": "B00YZ56PGY" }, { "task_id": "ws_B097T5SF5B_8818", "instruction": "i want a loft bed for a dorm that saves space.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B097T5SF5B" }, { "task_id": "ws_B004225TZS_8819", "instruction": "i would like a 32 ounce bag of oatmeal that is resealable and has a good protein serving.", "target_attributes": { "attributes": [ "protein serving" ], "options": [ "32 ounce (pack of 4)", "resealable" ] }, "asin": "B004225TZS" }, { "task_id": "ws_B004225TZS_8820", "instruction": "i am looking for a bulk bag of protein serving rolled oats.", "target_attributes": { "attributes": [ "protein serving" ], "options": [ "bulk bag" ] }, "asin": "B004225TZS" }, { "task_id": "ws_B088T329M3_8821", "instruction": "i am looking for an easy to use makeup lip brush.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B088T329M3" }, { "task_id": "ws_B093SZ9BGG_8822", "instruction": "i'm looking for a pair of mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SZ9BGG" }, { "task_id": "ws_B074PY2PSC_8823", "instruction": "i am looking for grey-1 color women's t-shirt that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "grey-1" ] }, "asin": "B074PY2PSC" }, { "task_id": "ws_B086V49TW3_8824", "instruction": "i am looking for a red 40 foot long gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "red", "40 feet" ] }, "asin": "B086V49TW3" }, { "task_id": "ws_B08HRS8TLC_8825", "instruction": "i am looking for an anti-aging facial roller.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B08HRS8TLC" }, { "task_id": "ws_B08DJYSQCS_8826", "instruction": "i would like a birch bar cabinet for the dining room", "target_attributes": { "attributes": [ "dining room" ], "options": [ "birch", "bar cabinet" ] }, "asin": "B08DJYSQCS" }, { "task_id": "ws_B094J65TJM_8827", "instruction": "i'm looking for korean roasted job's tears powder.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B094J65TJM" }, { "task_id": "ws_B07KDMD6FD_8828", "instruction": "i would like a faux fur sleeveless jacket, also, pick the white color", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "white" ] }, "asin": "B07KDMD6FD" }, { "task_id": "ws_B07KYWGP65_8829", "instruction": "i am looking for long lasting deep color colorstay concealer", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "deep" ] }, "asin": "B07KYWGP65" }, { "task_id": "ws_B07Q4NG5X8_8830", "instruction": "i am looking to buy a 2-pack long lasting wall scones which is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble", "long lasting" ], "options": [ "2-pack" ] }, "asin": "B07Q4NG5X8" }, { "task_id": "ws_B07SVPKBZK_8831", "instruction": "i am looking for ivory color living room rug of size 2' x 5'", "target_attributes": { "attributes": [ "living room" ], "options": [ "light grey | ivory", "2' x 5'" ] }, "asin": "B07SVPKBZK" }, { "task_id": "ws_B06XSH16S8_8832", "instruction": "get me a shelf stable snack mix. pick the honey cheddar flavor.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "honey cheddar snack mix" ] }, "asin": "B06XSH16S8" }, { "task_id": "ws_B08XJVTCJ4_8833", "instruction": "i am looking for high quality 15 inch hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "15 inch" ] }, "asin": "B08XJVTCJ4" }, { "task_id": "ws_B07QQBM12P_8834", "instruction": "i want black birthday cupcake picks.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "black" ] }, "asin": "B07QQBM12P" }, { "task_id": "ws_B08BVRNMP5_8835", "instruction": "i am looking for men's green tea shampoo and conditioner.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B08BVRNMP5" }, { "task_id": "ws_B08C6ZTZPN_8836", "instruction": "i am interested in buying a power amplifier with wireless capabilities and stereo sound.", "target_attributes": { "attributes": [ "power amplifier", "stereo sound" ], "options": [] }, "asin": "B08C6ZTZPN" }, { "task_id": "ws_B09P8NMV5M_8837", "instruction": "i need long lasting lipstick in the color b", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "b" ] }, "asin": "B09P8NMV5M" }, { "task_id": "ws_B004DIJLHI_8838", "instruction": "i would like to purchase a 3.3 fl oz, long lasting men's perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "3.3 fl oz (pack of 1)" ] }, "asin": "B004DIJLHI" }, { "task_id": "ws_B07NNS9FL8_8839", "instruction": "looking for hand painted multicolor flat candle", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "multicolor" ] }, "asin": "B07NNS9FL8" }, { "task_id": "ws_B0769XY12N_8840", "instruction": "i am looking for 3.88 ounce body wash bar for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "3.88 ounce (pack of 1)" ] }, "asin": "B0769XY12N" }, { "task_id": "ws_B07VBQJT5G_8841", "instruction": "i'm looking for brushes set for eye shadow foundation cosmetic tools.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B07VBQJT5G" }, { "task_id": "ws_B07K2WVKGD_8842", "instruction": "i'm looking for a high definition surveillance camera with 1080p hd resolution.", "target_attributes": { "attributes": [ "1080p hd", "high definition" ], "options": [] }, "asin": "B07K2WVKGD" }, { "task_id": "ws_B09JWMNJGF_8843", "instruction": "i am looking for high quality toothbrush containers.", "target_attributes": { "attributes": [ "high quality", "quality materials" ], "options": [] }, "asin": "B09JWMNJGF" }, { "task_id": "ws_B09MD8DZR1_8844", "instruction": "i am looking for a pair of dark blue noise cancelling wireless bluetooth earbuds.", "target_attributes": { "attributes": [ "noise cancelling", "wireless bluetooth" ], "options": [ "dark blue" ] }, "asin": "B09MD8DZR1" }, { "task_id": "ws_B0791WCX84_8845", "instruction": "i would like sunflower butter and chocolate protein bars that are high protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "sunflower butter + chocolate" ] }, "asin": "B0791WCX84" }, { "task_id": "ws_B09T79733X_8846", "instruction": "i need an easy to clean tablecloth that is the color of wood", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "wood grain7" ] }, "asin": "B09T79733X" }, { "task_id": "ws_B095NYGCW5_8847", "instruction": "i'm looking for a heavy duty twin size bunk bed made from solid wood with good storage space for space saving. also, choose white colored one.", "target_attributes": { "attributes": [ "space saving", "twin size", "heavy duty", "solid wood", "storage space" ], "options": [ "white" ] }, "asin": "B095NYGCW5" }, { "task_id": "ws_B07WLS7V2C_8848", "instruction": "i would like anti slip boots that are navy", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "navy blue" ] }, "asin": "B07WLS7V2C" }, { "task_id": "ws_B093QDWQQR_8849", "instruction": "i am looking for classic fit women's tee shirts of dark gray3 color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "dark gray3" ] }, "asin": "B093QDWQQR" }, { "task_id": "ws_B09H5VFZGX_8850", "instruction": "i am looking for a black pu leather desk organizer that is non slip.", "target_attributes": { "attributes": [ "non slip", "pu leather" ], "options": [ "black" ] }, "asin": "B09H5VFZGX" }, { "task_id": "ws_B072NHJCDS_8851", "instruction": "i need a pack of 3 natural labs 8 oz green color travel bottles", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "green", "pack of 3" ] }, "asin": "B072NHJCDS" }, { "task_id": "ws_B072NHJCDS_8852", "instruction": "i need a six pack of leak proof, bpa free travel bottles. look for the amber colored ones.", "target_attributes": { "attributes": [ "leak proof", "bpa free" ], "options": [ "amber", "pack of 6" ] }, "asin": "B072NHJCDS" }, { "task_id": "ws_B072NHJCDS_8853", "instruction": "i need black moyo natural labs 8 oz travel bottles.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [ "black" ] }, "asin": "B072NHJCDS" }, { "task_id": "ws_B07QPQDJD3_8854", "instruction": "i want a dark brown bench seat made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "madagascar cocoa | dark brown", "bench seat" ] }, "asin": "B07QPQDJD3" }, { "task_id": "ws_B0824Z7W6C_8855", "instruction": "i'm looking for a daily wear sweatshirt made of good quality polyester material with long sleeves. also, choose x-large one.", "target_attributes": { "attributes": [ "quality polyester", "long sleeve", "polyester spandex", "daily wear" ], "options": [ "x-large" ] }, "asin": "B0824Z7W6C" }, { "task_id": "ws_B08TVT7CMD_8856", "instruction": "i'm looking for an outlet toggle wall plate cover.", "target_attributes": { "attributes": [ "high gloss" ], "options": [ "toggle | outlet combo" ] }, "asin": "B08TVT7CMD" }, { "task_id": "ws_B082NLH5YJ_8857", "instruction": "i am looking for red popcorn boxes for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "red" ] }, "asin": "B082NLH5YJ" }, { "task_id": "ws_B08NX18SV4_8858", "instruction": "i am looking for car overhead player of size cm157a+dwh006x2 having stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "cm157a+dwh006x2" ] }, "asin": "B08NX18SV4" }, { "task_id": "ws_B07N33YR5J_8859", "instruction": "i'm looking for individually wrapped triple chocolate cookie bars. choose the ones that come in pack of 18 with 4 count each.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "triple chocolate", "4 count (pack of 18)" ] }, "asin": "B07N33YR5J" }, { "task_id": "ws_B08LBHC8C9_8860", "instruction": "i am looking for a red women's long sleeve sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z5-red" ] }, "asin": "B08LBHC8C9" }, { "task_id": "ws_B09PDLWMG6_8861", "instruction": "i am looking for light weight a34 color photo background.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a34" ] }, "asin": "B09PDLWMG6" }, { "task_id": "ws_B09PDLWMG6_8862", "instruction": "i'm looking for a26 high resolution, light weight spring flower portrait photo background 5x3ft/1.5x1m.", "target_attributes": { "attributes": [ "light weight", "high resolution" ], "options": [ "a26", "5x3ft | 1.5x1m" ] }, "asin": "B09PDLWMG6" }, { "task_id": "ws_B07YNRQJGW_8863", "instruction": "looking for heavy duty twilight blue colour shock-proof standing cover", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "twilight blue" ] }, "asin": "B07YNRQJGW" }, { "task_id": "ws_B08C9G9J7B_8864", "instruction": "i want a white and long lasting bellesky eyeshadow primer set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "white (6 colors set a)" ] }, "asin": "B08C9G9J7B" }, { "task_id": "ws_B073MQVYVL_8865", "instruction": "i am looking for certified organic cream blush", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "blush" ] }, "asin": "B073MQVYVL" }, { "task_id": "ws_B09J6YN4CD_8866", "instruction": "i want to find a win10pro desktop minis with high speed.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "32gb ram|512gb ssd|win10pro" ] }, "asin": "B09J6YN4CD" }, { "task_id": "ws_B08XVFNF42_8867", "instruction": "i'm looking for sexy beach swimsuit with bikini set.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "large" ] }, "asin": "B08XVFNF42" }, { "task_id": "ws_B08KF8S4Z8_8868", "instruction": "i'm looking for iphone 12 pro carbon fiber pattern case.", "target_attributes": { "attributes": [ "carbon fiber", "wireless charging" ], "options": [ "rosegold 11 pro" ] }, "asin": "B08KF8S4Z8" }, { "task_id": "ws_B09MQ77Y1L_8869", "instruction": "i need a gaming pc powered by an core i5", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B09MQ77Y1L" }, { "task_id": "ws_B09MQ77Y1L_8870", "instruction": "i am looking for matx gaming intel core desktop pc having 128gb ram, 2tb ssd and win10 os installed", "target_attributes": { "attributes": [ "intel core" ], "options": [ "128gb ram|2tb ssd|win10h" ] }, "asin": "B09MQ77Y1L" }, { "task_id": "ws_B09MQ77Y1L_8871", "instruction": "i want to find a core i5 6700 xt gaming desktop with 16 gigabytes of ram.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "16gb ram|512gb ssd|win10pro", "6700 xt" ] }, "asin": "B09MQ77Y1L" }, { "task_id": "ws_B07SPVFSXJ_8872", "instruction": "i would like a marble black cosmetic bag that is high quality.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "cmarble black" ] }, "asin": "B07SPVFSXJ" }, { "task_id": "ws_B09DPR6PCT_8873", "instruction": "i am looking for a pair of women's size 6.5 open toe and knee high sandals", "target_attributes": { "attributes": [ "knee high", "open toe" ], "options": [ "6.5" ] }, "asin": "B09DPR6PCT" }, { "task_id": "ws_B093KBLW7B_8874", "instruction": "i'm looking for 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KBLW7B" }, { "task_id": "ws_B07ZD8NQQX_8875", "instruction": "i want an ultra hd wifi bluetooth projector.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "wifi bluetooth projector 7200 lumen" ] }, "asin": "B07ZD8NQQX" }, { "task_id": "ws_B07QWV75WB_8876", "instruction": "i'm looking for men's workhog xt coil wide square toe.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "earth | twilight" ] }, "asin": "B07QWV75WB" }, { "task_id": "ws_B09P3G1794_8877", "instruction": "i am looking for large size khaki color wide leg high waist workout pants", "target_attributes": { "attributes": [ "wide leg", "high waist" ], "options": [ "khaki", "large" ] }, "asin": "B09P3G1794" }, { "task_id": "ws_B00M3ACMMY_8878", "instruction": "i'm looking for a pair of men's sandals that provide a leather sole, which are grey and sized a men's 14.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "grey", "14" ] }, "asin": "B00M3ACMMY" }, { "task_id": "ws_B08H5CDKPM_8879", "instruction": "i'm looking for fast wireless charger for iphone 12.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B08H5CDKPM" }, { "task_id": "ws_B00CJT36AG_8880", "instruction": "i need some ready to eat snack packs", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B00CJT36AG" }, { "task_id": "ws_B09NZVGVCH_8881", "instruction": "i am looking for long sleeved orange pajamas in a size medium.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a5-orange", "medium" ] }, "asin": "B09NZVGVCH" }, { "task_id": "ws_B0092MLO5W_8882", "instruction": "i am looking for a fully assembled vintage grey side table.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "vintage grey" ] }, "asin": "B0092MLO5W" }, { "task_id": "ws_B00TJKBT34_8883", "instruction": "i am looking for 6 ounce pack of high protein almond snacks.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "6 ounce (pack of 12)" ] }, "asin": "B00TJKBT34" }, { "task_id": "ws_B00TJKBT34_8884", "instruction": "i am looking for smokehouse flavor snack nuts having high protein content.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "smokehouse" ] }, "asin": "B00TJKBT34" }, { "task_id": "ws_B00TJKBT34_8885", "instruction": "can you find me a spicy blue diamonds high protein snack? my friends prefer the smokehouse flavor in the 6.ounce can (pack of 12)", "target_attributes": { "attributes": [ "high protein" ], "options": [ "6 ounce (pack of 12)" ] }, "asin": "B00TJKBT34" }, { "task_id": "ws_B08PKBPDMB_8886", "instruction": "i'm looking for a pair of men's gym workout shorts for daily wear in a camo black and size medium.", "target_attributes": { "attributes": [ "gym workout", "daily wear" ], "options": [ "1piece camo black", "medium" ] }, "asin": "B08PKBPDMB" }, { "task_id": "ws_B08HCQW5D3_8887", "instruction": "i am looking for some highly pigmented neon eyeshadow.", "target_attributes": { "attributes": [ "highly pigmented", "eye shadow" ], "options": [ "neon" ] }, "asin": "B08HCQW5D3" }, { "task_id": "ws_B09CD2VL88_8888", "instruction": "i'm interested in purchasing a black colored easy to apply bun maker", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "black, white, red" ] }, "asin": "B09CD2VL88" }, { "task_id": "ws_B09PBV93P6_8889", "instruction": "i want to buy a toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09PBV93P6" }, { "task_id": "ws_B00WVLVDP2_8890", "instruction": "i am looking for 10 pounds of fine grain non gmo sea salt.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "10 lbs. (qty. 2 x 5lb. bags) - fine grain" ] }, "asin": "B00WVLVDP2" }, { "task_id": "ws_B00WVLVDP2_8891", "instruction": "i'm looking for a two pound package of sea salt that is both kosher and non gmo. i would like a two pack of five pound package option.", "target_attributes": { "attributes": [ "kosher certified", "non gmo" ], "options": [ "10 lbs. (qty. 2 x 5lb. bags) - fine grain" ] }, "asin": "B00WVLVDP2" }, { "task_id": "ws_B095728DTP_8892", "instruction": "i would like to get an xx-small hoodie with polyester quality.", "target_attributes": { "attributes": [ "machine wash", "quality polyester" ], "options": [ "xx-small" ] }, "asin": "B095728DTP" }, { "task_id": "ws_B09PRGMGTC_8893", "instruction": "looking for light weight fitbit versa bands for men women also choose size large", "target_attributes": { "attributes": [ "light weight" ], "options": [ "large" ] }, "asin": "B09PRGMGTC" }, { "task_id": "ws_B07N1V56NR_8894", "instruction": "i am looking for soft marble color anna synthetic sole pump for women", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "soft marble" ] }, "asin": "B07N1V56NR" }, { "task_id": "ws_B0892J76SM_8895", "instruction": "i am looking for a backlit eco friendly vanity mirror.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "backlit" ] }, "asin": "B0892J76SM" }, { "task_id": "ws_B08W5BN4FK_8896", "instruction": "i need a wireless amplifier with bluetooth", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B08W5BN4FK" }, { "task_id": "ws_B0878X59RR_8897", "instruction": "i'm looking for a long lasting roll on antiperspirant.", "target_attributes": { "attributes": [ "anti perspirant", "long lasting" ], "options": [] }, "asin": "B0878X59RR" }, { "task_id": "ws_B0878X59RR_8898", "instruction": "i am looking for a long lasting deodorant.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B0878X59RR" }, { "task_id": "ws_B093YTF2FF_8899", "instruction": "i am looking for a set of 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YTF2FF" }, { "task_id": "ws_B07WHL23DC_8900", "instruction": "i am looking for a christmas balls green & red hand painted seasonal celebration candles", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "christmas balls green & red" ] }, "asin": "B07WHL23DC" }, { "task_id": "ws_B002XULCAM_8901", "instruction": "i would like some keto friendly strawberry nutrition drink", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "strawberry cream" ] }, "asin": "B002XULCAM" }, { "task_id": "ws_B09KND6B9K_8902", "instruction": "i would like a 70 by 185 cm round head massage linens for a beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "70*185cm round head" ] }, "asin": "B09KND6B9K" }, { "task_id": "ws_B07TFKT734_8903", "instruction": "i'm looking for a plant based meal replacement shake that are nut, soy, and gluten free. choose the ones that are chai flavor and come in 12 fl oz and pack of 12.", "target_attributes": { "attributes": [ "nut free", "soy free", "plant based", "gluten free" ], "options": [ "chai", "12 fl oz (pack of 12)" ] }, "asin": "B07TFKT734" }, { "task_id": "ws_B08GFG8SV9_8904", "instruction": "i am looking to buy a paraben free makeup remover containing hyaluronic acid.", "target_attributes": { "attributes": [ "paraben free", "hyaluronic acid" ], "options": [] }, "asin": "B08GFG8SV9" }, { "task_id": "ws_B08Y6LQYYF_8905", "instruction": "i want a 6 pack of valentine's day stretch chair cover dining room chair covers.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "6 pcs" ] }, "asin": "B08Y6LQYYF" }, { "task_id": "ws_B0006NXZ7G_8906", "instruction": "i would like to buy jojoba oil which is non toxic, and comes in a size of 128 fl oz, and pack of 1.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "128 fl oz (pack of 1)" ] }, "asin": "B0006NXZ7G" }, { "task_id": "ws_B019YT48D2_8907", "instruction": "i want dual band upbright 5v ac/dc adapter compatible with zboost.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B019YT48D2" }, { "task_id": "ws_B09HC7V35F_8908", "instruction": "i am looking for a women's navy blue blouse that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy blue" ] }, "asin": "B09HC7V35F" }, { "task_id": "ws_B08ZJNF1S5_8909", "instruction": "can you direct me to minimalism barefoot shoes? preferably with rubber soles... also, i want blue", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "new moon | blue" ] }, "asin": "B08ZJNF1S5" }, { "task_id": "ws_B004CX1QZ4_8910", "instruction": "i need a large petite elastic waist pan. and i choose the dark indigo 20", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "dark indigo 20", "large petite" ] }, "asin": "B004CX1QZ4" }, { "task_id": "ws_B081YYTGH8_8911", "instruction": "i want black levi's men's 501 straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "black" ] }, "asin": "B081YYTGH8" }, { "task_id": "ws_B09CMX4VB3_8912", "instruction": "i would like a dark blue denture storage case.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "dark blue" ] }, "asin": "B09CMX4VB3" }, { "task_id": "ws_B08H53L4B4_8913", "instruction": "i need high speed hdmi panel mount extension cable with angle down- 0.5m", "target_attributes": { "attributes": [ "high speed" ], "options": [ "angle down-0.5m" ] }, "asin": "B08H53L4B4" }, { "task_id": "ws_B09MKS4HDV_8914", "instruction": "i'm looking for a loose fit vest with long sleeves for teen girls. also choose large size khaki colored one.", "target_attributes": { "attributes": [ "loose fit", "long sleeve", "teen girls" ], "options": [ "khaki", "large" ] }, "asin": "B09MKS4HDV" }, { "task_id": "ws_B094YHLK42_8915", "instruction": "i am looking for an easy to assemble queen size box spring that has memory foam.", "target_attributes": { "attributes": [ "easy assemble", "memory foam", "box spring" ], "options": [ "queen" ] }, "asin": "B094YHLK42" }, { "task_id": "ws_B01FGKEBBW_8916", "instruction": "i would like a 4 foot by 6 foot rectangular sage green area rug that is super soft.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "sage green", "rectangular", "4 ft x 6 ft" ] }, "asin": "B01FGKEBBW" }, { "task_id": "ws_B07QB9JC3C_8917", "instruction": "i'm looking for a good quality rugs for living and dining rooms. also choose 8\" round shape, green colored one.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "green | turquoise", "8' round" ] }, "asin": "B07QB9JC3C" }, { "task_id": "ws_B016NKJX9Y_8918", "instruction": "i would like a brown sugar body scrub for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "brown sugar | fig" ] }, "asin": "B016NKJX9Y" }, { "task_id": "ws_B00Q8T5GRO_8919", "instruction": "i'm looking for dora the explore kids edt spray.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00Q8T5GRO" }, { "task_id": "ws_B01BRIT5WW_8920", "instruction": "i would like a 44w by 32l big and tall mocha dress that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "mocha", "44w x 32l", "big & tall" ] }, "asin": "B01BRIT5WW" }, { "task_id": "ws_B08P2QL6B3_8921", "instruction": "i'm looking for plastic empty mist spray bottles.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "transparent 10pcs" ] }, "asin": "B08P2QL6B3" }, { "task_id": "ws_B092V5VRMB_8922", "instruction": "kocota unisex garden clogs options to include in your search : bow support, gray vinyl acetate color. i hope you find", "target_attributes": { "attributes": [ "vinyl acetate", "arch support" ], "options": [ "grey", "10 women | 8 men" ] }, "asin": "B092V5VRMB" }, { "task_id": "ws_B09NYJ6MT9_8923", "instruction": "i want white professional stereo wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "white" ] }, "asin": "B09NYJ6MT9" }, { "task_id": "ws_B08TWNMVH6_8924", "instruction": "i'm looking for a 4g lte gps antenna which should be easy to install.", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [] }, "asin": "B08TWNMVH6" }, { "task_id": "ws_B08TWNMVH6_8925", "instruction": "i am looking for a adhesive mount aerial connector cable right angle plug for car stereo which is easy to install. also choose which accept 4 g lte", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [] }, "asin": "B08TWNMVH6" }, { "task_id": "ws_B01MS5PT4L_8926", "instruction": "i would like one wall bath fixture that has a brushed nickel finish.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "brushed nickel finish", "one - light", "wall bath fixture" ] }, "asin": "B01MS5PT4L" }, { "task_id": "ws_B0199WNJXY_8927", "instruction": "i would like a 4.2 fluid ounce bottle of coconut oil shampoo.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "4.2 fl oz (pack of 1)", "oil, damage recovery" ] }, "asin": "B0199WNJXY" }, { "task_id": "ws_B08SWJV16Z_8928", "instruction": "i would like a bakers rack that is space saving.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B08SWJV16Z" }, { "task_id": "ws_B09NFGCF3Q_8929", "instruction": "i am looking for a high perfromance grey quad core tablet.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [ "grey" ] }, "asin": "B09NFGCF3Q" }, { "task_id": "ws_B07BT88MC3_8930", "instruction": "looking for light weight rosy pink colour mens womens water shoes", "target_attributes": { "attributes": [ "light weight" ], "options": [ "rosy pink" ] }, "asin": "B07BT88MC3" }, { "task_id": "ws_B07B4KXQZV_8931", "instruction": "i'm looking for a queen size bedspread set in the color redwood.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "redwood" ] }, "asin": "B07B4KXQZV" }, { "task_id": "ws_B08BL9NG94_8932", "instruction": "i am looking for a sma male to female coaxial cable for 4g lte signal booster.", "target_attributes": { "attributes": [ "coaxial cable", "4g lte" ], "options": [] }, "asin": "B08BL9NG94" }, { "task_id": "ws_B09Q1JG3KJ_8933", "instruction": "i am looking for a wireless, bluetooth enabled home theatre system.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09Q1JG3KJ" }, { "task_id": "ws_B09RH4CQYD_8934", "instruction": "i am looking for a pair of black men's medium underwear that are light weight and machine washable.", "target_attributes": { "attributes": [ "light weight", "machine washable" ], "options": [ "black", "medium" ] }, "asin": "B09RH4CQYD" }, { "task_id": "ws_B07ML6CH7P_8935", "instruction": "i am looking for a pair of women's size 7.5 camo colored non slip walking shoes.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "camo", "7.5" ] }, "asin": "B07ML6CH7P" }, { "task_id": "ws_B08PPW9QKG_8936", "instruction": "i'm looking for a high quality accessory bundle for my canon camera; speed and performance is essential.", "target_attributes": { "attributes": [ "high performance", "high speed" ], "options": [] }, "asin": "B08PPW9QKG" }, { "task_id": "ws_B099KMQVP3_8937", "instruction": "i am looking for a pair of women's size 11 daily wear boots.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "11" ] }, "asin": "B099KMQVP3" }, { "task_id": "ws_B09R7N338P_8938", "instruction": "find me a nice black relaxed fit linen button up for the beach with short sleeves in size 3xl.", "target_attributes": { "attributes": [ "short sleeve", "relaxed fit" ], "options": [ "black", "3x-large" ] }, "asin": "B09R7N338P" }, { "task_id": "ws_B08LVPJFWZ_8939", "instruction": "i am loooking for camera lens protector for iphone 12 mini that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "iphone 12 mini" ] }, "asin": "B08LVPJFWZ" }, { "task_id": "ws_B005OKZ38K_8940", "instruction": "i would like a 6.56 ounce dark soft brown box of hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "33 dark soft brown", "6.56 ounce (pack of 1)" ] }, "asin": "B005OKZ38K" }, { "task_id": "ws_B08LDHZLPP_8941", "instruction": "i just love the matilde vicenzi brand macaroons and i want to try the amaretto d'italia macaroons flavor. the quality of the ingredients is my requirement, if you find it let me know", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [] }, "asin": "B08LDHZLPP" }, { "task_id": "ws_B09GL9HFT9_8942", "instruction": "i would like to buy soundbars which can be operated hands free and are 2.1 soundbar.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "2.1 soundbar w | play-fi" ] }, "asin": "B09GL9HFT9" }, { "task_id": "ws_B09PNBTJVJ_8943", "instruction": "i would like a blue pu leather gaming chair", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "blue" ] }, "asin": "B09PNBTJVJ" }, { "task_id": "ws_B08L5778PK_8944", "instruction": "i'm looking for dermatologically certified serum skin that contains hyaluronic acid for sensitive skin and is fragrance free.", "target_attributes": { "attributes": [ "dermatologist tested", "fragrance free", "hyaluronic acid" ], "options": [] }, "asin": "B08L5778PK" }, { "task_id": "ws_B07PMTCQHT_8945", "instruction": "i am looking for nut free and fat free gummy candy.", "target_attributes": { "attributes": [ "nut free", "fat free" ], "options": [] }, "asin": "B07PMTCQHT" }, { "task_id": "ws_B093S2LPTM_8946", "instruction": "i am looking for some high quality nail stickers.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B093S2LPTM" }, { "task_id": "ws_B08RJ3YLKM_8947", "instruction": "i want a 2 pack of green tea & eggplant purifying clay stick masks.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B08RJ3YLKM" }, { "task_id": "ws_B094Y4JQMR_8948", "instruction": "i am looking for pink, close-toed sandals that have a rubber sole and come in size 8.5", "target_attributes": { "attributes": [ "closed toe", "rubber sole" ], "options": [ "z2-pink", "8.5" ] }, "asin": "B094Y4JQMR" }, { "task_id": "ws_B00IX5M0PW_8949", "instruction": "i am looking for a anti-perspirant deodorant that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00IX5M0PW" }, { "task_id": "ws_B081YY84HC_8950", "instruction": "i'm looking for original fit jeans for men.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "thunder moon rocks - light indigo" ] }, "asin": "B081YY84HC" }, { "task_id": "ws_B079JDFPMR_8951", "instruction": "i'm looking for a long-lasting hydration hair treatment spray.", "target_attributes": { "attributes": [ "long lasting", "hair treatment" ], "options": [] }, "asin": "B079JDFPMR" }, { "task_id": "ws_B08CWNZ56P_8952", "instruction": "i am looking for a standard intel core i5 gaming pc.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "standard" ] }, "asin": "B08CWNZ56P" }, { "task_id": "ws_B091WP1BT5_8953", "instruction": "i would like a peach juice that is non gmo and gluten free.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [] }, "asin": "B091WP1BT5" }, { "task_id": "ws_B08P27813M_8954", "instruction": "i want a 1b natural hair wig.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "1b" ] }, "asin": "B08P27813M" }, { "task_id": "ws_B07G57NM4T_8955", "instruction": "i'm looking for a comfortable fit pullover shirts with long sleeves for teen girls. also, choose xx-large size white colored one", "target_attributes": { "attributes": [ "long sleeve", "comfortable fit", "teen girls" ], "options": [ "short sleeve-white", "xx-large" ] }, "asin": "B07G57NM4T" }, { "task_id": "ws_B09DPTPQW7_8956", "instruction": "i want an oribox clear glass screen protector for iphone 12.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "clear" ] }, "asin": "B09DPTPQW7" }, { "task_id": "ws_B09RF9GTHZ_8957", "instruction": "i want an army green women's long sleeve tunic.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "mqy-zh1 -army green" ] }, "asin": "B09RF9GTHZ" }, { "task_id": "ws_B07Q5863HF_8958", "instruction": "i am looking for mens shoes that are of realtree edge color and have rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "realtree edge" ] }, "asin": "B07Q5863HF" }, { "task_id": "ws_B08YJ99BGF_8959", "instruction": "i'm looking for an intel i5 desk top pc with 32 gigabytes of ram and a two terabyte ssd.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "32gb ram | 2tb ssd" ] }, "asin": "B08YJ99BGF" }, { "task_id": "ws_B093CRX264_8960", "instruction": "help me find a black doorbell that will detect motion and give an excellent 1080p hd video quality.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [ "black" ] }, "asin": "B093CRX264" }, { "task_id": "ws_B093CRX264_8961", "instruction": "looking for the 2021 release of ring video doorbell 4. it has 1080p, motion detection options. floodlight cam wired plus option. prefer white in color, but accept black.", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [ "black", "floodlight cam wired plus" ] }, "asin": "B093CRX264" }, { "task_id": "ws_B09F2HDDKN_8962", "instruction": "i am looking for some gluten free soft blue edible brew dust.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "soft blue" ] }, "asin": "B09F2HDDKN" }, { "task_id": "ws_B079KBCBKX_8963", "instruction": "i'm looking for a hair extensions with natural hair. also choose 120g 14 inch sized natural black mixed chestnut brown colored one.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "natural black mixed chestnut brown #1b | 6 | 1b", "14 inch (120 gram)" ] }, "asin": "B079KBCBKX" }, { "task_id": "ws_B09BJPSK5Z_8964", "instruction": "i am looking for a white footstool for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B09BJPSK5Z" }, { "task_id": "ws_B093YT7VND_8965", "instruction": "i am interested in buying a laundry bag", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YT7VND" }, { "task_id": "ws_B09DC88HCP_8966", "instruction": "i am looking for easy clean , red color shower curtain of size 78\"w x 70\"h with hook", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "red", "78\"w x 70\"h | 200x180cm" ] }, "asin": "B09DC88HCP" }, { "task_id": "ws_B07R3SP4BM_8967", "instruction": "i want to buy a vortex razor hd spotting scope for iphone 12 pro max that has a carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "iphone 12 pro max", "vortex razor hd | ultra hd gen 1&2 spottin..." ] }, "asin": "B07R3SP4BM" }, { "task_id": "ws_B07QKFRT2F_8968", "instruction": "i need a sugar free liquid water enhancer", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B07QKFRT2F" }, { "task_id": "ws_B004QVPDEC_8969", "instruction": "i would like a 6 foot long gold plated pink cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "pink", "6ft" ] }, "asin": "B004QVPDEC" }, { "task_id": "ws_B08LM9FX1X_8970", "instruction": "i'm looking for a waterproof hair cutting capes for hair styling. also choose 55\" * 66\" multi color one", "target_attributes": { "attributes": [ "hair cutting", "hair styling" ], "options": [ "multi color 7", "55\" x 66\"" ] }, "asin": "B08LM9FX1X" }, { "task_id": "ws_B000SATGXE_8971", "instruction": "looking for davidson's tea 100 pcs south africa flavored tea bags, spiced rooibos chai is my favorite, please demand certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "rooibos spiced chai" ] }, "asin": "B000SATGXE" }, { "task_id": "ws_B085RNCPZC_8972", "instruction": "i am interested in buying a beige colored super soft throw for the bedroom.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "beige" ] }, "asin": "B085RNCPZC" }, { "task_id": "ws_B086VLYFH8_8973", "instruction": "i need an easy to clean, easy to assemble computer desk. it should have walnut wood and metal legs.", "target_attributes": { "attributes": [ "easy clean", "easy assemble", "metal legs" ], "options": [ "4.0 walnut 2" ] }, "asin": "B086VLYFH8" }, { "task_id": "ws_B09SB4G9CS_8974", "instruction": "looking for high performance quad-core 64bit android tv box 10.0", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [] }, "asin": "B09SB4G9CS" }, { "task_id": "ws_B00SYOUSCO_8975", "instruction": "i am looking for a 1.5 foot high speed gold plated hdmi cable.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "1.5 feet" ] }, "asin": "B00SYOUSCO" }, { "task_id": "ws_B07K8X6JZL_8976", "instruction": "i would like a caramel variety pack that is individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "variety" ] }, "asin": "B07K8X6JZL" }, { "task_id": "ws_B01EO2KP2M_8977", "instruction": "i'm looking for a blush brush that should cruelty free certified. also, choose angled liner one.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "angled liner brush" ] }, "asin": "B01EO2KP2M" }, { "task_id": "ws_B01EO2KP2M_8978", "instruction": "i would like a foundation brush for my nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "foundation brush" ] }, "asin": "B01EO2KP2M" }, { "task_id": "ws_B07N7YPR32_8979", "instruction": "i would like a non gmo container of artichoke hearts.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B07N7YPR32" }, { "task_id": "ws_B083LXGV1K_8980", "instruction": "i would like a size 34 pair of garden variety shorts that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "garden variety", "34" ] }, "asin": "B083LXGV1K" }, { "task_id": "ws_B09239MNBY_8981", "instruction": "i am looking for cheese flavored gluten free rice snacks", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cheese x2" ] }, "asin": "B09239MNBY" }, { "task_id": "ws_B092VS43X2_8982", "instruction": "i'm looking for a tv cabinet for living room with high gloss finish and has tempered glass. also, choose a-47\" w* 16\" d* 16\"h in size natural 017 colored one.", "target_attributes": { "attributes": [ "high gloss", "tempered glass", "living room" ], "options": [ "natural 017", "a-47 \"w \u00d7 16\" d \u00d7 16 \"h" ] }, "asin": "B092VS43X2" }, { "task_id": "ws_B07C8C3JFC_8983", "instruction": "i am looking for a ready to hang 24 inch by 30 inch poster of a cow.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "24 x 30" ] }, "asin": "B07C8C3JFC" }, { "task_id": "ws_B08TB6XVY9_8984", "instruction": "i am looking for a 3-pack of bpa free fine mist bottles with trigger.", "target_attributes": { "attributes": [ "bpa free", "fine mist" ], "options": [ "pack of 3" ] }, "asin": "B08TB6XVY9" }, { "task_id": "ws_B01IY27IX2_8985", "instruction": "i would like a unscented body butter that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "unscented" ] }, "asin": "B01IY27IX2" }, { "task_id": "ws_B09JFX86BQ_8986", "instruction": "i need a long sleeve casual jacket for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B09JFX86BQ" }, { "task_id": "ws_B00H4KDZZ6_8987", "instruction": "i'm looking for low carb protein powder.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety pack" ] }, "asin": "B00H4KDZZ6" }, { "task_id": "ws_B08BJ4HYJ9_8988", "instruction": "i am looking for a navy blue macbook pro 13 inch case cover.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "navy blue" ] }, "asin": "B08BJ4HYJ9" }, { "task_id": "ws_B08RJZQYK1_8989", "instruction": "i'm looking for track trail running shoe for men.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "core black | core black | bold blue" ] }, "asin": "B08RJZQYK1" }, { "task_id": "ws_B07RMJZTJJ_8990", "instruction": "i would like a 0.4 ounce medium honey concealer that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "22.5 medium honey (w)", "0.4 ounce (pack of 1)" ] }, "asin": "B07RMJZTJJ" }, { "task_id": "ws_B08PBP6N38_8991", "instruction": "i want a grey bellemave bed frame wood platform bed.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "grey" ] }, "asin": "B08PBP6N38" }, { "task_id": "ws_B07KMJNTY2_8992", "instruction": "i am looking for 28 short size women's straight leg jeans", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "standard", "28 short" ] }, "asin": "B07KMJNTY2" }, { "task_id": "ws_B0956KCDT2_8993", "instruction": "i am looking for qazpl clip in hair extensions for hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "18 inch" ] }, "asin": "B0956KCDT2" }, { "task_id": "ws_B09P12CWD9_8994", "instruction": "i want a x-large merthy long sleeve camp corduroy shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large" ] }, "asin": "B09P12CWD9" }, { "task_id": "ws_B073WGFRM1_8995", "instruction": "i need a concealer for dark circles that is in the color sassy", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "sassy" ] }, "asin": "B073WGFRM1" }, { "task_id": "ws_B092YR7R35_8996", "instruction": "i would like a rose gold cupcake topper for a birthday cake.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "rose gold" ] }, "asin": "B092YR7R35" }, { "task_id": "ws_B0983MS3T8_8997", "instruction": "i want a tripod that is easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B0983MS3T8" }, { "task_id": "ws_B08DJ7PMV9_8998", "instruction": "i'm looking for a travel size perfume that should be long lasting and free from alcohol. also choose clinique happy for men impression scented one.", "target_attributes": { "attributes": [ "travel size", "alcohol free", "long lasting" ], "options": [ "clinique happy for men impression" ] }, "asin": "B08DJ7PMV9" }, { "task_id": "ws_B01KV6SE5U_8999", "instruction": "i am looking for a can of ready to eat smoked oysters.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "oysters smoked" ] }, "asin": "B01KV6SE5U" }, { "task_id": "ws_B075813R1S_9000", "instruction": "i'm looking for a high quality tea tree oil with basil scent. choose the ones that come in 10 ml package.", "target_attributes": { "attributes": [ "high quality", "tea tree" ], "options": [ "basil", "10 ml (pack of 1)" ] }, "asin": "B075813R1S" }, { "task_id": "ws_B07R83KXYZ_9001", "instruction": "i'm looking for an extra large men's valley jacket that will last a long time and is made from high quality materials.", "target_attributes": { "attributes": [ "long lasting", "quality materials" ], "options": [ "x-large" ] }, "asin": "B07R83KXYZ" }, { "task_id": "ws_B09R7YYJM4_9002", "instruction": "i would like a medium green two piece swim suit with moisture wicking.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "hkfg-a390-green", "medium" ] }, "asin": "B09R7YYJM4" }, { "task_id": "ws_B003O3P9EC_9003", "instruction": "i'm looking for a pack of 2 guava jelly 1.06 oz jar with 0g trans", "target_attributes": { "attributes": [ "0g trans" ], "options": [ ".2 pack - 1.06 ounce (pack of 1)" ] }, "asin": "B003O3P9EC" }, { "task_id": "ws_B087D93CRX_9004", "instruction": "i would like a 3 pack of kugel meal kits that are fully cooked.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "kugel", "pack of 3" ] }, "asin": "B087D93CRX" }, { "task_id": "ws_B09KPCYCSD_9005", "instruction": "i would like a 5xl leopard t shirt with a short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "a13f-leopard", "5x-large" ] }, "asin": "B09KPCYCSD" }, { "task_id": "ws_B094VQTWZ7_9006", "instruction": "i want to buy some earbuds that are easy to carry and are in color pinky girls.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "pinky girls" ] }, "asin": "B094VQTWZ7" }, { "task_id": "ws_B07BLRKV7B_9007", "instruction": "i would like a glossy red keychain that is made of carbon fiber.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "glossy red - metal keychain" ] }, "asin": "B07BLRKV7B" }, { "task_id": "ws_B08D7CT1XX_9008", "instruction": "add to my list a wizard of oz 3xlarge tshirt for men. should be officially licenced..", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "men", "3x-large" ] }, "asin": "B08D7CT1XX" }, { "task_id": "ws_B08GJ6ZLXB_9009", "instruction": "i am looking for some gluten free did someone say chipotle flavored seafood seasoning.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "did someone say chipotle" ] }, "asin": "B08GJ6ZLXB" }, { "task_id": "ws_B01499R1F4_9010", "instruction": "i would like a black file cabinets what are fully assembled.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "black" ] }, "asin": "B01499R1F4" }, { "task_id": "ws_B099RJHQZK_9011", "instruction": "i am looking for a women's grey short sleeve mini dress.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "grey" ] }, "asin": "B099RJHQZK" }, { "task_id": "ws_B08MJ7Q4LM_9012", "instruction": "i need an easy to carry background that is 7 by 5 ft", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "7x5ft" ] }, "asin": "B08MJ7Q4LM" }, { "task_id": "ws_B07VG8CYTX_9013", "instruction": "i want a 64 gig data shur usb port drive.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "64gb", "datashur" ] }, "asin": "B07VG8CYTX" }, { "task_id": "ws_B093SYDS21_9014", "instruction": "i want blouse hosiery in white color", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093SYDS21" }, { "task_id": "ws_B07XHRRRQ6_9015", "instruction": "i am looking for some high protein salt n' vinegar flavored almonds.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "salt n' vinegar" ] }, "asin": "B07XHRRRQ6" }, { "task_id": "ws_B078PLG6MM_9016", "instruction": "i want a 2 pack of garnier hair care fructis coconut oil conditioner.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "10.2 fl oz (pack of 2)" ] }, "asin": "B078PLG6MM" }, { "task_id": "ws_B08Y8J5ZTR_9017", "instruction": "i would like a high protein jerky.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B08Y8J5ZTR" }, { "task_id": "ws_B08XZQBD3R_9018", "instruction": "i want some noise cancelling headset. it should be hands free.", "target_attributes": { "attributes": [ "hands free", "noise cancelling" ], "options": [ "headset" ] }, "asin": "B08XZQBD3R" }, { "task_id": "ws_B00KXMJXY4_9019", "instruction": "iam looking for gmo free assortment - 38 pc", "target_attributes": { "attributes": [ "gmo free" ], "options": [] }, "asin": "B00KXMJXY4" }, { "task_id": "ws_B0084EHWDW_9020", "instruction": "i'm looking for professional animal arco pet clipper kit.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "green apple" ] }, "asin": "B0084EHWDW" }, { "task_id": "ws_B09RJ3B1MF_9021", "instruction": "i'm looking for long lasting eyeshadow pencils for women.", "target_attributes": { "attributes": [ "long lasting", "eye shadow" ], "options": [] }, "asin": "B09RJ3B1MF" }, { "task_id": "ws_B08DJB4MS5_9022", "instruction": "i am looking for a 3'x5' size of contemporary style area rugs", "target_attributes": { "attributes": [ "contemporary style" ], "options": [] }, "asin": "B08DJB4MS5" }, { "task_id": "ws_B09NNQTVYB_9023", "instruction": "i am looking for hands free, noise cancelling earphones in the color blue.", "target_attributes": { "attributes": [ "hands free", "noise cancelling" ], "options": [ "s_blue" ] }, "asin": "B09NNQTVYB" }, { "task_id": "ws_B09NNQTVYB_9024", "instruction": "i am looking for a wireless bluetooth headphone with noise cancelling and dust proof. also in red color", "target_attributes": { "attributes": [ "dust proof", "noise cancelling", "wireless bluetooth" ], "options": [ "r_red" ] }, "asin": "B09NNQTVYB" }, { "task_id": "ws_B094YV3VNZ_9025", "instruction": "i'm looking for bookshelf speaker.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "white | white walnut" ] }, "asin": "B094YV3VNZ" }, { "task_id": "ws_B07MXS6N5N_9026", "instruction": "i am looking for an army green short sleeve polo shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B07MXS6N5N" }, { "task_id": "ws_B098WM2956_9027", "instruction": "i want blue velvet sectional couches for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue" ] }, "asin": "B098WM2956" }, { "task_id": "ws_B07QNTX6MQ_9028", "instruction": "i am interested in buying a 13.5 inch intel core i5 processor based tablet which has a usb port.", "target_attributes": { "attributes": [ "core i5", "intel core", "usb port" ], "options": [ "13.5 in" ] }, "asin": "B07QNTX6MQ" }, { "task_id": "ws_B09RWTPTVC_9029", "instruction": "i'm looking for a men's blue slim fit short sleeve shirt in size small.", "target_attributes": { "attributes": [ "slim fit", "short sleeve" ], "options": [ "blue", "small" ] }, "asin": "B09RWTPTVC" }, { "task_id": "ws_B08VVYWJ24_9030", "instruction": "i am looking for non-gmo, gluten-free and kosher certified mustard seeds.", "target_attributes": { "attributes": [ "non gmo", "gluten free", "kosher certified" ], "options": [] }, "asin": "B08VVYWJ24" }, { "task_id": "ws_B093SXGCZH_9031", "instruction": "i'm in need of a pair of laundry bags made from mesh.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SXGCZH" }, { "task_id": "ws_B00BIM3JLQ_9032", "instruction": "i want black dunham men's revchase slip-ons with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black" ] }, "asin": "B00BIM3JLQ" }, { "task_id": "ws_B00U3TE9ZU_9033", "instruction": "i'm looking for a long lasting foundation that has spf50+. also, choose the color no. 21.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "no.21" ] }, "asin": "B00U3TE9ZU" }, { "task_id": "ws_B09FXVQ8WN_9034", "instruction": "i am looking for a sugar free starburst cherry flavored energy drink.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "starburst cherry" ] }, "asin": "B09FXVQ8WN" }, { "task_id": "ws_B01LYH3JZR_9035", "instruction": "i am looking for ivory color entryway plush 2-inch thick area rug of size 2 ft 3 in x 12 ft for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory | gold", "2 ft 3 in x 12 ft" ] }, "asin": "B01LYH3JZR" }, { "task_id": "ws_B01LYH3JZR_9036", "instruction": "i need to buy a nine foot round rug in ivory and green for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory | green", "round", "9 ft" ] }, "asin": "B01LYH3JZR" }, { "task_id": "ws_B08TB67HC2_9037", "instruction": "i would like a dark green pair of hair cutting sheers.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "dark green" ] }, "asin": "B08TB67HC2" }, { "task_id": "ws_B0073GO7FS_9038", "instruction": "i'm looking for under armour tech short sleeve t-shirt for men.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large tall" ] }, "asin": "B0073GO7FS" }, { "task_id": "ws_B0846WX23D_9039", "instruction": "i am looking for a 4 light vanity light with a contemporary design.", "target_attributes": { "attributes": [ "vanity light", "contemporary design" ], "options": [] }, "asin": "B0846WX23D" }, { "task_id": "ws_B0182YDWS2_9040", "instruction": "i am looking for betty crocker fruit by the foot with no artificial flavors in a pack of 36.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "36 count (pack of 1)" ] }, "asin": "B0182YDWS2" }, { "task_id": "ws_B07SZ2Z19Z_9041", "instruction": "i am looking for open toe women's sandals of size 8.5", "target_attributes": { "attributes": [ "open toe" ], "options": [ "8.5" ] }, "asin": "B07SZ2Z19Z" }, { "task_id": "ws_B07WD5TFFT_9042", "instruction": "i would like some wild caught oysters.", "target_attributes": { "attributes": [ "wild caught" ], "options": [] }, "asin": "B07WD5TFFT" }, { "task_id": "ws_B08BNQHLLR_9043", "instruction": "i'm looking for flannel throw blanket sherpa microfiber bed sofa.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "60\"x50\" blanket for teens" ] }, "asin": "B08BNQHLLR" }, { "task_id": "ws_B09C3XS9N3_9044", "instruction": "i need an easy to clean hydraulic chair that is heavy duty. it is for my hair salon.", "target_attributes": { "attributes": [ "easy clean", "heavy duty", "hair salon" ], "options": [] }, "asin": "B09C3XS9N3" }, { "task_id": "ws_B08RN71L4L_9045", "instruction": "i am interested in buying a green linen arm chair of faux leather for the living room.", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "green linen" ] }, "asin": "B08RN71L4L" }, { "task_id": "ws_B09N797XCY_9046", "instruction": "i am looking for king size bed having wood frame.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "king" ] }, "asin": "B09N797XCY" }, { "task_id": "ws_B0759ZTCPK_9047", "instruction": "i'm looking for a large pack of candles that are honeycomb veriglass scented please? i", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "18-pack" ] }, "asin": "B0759ZTCPK" }, { "task_id": "ws_B0759ZTCPK_9048", "instruction": "please find a root candles honeycomb veriglass scented, lead free, color bayberry .", "target_attributes": { "attributes": [ "lead free" ], "options": [ "bayberry" ] }, "asin": "B0759ZTCPK" }, { "task_id": "ws_B07V7R8SQN_9049", "instruction": "looking for cotton heather t shirt which is machine washable also choose colour dark heather", "target_attributes": { "attributes": [ "machine wash", "cotton heather" ], "options": [ "dark heather", "men" ] }, "asin": "B07V7R8SQN" }, { "task_id": "ws_B08ZXPRPKM_9050", "instruction": "i would like a wolf moon hair cutting kit.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "wolf moon" ] }, "asin": "B08ZXPRPKM" }, { "task_id": "ws_B06XF36LSS_9051", "instruction": "i am looking for a long lasting brown colored liquid eyeliner.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "brown" ] }, "asin": "B06XF36LSS" }, { "task_id": "ws_B0998FBRB9_9052", "instruction": "i want to buy sneakers for men which have a rubber sole, and are of navy color, while the size should be 13.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "navy | white", "13" ] }, "asin": "B0998FBRB9" }, { "task_id": "ws_B09BZ939LC_9053", "instruction": "i am looking for some high quality 14mm false eyelashes.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "14mm" ] }, "asin": "B09BZ939LC" }, { "task_id": "ws_B0771PPM5C_9054", "instruction": "i am looking for an easy to hang 24 inch by 32 inch floral oil painting for my living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "24x32inch (60x80cm)" ] }, "asin": "B0771PPM5C" }, { "task_id": "ws_B00CWTZ408_9055", "instruction": "i am looking for some gluten and sugar free irish cream syrup.", "target_attributes": { "attributes": [ "sugar free", "gluten free" ], "options": [ "sugar free irish cream" ] }, "asin": "B00CWTZ408" }, { "task_id": "ws_B00CWTZ408_9056", "instruction": "i am looking for sugar free blue raspberry syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sugar free blue raspberry" ] }, "asin": "B00CWTZ408" }, { "task_id": "ws_B091MLZ1QX_9057", "instruction": "i'm looking for a 198 gram box of crunchy organic breakfast cereal; it must suit my high-protein, gluten-free diet.", "target_attributes": { "attributes": [ "gluten free", "protein serving" ], "options": [ "198 gram" ] }, "asin": "B091MLZ1QX" }, { "task_id": "ws_B089B6814K_9058", "instruction": "can you direct me to a pair of women's shorts? i want them to have elastic waist and come in black, please", "target_attributes": { "attributes": [ "short sleeve", "elastic waist", "teen girls" ], "options": [ "b-black" ] }, "asin": "B089B6814K" }, { "task_id": "ws_B07QB9NBLD_9059", "instruction": "i'm looking for a 4oz baked fresh vanilla rum cake", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "4 ounce (pack of 4)" ] }, "asin": "B07QB9NBLD" }, { "task_id": "ws_B09RB5K9NL_9060", "instruction": "i'm looking for a machine washable, regular fit men's shorts with tummy control elastic waist band and has drawstring closure for gym workout. also choose 3x-large size black colored one.", "target_attributes": { "attributes": [ "machine wash", "regular fit", "drawstring closure", "elastic waistband", "tummy control", "gym workout" ], "options": [ "black", "3x-large" ] }, "asin": "B09RB5K9NL" }, { "task_id": "ws_B084BY1GZ4_9061", "instruction": "i need aluminum tripod legs", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B084BY1GZ4" }, { "task_id": "ws_B095W7W8XX_9062", "instruction": "i am looking for yellow birthday cake candles.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "1" ] }, "asin": "B095W7W8XX" }, { "task_id": "ws_B00DLJ4JE0_9063", "instruction": "i want to buy caffeine free herbal tea in a pack of 1.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "pack of 1" ] }, "asin": "B00DLJ4JE0" }, { "task_id": "ws_B00DLJ4JE0_9064", "instruction": "i'm looking for organic, caffeine free elderberry tea. i want a pack of one.", "target_attributes": { "attributes": [ "caffeine free", "usda organic" ], "options": [ "pack of 1" ] }, "asin": "B00DLJ4JE0" }, { "task_id": "ws_B09PLH5ZF6_9065", "instruction": "i want a women slip resistant red color shoes with size 10.5", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "red", "10.5" ] }, "asin": "B09PLH5ZF6" }, { "task_id": "ws_B099QN26PT_9066", "instruction": "i'm looking for a black speaker with a carrying case that is easy to use.", "target_attributes": { "attributes": [ "easy use", "carrying case" ], "options": [ "black" ] }, "asin": "B099QN26PT" }, { "task_id": "ws_B08L1VR9KX_9067", "instruction": "i am looking for a space saving side table for the living room. also, i would like it to be in blue color.", "target_attributes": { "attributes": [ "space saving", "living room" ], "options": [ "blue" ] }, "asin": "B08L1VR9KX" }, { "task_id": "ws_B09MHFT1NS_9068", "instruction": "i want a mydrinkbomb cocktail bombs tequila sunrise mix gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "tequilasunrise" ] }, "asin": "B09MHFT1NS" }, { "task_id": "ws_B078MHP88P_9069", "instruction": "i would like a bronze floor lamp with a glass shade.", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "bronze | red" ] }, "asin": "B078MHP88P" }, { "task_id": "ws_B09N3MQTZD_9070", "instruction": "i am interested in long sleeved white pullovers that are casual", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "d1-white" ] }, "asin": "B09N3MQTZD" }, { "task_id": "ws_B081DWH12M_9071", "instruction": "i am looking for a women's navy t-shirt that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy", "women" ] }, "asin": "B081DWH12M" }, { "task_id": "ws_B09LQN4KNL_9072", "instruction": "i want a medium gray long leave hoodie.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "yingcaier4#gray", "medium" ] }, "asin": "B09LQN4KNL" }, { "task_id": "ws_B08KLJFLVJ_9073", "instruction": "let's see some sandals in vinyl acetate. it should have ponderosa pine puma white as color.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "ponderosa pine puma white" ] }, "asin": "B08KLJFLVJ" }, { "task_id": "ws_B08DR34W4T_9074", "instruction": "i am looking for a heavy duty line beige color massage chair.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "line beige" ] }, "asin": "B08DR34W4T" }, { "task_id": "ws_B07DPS382X_9075", "instruction": "i want to buy tweezers which are stainless steel and have red color.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "red" ] }, "asin": "B07DPS382X" }, { "task_id": "ws_B09R42V2Z9_9076", "instruction": "i want gluten free bakell green & gold edible brew glitter.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "green & gold" ] }, "asin": "B09R42V2Z9" }, { "task_id": "ws_B08HP82QDL_9077", "instruction": "i am looking for a pacific northwest raspberry flavored syrup that has quality ingredients.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "pacific northwest raspberry" ] }, "asin": "B08HP82QDL" }, { "task_id": "ws_B000LKUZOU_9078", "instruction": "i would like a 30 ounce bag of quick cook steel cut oats that are usda organic.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "quick cook steel cut oats", "30 ounce (pack of 6)" ] }, "asin": "B000LKUZOU" }, { "task_id": "ws_B07MD7VN92_9079", "instruction": "i'm interested in a blue long-sleeved sweatshirt in an xx-large that is warm for winter.", "target_attributes": { "attributes": [ "winter warm", "long sleeve" ], "options": [ "blue", "xx-large" ] }, "asin": "B07MD7VN92" }, { "task_id": "ws_B07K2VHZ7B_9080", "instruction": "i would like a 4 ft rectangular pink rug for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light grey | pink", "rectangular", "4 ft" ] }, "asin": "B07K2VHZ7B" }, { "task_id": "ws_B00DUIEUIM_9081", "instruction": "i'm looking for a fresh baked desserts which is free from dairy and nut. also choose a pack of 6 one.", "target_attributes": { "attributes": [ "baked fresh", "nut free", "dairy free" ], "options": [ "6 pack" ] }, "asin": "B00DUIEUIM" }, { "task_id": "ws_B07S6H9KYS_9082", "instruction": "i am looking for a long lasting blue caftan dress in the size small-medium.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "blue", "small-medium" ] }, "asin": "B07S6H9KYS" }, { "task_id": "ws_B08F3TJDQY_9083", "instruction": "i am looking for a non oem replacement tv remote control with the aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [ "non-oem" ] }, "asin": "B08F3TJDQY" }, { "task_id": "ws_B09NN8KRJW_9084", "instruction": "i want a m500 hands free in dash navigation device.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "m500s8core4+64" ] }, "asin": "B09NN8KRJW" }, { "task_id": "ws_B01MU0IJKG_9085", "instruction": "i am looking for 6'7\" round size area rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "6'7\" round" ] }, "asin": "B01MU0IJKG" }, { "task_id": "ws_B088K6CYHC_9086", "instruction": "i am looking for a homebeez round storage ottoman with button tuffs in beige.", "target_attributes": { "attributes": [ "button tufted" ], "options": [ "milk" ] }, "asin": "B088K6CYHC" }, { "task_id": "ws_B07XPSC3B7_9087", "instruction": "i am looking for a barstool in walnut grey that is faux leather", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "walnut | grey" ] }, "asin": "B07XPSC3B7" }, { "task_id": "ws_B07XPSC3B7_9088", "instruction": "shop for twenty eight inch faux leather bar stools in cream.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "cream", "28.5\" bar height" ] }, "asin": "B07XPSC3B7" }, { "task_id": "ws_B09CGWQ952_9089", "instruction": "i am looking for a long lasting sweet pea scented soy wax candle.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [ "sweet pea" ] }, "asin": "B09CGWQ952" }, { "task_id": "ws_B07KPX1VZR_9090", "instruction": "i want to get a large men's classic fit t-shirt with an officially licensed logo on it.", "target_attributes": { "attributes": [ "officially licensed", "classic fit" ], "options": [ "men", "large" ] }, "asin": "B07KPX1VZR" }, { "task_id": "ws_B0009F3PJ4_9091", "instruction": "i want a 16 count of chamomile herbal tea that is certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "chamomile", "16 count (pack of 4)" ] }, "asin": "B0009F3PJ4" }, { "task_id": "ws_B09NKFSTNY_9092", "instruction": "i need some rose gold cosmetic bags", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "tropical plant 137" ] }, "asin": "B09NKFSTNY" }, { "task_id": "ws_B06ZYGR25T_9093", "instruction": "i am looking for faux leather bar stools in black.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "black bar height stools" ] }, "asin": "B06ZYGR25T" }, { "task_id": "ws_B09CH4DL6X_9094", "instruction": "i would like high power amplifier.", "target_attributes": { "attributes": [ "power amplifier", "high power" ], "options": [] }, "asin": "B09CH4DL6X" }, { "task_id": "ws_B07WZRRYWP_9095", "instruction": "i am looking for a blue leather sole loafers & slip-ons", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "blue" ] }, "asin": "B07WZRRYWP" }, { "task_id": "ws_B08LV7ZHBM_9096", "instruction": "i am looking for an easy to assemble blue ottoman for my living room.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "blue" ] }, "asin": "B08LV7ZHBM" }, { "task_id": "ws_B09JSKHJ3P_9097", "instruction": "i'm looking for matte white with black finish ceiling light fixture.", "target_attributes": { "attributes": [ "mid century", "dining room" ], "options": [ "black", "matte" ] }, "asin": "B09JSKHJ3P" }, { "task_id": "ws_B09BR5Q9P6_9098", "instruction": "i would like a grey laptop case that is water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "grey" ] }, "asin": "B09BR5Q9P6" }, { "task_id": "ws_B08C32FKC4_9099", "instruction": "i need a turntable that is hands free", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B08C32FKC4" }, { "task_id": "ws_B007C99UN0_9100", "instruction": "i am looking for 1 pound box of easter egg sugar cookies baked fresh", "target_attributes": { "attributes": [ "baked fresh" ], "options": [ "1 pound box" ] }, "asin": "B007C99UN0" }, { "task_id": "ws_B009LO30S0_9101", "instruction": "i'm looking for a kosher certified individually wrapped wafers. also choose vanilla flavored one.", "target_attributes": { "attributes": [ "kosher certified", "individually wrapped" ], "options": [ "vanilla" ] }, "asin": "B009LO30S0" }, { "task_id": "ws_B08K8S615G_9102", "instruction": "i am interested in buying a toothbrush that is easy to carry and useful for sensitive teeth.", "target_attributes": { "attributes": [ "easy carry", "sensitive teeth" ], "options": [] }, "asin": "B08K8S615G" }, { "task_id": "ws_B093SRHSC4_9103", "instruction": "i'm interested in a heavy duty adjustable desk in a size 48\" x 30\" with a white frame and walnut top.", "target_attributes": { "attributes": [ "height adjustable", "heavy duty" ], "options": [ "walnut top + white frame", "48\" x 30\"" ] }, "asin": "B093SRHSC4" }, { "task_id": "ws_B09FCGL679_9104", "instruction": "i'm looking for zero sugar real ginger ale from reed.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "12 ounce (pack of 8)" ] }, "asin": "B09FCGL679" }, { "task_id": "ws_B09FCGL679_9105", "instruction": "i would like a 12 ounce slim cans of zero sugar ginger ale.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "zero sugar ginger ale", "12 ounce slim cans (pack of 4)" ] }, "asin": "B09FCGL679" }, { "task_id": "ws_B087KQ2Y2P_9106", "instruction": "i'm looking for a peanut butter which is fat free with real fruit and should be 0.8ounce (pack of 12).", "target_attributes": { "attributes": [ "fat free", "real fruit" ], "options": [ "peanut butter", "0.8 ounce (pack of 12)" ] }, "asin": "B087KQ2Y2P" }, { "task_id": "ws_B097DKFPKC_9107", "instruction": "can you direct me to an android tablet that has outstanding performance? i'd like a gold one please, and it's 10.1 inches", "target_attributes": { "attributes": [ "high performance" ], "options": [ "gold", "10.1inch" ] }, "asin": "B097DKFPKC" }, { "task_id": "ws_B076CPL8MD_9108", "instruction": "i would like a blackberry bay shampoo for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "blackberry bay" ] }, "asin": "B076CPL8MD" }, { "task_id": "ws_B089GM2W23_9109", "instruction": "i would like a pair of no mic earbud headphones that have stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "purple", "no mic" ] }, "asin": "B089GM2W23" }, { "task_id": "ws_B09PYXVSWY_9110", "instruction": "i need mid century dining furniture in a 35.4 by 13.2 by 32.7 dimension.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "35.4\" x 13.2\" x 32.7\" (w x d x h)" ] }, "asin": "B09PYXVSWY" }, { "task_id": "ws_B07MTMJQDZ_9111", "instruction": "i need an eco friendly black charcoal conditioner", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "black charcoal" ] }, "asin": "B07MTMJQDZ" }, { "task_id": "ws_B09MQ6GZZS_9112", "instruction": "look for metal full over full bunks, floor bunks with full size bunk frame, silver, space saving is all i need for my new home.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "silver", "full over full" ] }, "asin": "B09MQ6GZZS" }, { "task_id": "ws_B086BY6ZJX_9113", "instruction": "i want a gold and individually wrapped survive permanent match metal.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "gold" ] }, "asin": "B086BY6ZJX" }, { "task_id": "ws_B07RW2YL7S_9114", "instruction": "i want to buy a easy to carry and easy to clean water resistant shaving set for a lady.", "target_attributes": { "attributes": [ "easy carry", "easy clean" ], "options": [] }, "asin": "B07RW2YL7S" }, { "task_id": "ws_B07KSGBV2S_9115", "instruction": "i would like a eggplant eyeshadow that is for sensitive skin.", "target_attributes": { "attributes": [ "eye shadow", "sensitive skin" ], "options": [ "eggplant" ] }, "asin": "B07KSGBV2S" }, { "task_id": "ws_B08QMXQVBC_9116", "instruction": "i'm having a kids birthday party and need a pack of 36 gold cupcake picks.", "target_attributes": { "attributes": [ "birthday party", "cupcake picks" ], "options": [ "gold" ] }, "asin": "B08QMXQVBC" }, { "task_id": "ws_B07V8L7FMH_9117", "instruction": "i am looking for a 1/2 dozen cameron's seafood large female maryland crabs.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "1 | 2 bushel" ] }, "asin": "B07V8L7FMH" }, { "task_id": "ws_B09NMYP3YP_9118", "instruction": "i would like a g7 plus 2.4 gig streaming media player that is high speed.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "g7 plus 2.4g | 5g" ] }, "asin": "B09NMYP3YP" }, { "task_id": "ws_B07KRQ3DWJ_9119", "instruction": "i am interested in a navy blue regular fit polo", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "team navy blue | white" ] }, "asin": "B07KRQ3DWJ" }, { "task_id": "ws_B00MLMRWCE_9120", "instruction": "i want a blueberry natural real fruit bar.", "target_attributes": { "attributes": [ "real fruit" ], "options": [ "blueberry" ] }, "asin": "B00MLMRWCE" }, { "task_id": "ws_B07Q736GWW_9121", "instruction": "i am looking for 16''x24'' size sky canvas wall art home decor for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "16''x24''" ] }, "asin": "B07Q736GWW" }, { "task_id": "ws_B073V5F2S4_9122", "instruction": "i would like a long lasting perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B073V5F2S4" }, { "task_id": "ws_B08DTQY66D_9123", "instruction": "i want a blue apple watch case with glass screen protector.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "blue | black | silver" ] }, "asin": "B08DTQY66D" }, { "task_id": "ws_B09Q5XSLVZ_9124", "instruction": "i am looking for 2 grey dining room chairs with metal legs.", "target_attributes": { "attributes": [ "metal legs", "dining room" ], "options": [ "grey-2pcs" ] }, "asin": "B09Q5XSLVZ" }, { "task_id": "ws_B09HK8HQGD_9125", "instruction": "i would like a size 38 rainbow applewatch band.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "rainbow", "38 | 40 | 41mm s | m" ] }, "asin": "B09HK8HQGD" }, { "task_id": "ws_B08SJ2VZ71_9126", "instruction": "i am looking for an easy to assemble green home office chair with lumbar support.", "target_attributes": { "attributes": [ "easy assemble", "lumbar support" ], "options": [ "green" ] }, "asin": "B08SJ2VZ71" }, { "task_id": "ws_B098NX52GX_9127", "instruction": "i would like a light blue 32cmx32cmx35cm ottoman with a stainless steel frame.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "light blue", "32cmx32cmx35cm" ] }, "asin": "B098NX52GX" }, { "task_id": "ws_B073RJK6LQ_9128", "instruction": "the price of this manhattan comfort utopia table is unbelievable. very good! if you can find it in white and solid wood i will buy it.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "off white" ] }, "asin": "B073RJK6LQ" }, { "task_id": "ws_B08KVNKJFL_9129", "instruction": "i am looking for 24 inch long synthetic hair extension.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "24 inch (pack of 1)" ] }, "asin": "B08KVNKJFL" }, { "task_id": "ws_B08K4K8CX6_9130", "instruction": "i am looking for medium size black color long sleeve v neck casual shirts tunic t shirt for women", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B08K4K8CX6" }, { "task_id": "ws_B098QKQP4B_9131", "instruction": "i am looking for a blue, fast charging usb cord that is compatible with apple and is 16 feet long.", "target_attributes": { "attributes": [ "compatible apple", "fast charging" ], "options": [ "blue", "16foot" ] }, "asin": "B098QKQP4B" }, { "task_id": "ws_B08NYBB3ZN_9132", "instruction": "i would like a smartwatch case that has four colors and is easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "fourcolors*b" ] }, "asin": "B08NYBB3ZN" }, { "task_id": "ws_B08ZNFXRSD_9133", "instruction": "i'm looking for breastfeeding shits maternity cloths double layer postpartum shirt.", "target_attributes": { "attributes": [ "light weight", "soft material" ], "options": [ "black + wine red + grey" ] }, "asin": "B08ZNFXRSD" }, { "task_id": "ws_B01GTO91WI_9134", "instruction": "i would like a 16 ounce bag of sweet potato gluten free flower.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sweet potato", "16 ounce (pack of 24)" ] }, "asin": "B01GTO91WI" }, { "task_id": "ws_B08FF672VG_9135", "instruction": "i would love to find a coffee table ideal for my living room? also, pick white please", "target_attributes": { "attributes": [ "white item", "living room" ], "options": [ "white" ] }, "asin": "B08FF672VG" }, { "task_id": "ws_B087QW1WVV_9136", "instruction": "i would like a 0.17 ounce pack of gluten free oats.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "gluten free oats", "0.17 ounce (pack of 4)" ] }, "asin": "B087QW1WVV" }, { "task_id": "ws_B087QW1WVV_9137", "instruction": "i want gluten free sigdal bakeri norwegian crispbread with pumpkin seeds.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pumpkin seeds" ] }, "asin": "B087QW1WVV" }, { "task_id": "ws_B09RPFKQKT_9138", "instruction": "i'm looking for soft elastic mid-waist breathable boxer briefs.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "3 pack red" ] }, "asin": "B09RPFKQKT" }, { "task_id": "ws_B07R9M8S63_9139", "instruction": "i would like a 7 by 5 foot long photo backdrop that is light weight and easy to carry.", "target_attributes": { "attributes": [ "light weight", "digital photography" ], "options": [ "7x5ft" ] }, "asin": "B07R9M8S63" }, { "task_id": "ws_B093SSG6KP_9140", "instruction": "i am interested in a reticular blue colred non slip rugs for the living room which is easy to clean.", "target_attributes": { "attributes": [ "non slip", "easy clean", "living room" ], "options": [ "reticular blue" ] }, "asin": "B093SSG6KP" }, { "task_id": "ws_B08252526L_9141", "instruction": "i am looking for a quad core powered high resolution 7 inch tablet with nfc.", "target_attributes": { "attributes": [ "high resolution", "quad core" ], "options": [] }, "asin": "B08252526L" }, { "task_id": "ws_B07N85JD3S_9142", "instruction": "i am looking for a baby blue colored t-shirt with the star wars logo.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "baby blue" ] }, "asin": "B07N85JD3S" }, { "task_id": "ws_B09D6TKG55_9143", "instruction": "i need a high speed asus pn41 fanless minipc barebone with intel 11th gen dual core celeron n4500 that also has a bluetooth.", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B09D6TKG55" }, { "task_id": "ws_B09JQ631H6_9144", "instruction": "i am loooking for mini business desktop having wireless bluetooth.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09JQ631H6" }, { "task_id": "ws_B099WZC2BD_9145", "instruction": "i would like a 108 inch by 84 inch color 27 window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "color27", "108\" w x 84\" l" ] }, "asin": "B099WZC2BD" }, { "task_id": "ws_B07BDQ2413_9146", "instruction": "i would like a body scrub for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B07BDQ2413" }, { "task_id": "ws_B09KMQN4HK_9147", "instruction": "i want cupcake toppers for 2022 kids baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "2022 e" ] }, "asin": "B09KMQN4HK" }, { "task_id": "ws_B09G74B6LD_9148", "instruction": "i need a fleece jacket for the winter that is warm and gray", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "#a2 gray" ] }, "asin": "B09G74B6LD" }, { "task_id": "ws_B0932QRZJG_9149", "instruction": "i'm looking for a stainless steel quick release replacement wristband for fitbit inspire. choose the one that comes in white and in small in size.", "target_attributes": { "attributes": [ "quick release", "stainless steel" ], "options": [ "white", "small" ] }, "asin": "B0932QRZJG" }, { "task_id": "ws_B0831NKRD1_9150", "instruction": "am searching for low rise handyulong plus size womens jeans size 5x-large", "target_attributes": { "attributes": [ "low rise" ], "options": [ "5x-large" ] }, "asin": "B0831NKRD1" }, { "task_id": "ws_B01GQ5WNC0_9151", "instruction": "i am looking for quaker chewy granola bars that are individually wrapped.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B01GQ5WNC0" }, { "task_id": "ws_B016OK3LGE_9152", "instruction": "i would like some green binoculars for bird watching", "target_attributes": { "attributes": [ "bird watching" ], "options": [ "10x green" ] }, "asin": "B016OK3LGE" }, { "task_id": "ws_B09DFLS85N_9153", "instruction": "i am looking for red black color shower curtains that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "red black" ] }, "asin": "B09DFLS85N" }, { "task_id": "ws_B09JWY1CG4_9154", "instruction": "i'm looking for two flavor energy shots.", "target_attributes": { "attributes": [ "low sugar", "low carb" ], "options": [ "variety 2-pack" ] }, "asin": "B09JWY1CG4" }, { "task_id": "ws_B09P3YCNGR_9155", "instruction": "i would like a extra large green swimsuit made from cotton spandex.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "swimsuits-a225-green", "x-large" ] }, "asin": "B09P3YCNGR" }, { "task_id": "ws_B08MW5H2NF_9156", "instruction": "i want to buy brushes which are for nail polish and have galaxy mix color, and come in a blind box.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "galaxy mix", "blind box" ] }, "asin": "B08MW5H2NF" }, { "task_id": "ws_B08MW5H2NF_9157", "instruction": "i am interested in buying make up brushes which are for nail polish, and the color of which is bonbon rose powder-50p and comes in blind box.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "bonbon rose powder-50p", "blind box" ] }, "asin": "B08MW5H2NF" }, { "task_id": "ws_B00CM0XHRE_9158", "instruction": "i am looking for a cyan blue wireless bluetooth speaker that has the batteries included.", "target_attributes": { "attributes": [ "batteries included", "wireless bluetooth" ], "options": [ "cyan blue" ] }, "asin": "B00CM0XHRE" }, { "task_id": "ws_B013GKG9XM_9159", "instruction": "hanes women's x-temp seamless waistband, large, nylon spandex. i hope you are successful in your search. it will be very useful for me.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [] }, "asin": "B013GKG9XM" }, { "task_id": "ws_B00YIU7C7W_9160", "instruction": "i need plant based protein bars that are of the peanut butter variety", "target_attributes": { "attributes": [ "plant based" ], "options": [ "peanut butter variety" ] }, "asin": "B00YIU7C7W" }, { "task_id": "ws_B09P3KS3KV_9161", "instruction": "i want a medium sized t-shirt that has long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09P3KS3KV" }, { "task_id": "ws_B07ZWYNPKK_9162", "instruction": "i am looking for a long lasting ncaa south carolina fighting gamecocks jacket that is made of quality materials.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "south carolina fighting gamecocks" ] }, "asin": "B07ZWYNPKK" }, { "task_id": "ws_B086BBDGL5_9163", "instruction": "i need a 25 pack of herbal tea that is caffeine free", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "25 count (pack of 3)" ] }, "asin": "B086BBDGL5" }, { "task_id": "ws_B09HNJZ14D_9164", "instruction": "can you get me a margarita mix, palomas, real fruit and not too much sugar, and i'll need 32 ounces of it.", "target_attributes": { "attributes": [ "low sugar", "real fruit" ], "options": [ "paloma", "32 fl oz (pack of 3)" ] }, "asin": "B09HNJZ14D" }, { "task_id": "ws_B079TFX61M_9165", "instruction": "i'm looking for a military and tactical boot with moisture wicking and rubber sole.", "target_attributes": { "attributes": [ "moisture wicking", "rubber sole" ], "options": [] }, "asin": "B079TFX61M" }, { "task_id": "ws_B07YB5BBL4_9166", "instruction": "i need hall trees for the living room that are brown", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown" ] }, "asin": "B07YB5BBL4" }, { "task_id": "ws_B01FFACR4Q_9167", "instruction": "i want to update my digital camera. i'm looking for a canon powershot sx620 w/ optical zoom 25x black color, 64gb memory card. i hope it's the best choice for my need.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "black", "w | 64gb memory card" ] }, "asin": "B01FFACR4Q" }, { "task_id": "ws_B01HDUTJII_9168", "instruction": "i am looking for pink wireless bluetooth headphones that have the hands free calling feature.", "target_attributes": { "attributes": [ "hands free", "wireless bluetooth" ], "options": [ "pink" ] }, "asin": "B01HDUTJII" }, { "task_id": "ws_B08T8LBSGF_9169", "instruction": "i am looking for black quick drying, butt lifting leggings in size large.", "target_attributes": { "attributes": [ "butt lifting", "quick drying" ], "options": [ "#11-scrunch butt black", "large" ] }, "asin": "B08T8LBSGF" }, { "task_id": "ws_B07YG8RCRD_9170", "instruction": "i would like orange mousse cookies that are non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "orange mousse" ] }, "asin": "B07YG8RCRD" }, { "task_id": "ws_B09DQ5ZNFC_9171", "instruction": "i am looking for a high speed 3 foot red usb cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "red", "3ft" ] }, "asin": "B09DQ5ZNFC" }, { "task_id": "ws_B01NGZ050U_9172", "instruction": "i am looking to buy some fully cooked and ready to eat vienna sausage.", "target_attributes": { "attributes": [ "ready eat", "fully cooked" ], "options": [] }, "asin": "B01NGZ050U" }, { "task_id": "ws_B09P58F4SD_9173", "instruction": "i am looking for pink slide flip flops with arch support in the size 5.5.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "z5 pink", "5.5" ] }, "asin": "B09P58F4SD" }, { "task_id": "ws_B09219DD59_9174", "instruction": "i would like a 90 piece assortment of individually wrapped snacks.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "90 piece assortment" ] }, "asin": "B09219DD59" }, { "task_id": "ws_B091DCQXM6_9175", "instruction": "i am looking for x-large size socks that contain cotton spandex.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "x-large" ] }, "asin": "B091DCQXM6" }, { "task_id": "ws_B07M7LDGXB_9176", "instruction": "oral nano silver mint toothpaste, natural fluoride free tooth whitening toothpaste, 4 oz. (pack of 1). my daughter only uses this one. i didn't find it in the pharmacy, let me know as soon as you find it", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B07M7LDGXB" }, { "task_id": "ws_B08YQZQZW6_9177", "instruction": "i am looking for some sweet 16 cupcake toppers for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B08YQZQZW6" }, { "task_id": "ws_B01HOI5E9M_9178", "instruction": "i am looking for foundation for dry skin having color 20 | natural ivory.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "20 | natural ivory" ] }, "asin": "B01HOI5E9M" }, { "task_id": "ws_B077PHG1MV_9179", "instruction": "i would like a 40 wide by 36 long pair of big and tall pants in charcoal heather that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "charcoal heather", "big & tall", "40w x 36l" ] }, "asin": "B077PHG1MV" }, { "task_id": "ws_B077PHG1MV_9180", "instruction": "i am looking for men's khaki pants in the color olive grove, and they must have a button closure and be machine washable.", "target_attributes": { "attributes": [ "machine wash", "button closure" ], "options": [ "olive grove" ] }, "asin": "B077PHG1MV" }, { "task_id": "ws_B08SJLZD59_9181", "instruction": "i'm looking for a white case for iphone 12 with american flag printed and wireless charging", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "white" ] }, "asin": "B08SJLZD59" }, { "task_id": "ws_B09S3NGKV2_9182", "instruction": "i am looking for a local gold hands free wireless earpiece with mic.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "local gold" ] }, "asin": "B09S3NGKV2" }, { "task_id": "ws_B09S3NGKV2_9183", "instruction": "i need black color hands free wireless earpiece with mic", "target_attributes": { "attributes": [ "hands free" ], "options": [ "black" ] }, "asin": "B09S3NGKV2" }, { "task_id": "ws_B09PHGW8BH_9184", "instruction": "i am looking for a high performance easy to carry black wireless bluetooth speaker.", "target_attributes": { "attributes": [ "high performance", "easy carry", "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09PHGW8BH" }, { "task_id": "ws_B09M4B9JYK_9185", "instruction": "i want low fat honey bunches of oats.", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B09M4B9JYK" }, { "task_id": "ws_B093SZ32M3_9186", "instruction": "i want to buy a mesh travel laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SZ32M3" }, { "task_id": "ws_B09K7VRPPH_9187", "instruction": "i am looking for a high performance red speaker with wireless bluetooth.", "target_attributes": { "attributes": [ "high performance", "wireless bluetooth" ], "options": [ "red" ] }, "asin": "B09K7VRPPH" }, { "task_id": "ws_B09PMGS3X4_9188", "instruction": "i need a tonic that is non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "tonic" ] }, "asin": "B09PMGS3X4" }, { "task_id": "ws_B004WRCU8M_9189", "instruction": "i need 1 pack of cruelty free hair spray.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "1 pack" ] }, "asin": "B004WRCU8M" }, { "task_id": "ws_B07WGP1W2L_9190", "instruction": "help me find a water-resistant sports strap that is compatible with the apple iwatch. also, please choose a teal one.", "target_attributes": { "attributes": [ "water resistant", "compatible apple" ], "options": [ "teal" ] }, "asin": "B07WGP1W2L" }, { "task_id": "ws_B094NP978P_9191", "instruction": "i'm locking for wireless bluetooth earpiece for business, office and driving.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B094NP978P" }, { "task_id": "ws_B08MQMW47K_9192", "instruction": "i would like a pair of size 13 dark truffle loafers with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "dark truffle | tundra", "13" ] }, "asin": "B08MQMW47K" }, { "task_id": "ws_B074J2GW2X_9193", "instruction": "i would like brown rice that is organic and spanish style", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "spanish style rice" ] }, "asin": "B074J2GW2X" }, { "task_id": "ws_B07GT2GL1N_9194", "instruction": "i am looking for noise cancelling earbuds for iphone.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B07GT2GL1N" }, { "task_id": "ws_B001HTI3BQ_9195", "instruction": "lightly smoked organic lemon flavor wild caught sardines in olive oil", "target_attributes": { "attributes": [ "wild caught" ], "options": [ "organic lemon" ] }, "asin": "B001HTI3BQ" }, { "task_id": "ws_B09ND7C1L2_9196", "instruction": "i need a wireless bluetooth speaker compatible for my smart watch", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09ND7C1L2" }, { "task_id": "ws_B09KZNFD8T_9197", "instruction": "i need a grey protective airpods 3 case cover which is compatible with apple.", "target_attributes": { "attributes": [ "compatible apple", "case cover" ], "options": [ "d-grey" ] }, "asin": "B09KZNFD8T" }, { "task_id": "ws_B01HV9BY5W_9198", "instruction": "i am looking for a grey coated steel storage islands & carts", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "grey" ] }, "asin": "B01HV9BY5W" }, { "task_id": "ws_B07WVZCHHG_9199", "instruction": "i would like a remote with aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B07WVZCHHG" }, { "task_id": "ws_B07CB8PKD9_9200", "instruction": "i am looking for a black, stainless steel bottle.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black+black" ] }, "asin": "B07CB8PKD9" }, { "task_id": "ws_B00Y7CYBUW_9201", "instruction": "i am looking for 25 ml fluoride free fresh truth toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ ".84 ounce | 25 ml" ] }, "asin": "B00Y7CYBUW" }, { "task_id": "ws_B01LWJAXIG_9202", "instruction": "i want a pack of 2 32 fl oz original sprout classic shampoos that are non toxic.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "32 fl oz (pack of 2)" ] }, "asin": "B01LWJAXIG" }, { "task_id": "ws_B084CVRFYL_9203", "instruction": "i would like a carbon fiber car stereo kit.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B084CVRFYL" }, { "task_id": "ws_B08JSTNKLH_9204", "instruction": "i am interested in ocean blue holographic, easy to apply and long lasting sparkle glitter.", "target_attributes": { "attributes": [ "easy apply", "long lasting" ], "options": [ "ocean blue holographic" ] }, "asin": "B08JSTNKLH" }, { "task_id": "ws_B09K9RRZVK_9205", "instruction": "i am looking for real fruit smoothie mix that is easy to use and has the flavor passion fruit.", "target_attributes": { "attributes": [ "easy use", "real fruit" ], "options": [ "passion fruit" ] }, "asin": "B09K9RRZVK" }, { "task_id": "ws_B08MJFJJYK_9206", "instruction": "i want to get a two pack vanity light with brushed nickel finish in color type 2.", "target_attributes": { "attributes": [ "brushed nickel", "vanity light" ], "options": [ "type 2", "2 pack" ] }, "asin": "B08MJFJJYK" }, { "task_id": "ws_B001B2S32S_9207", "instruction": "i would like some long lasting hair color in light golden brown", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "054 light golden brown" ] }, "asin": "B001B2S32S" }, { "task_id": "ws_B001B2S32S_9208", "instruction": "i'm looking for a single pack of old style, brown hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "pack of 1", "old version" ] }, "asin": "B001B2S32S" }, { "task_id": "ws_B001B2S32S_9209", "instruction": "i'm looking for a three count package of long lasting, brown hair dye.", "target_attributes": { "attributes": [ "long lasting", "hair dye" ], "options": [ "3 count (pack of 1)" ] }, "asin": "B001B2S32S" }, { "task_id": "ws_B00XQ3QL24_9210", "instruction": "i'm looking for long lasting men's cologne from banana republic.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B00XQ3QL24" }, { "task_id": "ws_B072BPPSCF_9211", "instruction": "i need a valentine's day gift", "target_attributes": { "attributes": [ "valentine day" ], "options": [] }, "asin": "B072BPPSCF" }, { "task_id": "ws_B09S31W7TD_9212", "instruction": "i would like a white and green 5 cube bookcase.", "target_attributes": { "attributes": [ "white item" ], "options": [ "white green", "5-cube" ] }, "asin": "B09S31W7TD" }, { "task_id": "ws_B00QTUCVAM_9213", "instruction": "i would like a chandelier for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [] }, "asin": "B00QTUCVAM" }, { "task_id": "ws_B098TPB85F_9214", "instruction": "i am looking for mens lightweight cargo shorts camo in pattern.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "black" ] }, "asin": "B098TPB85F" }, { "task_id": "ws_B07TJ7D457_9215", "instruction": "i need a super soft area rug that is white", "target_attributes": { "attributes": [ "super soft" ], "options": [ "white" ] }, "asin": "B07TJ7D457" }, { "task_id": "ws_B07VBZXM7V_9216", "instruction": "i'm looking for a low carb gluten free ketchup flavored bbq sauce. choose the ones that comes in 12 ounce bottles and pack of 2.", "target_attributes": { "attributes": [ "low carb", "gluten free" ], "options": [ "ketchup", "12 ounce (pack of 2)" ] }, "asin": "B07VBZXM7V" }, { "task_id": "ws_B07DX8FLPN_9217", "instruction": "i would like to buy a screen protector which is made with tempered glass and is suitable for iphone 6 and iphone 6s plus 5.5.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "iphone 6 | 6s plus 5.5\"" ] }, "asin": "B07DX8FLPN" }, { "task_id": "ws_B09J2ZLMC2_9218", "instruction": "i want a hair removal epilator.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09J2ZLMC2" }, { "task_id": "ws_B08CJ2BW1G_9219", "instruction": "looking for an easy to deliver vintage barbecue sauce needle sleeve white women's halloween t-shirt by tomorrow? forgot to machine wash.", "target_attributes": { "attributes": [ "machine wash", "needle sleeve" ], "options": [ "white", "women" ] }, "asin": "B08CJ2BW1G" }, { "task_id": "ws_B088GXF6VD_9220", "instruction": "high quality butterfly hair clip for women", "target_attributes": { "attributes": [ "quality materials" ], "options": [] }, "asin": "B088GXF6VD" }, { "task_id": "ws_B07RPYQCKB_9221", "instruction": "i am looking for a pair of machine washable men's levi's 501 blue jeans.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "blue" ] }, "asin": "B07RPYQCKB" }, { "task_id": "ws_B075GW4GXH_9222", "instruction": "i am interested in buying a twin sized natural colored full sized bed frame made of solid wood having a headboard.", "target_attributes": { "attributes": [ "twin size", "solid wood" ], "options": [ "natural", "full", "with headboard" ] }, "asin": "B075GW4GXH" }, { "task_id": "ws_B0944YG6SQ_9223", "instruction": "i am interested in buying white color, cruelty free hair building fibers for thinning hair.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "white" ] }, "asin": "B0944YG6SQ" }, { "task_id": "ws_B07QMGTXQX_9224", "instruction": "i'm interested in a pair of orange sport pants with an elastic waist and drawstring closure in a size x-large.", "target_attributes": { "attributes": [ "drawstring closure", "elastic waist" ], "options": [ "r-aa-orange", "x-large" ] }, "asin": "B07QMGTXQX" }, { "task_id": "ws_B08FDCD6NW_9225", "instruction": "i'm looking for printed window curtain.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "54\"w x18\" l" ] }, "asin": "B08FDCD6NW" }, { "task_id": "ws_B08FDCD6NW_9226", "instruction": "buy me some fifty-four inch machine washable drapes for my dining room.", "target_attributes": { "attributes": [ "machine washable", "dining room" ], "options": [ "54\"w x18\" l" ] }, "asin": "B08FDCD6NW" }, { "task_id": "ws_B08N5CPD71_9227", "instruction": "i am looking for hair color that is alcohol free and is having color as 1 hair color: 9-00.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "1 hair color" ] }, "asin": "B08N5CPD71" }, { "task_id": "ws_B07FDQD8T8_9228", "instruction": "i would like a 5.5 ounce bag of sweet chili chips that are non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sweet chili", "5.5 ounce (pack of 6)" ] }, "asin": "B07FDQD8T8" }, { "task_id": "ws_B092LNSRYV_9229", "instruction": "i am looking for a beard oil that will help stimulate hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B092LNSRYV" }, { "task_id": "ws_B09MFYFTYF_9230", "instruction": "i want a modern tall bookcase for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09MFYFTYF" }, { "task_id": "ws_B004LU0N70_9231", "instruction": "am hoping to find q-tips cotton swab 375.0 ea nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [] }, "asin": "B004LU0N70" }, { "task_id": "ws_B08D9J7LMH_9232", "instruction": "i am looking for a gold pendant light for my dining room.", "target_attributes": { "attributes": [ "pendant light", "dining room" ], "options": [ "gold" ] }, "asin": "B08D9J7LMH" }, { "task_id": "ws_B09HTTSFSG_9233", "instruction": "i am looking for a shadow box frame made from solid wood. also, i would like the size to be 10 by 10.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "10x10" ] }, "asin": "B09HTTSFSG" }, { "task_id": "ws_B01M0WKYT7_9234", "instruction": "get me some tattoo serum that uses tea tree oil and is paraben free.", "target_attributes": { "attributes": [ "paraben free", "tea tree" ], "options": [] }, "asin": "B01M0WKYT7" }, { "task_id": "ws_B0936HMVXB_9235", "instruction": "i'm looking for a package of cupcake toppers for my brother's birthday party cupcakes.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B0936HMVXB" }, { "task_id": "ws_B0936HMVXB_9236", "instruction": "i am looking for cupcake topper for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B0936HMVXB" }, { "task_id": "ws_B09FPTKNK4_9237", "instruction": "i'm looking for silk bonnet.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "gold" ] }, "asin": "B09FPTKNK4" }, { "task_id": "ws_B08T6CQY1M_9238", "instruction": "i would like a living room lead free candle.", "target_attributes": { "attributes": [ "lead free", "living room" ], "options": [] }, "asin": "B08T6CQY1M" }, { "task_id": "ws_B09KTKTM75_9239", "instruction": "i would like a fast charging station.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09KTKTM75" }, { "task_id": "ws_B07X8YFMWL_9240", "instruction": "i would like a pair of 14 wide cognac sandals with a leather sole.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "cognac", "14 wide" ] }, "asin": "B07X8YFMWL" }, { "task_id": "ws_B07TSRBKZ6_9241", "instruction": "i want black kmm cotton moisture wicking socks.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "black blue" ] }, "asin": "B07TSRBKZ6" }, { "task_id": "ws_B09JMVK45R_9242", "instruction": "i would like an intel core desktop that has 64 gb of ram with 4 tb storage", "target_attributes": { "attributes": [ "intel core" ], "options": [ "64gb ram|4tb ssd|win10h" ] }, "asin": "B09JMVK45R" }, { "task_id": "ws_B09MT7QRV5_9243", "instruction": "look for wash cold pajama set nightwear that size small", "target_attributes": { "attributes": [ "wash cold" ], "options": [ "small" ] }, "asin": "B09MT7QRV5" }, { "task_id": "ws_B09LS6XBNP_9244", "instruction": "my grandson asked me for this order. tjs compatible with boost mobile celero 5g case, samsung galaxy a22 5g case, red color glass screen, it has a lot of detail, and i don't know if i can find it without your help.", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "red" ] }, "asin": "B09LS6XBNP" }, { "task_id": "ws_B012POYRL6_9245", "instruction": "i would like a chocolate chip oat bar that's gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chocolate chip" ] }, "asin": "B012POYRL6" }, { "task_id": "ws_B095WGG4QR_9246", "instruction": "i would like a pair of black headphones that have wireless bluetooth.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B095WGG4QR" }, { "task_id": "ws_B07683ZG4B_9247", "instruction": "i would like a extra large texas orange t shirt with moisture wicking.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "black | texas orange", "x-large" ] }, "asin": "B07683ZG4B" }, { "task_id": "ws_B09LDC8WKH_9248", "instruction": "i want a pack of wall lamps for a living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "1 pack" ] }, "asin": "B09LDC8WKH" }, { "task_id": "ws_B09698R81K_9249", "instruction": "i want an orange fast charging usb type-c charging cable power cord.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "orange" ] }, "asin": "B09698R81K" }, { "task_id": "ws_B09K7RY4ZF_9250", "instruction": "i am looking for a hands free white alarm clock with wireless bluetooth.", "target_attributes": { "attributes": [ "hands free", "wireless bluetooth" ], "options": [ "white" ] }, "asin": "B09K7RY4ZF" }, { "task_id": "ws_B07D5ZGY8Z_9251", "instruction": "i want to buy a t-shirt which is classic fit and can be machine washed, as for the color i want it lemon color, and suitable for women, with a size of x-large.", "target_attributes": { "attributes": [ "machine wash", "classic fit" ], "options": [ "lemon", "women", "x-large" ] }, "asin": "B07D5ZGY8Z" }, { "task_id": "ws_B09NVVPPQ3_9252", "instruction": "i am looking for women's turtle necks loose oversized sweaters.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-large" ] }, "asin": "B09NVVPPQ3" }, { "task_id": "ws_B09MM37YLN_9253", "instruction": "i'm looking for a u-shaped toothbrush for my child's sensitive teeth that is aqua colored.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "a" ] }, "asin": "B09MM37YLN" }, { "task_id": "ws_B09DQ9SN67_9254", "instruction": "i would like a 31 wide by 30 long dark williamsburg pair of straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "dark williamsburg", "31w x 30l" ] }, "asin": "B09DQ9SN67" }, { "task_id": "ws_B084LMXRSJ_9255", "instruction": "i would like a 3xl dark green tennessee titan polo that is officially licensed.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "charcoal | dark green", "3x-large tall", "tennessee titans" ] }, "asin": "B084LMXRSJ" }, { "task_id": "ws_B09B1DJBRV_9256", "instruction": "i would like a pair of black size 8.5 boots with a comfortable fit.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "black | black", "8.5" ] }, "asin": "B09B1DJBRV" }, { "task_id": "ws_B093RVKB8Z_9257", "instruction": "i need some cabernet for a great gift", "target_attributes": { "attributes": [ "great gift" ], "options": [ "french cabernet sauvignon" ] }, "asin": "B093RVKB8Z" }, { "task_id": "ws_B07XGJBX47_9258", "instruction": "i am looking for a dolly parton's greatest hits t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "x-small" ] }, "asin": "B07XGJBX47" }, { "task_id": "ws_B00KBOL612_9259", "instruction": "i am looking for 10 wide tan color synthetic sole womens slipper", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "tan | black leopard", "10 wide" ] }, "asin": "B00KBOL612" }, { "task_id": "ws_B09KPZX6H8_9260", "instruction": "i am looking for a super soft throw blanket of pattern 2 color.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "pattern 2" ] }, "asin": "B09KPZX6H8" }, { "task_id": "ws_B09SL3QDBS_9261", "instruction": "i'm looking for massage table sheet sets.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "red" ] }, "asin": "B09SL3QDBS" }, { "task_id": "ws_B01N9YSI29_9262", "instruction": "i'm looking for tea tree oil soap with a peppermint tea tree scent. i want a 2 pack of 4 ounce bars.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "peppermint tea tree", "2-pack of 4 ounce soap bars" ] }, "asin": "B01N9YSI29" }, { "task_id": "ws_B07ZGDX4LS_9263", "instruction": "i am looking for a water resistant battery storage containers", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B07ZGDX4LS" }, { "task_id": "ws_B085VJBRFS_9264", "instruction": "i am looking for milk creme chocolate bar with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "milk" ] }, "asin": "B085VJBRFS" }, { "task_id": "ws_B07BT8JFNT_9265", "instruction": "i'm looking for a twelve pack of black cherry cream flavor hand crafted soda in bottles.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "black cherry cream" ] }, "asin": "B07BT8JFNT" }, { "task_id": "ws_B01NAT3AGR_9266", "instruction": "i'm looking for casual twill mens shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "xx-large" ] }, "asin": "B01NAT3AGR" }, { "task_id": "ws_B01N0XKMP6_9267", "instruction": "i am interested in buying a size 15 walking shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "15" ] }, "asin": "B01N0XKMP6" }, { "task_id": "ws_B073C45CPQ_9268", "instruction": "i would like a regular sea glass towel for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "sea glass", "regular (19x39 inches)" ] }, "asin": "B073C45CPQ" }, { "task_id": "ws_B07HB9R7ZC_9269", "instruction": "i am looking for an i5 quad core computer with 16 gb memory.", "target_attributes": { "attributes": [ "core i5", "quad core" ], "options": [] }, "asin": "B07HB9R7ZC" }, { "task_id": "ws_B09PTK7CYL_9270", "instruction": "i would like to buy easy to clean massage table sheets which are pink in color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "pink 3" ] }, "asin": "B09PTK7CYL" }, { "task_id": "ws_B09JLDJQXX_9271", "instruction": "i am looking for a gray long sleeved puffy jacket in size small.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "05 # gray", "small" ] }, "asin": "B09JLDJQXX" }, { "task_id": "ws_B09ND72Y7Z_9272", "instruction": "i'm looking for a winter pajama set that my husband can wear every day: it needs to have an elastic waistband because he's a size xxl.", "target_attributes": { "attributes": [ "elastic waistband", "daily wear" ], "options": [ "xx-large" ] }, "asin": "B09ND72Y7Z" }, { "task_id": "ws_B07WGQFP6V_9273", "instruction": "i want asian sesame keto salad dressing.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "asian sesame" ] }, "asin": "B07WGQFP6V" }, { "task_id": "ws_B09P2P9BKV_9274", "instruction": "i am looking for a hydrating stick for face that is suitable for sensitive skin", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "0.8 ounce", "tea tree" ] }, "asin": "B09P2P9BKV" }, { "task_id": "ws_B00HUB2Z46_9275", "instruction": "i would like to buy shea butter, which should be cruelty free product and for dry hair.", "target_attributes": { "attributes": [ "cruelty free", "dry hair" ], "options": [] }, "asin": "B00HUB2Z46" }, { "task_id": "ws_B09M2L6RDW_9276", "instruction": "i am looking for an android 11 tablet with 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09M2L6RDW" }, { "task_id": "ws_B09QQ15B5M_9277", "instruction": "i am looking for a storage cabinet that is suitable for my living room. pick an espresso color.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "espresso-3" ] }, "asin": "B09QQ15B5M" }, { "task_id": "ws_B073WMR9VS_9278", "instruction": "i am looking for a blue colored, water resistant wireless bluetooth speaker.", "target_attributes": { "attributes": [ "water resistant", "wireless bluetooth" ], "options": [ "blue" ] }, "asin": "B073WMR9VS" }, { "task_id": "ws_B08NPHTBXB_9279", "instruction": "i am looking for an easy to install vanity light for bathroom.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [] }, "asin": "B08NPHTBXB" }, { "task_id": "ws_B09NVCYGZJ_9280", "instruction": "i need 2 pieces of tempered glass film coverings for my dining room windows; they are 17.7\"x35.4\" in size.", "target_attributes": { "attributes": [ "tempered glass", "dining room" ], "options": [ "(width\uff0917.7in x (length)35.4in x 2pcs" ] }, "asin": "B09NVCYGZJ" }, { "task_id": "ws_B09NVCYGZJ_9281", "instruction": "i would like a 23.6in by 23.6in in 2pcs set of red window films with tempered glass.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "1022157076510930000", "(width\uff0923.6in x (length)23.6in x 2pcs" ] }, "asin": "B09NVCYGZJ" }, { "task_id": "ws_B08NBDYBJ8_9282", "instruction": "im looking for a blue gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "blue" ] }, "asin": "B08NBDYBJ8" }, { "task_id": "ws_B00G8R58QU_9283", "instruction": "i want to buy some cc cream with hyaluronic acid and color light in size .4 oz.", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "light", ".4 ounce" ] }, "asin": "B00G8R58QU" }, { "task_id": "ws_B00G8R58QU_9284", "instruction": "look for this brand: it cosmetics your skin but better, full coverage foundation, moisturizing serum and sunscreen spf 50+ - natural finish - for my dark circles .4 oz", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B00G8R58QU" }, { "task_id": "ws_B07NVSY9BK_9285", "instruction": "i want a moonlight lip glosses that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "moonlight" ] }, "asin": "B07NVSY9BK" }, { "task_id": "ws_B08154NM4M_9286", "instruction": "i want a small sonic toothbrush for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "small" ] }, "asin": "B08154NM4M" }, { "task_id": "ws_B07P72RMKH_9287", "instruction": "i would like a full size style 8 duvet cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "style8", "full" ] }, "asin": "B07P72RMKH" }, { "task_id": "ws_B07W3GBBZY_9288", "instruction": "i'd like a print of persistence of memory, ready to hang in my living room with dimensions 20\"x16\"x1.5\".", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "20\"x16\"x1.5\"" ] }, "asin": "B07W3GBBZY" }, { "task_id": "ws_B0010C2UK0_9289", "instruction": "i am looking for low calorie, gluten free organic\\ pasta sauce", "target_attributes": { "attributes": [ "low calorie", "gluten free" ], "options": [] }, "asin": "B0010C2UK0" }, { "task_id": "ws_B07NMD498D_9290", "instruction": "i am looking for peripera velvet lipstick that is long lasting and in the color red.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "06 sold out red" ] }, "asin": "B07NMD498D" }, { "task_id": "ws_B09QLXZYW7_9291", "instruction": "i would like a fireplace and tv stand for my living room with lots of storage space.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "fireplace + tv stand" ] }, "asin": "B09QLXZYW7" }, { "task_id": "ws_B09JKM41ML_9292", "instruction": "i would like a easy to assemble buffet sideboard.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B09JKM41ML" }, { "task_id": "ws_B08VGPYGYN_9293", "instruction": "i am looking for a high resolution projector screen with stand. also, i would like the item to be made of aluminum alloy.", "target_attributes": { "attributes": [ "high resolution", "aluminum alloy" ], "options": [] }, "asin": "B08VGPYGYN" }, { "task_id": "ws_B09NF79TD7_9294", "instruction": "i'm looking for an officially licensed spider-man t-shirt with black needle sleeves.", "target_attributes": { "attributes": [ "officially licensed", "needle sleeve" ], "options": [ "black" ] }, "asin": "B09NF79TD7" }, { "task_id": "ws_B09NQZHM14_9295", "instruction": "i would like some gold living room end tables", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold" ] }, "asin": "B09NQZHM14" }, { "task_id": "ws_B073D8VH5S_9296", "instruction": "i'd like to get some binoculars that are high definition and have a carying case. look for style 8x42.", "target_attributes": { "attributes": [ "high definition", "carrying case" ], "options": [ "8x42" ] }, "asin": "B073D8VH5S" }, { "task_id": "ws_B07Y7JKQ2G_9297", "instruction": "i am looking for an easy to use anti aging jade roller.", "target_attributes": { "attributes": [ "anti aging", "easy use" ], "options": [] }, "asin": "B07Y7JKQ2G" }, { "task_id": "ws_B01B3IAYEE_9298", "instruction": "i am looking for nefertiti's rejuvenating conditioner for dry and damaged hair", "target_attributes": { "attributes": [ "damaged hair", "dry hair" ], "options": [] }, "asin": "B01B3IAYEE" }, { "task_id": "ws_B094XK66XL_9299", "instruction": "i am looking for high speed vr headset of size 10ft.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10ft" ] }, "asin": "B094XK66XL" }, { "task_id": "ws_B085LSYPYK_9300", "instruction": "i am looking for men's dark clay color ankle strap sandals.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "dark clay" ] }, "asin": "B085LSYPYK" }, { "task_id": "ws_B093PZZQC8_9301", "instruction": "i am looking for a high quality baby toothbrush that are easy to carry.", "target_attributes": { "attributes": [ "easy carry", "high quality" ], "options": [] }, "asin": "B093PZZQC8" }, { "task_id": "ws_B002G9MMOA_9302", "instruction": "i want navy landau essentials straight leg scrub pants.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "navy" ] }, "asin": "B002G9MMOA" }, { "task_id": "ws_B0812TLR8P_9303", "instruction": "i am looking for a kit of teeth whitening & sensitive teeth", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [] }, "asin": "B0812TLR8P" }, { "task_id": "ws_B07RV26NQ9_9304", "instruction": "i am looking for a heavy duty protective case for iphone of color 2 in 1 red | black.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "2 in 1 red | black" ] }, "asin": "B07RV26NQ9" }, { "task_id": "ws_B07L942Q7B_9305", "instruction": "i am looking for large size classic fit t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "large" ] }, "asin": "B07L942Q7B" }, { "task_id": "ws_B08411856M_9306", "instruction": "i am looking for a pair of men's size 7 running shoes with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "7" ] }, "asin": "B08411856M" }, { "task_id": "ws_B08411856M_9307", "instruction": "am searching reebok women's nano x cross trainer running shoes with rubber sole and size 7", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "7" ] }, "asin": "B08411856M" }, { "task_id": "ws_B08BHWKZCK_9308", "instruction": "i would like a 5.9 inch pendant light fixture for my living room.", "target_attributes": { "attributes": [ "light fixture", "living room" ], "options": [ "5.9 inch" ] }, "asin": "B08BHWKZCK" }, { "task_id": "ws_B09NRP6LNX_9309", "instruction": "i am looking for keto friendly, certified organic clarified butter in the himalayan pink salt ghee style.", "target_attributes": { "attributes": [ "keto friendly", "certified organic" ], "options": [ "himalayan pink salt ghee" ] }, "asin": "B09NRP6LNX" }, { "task_id": "ws_B099PS6R7Y_9310", "instruction": "i am looking for some easy to install gold plated banana plugs for speaker wire.", "target_attributes": { "attributes": [ "gold plated", "easy install" ], "options": [] }, "asin": "B099PS6R7Y" }, { "task_id": "ws_B09NQ9M14T_9311", "instruction": "this brand is the one i have in other rooms, look for it: greaton wood fully assembled traditional box spring/ 4'' split foundation for mattress, queen size, color white. let me know as soon as you find it.", "target_attributes": { "attributes": [ "white item", "box spring" ], "options": [ "white", "4\" split foundation" ] }, "asin": "B09NQ9M14T" }, { "task_id": "ws_B00ZLUMAOS_9312", "instruction": "i am looking for some gluten free kool ranch flavored kale chips.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "kool ranch" ] }, "asin": "B00ZLUMAOS" }, { "task_id": "ws_B09KXQ368P_9313", "instruction": "i'm looking for eye makeup eyeshadow pads professional stencils.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [] }, "asin": "B09KXQ368P" }, { "task_id": "ws_B01B22W4OE_9314", "instruction": "i need some oatmeal chocolate chip cookies that is made from real fruit. make sure that is plant based.", "target_attributes": { "attributes": [ "plant based", "real fruit" ], "options": [ "oatmeal chocolate chip" ] }, "asin": "B01B22W4OE" }, { "task_id": "ws_B098BFLRQ2_9315", "instruction": "i am interested in buying remove cover which is light weight, and easy to install, and it's color should be red.", "target_attributes": { "attributes": [ "light weight", "easy install" ], "options": [ "red" ] }, "asin": "B098BFLRQ2" }, { "task_id": "ws_B01C8PBPNU_9316", "instruction": "i am looking for amisco club counter stool in grey metal and aqua blue polyurethane that is lead free and easy to clean.", "target_attributes": { "attributes": [ "lead free", "easy clean" ], "options": [ "grey metal | aqua blue polyurethane" ] }, "asin": "B01C8PBPNU" }, { "task_id": "ws_B08QMQ4CNH_9317", "instruction": "i would like a extra large pair of ripped style a jeans with a wide leg.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "ripped style a", "x-large" ] }, "asin": "B08QMQ4CNH" }, { "task_id": "ws_B0957PQ9L3_9318", "instruction": "i'm looking for a high quality stainless steel tongue cleaners. also, choose assorted color1 one.", "target_attributes": { "attributes": [ "high quality", "stainless steel" ], "options": [ "assorted color1" ] }, "asin": "B0957PQ9L3" }, { "task_id": "ws_B07GCLX7KN_9319", "instruction": "i would like a medium sized black sleep set that is light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "style a - 2 pack", "medium" ] }, "asin": "B07GCLX7KN" }, { "task_id": "ws_B08YDBRJW6_9320", "instruction": "i'm looking for an easy-to-carry makeup case that contains various types of eyeshadows and is of high quality, in black marble.", "target_attributes": { "attributes": [ "easy carry", "high quality", "eye shadow" ], "options": [ "marble black" ] }, "asin": "B08YDBRJW6" }, { "task_id": "ws_B08RD37DPB_9321", "instruction": "i am looking for butt-lifting, high waisted workout leggings in the color red and the size medium.", "target_attributes": { "attributes": [ "butt lifting", "high waist" ], "options": [ "(b)-red", "medium" ] }, "asin": "B08RD37DPB" }, { "task_id": "ws_B086VZGSF4_9322", "instruction": "i am looking for a fabric dresser of brown color for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "brown" ] }, "asin": "B086VZGSF4" }, { "task_id": "ws_B09FPQRVC2_9323", "instruction": "i am interested in buying a gaming pc which is quad core and has specs of i7, 8gb, and 256 gb ssd.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "i7|8gb|256gb ssd" ] }, "asin": "B09FPQRVC2" }, { "task_id": "ws_B09QCYMJ6D_9324", "instruction": "i'm looking for a 7.5 black heeled sandals with open toe", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black", "7.5" ] }, "asin": "B09QCYMJ6D" }, { "task_id": "ws_B08NJPXJ12_9325", "instruction": "i'm looking for cute hooded sweatshirts with frog print for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "4x-large" ] }, "asin": "B08NJPXJ12" }, { "task_id": "ws_B08DDJP9BL_9326", "instruction": "i'm looking for a gluten free, keto friendly, and vegan granola that is low sugar and low carb. also, choose the pack of 2 in lemon blueberry tart.", "target_attributes": { "attributes": [ "keto friendly", "gluten free", "low carb", "dairy free" ], "options": [ "lemon blueberry tart", "9 ounce (pack of 2)" ] }, "asin": "B08DDJP9BL" }, { "task_id": "ws_B08YV6T6M3_9327", "instruction": "i want multi colored self grip hair curlers for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "e-multi color-36pcs" ] }, "asin": "B08YV6T6M3" }, { "task_id": "ws_B087HM63GM_9328", "instruction": "i am looking for some alcohol free spearmint mouthwash for bad breath.", "target_attributes": { "attributes": [ "alcohol free", "bad breath" ], "options": [ "spearmint" ] }, "asin": "B087HM63GM" }, { "task_id": "ws_B01MFFYQW3_9329", "instruction": "i need a conditioner for damaged hair", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B01MFFYQW3" }, { "task_id": "ws_B09LR824C8_9330", "instruction": "i'm looking for aaa batteries that will serve as replacement for my soundbar controller.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B09LR824C8" }, { "task_id": "ws_B08XWLWZ7P_9331", "instruction": "i am looking for lactose-free non-dairy coffee creamer.", "target_attributes": { "attributes": [ "lactose free", "non dairy" ], "options": [] }, "asin": "B08XWLWZ7P" }, { "task_id": "ws_B08MQVYDLD_9332", "instruction": "i'm looking for all seed savory crisps.", "target_attributes": { "attributes": [ "grain free", "low carb", "sugar free", "gluten free" ], "options": [] }, "asin": "B08MQVYDLD" }, { "task_id": "ws_B01F7K6Y9S_9333", "instruction": "i want a anti-aging hyaluronic acid cream that includes aloe vera and retinol and is all natural.", "target_attributes": { "attributes": [ "anti aging", "hyaluronic acid" ], "options": [] }, "asin": "B01F7K6Y9S" }, { "task_id": "ws_B09SHJHKYN_9334", "instruction": "i am looking for white colored, quick drying bathing suits for women.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "white" ] }, "asin": "B09SHJHKYN" }, { "task_id": "ws_B06WGQ2MHX_9335", "instruction": "i am looking for sand brown color curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "sand brown" ] }, "asin": "B06WGQ2MHX" }, { "task_id": "ws_B07SQ2J3BR_9336", "instruction": "i'm looking for a type a male to male magnetic ring data transfer extension cable for usb flash drive that is fast charging.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B07SQ2J3BR" }, { "task_id": "ws_B09MND53SQ_9337", "instruction": "i'm looking for led tv stand for 70 inch.", "target_attributes": { "attributes": [ "storage space", "living room" ], "options": [ "a type-w51\"upgrade" ] }, "asin": "B09MND53SQ" }, { "task_id": "ws_B08JLYRZG5_9338", "instruction": "i would like a polka dot cosmetic bag that is travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "polka dot" ] }, "asin": "B08JLYRZG5" }, { "task_id": "ws_B08ZWVPZBX_9339", "instruction": "i am interested in buying hanging lights which are suitable for dining room and living room, while their color should be smoky gray.", "target_attributes": { "attributes": [ "dining room", "living room" ], "options": [ "smoky gray" ] }, "asin": "B08ZWVPZBX" }, { "task_id": "ws_B07W5RQKCJ_9340", "instruction": "i am looking for a large size classic fit unreleased t-shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "large" ] }, "asin": "B07W5RQKCJ" }, { "task_id": "ws_B08728KCJB_9341", "instruction": "i want non alcoholic andy anand's bulk tiramisu cordials.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [ "tiramisu cordials" ] }, "asin": "B08728KCJB" }, { "task_id": "ws_B073YNKVZS_9342", "instruction": "i am looking for womens plus size bootcut jeans.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "18 plus petite" ] }, "asin": "B073YNKVZS" }, { "task_id": "ws_B0963GN8D3_9343", "instruction": "i'm looking for a non toxic body paint scar wax", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "scar wax" ] }, "asin": "B0963GN8D3" }, { "task_id": "ws_B07D4G3QY1_9344", "instruction": "i need a noise cancelling headset that is panasonic", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "middle mono rj9 headset for panasonic ye..." ] }, "asin": "B07D4G3QY1" }, { "task_id": "ws_B08PV6DNMJ_9345", "instruction": "i would like a #5 nightstand that has a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "#5" ] }, "asin": "B08PV6DNMJ" }, { "task_id": "ws_B099MLG9SN_9346", "instruction": "i am looking for one pound of organic walnuts", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "1 pound (pack of 1)" ] }, "asin": "B099MLG9SN" }, { "task_id": "ws_B09MMKFCY8_9347", "instruction": "i want a x-large yeyamei sweater for women that is made of polyester cotton.", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "x-large" ] }, "asin": "B09MMKFCY8" }, { "task_id": "ws_B09QSC583Q_9348", "instruction": "i am looking for rose gold oral care copper tongue cleaner", "target_attributes": { "attributes": [ "rose gold" ], "options": [] }, "asin": "B09QSC583Q" }, { "task_id": "ws_B093YS5G3P_9349", "instruction": "iam looking for a wallets for blouse, hosiery and laundry bag", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YS5G3P" }, { "task_id": "ws_B01IAESWES_9350", "instruction": "i would like a argan oil hair treatment.", "target_attributes": { "attributes": [ "argan oil", "hair treatment" ], "options": [] }, "asin": "B01IAESWES" }, { "task_id": "ws_B09QPPL1V7_9351", "instruction": "i am interested in buying a black colored loose fitting medium sized workout pants mainly for gym workouts.", "target_attributes": { "attributes": [ "loose fit", "gym workout" ], "options": [ "black", "medium" ] }, "asin": "B09QPPL1V7" }, { "task_id": "ws_B01N7PB3L6_9352", "instruction": "i need milk chocolate covered peanut butter block", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [] }, "asin": "B01N7PB3L6" }, { "task_id": "ws_B08X9SG8VB_9353", "instruction": "i would like to buy a black colored box spring bed.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "black" ] }, "asin": "B08X9SG8VB" }, { "task_id": "ws_B06XS8KPBF_9354", "instruction": "i would like a white bed and nightstand with drawers that saves space.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "white", "bed + nightstand", "drawers" ] }, "asin": "B06XS8KPBF" }, { "task_id": "ws_B093YSPZHZ_9355", "instruction": "i am looking for a mesh laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSPZHZ" }, { "task_id": "ws_B09PMFB9LH_9356", "instruction": "i am looking for a freeze dried pear chips and should contain real fruit.", "target_attributes": { "attributes": [ "freeze dried", "real fruit" ], "options": [ "pear" ] }, "asin": "B09PMFB9LH" }, { "task_id": "ws_B09B7YP723_9357", "instruction": "i need a living room statue", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09B7YP723" }, { "task_id": "ws_B008M4S91S_9358", "instruction": "can i get a 2 light bath vanity lighting set with nickel finish?", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "2 light" ] }, "asin": "B008M4S91S" }, { "task_id": "ws_B00N49FECS_9359", "instruction": "i want indigo zac relaxed fit straight leg jeans.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "medium indigo ssk290" ] }, "asin": "B00N49FECS" }, { "task_id": "ws_B00N49FECS_9360", "instruction": "i am looking for a straight leg jeans in sandblast light color. also in 40w x 34l size.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "sandblast light", "40w x 34l" ] }, "asin": "B00N49FECS" }, { "task_id": "ws_B081DF9LK8_9361", "instruction": "i need a 64gb, high performance usb flash drive.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "64gb" ] }, "asin": "B081DF9LK8" }, { "task_id": "ws_B09MM3TBRJ_9362", "instruction": "i need a manual toothbrush for my sensitive teeth", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09MM3TBRJ" }, { "task_id": "ws_B0843HBRYC_9363", "instruction": "i am looking for a ivory color contemporary design area rugs", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "ivory" ] }, "asin": "B0843HBRYC" }, { "task_id": "ws_B093QF29VW_9364", "instruction": "i want a keto high protein snack gift basket.", "target_attributes": { "attributes": [ "high protein", "gift basket" ], "options": [] }, "asin": "B093QF29VW" }, { "task_id": "ws_B08157ZH8F_9365", "instruction": "i would like some rubber sole oxfords that are tan and a size 9", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "tan", "9" ] }, "asin": "B08157ZH8F" }, { "task_id": "ws_B095VSRVXW_9366", "instruction": "i'm looking for crystal roller massager with facial beauty massage stick.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "fenjinggunlunbaozhuanghe" ] }, "asin": "B095VSRVXW" }, { "task_id": "ws_B09CZ8BMHD_9367", "instruction": "i'm looking for a film screen protector with tempered glass for google pixel 6 pro.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B09CZ8BMHD" }, { "task_id": "ws_B07BPM9WNX_9368", "instruction": "i'm looking for an art print for my living room that's ready to hang. look for something with mountains in it that's twelve by sixteen inches.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "watercolor mountain geometric", "12x16inches*3pcs" ] }, "asin": "B07BPM9WNX" }, { "task_id": "ws_B09JZ9B53Z_9369", "instruction": "i'm need of a black dining chair with solid wood", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "black" ] }, "asin": "B09JZ9B53Z" }, { "task_id": "ws_B09NPKS6PC_9370", "instruction": "i am looking for hdmi adapter having usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B09NPKS6PC" }, { "task_id": "ws_B09PZ6LLJC_9371", "instruction": "i am looking for women's t-shirt of white color having short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "white" ] }, "asin": "B09PZ6LLJC" }, { "task_id": "ws_B09QS65811_9372", "instruction": "i am looking for multi10 color lamp for living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi10" ] }, "asin": "B09QS65811" }, { "task_id": "ws_B08RXZXTV4_9373", "instruction": "i am looking for golden blonde with highlights color hair extensions that are easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "golden blonde with highlights" ] }, "asin": "B08RXZXTV4" }, { "task_id": "ws_B08K2ZPQ6G_9374", "instruction": "i am looking for some easy to use holographic nail art.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B08K2ZPQ6G" }, { "task_id": "ws_B07LH2ZK7M_9375", "instruction": "looking for a long lasting ralph love women perfume", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B07LH2ZK7M" }, { "task_id": "ws_B09ND1LQB2_9376", "instruction": "i am looking for a twin size low loft bed with storage in grey.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "grey with slide, drawers" ] }, "asin": "B09ND1LQB2" }, { "task_id": "ws_B099WVM374_9377", "instruction": "i want a colourful makeup brush set for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B099WVM374" }, { "task_id": "ws_B09SFWYXGD_9378", "instruction": "i'm looking for a 2.0 32 gigabyte, guitar shaped memory drive that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "2.0 32gb" ] }, "asin": "B09SFWYXGD" }, { "task_id": "ws_B01CYVYKI0_9379", "instruction": "i'm looking for classic cut wig for women.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "rl32 | 31 cinnabar" ] }, "asin": "B01CYVYKI0" }, { "task_id": "ws_B09JPCLY25_9380", "instruction": "i'm looking for a kids toothbrush that's easy to use and not hard on the teeth. also, pick yellow", "target_attributes": { "attributes": [ "easy use", "sensitive teeth" ], "options": [ "yellow" ] }, "asin": "B09JPCLY25" }, { "task_id": "ws_B09SFYFZW5_9381", "instruction": "i am looking for high knee womens flat sandals of size 8.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "8" ] }, "asin": "B09SFYFZW5" }, { "task_id": "ws_B09PDQ1GP5_9382", "instruction": "i want to find a large pair of pink stretchy yoga shorts for teen girls.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "a2-pink", "large" ] }, "asin": "B09PDQ1GP5" }, { "task_id": "ws_B09PRPDH13_9383", "instruction": "i would like a white computer speaker with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "white" ] }, "asin": "B09PRPDH13" }, { "task_id": "ws_B095W1HB2Q_9384", "instruction": "i'm looking for a high quality cosmetic container to refill my lip gloss; please choose the rose gold color.", "target_attributes": { "attributes": [ "high quality", "rose gold" ], "options": [ "gold" ] }, "asin": "B095W1HB2Q" }, { "task_id": "ws_B089NYN7C7_9385", "instruction": "i am looking for a quick release plate for my camera made of aluminum alloy.", "target_attributes": { "attributes": [ "quick release" ], "options": [] }, "asin": "B089NYN7C7" }, { "task_id": "ws_B09SL5XJ54_9386", "instruction": "i am looking for a 9.5 size steel toe of sandals", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "9.5" ] }, "asin": "B09SL5XJ54" }, { "task_id": "ws_B075733YQZ_9387", "instruction": "i need lipstick that is long lasting and is the color of brick house", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "brick-house" ] }, "asin": "B075733YQZ" }, { "task_id": "ws_B09Q2SVGMX_9388", "instruction": "i am looking for bed cover table sheet sets for beauty salon also choose colour purple", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "purple" ] }, "asin": "B09Q2SVGMX" }, { "task_id": "ws_B09SL5KS15_9389", "instruction": "i would like a portable bluetooth speaker with stereo sound.", "target_attributes": { "attributes": [ "stereo sound", "wireless bluetooth" ], "options": [] }, "asin": "B09SL5KS15" }, { "task_id": "ws_B08T9J3G6B_9390", "instruction": "i am looking for easy assemble queen size metal bed frame", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "queen" ] }, "asin": "B08T9J3G6B" }, { "task_id": "ws_B09C42X8V1_9391", "instruction": "i am looking for a long lasting lip balm.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B09C42X8V1" }, { "task_id": "ws_B01A4B0N92_9392", "instruction": "i need a 2 oz hair growth treatment", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "2 fl oz" ] }, "asin": "B01A4B0N92" }, { "task_id": "ws_B09NW7CZXP_9393", "instruction": "i'm interested in buying a medium sized high waisted yoga sweatpants for daily wear.", "target_attributes": { "attributes": [ "high waist", "daily wear" ], "options": [ "medium" ] }, "asin": "B09NW7CZXP" }, { "task_id": "ws_B07692PMHF_9394", "instruction": "i'm looking for a high quality plant based vitamin c serum that contains hyaluronic acid and made of natural ingredients for treating dark circles and fine lines.", "target_attributes": { "attributes": [ "plant based", "high quality", "hyaluronic acid", "natural ingredients", "dark circles", "fine lines" ], "options": [] }, "asin": "B07692PMHF" }, { "task_id": "ws_B08FSNMMYR_9395", "instruction": "i would like a medium black long sleeved pullover.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a-black", "medium" ] }, "asin": "B08FSNMMYR" }, { "task_id": "ws_B09QXW6X8Z_9396", "instruction": "i am looking for a 16gb ram | 2tb nvme ssd size of intel core i5 towers", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "16gb ram | 2tb nvme ssd" ] }, "asin": "B09QXW6X8Z" }, { "task_id": "ws_B09QXW6X8Z_9397", "instruction": "i need to buy a desktop computer that's got an intel i5 core, 32 gigabytes of ram, and a one terabyte ssd.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [ "32gb ram | 1tb nvme ssd" ] }, "asin": "B09QXW6X8Z" }, { "task_id": "ws_B0893MSLT5_9398", "instruction": "i would like a style 7 chandelier with a pendant light.", "target_attributes": { "attributes": [ "pendant light" ], "options": [ "style 7" ] }, "asin": "B0893MSLT5" }, { "task_id": "ws_B08L136TVK_9399", "instruction": "i would like 12 bowls of peaches in strawberry gel gluten free applesauce.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "peaches in strawberry gel", "12 bowls" ] }, "asin": "B08L136TVK" }, { "task_id": "ws_B08N5CBMDM_9400", "instruction": "i would like a 8.6 ounce box of honey cereal that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "honey", "8.6 ounce (pack of 1)" ] }, "asin": "B08N5CBMDM" }, { "task_id": "ws_B09PCX8BJY_9401", "instruction": "i want a pair of size 7.4 red walking shoes with a anti slip material.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "a-red", "7.5" ] }, "asin": "B09PCX8BJY" }, { "task_id": "ws_B09D7NCLNK_9402", "instruction": "i'm looking for hair dressing scissors set.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [] }, "asin": "B09D7NCLNK" }, { "task_id": "ws_B08CXD2VHG_9403", "instruction": "i need a clip set hair extensions with stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "clip set" ] }, "asin": "B08CXD2VHG" }, { "task_id": "ws_B0995Z55M4_9404", "instruction": "i'm looking for mens peake 23 from fila.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "black | black | metallic silver" ] }, "asin": "B0995Z55M4" }, { "task_id": "ws_B00IWONE9U_9405", "instruction": "i am in need of some shelf stable tropical fruit", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "tropical fruit" ] }, "asin": "B00IWONE9U" }, { "task_id": "ws_B093THM3VQ_9406", "instruction": "i would like to buy easy to assemble storage baskets which has a lot of storage space.", "target_attributes": { "attributes": [ "easy assemble", "storage space" ], "options": [] }, "asin": "B093THM3VQ" }, { "task_id": "ws_B09J8RWJ4L_9407", "instruction": "i need a large sized coat with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B09J8RWJ4L" }, { "task_id": "ws_B06Y664VKD_9408", "instruction": "i need an easy to cary 128 gb flash drive", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "128gb" ] }, "asin": "B06Y664VKD" }, { "task_id": "ws_B071YBR54C_9409", "instruction": "i would like a magnifying glass intensive polish serum for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "magnifying glass intensive polish serum" ] }, "asin": "B071YBR54C" }, { "task_id": "ws_B09J2FZGVK_9410", "instruction": "i want an allewie queen bed frame that requires assembly.", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "queen" ] }, "asin": "B09J2FZGVK" }, { "task_id": "ws_B00M9NLJWO_9411", "instruction": "i'm looking for a low calories popcorn kernels with gluten free. also, choose a pack of 2 weighting 2 pounds one.", "target_attributes": { "attributes": [ "low calorie", "gluten free" ], "options": [ "2 pound (pack of 2)" ] }, "asin": "B00M9NLJWO" }, { "task_id": "ws_B09Q7VC6V9_9412", "instruction": "i would like to buy sandals for women which are eco friendly, and high quality, as for color they should be pink, and of size 6.5.", "target_attributes": { "attributes": [ "eco friendly", "high quality" ], "options": [ "pink", "6.5" ] }, "asin": "B09Q7VC6V9" }, { "task_id": "ws_B079JVZHSQ_9413", "instruction": "i would like a white foot file for dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "001-white" ] }, "asin": "B079JVZHSQ" }, { "task_id": "ws_B07FSKRLTL_9414", "instruction": "i am looking for black leather 7.5 size and day comfort winter snow boots for women", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "black-leather", "7.5" ] }, "asin": "B07FSKRLTL" }, { "task_id": "ws_B098RX8416_9415", "instruction": "i would like a pair of size 11 gold platform wedges with a ankle strap.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "z99-glod", "11.5" ] }, "asin": "B098RX8416" }, { "task_id": "ws_B07BFXH2DV_9416", "instruction": "i'm looking for a pair of non-slip women's wedge sneakers in pink sequin color and in size 4.5.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "pink sequin", "4.5" ] }, "asin": "B07BFXH2DV" }, { "task_id": "ws_B07S7HDC88_9417", "instruction": "i am looking for a pair of men's size 10.5 black loafers with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black1901", "10.5" ] }, "asin": "B07S7HDC88" }, { "task_id": "ws_B085PX3LCN_9418", "instruction": "i am looking for 32 pack of hyaluronic acid full face facial mask", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [ "32 pack" ] }, "asin": "B085PX3LCN" }, { "task_id": "ws_B095YXYZ33_9419", "instruction": "i'm looking for hollow vintage casual wedge ankle strap sandals for women.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "01-black" ] }, "asin": "B095YXYZ33" }, { "task_id": "ws_B08L5X8R15_9420", "instruction": "i would like a fresh and clean paraben free men's cologne.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "fresh and clean" ] }, "asin": "B08L5X8R15" }, { "task_id": "ws_B075DY1CZZ_9421", "instruction": "i am looking for a 16 inch size hair extension having synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "16 inch" ] }, "asin": "B075DY1CZZ" }, { "task_id": "ws_B07YLCWZF5_9422", "instruction": "i am looking for a queen sized mattress with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "queen (60\" x 80\")" ] }, "asin": "B07YLCWZF5" }, { "task_id": "ws_B09SGXQXRL_9423", "instruction": "i want brown women's open toe flats.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "brown" ] }, "asin": "B09SGXQXRL" }, { "task_id": "ws_B07B6JSBQ9_9424", "instruction": "i'm looking for a 2 pound jar of dark chocolate cream made of quality ingredients.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "dark chocolate", "2 pound (pack of 1)" ] }, "asin": "B07B6JSBQ9" }, { "task_id": "ws_B01GKAL67Y_9425", "instruction": "i'm looking for liqiud latex makeup.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "4.5 fl oz (pack of 1)" ] }, "asin": "B01GKAL67Y" }, { "task_id": "ws_B09NB7R15K_9426", "instruction": "i'm looking for a stainless steel patio furniture set in the color navy blue.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "navy blue" ] }, "asin": "B09NB7R15K" }, { "task_id": "ws_B09NB7R15K_9427", "instruction": "i want dark red and stainless steel asjmr outdoor patio furniture.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "dark red" ] }, "asin": "B09NB7R15K" }, { "task_id": "ws_B098J9LXGM_9428", "instruction": "i'm interested in a 4g lte wall-mounted router in aluminum alloy.", "target_attributes": { "attributes": [ "wall mounted", "aluminum alloy", "4g lte" ], "options": [] }, "asin": "B098J9LXGM" }, { "task_id": "ws_B095W1N4P1_9429", "instruction": "i would like a 38 mm pink applewatch band.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "black | pink | purple | wine red", "38mm | 40mm | 41mm" ] }, "asin": "B095W1N4P1" }, { "task_id": "ws_B098BQ962K_9430", "instruction": "i would like a flip flop travel bottles that are bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "flip top" ] }, "asin": "B098BQ962K" }, { "task_id": "ws_B09ND769CP_9431", "instruction": "i need a small sleep set that has an elastic waistband", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "small" ] }, "asin": "B09ND769CP" }, { "task_id": "ws_B09LYZW6P8_9432", "instruction": "i'm looking for a day and night roller blinds grey/white item.", "target_attributes": { "attributes": [ "white item" ], "options": [] }, "asin": "B09LYZW6P8" }, { "task_id": "ws_B09LYZW6P8_9433", "instruction": "i need to buy some purple blinds for my living room. find the ones that are 32 by 78 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "purple", "32\"w x 78\"h" ] }, "asin": "B09LYZW6P8" }, { "task_id": "ws_B092J9FHMG_9434", "instruction": "i want a dark black xfyele 20mm quick release watch band.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "dark black+china red" ] }, "asin": "B092J9FHMG" }, { "task_id": "ws_B0821HJC39_9435", "instruction": "i am looking for coffee colored sneakers that are steel toed and size 11.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "coffee", "11" ] }, "asin": "B0821HJC39" }, { "task_id": "ws_B07VCB9MS7_9436", "instruction": "i am looking for a solid wood super king sized bed with a contemporary style.", "target_attributes": { "attributes": [ "contemporary style", "solid wood" ], "options": [] }, "asin": "B07VCB9MS7" }, { "task_id": "ws_B08B1G6XBN_9437", "instruction": "i want to find a wooden table that i can put in my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "solid sheesham wood" ] }, "asin": "B08B1G6XBN" }, { "task_id": "ws_B09MR48WLK_9438", "instruction": "i want to find a gift set of coconut oil shower gels and lotions. the scent needs to be sunshine mimosa.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "sunshine mimosa" ] }, "asin": "B09MR48WLK" }, { "task_id": "ws_B09HTHVY7Z_9439", "instruction": "i would like a queen sized gray bed without a box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "grey+drawers", "queen" ] }, "asin": "B09HTHVY7Z" }, { "task_id": "ws_B00N2JN1L6_9440", "instruction": "i need a four ounce coconut oil for my hair", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "4 ounce" ] }, "asin": "B00N2JN1L6" }, { "task_id": "ws_B09J7YZLSN_9441", "instruction": "i'm looking for a cute mushroom fleece throw blanket for couch.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "frog and mushrooms" ] }, "asin": "B09J7YZLSN" }, { "task_id": "ws_B018X8C8P0_9442", "instruction": "i am looking for a sulfate free shampoo of size 8 ounce.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "8 ounce" ] }, "asin": "B018X8C8P0" }, { "task_id": "ws_B075QKJJSS_9443", "instruction": "i am looking for a men's jacket in down that comes fleece lined, and i would like it in green and standard size.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "green color block", "standard" ] }, "asin": "B075QKJJSS" }, { "task_id": "ws_B08L4WLKQG_9444", "instruction": "am hoping to find the heavy duty yaheetech console table with storage.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B08L4WLKQG" }, { "task_id": "ws_B08BDZQHVC_9445", "instruction": "i am looking for men's machine wash original fit jeans, 44w x 34l size", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "44w x 34l" ] }, "asin": "B08BDZQHVC" }, { "task_id": "ws_B07KD181B3_9446", "instruction": "i would like a aluminum tripod that is lightweight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "aluminum 7a" ] }, "asin": "B07KD181B3" }, { "task_id": "ws_B09J2K8K9H_9447", "instruction": "i would like a red phone heavy duty case.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "red" ] }, "asin": "B09J2K8K9H" }, { "task_id": "ws_B08B88XXYJ_9448", "instruction": "where can i find a pink stereo sound bluetooth speaker, portable? it has to be 360\u00b0 voice commands, i was told the hjwl brand. if the price is good i will buy it.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "pink" ] }, "asin": "B08B88XXYJ" }, { "task_id": "ws_B009SE5LBW_9449", "instruction": "i'm interested in high protein salt n' vinegar almonds in a resealable bag.", "target_attributes": { "attributes": [ "high protein", "resealable bag" ], "options": [ "salt n' vinegar" ] }, "asin": "B009SE5LBW" }, { "task_id": "ws_B09PRLWKM1_9450", "instruction": "hello, i'm looking for a tuxedo suit that's slim fit and good for winter? size small, please", "target_attributes": { "attributes": [ "slim fit", "winter warm", "long sleeve" ], "options": [ "small" ] }, "asin": "B09PRLWKM1" }, { "task_id": "ws_B09KLS44DG_9451", "instruction": "i am looking for a high resolution background of size 9x6ftpolyester.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "9x6ftpolyester" ] }, "asin": "B09KLS44DG" }, { "task_id": "ws_B093KXP9WB_9452", "instruction": "i am interested in buying a bag which is a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093KXP9WB" }, { "task_id": "ws_B0834W3CG9_9453", "instruction": "i am looking for a 2 layer small bookshelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "two layers" ] }, "asin": "B0834W3CG9" }, { "task_id": "ws_B08K4LMJNM_9454", "instruction": "find official licensed harry potter t-shirts", "target_attributes": { "attributes": [ "officially licensed" ], "options": [] }, "asin": "B08K4LMJNM" }, { "task_id": "ws_B089GMNRBD_9455", "instruction": "i am looking for transparent color kitchen drawer mats that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "transparent" ] }, "asin": "B089GMNRBD" }, { "task_id": "ws_B07F7HWDXZ_9456", "instruction": "i'm looking for a high performance desktop computer with intel core processor.", "target_attributes": { "attributes": [ "high performance", "intel core" ], "options": [] }, "asin": "B07F7HWDXZ" }, { "task_id": "ws_B08P4GMWJB_9457", "instruction": "i'm locking for a open shelves high gloss entertainment center media console.", "target_attributes": { "attributes": [ "high gloss" ], "options": [] }, "asin": "B08P4GMWJB" }, { "task_id": "ws_B00IIU9ELA_9458", "instruction": "i'm looking for a desktop pc with an intel core i5 processor.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B00IIU9ELA" }, { "task_id": "ws_B09D7PKHVD_9459", "instruction": "i am looking for maple leaflop9363 color place mats that are eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "maple leaflop9363" ] }, "asin": "B09D7PKHVD" }, { "task_id": "ws_B09NMDK42T_9460", "instruction": "i'm looking for a window film for a dining room that is 23.6 inch wide and 35.4 inch in length in size. choose the ones that comes in the 964074833593106000 color.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "964074833593106000", "(width\uff0923.6in x (length)35.4in x 2pcs" ] }, "asin": "B09NMDK42T" }, { "task_id": "ws_B09RHTPG2S_9461", "instruction": "i need a yoga shirt that is a loose fit and dark blue", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "fupo-a193-dark blue" ] }, "asin": "B09RHTPG2S" }, { "task_id": "ws_B08Z82R1HH_9462", "instruction": "i am looking for high definition orange color 10.8 inch android 9.0 tablet of quad-core processor,6000mah battery etc", "target_attributes": { "attributes": [ "high definition", "quad core" ], "options": [ "orange" ] }, "asin": "B08Z82R1HH" }, { "task_id": "ws_B093YSMHJ3_9463", "instruction": "i am looking for a set of 2 mesh laundry bags", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSMHJ3" }, { "task_id": "ws_B00MHTDV26_9464", "instruction": "i am looking for 6 nut free plant based raspberry snack bars.", "target_attributes": { "attributes": [ "nut free", "plant based" ], "options": [ "raspberry", "6 count (pack of 6)" ] }, "asin": "B00MHTDV26" }, { "task_id": "ws_B00MHTDV26_9465", "instruction": "i am looking for a 6 count (pack of 6) real fruit, non-gmo fruit bars", "target_attributes": { "attributes": [ "non gmo", "real fruit" ], "options": [ "6 count (pack of 6)" ] }, "asin": "B00MHTDV26" }, { "task_id": "ws_B075FYF6L5_9466", "instruction": "i am looking for some ready to eat gluten free red hot spice curry sauce.", "target_attributes": { "attributes": [ "ready eat", "gluten free" ], "options": [ "red - hot spice" ] }, "asin": "B075FYF6L5" }, { "task_id": "ws_B09PVGMDKW_9467", "instruction": "i want to buy t-shirts which are long sleeved and are in red color, while the size should be large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "8#red", "large" ] }, "asin": "B09PVGMDKW" }, { "task_id": "ws_B08QG2T2LX_9468", "instruction": "i need some gluten free popped cheddar cheese snacks", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "cheddar-cheese" ] }, "asin": "B08QG2T2LX" }, { "task_id": "ws_B08T78Q22X_9469", "instruction": "i am looking for an ac 220v electric chain hoist crane overhead remote control that is dust proof.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "ac 220v" ] }, "asin": "B08T78Q22X" }, { "task_id": "ws_B0006V7Y8Y_9470", "instruction": "i am looking for 1 pack of 1.7 ounce ,anti-perspirant stick for women", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "1.7 ounce (pack of 1)" ] }, "asin": "B0006V7Y8Y" }, { "task_id": "ws_B09QXS3MHQ_9471", "instruction": "i want a 32gig blue cell phone that's 4g lte.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "blue", "32gb" ] }, "asin": "B09QXS3MHQ" }, { "task_id": "ws_B07YLB9QVP_9472", "instruction": "i am looking for a short queen (60\" x 74\") size memory foam", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "short queen (60\" x 74\")" ] }, "asin": "B07YLB9QVP" }, { "task_id": "ws_B09Q5GDSDH_9473", "instruction": "i am looking for a brown colored, large size, loose fit blouse for women.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "brown", "large" ] }, "asin": "B09Q5GDSDH" }, { "task_id": "ws_B084BVBT6D_9474", "instruction": "i want boy elephant sprinkles for baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B084BVBT6D" }, { "task_id": "ws_B08HT29Y72_9475", "instruction": "i am interested in buying a tablet with a quad core processor and a usb port.", "target_attributes": { "attributes": [ "quad core", "usb port" ], "options": [] }, "asin": "B08HT29Y72" }, { "task_id": "ws_B01MDPBUWN_9476", "instruction": "i am looking for a pair of sky blue curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "sky blue" ] }, "asin": "B01MDPBUWN" }, { "task_id": "ws_B07FTVF6XH_9477", "instruction": "i'm looking for a set of two electric wall sconces that are hand painted with a bronze finish.", "target_attributes": { "attributes": [ "hand painted", "bronze finish" ], "options": [ "set of 2" ] }, "asin": "B07FTVF6XH" }, { "task_id": "ws_B07FTVF6XH_9478", "instruction": "i need a vanity light fixture that is a set of 2", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "set of 2" ] }, "asin": "B07FTVF6XH" }, { "task_id": "ws_B094F9S82W_9479", "instruction": "i am looking for a sectional with ottoman l-shaped couch that can seat 5 people, and i would like it to be appropriate for the living room and come in light grey.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light grey d" ] }, "asin": "B094F9S82W" }, { "task_id": "ws_B08ZJJKHLL_9480", "instruction": "i'm looking for a golden dinosaur cake toppers for a birthday cake", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "golden 2" ] }, "asin": "B08ZJJKHLL" }, { "task_id": "ws_B08V919YGT_9481", "instruction": "i would like a red cupcake topper for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "red" ] }, "asin": "B08V919YGT" }, { "task_id": "ws_B09PND7S3Q_9482", "instruction": "single color short sleeve polo shirt", "target_attributes": { "attributes": [ "short sleeve" ], "options": [] }, "asin": "B09PND7S3Q" }, { "task_id": "ws_B08DGY46T3_9483", "instruction": "i want unscented maxim sensitive antiperspirant towelettes.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "unscented" ] }, "asin": "B08DGY46T3" }, { "task_id": "ws_B08DGY46T3_9484", "instruction": "i need an unscented anti perspirant", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "unscented" ] }, "asin": "B08DGY46T3" }, { "task_id": "ws_B07S3RVHGT_9485", "instruction": "i would like a 10 by 18 foot photo backdrop that is light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "10x8ft" ] }, "asin": "B07S3RVHGT" }, { "task_id": "ws_B08Z73J42G_9486", "instruction": "i want to find men's black and white walking shoes that feature memory foam. they should be leather and i need them in a size 12.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black | white 2", "leather", "12" ] }, "asin": "B08Z73J42G" }, { "task_id": "ws_B07BNBYWL8_9487", "instruction": "i am looking for a black light weight carbon fiber round keychain.", "target_attributes": { "attributes": [ "light weight", "carbon fiber" ], "options": [ "black - round keychain" ] }, "asin": "B07BNBYWL8" }, { "task_id": "ws_B08GCNBFX1_9488", "instruction": "i am looking for a hair salon capacity spray bottle.", "target_attributes": { "attributes": [ "hair salon" ], "options": [] }, "asin": "B08GCNBFX1" }, { "task_id": "ws_B08R7FT3MX_9489", "instruction": "i would like a small leopard blue blouse that is hand washable.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "leopard blue", "small" ] }, "asin": "B08R7FT3MX" }, { "task_id": "ws_B09D8SWV19_9490", "instruction": "can you look it up on amazon? erika's tea room february birthday scone & gift box - unique english style scones, april color, will make the perfect gift.", "target_attributes": { "attributes": [ "low sodium", "perfect gift" ], "options": [ "april" ] }, "asin": "B09D8SWV19" }, { "task_id": "ws_B08PKQCZ7W_9491", "instruction": "i'm looking for a black tablet with 64gb and a high resolution", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "black", "64gb" ] }, "asin": "B08PKQCZ7W" }, { "task_id": "ws_B08K3SW37R_9492", "instruction": "i'm looking for a small form factor business pc.", "target_attributes": { "attributes": [ "core i5", "quad core" ], "options": [] }, "asin": "B08K3SW37R" }, { "task_id": "ws_B08FFBX4PP_9493", "instruction": "i would like a two pack of high quality shower caps", "target_attributes": { "attributes": [ "high quality" ], "options": [ "clear (2-pack)" ] }, "asin": "B08FFBX4PP" }, { "task_id": "ws_B00J8Y6ZBW_9494", "instruction": "i would like a 5 pound bag of kosher certified crackers.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "5 pound" ] }, "asin": "B00J8Y6ZBW" }, { "task_id": "ws_B08PXW966C_9495", "instruction": "i need hight quality portable golden wing color travel personal mirror for woman", "target_attributes": { "attributes": [ "high quality" ], "options": [ "golden wing" ] }, "asin": "B08PXW966C" }, { "task_id": "ws_B07FP4X1NX_9496", "instruction": "i am interested in buying a long sleeved xx-large sized sweater which is suitable for both men and women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "xx-large" ] }, "asin": "B07FP4X1NX" }, { "task_id": "ws_B07K3DBFX7_9497", "instruction": "i'm looking for nourison jubilant floral pink area rug.", "target_attributes": { "attributes": [ "living room" ], "options": [ "ivory | pink" ] }, "asin": "B07K3DBFX7" }, { "task_id": "ws_B08KHXYDKC_9498", "instruction": "i need plant-based ground beef patties", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B08KHXYDKC" }, { "task_id": "ws_B00O5ZSEMC_9499", "instruction": "i would like a travel size dark brown hair treatment.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "dark brown" ] }, "asin": "B00O5ZSEMC" }, { "task_id": "ws_B08BFL71VZ_9500", "instruction": "i am looking for a pair of men's dark stonewash levi's 501 jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "dark stonewash" ] }, "asin": "B08BFL71VZ" }, { "task_id": "ws_B0876G2J22_9501", "instruction": "looking for moisturizing and nourishing cream with multi-vitamin anti-crack foot with argan oil", "target_attributes": { "attributes": [ "argan oil" ], "options": [ "multi-vitamin anti-crack foot with argan oil" ] }, "asin": "B0876G2J22" }, { "task_id": "ws_B07VSNP9RZ_9502", "instruction": "i am looking for black color high definition bluetooth speakers.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "black" ] }, "asin": "B07VSNP9RZ" }, { "task_id": "ws_B08DHK9G5X_9503", "instruction": "i'm looking for cloths towel for exfoliating in sensitive skin, in size 11.81 x 11.81\" with gray edge color", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "11.81 x 11.8 inch", "gray edge" ] }, "asin": "B08DHK9G5X" }, { "task_id": "ws_B09K74T4LZ_9504", "instruction": "i'm in love with women's mid-calf boots, i want to find one of non-slip vintage embroidered thick heels, size: 9 wide, help me in this mission", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "9 wide" ] }, "asin": "B09K74T4LZ" }, { "task_id": "ws_B08ZG6MNDT_9505", "instruction": "i want gluten free faris gourmet popcorn.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B08ZG6MNDT" }, { "task_id": "ws_B09PG8PQKY_9506", "instruction": "i am interested in knee high shoes that are black", "target_attributes": { "attributes": [ "knee high" ], "options": [ "black" ] }, "asin": "B09PG8PQKY" }, { "task_id": "ws_B001EJNMR4_9507", "instruction": "i would like a pair of size 5.5 stone birko sandals with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "stone birko-flor pull up", "5-5.5" ] }, "asin": "B001EJNMR4" }, { "task_id": "ws_B09FDPMSB4_9508", "instruction": "i am looking for a heavy duty red case for a galaxy s21 fe that is easy to install.", "target_attributes": { "attributes": [ "heavy duty", "easy install" ], "options": [ "red" ] }, "asin": "B09FDPMSB4" }, { "task_id": "ws_B09R7MX43S_9509", "instruction": "i am looking for black color long sleeve bodysuit for women.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black" ] }, "asin": "B09R7MX43S" }, { "task_id": "ws_B00YCT1C70_9510", "instruction": "i would like a king sized black faux leather bed.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "black", "king" ] }, "asin": "B00YCT1C70" }, { "task_id": "ws_B09MR5ZD7L_9511", "instruction": "i'm looking for a desktop mini computer with quad core and 8 gb of ram.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "8gb ddr4 ram, 1tb hdd" ] }, "asin": "B09MR5ZD7L" }, { "task_id": "ws_B09KXTC3FC_9512", "instruction": "i'm looking for wireless bluetooth speaker for home.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B09KXTC3FC" }, { "task_id": "ws_B07Y3ZBB1C_9513", "instruction": "i need 1080p wireless security camera with motion detection and cloud storage support", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B07Y3ZBB1C" }, { "task_id": "ws_B096NYPRXP_9514", "instruction": "i would like a black purple car charger with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black purple" ] }, "asin": "B096NYPRXP" }, { "task_id": "ws_B08TZJKJH4_9515", "instruction": "i am looking for a high performance power amplifier", "target_attributes": { "attributes": [ "power amplifier", "high performance" ], "options": [] }, "asin": "B08TZJKJH4" }, { "task_id": "ws_B00VREDHM6_9516", "instruction": "i'm looking for a leather slingback flat sandal.", "target_attributes": { "attributes": [ "leather sole" ], "options": [] }, "asin": "B00VREDHM6" }, { "task_id": "ws_B08RDDNJR2_9517", "instruction": "looking for light weight long cord headphones for tv choose colour 3-blue+red", "target_attributes": { "attributes": [ "light weight" ], "options": [ "3-blue+red" ] }, "asin": "B08RDDNJR2" }, { "task_id": "ws_B00VVRVPNM_9518", "instruction": "i need a four seater sofa set in contemporary style. pick something in brown white color.", "target_attributes": { "attributes": [ "contemporary style" ], "options": [ "brown white", "seating for four - table" ] }, "asin": "B00VVRVPNM" }, { "task_id": "ws_B07FPJHPX1_9519", "instruction": "i would like a 12 count of assorted paraben free face mask.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "assorted 12 pack", "12 count (pack of 4)" ] }, "asin": "B07FPJHPX1" }, { "task_id": "ws_B0052QL4WA_9520", "instruction": "i would like a great snack gift basket.", "target_attributes": { "attributes": [ "gift basket", "great gift" ], "options": [] }, "asin": "B0052QL4WA" }, { "task_id": "ws_B08JQ4QG5B_9521", "instruction": "i am looking for some long lasting easy to carry eyeshadow.", "target_attributes": { "attributes": [ "long lasting", "easy carry" ], "options": [] }, "asin": "B08JQ4QG5B" }, { "task_id": "ws_B08RDG6S4N_9522", "instruction": "i am looking for a pair of grey faux leather mid century dining chairs.", "target_attributes": { "attributes": [ "mid century", "faux leather" ], "options": [ "grey" ] }, "asin": "B08RDG6S4N" }, { "task_id": "ws_B09MQDZKPL_9523", "instruction": "i am looking for a black samsung galaxy s20 fe case with tempered glass.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [ "black" ] }, "asin": "B09MQDZKPL" }, { "task_id": "ws_B00JV4M9AA_9524", "instruction": "i want a hair care product that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B00JV4M9AA" }, { "task_id": "ws_B07R8XNR81_9525", "instruction": "i am looking for x-large short white color running gym workout fitness shorts", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "owine red | white", "x-large short" ] }, "asin": "B07R8XNR81" }, { "task_id": "ws_B09PMG75M5_9526", "instruction": "i'm looking for tattoo numbing cream with natural ingredients", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B09PMG75M5" }, { "task_id": "ws_B0892NQ4QP_9527", "instruction": "i want individually wrapped lemon bar cookies.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "lemon bar" ] }, "asin": "B0892NQ4QP" }, { "task_id": "ws_B07ML9TMTT_9528", "instruction": "i would like some non gmo pretzels that are 10 ounces", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "10 ounce (pack of 1)" ] }, "asin": "B07ML9TMTT" }, { "task_id": "ws_B08JVL3JZS_9529", "instruction": "i need brown color, 10 size ethylene vinyl arizona sandal", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "brown" ] }, "asin": "B08JVL3JZS" }, { "task_id": "ws_B08JVL3JZS_9530", "instruction": "i want a pair of ethylene vinyl birkenstock arizona sandals in size 9.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "9" ] }, "asin": "B08JVL3JZS" }, { "task_id": "ws_B08JVL3JZS_9531", "instruction": "i need to find a unisex sandal that\u2019s made with vinyl acetate; i am a size 11 australian.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "11 au" ] }, "asin": "B08JVL3JZS" }, { "task_id": "ws_B07X9Y42VX_9532", "instruction": "i am looking for hair straighteners of color surfing blue&misty mauve that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "surfing blue&misty mauve" ] }, "asin": "B07X9Y42VX" }, { "task_id": "ws_B07L5ZXML8_9533", "instruction": "i would like a gluten free pancake mix.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07L5ZXML8" }, { "task_id": "ws_B07KBX1FBN_9534", "instruction": "i would like a long sleeved blue blouse that is xx-large", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue", "xx-large" ] }, "asin": "B07KBX1FBN" }, { "task_id": "ws_B086QS1S5X_9535", "instruction": "i would like a 13 inch 512 gig intel core i7 tablet.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "512gb", "i7 | 16gb", "13\"" ] }, "asin": "B086QS1S5X" }, { "task_id": "ws_B07DQH5YXZ_9536", "instruction": "i am looking for a conditioner color shower cream that is sulphate free.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "conditioner" ] }, "asin": "B07DQH5YXZ" }, { "task_id": "ws_B09LHC2Z4V_9537", "instruction": "i am looking for a chandeliers for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [] }, "asin": "B09LHC2Z4V" }, { "task_id": "ws_B08FQFQJN7_9538", "instruction": "hello, i am looking for hair dye that will stay in my hair permanently. also, i want the color to be mahogany blonde", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "7m | 7.5 mahogany blonde" ] }, "asin": "B08FQFQJN7" }, { "task_id": "ws_B07ZCD2JTH_9539", "instruction": "i am looking for individually wrapped, chocolate toffee candy bars in a 24 pack.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "chocolate", "24 count (pack of 1)" ] }, "asin": "B07ZCD2JTH" }, { "task_id": "ws_B09MM89KMB_9540", "instruction": "i want a blue children\u2019s u-shape toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "2-6 years -blue" ] }, "asin": "B09MM89KMB" }, { "task_id": "ws_B071SF272N_9541", "instruction": "i am looking for throw pillow covers of taupe orange colors that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "taupe orange" ] }, "asin": "B071SF272N" }, { "task_id": "ws_B09FSS3YXJ_9542", "instruction": "i am interested in buying hoodies which can be machine washed, and are of color 2, and of small size.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "2", "small" ] }, "asin": "B09FSS3YXJ" }, { "task_id": "ws_B09PX62ZJN_9543", "instruction": "i would like a long lasting makeup set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B09PX62ZJN" }, { "task_id": "ws_B07KPGF8DD_9544", "instruction": "i'm looking for 2-piece lounge set for women.", "target_attributes": { "attributes": [ "long sleeve", "everyday wear" ], "options": [ "dark heather charcoal" ] }, "asin": "B07KPGF8DD" }, { "task_id": "ws_B089RBK4Q4_9545", "instruction": "i am interested in buying a zero sugar gluten free freezer pops.", "target_attributes": { "attributes": [ "gluten free", "zero sugar" ], "options": [ "zero sugar" ] }, "asin": "B089RBK4Q4" }, { "task_id": "ws_B08TZW46HS_9546", "instruction": "help me find a high performance power amplifier to use with my ho n e theater and is3 in 1", "target_attributes": { "attributes": [ "power amplifier", "high performance" ], "options": [] }, "asin": "B08TZW46HS" }, { "task_id": "ws_B07R449NTD_9547", "instruction": "i want to find individually wrapped, 2-ounce packs of omega-3 mix in a 14-count box.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "omega-3 mix", "2 ounce (pack of 14)" ] }, "asin": "B07R449NTD" }, { "task_id": "ws_B09MZCWLH7_9548", "instruction": "i am looking for cruelty free lip balm lip scrub (color c)", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "c" ] }, "asin": "B09MZCWLH7" }, { "task_id": "ws_B0000ZFRD0_9549", "instruction": "i am searching for hand wash women's top sandalfoot pantyhose, size e-f", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "e-f" ] }, "asin": "B0000ZFRD0" }, { "task_id": "ws_B087LYGR5T_9550", "instruction": "i would like a brown two piece living room set made of faux leather.", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "brown two-piece set" ] }, "asin": "B087LYGR5T" }, { "task_id": "ws_B07KQ3QJ4Y_9551", "instruction": "i'm looking for blue, heart shaped cupcake toppers for my sister's baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "blue1 heart" ] }, "asin": "B07KQ3QJ4Y" }, { "task_id": "ws_B0999L6J9X_9552", "instruction": "i am looking for gray men's casual sweatpants that are machine washable with an elastic waist.", "target_attributes": { "attributes": [ "machine wash", "elastic waist" ], "options": [ "gray" ] }, "asin": "B0999L6J9X" }, { "task_id": "ws_B08ZRBTHNL_9553", "instruction": "i am looking for a black crypto currency themed tank top in size large that has a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "large" ] }, "asin": "B08ZRBTHNL" }, { "task_id": "ws_B09D3JRJ7J_9554", "instruction": "i'm looking for a men's long sleeve shirt with button closure. choose the ones that come in the color c-green and size medium.", "target_attributes": { "attributes": [ "long sleeve", "button closure" ], "options": [ "c-green", "medium" ] }, "asin": "B09D3JRJ7J" }, { "task_id": "ws_B0886D1X9X_9555", "instruction": "i would like a office chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [] }, "asin": "B0886D1X9X" }, { "task_id": "ws_B08PKDM93D_9556", "instruction": "i am looking for a bronze colored wall mounted led sconce for my living room.", "target_attributes": { "attributes": [ "wall mounted", "living room" ], "options": [ "bronze" ] }, "asin": "B08PKDM93D" }, { "task_id": "ws_B09P17BXXW_9557", "instruction": "i need some xx-large boxer briefs that is also low rise.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "xx-large" ] }, "asin": "B09P17BXXW" }, { "task_id": "ws_B01N24TT0B_9558", "instruction": "i want a serum made from hyaluronic acid.", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [] }, "asin": "B01N24TT0B" }, { "task_id": "ws_B092D6861L_9559", "instruction": "i am looking for an easy to clean and easy to carry cosmetic bag.", "target_attributes": { "attributes": [ "easy carry", "easy clean" ], "options": [] }, "asin": "B092D6861L" }, { "task_id": "ws_B000F9ZG9Q_9560", "instruction": "i would like a pair of size 5.5 blue walking shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "blue 400", "5.5" ] }, "asin": "B000F9ZG9Q" }, { "task_id": "ws_B07CGYBVT7_9561", "instruction": "i need 5.1 ounce rosemary roasted gluten free garlic seasoning, (pack of 1)", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07CGYBVT7" }, { "task_id": "ws_B00DQH3LP0_9562", "instruction": "i'm looking for long lasting intense eye liner.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "voyage" ] }, "asin": "B00DQH3LP0" }, { "task_id": "ws_B0812L17DV_9563", "instruction": "i am looking for 12 size regular fit running shoe.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "12" ] }, "asin": "B0812L17DV" }, { "task_id": "ws_B09CDSR86M_9564", "instruction": "i want open toe umiyi sandals for women in size 9.5.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "9.5-10" ] }, "asin": "B09CDSR86M" }, { "task_id": "ws_B09T1NQN6P_9565", "instruction": "i'm looking for the perfect gift basket: it's a s'mores bark snack that contains no dairy.", "target_attributes": { "attributes": [ "dairy free", "perfect gift", "gift basket" ], "options": [ "s'mores bark snack" ] }, "asin": "B09T1NQN6P" }, { "task_id": "ws_B09T1NQN6P_9566", "instruction": "i'm looking for a gift basket that has chocolate candy and also offers a peanut chew platter.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "peanut chew platter" ] }, "asin": "B09T1NQN6P" }, { "task_id": "ws_B08RP6V5KZ_9567", "instruction": "i would like a 20 inch dark brown mix light auburn hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark brown mix light auburn - straight", "20\"" ] }, "asin": "B08RP6V5KZ" }, { "task_id": "ws_B07SDJB826_9568", "instruction": "i need a fully assembled queen sized mattress set", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "queen" ] }, "asin": "B07SDJB826" }, { "task_id": "ws_B098NLYXLK_9569", "instruction": "i want a mandala blanket throw fleece blanket for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "mandala" ] }, "asin": "B098NLYXLK" }, { "task_id": "ws_B07S2FB9TV_9570", "instruction": "i am looking for some nut free red velvet with cream cheese cupcakes in a jar.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "red velvet with cream cheese" ] }, "asin": "B07S2FB9TV" }, { "task_id": "ws_B096NQYLLV_9571", "instruction": "i am looking for cognac colored combat boots with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "cognac" ] }, "asin": "B096NQYLLV" }, { "task_id": "ws_B0843N9YKW_9572", "instruction": "i am looking for a high quality teal colored compact mirror.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "teal" ] }, "asin": "B0843N9YKW" }, { "task_id": "ws_B073V4382Z_9573", "instruction": "i would like a pair of 33 wide by 32 long standard signature medium indigo jeans with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "signature medium indigo-waterless", "standard", "33w x 32l" ] }, "asin": "B073V4382Z" }, { "task_id": "ws_B08L81FYLV_9574", "instruction": "i need a pack of 5, 4 inch bowls for mixing my facial masks, and it must be easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "4 inch (pack of 5)" ] }, "asin": "B08L81FYLV" }, { "task_id": "ws_B01IA9B8V2_9575", "instruction": "search for antiperspirant deodorant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B01IA9B8V2" }, { "task_id": "ws_B01IA9B8V2_9576", "instruction": "i would like a anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B01IA9B8V2" }, { "task_id": "ws_B08FT51FFD_9577", "instruction": "i would like to buy eyebrow gel which is long lasting, and is of black color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "black" ] }, "asin": "B08FT51FFD" }, { "task_id": "ws_B001333EN8_9578", "instruction": "i am looking for high quality eau de parfum for women", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B001333EN8" }, { "task_id": "ws_B0852X4S6J_9579", "instruction": "i need a high density area rug that is white", "target_attributes": { "attributes": [ "high density" ], "options": [ "white" ] }, "asin": "B0852X4S6J" }, { "task_id": "ws_B09B5GD54B_9580", "instruction": "i would like a four pack of fully cooked chicken.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "4 pack" ] }, "asin": "B09B5GD54B" }, { "task_id": "ws_B088LW4JKR_9581", "instruction": "i'm looking for wireless bluetooth 5.0 earbuds.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "pink" ] }, "asin": "B088LW4JKR" }, { "task_id": "ws_B09QCPGNK2_9582", "instruction": "am trying to find the long sleeve of zefotim womens summer tops, g-white color.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "g-white" ] }, "asin": "B09QCPGNK2" }, { "task_id": "ws_B08428CDPD_9583", "instruction": "i am looking for a chestnut colored synthetic hair wig.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "chestnut" ] }, "asin": "B08428CDPD" }, { "task_id": "ws_B07S1K8FNT_9584", "instruction": "i'm looking for a high quality anti-aging skincare kit for my dark circles and fine lines.", "target_attributes": { "attributes": [ "anti aging", "high quality", "dark circles", "fine lines" ], "options": [] }, "asin": "B07S1K8FNT" }, { "task_id": "ws_B07Y8VWSBY_9585", "instruction": "i'm looking for soft high waisted leggings for women.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "one size plus" ] }, "asin": "B07Y8VWSBY" }, { "task_id": "ws_B09MFZMHVP_9586", "instruction": "i would like a pair of size 7.5 clogs that are slip resistant.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "pewter", "7.5-8" ] }, "asin": "B09MFZMHVP" }, { "task_id": "ws_B08CKG1M5V_9587", "instruction": "i'm looking for a bathroom mirror that can be wall mounted and is 60 cm in size.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "60cm" ] }, "asin": "B08CKG1M5V" }, { "task_id": "ws_B09P7LNSLD_9588", "instruction": "i am interested in buying baseball t-shirts which can be machine washed and are classic fit, while the color should be either navy or white, and i am interested for a medium size for women.", "target_attributes": { "attributes": [ "machine wash", "classic fit" ], "options": [ "navy | white", "women", "medium" ] }, "asin": "B09P7LNSLD" }, { "task_id": "ws_B09BHMPRLT_9589", "instruction": "i need a easy to clean hair extension.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09BHMPRLT" }, { "task_id": "ws_B003H7YHUW_9590", "instruction": "i am interested in sardine lemon flavored wild caught sardines which are gluten free.", "target_attributes": { "attributes": [ "wild caught", "gluten free" ], "options": [ "sardines lemon" ] }, "asin": "B003H7YHUW" }, { "task_id": "ws_B0897B2295_9591", "instruction": "i am looking for containers for shampoo of color style 7-40ml that are easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "style 7-40ml" ] }, "asin": "B0897B2295" }, { "task_id": "ws_B083Q4DFLY_9592", "instruction": "i want an american flag aomike flannel fleece throw blanket.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "american flagaoe9847" ] }, "asin": "B083Q4DFLY" }, { "task_id": "ws_B09SCX7TBD_9593", "instruction": "i want a 1080p hd camera.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B09SCX7TBD" }, { "task_id": "ws_B083W82VBW_9594", "instruction": "what do you think of this mtfy tall bedside table with drawer and storage that you recommend? i want two in black if it's good quality. i await your reply .", "target_attributes": { "attributes": [ "storage space" ], "options": [ "2pcs black" ] }, "asin": "B083W82VBW" }, { "task_id": "ws_B08QZ4FHHN_9595", "instruction": "i need one living room table", "target_attributes": { "attributes": [ "living room" ], "options": [ "1 pack" ] }, "asin": "B08QZ4FHHN" }, { "task_id": "ws_B09RHS8FZ9_9596", "instruction": "i am looking for a men's long sleeve button down light blue shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "light blue" ] }, "asin": "B09RHS8FZ9" }, { "task_id": "ws_B00GTQ0TL4_9597", "instruction": "i am looking for bronze finish chandelier for my living room.", "target_attributes": { "attributes": [ "bronze finish", "living room" ], "options": [] }, "asin": "B00GTQ0TL4" }, { "task_id": "ws_B000VK9YA6_9598", "instruction": "i am interested in buying pumpkin seeds which are gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B000VK9YA6" }, { "task_id": "ws_B01DM76GFK_9599", "instruction": "i would like a solid wood sideboard.", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B01DM76GFK" }, { "task_id": "ws_B08B3ML761_9600", "instruction": "i want an apple punch highly pigmented lip tint.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "002 apple punch" ] }, "asin": "B08B3ML761" }, { "task_id": "ws_B081T7ZCYM_9601", "instruction": "i am looking for yellow and flat ankle booties for women for daily wear, and i would like them to come in size 8.5.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "z4-yellow", "8.5" ] }, "asin": "B081T7ZCYM" }, { "task_id": "ws_B09166MBRR_9602", "instruction": "i want a tv stand made from solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B09166MBRR" }, { "task_id": "ws_B098BD9PSC_9603", "instruction": "i am looking for a snacks gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B098BD9PSC" }, { "task_id": "ws_B01NAYE128_9604", "instruction": "i need oil free 8 ounce walnut body scrub", "target_attributes": { "attributes": [ "oil free" ], "options": [ "8 ounce" ] }, "asin": "B01NAYE128" }, { "task_id": "ws_B09BK2WGGX_9605", "instruction": "i am looking for heavy duty folding table of black granite color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black granite" ] }, "asin": "B09BK2WGGX" }, { "task_id": "ws_B07B52CD3W_9606", "instruction": "i want an orange spencer modern contemporary table lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "robust orange" ] }, "asin": "B07B52CD3W" }, { "task_id": "ws_B07JBP3151_9607", "instruction": "i need grass fed protein bars that are banana flavored", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "banana bread" ] }, "asin": "B07JBP3151" }, { "task_id": "ws_B08TX2CWCP_9608", "instruction": "i want a light weight 6x9 ft octopus vinyl photography backdrop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "6x9 ft" ] }, "asin": "B08TX2CWCP" }, { "task_id": "ws_B07NYSLGR9_9609", "instruction": "i am looking for a wall art of size 40x20 for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "40x20" ] }, "asin": "B07NYSLGR9" }, { "task_id": "ws_B09BTN8F47_9610", "instruction": "i need a height adjustable full sized bed frame in black.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "black", "full" ] }, "asin": "B09BTN8F47" }, { "task_id": "ws_B07CD5P419_9611", "instruction": "i would like a 4.9 ounce face cream for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "4.9 ounce (new packaging)" ] }, "asin": "B07CD5P419" }, { "task_id": "ws_B00I3303L2_9612", "instruction": "i am in need of rich creamy peanut butter sauce", "target_attributes": { "attributes": [ "rich creamy" ], "options": [] }, "asin": "B00I3303L2" }, { "task_id": "ws_B06ZZHT2WK_9613", "instruction": "i just want a power cord for my blu ray player, please and thank you", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B06ZZHT2WK" }, { "task_id": "ws_B08YD7DNMK_9614", "instruction": "i need a easy to use hair clip with pink leopard pattern.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "leopard print & pink" ] }, "asin": "B08YD7DNMK" }, { "task_id": "ws_B08ZYG6RKK_9615", "instruction": "i need a white living room statue", "target_attributes": { "attributes": [ "living room" ], "options": [ "white" ] }, "asin": "B08ZYG6RKK" }, { "task_id": "ws_B09QKH8MV3_9616", "instruction": "i'm looking for casual linen cotton loafers slip on ladies walking shoes.", "target_attributes": { "attributes": [ "fashion design" ], "options": [ "brown" ] }, "asin": "B09QKH8MV3" }, { "task_id": "ws_B07VV485TM_9617", "instruction": "i am looking for high power monoculars.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B07VV485TM" }, { "task_id": "ws_B09CTM3SYZ_9618", "instruction": "i am looking for baby shower themed cupcake toppers.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09CTM3SYZ" }, { "task_id": "ws_B07L2M3LQX_9619", "instruction": "i am seraching for wireless charging apple iphone with gradient coral color.", "target_attributes": { "attributes": [ "compatible apple", "wireless charging" ], "options": [ "gradient coral" ] }, "asin": "B07L2M3LQX" }, { "task_id": "ws_B08H56VYJC_9620", "instruction": "i would like a dual band ac adapter.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B08H56VYJC" }, { "task_id": "ws_B09JZLZBY2_9621", "instruction": "i am looking for machine wash waistcoat jackets also choose size 5x-large", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "5x-large" ] }, "asin": "B09JZLZBY2" }, { "task_id": "ws_B0957HZNK3_9622", "instruction": "i want vanity lights that are easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B0957HZNK3" }, { "task_id": "ws_B00OKXRX8U_9623", "instruction": "i'm looking for a highly pigmented hydrating lipstick with matte finish. also, i want the berry smoothie one.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "berry smoothie" ] }, "asin": "B00OKXRX8U" }, { "task_id": "ws_B07FMVYFJP_9624", "instruction": "i am in need of 6 pairs of small-medium size navy color, knee high compression socks for women & men", "target_attributes": { "attributes": [ "knee high" ], "options": [ "blue | black | navy | black | green | white", "small-medium" ] }, "asin": "B07FMVYFJP" }, { "task_id": "ws_B08NPP1QZ3_9625", "instruction": "i am looking for pink, high quality massage sheets that are oil resistant.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pink - 50 sheets" ] }, "asin": "B08NPP1QZ3" }, { "task_id": "ws_B09RQVSMS8_9626", "instruction": "i am looking for mens pajamas of size 3xl code having elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "3xl code" ] }, "asin": "B09RQVSMS8" }, { "task_id": "ws_B07RFP29RW_9627", "instruction": "i want black columbia women's tidal elastic waist pants.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "black" ] }, "asin": "B07RFP29RW" }, { "task_id": "ws_B082FJL2KB_9628", "instruction": "i'm looking for a pair of women's loose fit, gray jeans.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "gray" ] }, "asin": "B082FJL2KB" }, { "task_id": "ws_B09G2X3K15_9629", "instruction": "i'm looking for storage drawers for cloths, toys, etc.,", "target_attributes": { "attributes": [ "storage space" ], "options": [ "macaron-1" ] }, "asin": "B09G2X3K15" }, { "task_id": "ws_B09PGDQXVL_9630", "instruction": "i am looking for wireless bluetooth headphones that are easy to use.", "target_attributes": { "attributes": [ "easy use", "wireless bluetooth" ], "options": [] }, "asin": "B09PGDQXVL" }, { "task_id": "ws_B07QY3BQCG_9631", "instruction": "i want a 12 pack of oatmeal cranberry and almond bars that are non gmo and gluten free.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "oatmeal cranberry & almond", "12 count (pack of 1)" ] }, "asin": "B07QY3BQCG" }, { "task_id": "ws_B09SZGV366_9632", "instruction": "i would like a black brown to tan hairpiece made from synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "black brown to tan" ] }, "asin": "B09SZGV366" }, { "task_id": "ws_B09R82SVCG_9633", "instruction": "i am looking for a masks for damaged hair", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B09R82SVCG" }, { "task_id": "ws_B09332GKRT_9634", "instruction": "i am looking for small size casual elastic waist sleeveless one pieice burgundy jumpsuit", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "y1 one piece burgundy jumpsuit", "small" ] }, "asin": "B09332GKRT" }, { "task_id": "ws_B08P3WBXLP_9635", "instruction": "i would like a 6 piece organizer that has aaa batteries included.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [ "6 pcs organizers" ] }, "asin": "B08P3WBXLP" }, { "task_id": "ws_B09R1FFQF8_9636", "instruction": "i am looking for a red color fast charging portable charger..", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "red" ] }, "asin": "B09R1FFQF8" }, { "task_id": "ws_B07MLH8SHQ_9637", "instruction": "find a high protein puffed snack to be made on a brick oven.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "brick oven pizza" ] }, "asin": "B07MLH8SHQ" }, { "task_id": "ws_B092YZ1114_9638", "instruction": "looking for plug and play n64 wired usb pc game pad joystick also choose colour clear red", "target_attributes": { "attributes": [ "plug play" ], "options": [ "clear red" ] }, "asin": "B092YZ1114" }, { "task_id": "ws_B07D7GG9DZ_9639", "instruction": "looking for gluten free dairy free protein powder", "target_attributes": { "attributes": [ "dairy free", "gluten free" ], "options": [] }, "asin": "B07D7GG9DZ" }, { "task_id": "ws_B09L7PVRW8_9640", "instruction": "looking for cupcake toppers for baby shower birthday party supplies", "target_attributes": { "attributes": [ "baby shower", "birthday party", "party supplies" ], "options": [] }, "asin": "B09L7PVRW8" }, { "task_id": "ws_B09RV3SFJM_9641", "instruction": "i am looking for a mini mak spotting scope smart phone adapter that is easy to use and comes with a carrying case.", "target_attributes": { "attributes": [ "easy use", "carrying case" ], "options": [ "w | adapter" ] }, "asin": "B09RV3SFJM" }, { "task_id": "ws_B07PGR1T3K_9642", "instruction": "i am looking for 4ft black color triple h mist spray needle sleeve t-shirt for youth", "target_attributes": { "attributes": [ "needle sleeve" ], "options": [ "black", "4t" ] }, "asin": "B07PGR1T3K" }, { "task_id": "ws_B09RHQFJNJ_9643", "instruction": "entatial aluminum alloy ball head, camera tripod ball head. find and let me know", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [] }, "asin": "B09RHQFJNJ" }, { "task_id": "ws_B07L7H34D8_9644", "instruction": "i am looking for adidas men's synthetic sole running shoe, also blue one and 5.5 sized", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "blue | mystery blue", "5.5" ] }, "asin": "B07L7H34D8" }, { "task_id": "ws_B09PG9Z97L_9645", "instruction": "i am looking for a black women\u2019s loose fit tank top.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "b18 - black" ] }, "asin": "B09PG9Z97L" }, { "task_id": "ws_B09RQT6GC1_9646", "instruction": "i would like to buy xx-large men's shorts with an elastic waist and want them to be dark blue.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "dark blue", "xx-large" ] }, "asin": "B09RQT6GC1" }, { "task_id": "ws_B079C5SZ5X_9647", "instruction": "i would like a four ounce tube of fluoride free toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "4 ounce (pack of 1)" ] }, "asin": "B079C5SZ5X" }, { "task_id": "ws_B01CIVNU3M_9648", "instruction": "i need a deodorant anti perspirant in travel size for women", "target_attributes": { "attributes": [ "anti perspirant", "travel size" ], "options": [] }, "asin": "B01CIVNU3M" }, { "task_id": "ws_B09T38WPBV_9649", "instruction": "i'm looking for a monopod with carbon fiber", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B09T38WPBV" }, { "task_id": "ws_B08WHCWVJW_9650", "instruction": "i would like a low carb bagel.", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B08WHCWVJW" }, { "task_id": "ws_B09MJ6F65M_9651", "instruction": "i would like a 5\" navy futon mattress for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "navy", "5\" depth" ] }, "asin": "B09MJ6F65M" }, { "task_id": "ws_B010JEDXAU_9652", "instruction": "i would like a single beige spade bed that is water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "beige", "1 count (pack of 1)" ] }, "asin": "B010JEDXAU" }, { "task_id": "ws_B091TYFSPX_9653", "instruction": "i am looking for shampoo for damaged hair for men and women with argan oil, which is easy to use, with scented cleansing soap.", "target_attributes": { "attributes": [ "easy use", "argan oil", "damaged hair" ], "options": [ "cleansing soap" ] }, "asin": "B091TYFSPX" }, { "task_id": "ws_B00E5MDWQS_9654", "instruction": "i would like a 14 ounce caramel lovers taffy that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "caramel lovers", "14 oz" ] }, "asin": "B00E5MDWQS" }, { "task_id": "ws_B09FPZWFYY_9655", "instruction": "multifunction charger fast charging usb port", "target_attributes": { "attributes": [ "fast charging", "usb port" ], "options": [] }, "asin": "B09FPZWFYY" }, { "task_id": "ws_B081B2G43Z_9656", "instruction": "i am interested in buying body scrubs for dead skin which have bamboo & charcoal acne face wash scent and come at size of 10.14 fl oz.", "target_attributes": { "attributes": [ "dead skin" ], "options": [ "bamboo & charcoal acne face wash", "10.14 fl oz" ] }, "asin": "B081B2G43Z" }, { "task_id": "ws_B09BVM5TJZ_9657", "instruction": "i'm looking for an ottoman for my living room with metal legs and beige upholstery.", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [ "beige" ] }, "asin": "B09BVM5TJZ" }, { "task_id": "ws_B09JLGKMLQ_9658", "instruction": "i would like a round vanity light for the living room.", "target_attributes": { "attributes": [ "vanity light", "living room" ], "options": [ "round" ] }, "asin": "B09JLGKMLQ" }, { "task_id": "ws_B07D5K3Y4F_9659", "instruction": "i'm looking for women's over the knee boot.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "olive v. suede" ] }, "asin": "B07D5K3Y4F" }, { "task_id": "ws_B092372XPC_9660", "instruction": "i would like a five pound bag of non gmo seeds", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "5 pound" ] }, "asin": "B092372XPC" }, { "task_id": "ws_B09GF5P4LW_9661", "instruction": "i am looking for black color heavy duty protective cover for phone 13 pro", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black", "iphone 13 pro" ] }, "asin": "B09GF5P4LW" }, { "task_id": "ws_B00FLZ5MG6_9662", "instruction": "i would like a bookcase that is made of engineered wood", "target_attributes": { "attributes": [ "engineered wood" ], "options": [] }, "asin": "B00FLZ5MG6" }, { "task_id": "ws_B089NVK9GL_9663", "instruction": "i am looking for hand crafted gourmet frozen appetizer.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B089NVK9GL" }, { "task_id": "ws_B09M7KQX11_9664", "instruction": "i want a new formuler z10 pro max android 10 dual band ring.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B09M7KQX11" }, { "task_id": "ws_B088CY6GZK_9665", "instruction": "i would like a high definition surveillance dvr kit.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B088CY6GZK" }, { "task_id": "ws_B09JSDBDCC_9666", "instruction": "i would like a 29 wide by 63 tall brown roller shade that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "bottom up-light filtering-brown", "29\"w x 64\"h" ] }, "asin": "B09JSDBDCC" }, { "task_id": "ws_B084JH55W8_9667", "instruction": "i would like a makeup palette that is easy to clean and is red", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "red" ] }, "asin": "B084JH55W8" }, { "task_id": "ws_B00G4ITP30_9668", "instruction": "i would like a 8 ft 6 in x 12 ft rectangular navy rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "navy", "rectangular", "8 ft 6 in x 12 ft" ] }, "asin": "B00G4ITP30" }, { "task_id": "ws_B0030EYI4C_9669", "instruction": "i would like a 6 foot long snake cable for blu ray.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "snake", "6 feet" ] }, "asin": "B0030EYI4C" }, { "task_id": "ws_B08149WQV1_9670", "instruction": "my sister needs a long-sleeve hoodie dress for casual daily wear; she is an extra large size.", "target_attributes": { "attributes": [ "daily casual", "long sleeve" ], "options": [ "x-large" ] }, "asin": "B08149WQV1" }, { "task_id": "ws_B0170BHYGE_9671", "instruction": "i am interested in buying a pack of 1, bpa free dental guard with a storage case.", "target_attributes": { "attributes": [ "bpa free", "storage case" ], "options": [ "1 count (pack of 1)" ] }, "asin": "B0170BHYGE" }, { "task_id": "ws_B07CZL3WV5_9672", "instruction": "i want a 5 ounce hotter n hot jalapeno kosher certified chips.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "hotter 'n hot jalapeno", "5 ounce (pack of 8)" ] }, "asin": "B07CZL3WV5" }, { "task_id": "ws_B09PL3X4PF_9673", "instruction": "i need a dresser that is easy to assemble and is the color b", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "b" ] }, "asin": "B09PL3X4PF" }, { "task_id": "ws_B07DMBCVLY_9674", "instruction": "i am looking for a 2.1 ounce (pack of 4) of gluten free and non gmo candy & chocolate bars", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "2.1 ounce (pack of 4)" ] }, "asin": "B07DMBCVLY" }, { "task_id": "ws_B07DMBCVLY_9675", "instruction": "i am looking for a four count variety pack of chocolate bars that are non gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "variety", "4 count (pack of 1)" ] }, "asin": "B07DMBCVLY" }, { "task_id": "ws_B073SWCZ62_9676", "instruction": "i am looking for some nut free raspberry snack bars.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "raspberry" ] }, "asin": "B073SWCZ62" }, { "task_id": "ws_B0842NXL2W_9677", "instruction": "i'm looking for a pair of men's golf shoes in a seven and a half size that are easy to care for.", "target_attributes": { "attributes": [ "easy care" ], "options": [ "7.5" ] }, "asin": "B0842NXL2W" }, { "task_id": "ws_B09NDWF94G_9678", "instruction": "i want to buy cupcake toppers which are suitable for valentine day and have a red color.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "a red" ] }, "asin": "B09NDWF94G" }, { "task_id": "ws_B09K7Q9V57_9679", "instruction": "i am looking for a 2-4y size of manual toothbrushes for sensitive teeth", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "2-4y" ] }, "asin": "B09K7Q9V57" }, { "task_id": "ws_B09LQNSL48_9680", "instruction": "i would like a pair of size 8.5 red slippers with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "red", "8.5-9" ] }, "asin": "B09LQNSL48" }, { "task_id": "ws_B09P3CKRSW_9681", "instruction": "i need you to find this women's long-sleeved tie-dye printed pajamas, color: b2-orange, size medium. i want to give it as a gift to a friend.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "b2-orange", "medium" ] }, "asin": "B09P3CKRSW" }, { "task_id": "ws_B08XN1T626_9682", "instruction": "i would like a 18 fluid ounce bottle of natural hair gel.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "18 fl oz (pack of 1)" ] }, "asin": "B08XN1T626" }, { "task_id": "ws_B09QCB88QT_9683", "instruction": "i need a gm workout tee that is pink", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "pink" ] }, "asin": "B09QCB88QT" }, { "task_id": "ws_B06VW5J11K_9684", "instruction": "i need a 2 fl oz alcohol free wash", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "2 fl oz (pack of 1)" ] }, "asin": "B06VW5J11K" }, { "task_id": "ws_B003U5DDTM_9685", "instruction": "i would like a 34 wide by 32 long pair of stone straight leg pants.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "stone", "34w x 32l" ] }, "asin": "B003U5DDTM" }, { "task_id": "ws_B09FQ9Q2PH_9686", "instruction": "i want to buy cupcake toppers which are suitable for birthday party cupcakes and with a pattern of rg 80.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "rg 80" ] }, "asin": "B09FQ9Q2PH" }, { "task_id": "ws_B07YFX7DKZ_9687", "instruction": "i would like a 42 wide by 63 long blush window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blush", "42w x 63l" ] }, "asin": "B07YFX7DKZ" }, { "task_id": "ws_B09NSCFQCZ_9688", "instruction": "i am looking for an easy to install wall mounted cd player.", "target_attributes": { "attributes": [ "wall mounted", "easy install" ], "options": [] }, "asin": "B09NSCFQCZ" }, { "task_id": "ws_B095BWL2GD_9689", "instruction": "i am looking for medium size men's hiking shorts having elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "medium" ] }, "asin": "B095BWL2GD" }, { "task_id": "ws_B00FREG0PI_9690", "instruction": "i want to buy a shirt for men which is easy care and has long sleeves, also it should be black color and have a size of x-large big tall.", "target_attributes": { "attributes": [ "easy care", "long sleeve" ], "options": [ "black", "x-large big tall" ] }, "asin": "B00FREG0PI" }, { "task_id": "ws_B0727LGC9S_9691", "instruction": "i want icelandic provisions yogurt with real fruit.", "target_attributes": { "attributes": [ "real fruit" ], "options": [] }, "asin": "B0727LGC9S" }, { "task_id": "ws_B097RHDQS9_9692", "instruction": "i want a monocular telescope for bird watching", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B097RHDQS9" }, { "task_id": "ws_B076HGVPN2_9693", "instruction": "i would like a adult sized 4 pack of hermosa pink chairs for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "hermosa pink", "4 pack", "adult" ] }, "asin": "B076HGVPN2" }, { "task_id": "ws_B09M2YC61W_9694", "instruction": "|i am looking for 4x-large men's fashion black color regulat fit suit jackets", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "black-5", "4x-large" ] }, "asin": "B09M2YC61W" }, { "task_id": "ws_B081SLWHXH_9695", "instruction": "i want a wall mounted europe style round decorative mirror.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [] }, "asin": "B081SLWHXH" }, { "task_id": "ws_B08FHGHRVW_9696", "instruction": "i am looking for a large european made lead free candle for my living room.", "target_attributes": { "attributes": [ "lead free", "living room" ], "options": [] }, "asin": "B08FHGHRVW" }, { "task_id": "ws_B09PQF3XMN_9697", "instruction": "i am looking for cruelty free wet n wild lip balm in the color 'no more drama'.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "no more drama" ] }, "asin": "B09PQF3XMN" }, { "task_id": "ws_B095LC8JT2_9698", "instruction": "i am looking for wall mounted black metal coat hanger and hat tree rack.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [] }, "asin": "B095LC8JT2" }, { "task_id": "ws_B0818ZP6YY_9699", "instruction": "i am looking for a pair of women's purple house slippers with memory foam and faux fur.", "target_attributes": { "attributes": [ "memory foam", "faux fur" ], "options": [ "z5-purple" ] }, "asin": "B0818ZP6YY" }, { "task_id": "ws_B01MZAR82R_9700", "instruction": "i want a living room traditional vintage shabby chic standing floor lamp with a linen shade.", "target_attributes": { "attributes": [ "living room" ], "options": [ "linen shade" ] }, "asin": "B01MZAR82R" }, { "task_id": "ws_B091QC3SF7_9701", "instruction": "i am looking for a low carb, high protein meal replacement bar in the flavor of dark chocolate s'mores.", "target_attributes": { "attributes": [ "high protein", "low carb" ], "options": [ "dark chocolate s'mores" ] }, "asin": "B091QC3SF7" }, { "task_id": "ws_B091QC3SF7_9702", "instruction": "the success of my diet depends on this product!!! bestmed - high protein peaunt nutritional bar - low-carb, 15g protein, low sugar, i need to find help.", "target_attributes": { "attributes": [ "high protein", "low sugar", "low carb" ], "options": [ "peanut" ] }, "asin": "B091QC3SF7" }, { "task_id": "ws_B09MYNDXXY_9703", "instruction": "i would like to buy winter boots for women which are made of quality materials and are in khaki color, as for the size they should be 9.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "khaki", "9" ] }, "asin": "B09MYNDXXY" }, { "task_id": "ws_B07HF7G5FB_9704", "instruction": "i'm looking for organic shampoo for thinning hair and hair loss.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B07HF7G5FB" }, { "task_id": "ws_B0046EJQ1K_9705", "instruction": "i'm looking for a candy heart shaped covered by chocolate for valentine day", "target_attributes": { "attributes": [ "chocolate covered", "valentine day" ], "options": [] }, "asin": "B0046EJQ1K" }, { "task_id": "ws_B08RYCHDBV_9706", "instruction": "i need a-5 pairs of false eyelashes. it should be easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "style a-5 pairs" ] }, "asin": "B08RYCHDBV" }, { "task_id": "ws_B088T66N5S_9707", "instruction": "i would like a goddess treasure eyeshadow that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "goddess treasure" ] }, "asin": "B088T66N5S" }, { "task_id": "ws_B08WX4QH5X_9708", "instruction": "i'm looking for a scented facial moisturizer anti aging", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "scented" ] }, "asin": "B08WX4QH5X" }, { "task_id": "ws_B08MT567ZS_9709", "instruction": "i am interested in buying wall mounted lights which have nickel finish and satin nickel color, and i want 5 of them.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "satin nickel", "5-light" ] }, "asin": "B08MT567ZS" }, { "task_id": "ws_B07RGP2LS1_9710", "instruction": "i am looking for a pair of women's size 5.5 flat shoes with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "5.5" ] }, "asin": "B07RGP2LS1" }, { "task_id": "ws_B08L71QGTD_9711", "instruction": "i am interested in buying a deodorant for body which is paraben free and is suitable for sensitive skin, and has a scent of bay rum.", "target_attributes": { "attributes": [ "paraben free", "sensitive skin" ], "options": [ "bay rum" ] }, "asin": "B08L71QGTD" }, { "task_id": "ws_B085F3JWD5_9712", "instruction": "i am looking for low calorie popcorn that is unpopped", "target_attributes": { "attributes": [ "low calorie" ], "options": [] }, "asin": "B085F3JWD5" }, { "task_id": "ws_B093YTGB24_9713", "instruction": "i want to find a set of two mesh laundry bags that i can wash my delicate items in, such as blouses and hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093YTGB24" }, { "task_id": "ws_B09P7WWP61_9714", "instruction": "i am looking for a long handled body brush.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B09P7WWP61" }, { "task_id": "ws_B09S6NTYQY_9715", "instruction": "i am looking for a pair of women's size 8.5 open toe sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "8.5" ] }, "asin": "B09S6NTYQY" }, { "task_id": "ws_B08V4ZPBZH_9716", "instruction": "i need anti slip grey running shoes", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "133-grey" ] }, "asin": "B08V4ZPBZH" }, { "task_id": "ws_B0764ZSHVC_9717", "instruction": "i would like to buy non gmo popcorns which can also be a perfect gift.", "target_attributes": { "attributes": [ "non gmo", "perfect gift" ], "options": [] }, "asin": "B0764ZSHVC" }, { "task_id": "ws_B07G6124N1_9718", "instruction": "i need some cute heart-shaped glittery cupcake picks as a gift to bring to a baby shower.", "target_attributes": { "attributes": [ "cupcake picks", "baby shower" ], "options": [] }, "asin": "B07G6124N1" }, { "task_id": "ws_B078XPX5Y9_9719", "instruction": "i am looking for gluten free pride of india brand lentil crackers in the plain mung bean flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "plain mung bean (moong dal) sada papadum" ] }, "asin": "B078XPX5Y9" }, { "task_id": "ws_B09FPTTJ3X_9720", "instruction": "i'm looking for wireless bluetooth car stereo audio receiver.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09FPTTJ3X" }, { "task_id": "ws_B09RMM8KX7_9721", "instruction": "i'm looking for a short sleeve maxi dress with high waist tummy control band. also choose medium size 11-zc4 light blue one", "target_attributes": { "attributes": [ "short sleeve", "tummy control", "high waist" ], "options": [ "11 - zc4 light blue", "medium" ] }, "asin": "B09RMM8KX7" }, { "task_id": "ws_B09KT21VHL_9722", "instruction": "i want to find a white pair of one-size-fits-all men's underwear that is loose-fitting.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "u-ae-white", "one size" ] }, "asin": "B09KT21VHL" }, { "task_id": "ws_B09NP3XKKG_9723", "instruction": "i am looking for a 5 pound assorted chocolate candy mix gift basket for a birthday party.", "target_attributes": { "attributes": [ "birthday party", "gift basket" ], "options": [ "5 lbs" ] }, "asin": "B09NP3XKKG" }, { "task_id": "ws_B091MCX28W_9724", "instruction": "i am looking for rockandy peppered beef jerky ready to eat snacks in a 5 pack.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "5 pack" ] }, "asin": "B091MCX28W" }, { "task_id": "ws_B07THG63LT_9725", "instruction": "i need a futon set that is blue velvet", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue velvet" ] }, "asin": "B07THG63LT" }, { "task_id": "ws_B08X732PLR_9726", "instruction": "find me an official pokemon shirt with gengar and mewtwo, has to be washable in the machine, black in a men' large.", "target_attributes": { "attributes": [ "officially licensed", "machine wash" ], "options": [ "asphalt", "men", "large" ] }, "asin": "B08X732PLR" }, { "task_id": "ws_B08SWFTP5S_9727", "instruction": "i am looking for a solid steel frame dressers", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "solid" ] }, "asin": "B08SWFTP5S" }, { "task_id": "ws_B07PMQTC2L_9728", "instruction": "i'm looking for a protective case for the apple watch that contains a rose pink box cover.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "rose pink" ] }, "asin": "B07PMQTC2L" }, { "task_id": "ws_B07YNFMRRX_9729", "instruction": "i am looking for a high quality nail polish of size 10x24.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "10x24" ] }, "asin": "B07YNFMRRX" }, { "task_id": "ws_B08MH9GDK8_9730", "instruction": "i am looking for some long lasting lead free prayer candles.", "target_attributes": { "attributes": [ "lead free", "long lasting" ], "options": [] }, "asin": "B08MH9GDK8" }, { "task_id": "ws_B08TQDWWZP_9731", "instruction": "i am looking for keen utility men's kansas city kbf composite toe athletic shoes.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "10 wide" ] }, "asin": "B08TQDWWZP" }, { "task_id": "ws_B003ZYOD6A_9732", "instruction": "i need long lasting deodorant", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B003ZYOD6A" }, { "task_id": "ws_B07Z8QJFYC_9733", "instruction": "i am looking for a synthetic hair ponytail extension in the color medium brown.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "medium brown" ] }, "asin": "B07Z8QJFYC" }, { "task_id": "ws_B09R7VRZV4_9734", "instruction": "i am looking for pink color whitening massage easy use toothbrush that fit for age 2-6", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink", "age 2-6" ] }, "asin": "B09R7VRZV4" }, { "task_id": "ws_B06XF385WF_9735", "instruction": "i need black long lasting mascara", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "washable mystic black" ] }, "asin": "B06XF385WF" }, { "task_id": "ws_B09PRCCD3L_9736", "instruction": "i need one pair of large sized stockings that is high quality and non toxic for my feet.", "target_attributes": { "attributes": [ "non toxic", "high quality" ], "options": [ "one pair of feet" ] }, "asin": "B09PRCCD3L" }, { "task_id": "ws_B08Q37Z1LZ_9737", "instruction": "i am looking for a light blue mini dress that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "light blue" ] }, "asin": "B08Q37Z1LZ" }, { "task_id": "ws_B08HKYBTFF_9738", "instruction": "i would like a face kit for my fine lines.", "target_attributes": { "attributes": [ "fine lines" ], "options": [] }, "asin": "B08HKYBTFF" }, { "task_id": "ws_B07JB7VQBY_9739", "instruction": "i'd like to shop for some red slim fit jeans with a button closure. i need a size 28.", "target_attributes": { "attributes": [ "slim fit", "button closure" ], "options": [ "red", "28" ] }, "asin": "B07JB7VQBY" }, { "task_id": "ws_B07HYH327V_9740", "instruction": "i would like a gluten free trader joes flatbread.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [] }, "asin": "B07HYH327V" }, { "task_id": "ws_B07HYH327V_9741", "instruction": "i want to find trader joe's gluten free norwegian crispbreads that i can pack in my lunches.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [] }, "asin": "B07HYH327V" }, { "task_id": "ws_B00RIBX3T4_9742", "instruction": "i'm looking for violet pigment and blackberry extract sheer silver shampoo.", "target_attributes": { "attributes": [ "paraben free", "sulfate free" ], "options": [ "conditioner - fl oz 10.1" ] }, "asin": "B00RIBX3T4" }, { "task_id": "ws_B085PWT41F_9743", "instruction": "gluten free meatballs", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B085PWT41F" }, { "task_id": "ws_B08V9Y3JWH_9744", "instruction": "i'm looking for a machine washable t-shirts made of heather cotton with needle sleeve and button closure type. also, choose men, x-small size white one.", "target_attributes": { "attributes": [ "machine wash", "heathers cotton", "button closure", "needle sleeve" ], "options": [ "white", "men", "x-small" ] }, "asin": "B08V9Y3JWH" }, { "task_id": "ws_B082MCN2BL_9745", "instruction": "i want a rolling cart for a beauty salon.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [] }, "asin": "B082MCN2BL" }, { "task_id": "ws_B09L87DN8X_9746", "instruction": "i need a red sports coat that is slim fitting.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "red1" ] }, "asin": "B09L87DN8X" }, { "task_id": "ws_B09PHLSFCP_9747", "instruction": "i'm looking for a toothpaste for teeth whitening in blueberry scent", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "blueberry" ] }, "asin": "B09PHLSFCP" }, { "task_id": "ws_B08M94Y2G7_9748", "instruction": "i would like a black chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "black" ] }, "asin": "B08M94Y2G7" }, { "task_id": "ws_B07PCZMLFG_9749", "instruction": "i'm looking for a woman's navy workout t-shirt that is machine washable and provides a classic fit.", "target_attributes": { "attributes": [ "machine wash", "classic fit" ], "options": [ "navy" ] }, "asin": "B07PCZMLFG" }, { "task_id": "ws_B08BNGMZM8_9750", "instruction": "i'm looking for running shoe for women.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "grey | teal" ] }, "asin": "B08BNGMZM8" }, { "task_id": "ws_B07PLYFJSY_9751", "instruction": "i would like a coral orange basic heavy duty phone case.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "m834-coral orange" ] }, "asin": "B07PLYFJSY" }, { "task_id": "ws_B09P4MVM85_9752", "instruction": "i would like a power cable for by blu ray player.", "target_attributes": { "attributes": [ "blu ray" ], "options": [] }, "asin": "B09P4MVM85" }, { "task_id": "ws_B0963729NB_9753", "instruction": "i need a face kit for dark circles", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B0963729NB" }, { "task_id": "ws_B09P3CGSXQ_9754", "instruction": "i am interested in buying beds which are twin size, and of grey color, while their style should be metal triple bunk bed with slide.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "grey", "metal triple bunk bed with slide" ] }, "asin": "B09P3CGSXQ" }, { "task_id": "ws_B099SGN3HJ_9755", "instruction": "i want a peanut butter cranberry toyou snack that is plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "toyou - peanut butter cranberry - box (1..." ] }, "asin": "B099SGN3HJ" }, { "task_id": "ws_B096MGWMM2_9756", "instruction": "i'm looking for a replacement remote with batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B096MGWMM2" }, { "task_id": "ws_B09J28CKKT_9757", "instruction": "i am looking for a heavy duty basic cases for iphone 13 size", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "iphone 13" ] }, "asin": "B09J28CKKT" }, { "task_id": "ws_B09J28CKKT_9758", "instruction": "i need an iphone 7 plus case that has wireless charging capabilities", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "iphone 7plus | 8plus" ] }, "asin": "B09J28CKKT" }, { "task_id": "ws_B08QMVR6R7_9759", "instruction": "i'm looking for a shimmery eye shadow palette that is long lasting and waterproof. also, choose the fusion palette of 39 colors", "target_attributes": { "attributes": [ "long lasting", "eye shadow" ], "options": [ "color fusion-39 colors" ] }, "asin": "B08QMVR6R7" }, { "task_id": "ws_B0943T7FNN_9760", "instruction": "i am looking for a pair of easy to carry light blue headphones.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "light blue" ] }, "asin": "B0943T7FNN" }, { "task_id": "ws_B07S5XRX8X_9761", "instruction": "find a water resistant leather jacket", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B07S5XRX8X" }, { "task_id": "ws_B09HBV726B_9762", "instruction": "i am looking for a grey sectional sofa for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey" ] }, "asin": "B09HBV726B" }, { "task_id": "ws_B09R7B5VN5_9763", "instruction": "i am looking for a white batteries included clock radios", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09R7B5VN5" }, { "task_id": "ws_B09GL5Z4N2_9764", "instruction": "i want a size 12 black slipper made of vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "black", "12" ] }, "asin": "B09GL5Z4N2" }, { "task_id": "ws_B0972NGB9Y_9765", "instruction": "i'm looking for a daily wear cardigan sweaters with long sleeve and fleece lined. also choose medium size light grey colored one.", "target_attributes": { "attributes": [ "fleece lined", "long sleeve", "daily wear" ], "options": [ "light grey", "medium" ] }, "asin": "B0972NGB9Y" }, { "task_id": "ws_B09SPKW74K_9766", "instruction": "i would like to buy nail clippers which are easy to clean, and also are made of stainless steel, i also prefer to have them of color 8592 red.", "target_attributes": { "attributes": [ "easy clean", "stainless steel" ], "options": [ "8592 red" ] }, "asin": "B09SPKW74K" }, { "task_id": "ws_B072HSLKRT_9767", "instruction": "i am looking for fredd marshall mens skinny jeans in a slim fit.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "32w x 32l" ] }, "asin": "B072HSLKRT" }, { "task_id": "ws_B09NM4T5YJ_9768", "instruction": "i'm looking for a men's long sleeve, yellow track jacket.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "yellow" ] }, "asin": "B09NM4T5YJ" }, { "task_id": "ws_B072JBH9BW_9769", "instruction": "i would like to have a can of rich and creamy cream of potato soup.", "target_attributes": { "attributes": [ "rich creamy" ], "options": [ "cream of potato soup" ] }, "asin": "B072JBH9BW" }, { "task_id": "ws_B08QDKDNLJ_9770", "instruction": "i am looking for white color heavy duty bar stools.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "white" ] }, "asin": "B08QDKDNLJ" }, { "task_id": "ws_B07HMJW9Y8_9771", "instruction": "i'm looking for a pair of black and white rubber-soled sneakers in a size 5.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | white", "5.5" ] }, "asin": "B07HMJW9Y8" }, { "task_id": "ws_B09B331BGP_9772", "instruction": "i want to find a beauty salon mattress that is 60 centimeters by 180 centimeters in dimension.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "60*180cm" ] }, "asin": "B09B331BGP" }, { "task_id": "ws_B093XWDXTY_9773", "instruction": "i'm looking for a spa pedicure kit-at-home foot care for baby soft feet.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B093XWDXTY" }, { "task_id": "ws_B09PMJR3BM_9774", "instruction": "i am looking for a plant based rose scented moisturizing sunscreen.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "rose" ] }, "asin": "B09PMJR3BM" }, { "task_id": "ws_B07W7D4SFR_9775", "instruction": "i am looking for khaki color long sleeve shirt for men.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "khaki" ] }, "asin": "B07W7D4SFR" }, { "task_id": "ws_B08PC1TYFR_9776", "instruction": "i am looking for a light grey, wood frame sectional sofa.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "light grey" ] }, "asin": "B08PC1TYFR" }, { "task_id": "ws_B09B7XYWK9_9777", "instruction": "i need a blue grey mattress that is easy to clean", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "textured blue gray" ] }, "asin": "B09B7XYWK9" }, { "task_id": "ws_B075FX1MTL_9778", "instruction": "i'm looking for a pair of long lasting women's sandals in a size eight or eight and half.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "8-8.5" ] }, "asin": "B075FX1MTL" }, { "task_id": "ws_B07RP89DMD_9779", "instruction": "i would like a 2 pound bag of chocolate covered fruit.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "2 pound" ] }, "asin": "B07RP89DMD" }, { "task_id": "ws_B078PJWQ46_9780", "instruction": "i'm looking for a full size fully assembled mattress with 8\" split foundation.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "full", "8\" split foundation" ] }, "asin": "B078PJWQ46" }, { "task_id": "ws_B093XJW7R9_9781", "instruction": "i am looking for a medium sized machine washable t-shirt.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "medium" ] }, "asin": "B093XJW7R9" }, { "task_id": "ws_B0997VM1K4_9782", "instruction": "i am looking for a pu leather black color heavy duty bed frame.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "pu leather black" ] }, "asin": "B0997VM1K4" }, { "task_id": "ws_B0993Q31VY_9783", "instruction": "i would like a 32 gig gray tablet with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "gray", "2+32g" ] }, "asin": "B0993Q31VY" }, { "task_id": "ws_B09K5BRSLN_9784", "instruction": "i want a flower pattern fleece throw blanket.", "target_attributes": { "attributes": [ "fleece throw" ], "options": [ "flower pattern" ] }, "asin": "B09K5BRSLN" }, { "task_id": "ws_B000FZU0N2_9785", "instruction": "i am looking for a low carb carba-nada roasted fettuccine", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B000FZU0N2" }, { "task_id": "ws_B07PQT2JFJ_9786", "instruction": "i am looking for a 3 pack of coconut oil hair therapy.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "3 pack" ] }, "asin": "B07PQT2JFJ" }, { "task_id": "ws_B099RNFR1S_9787", "instruction": "i need fully dimmable led floor lamp for living room", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B099RNFR1S" }, { "task_id": "ws_B00194EQZQ_9788", "instruction": "i am looking for cherry red softy t color boots that are light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "cherry red softy t" ] }, "asin": "B00194EQZQ" }, { "task_id": "ws_B00194EQZQ_9789", "instruction": "i'm looking for an original lightweight lace-up boot for my little toddler; she's a size 7.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "7 toddler", "little kid (4-8 years)" ] }, "asin": "B00194EQZQ" }, { "task_id": "ws_B09FLSNYWQ_9790", "instruction": "i am looking for a king size memory foam mattress.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "king" ] }, "asin": "B09FLSNYWQ" }, { "task_id": "ws_B09BZHV31Y_9791", "instruction": "i want to buy shaver for women which is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B09BZHV31Y" }, { "task_id": "ws_B07DSKWHR5_9792", "instruction": "i'm looking for meatless bac'n and cheddar cheese.", "target_attributes": { "attributes": [ "gluten free", "dairy free" ], "options": [ "10.9 ounce (pack of 1)" ] }, "asin": "B07DSKWHR5" }, { "task_id": "ws_B09R1JX97F_9793", "instruction": "i am looking for rose pink color stainless steel bands.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "rose pink" ] }, "asin": "B09R1JX97F" }, { "task_id": "ws_B09129SHF1_9794", "instruction": "i would like a coated steel filing cabinet.", "target_attributes": { "attributes": [ "coated steel" ], "options": [] }, "asin": "B09129SHF1" }, { "task_id": "ws_B09RPGV59Z_9795", "instruction": "i'm looking for purple daily wear sleepwear made from a polyester/cotton blend in a size large.", "target_attributes": { "attributes": [ "polyester cotton", "daily wear" ], "options": [ "purple", "large" ] }, "asin": "B09RPGV59Z" }, { "task_id": "ws_B09NL166C9_9796", "instruction": "i want a lake blue skin care set that is bpa free.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "lake blue" ] }, "asin": "B09NL166C9" }, { "task_id": "ws_B08RDLHZTP_9797", "instruction": "i am looking for red cupcake toppers for cupcake picks valentine day party supplies birthday party", "target_attributes": { "attributes": [ "cupcake picks", "valentine day", "party supplies", "birthday party" ], "options": [ "red" ] }, "asin": "B08RDLHZTP" }, { "task_id": "ws_B097ZTCX4X_9798", "instruction": "i am looking for wall baskets that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B097ZTCX4X" }, { "task_id": "ws_B093LLCRLB_9799", "instruction": "i need a gluten free oil spray bottle.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "bottle" ] }, "asin": "B093LLCRLB" }, { "task_id": "ws_B07G4FZ9P4_9800", "instruction": "i want to buy a sofa which is suitable for living room and is of black color, and it should be of size of typical sofa.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black", "sofa" ] }, "asin": "B07G4FZ9P4" }, { "task_id": "ws_B09M73DKZG_9801", "instruction": "i am looking for a white, 7' x 5', light weight photo backdrop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "white z", "7x5 ft" ] }, "asin": "B09M73DKZG" }, { "task_id": "ws_B07YJGDF7V_9802", "instruction": "i'm looking for a plug play usb microphone", "target_attributes": { "attributes": [ "plug play" ], "options": [] }, "asin": "B07YJGDF7V" }, { "task_id": "ws_B09Q74D6T5_9803", "instruction": "i am looking for 2 pounds of individually wrapped chocolate hearts in a resealable bag.", "target_attributes": { "attributes": [ "individually wrapped", "resealable bag" ], "options": [ "80 count (2 pounds)" ] }, "asin": "B09Q74D6T5" }, { "task_id": "ws_B093QN8NGV_9804", "instruction": "i would like a body brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B093QN8NGV" }, { "task_id": "ws_B09KP78G37_9805", "instruction": "i am looking for x-large, red color women faux fur lined winter warm jacket coat", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "red", "x-large" ] }, "asin": "B09KP78G37" }, { "task_id": "ws_B09S1C5Q4K_9806", "instruction": "i need a king sized bed", "target_attributes": { "attributes": [ "king size" ], "options": [ "king" ] }, "asin": "B09S1C5Q4K" }, { "task_id": "ws_B07SH347Z1_9807", "instruction": "find me a mobile with 4g lte and a quad core", "target_attributes": { "attributes": [ "quad core", "4g lte" ], "options": [] }, "asin": "B07SH347Z1" }, { "task_id": "ws_B09JMV9DHX_9808", "instruction": "i am interesting in having denim pants which have high waist and are loose fit, and i prefer to have them with blue color, also size of 10.", "target_attributes": { "attributes": [ "loose fit", "high waist" ], "options": [ "blue- baggy jeans for teen girls y2k pants", "10" ] }, "asin": "B09JMV9DHX" }, { "task_id": "ws_B09JDCSS8Q_9809", "instruction": "i'm looking for a box of pistachio nip flavored baklava made of natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "pistachio nip s" ] }, "asin": "B09JDCSS8Q" }, { "task_id": "ws_B09JDCSS8Q_9810", "instruction": "i am looking for pistachio padishah xl flavor desserts containing artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "pistachio padishah xl" ] }, "asin": "B09JDCSS8Q" }, { "task_id": "ws_B09JDCSS8Q_9811", "instruction": "i need to buy a tin of baklava. make sure it has all natural ingredients. get the walnut twister flavor.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "walnut twister s" ] }, "asin": "B09JDCSS8Q" }, { "task_id": "ws_B09842B57N_9812", "instruction": "i'm looking for a double sided silicone exfoliating brush in purple color", "target_attributes": { "attributes": [ "double sided" ], "options": [ "purple" ] }, "asin": "B09842B57N" }, { "task_id": "ws_B09ND14XW6_9813", "instruction": "i am looking for a pair of women's size 6.5 grey heeled sandals with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "grey", "6.5" ] }, "asin": "B09ND14XW6" }, { "task_id": "ws_B08Z8LYMMX_9814", "instruction": "i would like a mauve travel size cosmetic bag.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "mauve" ] }, "asin": "B08Z8LYMMX" }, { "task_id": "ws_B01IA9BBSM_9815", "instruction": "i'm locking for a clinical strength anti-perspirant deodorant.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [] }, "asin": "B01IA9BBSM" }, { "task_id": "ws_B09FPJDTCX_9816", "instruction": "i need to buy a high definition blu ray power amplifier.", "target_attributes": { "attributes": [ "power amplifier", "blu ray", "high definition" ], "options": [] }, "asin": "B09FPJDTCX" }, { "task_id": "ws_B00TQV7MQY_9817", "instruction": "i would like a chrome napkin holder made of coated steel.", "target_attributes": { "attributes": [ "coated steel" ], "options": [ "chrome" ] }, "asin": "B00TQV7MQY" }, { "task_id": "ws_B09PJB1WCC_9818", "instruction": "i am looking for an easy to assemble navy table with storage for my living room.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "navy-31t4" ] }, "asin": "B09PJB1WCC" }, { "task_id": "ws_B00IMX6ZP6_9819", "instruction": "i want mitchum roll-on anti-perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B00IMX6ZP6" }, { "task_id": "ws_B00YCT1DQU_9820", "instruction": "i am interested in buying a contemporary bed which has wood finish and is california king size.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "california king" ] }, "asin": "B00YCT1DQU" }, { "task_id": "ws_B092HJZSJ6_9821", "instruction": "i am looking for a variety gourmet gift basket for valentine's day.", "target_attributes": { "attributes": [ "gift basket", "valentine day" ], "options": [] }, "asin": "B092HJZSJ6" }, { "task_id": "ws_B078XY9B6C_9822", "instruction": "i'm looking for round modern glass coffee table.", "target_attributes": { "attributes": [ "engineered wood" ], "options": [ "table set" ] }, "asin": "B078XY9B6C" }, { "task_id": "ws_B078XY9B6C_9823", "instruction": "i need to get a long lasting coffee table with the style of chelsea.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "chelsea" ] }, "asin": "B078XY9B6C" }, { "task_id": "ws_B07XKWMYZP_9824", "instruction": "i would like a 10.6 ounce combo pack of low carb, keto friendly chips.", "target_attributes": { "attributes": [ "keto friendly", "low carb" ], "options": [ "combo pack", "10.6 ounce (pack of 1)" ] }, "asin": "B07XKWMYZP" }, { "task_id": "ws_B07XKWMYZP_9825", "instruction": "i want the keto friendly and low carb protein puffs. pick the garlic parmesan one.", "target_attributes": { "attributes": [ "keto friendly", "low carb" ], "options": [ "garlic parmesan" ] }, "asin": "B07XKWMYZP" }, { "task_id": "ws_B09MDXNW5F_9826", "instruction": "i would like a 6 tier bookcase that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white | 6-tier bookcases" ] }, "asin": "B09MDXNW5F" }, { "task_id": "ws_B08JGLPHNV_9827", "instruction": "i am looking for black color loop bands that are light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "black" ] }, "asin": "B08JGLPHNV" }, { "task_id": "ws_B08JGLPHNV_9828", "instruction": "i want to find green, blue and white bands that are compatible with my apple watch 45. the bands should fit my wrist, which is 4.5 inches in circumference.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "green | blue | white", "for iwatch 45 | 42 | 44mm ( wrist 4.5\"- 8.54\")" ] }, "asin": "B08JGLPHNV" }, { "task_id": "ws_B09T955CJ2_9829", "instruction": "i need slip ons that are grey and are made of memory foam", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "grey" ] }, "asin": "B09T955CJ2" }, { "task_id": "ws_B079Y5V25L_9830", "instruction": "i would like to buy protein bars which are gluten free, and have chocolate hazelnut crisp flavor, and come in pack of 1 with 8 pieces.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chocolate hazelnut crisp", "8 count (pack of 1)" ] }, "asin": "B079Y5V25L" }, { "task_id": "ws_B09NKJS8LF_9831", "instruction": "i want a high power professional stereo bluetooth speaker.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B09NKJS8LF" }, { "task_id": "ws_B083ZQ7T27_9832", "instruction": "i want a large zabra patch leggings with a elastic closure.", "target_attributes": { "attributes": [ "elastic closure" ], "options": [ "3#zabra-patch", "large" ] }, "asin": "B083ZQ7T27" }, { "task_id": "ws_B09QBY2MF3_9833", "instruction": "i am looking for a 49 inch by 59 inch easy to clean fleece throw blanket.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "49 x 59 in" ] }, "asin": "B09QBY2MF3" }, { "task_id": "ws_B0872MK42V_9834", "instruction": "i need some small elastic waistband shorts", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "small tall" ] }, "asin": "B0872MK42V" }, { "task_id": "ws_B0999MCV9T_9835", "instruction": "i'm looking for a teeth whitening electric toothbrush in the color blue.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "blue b13" ] }, "asin": "B0999MCV9T" }, { "task_id": "ws_B09KTV71R2_9836", "instruction": "i am looking for easy spirit traveltime529 mule shoes with arch support, rubber soles and in size 7.5 wide.", "target_attributes": { "attributes": [ "arch support", "rubber sole" ], "options": [ "7.5 x-wide" ] }, "asin": "B09KTV71R2" }, { "task_id": "ws_B00EY9UPI0_9837", "instruction": "i want to buy a foundation for makeup which is oil free, non toxic and is of classic beige color, also i want two of those.", "target_attributes": { "attributes": [ "oil free", "non toxic" ], "options": [ "classic beige", "2 count" ] }, "asin": "B00EY9UPI0" }, { "task_id": "ws_B019K9VBIG_9838", "instruction": "i am looking for a anti aging and long lasting lip balm.", "target_attributes": { "attributes": [ "anti aging", "long lasting" ], "options": [] }, "asin": "B019K9VBIG" }, { "task_id": "ws_B07QVLFMSL_9839", "instruction": "i'm looking for a sheet for a beauty salon table. it should be non-toxic, and i want it in color 3.", "target_attributes": { "attributes": [ "non toxic", "beauty salon" ], "options": [ "03#" ] }, "asin": "B07QVLFMSL" }, { "task_id": "ws_B09KW842X3_9840", "instruction": "i am looking for a women's medium size royal blue tank top that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "royal blue", "women", "medium" ] }, "asin": "B09KW842X3" }, { "task_id": "ws_B09GP8Z91F_9841", "instruction": "i am looking for knee high, anti-slip, snow boots in the color black and size 10.", "target_attributes": { "attributes": [ "knee high", "anti slip" ], "options": [ "qm1- a7-black", "10" ] }, "asin": "B09GP8Z91F" }, { "task_id": "ws_B07T42TZLP_9842", "instruction": "i would like a 18 inch medium brown hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "6# medium brown", "18 inch" ] }, "asin": "B07T42TZLP" }, { "task_id": "ws_B093L52RXG_9843", "instruction": "i would like a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093L52RXG" }, { "task_id": "ws_B09FGJSGXR_9844", "instruction": "i am looking for a high performance wireless bluetooth camouflage green game controller.", "target_attributes": { "attributes": [ "high performance", "wireless bluetooth" ], "options": [ "camouflage green" ] }, "asin": "B09FGJSGXR" }, { "task_id": "ws_B085NH2C7W_9845", "instruction": "i want a large red sweatshirt with long sleeves.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "red", "large" ] }, "asin": "B085NH2C7W" }, { "task_id": "ws_B07RWKTZ6L_9846", "instruction": "i am interested in buying men's and women's clog shoes which have ethylene vinyl, and are in black color, also i am interested in sizes 14 for women and 12 for men.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "black", "14 women | 12 men" ] }, "asin": "B07RWKTZ6L" }, { "task_id": "ws_B08KFS44G1_9847", "instruction": "i am looking for munk pack keto granola bars that are plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B08KFS44G1" }, { "task_id": "ws_B07YLDTTP1_9848", "instruction": "find a mattress with high density foam with cover included.", "target_attributes": { "attributes": [ "high density" ], "options": [ "high density foam + mattress cover" ] }, "asin": "B07YLDTTP1" }, { "task_id": "ws_B08562KG6V_9849", "instruction": "i am looking for a contemporary designed coffee table with clear tempered glass.", "target_attributes": { "attributes": [ "contemporary design", "clear glass", "tempered glass" ], "options": [ "coffee table" ] }, "asin": "B08562KG6V" }, { "task_id": "ws_B01MSS7GKM_9850", "instruction": "i am looking for chopped walnuts that are non gmo, gluten free and in the 2 pound size.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B01MSS7GKM" }, { "task_id": "ws_B09J89JGPG_9851", "instruction": "i am looking for a xx-large long sleeve active sweatshirts", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "xx-large" ] }, "asin": "B09J89JGPG" }, { "task_id": "ws_B09NBS9JHY_9852", "instruction": "i'm looking for a unique thailand seasoned bbq crickets.", "target_attributes": { "attributes": [ "high protein" ], "options": [] }, "asin": "B09NBS9JHY" }, { "task_id": "ws_B09PJNRP69_9853", "instruction": "i want a x-large and machine washable lazy tuxedo t-shirt.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "x-large" ] }, "asin": "B09PJNRP69" }, { "task_id": "ws_B085Y271VD_9854", "instruction": "i would like a pair of size 8 brown sandals with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown-2", "8" ] }, "asin": "B085Y271VD" }, { "task_id": "ws_B09HZVVCVZ_9855", "instruction": "i would like a sierra blue 13 pro max phone case that has wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "sierra blue", "13 pro max" ] }, "asin": "B09HZVVCVZ" }, { "task_id": "ws_B09NC8GJGN_9856", "instruction": "i'm interested in cupcake picks suitable for a baby shower or birthday party.", "target_attributes": { "attributes": [ "baby shower", "birthday party", "cupcake picks" ], "options": [] }, "asin": "B09NC8GJGN" }, { "task_id": "ws_B09S2YQ1GD_9857", "instruction": "i want to buy short sleeve t-shirts for men which are in yellow color, and of size x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "b-yellow", "x-large" ] }, "asin": "B09S2YQ1GD" }, { "task_id": "ws_B09PGDMPZV_9858", "instruction": "i am looking for short sleeve women t-shirt of xx-large size.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "xx-large" ] }, "asin": "B09PGDMPZV" }, { "task_id": "ws_B08ZSDCQ3N_9859", "instruction": "i would like a 2xl multicolor vest that can be machine washed.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "multi8", "xx-large" ] }, "asin": "B08ZSDCQ3N" }, { "task_id": "ws_B0773BD3L4_9860", "instruction": "i'm looking for 2 packs of peanut butter.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B0773BD3L4" }, { "task_id": "ws_B07RLM48S7_9861", "instruction": "i want to buy lights which are vanity light chandelier, and in brushed oil rubbed bronze color, also i want to have nine lights.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "brushed oil rubbed bronze", "nine-light", "chandelier" ] }, "asin": "B07RLM48S7" }, { "task_id": "ws_B077S9R9KT_9862", "instruction": "i need a variety pack of gmo-free, low carb dessert syrups.", "target_attributes": { "attributes": [ "sugar free", "gmo free" ], "options": [ "variety" ] }, "asin": "B077S9R9KT" }, { "task_id": "ws_B08XJL8V51_9863", "instruction": "i want to find one wide-toothed grooming comb for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "one" ] }, "asin": "B08XJL8V51" }, { "task_id": "ws_B07WF8MSS6_9864", "instruction": "i am looking for a small polyester cotton costumes", "target_attributes": { "attributes": [ "polyester cotton" ], "options": [ "small" ] }, "asin": "B07WF8MSS6" }, { "task_id": "ws_B082MD69W2_9865", "instruction": "i want a white executive chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "white-4 pack" ] }, "asin": "B082MD69W2" }, { "task_id": "ws_B012JRTWBY_9866", "instruction": "i want to buy organic ghee which is non gmo and comes in a pack of 2 at 16 ounces.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "16 ounce (pack of 2)" ] }, "asin": "B012JRTWBY" }, { "task_id": "ws_B07JXSSM6G_9867", "instruction": "i want a microsoft surface pro 4 tablet with intel i5-6300u.", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B07JXSSM6G" }, { "task_id": "ws_B07ZYYS5CK_9868", "instruction": "i'm looking for a woman's xx large black hoodie.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "z2-black", "xx-large" ] }, "asin": "B07ZYYS5CK" }, { "task_id": "ws_B004QQ9LVS_9869", "instruction": "i would like to buy vitamins which are non gmo, and gluten free, and they should be organic womens gummy kind.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "organic womens gummy" ] }, "asin": "B004QQ9LVS" }, { "task_id": "ws_B07KPXWS62_9870", "instruction": "i am looking for black color , 15 size women high heel and pointed toe slip on pumps", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "black", "15" ] }, "asin": "B07KPXWS62" }, { "task_id": "ws_B09R6ZSDFF_9871", "instruction": "i would like a 3xl blue long sleeve polo.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "145- blue", "3x-large" ] }, "asin": "B09R6ZSDFF" }, { "task_id": "ws_B077BG8M3Y_9872", "instruction": "i am looking for a stool set of size 30 inch for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "30 inch" ] }, "asin": "B077BG8M3Y" }, { "task_id": "ws_B01HJWELG0_9873", "instruction": "i need a ten pack of male to male hdmi cables that are gold plated and high speed.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "10 pack", "hdmi male to male" ] }, "asin": "B01HJWELG0" }, { "task_id": "ws_B085NLQ6GV_9874", "instruction": "i want to buy pillow covers which are suitable for living room, and are in dark blue or light grey colors, and i want to have 2 of them with size 12\" x20\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark blue2 | light grey", "2 pieces, 12\" x20\"" ] }, "asin": "B085NLQ6GV" }, { "task_id": "ws_B09P9XB3W9_9875", "instruction": "i want to find a certified organic premium tea gift set.", "target_attributes": { "attributes": [ "certified organic", "gift set" ], "options": [] }, "asin": "B09P9XB3W9" }, { "task_id": "ws_B08R91N3PT_9876", "instruction": "i am looking for a 55 inch high definition ultra thin tv.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "55 inches" ] }, "asin": "B08R91N3PT" }, { "task_id": "ws_B092QP3PQ8_9877", "instruction": "i would like a pink body brush that has a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "pink" ] }, "asin": "B092QP3PQ8" }, { "task_id": "ws_B07CZJZQVT_9878", "instruction": "i am looking for some 18 inch medium brown synthetic hair extensions.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "medium brown", "18 inch (pack of 1)" ] }, "asin": "B07CZJZQVT" }, { "task_id": "ws_B07CZJZQVT_9879", "instruction": "i want dark blonde hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "dark blonde | beach blonde" ] }, "asin": "B07CZJZQVT" }, { "task_id": "ws_B09KNCLX49_9880", "instruction": "i would like a 2xl khaki cardigan that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "khaki", "xx-large" ] }, "asin": "B09KNCLX49" }, { "task_id": "ws_B08532F8QQ_9881", "instruction": "i'm looking for unisex garden clogs shoes.", "target_attributes": { "attributes": [ "anti slip", "quick drying" ], "options": [ "12.5 women | 11 men" ] }, "asin": "B08532F8QQ" }, { "task_id": "ws_B08S2ZDLGT_9882", "instruction": "i want a 90 by 30 desk with a solid wood frame.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "90x30cm | 35.5x12in-woodcolor" ] }, "asin": "B08S2ZDLGT" }, { "task_id": "ws_B08CGY86Z7_9883", "instruction": "i need a high power cable that is color3", "target_attributes": { "attributes": [ "high power" ], "options": [ "color3" ] }, "asin": "B08CGY86Z7" }, { "task_id": "ws_B0971DXLTT_9884", "instruction": "i want to find a set of four vanity lights that are easy to install. they must be gold.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [ "gold", "4 light" ] }, "asin": "B0971DXLTT" }, { "task_id": "ws_B005VP1WA6_9885", "instruction": "i want a gluten free and blueberry coconut rise energy plus bar.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "blueberry coconut" ] }, "asin": "B005VP1WA6" }, { "task_id": "ws_B005VP1WA6_9886", "instruction": "i need a soy free raspberry pomegranate rise energy plus bar.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "raspberry pomegranate" ] }, "asin": "B005VP1WA6" }, { "task_id": "ws_B01M4OCTKU_9887", "instruction": "i'm looking for spring coil mattress.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "queen" ] }, "asin": "B01M4OCTKU" }, { "task_id": "ws_B091DNHMJS_9888", "instruction": "i am looking for navy color x-large womens long sleeve open front cardigan sweaters", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "navy" ] }, "asin": "B091DNHMJS" }, { "task_id": "ws_B09GTWSFKD_9889", "instruction": "i am looking for adjustable and quick release pink color smartwatch strap", "target_attributes": { "attributes": [ "quick release" ], "options": [ "pink" ] }, "asin": "B09GTWSFKD" }, { "task_id": "ws_B0784F82Q5_9890", "instruction": "i'm looking for a tower pc with a high performance", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B0784F82Q5" }, { "task_id": "ws_B0815KZWN7_9891", "instruction": "i want a 44wide by 30 long active fit pants made of quality materials.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "delta - active fit", "44w x 30l big tall" ] }, "asin": "B0815KZWN7" }, { "task_id": "ws_B08KST6KSS_9892", "instruction": "i am looking for ca perfume club fragrance in the 0.17 fl oz travel size.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "0.17 fl oz | 5ml" ] }, "asin": "B08KST6KSS" }, { "task_id": "ws_B08KTR8VX5_9893", "instruction": "i'm locking for 3 packs of nutpods coconut macaroon.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B08KTR8VX5" }, { "task_id": "ws_B0765VSXPX_9894", "instruction": "i am looking for a pair of women's size 11 pumps with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "11" ] }, "asin": "B0765VSXPX" }, { "task_id": "ws_B093YTKGG5_9895", "instruction": "i would like a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YTKGG5" }, { "task_id": "ws_B095CJCQ5J_9896", "instruction": "i need a remote control that has batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B095CJCQ5J" }, { "task_id": "ws_B07J2NP9D9_9897", "instruction": "i would like a 6 inch full size brown bed with a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "brown", "full", "6 inch" ] }, "asin": "B07J2NP9D9" }, { "task_id": "ws_B08SQDPWJ2_9898", "instruction": "i want a silver makeup travel storage case.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "silver" ] }, "asin": "B08SQDPWJ2" }, { "task_id": "ws_B08Y99HCQZ_9899", "instruction": "i am looking for a 63 inch wide by 72 inch long white curtain for my living room.", "target_attributes": { "attributes": [ "white item", "living room" ], "options": [ "63\"w x 72\"l" ] }, "asin": "B08Y99HCQZ" }, { "task_id": "ws_B08ZCV9XVC_9900", "instruction": "i am looking for 36 dirt bike themed cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "36 pcs cupcake toppers" ] }, "asin": "B08ZCV9XVC" }, { "task_id": "ws_B07SJ8WBQ4_9901", "instruction": "i would like a light pink cosmetic case that is space saving.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "light pink | clear" ] }, "asin": "B07SJ8WBQ4" }, { "task_id": "ws_B09NQC61MF_9902", "instruction": "i want to find a plus-sized medium short-sleeve top for women in navy.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "tops for women -a158-navy", "medium" ] }, "asin": "B09NQC61MF" }, { "task_id": "ws_B015OA6FYA_9903", "instruction": "find this product : gomacro macrobar organic vegan protein bars - oatmeal chocolate chip butter (2.4 oz. bars, 12 count) gluten free high protein.", "target_attributes": { "attributes": [ "plant based", "high protein", "non gmo" ], "options": [ "oatmeal chocolate chip" ] }, "asin": "B015OA6FYA" }, { "task_id": "ws_B09MFGFQYZ_9904", "instruction": "i want highlighting caps for dyeing hair. it should be easy to use.", "target_attributes": { "attributes": [ "easy use", "hair dye" ], "options": [] }, "asin": "B09MFGFQYZ" }, { "task_id": "ws_B07KVDKBP4_9905", "instruction": "i am looking for a pack of one heavy duty nail clippers", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "22 inch (pack of 1)" ] }, "asin": "B07KVDKBP4" }, { "task_id": "ws_B08N2WX2ZL_9906", "instruction": "i would like to get a mint and matcha tea lip balm that is certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "mint & matcha tea caffeinated" ] }, "asin": "B08N2WX2ZL" }, { "task_id": "ws_B09P3K78W9_9907", "instruction": "i am looking for a set of white hands free and fast charging ear buds with a charging case.", "target_attributes": { "attributes": [ "fast charging", "hands free" ], "options": [ "white" ] }, "asin": "B09P3K78W9" }, { "task_id": "ws_B084GF52VR_9908", "instruction": "i am interested in buying hdmi display cable which is gold plated and provides high speed.", "target_attributes": { "attributes": [ "gold plated", "high speed" ], "options": [] }, "asin": "B084GF52VR" }, { "task_id": "ws_B0046NEY9A_9909", "instruction": "i'm looking for 1 pack of permanent hair dye for my husband; i want the jet black colour but it must make his hair look natural.", "target_attributes": { "attributes": [ "permanent hair", "hair dye", "natural hair" ], "options": [ "jet black", "1 count (pack of 1)" ] }, "asin": "B0046NEY9A" }, { "task_id": "ws_B08DY4RS68_9910", "instruction": "i am looking for a solid wood chaise lounge for my living room.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [] }, "asin": "B08DY4RS68" }, { "task_id": "ws_B09H64NQRY_9911", "instruction": "i'm looking for premium chunk chicken fully cooked in 12.5 oz (pack of 6)", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "12.5 ounce (pack of 6)" ] }, "asin": "B09H64NQRY" }, { "task_id": "ws_B079TZX2S9_9912", "instruction": "looking for relaxed fit men's dark pajamas with checker pant", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "with checker pant" ] }, "asin": "B079TZX2S9" }, { "task_id": "ws_B081VZDSFQ_9913", "instruction": "i'm looking for a stainless steel dental scaler.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B081VZDSFQ" }, { "task_id": "ws_B085317T22_9914", "instruction": "i want to buy a black colred heavy duty bok case which is easy to assemble and has ample storage space.", "target_attributes": { "attributes": [ "heavy duty", "storage space" ], "options": [ "black" ] }, "asin": "B085317T22" }, { "task_id": "ws_B09PBDFYCR_9915", "instruction": "i'm looking for a women's long sleeve t-shirt in size medium. choose the ones that come in color n04-black.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "n04-black", "medium" ] }, "asin": "B09PBDFYCR" }, { "task_id": "ws_B07NDJPRQM_9916", "instruction": "i'm looking for tov ultra modern furniture barstool.", "target_attributes": { "attributes": [ "wood frame" ], "options": [ "blush", "barstool" ] }, "asin": "B07NDJPRQM" }, { "task_id": "ws_B09N3411B9_9917", "instruction": "i am looking for panoramic ballhead easy install tripod camera mount", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09N3411B9" }, { "task_id": "ws_B07CH4CN3M_9918", "instruction": "i am looking for 4.69 ounce (pack of 4) hand crafted cinnamon caramel flavoured chewy butter caramel candies", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "cinnamon caramel", "4.69 ounce (pack of 4)" ] }, "asin": "B07CH4CN3M" }, { "task_id": "ws_B06X1FP7ZC_9919", "instruction": "i am looking for a green tea facial scrub.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B06X1FP7ZC" }, { "task_id": "ws_B07Y2BP5KF_9920", "instruction": "i am looking for some sugar free sriracha bacon jerky.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "sriracha bacon jerky" ] }, "asin": "B07Y2BP5KF" }, { "task_id": "ws_B078MPXY9Z_9921", "instruction": "i would like deep concealer for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "deep (n)" ] }, "asin": "B078MPXY9Z" }, { "task_id": "ws_B096S1HNZ2_9922", "instruction": "i'm looking for mid century sofa sleeper for living room.", "target_attributes": { "attributes": [ "mid century", "metal legs", "living room" ], "options": [ "pink ii" ] }, "asin": "B096S1HNZ2" }, { "task_id": "ws_B083GQMJS3_9923", "instruction": "i need a purple eyeshadow set", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "florescence+purple" ] }, "asin": "B083GQMJS3" }, { "task_id": "ws_B089QCVX27_9924", "instruction": "i want to find a glass tempered screen protector for my huawei p30 lite.", "target_attributes": { "attributes": [ "tempered glass", "glass screen" ], "options": [ "huawei p30 lite" ] }, "asin": "B089QCVX27" }, { "task_id": "ws_B08QN2KKFG_9925", "instruction": "i want the noise cancelling bluetooth earbuds,kurdene wireless earbuds with wireless charging case and the color should be wathet", "target_attributes": { "attributes": [ "noise cancelling", "wireless charging" ], "options": [ "wathet" ] }, "asin": "B08QN2KKFG" }, { "task_id": "ws_B08M9Q7987_9926", "instruction": "i am looking for some pink cupcake toppers for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "pink" ] }, "asin": "B08M9Q7987" }, { "task_id": "ws_B09MZFJPNY_9927", "instruction": "i want to buy sleepwear for women which have elastic waist and are of black color, while also their size should be large.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "black", "large" ] }, "asin": "B09MZFJPNY" }, { "task_id": "ws_B071XFS47L_9928", "instruction": "i would like a small short signal green track pant with a elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "legacy blue | signal green", "small short" ] }, "asin": "B071XFS47L" }, { "task_id": "ws_B09C8BWZMP_9929", "instruction": "i'm looking for a mini desktop pc with an aluminum alloy case that also has 8 gb of ram and a 240 gb ssd.", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "8g ram 240g ssd" ] }, "asin": "B09C8BWZMP" }, { "task_id": "ws_B08BNKV89Y_9930", "instruction": "i'm looking for a quad-core i5 touchscreen laptop computer; specifically with 16 gig ddr4 and 512 gig pcie ssd.", "target_attributes": { "attributes": [ "core i5", "quad core" ], "options": [ "16gb ddr4 ram, 512gb pcie ssd" ] }, "asin": "B08BNKV89Y" }, { "task_id": "ws_B07Q4J16Y3_9931", "instruction": "i am looking for video recording camera that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B07Q4J16Y3" }, { "task_id": "ws_B09H7HMN8Y_9932", "instruction": "i'm looking for lumbar tassel tufted pillow covers.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09H7HMN8Y" }, { "task_id": "ws_B09NNBX2SG_9933", "instruction": "i'm looking for a woman's long sleeve shirt in a size 5 extra large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "5x-large" ] }, "asin": "B09NNBX2SG" }, { "task_id": "ws_B091BSPMBZ_9934", "instruction": "i would like a pink hair cutting kit that is easy to use", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B091BSPMBZ" }, { "task_id": "ws_B08PCMR38S_9935", "instruction": "i'm looking for a rich and creamy low carb ice cream. choose the ones that are best seller.", "target_attributes": { "attributes": [ "rich creamy", "low carb" ], "options": [ "best seller" ] }, "asin": "B08PCMR38S" }, { "task_id": "ws_B09JDN73YG_9936", "instruction": "i would like a color s tongue cleaner for oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "s" ] }, "asin": "B09JDN73YG" }, { "task_id": "ws_B01N94VSXH_9937", "instruction": "i am looking for some high quality glitter nail polish that is paraben free.", "target_attributes": { "attributes": [ "paraben free", "high quality" ], "options": [ "glitter" ] }, "asin": "B01N94VSXH" }, { "task_id": "ws_B087JT4GX1_9938", "instruction": "gold plated micro hdmi to hdmi cable size 50 cm", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "50cm" ] }, "asin": "B087JT4GX1" }, { "task_id": "ws_B07KPY6BKG_9939", "instruction": "i want a silver plug and play usb c headphone & microphone adapter.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "silver" ] }, "asin": "B07KPY6BKG" }, { "task_id": "ws_B08CDV9Y5D_9940", "instruction": "i'm looking for waterproof wildlife hunting trail camera.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B08CDV9Y5D" }, { "task_id": "ws_B0756MBLNX_9941", "instruction": "i want a bottle of handcraft ginger tea tree essential oil.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "ginger" ] }, "asin": "B0756MBLNX" }, { "task_id": "ws_B0725MDPPC_9942", "instruction": "looking for high gloss contemporary night stand with stainless steel base and handles also choose colour white", "target_attributes": { "attributes": [ "high gloss", "stainless steel" ], "options": [ "white" ] }, "asin": "B0725MDPPC" }, { "task_id": "ws_B013D2ME9Q_9943", "instruction": "i am looking for a men's short sleeve denim blue shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "denim blue" ] }, "asin": "B013D2ME9Q" }, { "task_id": "ws_B00WONI1AW_9944", "instruction": "i want cecemed stop hair loss shampoo.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B00WONI1AW" }, { "task_id": "ws_B0936QYXV4_9945", "instruction": "i need color corrector for my hair salon", "target_attributes": { "attributes": [ "hair salon" ], "options": [] }, "asin": "B0936QYXV4" }, { "task_id": "ws_B09MQLBLDJ_9946", "instruction": "i am looking for light weight background having color a6.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a6" ] }, "asin": "B09MQLBLDJ" }, { "task_id": "ws_B06XYDTR2G_9947", "instruction": "i am interested in buying cleansing water which is suitable for dry skin and it's dermatologist tested.", "target_attributes": { "attributes": [ "dermatologist tested", "dry skin" ], "options": [] }, "asin": "B06XYDTR2G" }, { "task_id": "ws_B099231V35_9948", "instruction": "hello, i'm looking for a pair of cargo pants for everyday casual wear? but also hiking-friendly. also, i want an orange pair please", "target_attributes": { "attributes": [ "relaxed fit", "everyday wear" ], "options": [ "orange" ] }, "asin": "B099231V35" }, { "task_id": "ws_B08THJGF1Z_9949", "instruction": "i want a color a cotton pad for eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "a" ] }, "asin": "B08THJGF1Z" }, { "task_id": "ws_B09B12G3TT_9950", "instruction": "i would like a 28 inch by 44 inch style 24 poster that is ready to hang in the living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "style_24", "28\" x 44\"" ] }, "asin": "B09B12G3TT" }, { "task_id": "ws_B096RWXX6S_9951", "instruction": "i would like some party supplies that are cupcake toppers.", "target_attributes": { "attributes": [ "party supplies" ], "options": [] }, "asin": "B096RWXX6S" }, { "task_id": "ws_B07CKT4CKB_9952", "instruction": "i want love beauty argan oil and lavender tea tree conditioner.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "argan oil and lavender" ] }, "asin": "B07CKT4CKB" }, { "task_id": "ws_B0872G9J57_9953", "instruction": "i am looking for resilient memory foam loveseat sofa", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "loveseat" ] }, "asin": "B0872G9J57" }, { "task_id": "ws_B089SFCL8R_9954", "instruction": "i am looking for light weight backgrounds of size 12x10ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "12x10ft" ] }, "asin": "B089SFCL8R" }, { "task_id": "ws_B09R752WN9_9955", "instruction": "i am looking for a 2 pack of fresh breath whitening toothpaste.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [ "2pcs" ] }, "asin": "B09R752WN9" }, { "task_id": "ws_B0119ZOERO_9956", "instruction": "i want a mid century adesso table lamp.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "table lamp" ] }, "asin": "B0119ZOERO" }, { "task_id": "ws_B008QZZ88K_9957", "instruction": "i'm looking for 67.5 ounce cheez-it snack pack.", "target_attributes": { "attributes": [ "ready eat" ], "options": [] }, "asin": "B008QZZ88K" }, { "task_id": "ws_B09Q8WGZ3P_9958", "instruction": "i want to find an xx-large pair of green women's leggings with a high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "green", "xx-large" ] }, "asin": "B09Q8WGZ3P" }, { "task_id": "ws_B09C6N4FVH_9959", "instruction": "i want to find some poster prints that i can put in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09C6N4FVH" }, { "task_id": "ws_B0049W9M5E_9960", "instruction": "i'm looking for sugar-free double mocha cappuccino mix.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "12 ounce (pack of 6)" ] }, "asin": "B0049W9M5E" }, { "task_id": "ws_B0718XF1ZZ_9961", "instruction": "i'm looking for a replacement remote for my sound bar that includes triple a batteries. i need the color \"xrt303 mgo.\"", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [ "xrt303 mgo" ] }, "asin": "B0718XF1ZZ" }, { "task_id": "ws_B09QX1RW8H_9962", "instruction": "i would like a toothpaste for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09QX1RW8H" }, { "task_id": "ws_B0929KGQWQ_9963", "instruction": "i'm looking for a peanut crunch popcorn that could be a perfect gift for my friend.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [] }, "asin": "B0929KGQWQ" }, { "task_id": "ws_B01MSELGR6_9964", "instruction": "i would like a high def gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated", "high definition" ], "options": [] }, "asin": "B01MSELGR6" }, { "task_id": "ws_B08Q3NCBHP_9965", "instruction": "i'm looking for shoot digital camera with inspire digital cloth.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B08Q3NCBHP" }, { "task_id": "ws_B08FDC82VY_9966", "instruction": "i want to find professional binoculars that are easy to carry for birdwatching.", "target_attributes": { "attributes": [ "easy carry", "bird watching" ], "options": [] }, "asin": "B08FDC82VY" }, { "task_id": "ws_B0147DG6YE_9967", "instruction": "i am looking for a tablet with a quad core processor and 4g lte.", "target_attributes": { "attributes": [ "quad core", "4g lte" ], "options": [] }, "asin": "B0147DG6YE" }, { "task_id": "ws_B079VM1R2M_9968", "instruction": "i'm interested in some gold-plated white patio speakers in size 5'' 8\u03c9 | 70v that are easy to install.", "target_attributes": { "attributes": [ "gold plated", "easy install" ], "options": [ "white", "5'' 8\u03c9 | 70v" ] }, "asin": "B079VM1R2M" }, { "task_id": "ws_B09M78CSZY_9969", "instruction": "i am looking for 8.5 size green color low heel day comfort short ankle booties for women", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "x02-green", "8.5" ] }, "asin": "B09M78CSZY" }, { "task_id": "ws_B08TB3LLT1_9970", "instruction": "i'm looking for a handmade chocolate malt balls.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [] }, "asin": "B08TB3LLT1" }, { "task_id": "ws_B08Y6W6VTW_9971", "instruction": "i want a pair of black earbud headphones that are water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "black" ] }, "asin": "B08Y6W6VTW" }, { "task_id": "ws_B07YZQYBVN_9972", "instruction": "i want water proof australian gold continuous spray sunscreen with instant bronzer spf 50.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "spf 50" ] }, "asin": "B07YZQYBVN" }, { "task_id": "ws_B093C69MX2_9973", "instruction": "i'd like a couple of packs of meal replacement shakes to satisfy my high-protein, gluten-free diet; i prefer a natural chocolate flavour.", "target_attributes": { "attributes": [ "gluten free", "natural flavors" ], "options": [ "chocolate", "2 pack" ] }, "asin": "B093C69MX2" }, { "task_id": "ws_B09NZS1VH9_9974", "instruction": "i'm looking for a pair of women's non slip work boots with steel toe cap. choose the ones that come in size 9 us.", "target_attributes": { "attributes": [ "non slip", "steel toe" ], "options": [ "9 us" ] }, "asin": "B09NZS1VH9" }, { "task_id": "ws_B09HH8HK2X_9975", "instruction": "i would like a white end table with one drawer and 4 basket cabinet for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white", "1 drawer & 4 baskets cabinet" ] }, "asin": "B09HH8HK2X" }, { "task_id": "ws_B09PNKG7G4_9976", "instruction": "i'm looking for a full xl sized, ready to use brown mattress.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "brown" ] }, "asin": "B09PNKG7G4" }, { "task_id": "ws_B07STLK5DH_9977", "instruction": "i want to buy an ivory and blue area rug that's eight feet long and has a contemporary design.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "ivory | blue", "2'3\" x 8'" ] }, "asin": "B07STLK5DH" }, { "task_id": "ws_B08P3YR3TZ_9978", "instruction": "i am looking for long lasting pressed powder in the color ivory.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "1- pressed powder, ivory" ] }, "asin": "B08P3YR3TZ" }, { "task_id": "ws_B0937GRTF5_9979", "instruction": "i want princess makeanni the pooh cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "princess" ] }, "asin": "B0937GRTF5" }, { "task_id": "ws_B09PLJMDG2_9980", "instruction": "i'm looking for a brown, twin size bed frame.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "brown" ] }, "asin": "B09PLJMDG2" }, { "task_id": "ws_B07NP6TDRC_9981", "instruction": "i would like a four fluid ounce very dark self tanner that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "very dark", "4 fl oz (pack of 1)" ] }, "asin": "B07NP6TDRC" }, { "task_id": "ws_B09JTZ2229_9982", "instruction": "i am interested in buying make up foundation which is tested by dermatologist, and is of golden beige color.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "golden beige" ] }, "asin": "B09JTZ2229" }, { "task_id": "ws_B09MD6V3YM_9983", "instruction": "i would like a blue mascara brush that applies easily.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "blue" ] }, "asin": "B09MD6V3YM" }, { "task_id": "ws_B08H6FZ4PH_9984", "instruction": "i would like a on the rise volume liftscara eyeshadow that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "on the rise volume liftscara" ] }, "asin": "B08H6FZ4PH" }, { "task_id": "ws_B0949JWNZ2_9985", "instruction": "i want a bpa free bottle for makeup.", "target_attributes": { "attributes": [ "bpa free" ], "options": [] }, "asin": "B0949JWNZ2" }, { "task_id": "ws_B09BQMH7P7_9986", "instruction": "i am looking for synthetic black gray 101 color hair extensions wig hairpiece", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "101" ] }, "asin": "B09BQMH7P7" }, { "task_id": "ws_B0185LC8YG_9987", "instruction": "i'm looking for permanent hair dye color in #c cool darkest brown.", "target_attributes": { "attributes": [ "permanent hair", "hair dye" ], "options": [] }, "asin": "B0185LC8YG" }, { "task_id": "ws_B0185LC8YG_9988", "instruction": "i am looking for a long lasting hair color that is light brown and comes in a pack of three.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "6 light brown", "pack of 3" ] }, "asin": "B0185LC8YG" }, { "task_id": "ws_B07JVP58VR_9989", "instruction": "i am looking for a gluten free happy hamlet bacon salt gourmet rub.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "happy hamlet bacon salt" ] }, "asin": "B07JVP58VR" }, { "task_id": "ws_B09BMXK1WD_9990", "instruction": "can i request some high performance speakers? also, can you pick the ones that come in white please?", "target_attributes": { "attributes": [ "high performance" ], "options": [ "white" ] }, "asin": "B09BMXK1WD" }, { "task_id": "ws_B07B9K659S_9991", "instruction": "i want a 1.5 foot long black gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "black", "1.5ft" ] }, "asin": "B07B9K659S" }, { "task_id": "ws_B09MNLV2NY_9992", "instruction": "looking for table sofa table for kitchen dining room and also choose colour antique blue", "target_attributes": { "attributes": [ "dining room" ], "options": [ "antique blue-5" ] }, "asin": "B09MNLV2NY" }, { "task_id": "ws_B099MC8XFB_9993", "instruction": "i want small and cotton spandex men's jogger pants.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "small" ] }, "asin": "B099MC8XFB" }, { "task_id": "ws_B09J3B6XR7_9994", "instruction": "i am looking for lemongrass eucalyptus & cinnamon apple color candles that are lead free.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "lemongrass eucalyptus & cinnamon apple" ] }, "asin": "B09J3B6XR7" }, { "task_id": "ws_B083Q84GLC_9995", "instruction": "i am looking for light weight wall backgrounds of size 12x8ft.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "12x8ft" ] }, "asin": "B083Q84GLC" }, { "task_id": "ws_B076C1LL7R_9996", "instruction": "i'm looking for anti-aging face and eye serum in the 1.01 ounce size.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "1.01 ounce lifting & renewing" ] }, "asin": "B076C1LL7R" }, { "task_id": "ws_B08DR2HW2Y_9997", "instruction": "i need a wireless usb charging cable for my boombox; make sure it has adequate output protection.", "target_attributes": { "attributes": [ "output protection", "wireless bluetooth" ], "options": [] }, "asin": "B08DR2HW2Y" }, { "task_id": "ws_B09JL6P8H6_9998", "instruction": "help me find a 3-pack of soft and chewy licorice candy twists; i'd like a variety of flavours but it must be fat-free.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "variety flavor pack", "10 ounce (pack of 3)" ] }, "asin": "B09JL6P8H6" }, { "task_id": "ws_B004YAUZQG_9999", "instruction": "i would like a 8 fluid ounce bottle of tea tree lotion.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "8 fl oz (pack of 1)", "lotion" ] }, "asin": "B004YAUZQG" }, { "task_id": "ws_B09QMQM1S3_10000", "instruction": "i need easy apply pine tar scented mustache wax stick for men", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "pine tar" ] }, "asin": "B09QMQM1S3" }, { "task_id": "ws_B09SV1J5KS_10001", "instruction": "i am looking for tea tree shampoo for natural hair.", "target_attributes": { "attributes": [ "tea tree", "natural hair" ], "options": [] }, "asin": "B09SV1J5KS" }, { "task_id": "ws_B07H86WY2Y_10002", "instruction": "i'm looking for a quick-release replacement fitness strap band; it should match my chic teal fitbit.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "chic teal" ] }, "asin": "B07H86WY2Y" }, { "task_id": "ws_B09MZQ6HD5_10003", "instruction": "i'm looking for a hdmi splitter 1 in 2 out auto scaling.", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B09MZQ6HD5" }, { "task_id": "ws_B01KUTWRY2_10004", "instruction": "i'm looking for a 12 pack pepper jack gluten free cheese.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "pepper jack", "12 pack" ] }, "asin": "B01KUTWRY2" }, { "task_id": "ws_B01GY2FOPS_10005", "instruction": "vegan makeup free from animal testing", "target_attributes": { "attributes": [ "animal testing" ], "options": [] }, "asin": "B01GY2FOPS" }, { "task_id": "ws_B09C1R93CH_10006", "instruction": "i am looking for teeth whitening toothpaste of color d.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "d" ] }, "asin": "B09C1R93CH" }, { "task_id": "ws_B0722MVPVD_10007", "instruction": "i'm looking for a cruelty free, face highlighter in a unicorn style color.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "unicorn" ] }, "asin": "B0722MVPVD" }, { "task_id": "ws_B099JWWV1V_10008", "instruction": "i am looking for easy to use thanksgiving themed cupcake toppers.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B099JWWV1V" }, { "task_id": "ws_B096QMCF7P_10009", "instruction": "i want to find a monocular telescope for bird-watching that is 12 inches in width and 50 inches in height.", "target_attributes": { "attributes": [ "bird watching" ], "options": [ "12*50" ] }, "asin": "B096QMCF7P" }, { "task_id": "ws_B07KKBTHSX_10010", "instruction": "i am looking for a heavy duty universal projector case.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B07KKBTHSX" }, { "task_id": "ws_B0928K612B_10011", "instruction": "i am looking for a 2-pack of the fanyate antique vanity light fixtures.", "target_attributes": { "attributes": [ "vanity light", "light fixture" ], "options": [ "2-pack" ] }, "asin": "B0928K612B" }, { "task_id": "ws_B092X4HR76_10012", "instruction": "i would like a intel core i5 desktop mini.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B092X4HR76" }, { "task_id": "ws_B09BRDD7XJ_10013", "instruction": "i'm locking for a smiley face non-slip cushioned slippers.", "target_attributes": { "attributes": [ "non slip", "quick drying" ], "options": [] }, "asin": "B09BRDD7XJ" }, { "task_id": "ws_B092J891H7_10014", "instruction": "i am looking for a teal color stainlesss steel strap.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "teal" ] }, "asin": "B092J891H7" }, { "task_id": "ws_B00PQ4RM5G_10015", "instruction": "i need gluten free popcorn", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B00PQ4RM5G" }, { "task_id": "ws_B08665MY24_10016", "instruction": "i am looking for a long lasting gel capsule for fresh breath.", "target_attributes": { "attributes": [ "long lasting", "fresh breath" ], "options": [] }, "asin": "B08665MY24" }, { "task_id": "ws_B097TSZJCM_10017", "instruction": "i am lookng for hot chocolate mix gift set for gift set in valentine heart box", "target_attributes": { "attributes": [ "gift set" ], "options": [ "valentine heart box" ] }, "asin": "B097TSZJCM" }, { "task_id": "ws_B082CX8PNK_10018", "instruction": "i'm looking for a pair of woman's olive camo yoga pants that are worn high on the waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "olive camo" ] }, "asin": "B082CX8PNK" }, { "task_id": "ws_B08679CMWM_10019", "instruction": "i am lookng for a medium size orange color elastic waistband workout gym yoga shorts for men", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "21grey&orange", "medium" ] }, "asin": "B08679CMWM" }, { "task_id": "ws_B09T37VZCK_10020", "instruction": "i need some high quality covers for a massage bed in my beauty salon; it's 71 x 24 inches and i'd prefer the \"c\" colour.", "target_attributes": { "attributes": [ "high quality", "beauty salon" ], "options": [ "c", "180x60cm(71x24inch)" ] }, "asin": "B09T37VZCK" }, { "task_id": "ws_B09SXRJYN6_10021", "instruction": "i would like a black face kit with green tea.", "target_attributes": { "attributes": [ "green tea" ], "options": [ "black" ] }, "asin": "B09SXRJYN6" }, { "task_id": "ws_B08PTLBGKR_10022", "instruction": "i am looking for easy to use travel bottles.", "target_attributes": { "attributes": [ "easy use", "travel bottles" ], "options": [] }, "asin": "B08PTLBGKR" }, { "task_id": "ws_B07D7HXBJS_10023", "instruction": "i'm looking for chocolate flavored low calorie, keto friendly protein drinks.", "target_attributes": { "attributes": [ "low calorie", "keto friendly" ], "options": [ "chocolate" ] }, "asin": "B07D7HXBJS" }, { "task_id": "ws_B08BN4RGSP_10024", "instruction": "i'm looking for a gift set with an eight ounce bottle of cinnamon dip.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "cinnamon", "8 fl oz (pack of 1)" ] }, "asin": "B08BN4RGSP" }, { "task_id": "ws_B093YVJSWF_10025", "instruction": "i would like a laundry bag.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YVJSWF" }, { "task_id": "ws_B097XG5RSW_10026", "instruction": "i need to order some gold cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "c-60 gold" ] }, "asin": "B097XG5RSW" }, { "task_id": "ws_B09922X9JM_10027", "instruction": "i want khaki knee high boots for women.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "z2-khaki" ] }, "asin": "B09922X9JM" }, { "task_id": "ws_B00M9Y5V4A_10028", "instruction": "i want to find a pair of brown men's box shoes with rubber soles. they should be a size 11.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown | hanging", "11" ] }, "asin": "B00M9Y5V4A" }, { "task_id": "ws_B0986QC9Q7_10029", "instruction": "i'm looking for some wild caught solid white albacore. it should be non-gmo and come in five ounce cans. i want to buy a pack of forty-eight.", "target_attributes": { "attributes": [ "wild caught", "non gmo" ], "options": [ "solid white albacore", "5 ounce (pack of 48)" ] }, "asin": "B0986QC9Q7" }, { "task_id": "ws_B07N7WFZVZ_10030", "instruction": "i need a fluoride free toothpaste", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B07N7WFZVZ" }, { "task_id": "ws_B0080AS25W_10031", "instruction": "look for trader joe's meyer lemon cookie thins 9oz (255g) my favorite, i really want it, help me if you can.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B0080AS25W" }, { "task_id": "ws_B098YPWXJ5_10032", "instruction": "i need synthetic sole flats that are blush colored", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "blush" ] }, "asin": "B098YPWXJ5" }, { "task_id": "ws_B09MQB5DVB_10033", "instruction": "i want to find a storage basket that i can put in my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09MQB5DVB" }, { "task_id": "ws_B08JMCB1QF_10034", "instruction": "i want white and light weight adidas men's duramo shoes.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "white | black | black" ] }, "asin": "B08JMCB1QF" }, { "task_id": "ws_B07Z647R7C_10035", "instruction": "i need a wall lamp with clear glass.", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B07Z647R7C" }, { "task_id": "ws_B09NN2QPRG_10036", "instruction": "am hoping to find interestprint men's lightweight sleep lounge pajama pants machine wash and small size", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "small" ] }, "asin": "B09NN2QPRG" }, { "task_id": "ws_B07MBFWHQ3_10037", "instruction": "i'm looking for an x-large, short sleeve top for daily wear in pink with a loose fit.", "target_attributes": { "attributes": [ "loose fit", "short sleeve", "daily wear" ], "options": [ "07 pink", "x-large" ] }, "asin": "B07MBFWHQ3" }, { "task_id": "ws_B09SFC3ZLS_10038", "instruction": "i'm interested in a power amplifier board that is easy to install.", "target_attributes": { "attributes": [ "power amplifier", "easy install" ], "options": [] }, "asin": "B09SFC3ZLS" }, { "task_id": "ws_B09MLNYZDQ_10039", "instruction": "i'm looking for a birthday cake for a 5 year old boy that features marvel heroes.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B09MLNYZDQ" }, { "task_id": "ws_B07G6ZG582_10040", "instruction": "i'm locking for a long sleeve loose plain casual dress with pockets.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B07G6ZG582" }, { "task_id": "ws_B07BLYRFR9_10041", "instruction": "i am looking for a 7 foot by 7 foot light weight and easy to carry fairytale themed photography background.", "target_attributes": { "attributes": [ "light weight", "easy carry" ], "options": [ "7x7ft" ] }, "asin": "B07BLYRFR9" }, { "task_id": "ws_B001KUSZ1A_10042", "instruction": "i need a long usb cable with speed in the beige color.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "beige" ] }, "asin": "B001KUSZ1A" }, { "task_id": "ws_B09K3TMTY4_10043", "instruction": "i would like a black 63\" entertainment center that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "black-63\"" ] }, "asin": "B09K3TMTY4" }, { "task_id": "ws_B09LXVF5RR_10044", "instruction": "i want a wireless bluetooth headset.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09LXVF5RR" }, { "task_id": "ws_B0889MHYWT_10045", "instruction": "i'm looking for beef jerky with a sweet smoked flavor that is high in protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "sweet smoked" ] }, "asin": "B0889MHYWT" }, { "task_id": "ws_B07MHGDC71_10046", "instruction": "i would like a resealable bag of peanut brittle.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [] }, "asin": "B07MHGDC71" }, { "task_id": "ws_B00LGRXL2K_10047", "instruction": "i want to find in the color deep pink men's wool jogger pants brand southpole model active basic. be quick in your help i'm waiting. that can be machine washed", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "deep pink" ] }, "asin": "B00LGRXL2K" }, { "task_id": "ws_B089GKSZH7_10048", "instruction": "i want an lnafirenze and highly pigmented matte liquid lipstick set.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [ "lnafirenze" ] }, "asin": "B089GKSZH7" }, { "task_id": "ws_B089GKSZH7_10049", "instruction": "i am looking high quality waterproof highly pigmented easy apply cruelty free long lasting lip glosses inafirenze pattern", "target_attributes": { "attributes": [ "highly pigmented", "easy apply", "cruelty free" ], "options": [ "lnafirenze" ] }, "asin": "B089GKSZH7" }, { "task_id": "ws_B09H3Z8QVF_10050", "instruction": "i am looking for a high power high definition sound bars", "target_attributes": { "attributes": [ "high power", "high definition" ], "options": [] }, "asin": "B09H3Z8QVF" }, { "task_id": "ws_B081N4PHWC_10051", "instruction": "i want a curly hair black brown synthetic hairpiece.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "2# black brown-8\" (black cap)", "curly hair-inseparable" ] }, "asin": "B081N4PHWC" }, { "task_id": "ws_B08R1PD541_10052", "instruction": "i want to buy cake toppers suitable for a baby shower event.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B08R1PD541" }, { "task_id": "ws_B09R29WVRM_10053", "instruction": "i want an espresso prepac astrid 6 drawer solid wood tall chest.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "espresso" ] }, "asin": "B09R29WVRM" }, { "task_id": "ws_B00AW98LMI_10054", "instruction": "i want a biscuit revlon colorstay concealer for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "biscuit" ] }, "asin": "B00AW98LMI" }, { "task_id": "ws_B08XWZSS3T_10055", "instruction": "i need a 38mm smartwatch case with glass screen", "target_attributes": { "attributes": [ "glass screen" ], "options": [ "38 mm" ] }, "asin": "B08XWZSS3T" }, { "task_id": "ws_B08GKKTMP9_10056", "instruction": "i would like easy to apply halloween temp zombie tattoos", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "zombie tattoos" ] }, "asin": "B08GKKTMP9" }, { "task_id": "ws_B09NQC8SNJ_10057", "instruction": "i am looking for a small slim fit nightgowns & sleepshirts", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "small" ] }, "asin": "B09NQC8SNJ" }, { "task_id": "ws_B09PNGB456_10058", "instruction": "i want a abstract wall art with the boho color", "target_attributes": { "attributes": [ "dining room" ], "options": [ "boho decor abstract wall art" ] }, "asin": "B09PNGB456" }, { "task_id": "ws_B08F5G34L1_10059", "instruction": "i want a pair of 7.5 gray shoes with moisture wicking.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "grey | black | white", "7.5" ] }, "asin": "B08F5G34L1" }, { "task_id": "ws_B09KXVVQ88_10060", "instruction": "i would like a high resolution tablet", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B09KXVVQ88" }, { "task_id": "ws_B08M5XCD52_10061", "instruction": "i want xx-large biker shorts for women high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "xx-large" ] }, "asin": "B08M5XCD52" }, { "task_id": "ws_B00ME8CKBS_10062", "instruction": "search for an ac adapter with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B00ME8CKBS" }, { "task_id": "ws_B0742LVGX7_10063", "instruction": "i want to buy a skin cream which is fragrance free and it is for smoothing eye contour.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "smoothing eye contour" ] }, "asin": "B0742LVGX7" }, { "task_id": "ws_B09J13M3P9_10064", "instruction": "i would like a 69 wide by 36 tall gray roller shade that is eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "gray light filtering", "69w x 36h" ] }, "asin": "B09J13M3P9" }, { "task_id": "ws_B07CMWK5SV_10065", "instruction": "i am looking for short sleeve medium size blush t shirt tops blouse for women", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "blush", "medium" ] }, "asin": "B07CMWK5SV" }, { "task_id": "ws_B08QJ9WXGB_10066", "instruction": "i'm looking for a band for my apple watch that will fit at 38, 40 or 41mm that is easy for me to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "38mm | 40mm | 41mm" ] }, "asin": "B08QJ9WXGB" }, { "task_id": "ws_B08QJ9WXGB_10067", "instruction": "i am looking for stretchy band compatible with apple watch band 42mm", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "42mm | 44mm | 45mm" ] }, "asin": "B08QJ9WXGB" }, { "task_id": "ws_B07ZQBJFK4_10068", "instruction": "i am looking for a pair of women's red and green machine washable pants with pockets.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "red+green" ] }, "asin": "B07ZQBJFK4" }, { "task_id": "ws_B06XQV18WL_10069", "instruction": "i want to find a beige set of blackout curtains that are 54 inches in width and 72 inches in length for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige", "w54 x l72" ] }, "asin": "B06XQV18WL" }, { "task_id": "ws_B096RTNQFS_10070", "instruction": "i'm looking for an easy to use case for iphone 12 pro max in color black.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "black" ] }, "asin": "B096RTNQFS" }, { "task_id": "ws_B0978XC32J_10071", "instruction": "i am interested in buying sparkling water which is made of simple ingredients and has raspberry lime flavor.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "raspberry lime" ] }, "asin": "B0978XC32J" }, { "task_id": "ws_B0978XC32J_10072", "instruction": "i am looking for gluten free water. please choose black cherry flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "black cherry" ] }, "asin": "B0978XC32J" }, { "task_id": "ws_B08YDPFDJL_10073", "instruction": "i want to buy a cable for guitar which is gold plated is a splitter cord with a length of 50ft.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "1 | 8 to 2x1 | 4 y splitter cord", "50ft" ] }, "asin": "B08YDPFDJL" }, { "task_id": "ws_B09MZLPKFJ_10074", "instruction": "i am looking for a 4 pack of white chocolate macadamia cookies that are chipmonk cookies brand, low carb and gluten free.", "target_attributes": { "attributes": [ "low carb", "gluten free" ], "options": [ "white chocolate macadamia", "4 pack" ] }, "asin": "B09MZLPKFJ" }, { "task_id": "ws_B09263DSYV_10075", "instruction": "screen protector: 41\"w x 72\"h easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "41\"w x 72\"h" ] }, "asin": "B09263DSYV" }, { "task_id": "ws_B01M6YL425_10076", "instruction": "i am looking for white color floor lamps having bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "white | white" ] }, "asin": "B01M6YL425" }, { "task_id": "ws_B01FR6K40C_10077", "instruction": "looking for keto friendly jumbo sunflower seeds", "target_attributes": { "attributes": [ "keto friendly" ], "options": [] }, "asin": "B01FR6K40C" }, { "task_id": "ws_B08MXC3R4R_10078", "instruction": "i'm looking for a cheese platter that i can include in a gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08MXC3R4R" }, { "task_id": "ws_B08TC5FP4B_10079", "instruction": "i am looking for some red heart cupcake toppers for a birthday cake.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08TC5FP4B" }, { "task_id": "ws_B083JY7VQ7_10080", "instruction": "i'm looking for a size 12, casual woman's dress without sleeves.", "target_attributes": { "attributes": [ "dry clean" ], "options": [ "12" ] }, "asin": "B083JY7VQ7" }, { "task_id": "ws_B007W9G3FS_10081", "instruction": "i want a bottle of act total care alcohol free mouthwash.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B007W9G3FS" }, { "task_id": "ws_B0999K1GCN_10082", "instruction": "i want to find a blue toothbrush that can help me take care of my oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [ "blue b09" ] }, "asin": "B0999K1GCN" }, { "task_id": "ws_B07QJ1GBZ3_10083", "instruction": "hello, i'm looking for dermatologist approved sunblock that leaves no scent? also, i want 3.4 fl oz", "target_attributes": { "attributes": [ "dermatologist tested", "fragrance free" ], "options": [ "3.4 fl oz" ] }, "asin": "B07QJ1GBZ3" }, { "task_id": "ws_B08FRM5ZCT_10084", "instruction": "i need bread that is gluten free and bbq cheddar flavored", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "bbq cheddar" ] }, "asin": "B08FRM5ZCT" }, { "task_id": "ws_B074KJ5LD3_10085", "instruction": "i would like a pair of 38 wide by 28 long standard dark indigo flex jeans that are regular fit.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "dark indigo flex", "38w x 28l", "standard" ] }, "asin": "B074KJ5LD3" }, { "task_id": "ws_B000MHCDWO_10086", "instruction": "i'm looking for a twelve pack of 1.5 ounce packages of almonds that are high in protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "1.5 ounce (pack of 12)" ] }, "asin": "B000MHCDWO" }, { "task_id": "ws_B071ZZB5QC_10087", "instruction": "i would like a 16 inch by 16 inch yellow gray throw pillow cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "yellow grey", "16\" x 16\"" ] }, "asin": "B071ZZB5QC" }, { "task_id": "ws_B097TQG3F6_10088", "instruction": "i need white walking shoes with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "white" ] }, "asin": "B097TQG3F6" }, { "task_id": "ws_B08BKYG8W9_10089", "instruction": "i am looking for blue dragonfly color wall light for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "blue dragonfly" ] }, "asin": "B08BKYG8W9" }, { "task_id": "ws_B08G4ZNRGP_10090", "instruction": "i need hands free matte black cell phone holder for car dashboard windshield", "target_attributes": { "attributes": [ "hands free" ], "options": [ "matte black" ] }, "asin": "B08G4ZNRGP" }, { "task_id": "ws_B095N7NT78_10091", "instruction": "i want silver cooki rhinestone open toe sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z92 silver" ] }, "asin": "B095N7NT78" }, { "task_id": "ws_B078HV1Y6J_10092", "instruction": "i would like a bpa free jar.", "target_attributes": { "attributes": [ "bpa free" ], "options": [] }, "asin": "B078HV1Y6J" }, { "task_id": "ws_B09CW73S5Z_10093", "instruction": "may i have machine wash, short sleeve of lands' end men's short sleeve super soft supima polo shirt, the large size.", "target_attributes": { "attributes": [ "machine wash", "short sleeve" ], "options": [ "large" ] }, "asin": "B09CW73S5Z" }, { "task_id": "ws_B09GM8S6GJ_10094", "instruction": "i am looking for a pair of easy to assemble beige chairs for my living room.", "target_attributes": { "attributes": [ "easy assemble", "living room" ], "options": [ "beige" ] }, "asin": "B09GM8S6GJ" }, { "task_id": "ws_B094RC6NSX_10095", "instruction": "i want a pair of size 7 wide taupe loafers with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "taupe", "7 wide" ] }, "asin": "B094RC6NSX" }, { "task_id": "ws_B004C0JXD4_10096", "instruction": "i need a pack of long lasting permanent hair dye in a cr\u00e8me format; my shade is 6rb light reddish brown.", "target_attributes": { "attributes": [ "long lasting", "permanent hair", "hair dye" ], "options": [ "6rb light reddish brown", "1 count (pack of 1)" ] }, "asin": "B004C0JXD4" }, { "task_id": "ws_B084HLXLKG_10097", "instruction": "i want to get some low calorie margarita mix. look for a four pack.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "margarita", "32 fl oz (pack of 4)" ] }, "asin": "B084HLXLKG" }, { "task_id": "ws_B08GM7DTFP_10098", "instruction": "i need a pack of 2 fine-tooth dressing combs that are effective in styling as well as preventing hair loss.", "target_attributes": { "attributes": [ "hair styling", "hair loss" ], "options": [ "2 pack" ] }, "asin": "B08GM7DTFP" }, { "task_id": "ws_B081DB3BKN_10099", "instruction": "i am looking for trader joe's chocolate covered shortbread cookies.", "target_attributes": { "attributes": [ "trader joe", "chocolate covered" ], "options": [] }, "asin": "B081DB3BKN" }, { "task_id": "ws_B093KD454D_10100", "instruction": "i'm looking for a laundry bag that is designed for delicate blouses and hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093KD454D" }, { "task_id": "ws_B000XB34TK_10101", "instruction": "make this purchase for me: david's cookies - 24 fresh baked chocolate cookies gourmet gift basket, assorted flavors.tks", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "assorted flavors" ] }, "asin": "B000XB34TK" }, { "task_id": "ws_B000XB34TK_10102", "instruction": "i need chocolate chunk cookies for my gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "chocolate chunk" ] }, "asin": "B000XB34TK" }, { "task_id": "ws_B09F2DS41B_10103", "instruction": "find bluetooth speaks with stereo sound", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B09F2DS41B" }, { "task_id": "ws_B09LC168ZB_10104", "instruction": "i'm looking for a fast charging wireless bluetooth headphone.", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09LC168ZB" }, { "task_id": "ws_B08LX46PXG_10105", "instruction": "i am looking for a box of chocolate covered caramels and nuts.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "caramels & nuts" ] }, "asin": "B08LX46PXG" }, { "task_id": "ws_B08LX46PXG_10106", "instruction": "i want russell stover pecan delights for valentine's day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "pecan delights" ] }, "asin": "B08LX46PXG" }, { "task_id": "ws_B09RGMG3JW_10107", "instruction": "i would like a white 2xl white sleep set with a elastic waist", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "white", "xx-large" ] }, "asin": "B09RGMG3JW" }, { "task_id": "ws_B08VY5WHQB_10108", "instruction": "i need a classic fit pastel goth black girl lolita princess court dress with lemon color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "lemon" ] }, "asin": "B08VY5WHQB" }, { "task_id": "ws_B08YJML6FS_10109", "instruction": "i need 16.5 inch dining room chair pads", "target_attributes": { "attributes": [ "dining room" ], "options": [ "42cm | 16.5in" ] }, "asin": "B08YJML6FS" }, { "task_id": "ws_B07PGH5PQK_10110", "instruction": "i need a large size white color line art graphic needle sleeve t-shirt for women", "target_attributes": { "attributes": [ "needle sleeve" ], "options": [ "white", "large" ] }, "asin": "B07PGH5PQK" }, { "task_id": "ws_B09RH3JJLF_10111", "instruction": "i am looking for a pair of men's khaki cargo shorts with an elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "c#khaki" ] }, "asin": "B09RH3JJLF" }, { "task_id": "ws_B096Y4T4Q6_10112", "instruction": "i would like a pair of size 6.5 black flats with a ankle strap.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "#01 black", "6.5-7" ] }, "asin": "B096Y4T4Q6" }, { "task_id": "ws_B09SVF8YJ7_10113", "instruction": "i would like to buy a shirt for men which has short sleeves, and is of green color, and the size i want it to be should be medium.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "green", "medium" ] }, "asin": "B09SVF8YJ7" }, { "task_id": "ws_B01I6QA16C_10114", "instruction": "i am looking for daily casual xx-large cocktail dress, floral color", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "1a-floral-5", "xx-large" ] }, "asin": "B01I6QA16C" }, { "task_id": "ws_B07S9X3LF4_10115", "instruction": "i want an agerios moroccan argan oil instant repaired hair mask.", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B07S9X3LF4" }, { "task_id": "ws_B08519PB4W_10116", "instruction": "i'm looking for a small sweatshirt with drawstring closure. choose the ones that come in galaxy fox color.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "galaxy fox", "small" ] }, "asin": "B08519PB4W" }, { "task_id": "ws_B08GLFRSTM_10117", "instruction": "i'm looking for acer aspire computer all-in-one bundle accessory.", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [] }, "asin": "B08GLFRSTM" }, { "task_id": "ws_B07M88SRG9_10118", "instruction": "i want to find a toupee to treat hair loss in the 1b65 color.", "target_attributes": { "attributes": [ "hair loss" ], "options": [ "1b65" ] }, "asin": "B07M88SRG9" }, { "task_id": "ws_B08CRPT6PK_10119", "instruction": "i'm looking for a band for my galaxy watch 3 that offers a quick release mechanism and is small and black. i would also accept pink.", "target_attributes": { "attributes": [ "quick release" ], "options": [ "small, black | pink" ] }, "asin": "B08CRPT6PK" }, { "task_id": "ws_B08DNC33W4_10120", "instruction": "i am looking for a pair of dark green throw pillow covers for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "dark green" ] }, "asin": "B08DNC33W4" }, { "task_id": "ws_B099LFWBRD_10121", "instruction": "i would like a 120 wide by 90 long color 8 window panel that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "color08", "120\" w x 90\" l" ] }, "asin": "B099LFWBRD" }, { "task_id": "ws_B09HXNBJR2_10122", "instruction": "i need large size wine color crew neck short sleeve tendy tops for women", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "wine", "large" ] }, "asin": "B09HXNBJR2" }, { "task_id": "ws_B09MJZ214X_10123", "instruction": "i'd like to look for some fast charging, noise cancelling earbuds.", "target_attributes": { "attributes": [ "noise cancelling", "fast charging" ], "options": [] }, "asin": "B09MJZ214X" }, { "task_id": "ws_B07XRDQD96_10124", "instruction": "i want to find a black and white case cover for my iphone, and it needs to feature cats.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "black cat white cat" ] }, "asin": "B07XRDQD96" }, { "task_id": "ws_B08HQVKW4Z_10125", "instruction": "i'm looking for a pair of rose red, butt-lifting, high-waisted shorts in xx-large that are machine washable and provide tummy control.", "target_attributes": { "attributes": [ "butt lifting", "machine wash", "tummy control", "high waist" ], "options": [ "rose red snickers", "xx-large" ] }, "asin": "B08HQVKW4Z" }, { "task_id": "ws_B09BDYCTS4_10126", "instruction": "i'm looking for hair growth serum.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B09BDYCTS4" }, { "task_id": "ws_B07CWP8QKT_10127", "instruction": "i am looking for a high speed 3 foot long usb-c to usb-a cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "3 feet" ] }, "asin": "B07CWP8QKT" }, { "task_id": "ws_B08FCTYKGC_10128", "instruction": "i'm locking for motorcycle stereo speakers soundbar.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B08FCTYKGC" }, { "task_id": "ws_B0893WV92B_10129", "instruction": "i'm looking for a stainless steal quick release 18mm black watch.", "target_attributes": { "attributes": [ "quick release", "stainless steel" ], "options": [ "18mm" ] }, "asin": "B0893WV92B" }, { "task_id": "ws_B08Y8BV4D1_10130", "instruction": "i want to find a black pair of women's summer sandals for daily wear in a size 9.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "z92 black", "9" ] }, "asin": "B08Y8BV4D1" }, { "task_id": "ws_B09LV2FPV2_10131", "instruction": "i need blue cupcake picks for a baby shower.", "target_attributes": { "attributes": [ "cupcake picks", "baby shower" ], "options": [ "blue-1" ] }, "asin": "B09LV2FPV2" }, { "task_id": "ws_B08PV1DVF9_10132", "instruction": "i want to buy an office desk chair which has lumbar support and it's grey color.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "grey" ] }, "asin": "B08PV1DVF9" }, { "task_id": "ws_B09PH3Y4R5_10133", "instruction": "i'm looking for a loose fitting, machine washable blouse in blue. i need an xx large.", "target_attributes": { "attributes": [ "loose fit", "machine washable" ], "options": [ "baodan-a315-blue", "xx-large" ] }, "asin": "B09PH3Y4R5" }, { "task_id": "ws_B09GV7ZLRH_10134", "instruction": "i want a single count of sassy sangria that is hand crafted.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [ "sassy sangria", "1 count (pack of 1)" ] }, "asin": "B09GV7ZLRH" }, { "task_id": "ws_B09GV7ZLRH_10135", "instruction": "i'm looking for mason jar spirit infusion kit.", "target_attributes": { "attributes": [ "perfect gift" ], "options": [ "serves 8" ] }, "asin": "B09GV7ZLRH" }, { "task_id": "ws_B07F6QKGX5_10136", "instruction": "looking for ottoman bench footstool upholstered faux leather decor for living room also choose color brown faux leather", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "brown | faux leather" ] }, "asin": "B07F6QKGX5" }, { "task_id": "ws_B08Y69MKT8_10137", "instruction": "i need some fast charging usb cables that are grey", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "grey" ] }, "asin": "B08Y69MKT8" }, { "task_id": "ws_B09HBNQ5BD_10138", "instruction": "i'm looking for x large cotton pajamas that are elastic waist please and thank you", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "x-large" ] }, "asin": "B09HBNQ5BD" }, { "task_id": "ws_B09PZ121JF_10139", "instruction": "i am looking for some low fat dried apple rings.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "dried apple rings" ] }, "asin": "B09PZ121JF" }, { "task_id": "ws_B01M8MIZMC_10140", "instruction": "i want to find a high-definition wireless bluetooth speaker.", "target_attributes": { "attributes": [ "high definition", "wireless bluetooth" ], "options": [] }, "asin": "B01M8MIZMC" }, { "task_id": "ws_B08KS8CX53_10141", "instruction": "i'm looking for christmas gift baskets for kids.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08KS8CX53" }, { "task_id": "ws_B09FXKXDGF_10142", "instruction": "i am interested in acquiring a bedroom armoire which is eco friendly, and has steel frame, also i want it to be of black color, and the size should be 56\"x18\"x56\".", "target_attributes": { "attributes": [ "eco friendly", "steel frame" ], "options": [ "black", "56\"x18\"x56\"" ] }, "asin": "B09FXKXDGF" }, { "task_id": "ws_B08M36NK2J_10143", "instruction": "i would like to buy office desk chair which has lumbar support and is of grey color.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "grey" ] }, "asin": "B08M36NK2J" }, { "task_id": "ws_B014LC0QRE_10144", "instruction": "i am searching for women's two button lux dry clean blazer of 16 size charcoal color", "target_attributes": { "attributes": [ "dry clean" ], "options": [ "charcoal", "16" ] }, "asin": "B014LC0QRE" }, { "task_id": "ws_B09Q5YBJL8_10145", "instruction": "i want blue and eco friendly cenglings sandals for women.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "blue" ] }, "asin": "B09Q5YBJL8" }, { "task_id": "ws_B08X6TG3C4_10146", "instruction": "i need a hair cutting kit that is multicolored", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "multi21" ] }, "asin": "B08X6TG3C4" }, { "task_id": "ws_B09C5SR9KH_10147", "instruction": "i am looking for a pair of women's size 36 eu water shoes with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "36 eu" ] }, "asin": "B09C5SR9KH" }, { "task_id": "ws_B08BRB66FY_10148", "instruction": "i need 4 vanity light sconces for my bathroom wall that are modern and easy to install.", "target_attributes": { "attributes": [ "easy install", "vanity light" ], "options": [ "4 light" ] }, "asin": "B08BRB66FY" }, { "task_id": "ws_B00110OL08_10149", "instruction": "i want a hair removal solution made with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B00110OL08" }, { "task_id": "ws_B016ARX1OS_10150", "instruction": "i want to find a white long-sleeve dress shirt that has a 20 inch neck and a 36 inch sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "white", "20\"-20.5\" neck 36\"-37\" sleeve" ] }, "asin": "B016ARX1OS" }, { "task_id": "ws_B09DK5YFVL_10151", "instruction": "i would like a anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B09DK5YFVL" }, { "task_id": "ws_B09RVVB3GL_10152", "instruction": "product title i wear this size and model.gibobby women's swimsuits tankini bikini, quick dry, extra large size. i need help finding", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "x-large" ] }, "asin": "B09RVVB3GL" }, { "task_id": "ws_B00F96L14Y_10153", "instruction": "i am looking for 2 ft x 6 ft runner size area rugs that are easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "2 ft x 6 ft runner" ] }, "asin": "B00F96L14Y" }, { "task_id": "ws_B00F96L14Y_10154", "instruction": "i am looking for a easy clean area rug with 8 ft square. also choose light brown color.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "light brown | beige", "8 ft square" ] }, "asin": "B00F96L14Y" }, { "task_id": "ws_B07C9JGB4L_10155", "instruction": "i want you to help me find maine root handmade ginger soda, 12 fl oz (12 glass bottles) i'm having a hard time finding certified organic. i hope you succeed", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "mexicane cola", "12 pack" ] }, "asin": "B07C9JGB4L" }, { "task_id": "ws_B099NRCQ9P_10156", "instruction": "i want to buy waffle cookies which are non gmo and come in a single package and have 28 pieces.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "28 count (single packages)" ] }, "asin": "B099NRCQ9P" }, { "task_id": "ws_B0892P1X12_10157", "instruction": "i am looking for baked fresh red velvet cookies that are individually wrapped.", "target_attributes": { "attributes": [ "baked fresh", "individually wrapped" ], "options": [] }, "asin": "B0892P1X12" }, { "task_id": "ws_B08WK88CVJ_10158", "instruction": "i want to buy dental retainer container which is made of non toxic elements.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B08WK88CVJ" }, { "task_id": "ws_B07YZ3JVL2_10159", "instruction": "i need to find a small end table that is easy to assemble; pick a blue-coated steel frame that won't rust.", "target_attributes": { "attributes": [ "easy assemble", "coated steel", "steel frame" ], "options": [ "blue" ] }, "asin": "B07YZ3JVL2" }, { "task_id": "ws_B08HVN1DFL_10160", "instruction": "i am looking for a white computer gaming chair with lumbar support.", "target_attributes": { "attributes": [ "white item", "lumbar support" ], "options": [ "white" ] }, "asin": "B08HVN1DFL" }, { "task_id": "ws_B08FMY7SKC_10161", "instruction": "i need a core i5 optiplex computer", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B08FMY7SKC" }, { "task_id": "ws_B0822WP1MV_10162", "instruction": "i need a super soft and fluffy duvet cover for my king-sized bed. please choose the black one.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "black", "king" ] }, "asin": "B0822WP1MV" }, { "task_id": "ws_B0089OQ2YM_10163", "instruction": "i am looking for a short sleeve fishing shirt with a button closure in the color emerald city and in the size 2x tall.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "emerald city", "2x tall" ] }, "asin": "B0089OQ2YM" }, { "task_id": "ws_B081GSQBW1_10164", "instruction": "i need a easy to apply nail polish", "target_attributes": { "attributes": [ "easy apply", "nail polish" ], "options": [] }, "asin": "B081GSQBW1" }, { "task_id": "ws_B081GSQBW1_10165", "instruction": "i need some nail polish in the color c08.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "c08" ] }, "asin": "B081GSQBW1" }, { "task_id": "ws_B09QBXGP2K_10166", "instruction": "i need an easy to install 24 millimeter replacement watchband in red.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "red", "24mm" ] }, "asin": "B09QBXGP2K" }, { "task_id": "ws_B09MFQ5HBY_10167", "instruction": "i'm looking for a ten pack of silver cake toppers for my friend's baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [ "silver" ] }, "asin": "B09MFQ5HBY" }, { "task_id": "ws_B077NPM47T_10168", "instruction": "look for a mid century pendant light to be installed in my living room. it should be black.", "target_attributes": { "attributes": [ "mid century", "pendant light", "living room" ], "options": [ "black" ] }, "asin": "B077NPM47T" }, { "task_id": "ws_B08JC9MRLL_10169", "instruction": "i want dark grey vislily plus-size long sleeve sweaters.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "16_dark grey" ] }, "asin": "B08JC9MRLL" }, { "task_id": "ws_B07TSTQ7CS_10170", "instruction": "i want a set of 5 modern height adjustable mid-back bar stool", "target_attributes": { "attributes": [ "height adjustable" ], "options": [] }, "asin": "B07TSTQ7CS" }, { "task_id": "ws_B07CHTZ7MS_10171", "instruction": "i am looking for a ready to use full size mattress and box springs.", "target_attributes": { "attributes": [ "ready use" ], "options": [ "full" ] }, "asin": "B07CHTZ7MS" }, { "task_id": "ws_B01N050LLG_10172", "instruction": "i am looking for sulfate free shampoo that repairs damaged hair.", "target_attributes": { "attributes": [ "sulfate free", "damaged hair" ], "options": [] }, "asin": "B01N050LLG" }, { "task_id": "ws_B019NLUOXE_10173", "instruction": "i am looking for warm beige color anti aging foundation.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "warm beige" ] }, "asin": "B019NLUOXE" }, { "task_id": "ws_B019NLUOXE_10174", "instruction": "i need a 1 oz bottle of cruelty free foundation that is golden tan.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "golden tan", "1 fl oz (pack of 1)" ] }, "asin": "B019NLUOXE" }, { "task_id": "ws_B09MWB5DQG_10175", "instruction": "i want to find a pink front-button bra in a size 44 that is made of quality polyester.", "target_attributes": { "attributes": [ "quality polyester" ], "options": [ "pink", "44" ] }, "asin": "B09MWB5DQG" }, { "task_id": "ws_B078C5DYKV_10176", "instruction": "i am looking for a 108\" x 84\" size panels for living room", "target_attributes": { "attributes": [ "living room" ], "options": [ "108\" x 84\"" ] }, "asin": "B078C5DYKV" }, { "task_id": "ws_B0769G9XH9_10177", "instruction": "i am looking for brushed nickel color pendant lights that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "brushed nickel" ] }, "asin": "B0769G9XH9" }, { "task_id": "ws_B09P3S2JHL_10178", "instruction": "i need a long lasting battery pack with fast charging capabilities.", "target_attributes": { "attributes": [ "long lasting", "fast charging" ], "options": [] }, "asin": "B09P3S2JHL" }, { "task_id": "ws_B001M0G1XW_10179", "instruction": "i want to find organic, low fat applesauce that is apple strawberry flavored. it should come in 4 ounce cups in a pack of 4.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "apple strawberry", "4 ounce, 6 count (pack of 4)" ] }, "asin": "B001M0G1XW" }, { "task_id": "ws_B09J165NX5_10180", "instruction": "i want to buy sneaker shoes which are non slop and are comfortable fit with a size of 7.5 .", "target_attributes": { "attributes": [ "non slip", "comfortable fit" ], "options": [ "7.5" ] }, "asin": "B09J165NX5" }, { "task_id": "ws_B088D259Q5_10181", "instruction": "i am looking for a long lasting gold color tablet.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "gold" ] }, "asin": "B088D259Q5" }, { "task_id": "ws_B08TW2ZNLX_10182", "instruction": "i want a dark chocolate covered flipz bites bar.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "dark-chocolate" ] }, "asin": "B08TW2ZNLX" }, { "task_id": "ws_B08NZ18GMQ_10183", "instruction": "i am looking for white 6 inch ceramic plates for my dining room.", "target_attributes": { "attributes": [ "white finish", "dining room" ], "options": [] }, "asin": "B08NZ18GMQ" }, { "task_id": "ws_B085CD6YJQ_10184", "instruction": "i'm looking for a fast wireless charger in blue color.", "target_attributes": { "attributes": [ "fast charging", "wireless charging" ], "options": [ "blue" ] }, "asin": "B085CD6YJQ" }, { "task_id": "ws_B085125HY7_10185", "instruction": "i want to buy video recorders which can detect motion and come with a size of nv4108-1tb", "target_attributes": { "attributes": [ "motion detection" ], "options": [ "nv4108-1tb" ] }, "asin": "B085125HY7" }, { "task_id": "ws_B09RPC54JG_10186", "instruction": "i want large snowshine men's low rise boxer briefs.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "large" ] }, "asin": "B09RPC54JG" }, { "task_id": "ws_B08BX2C29N_10187", "instruction": "i need a medium pant that has an elastic waist", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "medium" ] }, "asin": "B08BX2C29N" }, { "task_id": "ws_B085GG5X4X_10188", "instruction": "i need a quick drying swim suit cover up in a size large. get the watermelon one.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "watermelon", "large" ] }, "asin": "B085GG5X4X" }, { "task_id": "ws_B09KG97T9N_10189", "instruction": "i am lookong for a colorful2 for screen protectors wihich is easy ti install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "colorful2" ] }, "asin": "B09KG97T9N" }, { "task_id": "ws_B007HQFSMU_10190", "instruction": "find beef jerkys made from grass feed animals.", "target_attributes": { "attributes": [ "grass fed" ], "options": [] }, "asin": "B007HQFSMU" }, { "task_id": "ws_B01B1ZVPR4_10191", "instruction": "i would like a 30\" wide vintage leather grey headboard that is wall mounted.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "vintage leather light grey", "30'' wide" ] }, "asin": "B01B1ZVPR4" }, { "task_id": "ws_B09Q94CBZY_10192", "instruction": "i would like a large gray pair of leggings with a high waist.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "gray", "large" ] }, "asin": "B09Q94CBZY" }, { "task_id": "ws_B07VTDDHWV_10193", "instruction": "i'm looking for a stereo headset for my nintendo switch that is both yellow and blue.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "yellow | blue" ] }, "asin": "B07VTDDHWV" }, { "task_id": "ws_B08PNQB4TN_10194", "instruction": "i am in need of elastic waist winter active running joggers pants of small size and dark grey color", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "dark grey", "small" ] }, "asin": "B08PNQB4TN" }, { "task_id": "ws_B08SJ9C7P8_10195", "instruction": "i'm looking for plant based zero sugar energy drinks in a four flavor variety pack.", "target_attributes": { "attributes": [ "plant based", "zero sugar" ], "options": [ "4 flavor variety pack" ] }, "asin": "B08SJ9C7P8" }, { "task_id": "ws_B08P1K7X1L_10196", "instruction": "i am looking for black daybed frame twin size with upholstered sideboard for living room", "target_attributes": { "attributes": [ "twin size", "living room" ], "options": [ "black daybed" ] }, "asin": "B08P1K7X1L" }, { "task_id": "ws_B09Q5QR4D9_10197", "instruction": "i want to find a grey bunk bed frame with shelves made out of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "grey", "full over full with shelves" ] }, "asin": "B09Q5QR4D9" }, { "task_id": "ws_B096PJ6ZTW_10198", "instruction": "i am looking for black, open toe sandals in size 9.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z35 black", "9" ] }, "asin": "B096PJ6ZTW" }, { "task_id": "ws_B09M95Q3LX_10199", "instruction": "i am looking for a pair of women's medium sized machine wash biker shorts.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "medium" ] }, "asin": "B09M95Q3LX" }, { "task_id": "ws_B09RQQ8V11_10200", "instruction": "i am looking for s multicolor high quality clips", "target_attributes": { "attributes": [ "high quality" ], "options": [ "multicolor" ] }, "asin": "B09RQQ8V11" }, { "task_id": "ws_B09H2W7448_10201", "instruction": "i am looking for amplifiers that have high power and performance.", "target_attributes": { "attributes": [ "power amplifier", "high power", "high performance" ], "options": [] }, "asin": "B09H2W7448" }, { "task_id": "ws_B003XM73P2_10202", "instruction": "i want a 6 foot long gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "6ft" ] }, "asin": "B003XM73P2" }, { "task_id": "ws_B002ZANMHG_10203", "instruction": "i'm looking for natural java beverage mix.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "3.5 pound (pack of 1)" ] }, "asin": "B002ZANMHG" }, { "task_id": "ws_B089LQ2T5V_10204", "instruction": "i need a women's high waist swimsuit in a fashionable tropical-print design; i'm a size medium.", "target_attributes": { "attributes": [ "high waist", "fashion design" ], "options": [ "medium" ] }, "asin": "B089LQ2T5V" }, { "task_id": "ws_B078SPT9K8_10205", "instruction": "i need to find a box of trader joe seed crackers that support my gluten-free diet.", "target_attributes": { "attributes": [ "trader joe", "gluten free" ], "options": [] }, "asin": "B078SPT9K8" }, { "task_id": "ws_B09STP6P85_10206", "instruction": "i want a 2xl black short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "shirts-128- black", "xx-large" ] }, "asin": "B09STP6P85" }, { "task_id": "ws_B076B3JX4R_10207", "instruction": "i'm looking for an 8 oz, paraben free hair regrowth shampoo.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "8 fl oz (pack of 1)" ] }, "asin": "B076B3JX4R" }, { "task_id": "ws_B09MQC3JX7_10208", "instruction": "i want a green table that is 1080p hd.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "green" ] }, "asin": "B09MQC3JX7" }, { "task_id": "ws_B09M34J5W1_10209", "instruction": "i want a rose gold leotop screen protector compatible with apple watch.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "rose gold" ] }, "asin": "B09M34J5W1" }, { "task_id": "ws_B093VCC7L8_10210", "instruction": "i am interested in buying a t-shirt for women, which is classic fit, and is of black color, while it's size should be 2t.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "women", "2t" ] }, "asin": "B093VCC7L8" }, { "task_id": "ws_B09N9LCNPM_10211", "instruction": "i need pink color valentine day cake toppers", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "pink" ] }, "asin": "B09N9LCNPM" }, { "task_id": "ws_B098XHJNWM_10212", "instruction": "i am looking for a pair of women's size 6.5 to 7 open toe sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "6.5-7" ] }, "asin": "B098XHJNWM" }, { "task_id": "ws_B088X5GYP1_10213", "instruction": "i'm looking for a 12 pack of gluten free, keto friendly, low carb granola bars", "target_attributes": { "attributes": [ "gluten free", "keto friendly", "low carb" ], "options": [ "chocolate (12 pack)" ] }, "asin": "B088X5GYP1" }, { "task_id": "ws_B0158VB6BC_10214", "instruction": "i am looking for a table lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B0158VB6BC" }, { "task_id": "ws_B07NN1SJZW_10215", "instruction": "i need a hands free portable bluetooth speaker with stereo sound.", "target_attributes": { "attributes": [ "hands free", "stereo sound" ], "options": [] }, "asin": "B07NN1SJZW" }, { "task_id": "ws_B0863GF7PC_10216", "instruction": "i want a black kodak pixpro az401 with optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "black" ] }, "asin": "B0863GF7PC" }, { "task_id": "ws_B08W9PD4TM_10217", "instruction": "i want a 8 fluid ounce bottle of mint julep mixers made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "mint julep", "8 fl oz (pack of 2)" ] }, "asin": "B08W9PD4TM" }, { "task_id": "ws_B09LD1443P_10218", "instruction": "i want happy birthday cake sunflower toppers.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B09LD1443P" }, { "task_id": "ws_B08BNW7GZG_10219", "instruction": "i want a rose gold and non slip fueyou makeup brush set.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "rose gold" ] }, "asin": "B08BNW7GZG" }, { "task_id": "ws_B08W1YL8C4_10220", "instruction": "i'm looking for a edible cupcakes cookies toppers.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08W1YL8C4" }, { "task_id": "ws_B09Q7LVG2Y_10221", "instruction": "deep conditioning hair growth hair mask with supplement tablets 180 nos", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "180 tablets + elixir" ] }, "asin": "B09Q7LVG2Y" }, { "task_id": "ws_B078SMMN8K_10222", "instruction": "find a bonsai gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [] }, "asin": "B078SMMN8K" }, { "task_id": "ws_B09K72BKJJ_10223", "instruction": "i want to buy hydration lotion which has a size suitable for travel and is made of coconut oil.", "target_attributes": { "attributes": [ "travel size", "coconut oil" ], "options": [] }, "asin": "B09K72BKJJ" }, { "task_id": "ws_B095C9WX7T_10224", "instruction": "i am looking for a black stainless steel smartwatch bands", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "black" ] }, "asin": "B095C9WX7T" }, { "task_id": "ws_B09KHDYYRH_10225", "instruction": "i'm looking for a 24 pack of cupcake toppers for my daughter's baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09KHDYYRH" }, { "task_id": "ws_B07RV33SBH_10226", "instruction": "i need a pack of 2 high speed cables that support hdmi to dvi and are also compatible with 1080p hd.", "target_attributes": { "attributes": [ "1080p hd", "high speed" ], "options": [ "2 pack" ] }, "asin": "B07RV33SBH" }, { "task_id": "ws_B09H2T1JX5_10227", "instruction": "i would like some high quality hair claws", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09H2T1JX5" }, { "task_id": "ws_B09MFK9NMD_10228", "instruction": "i am looking for lead free candles having 2 pack french lavender scent.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "2 pack french lavender" ] }, "asin": "B09MFK9NMD" }, { "task_id": "ws_B08Z3TQLFC_10229", "instruction": "i'm looking for a roller tool that's good for fine lines and aging skin.", "target_attributes": { "attributes": [ "anti aging", "fine lines" ], "options": [] }, "asin": "B08Z3TQLFC" }, { "task_id": "ws_B09P5ZBCWR_10230", "instruction": "i'm looking for a small portable folding desk that is already fully assembled; it should have a khaki wood finish.", "target_attributes": { "attributes": [ "fully assembled", "wood finish" ], "options": [ "khaki" ] }, "asin": "B09P5ZBCWR" }, { "task_id": "ws_B01HOZO9WS_10231", "instruction": "i need nylon spandex pants that are mocha colored.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "mocha" ] }, "asin": "B01HOZO9WS" }, { "task_id": "ws_B087QSW6QW_10232", "instruction": "i want an ivory pair of bearpaw women's skye boots with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "ivory" ] }, "asin": "B087QSW6QW" }, { "task_id": "ws_B09RFGKR1T_10233", "instruction": "find black colored sandals for a teen girl.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "b01 black" ] }, "asin": "B09RFGKR1T" }, { "task_id": "ws_B09Q5TJ6ZF_10234", "instruction": "i want interestprint women's running shoes with vinyl acetate in size 15.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "15" ] }, "asin": "B09Q5TJ6ZF" }, { "task_id": "ws_B086XZ3D6Q_10235", "instruction": "i need a low carb brownie mix", "target_attributes": { "attributes": [ "low carb" ], "options": [ "brownie mix" ] }, "asin": "B086XZ3D6Q" }, { "task_id": "ws_B08ZL8QX27_10236", "instruction": "look for a sugar free drink mix that has a banana flavor.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "banana" ] }, "asin": "B08ZL8QX27" }, { "task_id": "ws_B01KQ0H7W2_10237", "instruction": "i am looking for a long lasting nail polish.", "target_attributes": { "attributes": [ "long lasting", "nail polish" ], "options": [] }, "asin": "B01KQ0H7W2" }, { "task_id": "ws_B07BDV5PN8_10238", "instruction": "i want this food from snack puffs, aged white cheddar. pirate's booty 0.0g trans and gluten free i await your return", "target_attributes": { "attributes": [ "non gmo", "gluten free", "0g trans" ], "options": [] }, "asin": "B07BDV5PN8" }, { "task_id": "ws_B09N3YZ8PC_10239", "instruction": "i want a blue noldares mens flannel long sleeve shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue" ] }, "asin": "B09N3YZ8PC" }, { "task_id": "ws_B072FHXYSJ_10240", "instruction": "i'm looking for farmhouse upholstered dining chair.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "upholstered half back" ] }, "asin": "B072FHXYSJ" }, { "task_id": "ws_B084R8XLRR_10241", "instruction": "i'm looking for a large, white, cube shaped closet organizer to provide additional storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "white" ] }, "asin": "B084R8XLRR" }, { "task_id": "ws_B087P3ZJ3F_10242", "instruction": "i need an eyeshadow palette that's easy to carry and contains a highly pigmented brown eyeshadow.", "target_attributes": { "attributes": [ "highly pigmented", "easy carry" ], "options": [ "brown matte" ] }, "asin": "B087P3ZJ3F" }, { "task_id": "ws_B07X379VC8_10243", "instruction": "i want a silver apple macbook pro with intel core i5-7267u.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "silver" ] }, "asin": "B07X379VC8" }, { "task_id": "ws_B09D7TR414_10244", "instruction": "i'm looking for faux leather couch bed with armless and metal lega.", "target_attributes": { "attributes": [ "faux leather", "metal legs", "living room" ], "options": [] }, "asin": "B09D7TR414" }, { "task_id": "ws_B09BZMBWNF_10245", "instruction": "i am interested in buying folding mattress for a beauty salon, which has wine red color and is of 75*190cm size.", "target_attributes": { "attributes": [ "beauty salon" ], "options": [ "wine red", "75*190cm" ] }, "asin": "B09BZMBWNF" }, { "task_id": "ws_B09HM99DS3_10246", "instruction": "i am looking for a long lasting brown soy wax candle.", "target_attributes": { "attributes": [ "long lasting", "soy wax" ], "options": [ "brown" ] }, "asin": "B09HM99DS3" }, { "task_id": "ws_B08H4HZGL9_10247", "instruction": "i am looking for blue color hair dye mixing bowl, sized 22x7.5x2cm", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "blue", "22x7.5x2cm" ] }, "asin": "B08H4HZGL9" }, { "task_id": "ws_B08KSJHSXF_10248", "instruction": "i want anon gmo wyman\u2019s triple berry fresh frozen variety pack.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "frozen fruit variety pack" ] }, "asin": "B08KSJHSXF" }, { "task_id": "ws_B08KSJHSXF_10249", "instruction": "prefer this brand wyman's triple berry frozen fresh fruit | no preservatives, certified non-gmo, ready to eat. i count on your experience in finding what i need for today", "target_attributes": { "attributes": [ "ready eat", "non gmo" ], "options": [ "triple berry" ] }, "asin": "B08KSJHSXF" }, { "task_id": "ws_B08KFMG8XZ_10250", "instruction": "i want to find permanent hair color cream in a golden copper color.", "target_attributes": { "attributes": [ "permanent hair" ], "options": [ "6dr | 6.34 golden-copper dark blond" ] }, "asin": "B08KFMG8XZ" }, { "task_id": "ws_B00O6DHOCY_10251", "instruction": "i want a 7.5 oz box of gluten free paleokrunch cereal.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "7.5 ounce (pack of 3)" ] }, "asin": "B00O6DHOCY" }, { "task_id": "ws_B07XC27X9V_10252", "instruction": "i'm looking for long sleeve o-neck casual loose t-shirts.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [] }, "asin": "B07XC27X9V" }, { "task_id": "ws_B08MVBKRGZ_10253", "instruction": "i need black shoes that have rubber soles", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "white (103) | black" ] }, "asin": "B08MVBKRGZ" }, { "task_id": "ws_B07BQD1ZS5_10254", "instruction": "coconut oil hair repair, marc daniels professional, sulfate free no parabens. i need to fix my hair. i count on your help", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "coconut oil" ], "options": [] }, "asin": "B07BQD1ZS5" }, { "task_id": "ws_B0971STZPV_10255", "instruction": "i want laird superfood aloha oatmac unsweetened non-dairy coffee creamer.", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "unsweetened" ] }, "asin": "B0971STZPV" }, { "task_id": "ws_B08SW9W6YG_10256", "instruction": "i want to buy hair brush for women which is of travel size and it should be with mirror folded at 2.75 inch.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "brush with mirror folded 2.75 inch" ] }, "asin": "B08SW9W6YG" }, { "task_id": "ws_B0752MN21L_10257", "instruction": "i am looking for graphite color womens slip-on amde from vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "graphite" ] }, "asin": "B0752MN21L" }, { "task_id": "ws_B096KTC8Y4_10258", "instruction": "i am looking for small size women casual short sleeve white color tunic tops", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "b9- white", "small" ] }, "asin": "B096KTC8Y4" }, { "task_id": "ws_B09LM3RGW8_10259", "instruction": "i need a super soft bed blanket that has cats on it", "target_attributes": { "attributes": [ "super soft" ], "options": [ "cat butterfly" ] }, "asin": "B09LM3RGW8" }, { "task_id": "ws_B072K3W94S_10260", "instruction": "i am looking for a heavy duty 1 foot long gold plated 3.5mm to rca cable.", "target_attributes": { "attributes": [ "gold plated", "heavy duty" ], "options": [ "1 feet" ] }, "asin": "B072K3W94S" }, { "task_id": "ws_B084LJ45YN_10261", "instruction": "i want dermatologist tested herbal essences chamomile conditioner.", "target_attributes": { "attributes": [ "dermatologist tested" ], "options": [ "chamomile" ] }, "asin": "B084LJ45YN" }, { "task_id": "ws_B08ZH51S65_10262", "instruction": "i would like a men's powder lotion deodorant that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "men's powder lotion" ] }, "asin": "B08ZH51S65" }, { "task_id": "ws_B098XQTSWP_10263", "instruction": "i am looking for a black sofa bed couch for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B098XQTSWP" }, { "task_id": "ws_B07WRD1X1M_10264", "instruction": "i am looking for xx-large men's tapa mood woven short sleeve shirt", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "xx-large" ] }, "asin": "B07WRD1X1M" }, { "task_id": "ws_B099X4XV7J_10265", "instruction": "i want a noble park corson cut wall mirror for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B099X4XV7J" }, { "task_id": "ws_B09CT58LD3_10266", "instruction": "aunimeifly pillow slippers for women men, super soft platform shoes. open toe, size 8.5 i really want to wear these shoes, help me buy them", "target_attributes": { "attributes": [ "open toe" ], "options": [ "8.5" ] }, "asin": "B09CT58LD3" }, { "task_id": "ws_B08TVFM6CH_10267", "instruction": "i am looking for a heavy duty single toggle wall plate cover.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "single toggle" ] }, "asin": "B08TVFM6CH" }, { "task_id": "ws_B092Z8TBXZ_10268", "instruction": "i'm looking for a high quality make up brush set in ivory rice color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "ivory rice" ] }, "asin": "B092Z8TBXZ" }, { "task_id": "ws_B06XF253J3_10269", "instruction": "i am looking for 12 pieces of green color high quality small round travel container jar pots with lids", "target_attributes": { "attributes": [ "high quality" ], "options": [ "green", "12 pieces" ] }, "asin": "B06XF253J3" }, { "task_id": "ws_B08LW3LSQR_10270", "instruction": "i am interested in a machine washable throw that is yellow and aqua", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "yellow aqua" ] }, "asin": "B08LW3LSQR" }, { "task_id": "ws_B004D8VGIA_10271", "instruction": "i want to find a white microwave cabinet that has a wood finish.", "target_attributes": { "attributes": [ "wood finish" ], "options": [ "white" ] }, "asin": "B004D8VGIA" }, { "task_id": "ws_B09T69NXPT_10272", "instruction": "i am looking for b color eyeshadow that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "b" ] }, "asin": "B09T69NXPT" }, { "task_id": "ws_B08QG1HGD9_10273", "instruction": "i'm looking for men's fragrance free face lotion that offer spf protection.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "spf face lotion" ] }, "asin": "B08QG1HGD9" }, { "task_id": "ws_B09GM6SDLB_10274", "instruction": "i want a peach scrub lip balm made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "peach scrub" ] }, "asin": "B09GM6SDLB" }, { "task_id": "ws_B01N6PLEXN_10275", "instruction": "i'm looking for organic hair conditioner that promotes hair growth, and is both sulfate and cruelty free.", "target_attributes": { "attributes": [ "sulfate free", "cruelty free", "hair growth" ], "options": [] }, "asin": "B01N6PLEXN" }, { "task_id": "ws_B093T2NBGN_10276", "instruction": "i need a grey entertainment center", "target_attributes": { "attributes": [ "storage space" ], "options": [ "grey" ] }, "asin": "B093T2NBGN" }, { "task_id": "ws_B08Y9315CT_10277", "instruction": "i am looking for brown color spray bottles for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "brown" ] }, "asin": "B08Y9315CT" }, { "task_id": "ws_B0154RWL4Q_10278", "instruction": "i want a bexley mission tiffany style table lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B0154RWL4Q" }, { "task_id": "ws_B09KLWCPLW_10279", "instruction": "i'm looking for an office chair that is red and offers lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red" ] }, "asin": "B09KLWCPLW" }, { "task_id": "ws_B09P587279_10280", "instruction": "i am looking for high heel sandals of size 5.5.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "5.5" ] }, "asin": "B09P587279" }, { "task_id": "ws_B095BLCKJF_10281", "instruction": "i want a m color face kit that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "m" ] }, "asin": "B095BLCKJF" }, { "task_id": "ws_B09D1ZMFBH_10282", "instruction": "i want a resealable bag of raisins.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [] }, "asin": "B09D1ZMFBH" }, { "task_id": "ws_B09NSL89H9_10283", "instruction": "i'm looking for a continuous fine mist spray bottle in the color black.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "black" ] }, "asin": "B09NSL89H9" }, { "task_id": "ws_B09PBX2LND_10284", "instruction": "i am looking for a pair of women's size 10.5 light blue shoes with memory foam.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "light blue", "10.5" ] }, "asin": "B09PBX2LND" }, { "task_id": "ws_B0969KNKCN_10285", "instruction": "i need a tongue cleaner that is easy to clean", "target_attributes": { "attributes": [ "easy clean" ], "options": [] }, "asin": "B0969KNKCN" }, { "task_id": "ws_B01M7TXD6R_10286", "instruction": "i am looking for a 25 pack of micellar makeup remover wipes that are sulfate free.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "25 count (pack of 2)" ] }, "asin": "B01M7TXD6R" }, { "task_id": "ws_B01FV5GR0K_10287", "instruction": "i want to find an 8 ounce bottle of firming cream that treats fine lines.", "target_attributes": { "attributes": [ "fine lines" ], "options": [ "8 ounce" ] }, "asin": "B01FV5GR0K" }, { "task_id": "ws_B08N6KPMKY_10288", "instruction": "i'm looking for an extra small cozy blanket for my daughter's christmas gift; it should be super soft and easy to clean.", "target_attributes": { "attributes": [ "super soft", "easy clean" ], "options": [ "chistmas style", "x-small(28x40 in)" ] }, "asin": "B08N6KPMKY" }, { "task_id": "ws_B09SDWVCH4_10289", "instruction": "i am looking for a high quality, folding massage table.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09SDWVCH4" }, { "task_id": "ws_B09DSWK9VV_10290", "instruction": "i'm looking for a gray iphone 13 pro max case that supports wireless charging.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "grey" ] }, "asin": "B09DSWK9VV" }, { "task_id": "ws_B00NTBRR6C_10291", "instruction": "i want a oatmeal cinnamon raisin snack bar that is low calorie and high protein.", "target_attributes": { "attributes": [ "high protein", "low calorie" ], "options": [ "oatmeal cinnamon raisin" ] }, "asin": "B00NTBRR6C" }, { "task_id": "ws_B08V4PWWY2_10292", "instruction": "i want to buy bath brushes which are suitable for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B08V4PWWY2" }, { "task_id": "ws_B08MFTHKYH_10293", "instruction": "i'm interested in love scent, dermatologist tested cream for sensitive skin that is cruelty-free and does not contain parabens or sulfates.", "target_attributes": { "attributes": [ "paraben free", "cruelty free", "dermatologist tested", "sulfate free", "sensitive skin" ], "options": [ "love" ] }, "asin": "B08MFTHKYH" }, { "task_id": "ws_B0888Q3RV8_10294", "instruction": "i'm looking for a travel monopod camera tripod with quick release and easy to carry.", "target_attributes": { "attributes": [ "quick release", "easy carry" ], "options": [] }, "asin": "B0888Q3RV8" }, { "task_id": "ws_B07RNX44YW_10295", "instruction": "i'm looking for an ivory ottoman for my living room that's made out of solid wood with fake leather.", "target_attributes": { "attributes": [ "pu leather", "solid wood", "living room" ], "options": [ "ivory" ] }, "asin": "B07RNX44YW" }, { "task_id": "ws_B08R973YV5_10296", "instruction": "i need to buy a gift basket for valentines day. find one that has five chocolate bars in it.", "target_attributes": { "attributes": [ "valentine day", "gift basket" ], "options": [ "5 bar" ] }, "asin": "B08R973YV5" }, { "task_id": "ws_B07SVYBWQ1_10297", "instruction": "i would like a red short sleeve shirt that is button down", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "z-4 red" ] }, "asin": "B07SVYBWQ1" }, { "task_id": "ws_B08DG6SXNL_10298", "instruction": "i'm looking for a pair of rs-c sized, easy to use, stainless steel barber's scissors.", "target_attributes": { "attributes": [ "easy use", "stainless steel" ], "options": [ "rs-c" ] }, "asin": "B08DG6SXNL" }, { "task_id": "ws_B01BY04EMY_10299", "instruction": "i'm locking for a high speed hdmi cable which supports 3d audio.", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B01BY04EMY" }, { "task_id": "ws_B01K0ZPGC6_10300", "instruction": "find a non alcoholic 32oz blood mary mix.", "target_attributes": { "attributes": [ "non alcoholic" ], "options": [] }, "asin": "B01K0ZPGC6" }, { "task_id": "ws_B00RI7EFAO_10301", "instruction": "i am looking for a chair with no arms. it should be in burgundy color and should have lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "burgundy" ] }, "asin": "B00RI7EFAO" }, { "task_id": "ws_B09M3QJRXQ_10302", "instruction": "i want a beige with trundle twin bed with a wood frame.", "target_attributes": { "attributes": [ "twin size", "wood frame" ], "options": [] }, "asin": "B09M3QJRXQ" }, { "task_id": "ws_B06X6B7FK9_10303", "instruction": "i want a whtie van heusen men's slim fit dress shirt.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "white" ] }, "asin": "B06X6B7FK9" }, { "task_id": "ws_B07VK1ZCRG_10304", "instruction": "i want gluten free sun tropics sea salt snack bites.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "sea salt" ] }, "asin": "B07VK1ZCRG" }, { "task_id": "ws_B0999CLY8C_10305", "instruction": "i want a pair of size 8 green loafers with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "z1-green", "8" ] }, "asin": "B0999CLY8C" }, { "task_id": "ws_B00JNA3MMG_10306", "instruction": "i need a xbox one media remote with batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B00JNA3MMG" }, { "task_id": "ws_B09FG4XS2D_10307", "instruction": "i want a rca cable that is high def.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09FG4XS2D" }, { "task_id": "ws_B00FWUO2IE_10308", "instruction": "i want gluten free starkist chunk light tuna in oil.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chunk light in oil" ] }, "asin": "B00FWUO2IE" }, { "task_id": "ws_B099NG13DV_10309", "instruction": "i would like a 8 gig of ram 512 ssd desktop mini with a core i5.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "8g ram 512g ssd" ] }, "asin": "B099NG13DV" }, { "task_id": "ws_B075FYSWZ8_10310", "instruction": "i want a 18 inch by 18 inch blue purple throw pillow cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue purple", "18 x 18-inch" ] }, "asin": "B075FYSWZ8" }, { "task_id": "ws_B07GLVYPTC_10311", "instruction": "i want to find a travel size fragrance that is scented with new york impression. it needs to be 0.34 fluid ounces.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "bond #9 eau de new york impression", "0.34 fl oz (pack of 1)" ] }, "asin": "B07GLVYPTC" }, { "task_id": "ws_B07GLVYPTC_10312", "instruction": "i am looking for long lasting travel size mk michael for men impression eau de parfum.", "target_attributes": { "attributes": [ "travel size", "long lasting" ], "options": [ "mk michael for men impression" ] }, "asin": "B07GLVYPTC" }, { "task_id": "ws_B00A77H96O_10313", "instruction": "i am looking for shirt of size 2x and having short sleeve.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "2x" ] }, "asin": "B00A77H96O" }, { "task_id": "ws_B09PDRQVSR_10314", "instruction": "i am lookng for10.5 size black color vintage leather high heel ankle boots for women", "target_attributes": { "attributes": [ "high heel" ], "options": [ "d01-black", "10.5" ] }, "asin": "B09PDRQVSR" }, { "task_id": "ws_B003ZSHNGS_10315", "instruction": "i'm looking for a digital camera with an optical zoom and stereo sound.", "target_attributes": { "attributes": [ "optical zoom", "stereo sound" ], "options": [] }, "asin": "B003ZSHNGS" }, { "task_id": "ws_B00796M93E_10316", "instruction": "i'm looking for non-dairy, lactose free chocolate chips.", "target_attributes": { "attributes": [ "non dairy", "lactose free" ], "options": [] }, "asin": "B00796M93E" }, { "task_id": "ws_B087WQFSLH_10317", "instruction": "i want to buy a carry case for laptop which is easy to carry and is of khaki color, and it's size should be 11-12 inch.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "khaki", "11-12 inch" ] }, "asin": "B087WQFSLH" }, { "task_id": "ws_B08VF6NHJ4_10318", "instruction": "i'm looking for an armchair for my living room; it needs to be made of premium engineered wood with camel upholstery.", "target_attributes": { "attributes": [ "engineered wood", "living room" ], "options": [ "camel", "armchair" ] }, "asin": "B08VF6NHJ4" }, { "task_id": "ws_B09962GDCV_10319", "instruction": "i want to find gluten free maple syrup that comes in a 32 fluid ounce bottle.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ ".4 pack - 32 fl oz" ] }, "asin": "B09962GDCV" }, { "task_id": "ws_B07662G9NQ_10320", "instruction": "i need a travel-size cologne balm.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B07662G9NQ" }, { "task_id": "ws_B09MYSDQ7W_10321", "instruction": "i am looking for a high resolution telescope with a phone adapter.", "target_attributes": { "attributes": [ "high resolution" ], "options": [] }, "asin": "B09MYSDQ7W" }, { "task_id": "ws_B074PYBJ5S_10322", "instruction": "i want a 4.2 ounce bottle of facial mist trio that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "facial mist trio", "4.2 ounce" ] }, "asin": "B074PYBJ5S" }, { "task_id": "ws_B09468N3GS_10323", "instruction": "i need a case for my lg stylo 6 that's green, supports wireless charging, and comes with a tempered glass screen protector.", "target_attributes": { "attributes": [ "glass screen", "tempered glass", "wireless charging" ], "options": [ "green" ] }, "asin": "B09468N3GS" }, { "task_id": "ws_B08RWVPB2T_10324", "instruction": "i am looking for heavy duty monoculars.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B08RWVPB2T" }, { "task_id": "ws_B08HJMVQTW_10325", "instruction": "i will surely succeed with your help. check my order natural deodorant for women | fresh rain + coconut oil - safe for sensitive skin |fresh rain, white floral (2 packages).", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B08HJMVQTW" }, { "task_id": "ws_B08LCPFB82_10326", "instruction": "i'm looking for a 3 sided toothbrush for fresh breath", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B08LCPFB82" }, { "task_id": "ws_B09Q7VKGHV_10327", "instruction": "i want a extra large yellow men's loose fit shirt.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "yellow", "x-large" ] }, "asin": "B09Q7VKGHV" }, { "task_id": "ws_B08QVSQGQ8_10328", "instruction": "i'm looking for a relaxed fit, short sleeve t shirt in the color white rose in the size large.", "target_attributes": { "attributes": [ "relaxed fit", "short sleeve" ], "options": [ "b07_white rose", "large" ] }, "asin": "B08QVSQGQ8" }, { "task_id": "ws_B09KM1Z4YX_10329", "instruction": "i want to find a black women's jacket for daily wear. it needs to be a small.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "f-black", "small" ] }, "asin": "B09KM1Z4YX" }, { "task_id": "ws_B08SM9436F_10330", "instruction": "i'm looking for a black 2-ounce makeup storage jar that is leak proof and easy to use.", "target_attributes": { "attributes": [ "leak proof", "easy use" ], "options": [ "black", "2 ounce" ] }, "asin": "B08SM9436F" }, { "task_id": "ws_B08SM9436F_10331", "instruction": "i want black round clear wide-mouth leak proof plastic container jars.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "black" ] }, "asin": "B08SM9436F" }, { "task_id": "ws_B07J3XFV62_10332", "instruction": "i want to buy paintings which are suitable for living room and are of color ys102 and have a size of 24x36 inch (60x90cm).", "target_attributes": { "attributes": [ "living room" ], "options": [ "ys102", "24x36inch (60x90cm)" ] }, "asin": "B07J3XFV62" }, { "task_id": "ws_B09LCDDZ7L_10333", "instruction": "i want a style b nightstand that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "style b" ] }, "asin": "B09LCDDZ7L" }, { "task_id": "ws_B000EMU234_10334", "instruction": "i am looking for some gluten free powder coffee creamer.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B000EMU234" }, { "task_id": "ws_B08RXNQGBR_10335", "instruction": "i would like a travel sized bag that is yellow", "target_attributes": { "attributes": [ "travel size" ], "options": [ "illuminating yellow" ] }, "asin": "B08RXNQGBR" }, { "task_id": "ws_B09PJYDK14_10336", "instruction": "i would like some sugar free chocolates", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "dark chocolate covered raisins" ] }, "asin": "B09PJYDK14" }, { "task_id": "ws_B08XX97T1X_10337", "instruction": "i want to find hair extensions that are platinum blonde and 18 inches long.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#60 platinum blonde", "18 inch (pack of 4)" ] }, "asin": "B08XX97T1X" }, { "task_id": "ws_B08BR8FHVZ_10338", "instruction": "i want grey men's moccasin slippers with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "grey-upgrade" ] }, "asin": "B08BR8FHVZ" }, { "task_id": "ws_B09DDCVDJ7_10339", "instruction": "i need a french vanilla soy wax candle", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "cream- french vanilla" ] }, "asin": "B09DDCVDJ7" }, { "task_id": "ws_B09P1GXX9Q_10340", "instruction": "i'm looking for a two piece swimsuit in polyester spandex. i want the black one in x-large.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "black", "x-large" ] }, "asin": "B09P1GXX9Q" }, { "task_id": "ws_B087RK2F4B_10341", "instruction": "i am interested in buying candles which are made of soy wax and are in red color.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "red" ] }, "asin": "B087RK2F4B" }, { "task_id": "ws_B07TXLDCNK_10342", "instruction": "i'm looking for longwear makeup remover towelettes for sensitive skin. make sure they're cruelty free.", "target_attributes": { "attributes": [ "fragrance free", "cruelty free", "sensitive skin" ], "options": [ "longwear" ] }, "asin": "B07TXLDCNK" }, { "task_id": "ws_B00451ZJB0_10343", "instruction": "i am looking for some gluten free vanilla caramel coffee creamers.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "vanilla caramel" ] }, "asin": "B00451ZJB0" }, { "task_id": "ws_B00451ZJB0_10344", "instruction": "i need a box of 180 single shelf stable coffee creamers that are sugar free hazelnut.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "sugar free hazelnut", "box of 180 singles" ] }, "asin": "B00451ZJB0" }, { "task_id": "ws_B0912N2VT7_10345", "instruction": "i am looking for a pair of housewarming elephant statue for living room , color: e", "target_attributes": { "attributes": [ "living room" ], "options": [ "e" ] }, "asin": "B0912N2VT7" }, { "task_id": "ws_B003X4G25C_10346", "instruction": "i'm locking for a facial cleanser, makeup remover and face wash for oil skin.", "target_attributes": { "attributes": [ "sulfate free" ], "options": [] }, "asin": "B003X4G25C" }, { "task_id": "ws_B097QYCG3Y_10347", "instruction": "i want a high quality nail drill machine.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B097QYCG3Y" }, { "task_id": "ws_B09DCCLFK4_10348", "instruction": "i'm looking for an incredibly soft fleece throw blanket that is 50\" x 80\" in size.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "50\" x 80\"" ] }, "asin": "B09DCCLFK4" }, { "task_id": "ws_B06XQXCMQZ_10349", "instruction": "i want a 18 inch by 18 inch cream blush throw pillow cover for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "cream blush", "18 x 18-inch" ] }, "asin": "B06XQXCMQZ" }, { "task_id": "ws_B09HX36HQZ_10350", "instruction": "i'm looking for golden cupcake toothpick toppers.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "golden" ] }, "asin": "B09HX36HQZ" }, { "task_id": "ws_B003VW4KJQ_10351", "instruction": "i need lead free taper candles for my living room", "target_attributes": { "attributes": [ "lead free", "living room" ], "options": [] }, "asin": "B003VW4KJQ" }, { "task_id": "ws_B0977PGVB3_10352", "instruction": "i am looking for some easy to assemble wall mounted rustic grey floating shelves.", "target_attributes": { "attributes": [ "wall mounted", "easy assemble" ], "options": [ "rustic grey" ] }, "asin": "B0977PGVB3" }, { "task_id": "ws_B07T66SFPL_10353", "instruction": "i'm looking for off shoulder short sleeve tops t-shirt bodysuit jumpsuit.", "target_attributes": { "attributes": [ "short sleeve", "long sleeve" ], "options": [ "short sleeve gray green" ] }, "asin": "B07T66SFPL" }, { "task_id": "ws_B087H1LD99_10354", "instruction": "i want to find a television stand for my living room that is nature-colored with some grey as well.", "target_attributes": { "attributes": [ "living room" ], "options": [ "nature | textured grey" ] }, "asin": "B087H1LD99" }, { "task_id": "ws_B093YSFRR7_10355", "instruction": "i want a set of 2 mesh laundry bags with flamingos and leaves design.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSFRR7" }, { "task_id": "ws_B084KJC5S1_10356", "instruction": "i'm on a low carb diet and i was recommended fried chicken skins chick n' skin - | delicious, low carb, high protein snacks, gluten free, msg free, made with organic chicken, 2 oz. per bag i want 8 bags", "target_attributes": { "attributes": [ "high protein", "low carb", "gluten free" ], "options": [ "8" ] }, "asin": "B084KJC5S1" }, { "task_id": "ws_B095WWB4Y3_10357", "instruction": "i am looking for a pair of men's small gym shorts that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "small" ] }, "asin": "B095WWB4Y3" }, { "task_id": "ws_B00VWQT2KU_10358", "instruction": "i'm looking for a plug and play security system with motion detection. it should have an 8 channel dvr, 4 cameras, and a 1 terabyte hard disk.", "target_attributes": { "attributes": [ "plug play", "motion detection" ], "options": [ "8 channel dvr + 4 cameras +1tb hard disk" ] }, "asin": "B00VWQT2KU" }, { "task_id": "ws_B08DKBYQ3R_10359", "instruction": "i want to find 30-inch long hair extension braids in a pack of 6. the color needs to be #613.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "1b | 27 | 613#", "30 inch (pack of 6)" ] }, "asin": "B08DKBYQ3R" }, { "task_id": "ws_B07Y8QCL6Y_10360", "instruction": "i am looking for a mini pc with an intel core i5 cpu.", "target_attributes": { "attributes": [ "core i5", "intel core" ], "options": [] }, "asin": "B07Y8QCL6Y" }, { "task_id": "ws_B09LRY6H41_10361", "instruction": "i am looking for a real fruit coconut and pineapple drink.", "target_attributes": { "attributes": [ "real fruit" ], "options": [ "coco pineapple" ] }, "asin": "B09LRY6H41" }, { "task_id": "ws_B08MXC72RZ_10362", "instruction": "i am looking for classic casual rubber sole soft walking slip-ons of size 10 with khaki lace up", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "khaki lace up", "10" ] }, "asin": "B08MXC72RZ" }, { "task_id": "ws_B078N4PCQM_10363", "instruction": "i want a green mattress solution 4-inch wood split low profile traditional box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "green" ] }, "asin": "B078N4PCQM" }, { "task_id": "ws_B013I738K0_10364", "instruction": "i'm looking for 1.3 ounce sensible foods fat free fruit snacks with cherry berry flvour", "target_attributes": { "attributes": [ "fat free" ], "options": [ "cherry berry", "1.3 ounce (12 count)" ] }, "asin": "B013I738K0" }, { "task_id": "ws_B08LFW7KPB_10365", "instruction": "i need a tv stand for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B08LFW7KPB" }, { "task_id": "ws_B09P9LDN8Z_10366", "instruction": "i am looking for gray(new) color sofa bed that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "gray(new)" ] }, "asin": "B09P9LDN8Z" }, { "task_id": "ws_B09R82T74S_10367", "instruction": "i'm looking for an anti aging facial roller in color f.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "f" ] }, "asin": "B09R82T74S" }, { "task_id": "ws_B095WB4TNZ_10368", "instruction": "i want a wireless outdoor security camera with motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B095WB4TNZ" }, { "task_id": "ws_B07B7FKM4T_10369", "instruction": "i need a black colored chandelier for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B07B7FKM4T" }, { "task_id": "ws_B004KQF9YW_10370", "instruction": "i want a 2.7 ounce stick of mitchum men triple odor defense anti-perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [ "2.7 ounce" ] }, "asin": "B004KQF9YW" }, { "task_id": "ws_B09J4M3FS9_10371", "instruction": "i am looking for an easy to use stainless steel green monocular telescope for a smartphone.", "target_attributes": { "attributes": [ "easy install", "stainless steel" ], "options": [ "green" ] }, "asin": "B09J4M3FS9" }, { "task_id": "ws_B074PRMLY8_10372", "instruction": "i am looking for a hair loss shampoo for damaged hair.", "target_attributes": { "attributes": [ "hair loss", "damaged hair" ], "options": [] }, "asin": "B074PRMLY8" }, { "task_id": "ws_B075T77RW1_10373", "instruction": "i would like steel frame drafting tables", "target_attributes": { "attributes": [ "steel frame" ], "options": [] }, "asin": "B075T77RW1" }, { "task_id": "ws_B082HCK3M1_10374", "instruction": "i need a easy to use hdmi display adapter with high definition.", "target_attributes": { "attributes": [ "easy use", "high definition" ], "options": [] }, "asin": "B082HCK3M1" }, { "task_id": "ws_B09QSVY6WP_10375", "instruction": "i am interested in a media player that has batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09QSVY6WP" }, { "task_id": "ws_B086N1MGFS_10376", "instruction": "i want a 0.75 ounce soft peach foundation that is paraben free.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "soft peach", "0.75 ounce (pack of 1)" ] }, "asin": "B086N1MGFS" }, { "task_id": "ws_B000MCGEYM_10377", "instruction": "i want a 150 watt black speaker that is heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black", "150 watts", "speakers + bluetooth marine receiver stereo" ] }, "asin": "B000MCGEYM" }, { "task_id": "ws_B00FSZRWZS_10378", "instruction": "i need a three pack deodorant that is made for sensitive skin", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ ".2 pack(2.6 ounce (pack of 3))" ] }, "asin": "B00FSZRWZS" }, { "task_id": "ws_B07215YT9K_10379", "instruction": "i want to find a pair of small, navy-colored active shorts for men that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy", "small" ] }, "asin": "B07215YT9K" }, { "task_id": "ws_B09MKB5ZL3_10380", "instruction": "i'm looking for a pair of pink wireless bluetooth headphones with stereo sound.", "target_attributes": { "attributes": [ "stereo sound", "wireless bluetooth" ], "options": [ "pink" ] }, "asin": "B09MKB5ZL3" }, { "task_id": "ws_B09C86HRZ6_10381", "instruction": "i want xx-large fabiurt loose fit plus size tops for women.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "xx-large" ] }, "asin": "B09C86HRZ6" }, { "task_id": "ws_B07CGG4WN1_10382", "instruction": "i want a pair of 50 by 108 inch red pink peach window panels for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "red pink peach", "pair of - 50\" x 108\"" ] }, "asin": "B07CGG4WN1" }, { "task_id": "ws_B09PYK8SNV_10383", "instruction": "i want to find an office chair that offers lumbar support. i also want to be able to adjust the height.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [] }, "asin": "B09PYK8SNV" }, { "task_id": "ws_B01KVU8JBK_10384", "instruction": "i want to find gluten free mango salsa that is bacon habanero flavored.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "bacon habanero" ] }, "asin": "B01KVU8JBK" }, { "task_id": "ws_B08XMNHPXY_10385", "instruction": "i am looking for dark green color phone case cover which is dust proof.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "dark green" ] }, "asin": "B08XMNHPXY" }, { "task_id": "ws_B09MWB8VWW_10386", "instruction": "i am looking for space saving espresso color bed.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "espresso" ] }, "asin": "B09MWB8VWW" }, { "task_id": "ws_B09P1593Z6_10387", "instruction": "i want a 10 by 7 ft a16 photo background that is light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a16", "10x7ft | 3x2.2m" ] }, "asin": "B09P1593Z6" }, { "task_id": "ws_B08THVMLZK_10388", "instruction": "look for it in stock. dustproof case for ps5, anti-dust cover dust plugs hdmi usb interface for ps5 console with 10pcs silicone ps5 controller joystick grips, sky pink", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "pink sky" ] }, "asin": "B08THVMLZK" }, { "task_id": "ws_B07PY96H2Q_10389", "instruction": "i'm looking for oil free hair conditioner that offers a cruelty free certification.", "target_attributes": { "attributes": [ "oil free" ], "options": [] }, "asin": "B07PY96H2Q" }, { "task_id": "ws_B082SL5XFG_10390", "instruction": "i am looking for power cord outlet socket cable plug for wireless bluetooth speakers.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B082SL5XFG" }, { "task_id": "ws_B09HSTMV93_10391", "instruction": "i am looking for a high quality and easy to clean tongue cleaner.", "target_attributes": { "attributes": [ "easy clean", "high quality" ], "options": [] }, "asin": "B09HSTMV93" }, { "task_id": "ws_B07RMZ8BBP_10392", "instruction": "i would like a pair of 36 regular cut off white bull denim shorts that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "white bull denim - stretch", "cut off", "36 regular" ] }, "asin": "B07RMZ8BBP" }, { "task_id": "ws_B09RZRT4QD_10393", "instruction": "i want to find an open-toed pair of women's fashion wedges in a wide size 11. they should be khaki colored.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "a6 - khaki", "11 wide" ] }, "asin": "B09RZRT4QD" }, { "task_id": "ws_B08Q7RNY1W_10394", "instruction": "i need a long lasting organic deodorant.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B08Q7RNY1W" }, { "task_id": "ws_B0042RBHXQ_10395", "instruction": "i want gluten free lang's chocolates milk chocolate dessert cups.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "chocolate" ] }, "asin": "B0042RBHXQ" }, { "task_id": "ws_B083DP4MCM_10396", "instruction": "i am looking for travel size pump bottles with lotion nozzles.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "lotion nozzle" ] }, "asin": "B083DP4MCM" }, { "task_id": "ws_B00F8M95YW_10397", "instruction": "i want to order a bottle of shampoo with coconut oil for dry, damaged hair.", "target_attributes": { "attributes": [ "coconut oil", "damaged hair", "dry hair" ], "options": [] }, "asin": "B00F8M95YW" }, { "task_id": "ws_B093K698Z1_10398", "instruction": "find set of 2 medium pig astronaut-1 mesh laundry bags and 1 small laundry bag, i will give as a gift at a kitchen shower", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093K698Z1" }, { "task_id": "ws_B096JSQ38T_10399", "instruction": "i am in need of 5 sets happy birthday cake toppers", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B096JSQ38T" }, { "task_id": "ws_B08YRN6MNT_10400", "instruction": "i'm looking for a rolling cart offering 3 levels that is made with a steel frame and is painted black.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "black" ] }, "asin": "B08YRN6MNT" }, { "task_id": "ws_B07DVRW4NN_10401", "instruction": "i'm looking for a 6 foot long, high performance coaxial cable", "target_attributes": { "attributes": [ "high performance", "coaxial cable" ], "options": [ "6 feet (1.8 meter)" ] }, "asin": "B07DVRW4NN" }, { "task_id": "ws_B08PJY7GW8_10402", "instruction": "i am looking for a wall art of size 36\" x 24'' x 2 for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "36\" x 24'' x 2" ] }, "asin": "B08PJY7GW8" }, { "task_id": "ws_B09FF1GQ74_10403", "instruction": "i want a 10 piece of green brush set for synthetic hair.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "10pcs green" ] }, "asin": "B09FF1GQ74" }, { "task_id": "ws_B07GBXKRCT_10404", "instruction": "i want a core i5 tablet.", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B07GBXKRCT" }, { "task_id": "ws_B07Q7MFB5G_10405", "instruction": "i am looking for cognac zebra color women's sneaker having rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "cognac zebra" ] }, "asin": "B07Q7MFB5G" }, { "task_id": "ws_B079LXH6NX_10406", "instruction": "i need some noise cancelling headphones", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B079LXH6NX" }, { "task_id": "ws_B08QN1H2RD_10407", "instruction": "i am looking for 2 easy to assemble grey barstools.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "2 grey barstools" ] }, "asin": "B08QN1H2RD" }, { "task_id": "ws_B015OW3TAQ_10408", "instruction": "i need a five pack of three foot hdmi cables that support 1080p and are gold plated.", "target_attributes": { "attributes": [ "1080p hd", "gold plated" ], "options": [ "3 feet", "5-pack" ] }, "asin": "B015OW3TAQ" }, { "task_id": "ws_B076CK9K6X_10409", "instruction": "i want a 4 ounce bag of bbq jerky that is high in protein.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "bbq", "4 ounce" ] }, "asin": "B076CK9K6X" }, { "task_id": "ws_B009AGABCM_10410", "instruction": "i want to find vintage men's jeans with a regular, but still comfortable, fit. the jeans should be 38 inches in width and 36 inches in length and be river denim in color.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "river denim", "regular", "38w x 36l" ] }, "asin": "B009AGABCM" }, { "task_id": "ws_B07F1PNPT3_10411", "instruction": "help me find this model today: eldof women peep toe pump medium heel, rubber sole, brown color and size 8.5 . i'm giving up on finding it so much i've searched.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown", "8.5" ] }, "asin": "B07F1PNPT3" }, { "task_id": "ws_B09P3R6STB_10412", "instruction": "i'd like a three piece bikini set for a teen girl. i need it in purple, size xx large.", "target_attributes": { "attributes": [ "tumble dry", "teen girls" ], "options": [ "swimsuits-a091-purple", "xx-large" ] }, "asin": "B09P3R6STB" }, { "task_id": "ws_B00AREGVUM_10413", "instruction": "i'm looking for clinically proven, anti-aging body oil in a package of 3 of .85 fl oz bottles.", "target_attributes": { "attributes": [ "clinically proven", "anti aging" ], "options": [ "0.85 fl oz (pack of 3)" ] }, "asin": "B00AREGVUM" }, { "task_id": "ws_B09QCY7VYW_10414", "instruction": "i want black cooki heeled open toe sandals for women.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "z2 black" ] }, "asin": "B09QCY7VYW" }, { "task_id": "ws_B07TPSYZBG_10415", "instruction": "i want to find canvas wall art that is 30x60 inches in dimension. i want it to be poppy colored and it should be suitable for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "poppy", "30x60in" ] }, "asin": "B07TPSYZBG" }, { "task_id": "ws_B08QDWVNVF_10416", "instruction": "i need a space saving table for my dining room in espresso.", "target_attributes": { "attributes": [ "space saving", "dining room" ], "options": [ "espresso" ] }, "asin": "B08QDWVNVF" }, { "task_id": "ws_B09QX5BT3K_10417", "instruction": "i would like a medium gray henley with short sleeves.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "gray", "medium" ] }, "asin": "B09QX5BT3K" }, { "task_id": "ws_B09KLMRFP9_10418", "instruction": "i need a clear, eco-friendly 6.7 ounce spray bottle.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "2 clear", "6.7 ounce" ] }, "asin": "B09KLMRFP9" }, { "task_id": "ws_B01LYRBH74_10419", "instruction": "i am looking for kosher certified premium gourmet spices of european chicken seasoning -12 oz", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "european chicken seasoning 12 oz" ] }, "asin": "B01LYRBH74" }, { "task_id": "ws_B07G3986RC_10420", "instruction": "buy me a heart flavored tea without caffeine", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "heart" ] }, "asin": "B07G3986RC" }, { "task_id": "ws_B07N32XJSY_10421", "instruction": "i'm locking for blueberry lavender flavored almond beverage.", "target_attributes": { "attributes": [ "non dairy" ], "options": [] }, "asin": "B07N32XJSY" }, { "task_id": "ws_B08P3RQ6DY_10422", "instruction": "i am interested in non gmo puffed snacks", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B08P3RQ6DY" }, { "task_id": "ws_B09MZB12N3_10423", "instruction": "i'm locking for a lip sleeping mask.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B09MZB12N3" }, { "task_id": "ws_B091DYR5QL_10424", "instruction": "i want gluten free shangri-la tea company organic green tea bags.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "premium green" ] }, "asin": "B091DYR5QL" }, { "task_id": "ws_B076DL1VLG_10425", "instruction": "i want a sulfate free shampoo & conditioner set with biotin scent", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "biotin & collagen" ] }, "asin": "B076DL1VLG" }, { "task_id": "ws_B08BFDSRL3_10426", "instruction": "i need straight leg jeans that are 56w by 30l", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "56w x 30l" ] }, "asin": "B08BFDSRL3" }, { "task_id": "ws_B0776NB4YW_10427", "instruction": "i'm looking for a certified organic castor oil. choose the ones that come in 16 oz package.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "organic castor oil 16 oz" ] }, "asin": "B0776NB4YW" }, { "task_id": "ws_B09RWW23NJ_10428", "instruction": "i need a medium sized board shorts with a elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "medium" ] }, "asin": "B09RWW23NJ" }, { "task_id": "ws_B0738CN28V_10429", "instruction": "lasgoos design natural look lightweight reusable false eyelashes eye makeup 11/5 pairs/box (a10) find it and tell me", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "011-5pairs" ] }, "asin": "B0738CN28V" }, { "task_id": "ws_B0969NHZCY_10430", "instruction": "i want to find machine washable curtains for my living room in the color 5.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "colour5" ] }, "asin": "B0969NHZCY" }, { "task_id": "ws_B09BF9HKMT_10431", "instruction": "i am looking for smart bands of size 40mm and are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "40mm" ] }, "asin": "B09BF9HKMT" }, { "task_id": "ws_B07KK42V6D_10432", "instruction": "i'm looking for a keto friendly hot cocoa mix in dark chocolate flavor.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "simply dark chocolate" ] }, "asin": "B07KK42V6D" }, { "task_id": "ws_B09RQ8LRDT_10433", "instruction": "i'm looking for some highly pigmented, long lasting eye shadow in color \"c.\"", "target_attributes": { "attributes": [ "highly pigmented", "long lasting", "eye shadow" ], "options": [ "c" ] }, "asin": "B09RQ8LRDT" }, { "task_id": "ws_B0963LTSXB_10434", "instruction": "i want green comfy womens closed toe clogs shoes.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "green" ] }, "asin": "B0963LTSXB" }, { "task_id": "ws_B09Q6CTMF7_10435", "instruction": "i want a blue toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "blue" ] }, "asin": "B09Q6CTMF7" }, { "task_id": "ws_B09FFKMF4T_10436", "instruction": "i would like a pair of size 9 white synthetic leather clogs with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "white synthetic leather", "9" ] }, "asin": "B09FFKMF4T" }, { "task_id": "ws_B09F3WRKVG_10437", "instruction": "i want a navy blue biedori womens casual long sleeve dress.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "navy blue" ] }, "asin": "B09F3WRKVG" }, { "task_id": "ws_B07B4RZ87J_10438", "instruction": "i want a 8.5 fl oz of mizani true textures cream cleansing conditioner with coconut oil.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "8.5 fl oz" ] }, "asin": "B07B4RZ87J" }, { "task_id": "ws_B07DS5BR42_10439", "instruction": "i am looking for chocolate chip flavor non gmo cookies.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "chocolate chip" ] }, "asin": "B07DS5BR42" }, { "task_id": "ws_B08S6XCNDG_10440", "instruction": "i am looking for rocky mount color slim fit jeans.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "rocky mount" ] }, "asin": "B08S6XCNDG" }, { "task_id": "ws_B09Q6CSF2B_10441", "instruction": "i'm looking for a dvd recorder that features stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B09Q6CSF2B" }, { "task_id": "ws_B07K125KWT_10442", "instruction": "i want a bookshelf for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "bookshelf" ] }, "asin": "B07K125KWT" }, { "task_id": "ws_B092PMT773_10443", "instruction": "i am looking for a steel frame storage tower in the color dark gray.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "dark gray" ] }, "asin": "B092PMT773" }, { "task_id": "ws_B07STGB556_10444", "instruction": "loeffler randall paulina-ks closed toe leather sole", "target_attributes": { "attributes": [ "leather sole", "closed toe" ], "options": [] }, "asin": "B07STGB556" }, { "task_id": "ws_B00REDUNLW_10445", "instruction": "i'm looking for a bag of salty sweet mixed nuts in a resealable bag. they should be gmo-free.", "target_attributes": { "attributes": [ "non gmo", "resealable bag" ], "options": [ "salty sweet mixed nuts" ] }, "asin": "B00REDUNLW" }, { "task_id": "ws_B08ZKWSC2G_10446", "instruction": "i am looking for a 2 light wall sconce for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "2-light" ] }, "asin": "B08ZKWSC2G" }, { "task_id": "ws_B003WT31QQ_10447", "instruction": "get a gluten free tuna fish. it should be pack of 60 with 5 ounces.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B003WT31QQ" }, { "task_id": "ws_B09N97FN78_10448", "instruction": "i would like a gold plated hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [] }, "asin": "B09N97FN78" }, { "task_id": "ws_B09N75L4RD_10449", "instruction": "i'm looking for a pair of medium sized, straight leg men's black dress pants.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "black", "medium" ] }, "asin": "B09N75L4RD" }, { "task_id": "ws_B09MCWS928_10450", "instruction": "i need double-sided face wash sponge ( 4 color)", "target_attributes": { "attributes": [ "double sided" ], "options": [ "04" ] }, "asin": "B09MCWS928" }, { "task_id": "ws_B018SFM042_10451", "instruction": "i want travel size cornucopia 1-ounce cobalt glass jars.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B018SFM042" }, { "task_id": "ws_B000E0QFSC_10452", "instruction": "i'd like to shop for a vanity light with a bronze finish and glass shades.", "target_attributes": { "attributes": [ "bronze finish", "vanity light", "glass shade" ], "options": [] }, "asin": "B000E0QFSC" }, { "task_id": "ws_B096KCZFVS_10453", "instruction": "i am looking for antique gray color nightstand that is fully assembled.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "antique gray" ] }, "asin": "B096KCZFVS" }, { "task_id": "ws_B09BR9F792_10454", "instruction": "i am looking for throw blanket of size 60\"x80\" and is super soft.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "60\"x80\"" ] }, "asin": "B09BR9F792" }, { "task_id": "ws_B09Q55LNN6_10455", "instruction": "i need a multi9 floor lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi9" ] }, "asin": "B09Q55LNN6" }, { "task_id": "ws_B07YWBHL1C_10456", "instruction": "i am looking for an easy to clean foot stool for a beauty salon.", "target_attributes": { "attributes": [ "easy clean", "beauty salon" ], "options": [] }, "asin": "B07YWBHL1C" }, { "task_id": "ws_B098J857T8_10457", "instruction": "i'm locking for a bathroom lighting over modern style mirror.", "target_attributes": { "attributes": [ "vanity light" ], "options": [] }, "asin": "B098J857T8" }, { "task_id": "ws_B09N7D3MCC_10458", "instruction": "i want a gold colored and high performance android tablet.", "target_attributes": { "attributes": [ "high performance" ], "options": [ "gold" ] }, "asin": "B09N7D3MCC" }, { "task_id": "ws_B09N3BVWCJ_10459", "instruction": "i would like a cupcake topper for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B09N3BVWCJ" }, { "task_id": "ws_B095N8PLXY_10460", "instruction": "i want to find burgundy colored moccasins with faux fur in a size 7.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "burgundy", "7" ] }, "asin": "B095N8PLXY" }, { "task_id": "ws_B07DK2673W_10461", "instruction": "i want to find a plant-based belly oil for pregnancy and stretch marks with a legacy pattern.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "legacy" ] }, "asin": "B07DK2673W" }, { "task_id": "ws_B08G8492L2_10462", "instruction": "i am looking for 2 blue color body brush that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "2 blue" ] }, "asin": "B08G8492L2" }, { "task_id": "ws_B083C5DWWD_10463", "instruction": "i am looking for tea tree shampoo for dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "tea tree shampoo" ] }, "asin": "B083C5DWWD" }, { "task_id": "ws_B08ZHTCQSH_10464", "instruction": "i want white cotton laundry baskets that can be wall mounted.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "white cotton" ] }, "asin": "B08ZHTCQSH" }, { "task_id": "ws_B09NY99T88_10465", "instruction": "i want a 1080p smart home surveillance camera.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B09NY99T88" }, { "task_id": "ws_B09KZG4LF8_10466", "instruction": "i am looking for khaki colored nightstand for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "khaki" ] }, "asin": "B09KZG4LF8" }, { "task_id": "ws_B09FJRH69S_10467", "instruction": "i am looking for a 60 inch by 50 inch machine washable super soft throw blanket.", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "60\"x50\"" ] }, "asin": "B09FJRH69S" }, { "task_id": "ws_B09JZRLPMV_10468", "instruction": "i am looking for sparkling water of fizzy lychee flavor having low carb.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "fizzy lychee" ] }, "asin": "B09JZRLPMV" }, { "task_id": "ws_B09FS255S4_10469", "instruction": "i am looking for revitalizing conditioner of size 1 pack used for hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "1 pack" ] }, "asin": "B09FS255S4" }, { "task_id": "ws_B00MHGYTYI_10470", "instruction": "please find me an eight ounce bottle of pomegranate and fig moisturizer that's cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "pomegranate and fig", "8 oz" ] }, "asin": "B00MHGYTYI" }, { "task_id": "ws_B0163N2T38_10471", "instruction": "i want to find a wireless headset that is hands-free. the color should be grey and the style should be classic.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "litegry", "classic" ] }, "asin": "B0163N2T38" }, { "task_id": "ws_B09GBDGJRL_10472", "instruction": "i'm looking for lowrise blue sweatpants in a medium.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "blue8", "medium" ] }, "asin": "B09GBDGJRL" }, { "task_id": "ws_B08Q7QK29Q_10473", "instruction": "i want to buy hair extensions clips for synthetic hair and they should be red and green colors.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "red+green" ] }, "asin": "B08Q7QK29Q" }, { "task_id": "ws_B09Q2ZB3CF_10474", "instruction": "i want sloth floral women's slip on canvas non slip shoes in size 8.5", "target_attributes": { "attributes": [ "non slip" ], "options": [ "8.5" ] }, "asin": "B09Q2ZB3CF" }, { "task_id": "ws_B08XMMFD22_10475", "instruction": "i am looking for multi 06 color duvet cover set for king size bed.", "target_attributes": { "attributes": [ "king size" ], "options": [ "multi 06" ] }, "asin": "B08XMMFD22" }, { "task_id": "ws_B09N6L96GT_10476", "instruction": "i want a 17.7 in long by 17.7 inch 1042117309949930000 window panel for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "1042117309949930000", "(width\uff0917.7in x (length)17.7in x 2pcs" ] }, "asin": "B09N6L96GT" }, { "task_id": "ws_B098B96PP7_10477", "instruction": "i am looking for adjustable child learning blue color desk chair with lumbar support", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "blue" ] }, "asin": "B098B96PP7" }, { "task_id": "ws_B09GBC7N2B_10478", "instruction": "i want to buy a skirt for women which is high waist, and is of olive color, and the size of x-large.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "olive", "x-large" ] }, "asin": "B09GBC7N2B" }, { "task_id": "ws_B09H7S4Q28_10479", "instruction": "i'm looking for a super soft and easy to clean throw blanket. choose the ones that come in cartoon3 color.", "target_attributes": { "attributes": [ "super soft", "easy clean" ], "options": [ "cartoon3" ] }, "asin": "B09H7S4Q28" }, { "task_id": "ws_B08118H4KB_10480", "instruction": "i'm looking for a comfortable fit yoga tank in size 1x and the color light grey heather.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "light grey heather", "1x" ] }, "asin": "B08118H4KB" }, { "task_id": "ws_B083JJVQVX_10481", "instruction": "find gluten-free nori flakes.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B083JJVQVX" }, { "task_id": "ws_B08JYMFM1N_10482", "instruction": "i want a pair of dark brown easy spirit elinot women's boots with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "dark brown" ] }, "asin": "B08JYMFM1N" }, { "task_id": "ws_B0041YSU76_10483", "instruction": "i am looking for effortless paraben free eye liner", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B0041YSU76" }, { "task_id": "ws_B083VSPFVC_10484", "instruction": "i'm looking for a hair treatment with tea tree oil. i need one that's for dry hair and promotes hair growth.", "target_attributes": { "attributes": [ "tea tree", "dry hair", "hair growth" ], "options": [] }, "asin": "B083VSPFVC" }, { "task_id": "ws_B08SRBT86D_10485", "instruction": "i need a 33 inch living room end table", "target_attributes": { "attributes": [ "living room" ], "options": [ "33 inch" ] }, "asin": "B08SRBT86D" }, { "task_id": "ws_B084623LWW_10486", "instruction": "i am looking for a men's large navy star wars t-shirt.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "navy", "men", "large" ] }, "asin": "B084623LWW" }, { "task_id": "ws_B01K8OQRT0_10487", "instruction": "i'm looking for a white coaxial cable that is 10 feet long.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [ "white" ] }, "asin": "B01K8OQRT0" }, { "task_id": "ws_B08D6ZFWDQ_10488", "instruction": "i am looking for10th gen intel core i7 -32 gb ram 2tb sotrage capacity pc", "target_attributes": { "attributes": [ "intel core" ], "options": [ "2tb", "i7 | 32gb" ] }, "asin": "B08D6ZFWDQ" }, { "task_id": "ws_B08RYBSZZG_10489", "instruction": "i need an x-large button down shirt that i can double dry", "target_attributes": { "attributes": [ "tumble dry" ], "options": [ "x-large" ] }, "asin": "B08RYBSZZG" }, { "task_id": "ws_B085PL16RW_10490", "instruction": "i want a purple conditioner for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "purple conditioner" ] }, "asin": "B085PL16RW" }, { "task_id": "ws_B000W7OL0Q_10491", "instruction": "i'm looking for some cologne that is scented with green tea.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B000W7OL0Q" }, { "task_id": "ws_B07G3J9CKY_10492", "instruction": "i want to buy foundation for mattress set which is ready to use and fully assembled.", "target_attributes": { "attributes": [ "ready use", "fully assembled" ], "options": [] }, "asin": "B07G3J9CKY" }, { "task_id": "ws_B0781HSDTZ_10493", "instruction": "i need a three meter gold placed rca audio cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "3m | 10ft" ] }, "asin": "B0781HSDTZ" }, { "task_id": "ws_B08THCND64_10494", "instruction": "i need an adapter with output protection", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B08THCND64" }, { "task_id": "ws_B0871V6GWY_10495", "instruction": "i'm looking for a 31-inch clear glass vanity light.", "target_attributes": { "attributes": [ "vanity light", "clear glass" ], "options": [ "31.0 inch" ] }, "asin": "B0871V6GWY" }, { "task_id": "ws_B0871V6GWY_10496", "instruction": "i am looking for a bathroom vanity light fixture with clear glass. also, please make sure that it is at least 31 inches in size.", "target_attributes": { "attributes": [ "vanity light", "clear glass" ], "options": [ "31.0 inch" ] }, "asin": "B0871V6GWY" }, { "task_id": "ws_B006MIUM20_10497", "instruction": "i need a black bed frame that is made of steel for a queen sized bed.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "black", "queen" ] }, "asin": "B006MIUM20" }, { "task_id": "ws_B08HSXB9FV_10498", "instruction": "i want black modern led chandeliers for dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "black" ] }, "asin": "B08HSXB9FV" }, { "task_id": "ws_B07BCQPKMP_10499", "instruction": "i would like extra large checkered sleep pants that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "with checker pant", "x-large" ] }, "asin": "B07BCQPKMP" }, { "task_id": "ws_B002865CGG_10500", "instruction": "i want fat free mariani pitted dates.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "pitted dates" ] }, "asin": "B002865CGG" }, { "task_id": "ws_B09PG42SJW_10501", "instruction": "i want a stainless steel ladies eyebrow razor shaver.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B09PG42SJW" }, { "task_id": "ws_B08PYFDCRB_10502", "instruction": "i am looking for an easy to install 3 light vintage black wall sconce.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "3 light" ] }, "asin": "B08PYFDCRB" }, { "task_id": "ws_B09KKVKQ79_10503", "instruction": "i need fleece lined underwear that is striped grey and comes in an xx-large", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "stripe-grey", "xx-large" ] }, "asin": "B09KKVKQ79" }, { "task_id": "ws_B09HXC625B_10504", "instruction": "i would like a 90 men's santa sleep set that i can hand wash.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "black&plaid- santa", "men", "90" ] }, "asin": "B09HXC625B" }, { "task_id": "ws_B085VK2CWK_10505", "instruction": "i need some bluetooth speakers that offer stereo sound are are cobalt blue", "target_attributes": { "attributes": [ "stereo sound" ], "options": [ "cobalt blue" ] }, "asin": "B085VK2CWK" }, { "task_id": "ws_B076639JKZ_10506", "instruction": "i am looking for kosher certified caffeinated chocolate bites.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "30" ] }, "asin": "B076639JKZ" }, { "task_id": "ws_B08DHM2Z3F_10507", "instruction": "buy me a travel sized bottle of impression chanel 1932.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "chanel 1932 impression" ] }, "asin": "B08DHM2Z3F" }, { "task_id": "ws_B09D4WLH5N_10508", "instruction": "i am looking for a desktop pc that is a core i5 and has 8gb of ram with a 512gb ssd.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "8gb ram | 512gb ssd" ] }, "asin": "B09D4WLH5N" }, { "task_id": "ws_B08DKPD2Z7_10509", "instruction": "i am looking for a twin size bed with easy assemble. also choose white color.", "target_attributes": { "attributes": [ "twin size", "easy assemble" ], "options": [ "white" ] }, "asin": "B08DKPD2Z7" }, { "task_id": "ws_B09FJXKDS6_10510", "instruction": "i would like a stainless steel adjustable base.", "target_attributes": { "attributes": [ "height adjustable", "stainless steel" ], "options": [] }, "asin": "B09FJXKDS6" }, { "task_id": "ws_B09CPFNX2Z_10511", "instruction": "i need some shades that are for the living room and are black and white with a size of 28\" by 64\"", "target_attributes": { "attributes": [ "living room" ], "options": [ "blackout - white", "28\"w x 64\"h" ] }, "asin": "B09CPFNX2Z" }, { "task_id": "ws_B0924ZDJNX_10512", "instruction": "i need long lasting eyeshadow that is in the color 01", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "01" ] }, "asin": "B0924ZDJNX" }, { "task_id": "ws_B09DVSVCR7_10513", "instruction": "i need a media player that is easy to carry", "target_attributes": { "attributes": [ "easy carry" ], "options": [] }, "asin": "B09DVSVCR7" }, { "task_id": "ws_B01NCA7RCV_10514", "instruction": "i want grey new balance men's shoes with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "grey" ] }, "asin": "B01NCA7RCV" }, { "task_id": "ws_B096DSLRV8_10515", "instruction": "i would like some orange walking shoes that have a rubber sole in a size 10.5.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "orange", "10.5" ] }, "asin": "B096DSLRV8" }, { "task_id": "ws_B09N6MZ66Y_10516", "instruction": "i am looking for blue non slip women's sandals that are size 9.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "9" ] }, "asin": "B09N6MZ66Y" }, { "task_id": "ws_B08QM8KGPH_10517", "instruction": "get me a quick release camera tripod made out of aluminum alloy.", "target_attributes": { "attributes": [ "quick release", "aluminum alloy" ], "options": [] }, "asin": "B08QM8KGPH" }, { "task_id": "ws_B095C1TB9H_10518", "instruction": "i need a cosmetic bag that is easy to carry and is leopard print.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "leopard 113" ] }, "asin": "B095C1TB9H" }, { "task_id": "ws_B08KGD4399_10519", "instruction": "i would like a wall mounted mirror for my living room.", "target_attributes": { "attributes": [ "wall mounted", "living room" ], "options": [] }, "asin": "B08KGD4399" }, { "task_id": "ws_B08BJX51RG_10520", "instruction": "i am looking for a plant based probiotic tea.", "target_attributes": { "attributes": [ "plant based" ], "options": [] }, "asin": "B08BJX51RG" }, { "task_id": "ws_B09NDSDVQJ_10521", "instruction": "i need a slim fiting sweater that is green and in 3x large.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "green", "3x-large" ] }, "asin": "B09NDSDVQJ" }, { "task_id": "ws_B07Q5VPJ8R_10522", "instruction": "i need an officially licensed star wars \u201cyoda best grandpa\u201c t-shirt. get one that is a youth size and make it black.", "target_attributes": { "attributes": [ "officially licensed", "star wars" ], "options": [ "black", "youth" ] }, "asin": "B07Q5VPJ8R" }, { "task_id": "ws_B07PK2WMWQ_10523", "instruction": "i am looking for a four pack of chocolate protein drinks that are dairy free.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "chocolate", "11 fl oz (pack of 4)" ] }, "asin": "B07PK2WMWQ" }, { "task_id": "ws_B07G78835P_10524", "instruction": "i want a body brush nature boar bristles back scrubber for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B07G78835P" }, { "task_id": "ws_B07MDRMNK8_10525", "instruction": "i want a travel size toiletry bag.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B07MDRMNK8" }, { "task_id": "ws_B08W8G4QXF_10526", "instruction": "look for a sixteen ounce bottle of shampoo that's paraben free and plant based.", "target_attributes": { "attributes": [ "paraben free", "plant based" ], "options": [ "16 fl oz (pack of 6)" ] }, "asin": "B08W8G4QXF" }, { "task_id": "ws_B08W2YD6BL_10527", "instruction": "i need to order a pair of blue snow boots in size five.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "blue 107", "5" ] }, "asin": "B08W2YD6BL" }, { "task_id": "ws_B07CHV6G21_10528", "instruction": "i need a 8 fluid ounce bottle of redwood mist body wash made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "redwood mist", "8 fl oz (pack of 1)" ] }, "asin": "B07CHV6G21" }, { "task_id": "ws_B019ILMPCW_10529", "instruction": "i need two one hundred foot male to male hdmi cables. they should be high speed and gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "2 pack", "100 feet (single pack)", "hdmi male to male" ] }, "asin": "B019ILMPCW" }, { "task_id": "ws_B019ILMPCW_10530", "instruction": "i want a high speed hdmi male to female cable. i need it to be 40 feet in single pack.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "40 feet (single pack)", "hdmi male to female" ] }, "asin": "B019ILMPCW" }, { "task_id": "ws_B09MTBV2PG_10531", "instruction": "i am in need of easy to use hair curlers rollers which is good for diy hair styling.", "target_attributes": { "attributes": [ "easy use", "hair styling" ], "options": [] }, "asin": "B09MTBV2PG" }, { "task_id": "ws_B09T6SMG6S_10532", "instruction": "i would like a medium sized red jumpsuit that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "red", "medium" ] }, "asin": "B09T6SMG6S" }, { "task_id": "ws_B0865SKG5G_10533", "instruction": "please show me a black white 05 sneaker for man. i'm looking for a sneaker for men with synthetic sole, size 9.5.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "black white 05", "9.5" ] }, "asin": "B0865SKG5G" }, { "task_id": "ws_B09PQG6HHY_10534", "instruction": "i would like some monoculars for birdwatching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09PQG6HHY" }, { "task_id": "ws_B07KGMLRR7_10535", "instruction": "i would like a roelson table that is made of solid wood.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "roelson" ] }, "asin": "B07KGMLRR7" }, { "task_id": "ws_B08ZT1DWTC_10536", "instruction": "i would like some 10 inch high quality hair extensions.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "10 inch" ] }, "asin": "B08ZT1DWTC" }, { "task_id": "ws_B093YSKTPY_10537", "instruction": "i would like to see a wallet that would go with my hoisery", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093YSKTPY" }, { "task_id": "ws_B08R2M5DJT_10538", "instruction": "i need some easy to carry breath mints for fresh breath.", "target_attributes": { "attributes": [ "easy carry", "fresh breath" ], "options": [] }, "asin": "B08R2M5DJT" }, { "task_id": "ws_B09LQSSBZ6_10539", "instruction": "i would like a day rifle scope with a optical zoom.", "target_attributes": { "attributes": [ "optical zoom" ], "options": [ "day scope" ] }, "asin": "B09LQSSBZ6" }, { "task_id": "ws_B097WMDZ6Q_10540", "instruction": "i would like a 1 tb nvme with 64 gig quad core desktop mini.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "64gb memory", "1tb nvme m.2" ] }, "asin": "B097WMDZ6Q" }, { "task_id": "ws_B082FNCRXH_10541", "instruction": "i'd like to buy some non-gmo trail mix. look for a six pack of four ounce bags, in the dark chocolate cherry tart flavor.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "dark chocolate cherry tart", "4 ounce bag (6 count)" ] }, "asin": "B082FNCRXH" }, { "task_id": "ws_B08LLDM11C_10542", "instruction": "i want white ylong-zs hanging lamps for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "yl22-white" ] }, "asin": "B08LLDM11C" }, { "task_id": "ws_B07GTCHQSK_10543", "instruction": "i need a contemporary chair that is pink with a gold base.", "target_attributes": { "attributes": [ "contemporary design" ], "options": [ "pink", "gold base" ] }, "asin": "B07GTCHQSK" }, { "task_id": "ws_B07HBMZXL4_10544", "instruction": "i am looking for a variety of natural flavored iced tea.", "target_attributes": { "attributes": [ "natural flavors" ], "options": [ "variety" ] }, "asin": "B07HBMZXL4" }, { "task_id": "ws_B08L42TQW4_10545", "instruction": "i'm looking for a desktop computer with an intel core processor and at least 16gb of ram and a 512gb solid state.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "16gb ram | 512gb ssd" ] }, "asin": "B08L42TQW4" }, { "task_id": "ws_B07DPWSN5S_10546", "instruction": "hello, i'm looking for a harklinikken styling gel. i use no2 /5.07 oz. please consider a anti-frizz moderate hold for dry hair, plant based .", "target_attributes": { "attributes": [ "plant based", "dry hair" ], "options": [] }, "asin": "B07DPWSN5S" }, { "task_id": "ws_B08X6NJWVD_10547", "instruction": "i would like some red and black sandals that have a rubber sole and are in a size 11.5", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "red | black", "11.5" ] }, "asin": "B08X6NJWVD" }, { "task_id": "ws_B099ZV9MVM_10548", "instruction": "i am looking for drink coasters, handmade drink coasters, table mat, set of eight.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "linen" ] }, "asin": "B099ZV9MVM" }, { "task_id": "ws_B083QPDP58_10549", "instruction": "i would like a gold dusty rose chair for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold dusty rose" ] }, "asin": "B083QPDP58" }, { "task_id": "ws_B086QSTH3X_10550", "instruction": "i want a 100 pack of easy to use disposable face hairspray shields.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "100pcs" ] }, "asin": "B086QSTH3X" }, { "task_id": "ws_B09PYVG834_10551", "instruction": "i am interested in a console table that is made out of solid wood and is espresso colored.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "espresso" ] }, "asin": "B09PYVG834" }, { "task_id": "ws_B086422BW8_10552", "instruction": "i would like a high quality brush set.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B086422BW8" }, { "task_id": "ws_B07WMVMHDV_10553", "instruction": "i want a 1080p hd hdmi extender + hdmi splitter.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [ "hdmi extender + hdmi splitter" ] }, "asin": "B07WMVMHDV" }, { "task_id": "ws_B01MSSDEPK_10554", "instruction": "shop for fragrance free facial cleanser for sensitive skin. look for the sixteen ounce size.", "target_attributes": { "attributes": [ "fragrance free", "sensitive skin" ], "options": [ "16 fl oz" ] }, "asin": "B01MSSDEPK" }, { "task_id": "ws_B09MDYVTCW_10555", "instruction": "i need green cactus coasters for the living room that come in a pack of four.", "target_attributes": { "attributes": [ "living room" ], "options": [ "cactus2cbu9481", "set of 4 with cup holder" ] }, "asin": "B09MDYVTCW" }, { "task_id": "ws_B086661Z9R_10556", "instruction": "i would like a 13 by 1.8 cm picture 6 case of fine mist.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "picture 6", "13*1.8cm" ] }, "asin": "B086661Z9R" }, { "task_id": "ws_B09R9QTKGW_10557", "instruction": "i need some easy to install lamp shades that are black.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "black" ] }, "asin": "B09R9QTKGW" }, { "task_id": "ws_B081CCNXTX_10558", "instruction": "i want a gift basket village celebration gift box.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B081CCNXTX" }, { "task_id": "ws_B08YMX246Z_10559", "instruction": "i want easy to use birthday cake toppers for celebrating mothers day.", "target_attributes": { "attributes": [ "easy use", "birthday cake" ], "options": [] }, "asin": "B08YMX246Z" }, { "task_id": "ws_B07VQGKVVY_10560", "instruction": "i would like a travel size bottle kit.", "target_attributes": { "attributes": [ "travel size", "travel bottles" ], "options": [] }, "asin": "B07VQGKVVY" }, { "task_id": "ws_B09DKZ7PWD_10561", "instruction": "i need some fashion sneakers that are size 3 for a big kid.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "3 big kid" ] }, "asin": "B09DKZ7PWD" }, { "task_id": "ws_B084KTL212_10562", "instruction": "i am looking for a motion detection surveillance kit.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B084KTL212" }, { "task_id": "ws_B078WBXZ1J_10563", "instruction": "i am looking for simple ingredients to make burbon caramel dessert.", "target_attributes": { "attributes": [ "simple ingredients" ], "options": [ "bourbon caramel" ] }, "asin": "B078WBXZ1J" }, { "task_id": "ws_B000SOIIZM_10564", "instruction": "i am looking for a mini eau de toilette for a women. also choose green tea scent", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B000SOIIZM" }, { "task_id": "ws_B082LJ5GKD_10565", "instruction": "i would like a 2 foot by 9 foot long navy floor runner for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "navy | ivory", "2 ft x 9 ft" ] }, "asin": "B082LJ5GKD" }, { "task_id": "ws_B09H3LJHF5_10566", "instruction": "i want black fine mist spray bottles.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "black" ] }, "asin": "B09H3LJHF5" }, { "task_id": "ws_B01N37AK8V_10567", "instruction": "i want ebanel 10 pack collagen anti aging face mask.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "10 count" ] }, "asin": "B01N37AK8V" }, { "task_id": "ws_B092ZJYJ21_10568", "instruction": "i would like to see some noise cancelling headphones that are red.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "red" ] }, "asin": "B092ZJYJ21" }, { "task_id": "ws_B09Q943KN9_10569", "instruction": "i need an automobile charger that has wireless charging and is black.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "black" ] }, "asin": "B09Q943KN9" }, { "task_id": "ws_B098P8MRNT_10570", "instruction": "i would like to have a plug and play high speed usb flash drive that is blue and black, the quantity should be 3 of 32g or 2 of 64g.", "target_attributes": { "attributes": [ "plug play", "high speed" ], "options": [ "bule and black", "32g 3pcs and 64g 2pcs" ] }, "asin": "B098P8MRNT" }, { "task_id": "ws_B00BETIULM_10571", "instruction": "i want a blue mefoto roadtrip carbon fiber tripod/monopod.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "blue" ] }, "asin": "B00BETIULM" }, { "task_id": "ws_B004OW70G2_10572", "instruction": "i am looking for a high quality eau de toilette spray for women", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B004OW70G2" }, { "task_id": "ws_B092JLLYK6_10573", "instruction": "get me a sixteen pack of apple cinnamon freeze dried banana chips.", "target_attributes": { "attributes": [ "freeze dried" ], "options": [ "apple cinnamon", "0.53 ounce (pack of 16)" ] }, "asin": "B092JLLYK6" }, { "task_id": "ws_B08XQGDK52_10574", "instruction": "i am in need of a faux leather ottoman that is brown.", "target_attributes": { "attributes": [ "faux leather" ], "options": [ "brown" ] }, "asin": "B08XQGDK52" }, { "task_id": "ws_B01N7HBEO8_10575", "instruction": "i want a pkpower ac dc adapter charger for g-project with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B01N7HBEO8" }, { "task_id": "ws_B09LYSH4YL_10576", "instruction": "i am interested in some toothbrushes that are easy to use and are either pink or blue", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink, blue" ] }, "asin": "B09LYSH4YL" }, { "task_id": "ws_B07HH4BYNK_10577", "instruction": "i would like a 36 mm tube stainless steel tripod.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "max tube 36mm", "only tripod" ] }, "asin": "B07HH4BYNK" }, { "task_id": "ws_B09QQ5KZFY_10578", "instruction": "look for a fluoride free toothpaste in purple color. pick a teeth whitening one for sensitive teeth.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening", "sensitive teeth" ], "options": [ "purple" ] }, "asin": "B09QQ5KZFY" }, { "task_id": "ws_B09KXD32Q9_10579", "instruction": "i am looking for a memory foam bed, one that does not need a box spring i would like queen size.", "target_attributes": { "attributes": [ "memory foam", "box spring" ], "options": [ "white" ] }, "asin": "B09KXD32Q9" }, { "task_id": "ws_B098C5R15H_10580", "instruction": "i need a manual toothbrush for bad breath", "target_attributes": { "attributes": [ "bad breath" ], "options": [] }, "asin": "B098C5R15H" }, { "task_id": "ws_B08RSM28V9_10581", "instruction": "i am looking for a 12 by 16 inch african american poster that is ready to hang.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "pink african american girl inspirational", "12x16inch" ] }, "asin": "B08RSM28V9" }, { "task_id": "ws_B07KLPML72_10582", "instruction": "i am interested in a non toxic beauty bag.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B07KLPML72" }, { "task_id": "ws_B0872DG5NK_10583", "instruction": "i want a brown gift basket of great american cookies.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "congrats box (brown)" ] }, "asin": "B0872DG5NK" }, { "task_id": "ws_B097NW1NJ9_10584", "instruction": "i need some floating shelves for my living room. i'd like them to be grey.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey" ] }, "asin": "B097NW1NJ9" }, { "task_id": "ws_B082D247QB_10585", "instruction": "i want a white yisella shower brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "pink | white" ] }, "asin": "B082D247QB" }, { "task_id": "ws_B09MWN6HDD_10586", "instruction": "i am looking for a motion detection indoor, outdoor camera smart surveillance.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B09MWN6HDD" }, { "task_id": "ws_B08GHGYH77_10587", "instruction": "i want to buy some non-toxic bath gloves.", "target_attributes": { "attributes": [ "non toxic" ], "options": [] }, "asin": "B08GHGYH77" }, { "task_id": "ws_B08HB4TNKL_10588", "instruction": "i need some high quality false lashes that are 20d-16mm", "target_attributes": { "attributes": [ "high quality" ], "options": [ "20d-16mm" ] }, "asin": "B08HB4TNKL" }, { "task_id": "ws_B097H7BCYM_10589", "instruction": "i want a drawing desk that's easy to clean and has a steel frame.", "target_attributes": { "attributes": [ "easy clean", "steel frame" ], "options": [] }, "asin": "B097H7BCYM" }, { "task_id": "ws_B07P9W3BK1_10590", "instruction": "i would like to get some low carb gourmet crunchy snack which has a red peppers | jalapenos flavor.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "red peppers | jalapenos" ] }, "asin": "B07P9W3BK1" }, { "task_id": "ws_B0962T75TW_10591", "instruction": "i need ceiling lights that are a light wood grain color and are easy to install", "target_attributes": { "attributes": [ "easy install" ], "options": [ "2 light wood grain" ] }, "asin": "B0962T75TW" }, { "task_id": "ws_B07XLW2Q46_10592", "instruction": "i am looking for a star wars darth vader funny t-shirt.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "women" ] }, "asin": "B07XLW2Q46" }, { "task_id": "ws_B08KVPWV49_10593", "instruction": "i am looking for high quality natural hair extension. please make sure that is 14 inches in size.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "14 | 14 | 14 | 14+12 inch" ] }, "asin": "B08KVPWV49" }, { "task_id": "ws_B01I0TE6GQ_10594", "instruction": "i am looking for an end table that has a white finish.", "target_attributes": { "attributes": [ "white finish" ], "options": [] }, "asin": "B01I0TE6GQ" }, { "task_id": "ws_B07B9LDKPZ_10595", "instruction": "i would like a 35 foot long multicolored hdmi cable for my blu ray player.", "target_attributes": { "attributes": [ "blu ray" ], "options": [ "multi-colored", "35ft" ] }, "asin": "B07B9LDKPZ" }, { "task_id": "ws_B097161249_10596", "instruction": "order a tempered glass screen protector for my iphone 13.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [] }, "asin": "B097161249" }, { "task_id": "ws_B000C20ZSS_10597", "instruction": "i want a high quality bvlgari blv by bvlgari for women perfume.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B000C20ZSS" }, { "task_id": "ws_B006QN9TFC_10598", "instruction": "i need a 4oz size hair conditioner that has argan oil and is for damged hair.", "target_attributes": { "attributes": [ "argan oil", "damaged hair" ], "options": [ "120ml | 4 fl oz" ] }, "asin": "B006QN9TFC" }, { "task_id": "ws_B0973QX9X2_10599", "instruction": "i want to find a 2-pack of 32 fluid ounces of gourmet lime cocktail mix. it needs to taste just like a bloody mary with dill pickles and be gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "dill pickle bloody mary", "32 fl oz (pack of 2)" ] }, "asin": "B0973QX9X2" }, { "task_id": "ws_B09BVSKVXG_10600", "instruction": "i want to shop for a pair of pink ankle boots with leather soles. i need them in a size eight.", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "4pink", "8" ] }, "asin": "B09BVSKVXG" }, { "task_id": "ws_B08TQQSQHZ_10601", "instruction": "i would like some solid wood coat hooks to mount on the walls.", "target_attributes": { "attributes": [ "wall mounted", "solid wood" ], "options": [] }, "asin": "B08TQQSQHZ" }, { "task_id": "ws_B07TZ6B73F_10602", "instruction": "i am looking for a game joystick that has a usb port and must be the color black.", "target_attributes": { "attributes": [ "usb port" ], "options": [ "black" ] }, "asin": "B07TZ6B73F" }, { "task_id": "ws_B082WMCYX8_10603", "instruction": "find me some keto friendly and gluten free turkey bars. they should have no sugar and get the 48 count pack.", "target_attributes": { "attributes": [ "keto friendly", "gluten free" ], "options": [ "48 count (pack of 1)" ] }, "asin": "B082WMCYX8" }, { "task_id": "ws_B09PG9CZY3_10604", "instruction": "i want black womens memory foam walking shoes.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black" ] }, "asin": "B09PG9CZY3" }, { "task_id": "ws_B07ZQSQ3B2_10605", "instruction": "i would like a 42mm smartwatch band that is made of stainless steel and has a gold connector.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "tiana brown w | gold connector&clasp", "42mm-44mm-45mm" ] }, "asin": "B07ZQSQ3B2" }, { "task_id": "ws_B08696JGJK_10606", "instruction": "i am looking for a desktop computer with intel core i7-10510u cpu, 240g ssd storage and 16g of ram.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "cpu i7-10510u", "16g ram 240g ssd" ] }, "asin": "B08696JGJK" }, { "task_id": "ws_B07KX8GVB7_10607", "instruction": "give me one adidas crazyflight usav cross trainer regular fit women please, my size is 14.5", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "white | power red | white" ] }, "asin": "B07KX8GVB7" }, { "task_id": "ws_B09T5PR172_10608", "instruction": "i want a high quality tooth brush for my sensitive teeth. it should be pale yellow in color.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pale yellow, small (for 2-6)" ] }, "asin": "B09T5PR172" }, { "task_id": "ws_B000HTKOMS_10609", "instruction": "i am looking for big and tall levi's men's 505 regular fit jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "big & tall" ] }, "asin": "B000HTKOMS" }, { "task_id": "ws_B0179PDSNO_10610", "instruction": "i would like a men's rubber sole shoe with a size 7.5.", "target_attributes": { "attributes": [ "rubber outsole", "rubber sole" ], "options": [ "7.5" ] }, "asin": "B0179PDSNO" }, { "task_id": "ws_B00N33U2SG_10611", "instruction": "i would like a dark grey hair building fiber that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "dark grey & pepper" ] }, "asin": "B00N33U2SG" }, { "task_id": "ws_B07VGMCM3T_10612", "instruction": "i want trader joe's organic apple banana fruit crushers.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B07VGMCM3T" }, { "task_id": "ws_B08CVS5KZJ_10613", "instruction": "i would like a 7 piece king comforter set decorated with flowers and is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "flowers", "king-7 pieces" ] }, "asin": "B08CVS5KZJ" }, { "task_id": "ws_B00NVK6K5K_10614", "instruction": "i want non gmo wild planet wild albacore tuna unsalted.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "albacore no salt" ] }, "asin": "B00NVK6K5K" }, { "task_id": "ws_B093X7Z6Z3_10615", "instruction": "i would like some individually wrapped mandolorian lollipops for party supplies.", "target_attributes": { "attributes": [ "individually wrapped", "party supplies" ], "options": [ "mandolorian | the child pop ups" ] }, "asin": "B093X7Z6Z3" }, { "task_id": "ws_B09QMDTYDK_10616", "instruction": "look for a long sleeve polyester pullover top. get style-23 in small.", "target_attributes": { "attributes": [ "long sleeve", "quality polyester" ], "options": [ "style-23", "small" ] }, "asin": "B09QMDTYDK" }, { "task_id": "ws_B08PL42Q82_10617", "instruction": "i would like a 55 inch high def tv.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "55 inches" ] }, "asin": "B08PL42Q82" }, { "task_id": "ws_B07TSKCMY8_10618", "instruction": "i need white storage cabinets.", "target_attributes": { "attributes": [ "white item" ], "options": [] }, "asin": "B07TSKCMY8" }, { "task_id": "ws_B08P8JKN6J_10619", "instruction": "i am looking for a home office desk chair that has lumbar support and is black.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "black" ] }, "asin": "B08P8JKN6J" }, { "task_id": "ws_B092YL6HFF_10620", "instruction": "i am looking for aluminum alloy professional ball head tripod for camera with color: x-4i", "target_attributes": { "attributes": [ "aluminum alloy" ], "options": [ "x-4i" ] }, "asin": "B092YL6HFF" }, { "task_id": "ws_B07K6Z1DD1_10621", "instruction": "i want a frosted 8 inch shade for my lamp in the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "frosted - 2 pack", "2-5 | 8 inch - 10 inch" ] }, "asin": "B07K6Z1DD1" }, { "task_id": "ws_B09JW89R1W_10622", "instruction": "i need an easy to carry pair of monoculars that are standard.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "standard + phone clip" ] }, "asin": "B09JW89R1W" }, { "task_id": "ws_B081L2DQVG_10623", "instruction": "check for the following product in pink: honeydew ladies ultra soft cozy lounge leggings, drawstring closure. thanks", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "pink" ] }, "asin": "B081L2DQVG" }, { "task_id": "ws_B099PSRW2T_10624", "instruction": "get me some relaxed fit loafers, please.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [] }, "asin": "B099PSRW2T" }, { "task_id": "ws_B0943FMYK2_10625", "instruction": "i am looking for a high powered digital amplifier board.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B0943FMYK2" }, { "task_id": "ws_B091G2R6MH_10626", "instruction": "i am interested in a shampoo set that is paraben free and comes in a pack of two.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "28 fl oz (pack of 2)" ] }, "asin": "B091G2R6MH" }, { "task_id": "ws_B00FP2ACMY_10627", "instruction": "i need low rise boot cut pants in grey color.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "grey" ] }, "asin": "B00FP2ACMY" }, { "task_id": "ws_B07RWF7NG9_10628", "instruction": "i am interested in a lemon yellow t-shirt for youth that is machine washable and is in an x-small.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "lemon", "youth", "x-small" ] }, "asin": "B07RWF7NG9" }, { "task_id": "ws_B0040ZOQ24_10629", "instruction": "i would like a 14.5 fluid ounce can of fresh scent oven cleaner that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "fresh scent", "14.5 fl oz (pack of 6)" ] }, "asin": "B0040ZOQ24" }, { "task_id": "ws_B09NNGX9H7_10630", "instruction": "i would like a slim fitting button down shirt in an x-small that is light blue", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "b#light blue", "x-small" ] }, "asin": "B09NNGX9H7" }, { "task_id": "ws_B00UIMGK9U_10631", "instruction": "i need knee high socks that are ivory", "target_attributes": { "attributes": [ "knee high" ], "options": [ "ivory" ] }, "asin": "B00UIMGK9U" }, { "task_id": "ws_B07H7VDDVH_10632", "instruction": "i want a tan and cruelty free dual salmon concealer.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "tan" ] }, "asin": "B07H7VDDVH" }, { "task_id": "ws_B07CJWZ4XF_10633", "instruction": "shop for a device that prevents hair loss and promotes growth.", "target_attributes": { "attributes": [ "hair growth", "hair loss" ], "options": [] }, "asin": "B07CJWZ4XF" }, { "task_id": "ws_B008IDJ4NU_10634", "instruction": "i am looking for some espresso pleated shades that are easy to install and are 36 inch by 72 inch.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "espresso", "36-inch by 72-inch" ] }, "asin": "B008IDJ4NU" }, { "task_id": "ws_B097NG3SVJ_10635", "instruction": "i need to buy some eighty-four inch curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "84\"w x 84\"l" ] }, "asin": "B097NG3SVJ" }, { "task_id": "ws_B07VLMG4DR_10636", "instruction": "i am looking for a silver smartwatch band that is apple compatible.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "silver" ] }, "asin": "B07VLMG4DR" }, { "task_id": "ws_B09NL6VC77_10637", "instruction": "i am looking for men's ripped jeans denim pants with an elastic waist. pick a navy color and get x-large.", "target_attributes": { "attributes": [ "machine washable", "elastic waist" ], "options": [ "navy", "x-large" ] }, "asin": "B09NL6VC77" }, { "task_id": "ws_B08CZZMPZW_10638", "instruction": "i need a relaxed fit sleep bottom that is gray plaid and is a large", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "gray plaid", "large" ] }, "asin": "B08CZZMPZW" }, { "task_id": "ws_B09R1DKTS6_10639", "instruction": "i am looking for a high power sound column subwoofer, that uses bluetooth and is also a 3d surround sound system.", "target_attributes": { "attributes": [ "high power" ], "options": [] }, "asin": "B09R1DKTS6" }, { "task_id": "ws_B09RQR4HQS_10640", "instruction": "i want blue high waisted plus size swimsuits for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "blue" ] }, "asin": "B09RQR4HQS" }, { "task_id": "ws_B00S82AG1U_10641", "instruction": "i would like a chrome bath sconce that is a vanity light.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "chrome", "four light wall | bath" ] }, "asin": "B00S82AG1U" }, { "task_id": "ws_B00AARRS9Y_10642", "instruction": "i want speak 510 wireless bluetooth portable speakers, which is uc optimized and comes with a carrying case.", "target_attributes": { "attributes": [ "carrying case", "wireless bluetooth" ], "options": [ "uc optimized (standard)", "speak 510" ] }, "asin": "B00AARRS9Y" }, { "task_id": "ws_B08FDW2T9T_10643", "instruction": "i am looking for a bakers rack for storage space that is 35 by 22 by 42.5cm.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "35*22*42.5cm" ] }, "asin": "B08FDW2T9T" }, { "task_id": "ws_B08SM44FFD_10644", "instruction": "i want small wide leg maszone y2k fashion jeans for women.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "small" ] }, "asin": "B08SM44FFD" }, { "task_id": "ws_B09NN8LSX3_10645", "instruction": "i am interested in a long sleeved blue shirt that is in a medium", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a6 - blue", "medium" ] }, "asin": "B09NN8LSX3" }, { "task_id": "ws_B08DMCX3VF_10646", "instruction": "i want to buy the travel size of the creed original impression.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "creed original santal impression" ] }, "asin": "B08DMCX3VF" }, { "task_id": "ws_B09RTQMBZR_10647", "instruction": "i need a core i5 desktop that has 20gb of ram and 512gb of storage.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "20gb | 512gb ssd" ] }, "asin": "B09RTQMBZR" }, { "task_id": "ws_B08BY8BWNB_10648", "instruction": "i'm looking for a party supplies of birthday party cupcake.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08BY8BWNB" }, { "task_id": "ws_B082T2M91S_10649", "instruction": "i need a brushed nickel floor lamp that is turquoise", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "turquoise" ] }, "asin": "B082T2M91S" }, { "task_id": "ws_B08HMZXK4R_10650", "instruction": "i would like a hair comb for dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [] }, "asin": "B08HMZXK4R" }, { "task_id": "ws_B086ZPR5W2_10651", "instruction": "i want reparative eye creme for dark circles.", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B086ZPR5W2" }, { "task_id": "ws_B09J23663B_10652", "instruction": "i am looking a dust proof cover easy install easy carry fit for xbox series x colour black", "target_attributes": { "attributes": [ "dust proof", "easy carry", "easy install" ], "options": [ "un" ] }, "asin": "B09J23663B" }, { "task_id": "ws_B09MLS9J9L_10653", "instruction": "i want a large i just want to work in my garden short sleeve t shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B09MLS9J9L" }, { "task_id": "ws_B08V4V96YY_10654", "instruction": "i am looking for heavy duty 4 inch shelf brackets that are easy to install.", "target_attributes": { "attributes": [ "heavy duty", "easy install" ], "options": [ "4 inch" ] }, "asin": "B08V4V96YY" }, { "task_id": "ws_B09QM769RJ_10655", "instruction": "i would like some wireless headphones, hands free, in red please. they must have bluetooth and a mic.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "red" ] }, "asin": "B09QM769RJ" }, { "task_id": "ws_B089659QT7_10656", "instruction": "i want a midnight blue and solid wood napa ottoman.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "midnight blue" ] }, "asin": "B089659QT7" }, { "task_id": "ws_B084H13NFV_10657", "instruction": "i am looking for a sugar free and gluten free dried fruits in dried pineapple flavor. also choose size of 8 ounce (pack of 2)", "target_attributes": { "attributes": [ "sugar free", "gluten free" ], "options": [ "dried pineapple", "8 ounce (pack of 2)" ] }, "asin": "B084H13NFV" }, { "task_id": "ws_B08HCKVX5F_10658", "instruction": "i would like a purple 3.35 inch hair clip for hair styling and cutting.", "target_attributes": { "attributes": [ "hair styling", "hair cutting" ], "options": [ "purple", "3.35 inch (pack of 24)" ] }, "asin": "B08HCKVX5F" }, { "task_id": "ws_B08RJ4VXGQ_10659", "instruction": "i need a t shirt that i can hand wash in an xx-large and is the color of wine.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "03-wine", "xx-large" ] }, "asin": "B08RJ4VXGQ" }, { "task_id": "ws_B096KF7K4M_10660", "instruction": "i am looking for a barbershop tin sign for my hair salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "barber shop2" ] }, "asin": "B096KF7K4M" }, { "task_id": "ws_B06XP2ZQLG_10661", "instruction": "i am interested in some hair growth treatments.", "target_attributes": { "attributes": [ "hair growth" ], "options": [] }, "asin": "B06XP2ZQLG" }, { "task_id": "ws_B08DD21C8S_10662", "instruction": "i want a long lasting scented candles aromatherapy soy set.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B08DD21C8S" }, { "task_id": "ws_B08WM2V3D9_10663", "instruction": "i am looking for a space saving home office desk with a reclaimed wood look to it.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "brown reclaimed wood-look | black" ] }, "asin": "B08WM2V3D9" }, { "task_id": "ws_B089GSK6NM_10664", "instruction": "i am looking for 6 inch stainless steel hair cutting scissors.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [ "6 inch set" ] }, "asin": "B089GSK6NM" }, { "task_id": "ws_B08SHSFXF6_10665", "instruction": "i would like a 34 piece set of some long lasting press on nails", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "frosting", "34 piece set" ] }, "asin": "B08SHSFXF6" }, { "task_id": "ws_B08411CQPH_10666", "instruction": "i am looking for a dill pickle vegan ranch flavored gourmet popcorn gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "dill pickle vegan ranch" ] }, "asin": "B08411CQPH" }, { "task_id": "ws_B09MYSD8SX_10667", "instruction": "i would like some 18 inch micro loop hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "micro loop hair extensions", "18 inch" ] }, "asin": "B09MYSD8SX" }, { "task_id": "ws_B0953MXXF1_10668", "instruction": "i would like a size 8 azure clog made from vinyl acetate.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "azure", "8" ] }, "asin": "B0953MXXF1" }, { "task_id": "ws_B0745JHL8C_10669", "instruction": "i need some regular slim fit jeans that are a size 34w by 38l", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "regular", "34w x 38l" ] }, "asin": "B0745JHL8C" }, { "task_id": "ws_B09NW8X8TX_10670", "instruction": "i need a pink color women's eau de parfum which should have a long lasting fragrance.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "pink" ] }, "asin": "B09NW8X8TX" }, { "task_id": "ws_B09C2Z9BM5_10671", "instruction": "i want x-large unisex rubber sole diving shoes.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "x-large" ] }, "asin": "B09C2Z9BM5" }, { "task_id": "ws_B098QHRYN9_10672", "instruction": "i am looking for a vanity light wall lamp with clear glass also choose 01 - 1 sconces light in color", "target_attributes": { "attributes": [ "vanity light", "clear glass" ], "options": [] }, "asin": "B098QHRYN9" }, { "task_id": "ws_B096P751KM_10673", "instruction": "i need to buy some cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B096P751KM" }, { "task_id": "ws_B000PYOTGC_10674", "instruction": "i am looking for a 12 ounce jar of raspberry preserve that is nut and gluten free.", "target_attributes": { "attributes": [ "nut free", "gluten free" ], "options": [ "12 ounce (pack of 2)", "preserve" ] }, "asin": "B000PYOTGC" }, { "task_id": "ws_B00JGXF99E_10675", "instruction": "i need 15 pounds of non gmo beans.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "15 pound (pack of 1)" ] }, "asin": "B00JGXF99E" }, { "task_id": "ws_B00C0X7UC6_10676", "instruction": "i need some hair oil for damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B00C0X7UC6" }, { "task_id": "ws_B08GHSLSQR_10677", "instruction": "i need some eye cream for treating fine lines.", "target_attributes": { "attributes": [ "fine lines" ], "options": [] }, "asin": "B08GHSLSQR" }, { "task_id": "ws_B08TVG2339_10678", "instruction": "i would like to buy a heavy duty with a rocket type style outlet combo wall plate cover", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "rocker | outlet combo" ] }, "asin": "B08TVG2339" }, { "task_id": "ws_B09S3L82PC_10679", "instruction": "i would like some fluoride free toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B09S3L82PC" }, { "task_id": "ws_B099NPQZX8_10680", "instruction": "i am looking for beef meat sticks that are keto friendly, and low carb.", "target_attributes": { "attributes": [ "keto friendly", "low carb" ], "options": [ "bacon" ] }, "asin": "B099NPQZX8" }, { "task_id": "ws_B08545S2X3_10681", "instruction": "i need a high speed and dual band wireless signal booster.", "target_attributes": { "attributes": [ "dual band", "high speed" ], "options": [] }, "asin": "B08545S2X3" }, { "task_id": "ws_B01FHVTQNS_10682", "instruction": "i'm looking for a cruelty free, herbal toothpaste in mint flavor.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B01FHVTQNS" }, { "task_id": "ws_B000SATG70_10683", "instruction": "i'm looking for orange spice tea that is caffeine free and organic.", "target_attributes": { "attributes": [ "caffeine free", "certified organic" ], "options": [ "decaf orange spice" ] }, "asin": "B000SATG70" }, { "task_id": "ws_B079SS1CF5_10684", "instruction": "i am looking for plant based, gluten free, chocolate chip blondie cookies that i can eat or are safe to use for my kid's snacks.", "target_attributes": { "attributes": [ "plant based", "gluten free" ], "options": [ "chocolate chip blondie" ] }, "asin": "B079SS1CF5" }, { "task_id": "ws_B00TAM6FNU_10685", "instruction": "i would like some cruelty free moisturizer that is in a vanilla shimmer scent and comes in five tubes", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "vanilla shimmer", "5 tubes (2 ounce each)" ] }, "asin": "B00TAM6FNU" }, { "task_id": "ws_B09DNBN853_10686", "instruction": "i would like a bianca white crib dresser with a lot of storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "bianca white", "crib" ] }, "asin": "B09DNBN853" }, { "task_id": "ws_B09MH8CM29_10687", "instruction": "i would like a super soft camo throw for the living room.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "camo 2" ] }, "asin": "B09MH8CM29" }, { "task_id": "ws_B09Q8TTK5D_10688", "instruction": "i am looking for workout leggings with fantastic texture design. cute fabric, that mask the appearance of cellulite and imperfections with its carefully designed rhombus textured patterns. also provide you the right compression too. butt lift push up wasit shaper sport leggings featuring your curves pop.seamless technology perfectly show your figure shape ,which gives your butt a streamlined flattering look like a juicy peach. womens leggings pack leggings that are designed with high-waist, tummy control wide waistband,to enhance curves,provides a complete coverage for your body(no worrying about belly rolls or a underwear show). the high waist belt can control the stomach, yoga leggings which are perfect for sports women.in red colour ,xl size preferable.", "target_attributes": { "attributes": [ "butt lifting", "tummy control", "high waist" ], "options": [ "red", "x-large" ] }, "asin": "B09Q8TTK5D" }, { "task_id": "ws_B08PYK8R1L_10689", "instruction": "i would like some air bang #6 light brown hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "#6 light brown", "air bangs" ] }, "asin": "B08PYK8R1L" }, { "task_id": "ws_B08ZS6WS81_10690", "instruction": "i need an eye cream for dark circles", "target_attributes": { "attributes": [ "dark circles" ], "options": [] }, "asin": "B08ZS6WS81" }, { "task_id": "ws_B00EOXEPRI_10691", "instruction": "original udder balm moisturizer is my choice . please give me fragrance free, 16 oz pump.", "target_attributes": { "attributes": [ "fragrance free", "bpa free" ], "options": [ "16 oz pump" ] }, "asin": "B00EOXEPRI" }, { "task_id": "ws_B07KFBHJR9_10692", "instruction": "i need some navy button down shirts that are long sleeved and in a size medium", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "solid3-navy", "medium" ] }, "asin": "B07KFBHJR9" }, { "task_id": "ws_B09S65FB4N_10693", "instruction": "i want a 04 color and easy to use straight hairpiece clip.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "04" ] }, "asin": "B09S65FB4N" }, { "task_id": "ws_B09C26MR9R_10694", "instruction": "i am looking for a pink colored dental flosser for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "pink" ] }, "asin": "B09C26MR9R" }, { "task_id": "ws_B08QYZ6PK8_10695", "instruction": "i need a ready to hang wall mirror in a champagne sunburst color.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "champagne" ] }, "asin": "B08QYZ6PK8" }, { "task_id": "ws_B09KZYZ1SM_10696", "instruction": "i need an easy to install anti-dust plug for an iphone 13.", "target_attributes": { "attributes": [ "dust proof", "easy install" ], "options": [] }, "asin": "B09KZYZ1SM" }, { "task_id": "ws_B07PTQ13BB_10697", "instruction": "i need a gold plated hdmi adapter that is capable of 4k.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "black [4k@30hz]" ] }, "asin": "B07PTQ13BB" }, { "task_id": "ws_B000KOQ3MA_10698", "instruction": "buy a one pack of permanent hair dye in espresso.", "target_attributes": { "attributes": [ "permanent hair", "hair dye" ], "options": [ "40 espresso", "pack of 1" ] }, "asin": "B000KOQ3MA" }, { "task_id": "ws_B07R7239Z4_10699", "instruction": "i am looking for small undershirts that i can machine wash", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "small" ] }, "asin": "B07R7239Z4" }, { "task_id": "ws_B09Q5JGCV9_10700", "instruction": "i would like pair of size 7.5 slides with a rubber sole. .", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "7.5 wide" ] }, "asin": "B09Q5JGCV9" }, { "task_id": "ws_B08CH2VS4W_10701", "instruction": "i need some wall mounted mirrors that are 70 by 100 cm.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "70\u00d7100cm" ] }, "asin": "B08CH2VS4W" }, { "task_id": "ws_B09NDL71CZ_10702", "instruction": "i am looking for a 42mm stainless steel smartwatch band", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "42mm | 44mm | 45mm xl" ] }, "asin": "B09NDL71CZ" }, { "task_id": "ws_B08HWVRB9L_10703", "instruction": "i am looking for a heavy duty wood colored wall mounted folding table.", "target_attributes": { "attributes": [ "wall mounted", "heavy duty" ], "options": [ "wood color" ] }, "asin": "B08HWVRB9L" }, { "task_id": "ws_B000HDKWZ8_10704", "instruction": "i would like a bottle of green goddess ranch dressing from quality ingredients.", "target_attributes": { "attributes": [ "quality ingredients" ], "options": [ "green goddess" ] }, "asin": "B000HDKWZ8" }, { "task_id": "ws_B08TF34W98_10705", "instruction": "i need a pack of three dried apricots that are non gmo", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "pack of 3" ] }, "asin": "B08TF34W98" }, { "task_id": "ws_B01LY663NI_10706", "instruction": "i am looking for natural flavors and high fructose pineapple juice marinade", "target_attributes": { "attributes": [ "natural flavors", "high fructose" ], "options": [] }, "asin": "B01LY663NI" }, { "task_id": "ws_B09N72K25B_10707", "instruction": "i want a hot pink kokovifyves women's hooded winter warm vest.", "target_attributes": { "attributes": [ "winter warm" ], "options": [ "hot pink" ] }, "asin": "B09N72K25B" }, { "task_id": "ws_B01HJV2LU4_10708", "instruction": "i need a blackhead extractor that is silver and easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "silver" ] }, "asin": "B01HJV2LU4" }, { "task_id": "ws_B01DV9E90I_10709", "instruction": "i need four vanity lights.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "4-light" ] }, "asin": "B01DV9E90I" }, { "task_id": "ws_B007RG4LUA_10710", "instruction": "i'm looking for a styling cream that is cruelty free and for short hair.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B007RG4LUA" }, { "task_id": "ws_B09LCLHX9G_10711", "instruction": "i want white crystal rhinestones flatback colored jewels for nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "white" ] }, "asin": "B09LCLHX9G" }, { "task_id": "ws_B09HH96NJY_10712", "instruction": "i am really wanting some khaki jeans that are high waisted and in a xx-large.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "z09-khaki", "xx-large" ] }, "asin": "B09HH96NJY" }, { "task_id": "ws_B00GQDRU9O_10713", "instruction": "i am looking for a toothpaste that would freshen breath.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B00GQDRU9O" }, { "task_id": "ws_B078K7T4NP_10714", "instruction": "i want a silver hermitshell hard carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "sliver" ] }, "asin": "B078K7T4NP" }, { "task_id": "ws_B09FTHRDL9_10715", "instruction": "i am looking for a cruelty free foundation refill in west indies walnut color.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "west indies walnut" ] }, "asin": "B09FTHRDL9" }, { "task_id": "ws_B09PDKTMHB_10716", "instruction": "i want indiana jones raiders of the lost ark party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [] }, "asin": "B09PDKTMHB" }, { "task_id": "ws_B098TDDJV9_10717", "instruction": "i want fuchsia modencoco women's pointed toe pumps with ankle strap.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "fuchsia" ] }, "asin": "B098TDDJV9" }, { "task_id": "ws_B09P861JJH_10718", "instruction": "i would like a high performance quad core tablet.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [] }, "asin": "B09P861JJH" }, { "task_id": "ws_B08GC1RHTX_10719", "instruction": "i want a olives and rusk gourmet gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "olives, wheat cream crackers, & barley rusks" ] }, "asin": "B08GC1RHTX" }, { "task_id": "ws_B09BLTYRR2_10720", "instruction": "i want a pack of halloween cupcake picks.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [ "a" ] }, "asin": "B09BLTYRR2" }, { "task_id": "ws_B09LT7FN9M_10721", "instruction": "i really need a hand painting painting that comes in a size of 45 inch by 30 inch", "target_attributes": { "attributes": [ "hand painted" ], "options": [ "45x30 inch" ] }, "asin": "B09LT7FN9M" }, { "task_id": "ws_B09JYLZMTX_10722", "instruction": "i need a cheerleading outfit for men that is wine colored and in a x-large size.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "z2-wine", "x-large" ] }, "asin": "B09JYLZMTX" }, { "task_id": "ws_B01EA9P2FE_10723", "instruction": "i want x-large polyester spandex romastory women fluorescent yoga pants.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "x-large" ] }, "asin": "B01EA9P2FE" }, { "task_id": "ws_B0925MKQVM_10724", "instruction": "i would like a 2xl green pair of wide leg jogging pants.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "a-green", "xx-large" ] }, "asin": "B0925MKQVM" }, { "task_id": "ws_B09G71MBVW_10725", "instruction": "i would like a blue extra large long sleeve sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a-blue", "x-large" ] }, "asin": "B09G71MBVW" }, { "task_id": "ws_B01MY4Q927_10726", "instruction": "i want a black cherry and gluten free v8 +energy drink.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "black cherry" ] }, "asin": "B01MY4Q927" }, { "task_id": "ws_B09HBLDMTL_10727", "instruction": "i'm looking for rose gold birthday cake decorations.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [ "rose gold" ] }, "asin": "B09HBLDMTL" }, { "task_id": "ws_B01INSG0WC_10728", "instruction": "i would like a high performance set of earbud headphones.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B01INSG0WC" }, { "task_id": "ws_B0824BVCJ3_10729", "instruction": "i am looking for some machine washable pillow covers that are peony blue and are 22 by 22 inches.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "peony blue", "22 x 22 inches" ] }, "asin": "B0824BVCJ3" }, { "task_id": "ws_B092QJL99K_10730", "instruction": "can you find kids digital cameras for girls boys 8 to 12 years old in this exact configuration? 32gb sd card 1080p hd need to buy today.", "target_attributes": { "attributes": [ "1080p hd", "high resolution" ], "options": [] }, "asin": "B092QJL99K" }, { "task_id": "ws_B083CPT87C_10731", "instruction": "i need a console table for the living room that is in style 2", "target_attributes": { "attributes": [ "living room" ], "options": [ "style2" ] }, "asin": "B083CPT87C" }, { "task_id": "ws_B087DXGNBS_10732", "instruction": "i need jar candles that are made out of soy wax.", "target_attributes": { "attributes": [ "soy wax" ], "options": [] }, "asin": "B087DXGNBS" }, { "task_id": "ws_B07PPW5DST_10733", "instruction": "i am looking for a cruelty free and sulfate free eyeshadow palette. also choose naked cyber palette.", "target_attributes": { "attributes": [ "sulfate free", "cruelty free" ], "options": [ "naked cyber" ] }, "asin": "B07PPW5DST" }, { "task_id": "ws_B087CQLJCJ_10734", "instruction": "i am interested in a nut free vegan snack.", "target_attributes": { "attributes": [ "nut free" ], "options": [] }, "asin": "B087CQLJCJ" }, { "task_id": "ws_B0928RHTDG_10735", "instruction": "shop for a slim fit blazer in royal blue, size 42.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "royal blue", "42" ] }, "asin": "B0928RHTDG" }, { "task_id": "ws_B09B9K96XB_10736", "instruction": "i want a x-large short sleeve mayntop womens t-shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "x-large" ] }, "asin": "B09B9K96XB" }, { "task_id": "ws_B09P3RSYTJ_10737", "instruction": "i need a nightstand for storage space", "target_attributes": { "attributes": [ "storage space" ], "options": [] }, "asin": "B09P3RSYTJ" }, { "task_id": "ws_B00028OT8Y_10738", "instruction": "i would like a extra light beige foundation made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "extra light beige" ] }, "asin": "B00028OT8Y" }, { "task_id": "ws_B0727S5Y86_10739", "instruction": "i am looking for a pair of graphite colored women's pants with nylon spandex.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "graphite" ] }, "asin": "B0727S5Y86" }, { "task_id": "ws_B09NFD1TYB_10740", "instruction": "i need a smartwatch case that is compatible with apple and is in a size 45 mm.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "45mm" ] }, "asin": "B09NFD1TYB" }, { "task_id": "ws_B09F5LBNKM_10741", "instruction": "i want a pack of two white coat hooks that are easy to install in my living room.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "white - 3", "2 hooks" ] }, "asin": "B09F5LBNKM" }, { "task_id": "ws_B08LS9CLC3_10742", "instruction": "i would like a cake topper for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B08LS9CLC3" }, { "task_id": "ws_B07NDD5CBS_10743", "instruction": "buy me a women's classic fit t-shirt in purple.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "purple", "women" ] }, "asin": "B07NDD5CBS" }, { "task_id": "ws_B09MNF5P5L_10744", "instruction": "i am looking for a camel colored futon mattress for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "camel" ] }, "asin": "B09MNF5P5L" }, { "task_id": "ws_B09L2Z9KZ9_10745", "instruction": "i want to find a high-resolution digital camera with an optical zoom feature.", "target_attributes": { "attributes": [ "high resolution", "optical zoom" ], "options": [] }, "asin": "B09L2Z9KZ9" }, { "task_id": "ws_B008PSTOQ0_10746", "instruction": "i would like a bag of trail mix from trader joes.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B008PSTOQ0" }, { "task_id": "ws_B07PPVYF5N_10747", "instruction": "i am really in need of some toothpaste that is peppermint for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "peppermint" ] }, "asin": "B07PPVYF5N" }, { "task_id": "ws_B07H9PXL88_10748", "instruction": "i would like a size 11 brown suede loafer with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown suede | black sole", "11" ] }, "asin": "B07H9PXL88" }, { "task_id": "ws_B0070SJ72W_10749", "instruction": "i need some brown oxfords that offer day comfort and are in a size 7", "target_attributes": { "attributes": [ "day comfort" ], "options": [ "brown md brown full grain", "7" ] }, "asin": "B0070SJ72W" }, { "task_id": "ws_B07D7JGHMG_10750", "instruction": "i am interested in a bedside table that would be easy to assemble and is in the color of espresso.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "espresso" ] }, "asin": "B07D7JGHMG" }, { "task_id": "ws_B09JKTRL85_10751", "instruction": "i am looking for a pair of western ankle boots with a pointed toe and fringe.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "gde45-brown" ] }, "asin": "B09JKTRL85" }, { "task_id": "ws_B087Q8B674_10752", "instruction": "i want 20ml travel size kaaka empty clear glass bottles.", "target_attributes": { "attributes": [ "travel size" ], "options": [] }, "asin": "B087Q8B674" }, { "task_id": "ws_B0971XD6YS_10753", "instruction": "look for an officially licensed loki variant t-shirt for women in black.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "black", "women" ] }, "asin": "B0971XD6YS" }, { "task_id": "ws_B07H8BS7KV_10754", "instruction": "i need pair of pink size 10 slippers with a rubber anti slip sole.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "pink-a", "10-11" ] }, "asin": "B07H8BS7KV" }, { "task_id": "ws_B09GPPKWP2_10755", "instruction": "i need an xx-large sweater that is long sleeved and the color x04-5", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x04-5", "xx-large" ] }, "asin": "B09GPPKWP2" }, { "task_id": "ws_B087D7NGWP_10756", "instruction": "i need adidas pant's for men with elastic waist , black | team royal blue | vivid red , model tiro track", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "black | team royal blue | vivid red" ] }, "asin": "B087D7NGWP" }, { "task_id": "ws_B08KL3381H_10757", "instruction": "in the men's fashion sneakers section, i am looking for a bari slip-on sneaker with a rubber outsole in a size 9.5 in the color of puma white-puma silver made by puma.", "target_attributes": { "attributes": [ "rubber outsole" ], "options": [ "puma white-puma silver", "9.5" ] }, "asin": "B08KL3381H" }, { "task_id": "ws_B09Q2S6BBG_10758", "instruction": "i need a long sleeved black pullover that is in a large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "black", "large" ] }, "asin": "B09Q2S6BBG" }, { "task_id": "ws_B0829Q45LH_10759", "instruction": "i would like a size seven white flat shoe with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "white navy red", "7.5" ] }, "asin": "B0829Q45LH" }, { "task_id": "ws_B093D8HPK9_10760", "instruction": "in the accent furniture section, i am looking for an ottoman bench. must have folding storage, memory foam, contemporary style in the color black, and 30 inches in size.", "target_attributes": { "attributes": [ "memory foam", "contemporary style" ], "options": [ "brown" ] }, "asin": "B093D8HPK9" }, { "task_id": "ws_B079YZGLC8_10761", "instruction": "i want a 8.5 fl oz of volumizing oil free biotin shampoo.", "target_attributes": { "attributes": [ "oil free" ], "options": [ "shampoo - 8.5 fl oz bottle" ] }, "asin": "B079YZGLC8" }, { "task_id": "ws_B09KGFMZCV_10762", "instruction": "i need a faux fur coat that is black and in a medium.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "black", "medium" ] }, "asin": "B09KGFMZCV" }, { "task_id": "ws_B093YSND5Y_10763", "instruction": "i am looking for a laundry bag for travel purpose.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSND5Y" }, { "task_id": "ws_B000PD247Y_10764", "instruction": "i need some hinges for the cabinet that are heavy duty with a satin nickel finish.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "satin nickel" ] }, "asin": "B000PD247Y" }, { "task_id": "ws_B09MS193N1_10765", "instruction": "i want a high definition germerse portable projector.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09MS193N1" }, { "task_id": "ws_B085419WXH_10766", "instruction": "i want a water resistant kodak printomatic instant print camera.", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B085419WXH" }, { "task_id": "ws_B09GW5BZ1G_10767", "instruction": "i want uscce alarm clock radio with batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09GW5BZ1G" }, { "task_id": "ws_B07YYB2QW6_10768", "instruction": "i would like a clock radio with a usb port.", "target_attributes": { "attributes": [ "usb port" ], "options": [] }, "asin": "B07YYB2QW6" }, { "task_id": "ws_B01F7B0ZLU_10769", "instruction": "i would like a blue jay fully assembled desk chair.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "blue jay" ] }, "asin": "B01F7B0ZLU" }, { "task_id": "ws_B015ND5QJS_10770", "instruction": "i want sure unscented, anti-perspirant deodorant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B015ND5QJS" }, { "task_id": "ws_B091TK7X5K_10771", "instruction": "i am looking for a camisole blouse for daily wear. also choose loose fit and large size.", "target_attributes": { "attributes": [ "loose fit", "daily wear" ], "options": [ "large" ] }, "asin": "B091TK7X5K" }, { "task_id": "ws_B094QYPSD6_10772", "instruction": "i need a super soft fleece throw blanket for my living room couch. i really like the fruit avocado cartoon color.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "fruit avocado cartoon" ] }, "asin": "B094QYPSD6" }, { "task_id": "ws_B08M3WNDLH_10773", "instruction": "i need a long lasting makeup kit.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "kit005" ] }, "asin": "B08M3WNDLH" }, { "task_id": "ws_B000EH4XZC_10774", "instruction": "i want buy a jasmati gluten free bpa free non gmo rice size : 1.75 pound", "target_attributes": { "attributes": [ "non gmo", "bpa free", "gluten free" ], "options": [ "1.75 pound (pack of 1)", "jasmati" ] }, "asin": "B000EH4XZC" }, { "task_id": "ws_B00B4JM0J0_10775", "instruction": "i want a 12 pack of tenergy premium rechargeable aaa batteries.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [ "12 pcs" ] }, "asin": "B00B4JM0J0" }, { "task_id": "ws_B08HRXWX4G_10776", "instruction": "i would like a 31.5 inch pendant light chandelier for the dining room.", "target_attributes": { "attributes": [ "pendant light", "dining room" ], "options": [ "length 31.5''" ] }, "asin": "B08HRXWX4G" }, { "task_id": "ws_B07N3CDZ3G_10777", "instruction": "i need a black t shirt that is classic fit and an x-large for women", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "women", "x-large" ] }, "asin": "B07N3CDZ3G" }, { "task_id": "ws_B000IVKM6S_10778", "instruction": "i would like a box of 12 blueberry muffin bars that are made of natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "blueberry muffin", "12 count (pack of 1)" ] }, "asin": "B000IVKM6S" }, { "task_id": "ws_B07BF6Z7TM_10779", "instruction": "i am looking for a plant based condition that has olive on it and is 10.8 fl oz", "target_attributes": { "attributes": [ "plant based" ], "options": [ "olive & black seed", "10.8 fl oz (pack of 1)" ] }, "asin": "B07BF6Z7TM" }, { "task_id": "ws_B000VOHH8I_10780", "instruction": "i need a long lasting 6.76 fl oz bottle of l'eau d'issey.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "6.76 fl oz (pack of 1)" ] }, "asin": "B000VOHH8I" }, { "task_id": "ws_B08NXWGSL1_10781", "instruction": "i am looking for a dairy free cold coffee which is rich creamy. also choose chocolate milk color and 8.4 fl oz (pack of 6)", "target_attributes": { "attributes": [ "rich creamy", "dairy free" ], "options": [ "chocolate milk", "8.4 fl oz (pack of 6)" ] }, "asin": "B08NXWGSL1" }, { "task_id": "ws_B086YQ42LX_10782", "instruction": "i want light pink clip in full head hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "light pink" ] }, "asin": "B086YQ42LX" }, { "task_id": "ws_B09C332WLY_10783", "instruction": "i need a wax warmer for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09C332WLY" }, { "task_id": "ws_B09PQWGMPH_10784", "instruction": "i need type b monoculars that are easy to carry.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "type b" ] }, "asin": "B09PQWGMPH" }, { "task_id": "ws_B09RK7KBXF_10785", "instruction": "i would like a extra large red pair of shorts that i can machine washed.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "red", "x-large" ] }, "asin": "B09RK7KBXF" }, { "task_id": "ws_B08R6BB3XC_10786", "instruction": "i am looking for some kosher raspberry candy that is in a one pound bag.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "raspberry", "1 pound (pack of 1)" ] }, "asin": "B08R6BB3XC" }, { "task_id": "ws_B09PF38W9C_10787", "instruction": "i am looking for a hand crafted chocolate gift set.", "target_attributes": { "attributes": [ "hand crafted", "gift set" ], "options": [] }, "asin": "B09PF38W9C" }, { "task_id": "ws_B09H2JW13J_10788", "instruction": "i would like a sw 65 brown high quality hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [] }, "asin": "B09H2JW13J" }, { "task_id": "ws_B01LWV686W_10789", "instruction": "i am looking for some long lasting lavender hair color", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "lavender" ] }, "asin": "B01LWV686W" }, { "task_id": "ws_B09R9Z116W_10790", "instruction": "i want black masbird closed toe sandals for women.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "black" ] }, "asin": "B09R9Z116W" }, { "task_id": "ws_B09S2VM5BL_10791", "instruction": "i would like a 5xl white short sleeve top.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "2-white", "5x-large" ] }, "asin": "B09S2VM5BL" }, { "task_id": "ws_B09LLZ3FMY_10792", "instruction": "i would like a matte black 10 light chandelier for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "matte black", "10-light with adjustable height" ] }, "asin": "B09LLZ3FMY" }, { "task_id": "ws_B07NL4CT8L_10793", "instruction": "i would like a quad i5 core desktop tower.", "target_attributes": { "attributes": [ "core i5", "quad core" ], "options": [] }, "asin": "B07NL4CT8L" }, { "task_id": "ws_B08WJMH85C_10794", "instruction": "i am looking for refillable leak proof black plastic pump bottles.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "black" ] }, "asin": "B08WJMH85C" }, { "task_id": "ws_B007Q261WQ_10795", "instruction": "i would like a jar candle that is long lasting and 6 oz.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "6 oz" ] }, "asin": "B007Q261WQ" }, { "task_id": "ws_B08V1N8ZX1_10796", "instruction": "i want black caterpillar unisex shoes with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black | black" ] }, "asin": "B08V1N8ZX1" }, { "task_id": "ws_B0865NYZQ4_10797", "instruction": "i am looking for travel bottles 1.2 oz plastic, refillable makeup sprayer.", "target_attributes": { "attributes": [ "travel bottles" ], "options": [] }, "asin": "B0865NYZQ4" }, { "task_id": "ws_B091H3VWNQ_10798", "instruction": "i am looking for some dining room barstools", "target_attributes": { "attributes": [ "dining room" ], "options": [] }, "asin": "B091H3VWNQ" }, { "task_id": "ws_B08CMX9CTD_10799", "instruction": "i want 2 pounds of 4th & heart grass fed butter.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B08CMX9CTD" }, { "task_id": "ws_B087QR168J_10800", "instruction": "i am looking for a 100 count bubblegum that is spearmint flavored and sugar free", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "spearmint", "100 count (pack of 1)" ] }, "asin": "B087QR168J" }, { "task_id": "ws_B01BMORA3M_10801", "instruction": "i would like to have a soft black hair building fiber that prevents hair loss and is easy to apply.", "target_attributes": { "attributes": [ "easy apply", "hair loss" ], "options": [ "soft black" ] }, "asin": "B01BMORA3M" }, { "task_id": "ws_B09F656S51_10802", "instruction": "i would like a usb network adapter that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09F656S51" }, { "task_id": "ws_B09STJVCQM_10803", "instruction": "i need some living room furniture.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09STJVCQM" }, { "task_id": "ws_B09LV7HGHD_10804", "instruction": "i am looking for a high quality pink ice face roller with silicone ice mold.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "pink" ] }, "asin": "B09LV7HGHD" }, { "task_id": "ws_B093YSVRDF_10805", "instruction": "i am looking for a wallet that can go with my hoisery.", "target_attributes": { "attributes": [ "blouse hosiery" ], "options": [] }, "asin": "B093YSVRDF" }, { "task_id": "ws_B0754J7ZVJ_10806", "instruction": "i am looking for certified organic baby food squeeze pouches that are easy to use.", "target_attributes": { "attributes": [ "easy use", "certified organic" ], "options": [] }, "asin": "B0754J7ZVJ" }, { "task_id": "ws_B08MDT98GD_10807", "instruction": "i would like a bakers rack for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [] }, "asin": "B08MDT98GD" }, { "task_id": "ws_B09PR85B9T_10808", "instruction": "i'm looking for open toe flat sandals for women in black color. please select size 5 if available.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black", "5" ] }, "asin": "B09PR85B9T" }, { "task_id": "ws_B01BO5PHNE_10809", "instruction": "i would like a green tea anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant", "green tea" ], "options": [] }, "asin": "B01BO5PHNE" }, { "task_id": "ws_B01H7X0BGK_10810", "instruction": "buy me some antiperspirant that hasn't been tested on animals.", "target_attributes": { "attributes": [ "anti perspirant", "animal testing" ], "options": [] }, "asin": "B01H7X0BGK" }, { "task_id": "ws_B07SJR1XFW_10811", "instruction": "i want a multi colored us constitution print that is ready to hang.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "multi8" ] }, "asin": "B07SJR1XFW" }, { "task_id": "ws_B09BVBVHTV_10812", "instruction": "i am looking for a super soft bed blanket that is 40inch by 30inches and has llamas.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "just love llama", "40 in x 30 in xs for pet" ] }, "asin": "B09BVBVHTV" }, { "task_id": "ws_B08643FGX5_10813", "instruction": "i am looking for a granola bar rolled oats and peanut butter with artificial flavour", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [] }, "asin": "B08643FGX5" }, { "task_id": "ws_B08MVGSN5T_10814", "instruction": "i need a cruelty free skin care set.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B08MVGSN5T" }, { "task_id": "ws_B09CKX77TL_10815", "instruction": "i need some towels to dry my hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [] }, "asin": "B09CKX77TL" }, { "task_id": "ws_B0932JCSZP_10816", "instruction": "i am looking for high quality tin jars with screw on lids, lip balm containers, pots for my diy's, salve powder, storage cans, spoon, labels.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "white" ] }, "asin": "B0932JCSZP" }, { "task_id": "ws_B07NF9PRPH_10817", "instruction": "i am interested in buying a canon camera which has 1080p hd quality and also has optical zoom, i prefer having it in silver color.", "target_attributes": { "attributes": [ "1080p hd", "optical zoom" ], "options": [ "silver" ] }, "asin": "B07NF9PRPH" }, { "task_id": "ws_B09K7SP9Y9_10818", "instruction": "i want a xx-large regular fit hood crew men's polo shirt.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "xx-large" ] }, "asin": "B09K7SP9Y9" }, { "task_id": "ws_B09M7VS2QF_10819", "instruction": "i am in need of a 10x6.5ft, light weight and high resolution backdrop for digital photography.", "target_attributes": { "attributes": [ "light weight", "high resolution", "digital photography" ], "options": [ "10x6.5ft" ] }, "asin": "B09M7VS2QF" }, { "task_id": "ws_B088R5X1X7_10820", "instruction": "i need a high quality makeup mirror to be given as a gift for the maid of honor. find something in rose gold color.", "target_attributes": { "attributes": [ "high quality", "rose gold" ], "options": [ "maid of honor" ] }, "asin": "B088R5X1X7" }, { "task_id": "ws_B0953MVBG4_10821", "instruction": "i need a black train case that is high quality and medium in size", "target_attributes": { "attributes": [ "high quality" ], "options": [ "large black", "meduim" ] }, "asin": "B0953MVBG4" }, { "task_id": "ws_B019WAS2PI_10822", "instruction": "i need high speed hdmi cables that are 10 feet long and in a 5 pack.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "10 feet (5-pack)" ] }, "asin": "B019WAS2PI" }, { "task_id": "ws_B07YF6B5XH_10823", "instruction": "i need 8.4 fl oz travel size voir haircare hair masks.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "8.4 fl oz" ] }, "asin": "B07YF6B5XH" }, { "task_id": "ws_B071FFPC3S_10824", "instruction": "i would like a 18 by 18-inch teal throw pillow cover that can be machine washed.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "teal yellow", "18 x 18-inch" ] }, "asin": "B071FFPC3S" }, { "task_id": "ws_B09MV32C9T_10825", "instruction": "i need some candle sconces for the living room", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09MV32C9T" }, { "task_id": "ws_B07DFDS6CS_10826", "instruction": "i need to buy the greaton 8 inch fully assembled traditional wooden box spring/mattress base for my bedroom. check the following measurements size: 75\" x 33\" and 4\" split base", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "75\" x 33\"", "4\" split foundation" ] }, "asin": "B07DFDS6CS" }, { "task_id": "ws_B07VNQWW5H_10827", "instruction": "i am looking for a leopard shower cap for natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "leopard" ] }, "asin": "B07VNQWW5H" }, { "task_id": "ws_B0953KT25P_10828", "instruction": "i am looking for taupe colored height adjustable bar stools with steel frame.", "target_attributes": { "attributes": [ "height adjustable", "steel frame" ], "options": [ "taupe" ] }, "asin": "B0953KT25P" }, { "task_id": "ws_B07WF9RJD3_10829", "instruction": "i am looking for royal purple blackout curtains that are easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "royal purple" ] }, "asin": "B07WF9RJD3" }, { "task_id": "ws_B08Q8H55YK_10830", "instruction": "i am looking for a hair extensions with 16 inch long also easy to apply.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "16 inch" ] }, "asin": "B08Q8H55YK" }, { "task_id": "ws_B09MQW4CXY_10831", "instruction": "i would like some easy to use dental flossers.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B09MQW4CXY" }, { "task_id": "ws_B013TNXWEK_10832", "instruction": "i need some small black shoes for men that have arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black", "small" ] }, "asin": "B013TNXWEK" }, { "task_id": "ws_B004SQZ4VW_10833", "instruction": "i need some steel toed shoes that are chocolate colored and are a size 7.", "target_attributes": { "attributes": [ "steel toe" ], "options": [ "chocolate", "7" ] }, "asin": "B004SQZ4VW" }, { "task_id": "ws_B09QY8BC84_10834", "instruction": "i need a fluoride free toothpaste made with natural ingredients which is good for sensitive teeth and can fight bad breath.", "target_attributes": { "attributes": [ "fluoride free", "natural ingredients", "sensitive teeth" ], "options": [ "a" ] }, "asin": "B09QY8BC84" }, { "task_id": "ws_B07MXR58WG_10835", "instruction": "i want peanut butter super pop snacks that are plant based.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "peanut butter variety" ] }, "asin": "B07MXR58WG" }, { "task_id": "ws_B08QTYTB8C_10836", "instruction": "i would like a 30 by 60 inch blue painting for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "bl-013", "30x60 inch" ] }, "asin": "B08QTYTB8C" }, { "task_id": "ws_B09RW15VTG_10837", "instruction": "i need a box spring mattress.", "target_attributes": { "attributes": [ "box spring" ], "options": [] }, "asin": "B09RW15VTG" }, { "task_id": "ws_B09H8QZWZ1_10838", "instruction": "i am looking for a moisturizing skin scrub that is alcohol free.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [ "scrub" ] }, "asin": "B09H8QZWZ1" }, { "task_id": "ws_B072QCQJVS_10839", "instruction": "looking for a medium sized, high waist denim shorts for teen girls.", "target_attributes": { "attributes": [ "high waist", "teen girls" ], "options": [ "medium" ] }, "asin": "B072QCQJVS" }, { "task_id": "ws_B09QPYJPKZ_10840", "instruction": "i need a medium sized body suit that is long sleeved and in white.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x02-white", "medium" ] }, "asin": "B09QPYJPKZ" }, { "task_id": "ws_B0969H5DJX_10841", "instruction": "i would like a 52 cm brown bed riser with a lot of storage space.", "target_attributes": { "attributes": [ "storage space" ], "options": [ "brown-b", "52cm" ] }, "asin": "B0969H5DJX" }, { "task_id": "ws_B088GYH4KF_10842", "instruction": "i am looking for a 12 count of low sugar espresso bars", "target_attributes": { "attributes": [ "low sugar" ], "options": [ "12ct espresso" ] }, "asin": "B088GYH4KF" }, { "task_id": "ws_B0069874ZQ_10843", "instruction": "i want fully cooked spam classic lite singles.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B0069874ZQ" }, { "task_id": "ws_B085928MJN_10844", "instruction": "i would like a 36 by 48 inch painting for my living room that is of a red barn", "target_attributes": { "attributes": [ "living room" ], "options": [ "red barn", "36x48in" ] }, "asin": "B085928MJN" }, { "task_id": "ws_B08R771GPW_10845", "instruction": "i need some teeth whitening that also freshens breath.", "target_attributes": { "attributes": [ "fresh breath" ], "options": [] }, "asin": "B08R771GPW" }, { "task_id": "ws_B00IH0FYJ2_10846", "instruction": "i want trader joe's freeze dried mangos.", "target_attributes": { "attributes": [ "freeze dried", "trader joe" ], "options": [] }, "asin": "B00IH0FYJ2" }, { "task_id": "ws_B00MJW2X8E_10847", "instruction": "i would like to have a kosher gelato.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [] }, "asin": "B00MJW2X8E" }, { "task_id": "ws_B01LTHYWAQ_10848", "instruction": "get me some toothpaste for sensitive teeth that has preventive and restorative properties.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "prevent and repair" ] }, "asin": "B01LTHYWAQ" }, { "task_id": "ws_B09895X3NW_10849", "instruction": "i'm looking for a buffet sideboard cabinet with clear glass doors. prefer the size to be \"b type espresso-28\u201cl x 14.6\u201dw x 29\u201dh\" .", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B09895X3NW" }, { "task_id": "ws_B097GZ81LY_10850", "instruction": "i want large high waisted congyee women's athletic shorts.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "large" ] }, "asin": "B097GZ81LY" }, { "task_id": "ws_B07PTZ3141_10851", "instruction": "i need to buy an eight by six foot backdrop for digital photography. it should be high resolution and light weight.", "target_attributes": { "attributes": [ "light weight", "high resolution", "digital photography" ], "options": [ "8x6ft" ] }, "asin": "B07PTZ3141" }, { "task_id": "ws_B01GEW27DA_10852", "instruction": "i would like a quad core tablet that is black and has 8gb of ram", "target_attributes": { "attributes": [ "quad core" ], "options": [ "black", "8 gb" ] }, "asin": "B01GEW27DA" }, { "task_id": "ws_B08JZJVNPM_10853", "instruction": "i am interested in plant based granola bars that are banana flavored and come in a pack of 12.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "banana", "1.7 ounce (pack of 12)" ] }, "asin": "B08JZJVNPM" }, { "task_id": "ws_B0018OHOPG_10854", "instruction": "i am looking for straight legged jeans in size 66w x 28l, that are also machine washable.", "target_attributes": { "attributes": [ "straight leg", "machine wash" ], "options": [ "66w x 28l" ] }, "asin": "B0018OHOPG" }, { "task_id": "ws_B01KI9G5D8_10855", "instruction": "i need a black hoodie that is machine washable and is 4x-large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "black", "4x-large" ] }, "asin": "B01KI9G5D8" }, { "task_id": "ws_B01LZ9TVW8_10856", "instruction": "i want a variety pack of non gmo 7days bagel chips.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "variety (garlic, sea salt, cinnamon raisin)" ] }, "asin": "B01LZ9TVW8" }, { "task_id": "ws_B09STB31NW_10857", "instruction": "i need a non slip pair of women's shoes with rubber soles. it should be in size 11.5.", "target_attributes": { "attributes": [ "non slip", "rubber sole" ], "options": [ "11.5" ] }, "asin": "B09STB31NW" }, { "task_id": "ws_B07NXN3V27_10858", "instruction": "i am looking for a low sugar blue cheese and chive steak sauce.", "target_attributes": { "attributes": [ "low sugar" ], "options": [] }, "asin": "B07NXN3V27" }, { "task_id": "ws_B09R1MRJ7S_10859", "instruction": "i am looking for the high waist bikini push up swimwear. i want it in red.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "red" ] }, "asin": "B09R1MRJ7S" }, { "task_id": "ws_B008BRLSP0_10860", "instruction": "i want a 24 pack of gluten free goya foods cream of coconut.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "15 ounce (pack of 24)" ] }, "asin": "B008BRLSP0" }, { "task_id": "ws_B073V6B9TY_10861", "instruction": "i want brass calhoun collection farmhouse bath vanity lights.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "brass" ] }, "asin": "B073V6B9TY" }, { "task_id": "ws_B013RIOOFS_10862", "instruction": "i am looking for an anti aging face serum, tighten, brighten, and hydrate.", "target_attributes": { "attributes": [ "anti aging" ], "options": [ "1.75 fl oz" ] }, "asin": "B013RIOOFS" }, { "task_id": "ws_B09NB9JW4M_10863", "instruction": "i would like a pink hair straightener for styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "pink" ] }, "asin": "B09NB9JW4M" }, { "task_id": "ws_B07BKQ137Y_10864", "instruction": "i would like two bags of a variety four pack of gluten free crackers.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety 4 pack", "2 bags" ] }, "asin": "B07BKQ137Y" }, { "task_id": "ws_B09JS6P9P9_10865", "instruction": "find me some highly pigmented eye shadow in color b.", "target_attributes": { "attributes": [ "highly pigmented", "eye shadow" ], "options": [ "b" ] }, "asin": "B09JS6P9P9" }, { "task_id": "ws_B07JZL2N7V_10866", "instruction": "hello . looking for my new home easy install wall speaker, monoprice carbon fiber - 300 watt 10 inch (each) subwoofer, for home theater .", "target_attributes": { "attributes": [ "easy install" ], "options": [ "10 in", "3 way" ] }, "asin": "B07JZL2N7V" }, { "task_id": "ws_B07KXD5H85_10867", "instruction": "i am looking for a men's shorts with stretch fabric in 3xl size. also in royal blue color.", "target_attributes": { "attributes": [ "stretch fabric" ], "options": [ "royal blue", "3x-large" ] }, "asin": "B07KXD5H85" }, { "task_id": "ws_B07MLJFSW3_10868", "instruction": "i want a farmhouse grey acadian solid wood side table.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "farmhouse grey" ] }, "asin": "B07MLJFSW3" }, { "task_id": "ws_B08HRYSFKM_10869", "instruction": "i am looking for a high performance tablet with quad core processor which should have sim support and all necessary features.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [] }, "asin": "B08HRYSFKM" }, { "task_id": "ws_B07FMRG1PF_10870", "instruction": "i need low carb protein bars", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B07FMRG1PF" }, { "task_id": "ws_B08G9W5T9J_10871", "instruction": "i am looking for a legacy grenadine colored men's dress shirt that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "legacy grenadine" ] }, "asin": "B08G9W5T9J" }, { "task_id": "ws_B015YITIGY_10872", "instruction": "i am looking for an assorted small cookie gift set that s covered with chocolate please.", "target_attributes": { "attributes": [ "chocolate covered", "gift set" ], "options": [ "assorted", "small" ] }, "asin": "B015YITIGY" }, { "task_id": "ws_B01H7ENCMO_10873", "instruction": "i am looking for standard sized levi strauss & co. men's carpenter jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "standard" ] }, "asin": "B01H7ENCMO" }, { "task_id": "ws_B07RQ7VQ8V_10874", "instruction": "i am looking for a light weight medium size body shaper for men. also, i prefer a white colored one.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "white (with tummy folds)", "medium" ] }, "asin": "B07RQ7VQ8V" }, { "task_id": "ws_B073WD1PN1_10875", "instruction": "i need a machine washable throw pillow cover that is in a grey color and is 16\" by 16\"", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "grey dust", "16\" x 16\"" ] }, "asin": "B073WD1PN1" }, { "task_id": "ws_B08GY89RK9_10876", "instruction": "i want a lorex 16-channel 4k uhd dvr surveillance system with motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B08GY89RK9" }, { "task_id": "ws_B06XR97NGM_10877", "instruction": "i would like a six drawer natural walnut dresser with bronze finishes.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "adler - natural walnut", "6-drawer" ] }, "asin": "B06XR97NGM" }, { "task_id": "ws_B06XR97NGM_10878", "instruction": "i am looking for a 9 drawer dresser with a bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [ "9-drawer" ] }, "asin": "B06XR97NGM" }, { "task_id": "ws_B082CSSS2M_10879", "instruction": "i need cupcake toppers for a baby shower", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B082CSSS2M" }, { "task_id": "ws_B08KLGJBRJ_10880", "instruction": "i need a wall mounted mirror that is 36 by 28 inches.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "36 x28 inch" ] }, "asin": "B08KLGJBRJ" }, { "task_id": "ws_B08CXZHG4C_10881", "instruction": "i want a black non slip cordking designed for iphone 12.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "black" ] }, "asin": "B08CXZHG4C" }, { "task_id": "ws_B07G7SP5WB_10882", "instruction": "i need a portable bluetooth speaker that is hands free. pick something in blue.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "blue" ] }, "asin": "B07G7SP5WB" }, { "task_id": "ws_B07XBZ1MPH_10883", "instruction": "i need some living room drapes that are greyish white and are 52w by 108l", "target_attributes": { "attributes": [ "living room" ], "options": [ "greyish white", "52w x 108l" ] }, "asin": "B07XBZ1MPH" }, { "task_id": "ws_B091CRF68B_10884", "instruction": "i would like a medium purple short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "purple-8", "medium" ] }, "asin": "B091CRF68B" }, { "task_id": "ws_B07NLB7W1P_10885", "instruction": "i want a coffee scented coconut oil face scrub.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "coffee" ] }, "asin": "B07NLB7W1P" }, { "task_id": "ws_B077P2FKZH_10886", "instruction": "i'm looking for a white king-sized bedroom set with a box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "white", "king" ] }, "asin": "B077P2FKZH" }, { "task_id": "ws_B09FKYGPGC_10887", "instruction": "i am looking for a soft shower body brush with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B09FKYGPGC" }, { "task_id": "ws_B09881DT11_10888", "instruction": "some loose fitting white joggers in an xx-large would be nice.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "white", "xx-large" ] }, "asin": "B09881DT11" }, { "task_id": "ws_B01GUPABIO_10889", "instruction": "i\u2019d like to find a multipack of macaroni cheese in white cheddar flavour. but it must not contain any dairy or gluten.", "target_attributes": { "attributes": [ "gluten free", "dairy free" ], "options": [ "white cheddar" ] }, "asin": "B01GUPABIO" }, { "task_id": "ws_B07L75RSD5_10890", "instruction": "i am interested in a beige and wine living room rug.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige | wine" ] }, "asin": "B07L75RSD5" }, { "task_id": "ws_B09PV6QPPN_10891", "instruction": "i need wedge sandals that are high heel and 6.5 narrow.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "6.5 narrow" ] }, "asin": "B09PV6QPPN" }, { "task_id": "ws_B088N8FZMV_10892", "instruction": "i want some cake toppers for my party supplies.", "target_attributes": { "attributes": [ "party supplies" ], "options": [] }, "asin": "B088N8FZMV" }, { "task_id": "ws_B0972Q1T8T_10893", "instruction": "i want a noise cancelling cosycost usb microphone.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B0972Q1T8T" }, { "task_id": "ws_B08989D7RZ_10894", "instruction": "i am looking for a displayport to hdmi adapter with plug and play option. also support 4k / 30hz.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "displayport", "4k | 30hz" ] }, "asin": "B08989D7RZ" }, { "task_id": "ws_B09QPR5NQL_10895", "instruction": "i want a pair of pink high heeled sandals with an open toe and a leather sole.", "target_attributes": { "attributes": [ "open toe", "leather sole" ], "options": [ "sandals 04 pink", "10" ] }, "asin": "B09QPR5NQL" }, { "task_id": "ws_B09KV72579_10896", "instruction": "could you find for me for my living room room this product: green palm leaf curtains tropical leaves botanical pattern print blackout curtains, panel set window curtains size 52x24 in", "target_attributes": { "attributes": [ "living room" ], "options": [ "52x24in" ] }, "asin": "B09KV72579" }, { "task_id": "ws_B07V5FS2FQ_10897", "instruction": "i want a light weight leyiyi 15x10ft 80's party backdrop.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "15x10ft-vinyl" ] }, "asin": "B07V5FS2FQ" }, { "task_id": "ws_B07LB4K52K_10898", "instruction": "i am looking for a certified refurbished nintendo 3ds.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B07LB4K52K" }, { "task_id": "ws_B08T8Q5JXC_10899", "instruction": "i'm looking for some juicy watermelon lip gloss that's paraben and oil free.", "target_attributes": { "attributes": [ "oil free", "paraben free" ], "options": [ "juicy watermelon" ] }, "asin": "B08T8Q5JXC" }, { "task_id": "ws_B08WHJLGWT_10900", "instruction": "i want to buy a vinyl skin for my ps5. look for one that's easy to install. the color should be marijuana black, and get the disc edition size.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "marijuana black carbon fiber", "disc edition" ] }, "asin": "B08WHJLGWT" }, { "task_id": "ws_B08WHJLGWT_10901", "instruction": "i am looking for an easy to install matte black vinyl skin decal for playstation 5 console and it's two controllers.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "matte black" ] }, "asin": "B08WHJLGWT" }, { "task_id": "ws_B07L4YCSQL_10902", "instruction": "i want green tea scented brickell men's morning face care routine.", "target_attributes": { "attributes": [ "green tea" ], "options": [ "scented" ] }, "asin": "B07L4YCSQL" }, { "task_id": "ws_B094R56BLY_10903", "instruction": "buy me a pair of black snake leather flip flops with arch support in a size six.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black snake leather", "6" ] }, "asin": "B094R56BLY" }, { "task_id": "ws_B09FWZYWC5_10904", "instruction": "i am looking for a youth classic fit t-shirt that is black and large.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "youth", "large" ] }, "asin": "B09FWZYWC5" }, { "task_id": "ws_B094QPWBTN_10905", "instruction": "i am looking for a hand painted woman sculpture made of wood for my living room.", "target_attributes": { "attributes": [ "hand painted", "living room" ], "options": [] }, "asin": "B094QPWBTN" }, { "task_id": "ws_B071CDLM1Q_10906", "instruction": "i am looking for an easy to prepare and ready to eat packaged rice. also, please make sure that it is cheddar broccoli flavored and has 8 packs.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "cheddar broccoli", "pack of 8" ] }, "asin": "B071CDLM1Q" }, { "task_id": "ws_B07FQ7QNDL_10907", "instruction": "i'm looking for an 8 bay battery charger with rechargeable triple a batteries. it should be fast charging and have a usb port. get the one that's size 808u+8aa+8aaa.", "target_attributes": { "attributes": [ "fast charging", "aaa batteries", "usb port" ], "options": [ "808u+8aa+8aaa" ] }, "asin": "B07FQ7QNDL" }, { "task_id": "ws_B092VSCVHF_10908", "instruction": "i want a walnut wersmt led tv stand for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "walnut" ] }, "asin": "B092VSCVHF" }, { "task_id": "ws_B07658L9HR_10909", "instruction": "i am looking for a sofa made up of pu leather in ottoman size. also in navy leather color.", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "navy leather", "ottoman" ] }, "asin": "B07658L9HR" }, { "task_id": "ws_B09HY3G462_10910", "instruction": "i would like a bottle of paraben free hair color.", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B09HY3G462" }, { "task_id": "ws_B09P1TBBJL_10911", "instruction": "i want a black executive office chair with footrest lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "black" ] }, "asin": "B09P1TBBJL" }, { "task_id": "ws_B01525ZA1G_10912", "instruction": "look for a coffee gift set with whole bean flavor.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "whole bean" ] }, "asin": "B01525ZA1G" }, { "task_id": "ws_B09C7WKKVK_10913", "instruction": "i would like a #b of long lasting lipstick.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "#b" ] }, "asin": "B09C7WKKVK" }, { "task_id": "ws_B09P4R6VXR_10914", "instruction": "i would like a yellow heavy duty desk that is easy to clean.", "target_attributes": { "attributes": [ "heavy duty", "easy clean" ], "options": [ "yellow" ] }, "asin": "B09P4R6VXR" }, { "task_id": "ws_B088WGMG7P_10915", "instruction": "i would like a red hdmi cable that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "red" ] }, "asin": "B088WGMG7P" }, { "task_id": "ws_B09L52YYMB_10916", "instruction": "i want fully cooked dill and fava wild garden heat and serve pilaf.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [ "dill and fava" ] }, "asin": "B09L52YYMB" }, { "task_id": "ws_B09CPRKRSF_10917", "instruction": "i need a 42mm smartwatch band that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "42mm | 44mm" ] }, "asin": "B09CPRKRSF" }, { "task_id": "ws_B08HJ4TLXH_10918", "instruction": "i would like three pairs of cruelty free eyelashes.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "3 pair (pack of 1)" ] }, "asin": "B08HJ4TLXH" }, { "task_id": "ws_B09414RGKP_10919", "instruction": "i want ethylene vinyl nunn bush toe slip ons in size 9.", "target_attributes": { "attributes": [ "ethylene vinyl" ], "options": [ "9" ] }, "asin": "B09414RGKP" }, { "task_id": "ws_B07DPC8PV1_10920", "instruction": "i would like a brown long lasting eyeliner that is also cruelty free.", "target_attributes": { "attributes": [ "cruelty free", "long lasting" ], "options": [ "essential brown" ] }, "asin": "B07DPC8PV1" }, { "task_id": "ws_B07WZVJ14W_10921", "instruction": "shop for decaffeinated orange flavored green tea.", "target_attributes": { "attributes": [ "caffeine free" ], "options": [ "orange" ] }, "asin": "B07WZVJ14W" }, { "task_id": "ws_B08MZRGZZ8_10922", "instruction": "i want a black dust proof topcovos vr lens cover for oculus quest 2.", "target_attributes": { "attributes": [ "dust proof" ], "options": [ "black" ] }, "asin": "B08MZRGZZ8" }, { "task_id": "ws_B087D5W1B5_10923", "instruction": "i need an easy to use body brush to exfoliate dry skin.", "target_attributes": { "attributes": [ "easy use", "dry skin" ], "options": [] }, "asin": "B087D5W1B5" }, { "task_id": "ws_B09PY2WZGR_10924", "instruction": "i am looking for an oversized women's gray long sleeve sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z91-gray" ] }, "asin": "B09PY2WZGR" }, { "task_id": "ws_B07DWQ218X_10925", "instruction": "i want to get some face wash that is good for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B07DWQ218X" }, { "task_id": "ws_B07KJZMJXW_10926", "instruction": "i would like a size 5 cattail pair of snow boots with faux fur and a rubber sole.", "target_attributes": { "attributes": [ "rubber sole", "faux fur" ], "options": [ "cattail", "5" ] }, "asin": "B07KJZMJXW" }, { "task_id": "ws_B083W8R83Q_10927", "instruction": "i am looking a gluten free low sodium lemony bites flavor snacks & trail mixes", "target_attributes": { "attributes": [ "low sodium", "gluten free" ], "options": [ "lemony bites" ] }, "asin": "B083W8R83Q" }, { "task_id": "ws_B08ZY1JRN7_10928", "instruction": "i am looking for freeze dried fruit that is gluten free.", "target_attributes": { "attributes": [ "freeze dried", "gluten free" ], "options": [ "b freeze-dried strawberries" ] }, "asin": "B08ZY1JRN7" }, { "task_id": "ws_B073P88HMF_10929", "instruction": "i want a 6.8 fl oz, hair treatment pack which provides natural hair smoothening and is sulfate free. i would like color as vitapro fusion leave-in", "target_attributes": { "attributes": [ "sulfate free", "natural hair" ], "options": [ "vitapro fusion leave-in", "6.8 fl oz", "hair treatment - 1 pack" ] }, "asin": "B073P88HMF" }, { "task_id": "ws_B08JHGB1KL_10930", "instruction": "i am lookinhg for nut free walnut hemp buts that come in a pack of six.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "walnut hemp", "4 ounce pouches - (pack of 6)" ] }, "asin": "B08JHGB1KL" }, { "task_id": "ws_B08JHGB1KL_10931", "instruction": "i want blueberry hemp organic super food energy bites.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "blueberry hemp" ] }, "asin": "B08JHGB1KL" }, { "task_id": "ws_B07DGXG639_10932", "instruction": "i would like a brushed nickel wall lamp with a glass shade for the living room.", "target_attributes": { "attributes": [ "glass shade", "living room" ], "options": [ "brushed nickel" ] }, "asin": "B07DGXG639" }, { "task_id": "ws_B00EEH75YE_10933", "instruction": "i want a hair treatment and an anti-aging skin moisturizer oil.", "target_attributes": { "attributes": [ "anti aging", "hair treatment" ], "options": [] }, "asin": "B00EEH75YE" }, { "task_id": "ws_B08F1VHBGL_10934", "instruction": "i am looking for decorative cupcake toppers which can be ideal for birthday party or baby shower.", "target_attributes": { "attributes": [ "birthday party", "baby shower" ], "options": [] }, "asin": "B08F1VHBGL" }, { "task_id": "ws_B09FDMTVRV_10935", "instruction": "i want buy a birthday party cupcake picks plant party supply cupcake topper", "target_attributes": { "attributes": [ "birthday party", "party supplies", "cupcake picks" ], "options": [] }, "asin": "B09FDMTVRV" }, { "task_id": "ws_B07WHJ8ZLX_10936", "instruction": "i want gray high speed philips usb type c cables.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "gray" ] }, "asin": "B07WHJ8ZLX" }, { "task_id": "ws_B004IN8ZJ8_10937", "instruction": "i need a pack of three long lasting hair color that is dark mahogany brown", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "4m dark mahogany brown", "pack of 3" ] }, "asin": "B004IN8ZJ8" }, { "task_id": "ws_B078YC6YQX_10938", "instruction": "i need a pack of 5 heavy duty hdmi cables that will support a high speed connection.", "target_attributes": { "attributes": [ "high speed", "heavy duty" ], "options": [ "5 pack" ] }, "asin": "B078YC6YQX" }, { "task_id": "ws_B07T2GXY84_10939", "instruction": "i am looking to buy a woman's us size 5 high heel shoe with a rubber sole and color patent-beige.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "patent-beige", "us5" ] }, "asin": "B07T2GXY84" }, { "task_id": "ws_B09QSRKFRZ_10940", "instruction": "can you find for me this brand kelly bro? i'm looking for womens peep toe model, and my size is 8,5. high heel is my favorite.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "8.5" ] }, "asin": "B09QSRKFRZ" }, { "task_id": "ws_B00C2DY3HE_10941", "instruction": "get me the 2 ounce 24 pack fig bars. it should be non gmo and plant based.", "target_attributes": { "attributes": [ "non gmo", "plant based" ], "options": [ "2 ounce (pack of 24)" ] }, "asin": "B00C2DY3HE" }, { "task_id": "ws_B088LVV2LZ_10942", "instruction": "i need the best items for oral hygiene.", "target_attributes": { "attributes": [ "oral hygiene" ], "options": [] }, "asin": "B088LVV2LZ" }, { "task_id": "ws_B01EAH9UAY_10943", "instruction": "i need a heavy duty extra large twin box spring that's fully assembled and ready to use.", "target_attributes": { "attributes": [ "heavy duty", "ready use", "fully assembled", "box spring" ], "options": [ "twin xl" ] }, "asin": "B01EAH9UAY" }, { "task_id": "ws_B07CVQVD7T_10944", "instruction": "i am looking for some alcohol free skin care.", "target_attributes": { "attributes": [ "alcohol free" ], "options": [] }, "asin": "B07CVQVD7T" }, { "task_id": "ws_B09Q82T9S9_10945", "instruction": "i am interested in a rotary shaver for hair removal.", "target_attributes": { "attributes": [ "hair removal" ], "options": [] }, "asin": "B09Q82T9S9" }, { "task_id": "ws_B08BZ8LVWJ_10946", "instruction": "i am looking for a heavy duty spotting scope for bird watching.", "target_attributes": { "attributes": [ "heavy duty", "bird watching" ], "options": [] }, "asin": "B08BZ8LVWJ" }, { "task_id": "ws_B07W1JRKL3_10947", "instruction": "i would like a long dark red dental chain that is easy to apply.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "8(dark red)", "long" ] }, "asin": "B07W1JRKL3" }, { "task_id": "ws_B08P3CZMCN_10948", "instruction": "i would like a medium sized pair of baseball colored jeans with a elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "baseball", "medium" ] }, "asin": "B08P3CZMCN" }, { "task_id": "ws_B08SBG5Q4N_10949", "instruction": "i am looking for a plant based clear lip balm", "target_attributes": { "attributes": [ "plant based" ], "options": [ "01 agave (clear)" ] }, "asin": "B08SBG5Q4N" }, { "task_id": "ws_B09713RP1G_10950", "instruction": "i need a remote control that has the batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09713RP1G" }, { "task_id": "ws_B07SQ9YT1T_10951", "instruction": "i want to find a small purple bike tank top for men that has a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "purple", "men", "small" ] }, "asin": "B07SQ9YT1T" }, { "task_id": "ws_B0915FJ2VH_10952", "instruction": "i want emerald mid century modway bar stools.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "emerald" ] }, "asin": "B0915FJ2VH" }, { "task_id": "ws_B08FX133HB_10953", "instruction": "i want gray high waisted aleumdr womens yoga outfits.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "gray" ] }, "asin": "B08FX133HB" }, { "task_id": "ws_B007UZ3VWM_10954", "instruction": "i need oil free 1 linen makeup foundation for women", "target_attributes": { "attributes": [ "oil free" ], "options": [ "1 linen" ] }, "asin": "B007UZ3VWM" }, { "task_id": "ws_B08VDXCNGK_10955", "instruction": "i need a loveseat that is grey and for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey", "65\"w loveseat" ] }, "asin": "B08VDXCNGK" }, { "task_id": "ws_B08NZV8CCL_10956", "instruction": "i need a variety sampler of gluten free quinoa crisps.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "variety sampler" ] }, "asin": "B08NZV8CCL" }, { "task_id": "ws_B013S9Z6LW_10957", "instruction": "i am looking for a gluten free white grape raspberry flavored drink.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "white grape raspberry" ] }, "asin": "B013S9Z6LW" }, { "task_id": "ws_B09QKSHLWD_10958", "instruction": "i need a 6 piece hair growth treatment.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "6pcs" ] }, "asin": "B09QKSHLWD" }, { "task_id": "ws_B09Q84JC6K_10959", "instruction": "i want a white machine washable mardi gras festival costume.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "white" ] }, "asin": "B09Q84JC6K" }, { "task_id": "ws_B08D736V7N_10960", "instruction": "i need a set of two barstools. get the thirty inch black ones with the metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "black", "30 inch" ] }, "asin": "B08D736V7N" }, { "task_id": "ws_B08NWFFNQ6_10961", "instruction": "i need some pore cleansing strips that are made with hyaluronic acid.", "target_attributes": { "attributes": [ "hyaluronic acid" ], "options": [] }, "asin": "B08NWFFNQ6" }, { "task_id": "ws_B09Q2JFL7M_10962", "instruction": "i am interested in a meal kit from trader joes.", "target_attributes": { "attributes": [ "trader joe" ], "options": [] }, "asin": "B09Q2JFL7M" }, { "task_id": "ws_B006X7U6KI_10963", "instruction": "i am looking for a high definition 100 watt in wall volume control knob.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "100w", "knob" ] }, "asin": "B006X7U6KI" }, { "task_id": "ws_B09C3B1FHC_10964", "instruction": "i am looking for an extra large wolf fleece throw blanket that is machine washable.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "xl" ] }, "asin": "B09C3B1FHC" }, { "task_id": "ws_B08LSRNMHH_10965", "instruction": "i want a blue non slip saftstar modern upholstered armchair.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "blue" ] }, "asin": "B08LSRNMHH" }, { "task_id": "ws_B07CLB2VKR_10966", "instruction": "i want rose c'est moi visionary makeup crayon for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "rose" ] }, "asin": "B07CLB2VKR" }, { "task_id": "ws_B07RXWX77H_10967", "instruction": "i am looking for a keto friendly vegetables with low carb also rich source of vitamins.", "target_attributes": { "attributes": [ "keto friendly", "low carb", "source vitamin" ], "options": [] }, "asin": "B07RXWX77H" }, { "task_id": "ws_B085QKBX59_10968", "instruction": "i am looking to buy an x-large short sleeve t shirt that is machine washable and a good workout shirt.", "target_attributes": { "attributes": [ "machine wash", "short sleeve" ], "options": [ "black | heather charcoal", "x-large" ] }, "asin": "B085QKBX59" }, { "task_id": "ws_B08F9TG7FC_10969", "instruction": "i am looking for synthetic hair extensions, 14\" long, with wavy ends and made for black women.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "14 inch (pack of 5)" ] }, "asin": "B08F9TG7FC" }, { "task_id": "ws_B09CLC6Q63_10970", "instruction": "i would like a purple high quality beauty case.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "purple" ] }, "asin": "B09CLC6Q63" }, { "task_id": "ws_B003HALJXC_10971", "instruction": "i am looking for english scone mix with real fruit.", "target_attributes": { "attributes": [ "real fruit" ], "options": [] }, "asin": "B003HALJXC" }, { "task_id": "ws_B008CT12G2_10972", "instruction": "i am interested in some paraben free eye creams.", "target_attributes": { "attributes": [ "paraben free" ], "options": [] }, "asin": "B008CT12G2" }, { "task_id": "ws_B004SPDEWE_10973", "instruction": "i am looking for an oil free broad spectrum spf 15 sunscreen foundation for sensitive skin.", "target_attributes": { "attributes": [ "oil free", "sensitive skin" ], "options": [] }, "asin": "B004SPDEWE" }, { "task_id": "ws_B000177FXW_10974", "instruction": "i want an eucalyptus and plant based bar soap by dr. bronner's.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "eucalyptus" ] }, "asin": "B000177FXW" }, { "task_id": "ws_B096ZBXV7R_10975", "instruction": "i would like a shampoo and conditioner set made of coconut oil.", "target_attributes": { "attributes": [ "coconut oil" ], "options": [] }, "asin": "B096ZBXV7R" }, { "task_id": "ws_B093SXYYJC_10976", "instruction": "get me a set of two mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093SXYYJC" }, { "task_id": "ws_B07MWJ9NN3_10977", "instruction": "i want a nourishing hair treatment that is sulfate free.", "target_attributes": { "attributes": [ "sulfate free", "hair treatment" ], "options": [] }, "asin": "B07MWJ9NN3" }, { "task_id": "ws_B08FBMGK6V_10978", "instruction": "i need a 5\" round cake topper for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "5\" round" ] }, "asin": "B08FBMGK6V" }, { "task_id": "ws_B088Y453DR_10979", "instruction": "i would like a black shimmer kosher certified icing glitter.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "black shimmer" ] }, "asin": "B088Y453DR" }, { "task_id": "ws_B09DDC6DN6_10980", "instruction": "i am in need of a high definition media player", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09DDC6DN6" }, { "task_id": "ws_B07XD925X1_10981", "instruction": "i would like a africa 80 by 40 poster to hang readily in my living room.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "africa #07", "80\"wx40\"h handart" ] }, "asin": "B07XD925X1" }, { "task_id": "ws_B09C55SWDM_10982", "instruction": "i want an elixir to promote hair growth and prevent hair loss. it should also be plant based.", "target_attributes": { "attributes": [ "plant based", "hair loss", "hair growth" ], "options": [] }, "asin": "B09C55SWDM" }, { "task_id": "ws_B07TYFFWH1_10983", "instruction": "i want a honey brown simplihome artisan solid wood tv stand.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "honey brown" ] }, "asin": "B07TYFFWH1" }, { "task_id": "ws_B07QXK35PD_10984", "instruction": "i would like some cake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07QXK35PD" }, { "task_id": "ws_B0174OIT6G_10985", "instruction": "i want a round safavieh sofia collection rug for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "round" ] }, "asin": "B0174OIT6G" }, { "task_id": "ws_B09JVKR8X9_10986", "instruction": "i want to find a small green women's workout set that i can wear daily.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "green", "small" ] }, "asin": "B09JVKR8X9" }, { "task_id": "ws_B09SJ1GTJR_10987", "instruction": "i am looking for two piece suits that are green and quick drying in a size small", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "9438-green", "small" ] }, "asin": "B09SJ1GTJR" }, { "task_id": "ws_B09NKPTC7S_10988", "instruction": "i would like a yellow quad core tablet.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "yellow" ] }, "asin": "B09NKPTC7S" }, { "task_id": "ws_B09D8B8WXP_10989", "instruction": "i am looking for a fanless mini pc with a quad core processor, 32 gigabytes of ram and a 256 gigabyte ssd.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "32gb ram 256gb ssd" ] }, "asin": "B09D8B8WXP" }, { "task_id": "ws_B07HZ6PY52_10990", "instruction": "i am looking for a wireless computer headset that has stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B07HZ6PY52" }, { "task_id": "ws_B09CF4LML4_10991", "instruction": "i need a silver cruelty free my little pony mini glitter gel set.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "silver" ] }, "asin": "B09CF4LML4" }, { "task_id": "ws_B00O1ABRRK_10992", "instruction": "i need noise cancelling headset that has a charging stand.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "mono speaker + charging stand" ] }, "asin": "B00O1ABRRK" }, { "task_id": "ws_B08B87XSLC_10993", "instruction": "i want a caramel queen size acacia kaylin platform bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "caramel" ] }, "asin": "B08B87XSLC" }, { "task_id": "ws_B08Y99D272_10994", "instruction": "i am interested in some individually wrapped granola bars.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [] }, "asin": "B08Y99D272" }, { "task_id": "ws_B095M8H1YD_10995", "instruction": "i am looking for 20 inch high quality hair pieces.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "20 inch" ] }, "asin": "B095M8H1YD" }, { "task_id": "ws_B09KV74LY8_10996", "instruction": "i would like a lemon living room curtain in the size 52 by 96 inches", "target_attributes": { "attributes": [ "living room" ], "options": [ "lemon2lop5557", "52x96in" ] }, "asin": "B09KV74LY8" }, { "task_id": "ws_B08NGV4VX3_10997", "instruction": "i would like some eucalyptus lavender body scrub that is also eco friendly.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "eucalyptus lavender" ] }, "asin": "B08NGV4VX3" }, { "task_id": "ws_B099NZVJH2_10998", "instruction": "i want to buy some shelf stable baby food. look for a fifteen count box of blueberry banana sweet potato.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "blueberry banana sweet potato", "15 count" ] }, "asin": "B099NZVJH2" }, { "task_id": "ws_B078KF114Q_10999", "instruction": "i want a modway engage mid-century corner sofa.", "target_attributes": { "attributes": [ "mid century" ], "options": [ "corner sofa" ] }, "asin": "B078KF114Q" }, { "task_id": "ws_B09PMN9FVZ_11000", "instruction": "i would like a small gray long sleeved hoof pick.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "z3-gray", "small" ] }, "asin": "B09PMN9FVZ" }, { "task_id": "ws_B09LQ4YHSV_11001", "instruction": "i would like a heavy duty bed frame made of steel.", "target_attributes": { "attributes": [ "heavy duty", "steel frame" ], "options": [] }, "asin": "B09LQ4YHSV" }, { "task_id": "ws_B097FF5WYB_11002", "instruction": "i want a sugar free mix of earlybird morning cocktail.", "target_attributes": { "attributes": [ "sugar free" ], "options": [] }, "asin": "B097FF5WYB" }, { "task_id": "ws_B09L1J2MPN_11003", "instruction": "i need a small relaxed fit pullover that is the color green.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "a-green", "small" ] }, "asin": "B09L1J2MPN" }, { "task_id": "ws_B07NDTB7KD_11004", "instruction": "i want a brushed berry schwarzkopf metallic permanent hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "brushed berry" ] }, "asin": "B07NDTB7KD" }, { "task_id": "ws_B07NV7D8VB_11005", "instruction": "i am interested in a 60 count of cruelty free toner.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "60 count (pack of 1)" ] }, "asin": "B07NV7D8VB" }, { "task_id": "ws_B09N6Q57XZ_11006", "instruction": "i need 2 faux leather barstools that is easy to assemble and is back adjustable. pick a brown one.", "target_attributes": { "attributes": [ "easy assemble", "faux leather" ], "options": [ "b style- brown", "2 barstools" ] }, "asin": "B09N6Q57XZ" }, { "task_id": "ws_B078XR57G8_11007", "instruction": "i need to buy a tank top for working out. look for one that's tie dyed blue, in extra large. it should be machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "tie dye blue", "x-large" ] }, "asin": "B078XR57G8" }, { "task_id": "ws_B07234YXYJ_11008", "instruction": "most of people use sugarfree like simple sweet", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "simply sweet" ] }, "asin": "B07234YXYJ" }, { "task_id": "ws_B09H5VMW2Q_11009", "instruction": "i want a white merax bunk bed box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "white" ] }, "asin": "B09H5VMW2Q" }, { "task_id": "ws_B079CG8RX2_11010", "instruction": "i would like 24 packs of 60ml eye shadow.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "2 oz | 60ml", "1 ounce (pack of 24)" ] }, "asin": "B079CG8RX2" }, { "task_id": "ws_B09SQ1RFYR_11011", "instruction": "a dome camera for indoor motion detection indoor smart security camera 1080hd size -hd version +64g", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [ "hd version+64g" ] }, "asin": "B09SQ1RFYR" }, { "task_id": "ws_B0155KFTHS_11012", "instruction": "i am looking for a tea sampler that comes in a pack of 8 and is kosher.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "standard sampler (8 count)" ] }, "asin": "B0155KFTHS" }, { "task_id": "ws_B097YKK3K1_11013", "instruction": "i want a full sized non slip tatami mattress.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "full(47*79inch)" ] }, "asin": "B097YKK3K1" }, { "task_id": "ws_B07QWVTV87_11014", "instruction": "i am looking for toenail clippers that are black and stainless steel", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "podiatrist toenail clippers\uff08black\uff09" ] }, "asin": "B07QWVTV87" }, { "task_id": "ws_B08DDHVY7T_11015", "instruction": "i need an eye serum that contains hyaluronic acid and that's good for dark circles. get the green one.", "target_attributes": { "attributes": [ "hyaluronic acid", "dark circles" ], "options": [ "green" ] }, "asin": "B08DDHVY7T" }, { "task_id": "ws_B08VWQDPMY_11016", "instruction": "i would like three packs of two ounce teriyaki low calorie jerky.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "teriyaki", "2 ounce (pack of 3)" ] }, "asin": "B08VWQDPMY" }, { "task_id": "ws_B097R48QCX_11017", "instruction": "i would like a 3xl white pair of jogging pants that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "white", "3x-large" ] }, "asin": "B097R48QCX" }, { "task_id": "ws_B099PMTNR2_11018", "instruction": "i need a lipstick that is easy to apply and long lasting in the color #1", "target_attributes": { "attributes": [ "long lasting", "easy apply" ], "options": [ "# 1" ] }, "asin": "B099PMTNR2" }, { "task_id": "ws_B00KQDCYE6_11019", "instruction": "i want a smakn high speed hdmi cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B00KQDCYE6" }, { "task_id": "ws_B0977VPCF3_11020", "instruction": "i am looking for an ultra thin gold plated mini c hdmi cable", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "mini c hdmi" ] }, "asin": "B0977VPCF3" }, { "task_id": "ws_B08B889NGC_11021", "instruction": "i want a king sized and lead free acacia aurora bed frame.", "target_attributes": { "attributes": [ "lead free" ], "options": [ "king" ] }, "asin": "B08B889NGC" }, { "task_id": "ws_B09RK86QCM_11022", "instruction": "i would like a small yellow pair of shorts that can be machine washed.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "yellow", "small" ] }, "asin": "B09RK86QCM" }, { "task_id": "ws_B09SCTKV42_11023", "instruction": "i would like a size 7.5 wide pair of white flats with a closed toe.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "a8 - white", "7.5 wide" ] }, "asin": "B09SCTKV42" }, { "task_id": "ws_B01D378GCU_11024", "instruction": "i want to find a fully assembled ottoman that is doe-colored.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "doe" ] }, "asin": "B01D378GCU" }, { "task_id": "ws_B07B3XSZS9_11025", "instruction": "i would like a red video game chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red" ] }, "asin": "B07B3XSZS9" }, { "task_id": "ws_B09D347T6V_11026", "instruction": "i am looking for statues or figurines to decorate my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09D347T6V" }, { "task_id": "ws_B09MCZPD93_11027", "instruction": "i want a heavy duty protection case for my phone. pick something in black warrior color.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "black warrior" ] }, "asin": "B09MCZPD93" }, { "task_id": "ws_B09PQK7D4F_11028", "instruction": "i want to shop for a pair of high definition binoculars for bird watching. get type \"e.\"", "target_attributes": { "attributes": [ "high definition", "bird watching" ], "options": [ "type e" ] }, "asin": "B09PQK7D4F" }, { "task_id": "ws_B096YZQ89Y_11029", "instruction": "shop for a pair of black walking shoes in size eight. look for memory foam soles.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "black", "8" ] }, "asin": "B096YZQ89Y" }, { "task_id": "ws_B07CF7GTMW_11030", "instruction": "i am looking for a small short sleeve slim fitted t-shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "small" ] }, "asin": "B07CF7GTMW" }, { "task_id": "ws_B01FWM4A2O_11031", "instruction": "i would ike a cd player that comes with aaa batteries and is in the model pm6006", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [ "pm6006" ] }, "asin": "B01FWM4A2O" }, { "task_id": "ws_B09B6J7HXM_11032", "instruction": "i need a 16:10 aspect ratio privacy filter that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "19.0 inch (diagonal) - 16:10 aspect ratio" ] }, "asin": "B09B6J7HXM" }, { "task_id": "ws_B07YNT58BC_11033", "instruction": "i need an eco friendly biodegradable body glitter, also copper holographic one and ultrafine (1 | 128\" 0.008\" 0.2mm)", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "copper holographic", "ultrafine (1 | 128\" 0.008\" 0.2mm)" ] }, "asin": "B07YNT58BC" }, { "task_id": "ws_B0764JPHNS_11034", "instruction": "i want to buy some vanilla flavored soy free cake mix. needs to be in a 3 pack of 11.29-oz boxes.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "vanilla", "11.29 ounce (pack of 3)" ] }, "asin": "B0764JPHNS" }, { "task_id": "ws_B000OAY2N2_11035", "instruction": "i would like a pair of 30 wide by 32 long quartz stone jeans that are machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "quartz stone", "30w x 32l" ] }, "asin": "B000OAY2N2" }, { "task_id": "ws_B09NLPN2FP_11036", "instruction": "i need some daily casual sandals that are black and a size 10.5", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "black", "10.5" ] }, "asin": "B09NLPN2FP" }, { "task_id": "ws_B08QVWXBBB_11037", "instruction": "i want blue aerothotic water friendly light weight eva sandals with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "arcus blue" ] }, "asin": "B08QVWXBBB" }, { "task_id": "ws_B07TKJ74X6_11038", "instruction": "i am looking for a samsung galaxy case cover that is gray.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "gray" ] }, "asin": "B07TKJ74X6" }, { "task_id": "ws_B00GFA8RN6_11039", "instruction": "i want a dove men anti-perspirant deodorant roll-on.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B00GFA8RN6" }, { "task_id": "ws_B0846G2YX1_11040", "instruction": "i would like a 36 ounce chair tea", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "1kg | 36 ounce" ] }, "asin": "B0846G2YX1" }, { "task_id": "ws_B084VJTJ7J_11041", "instruction": "i need one pack of real fruit which dried and is high in dietary fiber.", "target_attributes": { "attributes": [ "dietary fiber", "real fruit" ], "options": [ "pack of 1" ] }, "asin": "B084VJTJ7J" }, { "task_id": "ws_B071SGP6Y6_11042", "instruction": "i search no ram no ssd no wifi but high performance memory", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B071SGP6Y6" }, { "task_id": "ws_B071SGP6Y6_11043", "instruction": "i'm looking for exactly this configuration: qotom 4 lan mini pc q190g4u-s01 with 4gb ram 128gb ssd, intel celeron j1900 processor, quad core 2.0 ghz, x86 mini pc", "target_attributes": { "attributes": [ "quad core" ], "options": [ "4gb ram 128gb ssd wifi" ] }, "asin": "B071SGP6Y6" }, { "task_id": "ws_B09R93K3N4_11044", "instruction": "i want a navy slim fit mens golf polo shirt.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "navy" ] }, "asin": "B09R93K3N4" }, { "task_id": "ws_B08P9D3M89_11045", "instruction": "i need some black curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "black" ] }, "asin": "B08P9D3M89" }, { "task_id": "ws_B09B3W2S7T_11046", "instruction": "i need a 0.5 ml serum for my dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "0.5ml" ] }, "asin": "B09B3W2S7T" }, { "task_id": "ws_B091GLL9YH_11047", "instruction": "i want a silver hair styling bobby pin.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "silver" ] }, "asin": "B091GLL9YH" }, { "task_id": "ws_B08PY1V83Y_11048", "instruction": "i am looking for space saving collapsible and waterproof storage bins.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B08PY1V83Y" }, { "task_id": "ws_B089LQ8F6G_11049", "instruction": "i need a bamboo back scrubber set, with a long handle and twenty four hooks.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "24 hooks" ] }, "asin": "B089LQ8F6G" }, { "task_id": "ws_B07XWW83BP_11050", "instruction": "i am interested in a long lasting lipstick that is also cruelty free.", "target_attributes": { "attributes": [ "long lasting", "cruelty free" ], "options": [] }, "asin": "B07XWW83BP" }, { "task_id": "ws_B09JLKPMFD_11051", "instruction": "get a white airpods case. it should be water resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "white-style" ] }, "asin": "B09JLKPMFD" }, { "task_id": "ws_B0085UXQP8_11052", "instruction": "i want a frontier soups mix with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [] }, "asin": "B0085UXQP8" }, { "task_id": "ws_B09R3S2LZG_11053", "instruction": "i am looking for a loose fit cami that is black and an x-large", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "4 black", "x-large" ] }, "asin": "B09R3S2LZG" }, { "task_id": "ws_B005UN73ZW_11054", "instruction": "i need to buy an eight ounce lavender scented soy candle.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "lavender bw" ] }, "asin": "B005UN73ZW" }, { "task_id": "ws_B081TH6VJ4_11055", "instruction": "i need a 13 inch water resistant cosmetic bag.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "13 inch" ] }, "asin": "B081TH6VJ4" }, { "task_id": "ws_B09R1T216X_11056", "instruction": "i am looking for a c colored toothpaste with natural ingredients and which is also fluoride free.", "target_attributes": { "attributes": [ "fluoride free", "natural ingredients" ], "options": [ "c" ] }, "asin": "B09R1T216X" }, { "task_id": "ws_B075CYJYG5_11057", "instruction": "i am looking for vinyl,light weight and it can be folded & easy to carry;high resolution and quality & not easy fade;and can swab with water,easy to keep clean, digital photography of laeacco vinyl 7x5ft photography which is backgrop is glare free and roll out flat; it is great for studio photography:.", "target_attributes": { "attributes": [ "light weight", "high resolution", "easy carry", "digital photography" ], "options": [ "7x5ft" ] }, "asin": "B075CYJYG5" }, { "task_id": "ws_B087C54M55_11058", "instruction": "i need orange jointlycreating womens non slip running shoes.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "9-3-orange" ] }, "asin": "B087C54M55" }, { "task_id": "ws_B09JX42MVQ_11059", "instruction": "i would like a medium orange short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "yf-01 orange", "medium" ] }, "asin": "B09JX42MVQ" }, { "task_id": "ws_B08T129W3L_11060", "instruction": "i want large machine washable coorun womens yoga shorts.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "large" ] }, "asin": "B08T129W3L" }, { "task_id": "ws_B07CF7DT95_11061", "instruction": "i am looking for a double sided hair extensions in 14 inch long. also in green color.", "target_attributes": { "attributes": [ "double sided" ], "options": [ "#green", "14 inch" ] }, "asin": "B07CF7DT95" }, { "task_id": "ws_B09QPDZ1P2_11062", "instruction": "i would like a machine washable tank that is purple and in a men's x-large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "purple", "men", "x-large" ] }, "asin": "B09QPDZ1P2" }, { "task_id": "ws_B07H3MH53Y_11063", "instruction": "i need to buy a loveseat for my living room. get one that's flat packed with a wood finish.", "target_attributes": { "attributes": [ "assembly required", "wood finish", "living room" ], "options": [] }, "asin": "B07H3MH53Y" }, { "task_id": "ws_B07N62QK41_11064", "instruction": "i need a fully assembled metal bar stool. pick the black backless ones.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "black" ] }, "asin": "B07N62QK41" }, { "task_id": "ws_B07TDFCJNX_11065", "instruction": "i want white high heel ankle booties.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "white | pu-1" ] }, "asin": "B07TDFCJNX" }, { "task_id": "ws_B08JLQ2J6C_11066", "instruction": "i would like a high def monocular for bird watching.", "target_attributes": { "attributes": [ "high definition", "bird watching" ], "options": [] }, "asin": "B08JLQ2J6C" }, { "task_id": "ws_B07NLH2WV5_11067", "instruction": "locate a hedgehog garden statue with bluetooth speaker. i want the 6 1/4 inch figuring that includes aaa batteries.", "target_attributes": { "attributes": [ "batteries included", "aaa batteries" ], "options": [] }, "asin": "B07NLH2WV5" }, { "task_id": "ws_B07PGJWVQP_11068", "instruction": "i need some water resistant boots with a rubber sole. it should be in a medium brown shade.", "target_attributes": { "attributes": [ "water resistant", "rubber sole" ], "options": [ "medium brown" ] }, "asin": "B07PGJWVQP" }, { "task_id": "ws_B012KOJ61M_11069", "instruction": "i want low fat banana chips.", "target_attributes": { "attributes": [ "low fat" ], "options": [] }, "asin": "B012KOJ61M" }, { "task_id": "ws_B09QPCQF6P_11070", "instruction": "i would like a loose fit tee that is orange and is a size 4x large", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "orange", "4x-large" ] }, "asin": "B09QPCQF6P" }, { "task_id": "ws_B0999N8S5F_11071", "instruction": "i want candy bags for a halloween party.", "target_attributes": { "attributes": [ "party supplies" ], "options": [ "halloween" ] }, "asin": "B0999N8S5F" }, { "task_id": "ws_B082M964NK_11072", "instruction": "i need a home office chair that has lumbar support and comes in a four pack.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "4 pack with foot ring" ] }, "asin": "B082M964NK" }, { "task_id": "ws_B07HBF94LC_11073", "instruction": "i want a tea tree based toothpaste which should be good for sensitive teeth and can reduce bad breath.", "target_attributes": { "attributes": [ "tea tree", "sensitive teeth", "bad breath" ], "options": [] }, "asin": "B07HBF94LC" }, { "task_id": "ws_B076BMQ43T_11074", "instruction": "i am looking for curtains for my living room that are a 2 panel set in the color purple lavender.", "target_attributes": { "attributes": [ "living room" ], "options": [ "purple lavender" ] }, "asin": "B076BMQ43T" }, { "task_id": "ws_B09KGKRK8J_11075", "instruction": "i would like a twin size antique white bed that is easy to assemble.", "target_attributes": { "attributes": [ "twin size", "easy assemble" ], "options": [ "antique white", "twin" ] }, "asin": "B09KGKRK8J" }, { "task_id": "ws_B08P2PQ7HW_11076", "instruction": "i am looking for natural deodorant with paraben free, cruelty free and scent:unwind (lavender mint) in stainless steel container", "target_attributes": { "attributes": [ "paraben free", "cruelty free", "stainless steel" ], "options": [ "unwind (lavender mint)" ] }, "asin": "B08P2PQ7HW" }, { "task_id": "ws_B09KS8NRS2_11077", "instruction": "i need to buy a high performance tablet with 4g.", "target_attributes": { "attributes": [ "high performance", "4g lte" ], "options": [] }, "asin": "B09KS8NRS2" }, { "task_id": "ws_B09GV9PDT9_11078", "instruction": "i am looking for a pair of grey size 11 mens running shoes.", "target_attributes": { "attributes": [ "vinyl acetate" ], "options": [ "grey", "11" ] }, "asin": "B09GV9PDT9" }, { "task_id": "ws_B09PDBQ133_11079", "instruction": "i want a high quality toothbrush for sensitive teeth, something in blue color for my baby.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "blue" ] }, "asin": "B09PDBQ133" }, { "task_id": "ws_B093GY7VJG_11080", "instruction": "i want one size light weight women\u2019s sexy bandage halter dress.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "one size" ] }, "asin": "B093GY7VJG" }, { "task_id": "ws_B01GR35QUM_11081", "instruction": "i want a citrus and plant based dr. bronner\u2019s liquid soap.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "citrus" ] }, "asin": "B01GR35QUM" }, { "task_id": "ws_B08XNLBGFL_11082", "instruction": "i really need a foot file for dead skin.", "target_attributes": { "attributes": [ "dead skin" ], "options": [] }, "asin": "B08XNLBGFL" }, { "task_id": "ws_B083JB2WS7_11083", "instruction": "i am looking for a storage bench with a wood finish for my living room.", "target_attributes": { "attributes": [ "wood finish", "living room" ], "options": [] }, "asin": "B083JB2WS7" }, { "task_id": "ws_B09DPLKCW3_11084", "instruction": "i want a 4g lte verizon signal booster.", "target_attributes": { "attributes": [ "4g lte" ], "options": [] }, "asin": "B09DPLKCW3" }, { "task_id": "ws_B01CD9JXTO_11085", "instruction": "i need a certified refurbished nikon d750.", "target_attributes": { "attributes": [ "certified refurbished" ], "options": [] }, "asin": "B01CD9JXTO" }, { "task_id": "ws_B091Q3LQGW_11086", "instruction": "i am looking for a heavy duty bed in twin size which is easy to assemble. also choose silver with trundle color.", "target_attributes": { "attributes": [ "twin size", "heavy duty", "easy assemble" ], "options": [ "silver with trundle" ] }, "asin": "B091Q3LQGW" }, { "task_id": "ws_B08L2YMRSF_11087", "instruction": "i want a jying silver round wall mounted mirror.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "silver" ] }, "asin": "B08L2YMRSF" }, { "task_id": "ws_B07V8NLJ3Y_11088", "instruction": "i want an aura white and fast charging samsung galaxy note 10.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "aura white" ] }, "asin": "B07V8NLJ3Y" }, { "task_id": "ws_B07SLKMCDW_11089", "instruction": "i would like a heather blue men's size 4t t shirt with a needle sleeve.", "target_attributes": { "attributes": [ "needle sleeve" ], "options": [ "heather blue", "men", "4t" ] }, "asin": "B07SLKMCDW" }, { "task_id": "ws_B08QRYMRFH_11090", "instruction": "shop for a virtual reality headset that's high definition. get the size a.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "a" ] }, "asin": "B08QRYMRFH" }, { "task_id": "ws_B09JLSZYPJ_11091", "instruction": "get me a hair drying towel with a funny graphic on it.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "design funny graphic-302" ] }, "asin": "B09JLSZYPJ" }, { "task_id": "ws_B07FXZKPLS_11092", "instruction": "i am looking for a non gmo soup that is vegetarian and comes in a pack of six.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "vegetarian vegetable", "pack of 6" ] }, "asin": "B07FXZKPLS" }, { "task_id": "ws_B08QDRF3WW_11093", "instruction": "i'm looking for intel core it can easily install any.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "1tb nvme | 16gb ddr4" ] }, "asin": "B08QDRF3WW" }, { "task_id": "ws_B0742C39SB_11094", "instruction": "i am looking for some gray living room pillows.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gray" ] }, "asin": "B0742C39SB" }, { "task_id": "ws_B08XBFG6ZS_11095", "instruction": "i am looking for a mouth guard that is pink and non toxic.", "target_attributes": { "attributes": [ "non toxic" ], "options": [ "pink" ] }, "asin": "B08XBFG6ZS" }, { "task_id": "ws_B07HKFLFKM_11096", "instruction": "i need a brush set that can be used with eyeshadow. get color \"d.\"", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "d" ] }, "asin": "B07HKFLFKM" }, { "task_id": "ws_B082CLV61D_11097", "instruction": "i want a long lasting, women's spray perfume.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B082CLV61D" }, { "task_id": "ws_B09MHNZ9F5_11098", "instruction": "i need a blue breenhill electric body brush with extended long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "4110blue" ] }, "asin": "B09MHNZ9F5" }, { "task_id": "ws_B0922RLZ22_11099", "instruction": "look for an easy to install antique bronze vanity light.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "antique bronze" ] }, "asin": "B0922RLZ22" }, { "task_id": "ws_B084KYT2BK_11100", "instruction": "i would like to purchase teriyaki flavored jerky that is made from grass fed beef and comes in a 10 ounce package.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "teriyaki", "10 ounce" ] }, "asin": "B084KYT2BK" }, { "task_id": "ws_B09MFC8PTT_11101", "instruction": "i need a black full sized bed frame that is easy to assemble", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "black", "full" ] }, "asin": "B09MFC8PTT" }, { "task_id": "ws_B01K4GG51C_11102", "instruction": "i would like a pair of light blue size 6 sneakers with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "gray | light blue", "6" ] }, "asin": "B01K4GG51C" }, { "task_id": "ws_B09CW9ZHD7_11103", "instruction": "i want to buy an x-large tall, long sleeve flannel shirt that is sea cliff blue plaid.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "sea cliff blue plaid", "x-large tall" ] }, "asin": "B09CW9ZHD7" }, { "task_id": "ws_B09PL66P24_11104", "instruction": "i want a jacksing stereo audio power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B09PL66P24" }, { "task_id": "ws_B08NJ8WV83_11105", "instruction": "i am looking for a fresh, bright taste, 0 calories and fast-acting nanotonic hemp extract. cocktail with extra sparkling, you'll feel good all night, and in the morning too. yum! the mountjoy extra sparkling | fast-acting hemp-infused sparkling aperitif in assorted flavors and simple ingredients. single pack preferable.", "target_attributes": { "attributes": [ "non alcoholic", "simple ingredients" ], "options": [ "assorted flavors", "single" ] }, "asin": "B08NJ8WV83" }, { "task_id": "ws_B07TZ1Y9W7_11106", "instruction": "i am looking for king sized 5 inch mattress with high-density foam comfort and pressure relieving support for a better night's sleep. mayton medium firm tight top mattress preferable.", "target_attributes": { "attributes": [ "high density", "ready use", "fully assembled" ], "options": [ "king", "5-inch" ] }, "asin": "B07TZ1Y9W7" }, { "task_id": "ws_B09MTDNWNZ_11107", "instruction": "i'm looking for a fast charging oculus quest 2, usb a to usb c link cable that's 10ft.", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "10ft | 3m" ] }, "asin": "B09MTDNWNZ" }, { "task_id": "ws_B08JK6X5W2_11108", "instruction": "i am looking for a cake topper for a baby shower. also choose easy to use", "target_attributes": { "attributes": [ "easy use", "baby shower" ], "options": [] }, "asin": "B08JK6X5W2" }, { "task_id": "ws_B096ZS3934_11109", "instruction": "i am searching for a pair of crocs (flip flops) in a size 9-10 in stucco | white. need to be vinyl acetate ot ethylene vinyl. possible product code is 11033.", "target_attributes": { "attributes": [ "ethylene vinyl", "vinyl acetate" ], "options": [ "stucco | white", "9-10" ] }, "asin": "B096ZS3934" }, { "task_id": "ws_B08XVP4YC7_11110", "instruction": "i need a 42mm | 44 mm, apple compatible stainless steel smartwatch band which is of coffee color with a black buckle.", "target_attributes": { "attributes": [ "compatible apple", "stainless steel" ], "options": [ "coffee with black buckle", "42mm | 44mm" ] }, "asin": "B08XVP4YC7" }, { "task_id": "ws_B09PNDFZFZ_11111", "instruction": "i want type b high-definition high-power binoculars.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "type b" ] }, "asin": "B09PNDFZFZ" }, { "task_id": "ws_B087NKBGGN_11112", "instruction": "i want a king size twin bed with storage compartments.", "target_attributes": { "attributes": [ "king size" ], "options": [ "twin" ] }, "asin": "B087NKBGGN" }, { "task_id": "ws_B087NKBGGN_11113", "instruction": "i need a king size bed that is green.", "target_attributes": { "attributes": [ "king size" ], "options": [ "green" ] }, "asin": "B087NKBGGN" }, { "task_id": "ws_B08WRR2W8Q_11114", "instruction": "i want an ivory modway solid wood 6-piece sectional sofa.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "ivory" ] }, "asin": "B08WRR2W8Q" }, { "task_id": "ws_B085D1H4KG_11115", "instruction": "i would like some dental flossers that come in a storage case.", "target_attributes": { "attributes": [ "storage case" ], "options": [] }, "asin": "B085D1H4KG" }, { "task_id": "ws_B07KYKPRQH_11116", "instruction": "i would like some memory foam shoes that are navy and are a size 7.5 wide.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "navy", "7.5 wide" ] }, "asin": "B07KYKPRQH" }, { "task_id": "ws_B091SN3LMG_11117", "instruction": "i would like some black and golden jewlery for daily wear.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "black | golden" ] }, "asin": "B091SN3LMG" }, { "task_id": "ws_B0991WC1L9_11118", "instruction": "i need some high waisted jeans that are black and in an x-small.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "black", "x-small" ] }, "asin": "B0991WC1L9" }, { "task_id": "ws_B08642JYRV_11119", "instruction": "i am looking for siete grain free tortilla chips that are also gluten free, and non gmo.", "target_attributes": { "attributes": [ "grain free", "non gmo", "gluten free" ], "options": [ "5 ounce (pack of 3)" ] }, "asin": "B08642JYRV" }, { "task_id": "ws_B07BS1PT7S_11120", "instruction": "i want a black officially licensed judy hopps average bunny t-shirt.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "black" ] }, "asin": "B07BS1PT7S" }, { "task_id": "ws_B09P7SPJDS_11121", "instruction": "i would like a blue size 8.5 flat shoe that is pretty light weight.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "model 1 blue", "8.5" ] }, "asin": "B09P7SPJDS" }, { "task_id": "ws_B003C09PC4_11122", "instruction": "i'm looking for individually wrapped turkey flavoured meat sticks for snacking.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "turkey" ] }, "asin": "B003C09PC4" }, { "task_id": "ws_B082VL74XD_11123", "instruction": "i am looking for high quality dark brown braided synthetic hair extensions.", "target_attributes": { "attributes": [ "high quality", "synthetic hair" ], "options": [ "dark brown" ] }, "asin": "B082VL74XD" }, { "task_id": "ws_B01MT94PJW_11124", "instruction": "look for antiperspirant in the jean-marie farina scent. buy the travel size.", "target_attributes": { "attributes": [ "anti perspirant", "travel size" ], "options": [ "jean-marie farina" ] }, "asin": "B01MT94PJW" }, { "task_id": "ws_B00TZJDY4Q_11125", "instruction": "buy a pack of whitening toothpaste.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B00TZJDY4Q" }, { "task_id": "ws_B095C5CZL3_11126", "instruction": "i want a dongtai 1080p hd hot link remote surveillance camera.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B095C5CZL3" }, { "task_id": "ws_B08R3KWXDL_11127", "instruction": "i'm looking for cake toppers for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08R3KWXDL" }, { "task_id": "ws_B07GXHP1X1_11128", "instruction": "i need a contemporary mid century, sea blue sofa for living room made with wood frame.", "target_attributes": { "attributes": [ "mid century", "wood frame", "living room" ], "options": [ "sea blue", "sofa" ] }, "asin": "B07GXHP1X1" }, { "task_id": "ws_B08RJDWPF1_11129", "instruction": "i would like to buy some easy to use hair topper extensions that are 10 inches in length, 130% density and come in wine red color.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "wine red-b", "10 inch-130% density" ] }, "asin": "B08RJDWPF1" }, { "task_id": "ws_B08X7153CG_11130", "instruction": "i would like a hair cutting kit that is multicolor.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "multicolor 1" ] }, "asin": "B08X7153CG" }, { "task_id": "ws_B01G2HM9NA_11131", "instruction": "buy a pair of sneakers with rubber soles in a size seven and a half. order them in silver.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "silver multi", "7.5" ] }, "asin": "B01G2HM9NA" }, { "task_id": "ws_B09ML2WVBK_11132", "instruction": "i need an easy to use butter chicken recipe mix that comes in a pack of 3.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pack of 3" ] }, "asin": "B09ML2WVBK" }, { "task_id": "ws_B07R4X5GR9_11133", "instruction": "i need some jerky that does not have gluten in it.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07R4X5GR9" }, { "task_id": "ws_B082MMHC2S_11134", "instruction": "i need x-large handyulong women's high waisted ripped jeans.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "x-large" ] }, "asin": "B082MMHC2S" }, { "task_id": "ws_B09JK7DWCM_11135", "instruction": "i'm looking for a red long sleeve sweatshirt in size 3x", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "x-red", "3x-large" ] }, "asin": "B09JK7DWCM" }, { "task_id": "ws_B09M968ZCM_11136", "instruction": "i am looking for a high protein energy bar with low sugar and low carb.", "target_attributes": { "attributes": [ "high protein", "low sugar", "low carb" ], "options": [] }, "asin": "B09M968ZCM" }, { "task_id": "ws_B07RFQ668G_11137", "instruction": "i would like a 8 oz bag of kosher certified sea salt.", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "8oz bag" ] }, "asin": "B07RFQ668G" }, { "task_id": "ws_B089Z43Q8H_11138", "instruction": "i want to buy a watermelon-flavored, sugar-free syrup.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "watermelon" ] }, "asin": "B089Z43Q8H" }, { "task_id": "ws_B089Z43Q8H_11139", "instruction": "i want to find sugar-free marshmallow flavored syrup in a 25.4 ounce bottle. it must come in a pack of three.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "marshmallow", "25.4 ounce (pack of 3)" ] }, "asin": "B089Z43Q8H" }, { "task_id": "ws_B09CKSFXF1_11140", "instruction": "i need a set of easy to clean hair drying towels.", "target_attributes": { "attributes": [ "easy clean", "dry hair" ], "options": [] }, "asin": "B09CKSFXF1" }, { "task_id": "ws_B09MTTB7K5_11141", "instruction": "get me a portable toothbrush in color \"b.\" the one that says it's for teeth whitening.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "b" ] }, "asin": "B09MTTB7K5" }, { "task_id": "ws_B09HTH7VQG_11142", "instruction": "i would like a free standing shoe rack that is easy to assemble.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [] }, "asin": "B09HTH7VQG" }, { "task_id": "ws_B09PJ792FP_11143", "instruction": "i am looking for a straight leg pants for gym workout in medium size. choose navy color.", "target_attributes": { "attributes": [ "straight leg", "gym workout" ], "options": [ "navy", "medium" ] }, "asin": "B09PJ792FP" }, { "task_id": "ws_B089LQ8526_11144", "instruction": "i would like a two pack of light brown hair dye that is long lasting.", "target_attributes": { "attributes": [ "long lasting", "hair dye" ], "options": [ "4n-light brown", "pack of 2" ] }, "asin": "B089LQ8526" }, { "task_id": "ws_B09SF2KCDD_11145", "instruction": "i need some khaki open toed sandals that come in a 6 wide.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "a4 - khaki", "6 wide" ] }, "asin": "B09SF2KCDD" }, { "task_id": "ws_B07KMD725G_11146", "instruction": "i need a tee tree based scalp treatment hair care product, which is good for dry hair.", "target_attributes": { "attributes": [ "tea tree", "dry hair" ], "options": [] }, "asin": "B07KMD725G" }, { "task_id": "ws_B07J28SMHM_11147", "instruction": "i want a black and easy to use ultra slim waterproof gel eyeliner pencil.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "1. black" ] }, "asin": "B07J28SMHM" }, { "task_id": "ws_B096FKVW28_11148", "instruction": "i want beige chrisdowa light filtering roller shades for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "beige-solar" ] }, "asin": "B096FKVW28" }, { "task_id": "ws_B084443PVV_11149", "instruction": "can you help me find a shampoo set that is sulfate free, 24 fl oz and is repairing?", "target_attributes": { "attributes": [ "sulfate free" ], "options": [ "repairing (blackberry + coconut oil)", "24 fl oz" ] }, "asin": "B084443PVV" }, { "task_id": "ws_B08HD2F1QG_11150", "instruction": "i want a charcoal grey colored chair with metal legs to go in my living room.", "target_attributes": { "attributes": [ "metal legs", "living room" ], "options": [ "charcoal grey" ] }, "asin": "B08HD2F1QG" }, { "task_id": "ws_B092Z6QBYK_11151", "instruction": "i need a purple color loose fit blouse with long sleeves. i am a medium size.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "z2-purple", "medium" ] }, "asin": "B092Z6QBYK" }, { "task_id": "ws_B06XYH75NQ_11152", "instruction": "i want a gold high speed micro usb cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "gold" ] }, "asin": "B06XYH75NQ" }, { "task_id": "ws_B0009XQPHU_11153", "instruction": "please show me a digital camera. my favorite brand is casio, my husnband told me about model exilim ex-z120 7. is there a batteries included too ? isn't it", "target_attributes": { "attributes": [ "batteries included", "optical zoom" ], "options": [] }, "asin": "B0009XQPHU" }, { "task_id": "ws_B09NQ5TCN2_11154", "instruction": "i am looking for a hot pink jumpsuit that is large and made of quality materials", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "c2-hot pink", "large" ] }, "asin": "B09NQ5TCN2" }, { "task_id": "ws_B098NWGY7P_11155", "instruction": "i need to buy a new desktop pc. look for one that's intel core, 64gb of ram, with a 2 terabyte ssd and a 1 terabyte hdd.", "target_attributes": { "attributes": [ "intel core" ], "options": [ "64gb ddr4 ram, 2tb pcie ssd + 1tb hdd" ] }, "asin": "B098NWGY7P" }, { "task_id": "ws_B09B6VTZVK_11156", "instruction": "i need a long lasting non slip mattress. the size should be 1.2*2 meters.", "target_attributes": { "attributes": [ "non slip", "long lasting" ], "options": [ "1.2*2.0m" ] }, "asin": "B09B6VTZVK" }, { "task_id": "ws_B07PMYB9NK_11157", "instruction": "i am looking for a blackhead removal tool with eco friendly and also non toxic", "target_attributes": { "attributes": [ "eco friendly", "non toxic" ], "options": [] }, "asin": "B07PMYB9NK" }, { "task_id": "ws_B08RJ1678V_11158", "instruction": "i want a xx-large sousuoty short sleeve shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "xx-large" ] }, "asin": "B08RJ1678V" }, { "task_id": "ws_B07MWHY5YH_11159", "instruction": "i want a hunter colored and heavy duty gorilla grip bath rug mat.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "hunter" ] }, "asin": "B07MWHY5YH" }, { "task_id": "ws_B099DZH4P9_11160", "instruction": "i am looking for 12 pack case for apple watch 38mm series 3, 2, and 1 with tempered glass screen protector. it may be better to have waterproof, shockproof, impact resistant protective and in all the colors.", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "black | white | silver | rosegold | clear | pink | winered | darkblue | lightblue | green | purple | leopard" ] }, "asin": "B099DZH4P9" }, { "task_id": "ws_B07Z76QFVZ_11161", "instruction": "i'm looking for an easy carry and light weight photography backdrop. also, choose the 7x5ft size.", "target_attributes": { "attributes": [ "light weight", "easy carry" ], "options": [ "7x5ft" ] }, "asin": "B07Z76QFVZ" }, { "task_id": "ws_B082BWSGLF_11162", "instruction": "i want seventh generation, body wash sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B082BWSGLF" }, { "task_id": "ws_B08CF1GQBM_11163", "instruction": "look for a pair of dark grey sneakers with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "dark grey", "6" ] }, "asin": "B08CF1GQBM" }, { "task_id": "ws_B015PK1GQG_11164", "instruction": "i want azure glitties glitter powder for nail art.", "target_attributes": { "attributes": [ "nail art" ], "options": [ "azure" ] }, "asin": "B015PK1GQG" }, { "task_id": "ws_B00SH90TJ8_11165", "instruction": "i need a high quality one way for one coral nail polish.", "target_attributes": { "attributes": [ "high quality", "nail polish" ], "options": [ "coral", "one way for one" ] }, "asin": "B00SH90TJ8" }, { "task_id": "ws_B09439M7D8_11166", "instruction": "i want a small machine washable jcbytjsw jean jacket for men.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "small" ] }, "asin": "B09439M7D8" }, { "task_id": "ws_B09RJ9LMHQ_11167", "instruction": "i am looking for mens size medium golf t-shirts that are lightweight.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "medium" ] }, "asin": "B09RJ9LMHQ" }, { "task_id": "ws_B08GFL3B4J_11168", "instruction": "i need gold hands free kids bluetooth 5.0 unicorns headphones.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "gold" ] }, "asin": "B08GFL3B4J" }, { "task_id": "ws_B0789VCBF6_11169", "instruction": "i am looking for deep moisturizing shampoo for extreme damage hair .advanced formula of micro nutrients to generate moisture inside the hair repairing chemical damage and color damage from the inside out; locks in nutrients and hydration needed to keep hair strong and bouncy. the truss ultra hydration plus shampoo for dry hair.", "target_attributes": { "attributes": [ "damaged hair", "dry hair" ], "options": [] }, "asin": "B0789VCBF6" }, { "task_id": "ws_B07S6BVN5L_11170", "instruction": "i would like a bronze wall lamp for my living room.", "target_attributes": { "attributes": [ "bronze finish", "living room" ], "options": [] }, "asin": "B07S6BVN5L" }, { "task_id": "ws_B005VTQ05Y_11171", "instruction": "i need some kosher buffalo wing sauce", "target_attributes": { "attributes": [ "kosher certified" ], "options": [ "23 fl oz (pack of 1)" ] }, "asin": "B005VTQ05Y" }, { "task_id": "ws_B09G2FS316_11172", "instruction": "i want a marble white and high quality travel makeup bag.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "v-marble white" ] }, "asin": "B09G2FS316" }, { "task_id": "ws_B078XR8C15_11173", "instruction": "i would like a white item finder that has batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [ "white" ] }, "asin": "B078XR8C15" }, { "task_id": "ws_B09BFDRGX4_11174", "instruction": "i want army green knee high hbeylia women's booties.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "army green" ] }, "asin": "B09BFDRGX4" }, { "task_id": "ws_B01J5OMNWO_11175", "instruction": "i would like a pair of size 9.5 heeled blue sandals with a synthetic sole.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "blue | multi", "9.5" ] }, "asin": "B01J5OMNWO" }, { "task_id": "ws_B093238RB2_11176", "instruction": "i would like a high speed streaming media player that is easy to use.", "target_attributes": { "attributes": [ "high speed", "easy use" ], "options": [] }, "asin": "B093238RB2" }, { "task_id": "ws_B00A1EYZQA_11177", "instruction": "florida caribbean flavor tortuga orange rum cake - 4 oz rum cake for easter dessert. find a fresh baked one for me in stock.", "target_attributes": { "attributes": [ "baked fresh" ], "options": [] }, "asin": "B00A1EYZQA" }, { "task_id": "ws_B08DM9N8XQ_11178", "instruction": "i am looking for a travel sized bottle of prada luna rossa impression eau de parfum.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "prada luna rossa impression" ] }, "asin": "B08DM9N8XQ" }, { "task_id": "ws_B07JLCRDCZ_11179", "instruction": "i need a dress that is machine washable and is navy with pinstripes.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "navy, pinstripe" ] }, "asin": "B07JLCRDCZ" }, { "task_id": "ws_B081N9396M_11180", "instruction": "i am looking for double sided hair extensions that are at least 22 inches", "target_attributes": { "attributes": [ "double sided", "hair extensions" ], "options": [ "22 inch" ] }, "asin": "B081N9396M" }, { "task_id": "ws_B07YYLBZYV_11181", "instruction": "i am looking for a 5ft black ac adapter that has output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [ "black", "5ft" ] }, "asin": "B07YYLBZYV" }, { "task_id": "ws_B09SWPZS4B_11182", "instruction": "i am looking for a 5 piece hair growth treatment that has all natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "5pcs" ] }, "asin": "B09SWPZS4B" }, { "task_id": "ws_B000JZEABG_11183", "instruction": "i want fat free black forest gummy bears.", "target_attributes": { "attributes": [ "fat free" ], "options": [] }, "asin": "B000JZEABG" }, { "task_id": "ws_B09MG37LP8_11184", "instruction": "i want a sweet and awesome hersheys candy mix gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "hersheys candy mix - 2 lb" ] }, "asin": "B09MG37LP8" }, { "task_id": "ws_B08MJCJ659_11185", "instruction": "i want melody of the night wall art for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "melody of the night" ] }, "asin": "B08MJCJ659" }, { "task_id": "ws_B073G1P3ZX_11186", "instruction": "i want a 2 pound, pack of 1, chocolate covered hazelnuts.", "target_attributes": { "attributes": [ "chocolate covered" ], "options": [ "2 pound (pack of 1)" ] }, "asin": "B073G1P3ZX" }, { "task_id": "ws_B08WJGYNWJ_11187", "instruction": "i would like a 16 ounce bottle of raisin milk that could be a great gift set.", "target_attributes": { "attributes": [ "gift set", "great gift" ], "options": [ "raisins - milk", "16 ounce" ] }, "asin": "B08WJGYNWJ" }, { "task_id": "ws_B09QJMYF49_11188", "instruction": "i want a pair of green noise cancelling earbud headphones.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "green" ] }, "asin": "B09QJMYF49" }, { "task_id": "ws_B095SCLBTF_11189", "instruction": "i want a small high waisted smooto summer dress for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "small" ] }, "asin": "B095SCLBTF" }, { "task_id": "ws_B09PNC6152_11190", "instruction": "i need 2 pcs of purple color toothpaste which is good for sensitive teeth and bad breath.", "target_attributes": { "attributes": [ "sensitive teeth", "bad breath" ], "options": [ "purple", "2 pcs" ] }, "asin": "B09PNC6152" }, { "task_id": "ws_B077TQ74DM_11191", "instruction": "i would like a 40 by 40 blue orange throw pillow cover that is machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue orange", "40\" x 40\"" ] }, "asin": "B077TQ74DM" }, { "task_id": "ws_B0051I9OWQ_11192", "instruction": "i need high speed hdmi cables that are 15 feet long", "target_attributes": { "attributes": [ "high speed" ], "options": [ "15ft" ] }, "asin": "B0051I9OWQ" }, { "task_id": "ws_B07GZY9KK8_11193", "instruction": "i am looking for roasted and salted cashews that has low sodium content and no artificial ingredients.", "target_attributes": { "attributes": [ "artificial ingredients", "low sodium" ], "options": [] }, "asin": "B07GZY9KK8" }, { "task_id": "ws_B07P13RBND_11194", "instruction": "i would like a 19\" by 13\" by 17\" nile green bench that is super soft to sit in.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "nile green", "19\" x 13\" x 17\"" ] }, "asin": "B07P13RBND" }, { "task_id": "ws_B06ZYJ5HL4_11195", "instruction": "i want size 2x and machine washable women's plus size active run shorts.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "2x" ] }, "asin": "B06ZYJ5HL4" }, { "task_id": "ws_B00VUUR50W_11196", "instruction": "i need some xx-large polos that have buttons and are in red and black.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "red | black", "xx-large" ] }, "asin": "B00VUUR50W" }, { "task_id": "ws_B09ML1SJJ9_11197", "instruction": "i am looking for a high speed gaming desktop with core i5. also choose 64gb ram|512gb ssd|win11h.", "target_attributes": { "attributes": [ "high speed", "core i5" ], "options": [ "64gb ram|512gb ssd|win11h" ] }, "asin": "B09ML1SJJ9" }, { "task_id": "ws_B01K4XK2FU_11198", "instruction": "i want pink ambesonne shutters curtains for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "pink green" ] }, "asin": "B01K4XK2FU" }, { "task_id": "ws_B08W2NYM42_11199", "instruction": "i would like a stainless steel facial roller.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B08W2NYM42" }, { "task_id": "ws_B07KQ5FQDX_11200", "instruction": "get me a pair of neon green shorts with a drawstring closure in size small.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "neon green", "small" ] }, "asin": "B07KQ5FQDX" }, { "task_id": "ws_B084Z1G6TC_11201", "instruction": "i am looking for a wall sconce with a nickel finish. please make sure that it has a vintage brass color and is mini pendant styled.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "vintage brass", "mini pendant" ] }, "asin": "B084Z1G6TC" }, { "task_id": "ws_B09GVYBZTF_11202", "instruction": "i would like a blue hair towel like those in a salon.", "target_attributes": { "attributes": [ "hair salon" ], "options": [ "blue" ] }, "asin": "B09GVYBZTF" }, { "task_id": "ws_B07C812LHQ_11203", "instruction": "i want a rose pink maxone 1tb portable external hard drive that is plug and play.", "target_attributes": { "attributes": [ "plug play" ], "options": [ "rose pink" ] }, "asin": "B07C812LHQ" }, { "task_id": "ws_B01K7YK2RY_11204", "instruction": "buy me a pair of machine washable jeans in maria.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "maria" ] }, "asin": "B01K7YK2RY" }, { "task_id": "ws_B08LSM3T2G_11205", "instruction": "i am looking for a machine washable boxer brief with tumble dry. also choose multi color pack and 3x large size.", "target_attributes": { "attributes": [ "machine washable", "tumble dry" ], "options": [ "multi10", "3x-large" ] }, "asin": "B08LSM3T2G" }, { "task_id": "ws_B09Q6BNXVY_11206", "instruction": "i want masbird open toe sandals for women in size 7.5.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "7.5" ] }, "asin": "B09Q6BNXVY" }, { "task_id": "ws_B09P8F6J2T_11207", "instruction": "i am looking for easy to use hair rollers in pink.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "pink" ] }, "asin": "B09P8F6J2T" }, { "task_id": "ws_B08N4S3B85_11208", "instruction": "let me get some stainless steel tongue scrapers. pick a purple one.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "purple | orange | pink | yellow" ] }, "asin": "B08N4S3B85" }, { "task_id": "ws_B09QHK4DV1_11209", "instruction": "i'm looking for men's low rise boxer briefs in black color. please select xx-large size.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "black", "xx-large" ] }, "asin": "B09QHK4DV1" }, { "task_id": "ws_B09MFZY1QC_11210", "instruction": "i need to buy four pounds of individually wrapped chocolates.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "4 pound" ] }, "asin": "B09MFZY1QC" }, { "task_id": "ws_B09P5LY24M_11211", "instruction": "i am looking for a supplement for hair growth which is clinically proven. also choose bundle pack 2", "target_attributes": { "attributes": [ "clinically proven", "hair growth" ], "options": [ "bundle pack #2" ] }, "asin": "B09P5LY24M" }, { "task_id": "ws_B0829VDK65_11212", "instruction": "i would love some water resistant eye shadow that is coral colored.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "golden coral" ] }, "asin": "B0829VDK65" }, { "task_id": "ws_B08613274T_11213", "instruction": "i want a mid century console sofa table.", "target_attributes": { "attributes": [ "mid century" ], "options": [] }, "asin": "B08613274T" }, { "task_id": "ws_B07GDSVW8B_11214", "instruction": "i'd like to order some barbecue flavored veggie crisps. look for low fat, non gmo, and plant based snacks.", "target_attributes": { "attributes": [ "plant based", "low fat", "non gmo" ], "options": [ "barbecue" ] }, "asin": "B07GDSVW8B" }, { "task_id": "ws_B08DQWMM4J_11215", "instruction": "i am looking for a high quality 25mm false eyelash extensions.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "25mm" ] }, "asin": "B08DQWMM4J" }, { "task_id": "ws_B07Z51SR1J_11216", "instruction": "i want to find a natural jade face mask that helps hide dark circles. the mask needs to be crystal clear in color.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "clear crystal" ] }, "asin": "B07Z51SR1J" }, { "task_id": "ws_B09KTNVY6F_11217", "instruction": "i want a black machine washable women's round turtleneck sweater.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "black" ] }, "asin": "B09KTNVY6F" }, { "task_id": "ws_B09T3NHTTR_11218", "instruction": "i want a pink eforcase u shaped toddler toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "pink (7~12 year old)" ] }, "asin": "B09T3NHTTR" }, { "task_id": "ws_B09129MQDV_11219", "instruction": "for my living room, i need a ready to hang, 16 x 20 in, wall art poster made in athletic gold color.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "athletic gold", "16 x 20 in" ] }, "asin": "B09129MQDV" }, { "task_id": "ws_B074PTW8TX_11220", "instruction": "i want a package of individual wrapped granola bars. look for the peanut butter chocolate chip flavor.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "peanut butter chocolate chip" ] }, "asin": "B074PTW8TX" }, { "task_id": "ws_B088LKHSL9_11221", "instruction": "i want a .63 ounce pack of 12 watkins organic gourmet dip mix. i want the salsa and sour cream flavor.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "salsa & sour cream - organic", "0.63 ounce (pack of 12)" ] }, "asin": "B088LKHSL9" }, { "task_id": "ws_B073RNY6WF_11222", "instruction": "i would like a pair of pants in a size 7 that are machine washable and a tartan color.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "neutral tartan", "7" ] }, "asin": "B073RNY6WF" }, { "task_id": "ws_B0825DBY38_11223", "instruction": "i need a wall lamp that has a dark bronze nickel finish", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "dark bronze" ] }, "asin": "B0825DBY38" }, { "task_id": "ws_B09QQM4W65_11224", "instruction": "select 1 unit toothpaste for sensitive teeth whitening corrector, enamel care.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "1pc" ] }, "asin": "B09QQM4W65" }, { "task_id": "ws_B08V8XQRX5_11225", "instruction": "i would like a medium black camo tank top for my gym workouts.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "black+emcamoblack", "medium" ] }, "asin": "B08V8XQRX5" }, { "task_id": "ws_B098XF9SZD_11226", "instruction": "i want to buy some 72 inch long drapes for the living room. look for machine washable drapes.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "52x72inch" ] }, "asin": "B098XF9SZD" }, { "task_id": "ws_B08QJ9646M_11227", "instruction": "i would like a 10.63x9.05 inch pack of 5 red edge sponges that are long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "10.63x9.05 inch (pack of 5)", "red edge" ] }, "asin": "B08QJ9646M" }, { "task_id": "ws_B09T6BY7J5_11228", "instruction": "i need a men's short sleeve shirt that is coffee colored and an xx-large", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "ccoffee", "xx-large" ] }, "asin": "B09T6BY7J5" }, { "task_id": "ws_B09DYJ6K32_11229", "instruction": "i want ailun privacy glass screen protectors.", "target_attributes": { "attributes": [ "glass screen" ], "options": [] }, "asin": "B09DYJ6K32" }, { "task_id": "ws_B00BNP9KR0_11230", "instruction": "i need a cocoa mix that is non gmo and a pack of 3.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "pure cocoa", "4 fl oz (pack of 3)" ] }, "asin": "B00BNP9KR0" }, { "task_id": "ws_B09HCFGKZY_11231", "instruction": "i want to find a monocular telescope that i can use for birdwatching, and it must be easy to install.", "target_attributes": { "attributes": [ "easy install", "bird watching" ], "options": [] }, "asin": "B09HCFGKZY" }, { "task_id": "ws_B097DCRTWP_11232", "instruction": "i am looking for high quality 22 inch hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "22 inch" ] }, "asin": "B097DCRTWP" }, { "task_id": "ws_B077PHGLJN_11233", "instruction": "i need low rise jeans that are a 54w by 34l", "target_attributes": { "attributes": [ "low rise" ], "options": [ "54w x 34l" ] }, "asin": "B077PHGLJN" }, { "task_id": "ws_B000KOSF30_11234", "instruction": "i am looking for 1 pack of 9 gr light golden reddish blonde hair dye which is good and long lasting.", "target_attributes": { "attributes": [ "long lasting", "hair dye" ], "options": [ "9gr light golden reddish blonde", "pack of 1" ] }, "asin": "B000KOSF30" }, { "task_id": "ws_B00XE3UFAU_11235", "instruction": "i want peanut butter & co. cocoa powder, non-gmo.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "cocoa" ] }, "asin": "B00XE3UFAU" }, { "task_id": "ws_B07ZBF449V_11236", "instruction": "i need a futon mattress in the color a for the living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "a" ] }, "asin": "B07ZBF449V" }, { "task_id": "ws_B0811DB2R8_11237", "instruction": "i would like a pair of noise cancelling earbud headphones.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B0811DB2R8" }, { "task_id": "ws_B09B5M59X1_11238", "instruction": "i would like a social distance hug perfect gift basket.", "target_attributes": { "attributes": [ "gift basket", "perfect gift" ], "options": [ "sending a social distance hug" ] }, "asin": "B09B5M59X1" }, { "task_id": "ws_B093352T72_11239", "instruction": "i am looking for an easy to install white antler chandelier with 18 antlers and 9 lights.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "18 antlers + 9 lights" ] }, "asin": "B093352T72" }, { "task_id": "ws_B09L7TFHXB_11240", "instruction": "shop for a laptop that's intel i5 quad core, with 16 gigabytes of ram and a 512 gigabyte ssd.", "target_attributes": { "attributes": [ "core i5", "intel core", "quad core" ], "options": [ "16gb ddr4 ram, 512gb pcie ssd" ] }, "asin": "B09L7TFHXB" }, { "task_id": "ws_B08D3H2DJR_11241", "instruction": "i am looking for a pack of 3 high quality heavy duty clear toiletry bags.", "target_attributes": { "attributes": [ "heavy duty", "high quality" ], "options": [ "pack of 3" ] }, "asin": "B08D3H2DJR" }, { "task_id": "ws_B00PY2FBSK_11242", "instruction": "i would like some dining room pendant lights that are river stone color and are 20.5\" wide.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "river stone", "20.5\" wide" ] }, "asin": "B00PY2FBSK" }, { "task_id": "ws_B09NRCY45Z_11243", "instruction": "i am looking for a high quality slipper made up of quality material for a little kid, size 10.5 - 11. also choose white color.", "target_attributes": { "attributes": [ "high quality", "quality materials" ], "options": [ "white", "10.5-11 little kid" ] }, "asin": "B09NRCY45Z" }, { "task_id": "ws_B07ZNF8BP3_11244", "instruction": "i would like a 18 inch #5 easy to use hair extensions.", "target_attributes": { "attributes": [ "easy apply", "hair extensions" ], "options": [ "#6 | 14 | 26", "18 inch (pack of 1)" ] }, "asin": "B07ZNF8BP3" }, { "task_id": "ws_B08RPCGJGD_11245", "instruction": "i would like a 32 fluid ounce bottle of sweet and creamy non-gmo dairy creamer.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "sweet & creamy", "32 fl oz (pack of 6)" ] }, "asin": "B08RPCGJGD" }, { "task_id": "ws_B09QQFCTT9_11246", "instruction": "i am looking for a brighten colored toothpaste that is fluoride free and has natural ingredients.", "target_attributes": { "attributes": [ "fluoride free", "natural ingredients" ], "options": [ "brighten" ] }, "asin": "B09QQFCTT9" }, { "task_id": "ws_B09P656ZZ4_11247", "instruction": "i am looking for fluoride free teeth whitening toothpaste that has two times the repair.", "target_attributes": { "attributes": [ "fluoride free", "teeth whitening" ], "options": [ "2x tooth repair" ] }, "asin": "B09P656ZZ4" }, { "task_id": "ws_B07NKC79K5_11248", "instruction": "i am looking for a dual band ac/dc adapter for a zboost.", "target_attributes": { "attributes": [ "dual band" ], "options": [] }, "asin": "B07NKC79K5" }, { "task_id": "ws_B075QHVT8K_11249", "instruction": "i'd like to order an eight ounce bottle of maple syrup. make sure it's nut free.", "target_attributes": { "attributes": [ "nut free" ], "options": [ "8 ounce" ] }, "asin": "B075QHVT8K" }, { "task_id": "ws_B075PK2DSR_11250", "instruction": "i would like to buy a one fluid ounce bottle of face oil for my dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "1 fl oz - 30 ml." ] }, "asin": "B075PK2DSR" }, { "task_id": "ws_B09PZTG93B_11251", "instruction": "i need teeth whitening toothpaste that is orange and purple.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [ "2pcs orange+purple" ] }, "asin": "B09PZTG93B" }, { "task_id": "ws_B09H48G5P9_11252", "instruction": "i need a microphone cable with a power amplifier and 1.8\u7c73 capacity.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B09H48G5P9" }, { "task_id": "ws_B0828FCWRW_11253", "instruction": "i need a wall lamp that has a bronze finish.", "target_attributes": { "attributes": [ "bronze finish" ], "options": [] }, "asin": "B0828FCWRW" }, { "task_id": "ws_B07PHVKQT3_11254", "instruction": "i would like a 0.33 fluid ounce porcelain concealers for the dark circles under my eyes.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "porcelain", "0.33 fl oz (pack of 1)" ] }, "asin": "B07PHVKQT3" }, { "task_id": "ws_B09B4F9KPL_11255", "instruction": "i am interested in red heavy duty bed frames for a queen sized bed.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "red", "queen" ] }, "asin": "B09B4F9KPL" }, { "task_id": "ws_B07TQ56RZD_11256", "instruction": "i want some highly pigmented eye liner pencils that come in a variety of colors and are easy to apply.", "target_attributes": { "attributes": [ "highly pigmented", "easy apply" ], "options": [ "12 rainbow colors" ] }, "asin": "B07TQ56RZD" }, { "task_id": "ws_B007CQ6A72_11257", "instruction": "i want to find a navy colored non-slip rug that is oval shaped and 3 feet by 5 feet in size.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "navy", "oval", "3 ft x 5 ft" ] }, "asin": "B007CQ6A72" }, { "task_id": "ws_B001EQ5AVI_11258", "instruction": "i need this shelf stable roast beef and mashed potatoes with gravy meal. it should go in the microwave.", "target_attributes": { "attributes": [ "shelf stable" ], "options": [ "microwave meals" ] }, "asin": "B001EQ5AVI" }, { "task_id": "ws_B07TWQZM5N_11259", "instruction": "i want a blessliving red hearts plush blanket that is 50 x 60 inches.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "throw, 50 x 60 inches" ] }, "asin": "B07TWQZM5N" }, { "task_id": "ws_B08PFM7RW9_11260", "instruction": "i am looking for a black heavy duty steel framed electric standing desk that is height adjustable.", "target_attributes": { "attributes": [ "height adjustable", "heavy duty", "steel frame" ], "options": [ "black" ] }, "asin": "B08PFM7RW9" }, { "task_id": "ws_B007MYLM1I_11261", "instruction": "a sunscreen spf 50 ,anti aging fine lines and wrinkles and protection from sun", "target_attributes": { "attributes": [ "anti aging", "fine lines" ], "options": [] }, "asin": "B007MYLM1I" }, { "task_id": "ws_B00ZK6KSS8_11262", "instruction": "i want plant based ginger ale zevia zero calorie soda.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "ginger ale" ] }, "asin": "B00ZK6KSS8" }, { "task_id": "ws_B09S1BBCFP_11263", "instruction": "i need a black winter warm pair of boots that has arch support. pick a black on in size 8.", "target_attributes": { "attributes": [ "winter warm", "arch support" ], "options": [ "a03-black", "8" ] }, "asin": "B09S1BBCFP" }, { "task_id": "ws_B09NYBZX2T_11264", "instruction": "i need a long sleeved sleep set in a 4x-large in the color mt7308", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "mt7308", "4x-large" ] }, "asin": "B09NYBZX2T" }, { "task_id": "ws_B003Y5CI7Q_11265", "instruction": "i want a 12 pack ass kickin' habanero microwave popcorn bags gift set.", "target_attributes": { "attributes": [ "gift set" ], "options": [ "12 pack" ] }, "asin": "B003Y5CI7Q" }, { "task_id": "ws_B07PYQKFZV_11266", "instruction": "i want an oxidized brass capital lighting 330311xb sedona industrial metal dome pendant light.", "target_attributes": { "attributes": [ "pendant light" ], "options": [ "oxidized brass" ] }, "asin": "B07PYQKFZV" }, { "task_id": "ws_B09KH12KSK_11267", "instruction": "i want anti aging collagen cream for face.", "target_attributes": { "attributes": [ "anti aging" ], "options": [] }, "asin": "B09KH12KSK" }, { "task_id": "ws_B09FKBJ4TZ_11268", "instruction": "let me see for a medium size by innoviera brand hoodies for women, long sleeve check for halloween pumpkin", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "medium" ] }, "asin": "B09FKBJ4TZ" }, { "task_id": "ws_B01C4Z2P2Y_11269", "instruction": "i would like a pair of brown size 7 shoes with a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "1212brown", "7" ] }, "asin": "B01C4Z2P2Y" }, { "task_id": "ws_B098MQD3J4_11270", "instruction": "i need some hair drying towels that have a grid lines pattern for drying hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "electronic computer network grid lines pattern" ] }, "asin": "B098MQD3J4" }, { "task_id": "ws_B00MWKB122_11271", "instruction": "i am looking for a framed hand painted abstract oil painting to hang in my living room.", "target_attributes": { "attributes": [ "hand painted", "living room" ], "options": [] }, "asin": "B00MWKB122" }, { "task_id": "ws_B092385ZVJ_11272", "instruction": "i want to buy some meat stick snacks in spicy jalapeno venison flavor. it needs to be a 1 oz six pack.", "target_attributes": { "attributes": [ "grass fed" ], "options": [ "spicy jalapeno venison", "1oz-6 pack" ] }, "asin": "B092385ZVJ" }, { "task_id": "ws_B09NNVZCGC_11273", "instruction": "i want a high power bluetooth speakers with quality bass. pick a pink one.", "target_attributes": { "attributes": [ "high power" ], "options": [ "pink" ] }, "asin": "B09NNVZCGC" }, { "task_id": "ws_B08JVNDZ3S_11274", "instruction": "i am looking for a holiday cocoa mug which can be a perfect gift for valentines day.", "target_attributes": { "attributes": [ "valentine day", "perfect gift" ], "options": [ "holiday cocoa mug" ] }, "asin": "B08JVNDZ3S" }, { "task_id": "ws_B0776TDH1V_11275", "instruction": "i need a 2 pack of smartmouth activated mouthwash for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "2" ] }, "asin": "B0776TDH1V" }, { "task_id": "ws_B09BHMMG4S_11276", "instruction": "i want a high definition 3d video projector.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B09BHMMG4S" }, { "task_id": "ws_B09LR3RQ1M_11277", "instruction": "i want a large hoefirm women's v neck elegant velvet wrap long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "large" ] }, "asin": "B09LR3RQ1M" }, { "task_id": "ws_B074JZJ2Y4_11278", "instruction": "i want large machine washable belaroi plus size tops for women.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "large" ] }, "asin": "B074JZJ2Y4" }, { "task_id": "ws_B08K2YWJ5L_11279", "instruction": "i want a black and high quality cenglings womens cowl neck sweatshirt.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "black" ] }, "asin": "B08K2YWJ5L" }, { "task_id": "ws_B09Q3KFFTL_11280", "instruction": "i am looking for a gray shirt that is xx-large and has a slim fit.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "gray", "xx-large" ] }, "asin": "B09Q3KFFTL" }, { "task_id": "ws_B07RJRYVW8_11281", "instruction": "i am looking for a carrying case for my canon.", "target_attributes": { "attributes": [ "carrying case" ], "options": [ "for canon" ] }, "asin": "B07RJRYVW8" }, { "task_id": "ws_B08996HWW6_11282", "instruction": "i would like some hands free earbud handphones.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B08996HWW6" }, { "task_id": "ws_B06XX9X4XG_11283", "instruction": "i am looking for dining room chandelier lighting with a polished nickel finish.", "target_attributes": { "attributes": [ "nickel finish", "dining room" ], "options": [ "polished nickel" ] }, "asin": "B06XX9X4XG" }, { "task_id": "ws_B073QH76W7_11284", "instruction": "i am looking for along lasting carrying case for a speaker that comes in size 4.", "target_attributes": { "attributes": [ "long lasting", "carrying case" ], "options": [ "travel case - size 4" ] }, "asin": "B073QH76W7" }, { "task_id": "ws_B08BX7XBGN_11285", "instruction": "i would like a samsung galaxy note 20 that is fast charging and green", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "mystic green", "note 20 ultra 5g" ] }, "asin": "B08BX7XBGN" }, { "task_id": "ws_B082DVCGG2_11286", "instruction": "i need to buy a pack of shower brushes with long handles.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B082DVCGG2" }, { "task_id": "ws_B0921XCPZF_11287", "instruction": "i am looking for a white colored and high gloss tv stand for a 60 inch flat screen tv.", "target_attributes": { "attributes": [ "white item", "high gloss" ], "options": [] }, "asin": "B0921XCPZF" }, { "task_id": "ws_B08NZ75CJN_11288", "instruction": "i would like to buy a 25\" h tv stand that has a sturdy steel frame and is light rustic oak in color.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "light rustic oak", "25\" h tv stand + 18\" h coffee table" ] }, "asin": "B08NZ75CJN" }, { "task_id": "ws_B09BCSRVKM_11289", "instruction": "i want navy haenpisy mens sweat pants for gym workouts.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "navy" ] }, "asin": "B09BCSRVKM" }, { "task_id": "ws_B09MFDPHZM_11290", "instruction": "i need an easy to install shower caddy tension pole.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B09MFDPHZM" }, { "task_id": "ws_B08YWVX5LL_11291", "instruction": "i would like a blue medium sized light weight tank top.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a 1 -blue", "medium" ] }, "asin": "B08YWVX5LL" }, { "task_id": "ws_B08C742D94_11292", "instruction": "i am looking 1 pack of low carb soy free gmo free keto friendly peppermint swirl flavor meal replacement drinks", "target_attributes": { "attributes": [ "low carb", "gmo free", "soy free", "keto friendly" ], "options": [ "peppermint swirl", "1 servings (pack of 1)" ] }, "asin": "B08C742D94" }, { "task_id": "ws_B013LLVO1I_11293", "instruction": "i am looking for a gluten free, non gmo granola loaf, about 2.5 pounds made by bakery on main. prefer either cranberry almond maple or cranberry cashew. most likely in the grocery/gourmet foods aisle.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "cranberry cashew" ] }, "asin": "B013LLVO1I" }, { "task_id": "ws_B09QSVTP34_11294", "instruction": "i want a pink bpa free ice roller for face and eye.", "target_attributes": { "attributes": [ "bpa free" ], "options": [ "pink" ] }, "asin": "B09QSVTP34" }, { "task_id": "ws_B084Q7G2HN_11295", "instruction": "i need a red patio set that has a steel frame.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "red" ] }, "asin": "B084Q7G2HN" }, { "task_id": "ws_B08BDW6D4V_11296", "instruction": "i want to find 18 decorated shortbread cookies that have been individually wrapped and placed in a gift basket.", "target_attributes": { "attributes": [ "individually wrapped", "gift basket" ], "options": [ "18" ] }, "asin": "B08BDW6D4V" }, { "task_id": "ws_B083X4GW6Y_11297", "instruction": "i want to find a 1-pound box of gluten free muffin mix, and it should come in a pack of three.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1 pound (pack of 3)" ] }, "asin": "B083X4GW6Y" }, { "task_id": "ws_B08LMZFVW7_11298", "instruction": "i want some rice crispy treat made with simple ingredients. i want the kind that are individually wrapped", "target_attributes": { "attributes": [ "individually wrapped", "simple ingredients" ], "options": [] }, "asin": "B08LMZFVW7" }, { "task_id": "ws_B08L8Z6N16_11299", "instruction": "i am interested in a rose gold compact mirror.", "target_attributes": { "attributes": [ "rose gold" ], "options": [ "gold" ] }, "asin": "B08L8Z6N16" }, { "task_id": "ws_B07C55LZRJ_11300", "instruction": "look for a sampler of spicy masala black chai tea that has natural flavors and ingredients.", "target_attributes": { "attributes": [ "natural flavors", "natural ingredients" ], "options": [ "spicy masala chai black tea" ] }, "asin": "B07C55LZRJ" }, { "task_id": "ws_B0764HJ965_11301", "instruction": "miss jones baking organic buttercream frosting is my favorite ! please i want dairy free, soy free and pack of 2 with great value.", "target_attributes": { "attributes": [ "soy free", "dairy free" ], "options": [ "pack of 2" ] }, "asin": "B0764HJ965" }, { "task_id": "ws_B09CTF9RZQ_11302", "instruction": "i want rainbow white non slip ciadoon mushroom shoes.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "rainbow white" ] }, "asin": "B09CTF9RZQ" }, { "task_id": "ws_B0743MP28H_11303", "instruction": "i would like 100 grams of non gmo peppercorns.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "3.52 ounce (100 gram)" ] }, "asin": "B0743MP28H" }, { "task_id": "ws_B07H3MZQGJ_11304", "instruction": "i am looking for a clear portable makeup bag that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "clear" ] }, "asin": "B07H3MZQGJ" }, { "task_id": "ws_B08GKDQ398_11305", "instruction": "i need brown ballet shoes that have a synthetic sole and are size 5.5 for women", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "brown", "5.5 women | 5 men" ] }, "asin": "B08GKDQ398" }, { "task_id": "ws_B08S9V2LSL_11306", "instruction": "i would like a pair of size six fossil boots that are machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "fossil", "6" ] }, "asin": "B08S9V2LSL" }, { "task_id": "ws_B088643Z84_11307", "instruction": "i am looking for an easy to install brushed nickel 4 light sconce for the bathroom.", "target_attributes": { "attributes": [ "easy install", "brushed nickel" ], "options": [ "wall light-4 light" ] }, "asin": "B088643Z84" }, { "task_id": "ws_B00NPA92SI_11308", "instruction": "i want to buy an eco-friendly soy wax candle.", "target_attributes": { "attributes": [ "eco friendly", "soy wax" ], "options": [] }, "asin": "B00NPA92SI" }, { "task_id": "ws_B0979P65QG_11309", "instruction": "i want to find an office chair featuring white faux leather, a rose gold frame, and great lumbar support.", "target_attributes": { "attributes": [ "faux leather", "lumbar support" ], "options": [ "white faux leather | rose gold frame" ] }, "asin": "B0979P65QG" }, { "task_id": "ws_B07F2K1QJ4_11310", "instruction": "i would like a black 8 x wide construction shoe that has a rubber sole.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black", "8 x-wide" ] }, "asin": "B07F2K1QJ4" }, { "task_id": "ws_B07JMPN91D_11311", "instruction": "i would like a pair of gold 30w x 34l pants that i can machine wash.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "gold", "30w x 34l" ] }, "asin": "B07JMPN91D" }, { "task_id": "ws_B0929737FS_11312", "instruction": "i want a q color long lasting lipstick made with natural ingredients.", "target_attributes": { "attributes": [ "long lasting", "natural ingredients" ], "options": [ "q" ] }, "asin": "B0929737FS" }, { "task_id": "ws_B09FKJZ14L_11313", "instruction": "i need a seventeen ounce sprayer bottle with a fine mist. i want a black one.", "target_attributes": { "attributes": [ "fine mist" ], "options": [ "black", "17 ounce" ] }, "asin": "B09FKJZ14L" }, { "task_id": "ws_B07JN3DYR3_11314", "instruction": "i need closed toe flats that are blue in a 7 wide.", "target_attributes": { "attributes": [ "closed toe" ], "options": [ "medium blue", "7 wide" ] }, "asin": "B07JN3DYR3" }, { "task_id": "ws_B08ZJWV75S_11315", "instruction": "find me this old fashioned maraschino cherry cocktail syrup. pick a 12.7 fluid oz one.", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "maraschino cherry", "12.7 fl oz (pack of 1)" ] }, "asin": "B08ZJWV75S" }, { "task_id": "ws_B01GHFBKKA_11316", "instruction": "i am looking for a fluoride free toothpaste with clinically proven. also choose 3.75 ounce in size", "target_attributes": { "attributes": [ "fluoride free", "clinically proven" ], "options": [ "3.75 ounce (pack of 1)" ] }, "asin": "B01GHFBKKA" }, { "task_id": "ws_B096XX5CGP_11317", "instruction": "i need a hair silicone fiber powder applicator for hair loss, with a pump nozzle.", "target_attributes": { "attributes": [ "hair loss" ], "options": [] }, "asin": "B096XX5CGP" }, { "task_id": "ws_B07N1X6548_11318", "instruction": "i want to find a 3-pack of gluten free hot dog buns.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "3 pack" ] }, "asin": "B07N1X6548" }, { "task_id": "ws_B087V3GK1Q_11319", "instruction": "get me a long handled pink exfoliating brush.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "pink" ] }, "asin": "B087V3GK1Q" }, { "task_id": "ws_B07JJCNH26_11320", "instruction": "i want a sulfate and paraben free repairing hair oil with the coconut monoi scent.", "target_attributes": { "attributes": [ "sulfate free", "paraben free" ], "options": [ "coconut monoi" ] }, "asin": "B07JJCNH26" }, { "task_id": "ws_B01NBAXU4T_11321", "instruction": "i am looking for casual pants that are machine washable in the color loden and are size 48w by 32 l.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "loden", "48w x 32l" ] }, "asin": "B01NBAXU4T" }, { "task_id": "ws_B0877B4MKC_11322", "instruction": "i want a walr, vr bluetooth remote controller and virtual reality googles with included batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B0877B4MKC" }, { "task_id": "ws_B0846853TF_11323", "instruction": "i would like to have a youth extra small red t shirt that is made of heather cotton.", "target_attributes": { "attributes": [ "heathers cotton", "cotton heather" ], "options": [ "red", "youth", "x-small" ] }, "asin": "B0846853TF" }, { "task_id": "ws_B085Y2KVND_11324", "instruction": "i want open toe gibobby sandals for women in size 8.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "8" ] }, "asin": "B085Y2KVND" }, { "task_id": "ws_B07V9WP3JV_11325", "instruction": "i'm looking for a nut free kosher certified dried fruits basket to be given as a gift.", "target_attributes": { "attributes": [ "nut free", "kosher certified" ], "options": [] }, "asin": "B07V9WP3JV" }, { "task_id": "ws_B09HWVCGBH_11326", "instruction": "i want a loose fitting black pullover that is in a large.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "z0104black", "large" ] }, "asin": "B09HWVCGBH" }, { "task_id": "ws_B074VG3CD5_11327", "instruction": "i want to find liquid foundation makeup in the classic ivory color. it needs to last for a long time and ideally, i can get a 3-pack of containers with a single fluid ounce.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "120 classic ivory", "1 fl oz (pack of 3)" ] }, "asin": "B074VG3CD5" }, { "task_id": "ws_B09Q7V929M_11328", "instruction": "i am looking for some x-large leggings that are moisture wicking and the color #25.", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "#25", "x-large" ] }, "asin": "B09Q7V929M" }, { "task_id": "ws_B08XP9P22K_11329", "instruction": "i need some high waisted yoga shorts that are gray and in a xx-large.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "gray-a", "xx-large" ] }, "asin": "B08XP9P22K" }, { "task_id": "ws_B01LXJY21J_11330", "instruction": "i need 3 tongue cleaners for bad breath.", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "3 pc round+bag" ] }, "asin": "B01LXJY21J" }, { "task_id": "ws_B01LXJY21J_11331", "instruction": "i need a bag for a tongue cleaner for bad breath", "target_attributes": { "attributes": [ "bad breath" ], "options": [ "pipe+round+bag" ] }, "asin": "B01LXJY21J" }, { "task_id": "ws_B075FVC51L_11332", "instruction": "i need a living room throw that is smoke colored.", "target_attributes": { "attributes": [ "living room" ], "options": [ "smoke", "throw" ] }, "asin": "B075FVC51L" }, { "task_id": "ws_B09T5GRJR6_11333", "instruction": "i would like a high performance tablet.", "target_attributes": { "attributes": [ "high performance" ], "options": [] }, "asin": "B09T5GRJR6" }, { "task_id": "ws_B09Q3GXQYP_11334", "instruction": "get me an extra extra large mint green g-string. make sure it's machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "mint green", "xx-large" ] }, "asin": "B09Q3GXQYP" }, { "task_id": "ws_B00U0VVSCS_11335", "instruction": "please get me a three pack of jelly with natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ ".3 pack - 1.12 pound (pack of 2)" ] }, "asin": "B00U0VVSCS" }, { "task_id": "ws_B08KVZP9LB_11336", "instruction": "i want to find a white and pink case for my apple watch. it needs to be 40 millimeters long and be compatible with the series 6.", "target_attributes": { "attributes": [ "compatible apple", "case cover" ], "options": [ "white+pink", "40mm (for se | series 6 | 5 | 4 )" ] }, "asin": "B08KVZP9LB" }, { "task_id": "ws_B089B658NP_11337", "instruction": "i need long lasting and wireless charging buds live in mystic black color which also supports active noise cancelling.", "target_attributes": { "attributes": [ "long lasting", "noise cancelling", "wireless charging" ], "options": [ "mystic black", "buds live" ] }, "asin": "B089B658NP" }, { "task_id": "ws_B097MMHTM2_11338", "instruction": "i am looking for a pair of blue women's faux fur slippers.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "blue" ] }, "asin": "B097MMHTM2" }, { "task_id": "ws_B091PWDWRH_11339", "instruction": "i want a brown and cruelty free moira lip exposure pencil.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "014 real brown" ] }, "asin": "B091PWDWRH" }, { "task_id": "ws_B09NC73FQL_11340", "instruction": "i would like a pink shoe with a high heel for my size 8 foot.", "target_attributes": { "attributes": [ "high heel" ], "options": [ "z2 pink", "8" ] }, "asin": "B09NC73FQL" }, { "task_id": "ws_B089KRMBKR_11341", "instruction": "i am interested in a remote control that has batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B089KRMBKR" }, { "task_id": "ws_B07ZC95D4Q_11342", "instruction": "i want a gold plated and braided 4k hdmi cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "braided" ] }, "asin": "B07ZC95D4Q" }, { "task_id": "ws_B07KN62K42_11343", "instruction": "i need a pink iphone 7 flip case that has wireless charging capabilities.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "pink-iphone 7 | 8 | se2" ] }, "asin": "B07KN62K42" }, { "task_id": "ws_B081VP285Q_11344", "instruction": "i want to buy some chunky red glitter. make sure it's non-toxic and eco-friendly.", "target_attributes": { "attributes": [ "eco friendly", "non toxic" ], "options": [ "red", "chunky (1 | 40\" 0.025\" 0.6mm)" ] }, "asin": "B081VP285Q" }, { "task_id": "ws_B09R96BLLY_11345", "instruction": "i am looking for plant based, and gluten free snack chips. pick the 0.9 ounce pack of 48.", "target_attributes": { "attributes": [ "plant based", "gluten free" ], "options": [ "0.9 ounce (pack of 48)" ] }, "asin": "B09R96BLLY" }, { "task_id": "ws_B09NR7N82D_11346", "instruction": "he was wearing a burgundy polyester spandex and size large.", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [] }, "asin": "B09NR7N82D" }, { "task_id": "ws_B08LGVLS3D_11347", "instruction": "i am looking for a glass screen protector that is compatible with the 38mm apple watch case.", "target_attributes": { "attributes": [ "compatible apple", "glass screen" ], "options": [ "38 mm" ] }, "asin": "B08LGVLS3D" }, { "task_id": "ws_B09GPSGTNP_11348", "instruction": "i want black liueong women's knee high riding boots.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "black" ] }, "asin": "B09GPSGTNP" }, { "task_id": "ws_B07KQ1JFCF_11349", "instruction": "i am looking for a button closure down shirt in slim fit which is machine washable. also choose gold color and large size.", "target_attributes": { "attributes": [ "machine washable", "slim fit", "button closure" ], "options": [ "gold", "large" ] }, "asin": "B07KQ1JFCF" }, { "task_id": "ws_B07MT1WYXV_11350", "instruction": "i am interested in a youth classic fit shirt that is small and is black in color.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black", "youth", "small" ] }, "asin": "B07MT1WYXV" }, { "task_id": "ws_B01K8IZGWU_11351", "instruction": "i want small machine washable stacy adams men's sleep pants.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "small" ] }, "asin": "B01K8IZGWU" }, { "task_id": "ws_B09P885PTB_11352", "instruction": "i am looking for mens long sleeve athletic sweatshirt size xx-large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "xx-large" ] }, "asin": "B09P885PTB" }, { "task_id": "ws_B07Y832BSX_11353", "instruction": "find me a high definition waterproof case for my iphone. it could be aqua blue or black in color.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "aqua blue | black" ] }, "asin": "B07Y832BSX" }, { "task_id": "ws_B08FST7BFQ_11354", "instruction": "i would like to buy a white faux fur chair for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white", "faux fur" ] }, "asin": "B08FST7BFQ" }, { "task_id": "ws_B07SQGHJ63_11355", "instruction": "i am searching for rubber sole loafers with 7.5-8 size and royal blue color", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "royal blue", "7.5-8" ] }, "asin": "B07SQGHJ63" }, { "task_id": "ws_B07GXTFHMW_11356", "instruction": "i need to buy an art print for the living room. look for one that's ready to hang, thirty-six inches by twenty-four inches.", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "36''wx24''h" ] }, "asin": "B07GXTFHMW" }, { "task_id": "ws_B09JZ95R9H_11357", "instruction": "i want a red and easy to assemble gaming chair.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "red" ] }, "asin": "B09JZ95R9H" }, { "task_id": "ws_B01AIUQW2G_11358", "instruction": "i am looking for fresh & natural skin care shea and cocoa body butter which is best for all type of skin with fragrance free,paraben free. brown sugar | fig scent preferable in 8 ounce.", "target_attributes": { "attributes": [ "fragrance free", "paraben free", "dry skin", "sensitive skin" ], "options": [ "brown sugar | fig", "8 ounce" ] }, "asin": "B01AIUQW2G" }, { "task_id": "ws_B07SBDG3CR_11359", "instruction": "i want some low carb and keto friendly snacks. it should be almond espresso flavored and diary free.", "target_attributes": { "attributes": [ "low carb", "keto friendly", "dairy free" ], "options": [ "almond espresso (pack of 1)" ] }, "asin": "B07SBDG3CR" }, { "task_id": "ws_B08KXFNV1X_11360", "instruction": "i am looking for a sulfate free shampoo and conditioner set for natural hair. also choose mousse styler.", "target_attributes": { "attributes": [ "sulfate free", "natural hair" ], "options": [ "mousse styler" ] }, "asin": "B08KXFNV1X" }, { "task_id": "ws_B098WHZSTN_11361", "instruction": "look for a three quarter length sleeve blouse in a light weight navy blue material. i need it in extra large.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "a3 navy", "x-large" ] }, "asin": "B098WHZSTN" }, { "task_id": "ws_B09HNTHKSN_11362", "instruction": "i want black non slip ankle boots for women.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "b01-black" ] }, "asin": "B09HNTHKSN" }, { "task_id": "ws_B076MJJVCF_11363", "instruction": "i would like a easy to use soft box.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B076MJJVCF" }, { "task_id": "ws_B09HPJXC38_11364", "instruction": "i need some eco friendly window films that are 23.6 by 35.4 inch", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "23.6wx35.4l-inch x2 pcs" ] }, "asin": "B09HPJXC38" }, { "task_id": "ws_B09RHXT94Y_11365", "instruction": "i am in need of a power amplifier.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B09RHXT94Y" }, { "task_id": "ws_B00UBH4YMW_11366", "instruction": "i want to buy a dry skin treatment that has coconut oil in it.", "target_attributes": { "attributes": [ "coconut oil", "dry skin" ], "options": [] }, "asin": "B00UBH4YMW" }, { "task_id": "ws_B099NDYBF1_11367", "instruction": "i want a black mini wireless bluetooth headset.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B099NDYBF1" }, { "task_id": "ws_B0000X0W1O_11368", "instruction": "i am looking fat free kosher certrified low calo dried peaches", "target_attributes": { "attributes": [ "fat free", "kosher certified" ], "options": [] }, "asin": "B0000X0W1O" }, { "task_id": "ws_B0824CBD9P_11369", "instruction": "i want yellow machine washable batmerry summer bright decorative pillow covers.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "flowers yellow" ] }, "asin": "B0824CBD9P" }, { "task_id": "ws_B08WLWTV59_11370", "instruction": "i want to find a 15-pack box of individually wrapped rockin' straw-beary granola bars that are each 0.88 ounces.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "rockin' straw-beary", "0.88 ounce (pack of 15)" ] }, "asin": "B08WLWTV59" }, { "task_id": "ws_B09QM478Y1_11371", "instruction": "i am looking for sandals features a comfortable high heel, open-back slip on style, easy on and off.suitable for party, prom, wedding, red carpet show, street shooting, nightclub, ballroom and other special occasions. slide sandals for women in a6-black, size 8 preferable.", "target_attributes": { "attributes": [ "non slip", "high heel" ], "options": [ "a6-black", "8" ] }, "asin": "B09QM478Y1" }, { "task_id": "ws_B091XXL92R_11372", "instruction": "i need an evening gown in purple that is a size four.", "target_attributes": { "attributes": [ "unique design" ], "options": [ "dusty purple", "4" ] }, "asin": "B091XXL92R" }, { "task_id": "ws_B09D2NHQRF_11373", "instruction": "i want a pink 4 pack of kids u shaped toothbrush for sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "pink, blue, purple, yellow," ] }, "asin": "B09D2NHQRF" }, { "task_id": "ws_B09HPGGRTZ_11374", "instruction": "look for a pair of open toe ankle booties in size seven and a half. get the black ones.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "se031-black", "7.5" ] }, "asin": "B09HPGGRTZ" }, { "task_id": "ws_B09J8QT8LM_11375", "instruction": "i want toyandona 100pcs christmas cake toppers snowflake cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09J8QT8LM" }, { "task_id": "ws_B07Z7JYC1M_11376", "instruction": "i want a yongfoto 20x10ft high resolution photo studio background.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "20x10ft" ] }, "asin": "B07Z7JYC1M" }, { "task_id": "ws_B08J3VKB62_11377", "instruction": "i want a smart wi-fi bulb camera with motion detection.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B08J3VKB62" }, { "task_id": "ws_B08Z7PSKGX_11378", "instruction": "i am looking for modern gold round(vintage) and exquisite workmanship desk table mirror", "target_attributes": { "attributes": [ "exquisite workmanship" ], "options": [ "modern gold", "round(vintage)" ] }, "asin": "B08Z7PSKGX" }, { "task_id": "ws_B01MQHE1B0_11379", "instruction": "i am looking for queen size futon bed sofa with space saving , armless and color to be twill royal blue", "target_attributes": { "attributes": [ "space saving" ], "options": [ "twill royal blue" ] }, "asin": "B01MQHE1B0" }, { "task_id": "ws_B07FWBSJMJ_11380", "instruction": "i need a box of 12 desserts that are made with natural ingredients and are part of the friends collection.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "friends collection", "box of 12" ] }, "asin": "B07FWBSJMJ" }, { "task_id": "ws_B09BVDR3X1_11381", "instruction": "i am looking for d style high quality travel bottles.", "target_attributes": { "attributes": [ "high quality", "travel bottles" ], "options": [ "style d" ] }, "asin": "B09BVDR3X1" }, { "task_id": "ws_B07NY3NCTT_11382", "instruction": "i am looking for a synthetic coffee brown colored wig.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "coffee brown lighted" ] }, "asin": "B07NY3NCTT" }, { "task_id": "ws_B09KBWV5MQ_11383", "instruction": "i am looking for a high speed macaroon mobile portable router with 12gb data.", "target_attributes": { "attributes": [ "high speed", "4g lte" ], "options": [ "m1-3g-30days" ] }, "asin": "B09KBWV5MQ" }, { "task_id": "ws_B08W1P6ZSL_11384", "instruction": "i want to find a pair of black and gold women's pumps with a synesthetic sole. i wear a size 5.5.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "black | gold", "5.5" ] }, "asin": "B08W1P6ZSL" }, { "task_id": "ws_B00HM1Z0I2_11385", "instruction": "i'd like to find a chandelier-style vanity light with a brushed nickel finish. ideally, there will be three lights in the set.", "target_attributes": { "attributes": [ "nickel finish", "brushed nickel", "vanity light" ], "options": [ "brushed nickel", "three - light", "chandelier" ] }, "asin": "B00HM1Z0I2" }, { "task_id": "ws_B08PD1HYNM_11386", "instruction": "i am looking for a high capacity, white tablet with an android operating system, micro hdmi and a quad core processor.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "elegant white" ] }, "asin": "B08PD1HYNM" }, { "task_id": "ws_B08H4Q7SNS_11387", "instruction": "select for me travel bottles for shampoo paraben and bpa free. i need them to be flipflop caps. include 24 labels and one brush if possible.", "target_attributes": { "attributes": [ "paraben free", "bpa free", "travel bottles" ], "options": [] }, "asin": "B08H4Q7SNS" }, { "task_id": "ws_B07FBLG5Q2_11388", "instruction": "i am looking for mickey and minnie cupcake toppers for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B07FBLG5Q2" }, { "task_id": "ws_B09GN63TVC_11389", "instruction": "i would like a multicolored 17.7 wide by 35.4long window film for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "17.7wx35.4l-inch x2 pcs" ] }, "asin": "B09GN63TVC" }, { "task_id": "ws_B08HJSCV5Y_11390", "instruction": "i am looking for an oil and cruelty free beyond golden glow colored highlighter.", "target_attributes": { "attributes": [ "cruelty free", "oil free" ], "options": [ "030 | beyond golden glow" ] }, "asin": "B08HJSCV5Y" }, { "task_id": "ws_B078GVH2XW_11391", "instruction": "i want an ivory maybelline instant age rewind eraser dark circles treatment.", "target_attributes": { "attributes": [ "dark circles" ], "options": [ "95 cool ivory" ] }, "asin": "B078GVH2XW" }, { "task_id": "ws_B0952VJ8S9_11392", "instruction": "i want a synthetic wig that has multiple colors.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "mix color" ] }, "asin": "B0952VJ8S9" }, { "task_id": "ws_B01MZ82PKM_11393", "instruction": "i need a chrome wall lamp that is brushed nickel.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "chrome" ] }, "asin": "B01MZ82PKM" }, { "task_id": "ws_B07P1B7MLB_11394", "instruction": "i am looking for a pair of women's size 9 extra wide loafers that have synthetic soles.", "target_attributes": { "attributes": [ "synthetic sole" ], "options": [ "9 x-wide" ] }, "asin": "B07P1B7MLB" }, { "task_id": "ws_B09MRYV1HH_11395", "instruction": "i want to find a lib balm set made with natural ingredients that has long-lasting effects. the color must be 02.", "target_attributes": { "attributes": [ "long lasting", "natural ingredients" ], "options": [ "set02" ] }, "asin": "B09MRYV1HH" }, { "task_id": "ws_B08JTZ145X_11396", "instruction": "i am looking for a usb headset with built-in microphone and noise cancelling feature.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B08JTZ145X" }, { "task_id": "ws_B09QX4T789_11397", "instruction": "i need to shop for some lounge pants that can be machine washed and tumble dried. look for a size 3 x large in black.", "target_attributes": { "attributes": [ "machine wash", "tumble dry" ], "options": [ "black", "3x-large" ] }, "asin": "B09QX4T789" }, { "task_id": "ws_B08N86GWP7_11398", "instruction": "i am looking for a cruelty free foundation stick for fine lines. also choose warm brown color.", "target_attributes": { "attributes": [ "cruelty free", "fine lines" ], "options": [ "warm brown" ] }, "asin": "B08N86GWP7" }, { "task_id": "ws_B09Q3K9J4K_11399", "instruction": "i need a green henley shirts pullover mens long sleeve.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "green" ] }, "asin": "B09Q3K9J4K" }, { "task_id": "ws_B09DYB8MKH_11400", "instruction": "i want a long 001 coffee colored xx-large long jacket for women that is for daily wear.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "001 coffee", "xx-large" ] }, "asin": "B09DYB8MKH" }, { "task_id": "ws_B07PVKBGV3_11401", "instruction": "i need lactose free chocolate flavor", "target_attributes": { "attributes": [ "lactose free" ], "options": [ "chocolate" ] }, "asin": "B07PVKBGV3" }, { "task_id": "ws_B09BB2LHTT_11402", "instruction": "i want to find a waterproof case for my samsung galaxy phone that is heavy duty and easy to install.", "target_attributes": { "attributes": [ "heavy duty", "easy install" ], "options": [] }, "asin": "B09BB2LHTT" }, { "task_id": "ws_B07MR8XZJV_11403", "instruction": "i am looking for fresh baked valentine cookies i would like m&m and sugar cookies.", "target_attributes": { "attributes": [ "baked fresh", "valentine day" ], "options": [ "double peanut butter" ] }, "asin": "B07MR8XZJV" }, { "task_id": "ws_B08GC2BJPN_11404", "instruction": "i am looking for a 12 feet high speed 4k hdmi cable compatible with apple tv.", "target_attributes": { "attributes": [ "high speed", "compatible apple" ], "options": [ "4k hdmi 12ft" ] }, "asin": "B08GC2BJPN" }, { "task_id": "ws_B071G6PFDR_11405", "instruction": "i want a low carb smoked snack jerky.", "target_attributes": { "attributes": [ "low carb" ], "options": [] }, "asin": "B071G6PFDR" }, { "task_id": "ws_B01HJW75O0_11406", "instruction": "i need high speed hdmi cable male to female.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "hdmi male to female" ] }, "asin": "B01HJW75O0" }, { "task_id": "ws_B06WV8ZRPX_11407", "instruction": "i want dell optiplex 7050 tower desktop with intel core i5-7500.", "target_attributes": { "attributes": [ "core i5" ], "options": [] }, "asin": "B06WV8ZRPX" }, { "task_id": "ws_B082DSKT9G_11408", "instruction": "i need a chocolate colored hair dye.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "brussels chocolat" ] }, "asin": "B082DSKT9G" }, { "task_id": "ws_B08R6RDYJV_11409", "instruction": "i need leak proof empty travel bottles for lotion cream.", "target_attributes": { "attributes": [ "leak proof", "travel bottles" ], "options": [] }, "asin": "B08R6RDYJV" }, { "task_id": "ws_B08KGN21R3_11410", "instruction": "i want to find a teeth whitening device kit for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [] }, "asin": "B08KGN21R3" }, { "task_id": "ws_B07M9ZLMYY_11411", "instruction": "want to replace 2 packs for palm size 3 device rca universal remote control - works with symphonic vcr - remote code 0001, 1593 accurate with batteries included", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B07M9ZLMYY" }, { "task_id": "ws_B07ZPZ5BDS_11412", "instruction": "i am looking for best anti aginf formula that supports healthy skin by naturally reducing inflammation and soothing troubled skin for an overall more even skin tone! sand & sky australian emu apple dreamy glow dropswith vitamins, essential oils, and organic ingredients.", "target_attributes": { "attributes": [ "cruelty free", "hyaluronic acid" ], "options": [] }, "asin": "B07ZPZ5BDS" }, { "task_id": "ws_B09FXPMQT5_11413", "instruction": "get a long handled bath brush in blue.", "target_attributes": { "attributes": [ "long handle" ], "options": [ "blue" ] }, "asin": "B09FXPMQT5" }, { "task_id": "ws_B010C6WZEU_11414", "instruction": "i am looking for dining room chairs. choose the satin cream.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "satin cream" ] }, "asin": "B010C6WZEU" }, { "task_id": "ws_B08NZQ8F8R_11415", "instruction": "i need women's denim shorts in cotton spandex material with color jayne and size 9", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "jayne", "9" ] }, "asin": "B08NZQ8F8R" }, { "task_id": "ws_B08M5BM6ZD_11416", "instruction": "i want a navy officially licensed harry potter professor sybill shirt.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "navy" ] }, "asin": "B08M5BM6ZD" }, { "task_id": "ws_B07R1QGLQF_11417", "instruction": "i am looking for long lasting aaa batteries and a charger.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "charger + aaa batteries" ] }, "asin": "B07R1QGLQF" }, { "task_id": "ws_B08QYMTQRX_11418", "instruction": "i am looking for gluten free snacks. please choose super turmeric flavor.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "super turmeric" ] }, "asin": "B08QYMTQRX" }, { "task_id": "ws_B09SDZSKK2_11419", "instruction": "i need a9 - beige color, size 8.5 wide sandal which has a closed toe and ankle strap.", "target_attributes": { "attributes": [ "ankle strap", "closed toe" ], "options": [ "a9 - beige", "8.5 wide" ] }, "asin": "B09SDZSKK2" }, { "task_id": "ws_B082D23RLP_11420", "instruction": "i am looking for bow knot designed filler for nail art", "target_attributes": { "attributes": [ "nail art" ], "options": [ "bow knot" ] }, "asin": "B082D23RLP" }, { "task_id": "ws_B08TVDMNFK_11421", "instruction": "i need to find a heavy duty outlet wall plate cover; choose the rocker combo style.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "outlet | rocker combo" ] }, "asin": "B08TVDMNFK" }, { "task_id": "ws_B001HTIY9C_11422", "instruction": "i would like a 0.5 ounce goan shrimp curry beans that are low sodium.", "target_attributes": { "attributes": [ "low sodium" ], "options": [ "goan shrimp curry", "0.5 ounce (6-pack)" ] }, "asin": "B001HTIY9C" }, { "task_id": "ws_B08HVWJC7J_11423", "instruction": "i am looking for a jerky with low carb and high protein serving. also choose farmhouse garlic.", "target_attributes": { "attributes": [ "low carb", "protein serving" ], "options": [ "farmhouse garlic" ] }, "asin": "B08HVWJC7J" }, { "task_id": "ws_B00K375TT2_11424", "instruction": "i'd like to buy some fettuccini alfredo that's easy to prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [] }, "asin": "B00K375TT2" }, { "task_id": "ws_B09J94TS4M_11425", "instruction": "i need a portable label printer which comes with aaa batteries.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B09J94TS4M" }, { "task_id": "ws_B08C7LCRJT_11426", "instruction": "i want a xx-large classic fit weekend forecast kayaking beer drinking tank top.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "xx-large" ] }, "asin": "B08C7LCRJT" }, { "task_id": "ws_B00RZTITAC_11427", "instruction": "it was time for his food high density breakfast, so the food is very super soft.", "target_attributes": { "attributes": [ "super soft", "high density" ], "options": [] }, "asin": "B00RZTITAC" }, { "task_id": "ws_B09QSVVVH3_11428", "instruction": "i want a mattress solution california king with box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "california king" ] }, "asin": "B09QSVVVH3" }, { "task_id": "ws_B07H2R23YX_11429", "instruction": "find a 5.7 ounce pack of 4 easy prepare knorr rice side dishes in chicken fried rice flavor.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "chicken fried rice", "5.7 ounce (pack of 4)" ] }, "asin": "B07H2R23YX" }, { "task_id": "ws_B097WNMQF6_11430", "instruction": "i am looking for an easy to use dslr camera with optical zoom.", "target_attributes": { "attributes": [ "easy use", "optical zoom" ], "options": [] }, "asin": "B097WNMQF6" }, { "task_id": "ws_B09L6FSN5G_11431", "instruction": "i am looking for horse cupcake toppers for a birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B09L6FSN5G" }, { "task_id": "ws_B099WDPGQR_11432", "instruction": "i want to buy some twenty six inch square pillow covers for my living room. look for some that are super soft.", "target_attributes": { "attributes": [ "super soft", "living room" ], "options": [ "26\"*26\"" ] }, "asin": "B099WDPGQR" }, { "task_id": "ws_B07V43CTPY_11433", "instruction": "i want a large machine washable marky g short sleeve t-shirt.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "large" ] }, "asin": "B07V43CTPY" }, { "task_id": "ws_B094JVTYW5_11434", "instruction": "get me a set of pillowcases in sage green. buy the machine washable ones.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "sage green" ] }, "asin": "B094JVTYW5" }, { "task_id": "ws_B08WH7R5CG_11435", "instruction": "i need some storage space that is white and grey and also tall", "target_attributes": { "attributes": [ "storage space" ], "options": [ "white | gray", "tall" ] }, "asin": "B08WH7R5CG" }, { "task_id": "ws_B00DAOAQ1G_11436", "instruction": "my mom want x- size polyster spandex", "target_attributes": { "attributes": [ "polyester spandex" ], "options": [ "x-small" ] }, "asin": "B00DAOAQ1G" }, { "task_id": "ws_B07Q74BCVB_11437", "instruction": "i am looking for clinically proven hair treatment for a dry itchy scalp.", "target_attributes": { "attributes": [ "clinically proven", "hair treatment" ], "options": [] }, "asin": "B07Q74BCVB" }, { "task_id": "ws_B09F7RT6P3_11438", "instruction": "i need a dark tint 36w x 32l denim jeans for men which is good for everyday wear and has a relaxed fit.", "target_attributes": { "attributes": [ "everyday wear" ], "options": [ "dark tint", "36w x 32l" ] }, "asin": "B09F7RT6P3" }, { "task_id": "ws_B09QKXKTJC_11439", "instruction": "i want pink buipokd women's sports shoes with arch support.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "pink" ] }, "asin": "B09QKXKTJC" }, { "task_id": "ws_B08CBK9Z8X_11440", "instruction": "i want a solid wood sunset trading shades of sand console table.", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B08CBK9Z8X" }, { "task_id": "ws_B08VJ38NHR_11441", "instruction": "i want a easy carry easy use usb flash drive memory stick 5g data storage size :16g-3.0(1 pack)", "target_attributes": { "attributes": [ "easy carry", "easy use" ], "options": [] }, "asin": "B08VJ38NHR" }, { "task_id": "ws_B096L8RMMG_11442", "instruction": "i am looking for a six pack of 4 ounce plant based sweet potato puffs.", "target_attributes": { "attributes": [ "plant based" ], "options": [ "4 ounce (pack of 6)" ] }, "asin": "B096L8RMMG" }, { "task_id": "ws_B09S8S33TR_11443", "instruction": "i need a photo backdrop for my living room that's around sixty by forty inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "59.1\" x 39.4\"" ] }, "asin": "B09S8S33TR" }, { "task_id": "ws_B085NMCTQ5_11444", "instruction": "i am searching for women's yoga short sleeve daily wear and round neck t-shirts of small size and #3 blue color", "target_attributes": { "attributes": [ "short sleeve", "daily wear" ], "options": [ "#3 blue", "small" ] }, "asin": "B085NMCTQ5" }, { "task_id": "ws_B01DPWDWG8_11445", "instruction": "i need a two ounce package of hair dye in light to medium blonde.", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "light to medium blonde", "2 ounce (pack of 1)" ] }, "asin": "B01DPWDWG8" }, { "task_id": "ws_B07TMNWP3Z_11446", "instruction": "i am looking for a high power binocular for watching the birds .", "target_attributes": { "attributes": [ "high power", "bird watching" ], "options": [] }, "asin": "B07TMNWP3Z" }, { "task_id": "ws_B08YJK1MKG_11447", "instruction": "i'm looking for a human skeleton shower cap made for women with natural hair.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "human skeleton" ] }, "asin": "B08YJK1MKG" }, { "task_id": "ws_B074TYK1HT_11448", "instruction": "let me get an anti perspirant deodorant for sensitive skin.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [] }, "asin": "B074TYK1HT" }, { "task_id": "ws_B074TYK1HT_11449", "instruction": "i want to buy an anti antiperspirant deodorant for sensitive skin.", "target_attributes": { "attributes": [ "anti perspirant", "sensitive skin" ], "options": [] }, "asin": "B074TYK1HT" }, { "task_id": "ws_B09GQJY8SG_11450", "instruction": "i am looking a tempared glass anti scratch screen protector for i phone 13 pro", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B09GQJY8SG" }, { "task_id": "ws_B079QGBL5H_11451", "instruction": "i need steel gray color water resistant bag", "target_attributes": { "attributes": [ "water resistant" ], "options": [] }, "asin": "B079QGBL5H" }, { "task_id": "ws_B09PYFGHJH_11452", "instruction": "i want mivofun 11pcs cute dinosaur cake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09PYFGHJH" }, { "task_id": "ws_B082LNYDJJ_11453", "instruction": "i am looking for goodness of health cinnamon flavored toffee covered cashews by it's delish an energizing and delicious snack for those reducing sodium in their diet. almonds flavor , 3 pound size preferable.", "target_attributes": { "attributes": [ "non dairy", "kosher certified" ], "options": [ "almonds", "3 pound" ] }, "asin": "B082LNYDJJ" }, { "task_id": "ws_B082LNYDJJ_11454", "instruction": "my mom like non dairy pecans flavor", "target_attributes": { "attributes": [ "non dairy" ], "options": [ "pecans" ] }, "asin": "B082LNYDJJ" }, { "task_id": "ws_B09G6QSJWR_11455", "instruction": "i would like a gold birthday party cupcake topper", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "gold 15" ] }, "asin": "B09G6QSJWR" }, { "task_id": "ws_B09C3ZCVJS_11456", "instruction": "i am looking for a office leather chair useful for heavy duty with synchro-tilt mechanism", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B09C3ZCVJS" }, { "task_id": "ws_B07D58V7Z2_11457", "instruction": "i would like a tteal green hrow pillow cover that is super soft and 16\" by 16\"", "target_attributes": { "attributes": [ "super soft" ], "options": [ "teal green", "16\"x16\"" ] }, "asin": "B07D58V7Z2" }, { "task_id": "ws_B07TJDGGND_11458", "instruction": "i need some facial scrub for sensitive skin. it should be oil free. get the three pack.", "target_attributes": { "attributes": [ "oil free", "sensitive skin" ], "options": [ "4.2 fl oz (pack of 3)", "facial scrub + body wash" ] }, "asin": "B07TJDGGND" }, { "task_id": "ws_B09R9YS1GX_11459", "instruction": "i need height adjustable home office desk chair with metal legs in ivory color.", "target_attributes": { "attributes": [ "height adjustable", "metal legs" ], "options": [ "ivory" ] }, "asin": "B09R9YS1GX" }, { "task_id": "ws_B09P61NVL1_11460", "instruction": "i want to find an orange color corrector for my teeth, which are very sensitive.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B09P61NVL1" }, { "task_id": "ws_B07SL9Y1G7_11461", "instruction": "i want to find a wall-mounted security camera that runs on aaa batteries.", "target_attributes": { "attributes": [ "wall mounted", "aaa batteries" ], "options": [] }, "asin": "B07SL9Y1G7" }, { "task_id": "ws_B081TV68PN_11462", "instruction": "i need a pair of stretch cotton spandex pants in size 40w x 32l. they should be machine washable and in a stone color.", "target_attributes": { "attributes": [ "machine wash", "cotton spandex" ], "options": [ "stone", "40w x 32l" ] }, "asin": "B081TV68PN" }, { "task_id": "ws_B081TGYYFC_11463", "instruction": "buy me a sixteen pack of sugar free spicy nacho keto chips.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "spicy nacho", "1.13 ounce (pack of 16)" ] }, "asin": "B081TGYYFC" }, { "task_id": "ws_B093HFR3HG_11464", "instruction": "i am looking for a pink case with a kickstand and wireless charging for my samsung galaxy s21 ultra.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "pink" ] }, "asin": "B093HFR3HG" }, { "task_id": "ws_B085686P5N_11465", "instruction": "i want a juniper and fully assembled rivet decatur modern upholstered dining chair.", "target_attributes": { "attributes": [ "fully assembled" ], "options": [ "juniper" ] }, "asin": "B085686P5N" }, { "task_id": "ws_B08CQY2SP4_11466", "instruction": "i would like a pink classic fit shirt for men that is a size 4t.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "pink", "men", "4t" ] }, "asin": "B08CQY2SP4" }, { "task_id": "ws_B000F8EURQ_11467", "instruction": "i am looking for jolly rancher candies that are individually wrapped, but in a fat free version.", "target_attributes": { "attributes": [ "individually wrapped", "fat free" ], "options": [] }, "asin": "B000F8EURQ" }, { "task_id": "ws_B08TVTL77Y_11468", "instruction": "get a heavy duty double toggle wall plate cover.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "double toggle" ] }, "asin": "B08TVTL77Y" }, { "task_id": "ws_B08D68PBS9_11469", "instruction": "i am looking for a 5-shelf industrial corner, a-shaped display storage rack shelf in grey finish. it needs to be space saving, 5-tier, and have storage space. made by homyshopy.", "target_attributes": { "attributes": [ "space saving", "storage space" ], "options": [ "5-tier" ] }, "asin": "B08D68PBS9" }, { "task_id": "ws_B09MTV2CSQ_11470", "instruction": "i'm looking for hd electronics it so useful and long lasting.", "target_attributes": { "attributes": [ "1080p hd", "long lasting" ], "options": [ "9 inch-th102" ] }, "asin": "B09MTV2CSQ" }, { "task_id": "ws_B09MZH121Q_11471", "instruction": "find an extra large blue long sleeve sweatshirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue", "x-large" ] }, "asin": "B09MZH121Q" }, { "task_id": "ws_B005A2GHCS_11472", "instruction": "i want red lucky brand women's low rise jeans.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "scarlet red step" ] }, "asin": "B005A2GHCS" }, { "task_id": "ws_B09SH5BNDP_11473", "instruction": "i want to buy a high performance quad core streaming media player.", "target_attributes": { "attributes": [ "high performance", "quad core" ], "options": [] }, "asin": "B09SH5BNDP" }, { "task_id": "ws_B0866B2Q2N_11474", "instruction": "i need a pair of slip-resistant work boots in a size 8. buy them in black.", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "black", "8" ] }, "asin": "B0866B2Q2N" }, { "task_id": "ws_B0866B2Q2N_11475", "instruction": "this brand thorogood infinity fd series 6\u201d is gorgeous ! i want by one with: waterproof, slip resistant, composite safety toe work boots for men in a butterscotch collor and size 13", "target_attributes": { "attributes": [ "slip resistant" ], "options": [ "13" ] }, "asin": "B0866B2Q2N" }, { "task_id": "ws_B09Q8PPBXJ_11476", "instruction": "i am looking for butt lift high waist tummy control breathable athletic yoga pants affordable and accessible, perfect for fitness enthusiasts and everyday athleisure. jaqqra legging that are made from the highest quality fabricss for women which are designed to remove moisture from your body, providing maximum comfort. pretty squat proof! breathable, tight fit, strong compression, quick drying, moisture wicking, stretchy.super elastic fabrics are perfect for your body,very comfortable and soft! in yellow sizw 3x large preferable.", "target_attributes": { "attributes": [ "tummy control", "high waist", "gym workout" ], "options": [ "yellow", "3x-large" ] }, "asin": "B09Q8PPBXJ" }, { "task_id": "ws_B09B3RRJDB_11477", "instruction": "i want to find multi-colored extra-small sweatpants that i can wear daily.", "target_attributes": { "attributes": [ "daily wear" ], "options": [ "multicolored", "x-small" ] }, "asin": "B09B3RRJDB" }, { "task_id": "ws_B096W49HCJ_11478", "instruction": "i need a pair of pink loafers for teen girls. they should be size eight.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "pink", "8" ] }, "asin": "B096W49HCJ" }, { "task_id": "ws_B097PMFHPF_11479", "instruction": "i'm looking for white hair extensions made with synthetic hair.", "target_attributes": { "attributes": [ "hair extensions", "synthetic hair" ], "options": [ "white" ] }, "asin": "B097PMFHPF" }, { "task_id": "ws_B09Q5LY988_11480", "instruction": "i want a red office chair ergonomic gaming chair with lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red" ] }, "asin": "B09Q5LY988" }, { "task_id": "ws_B092VSGJVR_11481", "instruction": "i am looking for a pair of women's ultra soft arch support sandals in a size 9.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "9" ] }, "asin": "B092VSGJVR" }, { "task_id": "ws_B09PL8RY44_11482", "instruction": "i need black non slip zieglen sandals for women.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "p1 black" ] }, "asin": "B09PL8RY44" }, { "task_id": "ws_B097SPSG33_11483", "instruction": "i need a 3 pack pendant light fixture with glass shade and white finish. it should be 45.7 inches in size.", "target_attributes": { "attributes": [ "white finish", "glass shade", "light fixture" ], "options": [ "3 pack,45.7in" ] }, "asin": "B097SPSG33" }, { "task_id": "ws_B01AH0DMFM_11484", "instruction": "i want charcoal and comfortable fit skechers performance women's go walk shoes.", "target_attributes": { "attributes": [ "comfortable fit" ], "options": [ "charcoal" ] }, "asin": "B01AH0DMFM" }, { "task_id": "ws_B09HQTJZ7T_11485", "instruction": "i want hand painted jmkj sculptures.", "target_attributes": { "attributes": [ "hand painted" ], "options": [] }, "asin": "B09HQTJZ7T" }, { "task_id": "ws_B07TT5BCRW_11486", "instruction": "order a high waisted skirt in a size small. get the plantation colored one.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "plantation", "x-small" ] }, "asin": "B07TT5BCRW" }, { "task_id": "ws_B08X4WFLQF_11487", "instruction": "i would like a pack of vermicelli rice sticks that are easy to make.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [ "rice sticks vermicelli" ] }, "asin": "B08X4WFLQF" }, { "task_id": "ws_B07211VXZL_11488", "instruction": "i need a cellphone car adapter with output protection.", "target_attributes": { "attributes": [ "output protection" ], "options": [] }, "asin": "B07211VXZL" }, { "task_id": "ws_B092VJKR3M_11489", "instruction": "i need to buy a virtual reality headset with a carrying case.", "target_attributes": { "attributes": [ "carrying case" ], "options": [] }, "asin": "B092VJKR3M" }, { "task_id": "ws_B01C9O8IGM_11490", "instruction": "i am looking for teeth whitening stirps that come with a shade guide.", "target_attributes": { "attributes": [ "teeth whitening" ], "options": [] }, "asin": "B01C9O8IGM" }, { "task_id": "ws_B099KQ6F2D_11491", "instruction": "i am looking for women's cotton spandex booty shorts with medium size and color should be black bae white", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "black bae white", "medium" ] }, "asin": "B099KQ6F2D" }, { "task_id": "ws_B07CTK2ZGL_11492", "instruction": "i want wall light 1 light bathroom vanity lighting.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "1 light" ] }, "asin": "B07CTK2ZGL" }, { "task_id": "ws_B08K89ZK4Q_11493", "instruction": "i need some pants with an elastic waist. they should be black and in size three x large.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "b-black.", "3x-large" ] }, "asin": "B08K89ZK4Q" }, { "task_id": "ws_B093FGJ9RL_11494", "instruction": "i am looking for a steel framed brown 5 tier bookcase.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "brown-a" ] }, "asin": "B093FGJ9RL" }, { "task_id": "ws_B07T86JC7C_11495", "instruction": "i want black chloe women's arch support clogs.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black" ] }, "asin": "B07T86JC7C" }, { "task_id": "ws_B0993R8ZHB_11496", "instruction": "i want a pack of low fat gourmet kitchen cooked shrimp.", "target_attributes": { "attributes": [ "low fat" ], "options": [ "1 pack" ] }, "asin": "B0993R8ZHB" }, { "task_id": "ws_B0033YLK7M_11497", "instruction": "i want to find a doctor's stool with cinder-colored fabric. it needs to be 18.5 inches to 24 inches tall and be height adjustable.", "target_attributes": { "attributes": [ "height adjustable" ], "options": [ "cinder fabric", "desk height 18.5\"- 24\"" ] }, "asin": "B0033YLK7M" }, { "task_id": "ws_B09MB3CRYB_11498", "instruction": "i want a easy clean water resistant hair cutting salon kit for professnol hair salon color:style 2", "target_attributes": { "attributes": [ "water resistant", "easy clean", "hair cutting", "hair salon" ], "options": [ "style 2" ] }, "asin": "B09MB3CRYB" }, { "task_id": "ws_B09DKVZSVK_11499", "instruction": "i need a case for my 40 millimeter samsung galaxy watch 4. look for one with a tempered glass screen in rose gold.", "target_attributes": { "attributes": [ "glass screen", "tempered glass" ], "options": [ "pink+rose gold+clear", "40mm" ] }, "asin": "B09DKVZSVK" }, { "task_id": "ws_B079TR2JHT_11500", "instruction": "men's eau de parfum long lasting for daily use", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B079TR2JHT" }, { "task_id": "ws_B091KTBPG4_11501", "instruction": "i am looking for a rose gold colored nail polish storage case.", "target_attributes": { "attributes": [ "storage case", "nail polish" ], "options": [ "rose gold" ] }, "asin": "B091KTBPG4" }, { "task_id": "ws_B08LK9WRFQ_11502", "instruction": "i need to buy a ready to hang art print that's sixteen by twenty-four inches. look for one that has women and palm leaves on it.", "target_attributes": { "attributes": [ "ready hang" ], "options": [ "women face with palm leaves", "16\"x24\"x1" ] }, "asin": "B08LK9WRFQ" }, { "task_id": "ws_B082HJWXKX_11503", "instruction": "i need a space saving office desk that is blue and 90 by 30 cm", "target_attributes": { "attributes": [ "space saving" ], "options": [ "blue" ] }, "asin": "B082HJWXKX" }, { "task_id": "ws_B08GS38WN1_11504", "instruction": "i want blue striped and wide leg elsofer women's pajama lounge pants.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "blue striped" ] }, "asin": "B08GS38WN1" }, { "task_id": "ws_B079PLY9B7_11505", "instruction": "i am looking for mj korean cosmetic full face collagen red ginseng essence pack for sensitive skin in color: hyaluronic acid and size: pack of 14", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "hyaluronic acid", "pack of 14" ] }, "asin": "B079PLY9B7" }, { "task_id": "ws_B075DM81YY_11506", "instruction": "i would like a long lasting animal pattern storage bench that is easy to clean.", "target_attributes": { "attributes": [ "long lasting", "easy clean" ], "options": [ "animal pattern" ] }, "asin": "B075DM81YY" }, { "task_id": "ws_B01N297Q3Y_11507", "instruction": "i saw the women's shoe in a store and i need you to find it on amazon in brown and size 7, with rubber sole. the brand is jambu and the model is mule.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "brown", "7" ] }, "asin": "B01N297Q3Y" }, { "task_id": "ws_B07GPBX5Z1_11508", "instruction": "i want to buy some tummy-control shorts in extra small.", "target_attributes": { "attributes": [ "tummy control" ], "options": [ "x-small" ] }, "asin": "B07GPBX5Z1" }, { "task_id": "ws_B00BBUSDW0_11509", "instruction": "i need a vanity light that is a satin nickel color.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "satin nickel" ] }, "asin": "B00BBUSDW0" }, { "task_id": "ws_B08R8CBM2D_11510", "instruction": "i want a hands free hlongg bluetooth clock speaker.", "target_attributes": { "attributes": [ "hands free" ], "options": [] }, "asin": "B08R8CBM2D" }, { "task_id": "ws_B09D3HK2T5_11511", "instruction": "i need to buy a smartwatch band for my apple watch. look for one in rose gold stainless steel mesh.", "target_attributes": { "attributes": [ "compatible apple", "stainless steel" ], "options": [ "mesh-rosegold", "42mm | 44mm | 45mm" ] }, "asin": "B09D3HK2T5" }, { "task_id": "ws_B09NC39NKL_11512", "instruction": "i want samsung galaxy s22 glass screen protectors.", "target_attributes": { "attributes": [ "glass screen" ], "options": [] }, "asin": "B09NC39NKL" }, { "task_id": "ws_B09MTH718B_11513", "instruction": "i need a solid wood computer desk for living room which is easy to install and clean. i want color choice 1 and style 2.", "target_attributes": { "attributes": [ "easy install", "easy clean", "solid wood", "living room" ], "options": [ "choice 1", "style 2" ] }, "asin": "B09MTH718B" }, { "task_id": "ws_B078Y8DS18_11514", "instruction": "look for some high quality stainless steel hair cutting shears. they should be seven inches and made out of stainless steel.", "target_attributes": { "attributes": [ "high quality", "stainless steel", "hair cutting" ], "options": [ "matt black", "7.0 inch" ] }, "asin": "B078Y8DS18" }, { "task_id": "ws_B099SBXBJH_11515", "instruction": "i need a large niantie mens short sleeve t shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B099SBXBJH" }, { "task_id": "ws_B08RTGLYGM_11516", "instruction": "i need a double dark chocolate bar which is high protein and ready to eat.", "target_attributes": { "attributes": [ "ready eat", "high protein" ], "options": [ "double dark chocolate" ] }, "asin": "B08RTGLYGM" }, { "task_id": "ws_B08PVWCXK8_11517", "instruction": "i am looking for a 50ml leak proof refillable glass spray bottle.", "target_attributes": { "attributes": [ "leak proof" ], "options": [ "50ml" ] }, "asin": "B08PVWCXK8" }, { "task_id": "ws_B08QM88LCF_11518", "instruction": "i want black rockport men's toe sneaker with lace closure.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "black" ] }, "asin": "B08QM88LCF" }, { "task_id": "ws_B08RDS6J17_11519", "instruction": "i need an easy to install 2pcs camera with 6pcs door alarm.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "6pcs-alarm+2pcs-camera" ] }, "asin": "B08RDS6J17" }, { "task_id": "ws_B09DYVLH72_11520", "instruction": "i would like a blue long sleeved sweatshirt that is the size 4x-large.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "a01-blue", "4x-large" ] }, "asin": "B09DYVLH72" }, { "task_id": "ws_B07GK93FTM_11521", "instruction": "i would like two variety packs of non gmo trail mix", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "variety", "6 ounce x 2 packs" ] }, "asin": "B07GK93FTM" }, { "task_id": "ws_B00EN3JV96_11522", "instruction": "i need to buy a three ounce bottle of long lasting perfume in the sexy amber scent.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "sexy amber", "3.4 ounce" ] }, "asin": "B00EN3JV96" }, { "task_id": "ws_B07ZHGQQZ6_11523", "instruction": "i would like a mint green brush cleaner that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "mint green" ] }, "asin": "B07ZHGQQZ6" }, { "task_id": "ws_B09PFW75M2_11524", "instruction": "i would like a set of pendant lights for the living room.", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [] }, "asin": "B09PFW75M2" }, { "task_id": "ws_B07DXP1XRB_11525", "instruction": "i would like a set of fast charging noise cancelling headphones.", "target_attributes": { "attributes": [ "noise cancelling", "fast charging" ], "options": [] }, "asin": "B07DXP1XRB" }, { "task_id": "ws_B01IM9I5L6_11526", "instruction": "i want to find a pair of size 5, coral-colored flip-flops with rubber soles that i can wear to yoga.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "coral", "5" ] }, "asin": "B01IM9I5L6" }, { "task_id": "ws_B096W7H2ZD_11527", "instruction": "i want a bronze gold highlighter & luminizer made with natural ingredients for fine lines which is easy to apply, clean & carry.", "target_attributes": { "attributes": [ "easy apply", "easy carry", "easy clean", "natural ingredients", "fine lines" ], "options": [ "bronze gold" ] }, "asin": "B096W7H2ZD" }, { "task_id": "ws_B09K81GRGT_11528", "instruction": "i am interested in birthday party cupcake toppers that are multicolor.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "multicolor" ] }, "asin": "B09K81GRGT" }, { "task_id": "ws_B09PVH3W92_11529", "instruction": "i want black women's open toe ring sandals.", "target_attributes": { "attributes": [ "open toe" ], "options": [ "black" ] }, "asin": "B09PVH3W92" }, { "task_id": "ws_B09T38ZZGL_11530", "instruction": "i need a new tv box that is made by android that come with the batteries included.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B09T38ZZGL" }, { "task_id": "ws_B09MCYGBRZ_11531", "instruction": "i want to get some red cupcake toppers that i can use for a birthday party.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "style a-red" ] }, "asin": "B09MCYGBRZ" }, { "task_id": "ws_B09QMJ9PN2_11532", "instruction": "i need high quality pillow covers in color a-8 and it should be fade resistant.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "a-8" ] }, "asin": "B09QMJ9PN2" }, { "task_id": "ws_B004SE22H8_11533", "instruction": "i want fruit of the loom men's low-rise brief in size 38-40.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "38-40" ] }, "asin": "B004SE22H8" }, { "task_id": "ws_B093S184XH_11534", "instruction": "i am looking for easy to apply nail mirror powder.", "target_attributes": { "attributes": [ "easy apply" ], "options": [] }, "asin": "B093S184XH" }, { "task_id": "ws_B09GV9RWXX_11535", "instruction": "i am looking for solar power bank with 10w wireless charger, dual usb, fast charging and waterproof", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09GV9RWXX" }, { "task_id": "ws_B08SHKMP5B_11536", "instruction": "find me a non alcoholic and zero sugar mocktail.", "target_attributes": { "attributes": [ "non alcoholic", "zero sugar" ], "options": [] }, "asin": "B08SHKMP5B" }, { "task_id": "ws_B07KJFN8RM_11537", "instruction": "i want some cuticle pushers that are stainless steel.", "target_attributes": { "attributes": [ "stainless steel" ], "options": [] }, "asin": "B07KJFN8RM" }, { "task_id": "ws_B09SPN32XS_11538", "instruction": "i want a cd player portable boombox with stereo sound.", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B09SPN32XS" }, { "task_id": "ws_B0916M7Z9C_11539", "instruction": "i am looking for hair and scalp serum for natural hair that is made with natural ingredients. i also would prefer the peppermint and aloe fragrance.", "target_attributes": { "attributes": [ "natural ingredients", "natural hair" ], "options": [ "peppermint & aloe" ] }, "asin": "B0916M7Z9C" }, { "task_id": "ws_B01GJC4WRO_11540", "instruction": "i am looking for 2 pieces of 6ft long fast charging micro usb cable", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "2", "6.6ft" ] }, "asin": "B01GJC4WRO" }, { "task_id": "ws_B0747LWDCK_11541", "instruction": "i would like some organic old fashioned oatmeal.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "organic standard, old fashioned" ] }, "asin": "B0747LWDCK" }, { "task_id": "ws_B07PV723CF_11542", "instruction": "i want a 2 pack of dseap coat rack wall mount.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "2" ] }, "asin": "B07PV723CF" }, { "task_id": "ws_B0050XG6QE_11543", "instruction": "i like design house with white color", "target_attributes": { "attributes": [ "design house" ], "options": [] }, "asin": "B0050XG6QE" }, { "task_id": "ws_B09HNCG2LQ_11544", "instruction": "i would like a clinically proven deodorant that is lavender sage", "target_attributes": { "attributes": [ "clinically proven" ], "options": [ "lavender sage, sweet lily, jasmine rose" ] }, "asin": "B09HNCG2LQ" }, { "task_id": "ws_B009NCWNQ0_11545", "instruction": "i want to find mango-flavored lip balm that is paraben free and contains some sun protection.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "mango" ] }, "asin": "B009NCWNQ0" }, { "task_id": "ws_B09PQJ17S7_11546", "instruction": "i'm looking for short sleeve fitting clot. it can easy to machine wash.", "target_attributes": { "attributes": [ "wide leg", "machine wash", "elastic waist", "short sleeve" ], "options": [ "01 white" ] }, "asin": "B09PQJ17S7" }, { "task_id": "ws_B09QQKW86M_11547", "instruction": "i want small and high waisted comfortable underwear 831 new men u-convex.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "small" ] }, "asin": "B09QQKW86M" }, { "task_id": "ws_B07C5BQG5J_11548", "instruction": "i need to buy a flat-packed ottoman. look for one that's white.", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "white" ] }, "asin": "B07C5BQG5J" }, { "task_id": "ws_B073YLPR26_11549", "instruction": "i am looking for an intel quad core i5-6500 mini pc with windows 10 pro.", "target_attributes": { "attributes": [ "quad core", "intel core" ], "options": [] }, "asin": "B073YLPR26" }, { "task_id": "ws_B07N4FGLPJ_11550", "instruction": "look for a brushed aluminum wall sconce with a glass shade.", "target_attributes": { "attributes": [ "glass shade" ], "options": [ "black | brushed aluminum" ] }, "asin": "B07N4FGLPJ" }, { "task_id": "ws_B09QKQSLBT_11551", "instruction": "i want yellow wide leg eaktool sexy women shorts.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "yellow" ] }, "asin": "B09QKQSLBT" }, { "task_id": "ws_B09NVGCG3K_11552", "instruction": "i am looking a spider man cupcake topper party supply for my pet birthday party", "target_attributes": { "attributes": [ "birthday cake", "party supplies", "birthday party" ], "options": [] }, "asin": "B09NVGCG3K" }, { "task_id": "ws_B09P4Z74XN_11553", "instruction": "i am looking for a lavender foot peel off mask which works on dry skin and it is easy to use.", "target_attributes": { "attributes": [ "easy use", "dead skin" ], "options": [ "lavender" ] }, "asin": "B09P4Z74XN" }, { "task_id": "ws_B098JZ8Q61_11554", "instruction": "shop for teeth whitening strips. look for some that taste like peppermint and are appropriate for sensitive teeth.", "target_attributes": { "attributes": [ "teeth whitening", "sensitive teeth" ], "options": [ "peppermint" ] }, "asin": "B098JZ8Q61" }, { "task_id": "ws_B09C7SHQH2_11555", "instruction": "i need an intel quad core tablet which is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "intel core", "quad core" ], "options": [] }, "asin": "B09C7SHQH2" }, { "task_id": "ws_B09G2MCRX4_11556", "instruction": "find me twin sized bunk beds made of solid wood. it should be espresso colored.", "target_attributes": { "attributes": [ "twin size", "solid wood" ], "options": [ "espresso" ] }, "asin": "B09G2MCRX4" }, { "task_id": "ws_B09T78TGBM_11557", "instruction": "i am looking for a high speed 12v ac/dc adapter with output protection.", "target_attributes": { "attributes": [ "output protection", "high speed" ], "options": [] }, "asin": "B09T78TGBM" }, { "task_id": "ws_B07MXMZD94_11558", "instruction": "look for the easy chef sampler of green bean snacks. i want the twelve piece non-gmo assortment.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "easy chef sampler", "12 piece assortment" ] }, "asin": "B07MXMZD94" }, { "task_id": "ws_B084KYR68F_11559", "instruction": "i want a trupedic x mozaic casual queen size futon mattress.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "casual" ] }, "asin": "B084KYR68F" }, { "task_id": "ws_B07L2L64XL_11560", "instruction": "i need a fluoride free toothpaste for fresh breath. i will need a pack of 4 in 3.5 ounce size.", "target_attributes": { "attributes": [ "fluoride free", "fresh breath" ], "options": [ "3.5 ounce (pack of 4)" ] }, "asin": "B07L2L64XL" }, { "task_id": "ws_B09QSR47T4_11561", "instruction": "i am looking for a 52 inch by 45 inch green window panel.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09QSR47T4" }, { "task_id": "ws_B08S7MD3HY_11562", "instruction": "i want to find a printed backdrop that is 5 by 7 feet for a digital photography session.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 06", "5x7 ft" ] }, "asin": "B08S7MD3HY" }, { "task_id": "ws_B082X5XQP4_11563", "instruction": "i want a 10 foot gold plated jolgoo 1/4\" trs to dual rca insert cable.", "target_attributes": { "attributes": [ "gold plated" ], "options": [ "10 feet" ] }, "asin": "B082X5XQP4" }, { "task_id": "ws_B08G143L51_11564", "instruction": "i want to find vanity light fixtures that i can put in my bathroom.", "target_attributes": { "attributes": [ "vanity light", "light fixture" ], "options": [] }, "asin": "B08G143L51" }, { "task_id": "ws_B00AUOJH8M_11565", "instruction": "my father mostly use grey color intel core laptop only", "target_attributes": { "attributes": [ "intel core" ], "options": [] }, "asin": "B00AUOJH8M" }, { "task_id": "ws_B00S1L6590_11566", "instruction": "i need a detangler hair brush that stimulates hair growth. choose the purple one.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "purple" ] }, "asin": "B00S1L6590" }, { "task_id": "ws_B08WWV6B8G_11567", "instruction": "i need a glossy electrical outlet cover.", "target_attributes": { "attributes": [ "high gloss" ], "options": [ "outlet | rocker combo" ] }, "asin": "B08WWV6B8G" }, { "task_id": "ws_B08TJ1VF6P_11568", "instruction": "i am looking for a super soft throw blanket that is at least 50 by 60 inches in size.", "target_attributes": { "attributes": [ "super soft" ], "options": [ "50 x 60 inches" ] }, "asin": "B08TJ1VF6P" }, { "task_id": "ws_B075RPQLCT_11569", "instruction": "i am looking for low fat high protein salted toffee pretzel protein bars.", "target_attributes": { "attributes": [ "low fat", "high protein" ], "options": [ "salted toffee pretzel", "3 boxes (save 5%)" ] }, "asin": "B075RPQLCT" }, { "task_id": "ws_B09GLW6K81_11570", "instruction": "show me travel bottles with bpa free, non toxic, high quality (yellow) please do it quickly.", "target_attributes": { "attributes": [ "bpa free", "non toxic" ], "options": [ "yellow" ] }, "asin": "B09GLW6K81" }, { "task_id": "ws_B09LSQX8MH_11571", "instruction": "i am interested in headphones that are noise cancelling.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [] }, "asin": "B09LSQX8MH" }, { "task_id": "ws_B07PGQQH3S_11572", "instruction": "i need a pack of 24 individually wrapped ready to eat strawberry crepes.", "target_attributes": { "attributes": [ "individually wrapped", "ready eat" ], "options": [ "strawberry", "1.13 ounce (pack of 24)" ] }, "asin": "B07PGQQH3S" }, { "task_id": "ws_B084GCLMNR_11573", "instruction": "get me some hydrating hyaluronic acid moisturizer for sensitive skin.", "target_attributes": { "attributes": [ "hyaluronic acid", "sensitive skin" ], "options": [ "peptaronic (hydrating)" ] }, "asin": "B084GCLMNR" }, { "task_id": "ws_B01LNKHDAK_11574", "instruction": "i am looking for a individually wrapped granola bar with high fructose. also choose 3-flavor variety pack", "target_attributes": { "attributes": [ "individually wrapped", "high fructose" ], "options": [ "3-flavor variety pack" ] }, "asin": "B01LNKHDAK" }, { "task_id": "ws_B09QHTZX6Z_11575", "instruction": "i would like a pink electric tootbrush that is long lasting.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "pink cow" ] }, "asin": "B09QHTZX6Z" }, { "task_id": "ws_B00KUPS3JU_11576", "instruction": "i want to buy a mid-back drafting chair that has an adjustable height and lumbar support. look for a blue one.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "blue mesh | white frame", "mid back drafting chair" ] }, "asin": "B00KUPS3JU" }, { "task_id": "ws_B07Y2B737Q_11577", "instruction": "buy me the toothpaste with hempseed and coconut oil.", "target_attributes": { "attributes": [ "seed oil", "coconut oil" ], "options": [] }, "asin": "B07Y2B737Q" }, { "task_id": "ws_B09GNBPCRL_11578", "instruction": "i need some hair quality hair clippers", "target_attributes": { "attributes": [ "high quality" ], "options": [ "gold with box" ] }, "asin": "B09GNBPCRL" }, { "task_id": "ws_B00XV44F44_11579", "instruction": "i am looking for a three pack of lactose free milk", "target_attributes": { "attributes": [ "lactose free" ], "options": [ "11.25 ounce (pack of 3)" ] }, "asin": "B00XV44F44" }, { "task_id": "ws_B01FNQX11A_11580", "instruction": "i need a 32 ct variety pack of cruelty free lip balms.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [ "variety", "pack of 32" ] }, "asin": "B01FNQX11A" }, { "task_id": "ws_B079CGP5GP_11581", "instruction": "i need eye shadow with 0.5 ounce size only", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "0.5 ounce (pack of 12)" ] }, "asin": "B079CGP5GP" }, { "task_id": "ws_B09RFYG8YG_11582", "instruction": "can you search for keeyo women's oversized jumpsuits? are summer casual baggy pants, daily wear with wide legs please find this costume for me in blue color and x-large size", "target_attributes": { "attributes": [ "wide leg", "daily wear" ], "options": [ "blue", "x-large" ] }, "asin": "B09RFYG8YG" }, { "task_id": "ws_B00TOV2F4K_11583", "instruction": "i need to buy a forty-six inch under cabinet light fixture.", "target_attributes": { "attributes": [ "light fixture" ], "options": [ "46 in" ] }, "asin": "B00TOV2F4K" }, { "task_id": "ws_B099KPHTQT_11584", "instruction": "i would like to buy a 4g lte pc tablet with a hd screen.", "target_attributes": { "attributes": [ "high definition", "4g lte" ], "options": [] }, "asin": "B099KPHTQT" }, { "task_id": "ws_B08PPYCK6H_11585", "instruction": "i need ultra hd 13ft size smart tv", "target_attributes": { "attributes": [ "ultra hd" ], "options": [ "13ft" ] }, "asin": "B08PPYCK6H" }, { "task_id": "ws_B09DV19VKY_11586", "instruction": "i am looking for a brushed nickel modern sputnik chandelier that has 15 lights for my dining room.", "target_attributes": { "attributes": [ "brushed nickel", "dining room" ], "options": [ "15 lights" ] }, "asin": "B09DV19VKY" }, { "task_id": "ws_B09NSWZF5X_11587", "instruction": "i am looking for gaming pc windows 10 professional desktop tower with quad core i7 3.4ghz, 16gb ram, 256gb ssd, tempered glass and wifi adapter", "target_attributes": { "attributes": [ "quad core", "tempered glass" ], "options": [] }, "asin": "B09NSWZF5X" }, { "task_id": "ws_B09PG5MJG1_11588", "instruction": "i need to buy a height adjustable office chair with lumbar support. i want a grey one.", "target_attributes": { "attributes": [ "height adjustable", "lumbar support" ], "options": [ "grey" ] }, "asin": "B09PG5MJG1" }, { "task_id": "ws_B08R61WQ6K_11589", "instruction": "i want to find a black manual shaver that can help remove hair.", "target_attributes": { "attributes": [ "hair removal" ], "options": [ "black" ] }, "asin": "B08R61WQ6K" }, { "task_id": "ws_B09CM59VGC_11590", "instruction": "i am looking for a large wig storage case with accessory pockets.", "target_attributes": { "attributes": [ "storage case" ], "options": [ "large" ] }, "asin": "B09CM59VGC" }, { "task_id": "ws_B08HQ8JRQP_11591", "instruction": "i would like some low calorie sesame pretzels.", "target_attributes": { "attributes": [ "low calorie" ], "options": [ "sesame" ] }, "asin": "B08HQ8JRQP" }, { "task_id": "ws_B096NK94S7_11592", "instruction": "i want a hieha double din car stereo compatible with apple.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [] }, "asin": "B096NK94S7" }, { "task_id": "ws_B00CUMRXKG_11593", "instruction": "i need to buy a queen sized faux leather platform bed in white.", "target_attributes": { "attributes": [ "white item", "faux leather" ], "options": [ "white", "queen" ] }, "asin": "B00CUMRXKG" }, { "task_id": "ws_B088RL3PW2_11594", "instruction": "i am looking for 20 inch by 20 inch machine washable throw pillow inserts.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "20\" x 20\"" ] }, "asin": "B088RL3PW2" }, { "task_id": "ws_B07RPNJXQQ_11595", "instruction": "i want blue wide leg fudule women shorts.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "x-6 blue" ] }, "asin": "B07RPNJXQQ" }, { "task_id": "ws_B07NC2QDQM_11596", "instruction": "i want gluten free aurelia's spanish chorizo.", "target_attributes": { "attributes": [ "gluten free" ], "options": [] }, "asin": "B07NC2QDQM" }, { "task_id": "ws_B0130O3CWA_11597", "instruction": "i want to find a makeup palette that is highly pigmented.", "target_attributes": { "attributes": [ "highly pigmented" ], "options": [] }, "asin": "B0130O3CWA" }, { "task_id": "ws_B007TXXBJI_11598", "instruction": "i am looking for combo pack b, low calorie, sugar and fat free cakes weighing 2.6 ounces in pack of 12", "target_attributes": { "attributes": [ "low calorie", "fat free", "sugar free" ], "options": [ "combo pack b", "2.6 ounce (pack of 12)" ] }, "asin": "B007TXXBJI" }, { "task_id": "ws_B089GY4SGR_11599", "instruction": "i am looking for steel framed storage bench box. please choose red one.", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "red" ] }, "asin": "B089GY4SGR" }, { "task_id": "ws_B07XDXNMR8_11600", "instruction": "i want to find a noise-cancelling headset that is bluetooth enabled and features a clip and cable.", "target_attributes": { "attributes": [ "noise cancelling" ], "options": [ "clip+cable heaphone" ] }, "asin": "B07XDXNMR8" }, { "task_id": "ws_B07PXBRYZR_11601", "instruction": "i want to find 3-inch silver hairpins that i can use to style my hair with.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "silver", "3 inch" ] }, "asin": "B07PXBRYZR" }, { "task_id": "ws_B09QKPTN7Q_11602", "instruction": "i am looking for 2 nos high back armrest 3d mesh lumbar support office chair with red color", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red", "2" ] }, "asin": "B09QKPTN7Q" }, { "task_id": "ws_B09FSFQ6QT_11603", "instruction": "i need a hair elastic for my hair extensions.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [] }, "asin": "B09FSFQ6QT" }, { "task_id": "ws_B082NBXXJP_11604", "instruction": "i want a solid wood bench with storage space to go in my living room. it should be grey in color.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "grey" ] }, "asin": "B082NBXXJP" }, { "task_id": "ws_B07YY4DYV2_11605", "instruction": "i need some drapes for the living room that are 40\" by 63\" by 2.", "target_attributes": { "attributes": [ "living room" ], "options": [ "40'' x 63'' x 2 panels" ] }, "asin": "B07YY4DYV2" }, { "task_id": "ws_B07PBXXNCY_11606", "instruction": "i am looking for 300 count eco friendly face towels.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "300 count (save 20%)" ] }, "asin": "B07PBXXNCY" }, { "task_id": "ws_B001KW0CYG_11607", "instruction": "i am looking for a maple and brushed nickel 2 door armoire.", "target_attributes": { "attributes": [ "brushed nickel" ], "options": [ "maple" ] }, "asin": "B001KW0CYG" }, { "task_id": "ws_B07ZWGVCNM_11608", "instruction": "i am looking for hp elitedesk 800 g2 business desktop mini tower with core i5 ,16gb ram, 512gb harddrive and windows 10 pro along with high performance and certified refurbished", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B07ZWGVCNM" }, { "task_id": "ws_B08586N7Z1_11609", "instruction": "i am looking for yellow anti slip chair cushions", "target_attributes": { "attributes": [ "non slip" ], "options": [ "yellow" ] }, "asin": "B08586N7Z1" }, { "task_id": "ws_B0882N9V2H_11610", "instruction": "get me some party mix with chocolate covered cashews in a resealable bag.", "target_attributes": { "attributes": [ "chocolate covered", "resealable bag" ], "options": [ "cashews" ] }, "asin": "B0882N9V2H" }, { "task_id": "ws_B09LYBQWXJ_11611", "instruction": "i want to buy some multicolored machine washable pajamas in size large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "multi 1", "large" ] }, "asin": "B09LYBQWXJ" }, { "task_id": "ws_B09D9KYZ5D_11612", "instruction": "i want some easy to use rose gold hair extensions.", "target_attributes": { "attributes": [ "easy use", "rose gold" ], "options": [] }, "asin": "B09D9KYZ5D" }, { "task_id": "ws_B09KH2XNJM_11613", "instruction": "i want a pair of machine washable memory foam slippers. get the size 12-13 women in berry.", "target_attributes": { "attributes": [ "machine wash", "memory foam" ], "options": [ "berry square argyle plaid bright", "12-13 wide women | 10-11 wide men" ] }, "asin": "B09KH2XNJM" }, { "task_id": "ws_B08CN7FPM7_11614", "instruction": "my sister use avocado color eyebrow", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "avocado-1" ] }, "asin": "B08CN7FPM7" }, { "task_id": "ws_B09B3FXKMD_11615", "instruction": "i want a misty blue anker magnetic wireless charger.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "misty blue" ] }, "asin": "B09B3FXKMD" }, { "task_id": "ws_B096KTWFQW_11616", "instruction": "i'm looking for an easy to install cell phone safety lanyard patch which has a color specification of transparent x 6.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "transparent x 6" ] }, "asin": "B096KTWFQW" }, { "task_id": "ws_B09LGYLN2X_11617", "instruction": "i need hair extensions of 18 inch in #1 jet black color made of natural hair.", "target_attributes": { "attributes": [ "hair extensions", "natural hair" ], "options": [ "#1 jet black", "18 inch" ] }, "asin": "B09LGYLN2X" }, { "task_id": "ws_B08NJT56G6_11618", "instruction": "i am looking woman's non slip made from vinyl acetate indoor bathroom slipper color black size 13", "target_attributes": { "attributes": [ "non slip", "vinyl acetate", "comfortable fit" ], "options": [ "black", "13 women | 11 men" ] }, "asin": "B08NJT56G6" }, { "task_id": "ws_B09FHLKBZ5_11619", "instruction": "i need a ready to hang wall art with white mustangs on a brown background. it should be easy to clean as well.", "target_attributes": { "attributes": [ "ready hang", "easy clean" ], "options": [ "white mustangs on brown background" ] }, "asin": "B09FHLKBZ5" }, { "task_id": "ws_B09GFGTPVG_11620", "instruction": "i am looking for a blue colored 4g lte signal booster for home.", "target_attributes": { "attributes": [ "4g lte" ], "options": [ "blue" ] }, "asin": "B09GFGTPVG" }, { "task_id": "ws_B078N6MJ4J_11621", "instruction": "i'm looking for a full xl size mattress and box spring set with 8\" foundation.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "full xl size", "8\" foundation" ] }, "asin": "B078N6MJ4J" }, { "task_id": "ws_B081J5858X_11622", "instruction": "he was wearing a burgundy polyester cotton with black color and size 31 . it's quality is good.", "target_attributes": { "attributes": [ "cotton spandex", "polyester cotton" ], "options": [ "black", "31" ] }, "asin": "B081J5858X" }, { "task_id": "ws_B09QRZRHZD_11623", "instruction": "i am looking for iphone 11 mobile case. please choose green one.", "target_attributes": { "attributes": [ "wireless charging" ], "options": [ "green" ] }, "asin": "B09QRZRHZD" }, { "task_id": "ws_B082CMQ79J_11624", "instruction": "i am looking for bunny cake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B082CMQ79J" }, { "task_id": "ws_B09KQ2Y1X1_11625", "instruction": "i am looking for a twin xl over queen sized heavy duty steel bunk bed frame.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "twin xl over queen" ] }, "asin": "B09KQ2Y1X1" }, { "task_id": "ws_B00158OJ9O_11626", "instruction": "i am looking for hd dvd player.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B00158OJ9O" }, { "task_id": "ws_B09KRN61GH_11627", "instruction": "guyou faux fur accent chairs set of 2 chairs, white item is my choice for my new home .", "target_attributes": { "attributes": [ "white item" ], "options": [ "2 chairs" ] }, "asin": "B09KRN61GH" }, { "task_id": "ws_B09DPFQ2MD_11628", "instruction": "i am looking for canvas paintings with ready hang for living room, blue&white color is preferred", "target_attributes": { "attributes": [ "ready hang", "living room" ], "options": [ "blue&white" ] }, "asin": "B09DPFQ2MD" }, { "task_id": "ws_B09RGBM4R7_11629", "instruction": "i need a navy blue shock absorption carbon fiber case", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "navy blue" ] }, "asin": "B09RGBM4R7" }, { "task_id": "ws_B09KN2NMLY_11630", "instruction": "i am looking for extra large high waist women's leggings with tummy control.", "target_attributes": { "attributes": [ "tummy control", "high waist" ], "options": [ "x-large" ] }, "asin": "B09KN2NMLY" }, { "task_id": "ws_B0979YW9ZJ_11631", "instruction": "i want a aipsun clear glass globe pendant light fixture.", "target_attributes": { "attributes": [ "clear glass" ], "options": [] }, "asin": "B0979YW9ZJ" }, { "task_id": "ws_B07TGHZH66_11632", "instruction": "i need to buy a full sized, machine washable comforter. get color six.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "6", "full | queen" ] }, "asin": "B07TGHZH66" }, { "task_id": "ws_B081MXB6L9_11633", "instruction": "i want to find a red d04 gaming chair that offers lumbar support.", "target_attributes": { "attributes": [ "lumbar support" ], "options": [ "red", "d04" ] }, "asin": "B081MXB6L9" }, { "task_id": "ws_B088TFG3LN_11634", "instruction": "i am looking for a high speed digital camera with optical zoom.", "target_attributes": { "attributes": [ "high speed", "optical zoom" ], "options": [] }, "asin": "B088TFG3LN" }, { "task_id": "ws_B098SSXM1M_11635", "instruction": "i would like some elastic waistband pants that are black in a size 38w by 34l", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "duratex black", "38w x 34l" ] }, "asin": "B098SSXM1M" }, { "task_id": "ws_B08YP3KNRT_11636", "instruction": "i want to buy a four pack of non-gmo orange mango sparkling waters.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "energy - orange mango", "12 fl oz (pack of 4)" ] }, "asin": "B08YP3KNRT" }, { "task_id": "ws_B07VS875WL_11637", "instruction": "i'm looking for farmhouse window curtain set of grey color for living room , w 52 x l 90 | pair", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey", "w 52 x l 90 | pair" ] }, "asin": "B07VS875WL" }, { "task_id": "ws_B00M674K0G_11638", "instruction": "i need a 10 pound back of parboiled brown rice that is easy to prepare.", "target_attributes": { "attributes": [ "easy prepare" ], "options": [] }, "asin": "B00M674K0G" }, { "task_id": "ws_B09D2N6MHB_11639", "instruction": "i need to buy some blackout curtains for my living room that are eighty-four inches by eighty-four inches. get the ones with trees on them.", "target_attributes": { "attributes": [ "living room" ], "options": [ "trees_74", "w84 x l84" ] }, "asin": "B09D2N6MHB" }, { "task_id": "ws_B004UBFLR2_11640", "instruction": "find me some tea tree and lavender conditioner for dry, sensitive skin.", "target_attributes": { "attributes": [ "tea tree", "dry skin", "sensitive skin" ], "options": [ "lavender" ] }, "asin": "B004UBFLR2" }, { "task_id": "ws_B07YM3C3JT_11641", "instruction": "i am looking for buff which is a sulfate-free, vegan scent-free conditioner bar for sensitive skin! free from fragrance & coconut oil to soothe & smooth your scalp! ethique solid conditioner bar for sensitive skin which is 100% soap free & safe for color-treated or damaged hair. palm-oil free & aluminum free. kookabara scent in 2.12 ounce preferable.", "target_attributes": { "attributes": [ "sulfate free", "eco friendly", "oil free", "fragrance free", "cruelty free", "coconut oil", "sensitive skin", "damaged hair" ], "options": [ "kookabara", "2.12 ounce (pack of 2)" ] }, "asin": "B07YM3C3JT" }, { "task_id": "ws_B00ZQEN1U6_11642", "instruction": "get me a pair of grey nylon spandex stretch pants.", "target_attributes": { "attributes": [ "nylon spandex" ], "options": [ "grey" ] }, "asin": "B00ZQEN1U6" }, { "task_id": "ws_B0167BTDBC_11643", "instruction": "i want a mojito twist flavored cocktail mixer. make sure that it is non alcoholic and low calorie.", "target_attributes": { "attributes": [ "non alcoholic", "low calorie" ], "options": [ "mojito twist" ] }, "asin": "B0167BTDBC" }, { "task_id": "ws_B09RHZT7FK_11644", "instruction": "i am looking for high quality replacement shaver heads for a philips razor.", "target_attributes": { "attributes": [ "high quality" ], "options": [] }, "asin": "B09RHZT7FK" }, { "task_id": "ws_B07XFPQQGW_11645", "instruction": "i need a light weight case cover for a macbook air. get the creative marble pattern.", "target_attributes": { "attributes": [ "light weight", "case cover" ], "options": [ "creative marble 1" ] }, "asin": "B07XFPQQGW" }, { "task_id": "ws_B0094V8VMK_11646", "instruction": "i need to find a pair of coral suede ballet flats in size eight and a half. find the ones with the rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "coral suede", "8.5 women | 8.5 men" ] }, "asin": "B0094V8VMK" }, { "task_id": "ws_B089NC1WS1_11647", "instruction": "i need to get a synthetic hair extension in color 4.", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "4#" ] }, "asin": "B089NC1WS1" }, { "task_id": "ws_B09NSKWVMS_11648", "instruction": "i used green color coconut oil", "target_attributes": { "attributes": [ "coconut oil" ], "options": [ "g" ] }, "asin": "B09NSKWVMS" }, { "task_id": "ws_B07Q89CKGR_11649", "instruction": "i need a long lasting tv stand in white color.", "target_attributes": { "attributes": [ "long lasting", "white item" ], "options": [] }, "asin": "B07Q89CKGR" }, { "task_id": "ws_B09P77DZZQ_11650", "instruction": "i need bath sponges that are non toxic for dead skin in the color 1.", "target_attributes": { "attributes": [ "non toxic", "dead skin" ], "options": [ "1" ] }, "asin": "B09P77DZZQ" }, { "task_id": "ws_B09GM514NH_11651", "instruction": "i need some blue wide legged pants in a large.", "target_attributes": { "attributes": [ "wide leg" ], "options": [ "blue", "large" ] }, "asin": "B09GM514NH" }, { "task_id": "ws_B08PVD3LNP_11652", "instruction": "i need a tempered glass screen protector for my iphone.", "target_attributes": { "attributes": [ "tempered glass" ], "options": [] }, "asin": "B08PVD3LNP" }, { "task_id": "ws_B09B29YL3R_11653", "instruction": "i need a pair of white sneakers with rubber sole. it should be in women size 11.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "galaxy | multi | white", "11 women | 9.5 men" ] }, "asin": "B09B29YL3R" }, { "task_id": "ws_B09KBSGMBB_11654", "instruction": "i need some cupcake toppers for a birthday party. get the ones with silver glitter.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "glitter silver" ] }, "asin": "B09KBSGMBB" }, { "task_id": "ws_B00FTBREYK_11655", "instruction": "i want non gmo gimme, seaweed snack teriyaki.", "target_attributes": { "attributes": [ "non gmo" ], "options": [] }, "asin": "B00FTBREYK" }, { "task_id": "ws_B09QPYH2S5_11656", "instruction": "i need some blue linens that are high in quality.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "blue" ] }, "asin": "B09QPYH2S5" }, { "task_id": "ws_B09P1NR5Z7_11657", "instruction": "i need a toothbrush for kids that is easy to use and is the color c.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "c" ] }, "asin": "B09P1NR5Z7" }, { "task_id": "ws_B09MW196JX_11658", "instruction": "i want a brown mens shawl collar long-sleeved cardigans sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "brown" ] }, "asin": "B09MW196JX" }, { "task_id": "ws_B01C0UPTUS_11659", "instruction": "i want to find butter infused olive oil in a 200 milliliter bottle. it shouldn't have any artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "butter infused", "200ml bottle" ] }, "asin": "B01C0UPTUS" }, { "task_id": "ws_B089QMJTLB_11660", "instruction": "i am looking for a replacement remote control for samsung tvs that includes batteries.", "target_attributes": { "attributes": [ "batteries included" ], "options": [] }, "asin": "B089QMJTLB" }, { "task_id": "ws_B09BTW5WRN_11661", "instruction": "i need some wide leg pajama pants. it should be a large sized relaxed fit pant.", "target_attributes": { "attributes": [ "wide leg", "relaxed fit" ], "options": [ "large" ] }, "asin": "B09BTW5WRN" }, { "task_id": "ws_B09MJG8ZJN_11662", "instruction": "i want to buy a faux fur sherpa jacket in medium.", "target_attributes": { "attributes": [ "faux fur" ], "options": [ "medium" ] }, "asin": "B09MJG8ZJN" }, { "task_id": "ws_B01MYQEGN0_11663", "instruction": "find me some low-fat jerky in a resealable bag. i'd like the teriyaki flavor.", "target_attributes": { "attributes": [ "low fat", "resealable bag" ], "options": [ "gap beef 2.2oz 8ct - teriyaki" ] }, "asin": "B01MYQEGN0" }, { "task_id": "ws_B07F1BVNJ7_11664", "instruction": "i am looking for men's slim-fit machine wash and button closure with moisture wicking medium grey heather polo shirt and size is x-small", "target_attributes": { "attributes": [ "moisture wicking", "machine wash", "button closure" ], "options": [ "medium grey heather", "x-small" ] }, "asin": "B07F1BVNJ7" }, { "task_id": "ws_B08X227GNQ_11665", "instruction": "i need green women high waist yoga pants.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "green" ] }, "asin": "B08X227GNQ" }, { "task_id": "ws_B08GG22BF6_11666", "instruction": "i want to buy wireless nunchuck controllers for the wii.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B08GG22BF6" }, { "task_id": "ws_B087C94L8C_11667", "instruction": "i want to buy a twenty four pack of stupid hot low carb pork rinds.", "target_attributes": { "attributes": [ "low carb" ], "options": [ "stupid hot", "24 pack" ] }, "asin": "B087C94L8C" }, { "task_id": "ws_B09R1WHYBK_11668", "instruction": "find ps3 controller playstation 3 controller wireless bluetooth remote controller for playstation 3 system (siliver+orange) at amazon please.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "siliver+orange" ] }, "asin": "B09R1WHYBK" }, { "task_id": "ws_B08BQK4P1D_11669", "instruction": "i want tea biscuits made with quality ingredients. make sure that it is individually wrapped and doesn't come in a jar.", "target_attributes": { "attributes": [ "individually wrapped", "quality ingredients" ], "options": [ "without jar (individually wrapped)" ] }, "asin": "B08BQK4P1D" }, { "task_id": "ws_B008YDVYMI_11670", "instruction": "i want to buy a 36 count box of java love k cup pods. they should be usda organic.", "target_attributes": { "attributes": [ "usda organic" ], "options": [ "java love", "36 count (pack of 1)" ] }, "asin": "B008YDVYMI" }, { "task_id": "ws_B07DKTN85G_11671", "instruction": "i am looking for medium brown end tables with outlets and usb ports for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "medium brown" ] }, "asin": "B07DKTN85G" }, { "task_id": "ws_B08Z7PFF24_11672", "instruction": "i have 4x-large size short sleeve", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "4x-large" ] }, "asin": "B08Z7PFF24" }, { "task_id": "ws_B09PH5TQVH_11673", "instruction": "i'd like to find a loose short-sleeved summer tunic top for my teenage daughter. she's a size xxl and likes the color green.", "target_attributes": { "attributes": [ "short sleeve", "teen girls" ], "options": [ "p04- green", "xx-large" ] }, "asin": "B09PH5TQVH" }, { "task_id": "ws_B09LRTVYR7_11674", "instruction": "i am looking for makeup brushes tool set with eye shadow blush", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "purple" ] }, "asin": "B09LRTVYR7" }, { "task_id": "ws_B09Q2MDFKY_11675", "instruction": "i am looking for a large short sleeve men's graphic t-shirt.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "large" ] }, "asin": "B09Q2MDFKY" }, { "task_id": "ws_B099NB8PK5_11676", "instruction": "i want to find earbuds that are very lightweight.", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B099NB8PK5" }, { "task_id": "ws_B09QLJ586M_11677", "instruction": "i would like some chocolates that are individually wrapped that say congratulations.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "congratulations" ] }, "asin": "B09QLJ586M" }, { "task_id": "ws_B09LL184WP_11678", "instruction": "i want to find a hair repair mask treatment that can treat damaged hair.", "target_attributes": { "attributes": [ "damaged hair" ], "options": [] }, "asin": "B09LL184WP" }, { "task_id": "ws_B09NRM8YB8_11679", "instruction": "i am looking for tufted storage bench ottoman of qtqhome padded footrest stool which is collapsible design of this storage trunk makes it easy to set up a cozy, padded seating within seconds! it can also be folded flat when not in use for compact storage. best for living room in brown color 100x40x42cm(39x16x17inch) preferable.", "target_attributes": { "attributes": [ "non slip", "faux leather", "storage space", "living room" ], "options": [ "brown", "100x40x42cm(39x16x17inch)" ] }, "asin": "B09NRM8YB8" }, { "task_id": "ws_B00CTG7QYG_11680", "instruction": "i want to find an ac adapter that is high definition.", "target_attributes": { "attributes": [ "high definition" ], "options": [] }, "asin": "B00CTG7QYG" }, { "task_id": "ws_B08SHZZT49_11681", "instruction": "i want to find an extra-large pair of high waisted x1-21 blue jeans for women.", "target_attributes": { "attributes": [ "high waist" ], "options": [ "x1-21 blue", "x-large" ] }, "asin": "B08SHZZT49" }, { "task_id": "ws_B07SJW6LKN_11682", "instruction": "i am looking for ready to eat plain jackfruit.", "target_attributes": { "attributes": [ "ready eat" ], "options": [ "plain" ] }, "asin": "B07SJW6LKN" }, { "task_id": "ws_B01LTI98E0_11683", "instruction": "i am looking for an anti perspirant.", "target_attributes": { "attributes": [ "anti perspirant" ], "options": [] }, "asin": "B01LTI98E0" }, { "task_id": "ws_B00SYOXIBM_11684", "instruction": "i'm looking for a high speed cable hdmi male to male 2 pack of 30 feet", "target_attributes": { "attributes": [ "high speed" ], "options": [ "2 pack", "30-feet (2-pack)", "hdmi male to male" ] }, "asin": "B00SYOXIBM" }, { "task_id": "ws_B00SZXFIEW_11685", "instruction": "get me a hdmi male to male cable that is high speed and gold plated.", "target_attributes": { "attributes": [ "high speed", "gold plated" ], "options": [ "hdmi male to male" ] }, "asin": "B00SZXFIEW" }, { "task_id": "ws_B07V4J5G67_11686", "instruction": "i would like a living room ottoman that is white faux fur.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white faux fur | gold base" ] }, "asin": "B07V4J5G67" }, { "task_id": "ws_B01N66JEE3_11687", "instruction": "i want a pair of super soft fleece lined socks in snowflake or light pink color.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "snowflake | light pink ab" ] }, "asin": "B01N66JEE3" }, { "task_id": "ws_B09Q2R5FJJ_11688", "instruction": "i'm looking for high power and high resolution monocular telescope", "target_attributes": { "attributes": [ "high power", "high resolution" ], "options": [] }, "asin": "B09Q2R5FJJ" }, { "task_id": "ws_B08QJGB99C_11689", "instruction": "i need a wall-mounted mirror that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [] }, "asin": "B08QJGB99C" }, { "task_id": "ws_B074348Q5V_11690", "instruction": "get me a hand washable camo jumpsuit in size extra extra large.", "target_attributes": { "attributes": [ "hand wash" ], "options": [ "2 camo", "xx-large" ] }, "asin": "B074348Q5V" }, { "task_id": "ws_B09BW1BRQQ_11691", "instruction": "i need a floor lamp for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B09BW1BRQQ" }, { "task_id": "ws_B08LGRSCFT_11692", "instruction": "i am looking for super soft and machine washable dujiea lightweight cozy bed blanket with size small (40\"x50\") and also color is christmas kitty cat", "target_attributes": { "attributes": [ "super soft", "machine washable" ], "options": [ "christmas kitty cat", "small (40\"x50\")" ] }, "asin": "B08LGRSCFT" }, { "task_id": "ws_B09NXS5F3S_11693", "instruction": "i want a grey and easy to install naked eye 3d holographic projector.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "space grey" ] }, "asin": "B09NXS5F3S" }, { "task_id": "ws_B088GN4M6J_11694", "instruction": "i am looking for a long lasting rechargeable hair clipper.", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B088GN4M6J" }, { "task_id": "ws_B09HTJX6LY_11695", "instruction": "i am looking for high resolution digital camera. choose pink color.", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "pink" ] }, "asin": "B09HTJX6LY" }, { "task_id": "ws_B07LBBBWLM_11696", "instruction": "i am looking for 3 pcs wall art for living room. size should be 12x16 inches.", "target_attributes": { "attributes": [ "living room" ], "options": [ "coffee bean coffee cup" ] }, "asin": "B07LBBBWLM" }, { "task_id": "ws_B09BNYG291_11697", "instruction": "i need an easy to apply glitter pot that comes in copper holographic color.", "target_attributes": { "attributes": [ "easy apply" ], "options": [ "copper holographic" ] }, "asin": "B09BNYG291" }, { "task_id": "ws_B08W8PBDGW_11698", "instruction": "i want to find a white console table with double layers for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "white double layer console table", "white console table" ] }, "asin": "B08W8PBDGW" }, { "task_id": "ws_B082251QT1_11699", "instruction": "i am looking for 3 foot plug play hdmi cable", "target_attributes": { "attributes": [ "plug play" ], "options": [ "3 foot" ] }, "asin": "B082251QT1" }, { "task_id": "ws_B07MG7Z32T_11700", "instruction": "i want cheese pretzelhaus soft individually wrapped bavarian baked pretzels.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "cheese" ] }, "asin": "B07MG7Z32T" }, { "task_id": "ws_B08HRZG38Q_11701", "instruction": "i am looking for machine washable blue colored heated vest for men and women.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "blue" ] }, "asin": "B08HRZG38Q" }, { "task_id": "ws_B07Q8SMN7B_11702", "instruction": "i need a suction tool for removing dry, dead skin.", "target_attributes": { "attributes": [ "dry skin", "dead skin" ], "options": [] }, "asin": "B07Q8SMN7B" }, { "task_id": "ws_B07ZK5V3Z4_11703", "instruction": "i need to buy some machine washable blackout curtains for my living room. buy the 52 inch by 52 inch size.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "aurora-002lbg0560", "52\" w by 52\" l" ] }, "asin": "B07ZK5V3Z4" }, { "task_id": "ws_B07G31BXTV_11704", "instruction": "i am looking for brother hl-2170w 23ppm laser printer with wireless , high performance and certified refurbished", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B07G31BXTV" }, { "task_id": "ws_B09NZDB484_11705", "instruction": "i would like some sugar free salted caramel truffles.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "salted caramel" ] }, "asin": "B09NZDB484" }, { "task_id": "ws_B07TGMKJ1D_11706", "instruction": "i want a burt's bees body lotion for sensitive skin with aloe & shea butter.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "aloe & shea butter" ] }, "asin": "B07TGMKJ1D" }, { "task_id": "ws_B09SPZM8VL_11707", "instruction": "i want a regular fit tee with short sleeves. i am 3x-large in size.", "target_attributes": { "attributes": [ "short sleeve", "regular fit" ], "options": [ "3x-large" ] }, "asin": "B09SPZM8VL" }, { "task_id": "ws_B08PBRZHV4_11708", "instruction": "i want a hemoton 25 pack christmas cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B08PBRZHV4" }, { "task_id": "ws_B07ZK3M34L_11709", "instruction": "i want to find 12 ounces of sweet potatoes that are certified organic.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "sweet potato", "12 ounce (pack of 1)" ] }, "asin": "B07ZK3M34L" }, { "task_id": "ws_B08HFQSJJL_11710", "instruction": "i would like a jalapeno ranch sauce that is gluten free.", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "jalepeno ranch" ] }, "asin": "B08HFQSJJL" }, { "task_id": "ws_B08L7RG5Z9_11711", "instruction": "find this product: tangist corner table stand microwave oven stand 4 shelves storage unit for my kitchen", "target_attributes": { "attributes": [ "space saving", "storage space" ], "options": [] }, "asin": "B08L7RG5Z9" }, { "task_id": "ws_B08BJ112QF_11712", "instruction": "i need a camera case cover that is light green in color. it is for my iphone which is 11-6.1 inches in size.", "target_attributes": { "attributes": [ "case cover" ], "options": [ "light green", "for iphone 11-6.1 in" ] }, "asin": "B08BJ112QF" }, { "task_id": "ws_B08F54DW1X_11713", "instruction": "i am looking for steel frame kamiler rustic 6 drawers dresser with open shelf in rustic brown color", "target_attributes": { "attributes": [ "steel frame" ], "options": [ "rustic brown" ] }, "asin": "B08F54DW1X" }, { "task_id": "ws_B08JQMNF69_11714", "instruction": "i want to find shampoo that is made with argan oil.", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B08JQMNF69" }, { "task_id": "ws_B08WLXV4Z7_11715", "instruction": "i want to buy some dragon's dream cookies n'cream granola bars. get the pack of fifteen and make sure they're individually wrapped and nut free.", "target_attributes": { "attributes": [ "individually wrapped", "nut free" ], "options": [ "dragon's dream cookies n' cream", "0.88 ounce (pack of 15)" ] }, "asin": "B08WLXV4Z7" }, { "task_id": "ws_B00OZV63OW_11716", "instruction": "i need to buy some scrub bottoms in petite small. they should be blue and machine washable.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "new royal", "small petite" ] }, "asin": "B00OZV63OW" }, { "task_id": "ws_B07YZQTKDJ_11717", "instruction": "i'm looking for medium-tan mineral sunscreen lotion for kids that is water-resistant.", "target_attributes": { "attributes": [ "water resistant" ], "options": [ "medium-tan", "mineral lotion for kids" ] }, "asin": "B07YZQTKDJ" }, { "task_id": "ws_B07SBH6293_11718", "instruction": "i'm looking for a desktop computer that's certified refurbished and has an intel i5 core.", "target_attributes": { "attributes": [ "certified refurbished", "core i5", "intel core" ], "options": [] }, "asin": "B07SBH6293" }, { "task_id": "ws_B097GVR1ZK_11719", "instruction": "i need a children's mouthwash two pack that is made from natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "2pack" ] }, "asin": "B097GVR1ZK" }, { "task_id": "ws_B07PXXNZ3C_11720", "instruction": "i need women's eau de toilette from design house which has a good fragrance and is long lasting.", "target_attributes": { "attributes": [ "design house", "long lasting" ], "options": [] }, "asin": "B07PXXNZ3C" }, { "task_id": "ws_B003EWOCDW_11721", "instruction": "i want to find a speedotron beauty box that is 12 inches by 56 inches in size. it needs to be very heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "12x56in (30x140cm)", "speedotron" ] }, "asin": "B003EWOCDW" }, { "task_id": "ws_B07SJYYLWS_11722", "instruction": "i need a coconut oil based exfoliating body cream for my dry skin.", "target_attributes": { "attributes": [ "coconut oil", "dry skin" ], "options": [] }, "asin": "B07SJYYLWS" }, { "task_id": "ws_B09MD1ZGCL_11723", "instruction": "i want a navy fleece lined womens winter coat.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "x01-navy" ] }, "asin": "B09MD1ZGCL" }, { "task_id": "ws_B09NXY57FB_11724", "instruction": "i want purple fluoride free mmnm teeth cleansing toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "purple" ] }, "asin": "B09NXY57FB" }, { "task_id": "ws_B0791Y2LMB_11725", "instruction": "i am looking for high protein vanilla flavored nutrition shake, 11 fl oz, 12 count", "target_attributes": { "attributes": [ "high protein" ], "options": [ "vanilla" ] }, "asin": "B0791Y2LMB" }, { "task_id": "ws_B09NRCH7RS_11726", "instruction": "i want to buy a television stand that's easy to assemble. it needs to be brown and 27.5 inches tall.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "brown(large)", "27.5 inches tall" ] }, "asin": "B09NRCH7RS" }, { "task_id": "ws_B08W2CL9WD_11727", "instruction": "help me find a short sleeved button down shirt made in a tall men's extra large. also, i prefer a fabric with some stretch to it.", "target_attributes": { "attributes": [ "stretch fabric", "short sleeve" ], "options": [ "x-large tall" ] }, "asin": "B08W2CL9WD" }, { "task_id": "ws_B00CF61DDK_11728", "instruction": "i am looking for 50 single serving irish creme liquid creamers that are easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [] }, "asin": "B00CF61DDK" }, { "task_id": "ws_B086HLP2MT_11729", "instruction": "i want to find extra-small women's yoga pants that i can wear for my gym workouts. they need to be green colored.", "target_attributes": { "attributes": [ "gym workout" ], "options": [ "z1-green", "x-small" ] }, "asin": "B086HLP2MT" }, { "task_id": "ws_B09QT1LJ7D_11730", "instruction": "i want to find some whitening toothpaste that treats bad breath.", "target_attributes": { "attributes": [ "teeth whitening", "bad breath" ], "options": [] }, "asin": "B09QT1LJ7D" }, { "task_id": "ws_B09S3PQJZF_11731", "instruction": "shop for a red short sleeve t-shirt in size x-large.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "1-red", "x-large" ] }, "asin": "B09S3PQJZF" }, { "task_id": "ws_B09S3Q2DWB_11732", "instruction": "i need a black color, large sized, daily wear men's underwear which can be hand washed.", "target_attributes": { "attributes": [ "hand wash", "daily wear" ], "options": [ "black", "large" ] }, "asin": "B09S3Q2DWB" }, { "task_id": "ws_B09PHD4LGT_11733", "instruction": "i need a male cable for an outdoor 4g lte antenna. it should be five meters long.", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [ "5m cable n male" ] }, "asin": "B09PHD4LGT" }, { "task_id": "ws_B09N8RTNSX_11734", "instruction": "i would like some red butt lifting sweatpants that are in a size small.", "target_attributes": { "attributes": [ "butt lifting" ], "options": [ "yred7", "small" ] }, "asin": "B09N8RTNSX" }, { "task_id": "ws_B0863M3S82_11735", "instruction": "i am looking for optical zoom cameras", "target_attributes": { "attributes": [ "optical zoom" ], "options": [] }, "asin": "B0863M3S82" }, { "task_id": "ws_B01NBHBR7S_11736", "instruction": "i want a solid wood table in dark cognac brown color for my living room.", "target_attributes": { "attributes": [ "solid wood", "living room" ], "options": [ "dark cognac brown 2" ] }, "asin": "B01NBHBR7S" }, { "task_id": "ws_B07LGFDCJH_11737", "instruction": "i want to find some individually wrapped lozenges that are lemon and ginger flavored.", "target_attributes": { "attributes": [ "individually wrapped" ], "options": [ "lemon & ginger" ] }, "asin": "B07LGFDCJH" }, { "task_id": "ws_B095JYXNKY_11738", "instruction": "i need a hand washable short sleeve t-shirt in blue. get the size large.", "target_attributes": { "attributes": [ "hand wash", "short sleeve" ], "options": [ "2-blue", "large" ] }, "asin": "B095JYXNKY" }, { "task_id": "ws_B09JRCG3K3_11739", "instruction": "i want a 2022 dell g5 gaming desktop pc intel 6-core i5-10400f with windows 11 home.", "target_attributes": { "attributes": [ "core i5" ], "options": [ "windows 11 home" ] }, "asin": "B09JRCG3K3" }, { "task_id": "ws_B07HQXTQKS_11740", "instruction": "let me get some shelf stable tub of ghee which is grass fed.", "target_attributes": { "attributes": [ "grass fed", "shelf stable" ], "options": [] }, "asin": "B07HQXTQKS" }, { "task_id": "ws_B09FJVTX94_11741", "instruction": "i need an orange leather ottoman for my living room that is 46 cm.", "target_attributes": { "attributes": [ "living room" ], "options": [ "orange leather", "46cm" ] }, "asin": "B09FJVTX94" }, { "task_id": "ws_B08YJ42QYT_11742", "instruction": "i want to buy a twin size bed frame in gray with drawers. it should be solid wood and easily assembled.", "target_attributes": { "attributes": [ "twin size", "assembly required", "easy assemble", "solid wood" ], "options": [ "gray-drawers" ] }, "asin": "B08YJ42QYT" }, { "task_id": "ws_B08Y1FRSVT_11743", "instruction": "can you find me a loose fitting jumpsuit with wide legs in size medium. i want it to be green in color.", "target_attributes": { "attributes": [ "loose fit", "wide leg" ], "options": [ "f green", "medium" ] }, "asin": "B08Y1FRSVT" }, { "task_id": "ws_B09PGHW1TQ_11744", "instruction": "i want a pink machine washable womens swimsuits tankini top set.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "pink" ] }, "asin": "B09PGHW1TQ" }, { "task_id": "ws_B08FT2CF2R_11745", "instruction": "i am looking for 40 mm smartwatch case. it should be compatible to apple watch.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "40 mm" ] }, "asin": "B08FT2CF2R" }, { "task_id": "ws_B08MT83DJ9_11746", "instruction": "i want green zuseris unisex fleece lined clogs.", "target_attributes": { "attributes": [ "fleece lined" ], "options": [ "green" ] }, "asin": "B08MT83DJ9" }, { "task_id": "ws_B07RN8QGPS_11747", "instruction": "i am looking for hands free headphones that are mint and yellow.", "target_attributes": { "attributes": [ "hands free" ], "options": [ "mint & yellow" ] }, "asin": "B07RN8QGPS" }, { "task_id": "ws_B09QXKCNDR_11748", "instruction": "i need high quality linen fabric item.", "target_attributes": { "attributes": [ "high density" ], "options": [ "linen fabric" ] }, "asin": "B09QXKCNDR" }, { "task_id": "ws_B01LZSFOFS_11749", "instruction": "i am looking for a rectangular sofa table for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [] }, "asin": "B01LZSFOFS" }, { "task_id": "ws_B07YST7545_11750", "instruction": "i want to find a package of six keto-friendly caramel sea salt bars.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "new! caramel sea salt", "6 count (pack of 1)" ] }, "asin": "B07YST7545" }, { "task_id": "ws_B078Z2PCVZ_11751", "instruction": "i'am purchased women's clothing with quality materials and size 4x. also ,choose the magenta one.", "target_attributes": { "attributes": [ "quality materials" ], "options": [ "magenta", "4x" ] }, "asin": "B078Z2PCVZ" }, { "task_id": "ws_B07VBVRL6Q_11752", "instruction": "i want to buy a super soft fleece throw. look for one that's fifty by eighty inches.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "50\"x80\"" ] }, "asin": "B07VBVRL6Q" }, { "task_id": "ws_B09NBJCF85_11753", "instruction": "i want to find a vintage sherpa fleece throw that is 50 inches wide and 60 inches long. it needs to accommodate a queen sized bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "vintage 5", "throw 50\" w x 60\" l" ] }, "asin": "B09NBJCF85" }, { "task_id": "ws_B093KDG2NY_11754", "instruction": "i want laundry bag organiser for blouse ,hosiery other lingeries easy cary for travel", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093KDG2NY" }, { "task_id": "ws_B08H1Y41XM_11755", "instruction": "i want pink hair styling parting combs for braids.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "pink" ] }, "asin": "B08H1Y41XM" }, { "task_id": "ws_B073TSTFB8_11756", "instruction": "i am looking for long lasting l'eau de parfum spray for women", "target_attributes": { "attributes": [ "long lasting" ], "options": [] }, "asin": "B073TSTFB8" }, { "task_id": "ws_B07GXBJ73P_11757", "instruction": "if you have maybelline new york super stay full coverage (dermatologist tested,oil free) i'm looking for color 128 warm nude.", "target_attributes": { "attributes": [ "dermatologist tested", "oil free" ], "options": [ "128 warm nude" ] }, "asin": "B07GXBJ73P" }, { "task_id": "ws_B08XYMK48Z_11758", "instruction": "i want to find a pink and blue hair brush that can promote hair growth.", "target_attributes": { "attributes": [ "hair growth" ], "options": [ "0-pink,blue" ] }, "asin": "B08XYMK48Z" }, { "task_id": "ws_B099S29GVM_11759", "instruction": "i need a sky blue women's top with long sleeves.", "target_attributes": { "attributes": [ "loose fit", "long sleeve" ], "options": [ "sky blue" ] }, "asin": "B099S29GVM" }, { "task_id": "ws_B01MAWFHQW_11760", "instruction": "i want a 12 pack of gmo free cherry bay orchards tart cherry concentrate.", "target_attributes": { "attributes": [ "gmo free" ], "options": [ "16 fl oz (pack of 12)" ] }, "asin": "B01MAWFHQW" }, { "task_id": "ws_B093WKBWHF_11761", "instruction": "i want to find scented shampoo that can stop hair loss and promote hair growth.", "target_attributes": { "attributes": [ "hair loss", "hair growth" ], "options": [] }, "asin": "B093WKBWHF" }, { "task_id": "ws_B09P8C5V26_11762", "instruction": "i want to shop for a plug and play car radio receiver.", "target_attributes": { "attributes": [ "plug play" ], "options": [] }, "asin": "B09P8C5V26" }, { "task_id": "ws_B07T3HHL17_11763", "instruction": "i am looking for carbon fiber tripod. model should be veo2pro263ao.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B07T3HHL17" }, { "task_id": "ws_B07TXL5GWT_11764", "instruction": "i want oatmeal columbia men's bahama with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "oatmeal | whale" ] }, "asin": "B07TXL5GWT" }, { "task_id": "ws_B015KMIN6K_11765", "instruction": "i need some purple, machine washable drapes with a fifty-two inch width.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "royal purple", "52\"w x 54\"l" ] }, "asin": "B015KMIN6K" }, { "task_id": "ws_B078PHRMWT_11766", "instruction": "i'm looking for 8\" foundation flex box spring for mattress", "target_attributes": { "attributes": [ "box spring" ], "options": [ "queen", "8\" foundation" ] }, "asin": "B078PHRMWT" }, { "task_id": "ws_B08C7GB6YW_11767", "instruction": "i am finding a eco friendly and leak proof plastic refillable bottle container with protective case - style 1 color", "target_attributes": { "attributes": [ "leak proof", "eco friendly" ], "options": [ "style 1" ] }, "asin": "B08C7GB6YW" }, { "task_id": "ws_B08515GJ6B_11768", "instruction": "i would like a pink cosmetic bag that is easy to clean.", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "pink" ] }, "asin": "B08515GJ6B" }, { "task_id": "ws_B099KG8HS8_11769", "instruction": "i need green loose fit zincoty women's lace stain solid lounge set.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "green" ] }, "asin": "B099KG8HS8" }, { "task_id": "ws_B0764L8XHW_11770", "instruction": "i want to find orange-scented kids' soap that is free of parabens.", "target_attributes": { "attributes": [ "paraben free" ], "options": [ "orange" ] }, "asin": "B0764L8XHW" }, { "task_id": "ws_B074HDYYXJ_11771", "instruction": "i need a size 9 blue dove blue slides sandal which has rubber sole and are slip resistant.", "target_attributes": { "attributes": [ "slip resistant", "rubber sole" ], "options": [ "blue dove blue", "9" ] }, "asin": "B074HDYYXJ" }, { "task_id": "ws_B09CMK2FN9_11772", "instruction": "i am looking for rock and roll cupcake topper musical themed guitar cake topper which is easy to use in all kind of occasion. music guitar color preferable.", "target_attributes": { "attributes": [ "easy use", "party supplies" ], "options": [ "music guitar" ] }, "asin": "B09CMK2FN9" }, { "task_id": "ws_B09NBZD6QM_11773", "instruction": "i want black qinxiao simple computer desk with metal legs.", "target_attributes": { "attributes": [ "metal legs" ], "options": [ "black" ] }, "asin": "B09NBZD6QM" }, { "task_id": "ws_B01JOXW3YE_11774", "instruction": "i want to find a wi-fi router that can handle 10+ devices over 1000 feet with high speed.", "target_attributes": { "attributes": [ "high speed" ], "options": [ "wifi 5", "1000 ft, 10+ devices, 1.2 gbps" ] }, "asin": "B01JOXW3YE" }, { "task_id": "ws_B09B32HLMF_11775", "instruction": "i looking for contemporary style throw pillow covers for living room color yellow -a-1pc", "target_attributes": { "attributes": [ "contemporary style", "living room" ], "options": [ "yellow-a-1pc" ] }, "asin": "B09B32HLMF" }, { "task_id": "ws_B000NK3NBA_11776", "instruction": "i need a high resolution digital camera with 4x optical zoom.", "target_attributes": { "attributes": [ "high resolution", "optical zoom" ], "options": [] }, "asin": "B000NK3NBA" }, { "task_id": "ws_B09BVT195T_11777", "instruction": "i want to find a 120 inch projector screen that can be mounted to the wall.", "target_attributes": { "attributes": [ "wall mounted" ], "options": [ "120 inches 4:3" ] }, "asin": "B09BVT195T" }, { "task_id": "ws_B07Q3HK7YS_11778", "instruction": "i am looking for men slim fit dress shirt and please choose ballard blue color.", "target_attributes": { "attributes": [ "slim fit" ], "options": [ "ballard blue" ] }, "asin": "B07Q3HK7YS" }, { "task_id": "ws_B07S523DJC_11779", "instruction": "i am looking for a cruelty free shampoo for a hair salon. also choose 250ml pack and copper style.", "target_attributes": { "attributes": [ "cruelty free", "hair salon" ], "options": [ "250 ml (pack of 1)", "copper" ] }, "asin": "B07S523DJC" }, { "task_id": "ws_B07L7B575V_11780", "instruction": "i am looking for women ankle strap sandal. choose black color.", "target_attributes": { "attributes": [ "ankle strap" ], "options": [ "black" ] }, "asin": "B07L7B575V" }, { "task_id": "ws_B09C1XJNNP_11781", "instruction": "i need a solid wood bookcase.", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B09C1XJNNP" }, { "task_id": "ws_B08762SVZ4_11782", "instruction": "i would like hair extensions that are 14 inches.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [ "14 inch" ] }, "asin": "B08762SVZ4" }, { "task_id": "ws_B081VB212R_11783", "instruction": "i need a coaxial cable with an audio adapter.", "target_attributes": { "attributes": [ "coaxial cable" ], "options": [] }, "asin": "B081VB212R" }, { "task_id": "ws_B09NMBBZZV_11784", "instruction": "i need fast charging charger with white color", "target_attributes": { "attributes": [ "fast charging" ], "options": [ "white" ] }, "asin": "B09NMBBZZV" }, { "task_id": "ws_B001459IEE_11785", "instruction": "i am interested in a fragrance free lotion that is 18 fl oz.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [ "18 fl oz (pack of 1)" ] }, "asin": "B001459IEE" }, { "task_id": "ws_B09Q21W8KW_11786", "instruction": "i need to buy a machine washable purple t-shirt that says \"hello, my name is jennifer.\" please show me the women's size xx large.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "purple", "women", "xx-large" ] }, "asin": "B09Q21W8KW" }, { "task_id": "ws_B08XPKVTBW_11787", "instruction": "i want to find a black usb mouse that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "black" ] }, "asin": "B08XPKVTBW" }, { "task_id": "ws_B08NDV7DKW_11788", "instruction": "i am looking for a men's white star wars t-shirt.", "target_attributes": { "attributes": [ "star wars" ], "options": [ "white", "men" ] }, "asin": "B08NDV7DKW" }, { "task_id": "ws_B09QKTK4S5_11789", "instruction": "i'm looking for a ready to use fully assembled mattresses with box spring. also, choose queen sized one.", "target_attributes": { "attributes": [ "ready use", "fully assembled", "box spring" ], "options": [ "queen" ] }, "asin": "B09QKTK4S5" }, { "task_id": "ws_B08M62Q3JC_11790", "instruction": "i'm looking for binocular for bird watching.", "target_attributes": { "attributes": [ "easy use", "bird watching" ], "options": [] }, "asin": "B08M62Q3JC" }, { "task_id": "ws_B08HS3H5CZ_11791", "instruction": "i am looking for a space saving champagne ottoman that is 40 by 40 by 40.", "target_attributes": { "attributes": [ "space saving" ], "options": [ "champagne", "40x40x40cm" ] }, "asin": "B08HS3H5CZ" }, { "task_id": "ws_B07RJPJW3W_11792", "instruction": "i want green modern velvet dining chairs for the dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "green" ] }, "asin": "B07RJPJW3W" }, { "task_id": "ws_B09HWGB5LJ_11793", "instruction": "i am looking for hair masks for damaged hair in spray style", "target_attributes": { "attributes": [ "damaged hair" ], "options": [ "leave in spray" ] }, "asin": "B09HWGB5LJ" }, { "task_id": "ws_B07FF5G19C_11794", "instruction": "i want black prop\u00e9t women's aviator sneakers with rubber soles.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black" ] }, "asin": "B07FF5G19C" }, { "task_id": "ws_B086JS4HJF_11795", "instruction": "i need some cupcake picks for toppers.", "target_attributes": { "attributes": [ "cupcake picks" ], "options": [] }, "asin": "B086JS4HJF" }, { "task_id": "ws_B0036FPX9E_11796", "instruction": "i want to find a professional tripod that is heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [] }, "asin": "B0036FPX9E" }, { "task_id": "ws_B07JLLDHGR_11797", "instruction": "i am looking for high quality 20 inch hair extensions.", "target_attributes": { "attributes": [ "high quality", "hair extensions" ], "options": [ "20 inch, 100 gram(pack of 1)" ] }, "asin": "B07JLLDHGR" }, { "task_id": "ws_B07V2PTF2R_11798", "instruction": "i want a black classic fit disney the lion king characters shirt.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "black" ] }, "asin": "B07V2PTF2R" }, { "task_id": "ws_B000HG84EQ_11799", "instruction": "i want non gmo stretch island original grape fruit leather.", "target_attributes": { "attributes": [ "non gmo" ], "options": [ "grape" ] }, "asin": "B000HG84EQ" }, { "task_id": "ws_B0861FCMVG_11800", "instruction": "i want a large sized women's scrub pants. pick a ciel colored one.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "ciel", "large" ] }, "asin": "B0861FCMVG" }, { "task_id": "ws_B09RPK2C8F_11801", "instruction": "searching for an x-large short sleeve, loose fitting women's summer casual cute printed tee top band or blouse i can wear at holidays in the clothing shoes & jewerly department", "target_attributes": { "attributes": [ "loose fit", "short sleeve" ], "options": [ "x-large" ] }, "asin": "B09RPK2C8F" }, { "task_id": "ws_B09CPTHDG2_11802", "instruction": "i want to find a remote for my samsung security camera that runs on aaa batteries.", "target_attributes": { "attributes": [ "aaa batteries" ], "options": [] }, "asin": "B09CPTHDG2" }, { "task_id": "ws_B07ZHRC8SJ_11803", "instruction": "i would like some sausage and bacon that is fully cooked.", "target_attributes": { "attributes": [ "fully cooked" ], "options": [] }, "asin": "B07ZHRC8SJ" }, { "task_id": "ws_B07S45Q1SP_11804", "instruction": "i am looking for a full sized box spring.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "full" ] }, "asin": "B07S45Q1SP" }, { "task_id": "ws_B09F5QCW21_11805", "instruction": "in hand creams & lotion aisle of the beauty & personal care department, i want a white long lasting, fragrance free hand lotion for dry, rough or sensitive skin that soothes and comforts. comes in a 3 ounce 4 pack", "target_attributes": { "attributes": [ "long lasting", "fragrance free", "dry skin", "sensitive skin" ], "options": [] }, "asin": "B09F5QCW21" }, { "task_id": "ws_B010EC1TCG_11806", "instruction": "i mostly like designed house with grey color", "target_attributes": { "attributes": [ "design house" ], "options": [] }, "asin": "B010EC1TCG" }, { "task_id": "ws_B074RVN91Q_11807", "instruction": "i am looking for an eco friendly wood bedside shelf for a bed.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [] }, "asin": "B074RVN91Q" }, { "task_id": "ws_B0963D2H5J_11808", "instruction": "i am looking for gold colored geometric cushion covers.", "target_attributes": { "attributes": [ "living room" ], "options": [ "gold foil-15" ] }, "asin": "B0963D2H5J" }, { "task_id": "ws_B0054KM7IY_11809", "instruction": "find this brand duckfeet blavand unisex, model leather clog, important: size 38 m eu and leather sole .", "target_attributes": { "attributes": [ "leather sole" ], "options": [ "38 m eu" ] }, "asin": "B0054KM7IY" }, { "task_id": "ws_B09BKNLL1G_11810", "instruction": "i want to find a loofah back scrubber with a long handle.", "target_attributes": { "attributes": [ "long handle" ], "options": [] }, "asin": "B09BKNLL1G" }, { "task_id": "ws_B08J1SJ5R5_11811", "instruction": "i am looking for a under -sink storage fine wood finish", "target_attributes": { "attributes": [ "wood finish", "storage unit" ], "options": [] }, "asin": "B08J1SJ5R5" }, { "task_id": "ws_B08794V8MM_11812", "instruction": "i am looking for merrycolor farmhouse decorative throw pillow super durable throw pillow cases are easy to care, wipe or hand wash recommended due to the faux leather fabric, coffee color, 18 x 18 inch preferable.", "target_attributes": { "attributes": [ "faux leather", "living room" ], "options": [ "coffee", "18 x 18-inch" ] }, "asin": "B08794V8MM" }, { "task_id": "ws_B09CGWLL3Z_11813", "instruction": "i need a fast charging headset", "target_attributes": { "attributes": [ "fast charging" ], "options": [] }, "asin": "B09CGWLL3Z" }, { "task_id": "ws_B09CKNBQXH_11814", "instruction": "i need pu or faux leather space saving storage organizer in dark grey shagreen color.", "target_attributes": { "attributes": [ "space saving", "pu leather", "faux leather" ], "options": [ "dark grey shagreen" ] }, "asin": "B09CKNBQXH" }, { "task_id": "ws_B08TT6C13M_11815", "instruction": "i want a small knqr men's long sleeve quick dry shirt.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "small" ] }, "asin": "B08TT6C13M" }, { "task_id": "ws_B09PFP98PG_11816", "instruction": "i am looking for a xx-large size short sleeve e5-gray colored women blouse.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "e5 - gray", "xx-large" ] }, "asin": "B09PFP98PG" }, { "task_id": "ws_B0872DL8CX_11817", "instruction": "i am interested in 6 inch hair cutting shears.", "target_attributes": { "attributes": [ "hair cutting" ], "options": [ "6 inch cutting" ] }, "asin": "B0872DL8CX" }, { "task_id": "ws_B087M3J9H8_11818", "instruction": "i need a size x-large skirt in coffee brown. it should have a high elastic waist and a slim fit.", "target_attributes": { "attributes": [ "slim fit", "elastic waist", "high waist" ], "options": [ "coffee brown", "x-large" ] }, "asin": "B087M3J9H8" }, { "task_id": "ws_B07W56G36H_11819", "instruction": "i am looking for nathan james theo industrial bookshelf which is cube storage organizer also contrasting solid wood that pairs smoothly with its glossy white frame and solid veneer back panel. themodern scandinavian style storage cabinet which perfectly forliving room, entryway or in the kid's bedroom.in white brass gold color with size 6 preferable.", "target_attributes": { "attributes": [ "space saving", "white item", "steel frame", "living room" ], "options": [ "white | brass gold", "bookcase", "6-shelf" ] }, "asin": "B07W56G36H" }, { "task_id": "ws_B01CU5Y0PS_11820", "instruction": "i'd like to buy some cotton candy for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B01CU5Y0PS" }, { "task_id": "ws_B07MNM28ZN_11821", "instruction": "i am looking for a fluoride free toothpaste for kids. also choose high quality and 1.5 ounce in size.", "target_attributes": { "attributes": [ "fluoride free", "high quality" ], "options": [ "1.5 ounce (pack of 1)" ] }, "asin": "B07MNM28ZN" }, { "task_id": "ws_B081DYTR9J_11822", "instruction": "i want to find a 68-inch carbon fiber tripod camera.", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [ "sa255c1 | 25mm tube | 68\"" ] }, "asin": "B081DYTR9J" }, { "task_id": "ws_B07F25KJFQ_11823", "instruction": "i want to find a purple dress shirt that is 15 inches in circumference for the neck and 33 inches in circumference for the sleeve. the shirt should be regular fitting.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "purple", "15\" neck 32\"-33\" sleeve" ] }, "asin": "B07F25KJFQ" }, { "task_id": "ws_B0719QLYF2_11824", "instruction": "i want to find a pack of 24 single-ounce jalapeno free range turkey sticks. they need to be keto friendly.", "target_attributes": { "attributes": [ "keto friendly" ], "options": [ "jalapeno free range turkey", "1 ounce (pack of 24)" ] }, "asin": "B0719QLYF2" }, { "task_id": "ws_B0824YGBQ9_11825", "instruction": "i want a pink light weight kids digital camera.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "pink" ] }, "asin": "B0824YGBQ9" }, { "task_id": "ws_B073HPF4CF_11826", "instruction": "i need size 2' 2\" x 22' runner area rugs for living or dining room in ivory | grey color.", "target_attributes": { "attributes": [ "living room", "dining room" ], "options": [ "ivory | grey", "runner", "2' 2\" x 22'" ] }, "asin": "B073HPF4CF" }, { "task_id": "ws_B0716MLBXK_11827", "instruction": "i want to buy some black synthetic hair extensions.", "target_attributes": { "attributes": [ "synthetic hair", "hair extensions" ], "options": [ "black" ] }, "asin": "B0716MLBXK" }, { "task_id": "ws_B07KZK5F6C_11828", "instruction": "i'm looking for 20-inch long curtains for my living room that are charcoal colored.", "target_attributes": { "attributes": [ "living room" ], "options": [ "charcoal", "20 l" ] }, "asin": "B07KZK5F6C" }, { "task_id": "ws_B09KMCRRSG_11829", "instruction": "i want to find an l-shaped desk that can help save me space.", "target_attributes": { "attributes": [ "space saving" ], "options": [] }, "asin": "B09KMCRRSG" }, { "task_id": "ws_B076D9DS75_11830", "instruction": "i am looking for a gluten free socorro sweet tea that has low calories.", "target_attributes": { "attributes": [ "low calorie", "gluten free" ], "options": [ "socorro sweet tea" ] }, "asin": "B076D9DS75" }, { "task_id": "ws_B09BLZ3CTJ_11831", "instruction": "i want to find a two-pack of white usb chargers that can be mounted to a wall.", "target_attributes": { "attributes": [ "wall mounted", "usb port" ], "options": [ "white+white", "2 pack" ] }, "asin": "B09BLZ3CTJ" }, { "task_id": "ws_B08P4B5HQV_11832", "instruction": "i need 2pcs mixed package of grey color reusable easy clean cotton swab", "target_attributes": { "attributes": [ "easy clean" ], "options": [ "grey", "2pcs mixed package" ] }, "asin": "B08P4B5HQV" }, { "task_id": "ws_B08QC54P6P_11833", "instruction": "i want to buy a pair of compression pants in size xx large. they should be nude with an elastic waistband.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "nude b", "xx-large" ] }, "asin": "B08QC54P6P" }, { "task_id": "ws_B081V88NYR_11834", "instruction": "i want a bluetooth mp3 decoded module audio receiver board power amplifier easy install", "target_attributes": { "attributes": [ "power amplifier", "easy install" ], "options": [] }, "asin": "B081V88NYR" }, { "task_id": "ws_B093RZ7MC6_11835", "instruction": "i am looking for a resin diy for nail art with non toxic also easy to clean.", "target_attributes": { "attributes": [ "non toxic", "easy clean", "nail art" ], "options": [] }, "asin": "B093RZ7MC6" }, { "task_id": "ws_B08G14B779_11836", "instruction": "i want a pink niuta 2 pack hair towel wrap for dry hair.", "target_attributes": { "attributes": [ "dry hair" ], "options": [ "pink" ] }, "asin": "B08G14B779" }, { "task_id": "ws_B09H5B7PKR_11837", "instruction": "i am looking for a super soft feece throw with christmas deer, snowflakes and funny gifts.", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "christmas deer and snowflakes funny gifts fleece throw" ] }, "asin": "B09H5B7PKR" }, { "task_id": "ws_B093HJBHVX_11838", "instruction": "i am looking for a 2 pack of pendant ceiling lights for my dining room.", "target_attributes": { "attributes": [ "dining room" ], "options": [ "2 pack" ] }, "asin": "B093HJBHVX" }, { "task_id": "ws_B09R7XC49B_11839", "instruction": "i need a tea tree shampoo and conditioner set which is sulfate free and promotes hair growth.", "target_attributes": { "attributes": [ "sulfate free", "tea tree", "hair growth" ], "options": [] }, "asin": "B09R7XC49B" }, { "task_id": "ws_B08LBHBP2V_11840", "instruction": "i am looking for super soft and fleece throw blanket in multi 10 color", "target_attributes": { "attributes": [ "super soft", "fleece throw" ], "options": [ "multi 10" ] }, "asin": "B08LBHBP2V" }, { "task_id": "ws_B0989VJ5BQ_11841", "instruction": "i am looking for sneakers for teen girls walking shoes with ankle strap , size 8.5 and also z4-blue color", "target_attributes": { "attributes": [ "ankle strap", "teen girls" ], "options": [ "z4-blue", "8.5" ] }, "asin": "B0989VJ5BQ" }, { "task_id": "ws_B007JV7F4W_11842", "instruction": "we are looking easy install stereo sound subwoofers 800 watt speaker speaker size :12\"", "target_attributes": { "attributes": [ "easy install", "stereo sound" ], "options": [ "800 watts", "12-inch" ] }, "asin": "B007JV7F4W" }, { "task_id": "ws_B007QEY8RE_11843", "instruction": "i'd like to find frozen, handmade appetizers made with pear and brie.", "target_attributes": { "attributes": [ "hand crafted" ], "options": [] }, "asin": "B007QEY8RE" }, { "task_id": "ws_B0876Y38DS_11844", "instruction": "i am looking for men's white athletic shorts with a drawstring closure.", "target_attributes": { "attributes": [ "drawstring closure" ], "options": [ "white" ] }, "asin": "B0876Y38DS" }, { "task_id": "ws_B09P572DP9_11845", "instruction": "i want a heavy duty, non-slip protector case for my iphone. choose something in black.", "target_attributes": { "attributes": [ "heavy duty", "non slip" ], "options": [ "black" ] }, "asin": "B09P572DP9" }, { "task_id": "ws_B08F7WVPN2_11846", "instruction": "i'm looking for a black colored short sleeved women's casual summer off the shoulder dress. please select the size small.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "black", "small" ] }, "asin": "B08F7WVPN2" }, { "task_id": "ws_B09M3YVTF6_11847", "instruction": "i am looking for a digital alarm clock radio with wireless bluetooth built-in. also, i prefer a black colored one.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "black" ] }, "asin": "B09M3YVTF6" }, { "task_id": "ws_B01LYTO6V1_11848", "instruction": "i want 4 ounce fat free musselman's cinnamon apple sauce cups.", "target_attributes": { "attributes": [ "fat free" ], "options": [ "4 ounce" ] }, "asin": "B01LYTO6V1" }, { "task_id": "ws_B07B9GTSHW_11849", "instruction": "my skin was dry i need 4 ounce pack of facial cream", "target_attributes": { "attributes": [ "dry skin" ], "options": [] }, "asin": "B07B9GTSHW" }, { "task_id": "ws_B000Q38THM_11850", "instruction": "i want to find shelf-stable beef stew that is ready to eat.", "target_attributes": { "attributes": [ "shelf stable", "ready eat" ], "options": [] }, "asin": "B000Q38THM" }, { "task_id": "ws_B08JYVB93Z_11851", "instruction": "i am looking for eyeshadow that is cruelty free.", "target_attributes": { "attributes": [ "cruelty free" ], "options": [] }, "asin": "B08JYVB93Z" }, { "task_id": "ws_B09P8MWPCG_11852", "instruction": "i want to find a white twin sized bed frame that is easy to assemble.", "target_attributes": { "attributes": [ "white item", "easy assemble" ], "options": [ "white", "twin bed frame" ] }, "asin": "B09P8MWPCG" }, { "task_id": "ws_B01KZZ5HOS_11853", "instruction": "i want camile modern table lamps with a brushed nickel finish.", "target_attributes": { "attributes": [ "nickel finish" ], "options": [ "brushed nickel - off white drum shade" ] }, "asin": "B01KZZ5HOS" }, { "task_id": "ws_B092X4W66N_11854", "instruction": "i am looking for valentine day gift basket with luxury gold leaf hand cream, handmade freshly baked treats like variety of brownies and decadent cookies", "target_attributes": { "attributes": [ "gift basket", "valentine day" ], "options": [] }, "asin": "B092X4W66N" }, { "task_id": "ws_B01HEH31OI_11855", "instruction": "i am looking for a pair of long lasting women's size 5.5 wide hiking boots.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "5.5 wide" ] }, "asin": "B01HEH31OI" }, { "task_id": "ws_B085ZW9G4X_11856", "instruction": "i need zerofire 2 pack travel size spray bottles.", "target_attributes": { "attributes": [ "travel size" ], "options": [ "2 pack" ] }, "asin": "B085ZW9G4X" }, { "task_id": "ws_B08DKM7Y6G_11857", "instruction": "i need a quick drying running shorts with drawstring closure. it should be light grayish blue in color.", "target_attributes": { "attributes": [ "quick drying", "drawstring closure" ], "options": [ "light grayish blue" ] }, "asin": "B08DKM7Y6G" }, { "task_id": "ws_B09KVBJ56K_11858", "instruction": "i am interested in sprinkles that are soy free and for christmas.", "target_attributes": { "attributes": [ "soy free" ], "options": [ "8-christmas - candy" ] }, "asin": "B09KVBJ56K" }, { "task_id": "ws_B096B397LX_11859", "instruction": "i need to buy some easy to install pendant lights for my living room. get the blue ones.", "target_attributes": { "attributes": [ "easy install", "pendant light", "living room" ], "options": [ "blue" ] }, "asin": "B096B397LX" }, { "task_id": "ws_B09PC48LDS_11860", "instruction": "i need wireless charging with white color", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B09PC48LDS" }, { "task_id": "ws_B083TJJDJW_11861", "instruction": "i need no artificial color chocolate for 10 pocket", "target_attributes": { "attributes": [ "artificial colors" ], "options": [] }, "asin": "B083TJJDJW" }, { "task_id": "ws_B099Z7F8RC_11862", "instruction": "find me a cruelty free non toxic lip treatment oil for sensitive skin in 100 #loveyourself color.", "target_attributes": { "attributes": [ "cruelty free", "non toxic", "sensitive skin" ], "options": [ "100\u00a0#loveyourself" ] }, "asin": "B099Z7F8RC" }, { "task_id": "ws_B09373HTN7_11863", "instruction": "shop for a light weight windows desktop pc.", "target_attributes": { "attributes": [ "light weight" ], "options": [] }, "asin": "B09373HTN7" }, { "task_id": "ws_B07VYXP4DP_11864", "instruction": "i am looking for large dark grey pajama pants with an elastic waist.", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "dark grey", "large" ] }, "asin": "B07VYXP4DP" }, { "task_id": "ws_B00J7G0I8M_11865", "instruction": "i am looking for fluoride free all natural toothpaste.", "target_attributes": { "attributes": [ "fluoride free" ], "options": [] }, "asin": "B00J7G0I8M" }, { "task_id": "ws_B08TWWYH8Q_11866", "instruction": "i want a 125 digital power audio amplifier board.", "target_attributes": { "attributes": [ "power amplifier" ], "options": [] }, "asin": "B08TWWYH8Q" }, { "task_id": "ws_B08VJ474GR_11867", "instruction": "i need a non slip sofa slipcover which is either camel or ivory colored.", "target_attributes": { "attributes": [ "non slip" ], "options": [ "camel | ivory" ] }, "asin": "B08VJ474GR" }, { "task_id": "ws_B09KCMTNQP_11868", "instruction": "i need a long clip-in hair extension which is natural looking.", "target_attributes": { "attributes": [ "hair extensions" ], "options": [] }, "asin": "B09KCMTNQP" }, { "task_id": "ws_B09DCWZ4JB_11869", "instruction": "i would like a blue smartwatch band that is 42mm and is apple compatible.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "blue", "42mm | 44mm | 45mm" ] }, "asin": "B09DCWZ4JB" }, { "task_id": "ws_B09H59CSTC_11870", "instruction": "need a monopod with carbon fiber for dslr cameras", "target_attributes": { "attributes": [ "carbon fiber" ], "options": [] }, "asin": "B09H59CSTC" }, { "task_id": "ws_B097K252L9_11871", "instruction": "i want anti slip leopard print shoes for women in size 11.", "target_attributes": { "attributes": [ "anti slip" ], "options": [ "11 women | 9.5 men" ] }, "asin": "B097K252L9" }, { "task_id": "ws_B09QBVFM8F_11872", "instruction": "i want to find a gold hair comb that is easy to use.", "target_attributes": { "attributes": [ "easy use" ], "options": [ "gold" ] }, "asin": "B09QBVFM8F" }, { "task_id": "ws_B09928J5CH_11873", "instruction": "i need a gold colored storage case bag for holding nail art machine and tools.", "target_attributes": { "attributes": [ "storage case", "nail art" ], "options": [ "golden machine with a bag" ] }, "asin": "B09928J5CH" }, { "task_id": "ws_B09FF773JY_11874", "instruction": "i want to find a black apple watch band that is 38 millimeters long.", "target_attributes": { "attributes": [ "compatible apple" ], "options": [ "black", "38mm" ] }, "asin": "B09FF773JY" }, { "task_id": "ws_B077VQD17T_11875", "instruction": "i'm looking for skin care need to buy a sugarcane and papaya for dry skin.", "target_attributes": { "attributes": [ "seed oil", "dry skin" ], "options": [ "sugarcane & papaya" ] }, "asin": "B077VQD17T" }, { "task_id": "ws_B08X1KBCZM_11876", "instruction": "i am looking for long lasting hair color dye.please choose 7bg color.", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "7.13 | 7bg" ] }, "asin": "B08X1KBCZM" }, { "task_id": "ws_B07V3NKGHD_11877", "instruction": "i want to find individually wrapped chocolates in a gift basket that i can give for christmas.", "target_attributes": { "attributes": [ "individually wrapped", "gift basket" ], "options": [] }, "asin": "B07V3NKGHD" }, { "task_id": "ws_B08N9S7DVZ_11878", "instruction": "i am looking for a coffee sofa slipcovers of pu leather", "target_attributes": { "attributes": [ "pu leather" ], "options": [ "coffee" ] }, "asin": "B08N9S7DVZ" }, { "task_id": "ws_B00B46XLT6_11879", "instruction": "i am looking a high resolution fiber optic cable for audio vedio colour :black", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "black" ] }, "asin": "B00B46XLT6" }, { "task_id": "ws_B09GK7V42L_11880", "instruction": "i want a yellow easy to carry gaone fm radio alarm clock.", "target_attributes": { "attributes": [ "easy carry" ], "options": [ "yellow" ] }, "asin": "B09GK7V42L" }, { "task_id": "ws_B07WV947XR_11881", "instruction": "i want a long handle body brush to remove dead skin. get me something in blue or white.", "target_attributes": { "attributes": [ "long handle", "dead skin" ], "options": [ "blue | white" ] }, "asin": "B07WV947XR" }, { "task_id": "ws_B09PNF3MJR_11882", "instruction": "i am looking for a red colored button down hawaiian shirt with short sleeves.", "target_attributes": { "attributes": [ "short sleeve", "button closure" ], "options": [ "03 red" ] }, "asin": "B09PNF3MJR" }, { "task_id": "ws_B00DBXR7MW_11883", "instruction": "i want to find a 6-pack of 12 count ferrero rocher candies for valentine's day.", "target_attributes": { "attributes": [ "valentine day" ], "options": [ "12 count (pack of 6)", "ferrero rocher" ] }, "asin": "B00DBXR7MW" }, { "task_id": "ws_B09SY7QSC7_11884", "instruction": "i am looking for powerful stainless steel kit for total body clipping, trimming, & grooming.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [] }, "asin": "B09SY7QSC7" }, { "task_id": "ws_B09P8Q42XL_11885", "instruction": "i want large loose fit tank tops for women.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "large" ] }, "asin": "B09P8Q42XL" }, { "task_id": "ws_B07D5ZPCX4_11886", "instruction": "i want to find kettle style potato chips with 0 grams of trans fat. there should be 4 bags total.", "target_attributes": { "attributes": [ "0g trans" ], "options": [ "4 bags" ] }, "asin": "B07D5ZPCX4" }, { "task_id": "ws_B082HT2BKV_11887", "instruction": "i am looking for creative cupcake toppers for a kids birthday cake.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B082HT2BKV" }, { "task_id": "ws_B07HRZ23TW_11888", "instruction": "i need 1 pack 6.34 ounce, hand crafted and individually wrapped tortas.", "target_attributes": { "attributes": [ "hand crafted", "individually wrapped" ], "options": [ "6.34 ounce (pack of 1)" ] }, "asin": "B07HRZ23TW" }, { "task_id": "ws_B09PVJ5GD4_11889", "instruction": "my high heel size was 6.5", "target_attributes": { "attributes": [ "high heel" ], "options": [ "6.5" ] }, "asin": "B09PVJ5GD4" }, { "task_id": "ws_B001E95F4W_11890", "instruction": "i have 3 hair dye", "target_attributes": { "attributes": [ "hair dye" ], "options": [ "3 count" ] }, "asin": "B001E95F4W" }, { "task_id": "ws_B09KP5VSHV_11891", "instruction": "i am looking for a faux fur cardigan coat with long sleeves. i am a 3x-large in size.", "target_attributes": { "attributes": [ "faux fur", "long sleeve" ], "options": [ "3x-large" ] }, "asin": "B09KP5VSHV" }, { "task_id": "ws_B09BZTJPZW_11892", "instruction": "i am looking for high quality , easy use , bpa free tongue brush", "target_attributes": { "attributes": [ "bpa free", "easy use", "high quality" ], "options": [] }, "asin": "B09BZTJPZW" }, { "task_id": "ws_B086RJ1N69_11893", "instruction": "i'm baking a birthday cake for raju.", "target_attributes": { "attributes": [ "birthday cake" ], "options": [] }, "asin": "B086RJ1N69" }, { "task_id": "ws_B093YSK8QX_11894", "instruction": "i am looking for a set of 2 mesh laundry bags.", "target_attributes": { "attributes": [ "laundry bag" ], "options": [] }, "asin": "B093YSK8QX" }, { "task_id": "ws_B07TGFS8KX_11895", "instruction": "i want a golden lighting 3602-vl3 blk duncan vanity light.", "target_attributes": { "attributes": [ "vanity light" ], "options": [] }, "asin": "B07TGFS8KX" }, { "task_id": "ws_B09H7PL3NN_11896", "instruction": "i am looking for a winter warm jacket with long sleeve which is washable in machine. also choose navy color and small size.", "target_attributes": { "attributes": [ "winter warm", "machine wash", "long sleeve" ], "options": [ "navy", "small" ] }, "asin": "B09H7PL3NN" }, { "task_id": "ws_B07J2QPQMM_11897", "instruction": "get me a high performance video camera that is certified refurbished.", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B07J2QPQMM" }, { "task_id": "ws_B08BHN5S3C_11898", "instruction": "i am looking for a large bright blue daily casual dress.", "target_attributes": { "attributes": [ "daily casual" ], "options": [ "bright blue", "large" ] }, "asin": "B08BHN5S3C" }, { "task_id": "ws_B078WTG2RC_11899", "instruction": "i need to buy some green sandals with arch support. look for uk size nine medium.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "green green black green xgkg", "9 m uk" ] }, "asin": "B078WTG2RC" }, { "task_id": "ws_B08ZS9TZW2_11900", "instruction": "sony xr50x90j 50-inch ultra hd and high speed full array led smart tv", "target_attributes": { "attributes": [ "ultra hd", "high speed" ], "options": [] }, "asin": "B08ZS9TZW2" }, { "task_id": "ws_B09JBZP1KV_11901", "instruction": "i want to find an xx-large blue women's long sleeve sweater.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "blue", "xx-large" ] }, "asin": "B09JBZP1KV" }, { "task_id": "ws_B08FM8P9RB_11902", "instruction": "i am looking for button tufted , easy assemble velvet ottoman bench with white faux fur in color", "target_attributes": { "attributes": [ "button tufted", "easy assemble" ], "options": [ "white faux fur" ] }, "asin": "B08FM8P9RB" }, { "task_id": "ws_B08DYFCRVT_11903", "instruction": "i want to find an 11 fluid ounce bottle of ginger lemonade kombucha that has no sugar, and it needs to come in a pack of 16.", "target_attributes": { "attributes": [ "zero sugar" ], "options": [ "ginger lemonade", "11 fl oz (pack of 16)" ] }, "asin": "B08DYFCRVT" }, { "task_id": "ws_B079QPZ8KN_11904", "instruction": "i need this product for afternoon snack with friends .rhythm superfoods carrot sticks,1.4 oz (pack of 12), vegan/gluten-free superfood snacks", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "1.4 ounce (pack of 12)" ] }, "asin": "B079QPZ8KN" }, { "task_id": "ws_B08XMD5NG2_11905", "instruction": "i am looking for an intel quad core i3 6157u powered mini pc.", "target_attributes": { "attributes": [ "intel core", "quad core" ], "options": [ "i3 6157u" ] }, "asin": "B08XMD5NG2" }, { "task_id": "ws_B08XMD5NG2_11906", "instruction": "i want to find an industrial i7 8550u computer that has a quad core. it needs to have 16 gigabytes of storage space on its ram.", "target_attributes": { "attributes": [ "quad core" ], "options": [ "i7 8550u", "16g ram 512g ssd 1tb hdd" ] }, "asin": "B08XMD5NG2" }, { "task_id": "ws_B09PBLK5BF_11907", "instruction": "i want to find stainless steel hair cutting scissors with silver blades.", "target_attributes": { "attributes": [ "stainless steel", "hair cutting" ], "options": [ "silver tooth scissors" ] }, "asin": "B09PBLK5BF" }, { "task_id": "ws_B00S5UFHFU_11908", "instruction": "i would like some organic hair oil that is 16 fl oz.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "16 fl oz (pack of 1)" ] }, "asin": "B00S5UFHFU" }, { "task_id": "ws_B001AHJJJA_11909", "instruction": "i need a travel sized facial cleanser for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [ "travel size" ] }, "asin": "B001AHJJJA" }, { "task_id": "ws_B07YXFXNNV_11910", "instruction": "i am looking for chocolate covered and non gmo pre filled stocking stuffers with candy", "target_attributes": { "attributes": [ "chocolate covered", "non gmo" ], "options": [] }, "asin": "B07YXFXNNV" }, { "task_id": "ws_B09QQSQKRY_11911", "instruction": "may you give me this costume please? there is a women's plus size loose jumpsuit ethnic floral summer jumpsuit quick dry 4x large.", "target_attributes": { "attributes": [ "quick drying" ], "options": [ "4x-large" ] }, "asin": "B09QQSQKRY" }, { "task_id": "ws_B09KQ6QLH8_11912", "instruction": "i am looking for non gmo, gluten free, soy free , plant based perfect chicken spinach pesto burger with size 4-pack", "target_attributes": { "attributes": [ "non gmo", "gluten free", "soy free", "plant based" ], "options": [ "4 - pack" ] }, "asin": "B09KQ6QLH8" }, { "task_id": "ws_B000P3U70K_11913", "instruction": "i am looking for old fashioned wabash valley farms - kernels with flavorful medley and with size 6 pound (pack of 1)", "target_attributes": { "attributes": [ "old fashioned" ], "options": [ "flavorful medley", "6 pound (pack of 1)" ] }, "asin": "B000P3U70K" }, { "task_id": "ws_B07CTBC6HX_11914", "instruction": "i'am purchase new type of machine wash and it's color is dark coffee,size:36w x34i", "target_attributes": { "attributes": [ "imported zipper" ], "options": [ "dark coffee", "36w x 34l" ] }, "asin": "B07CTBC6HX" }, { "task_id": "ws_B06XW3YW82_11915", "instruction": "i'm looking for stainless steel for kitchen product.", "target_attributes": { "attributes": [ "fully assembled", "stainless steel" ], "options": [ "rectangle lockable" ] }, "asin": "B06XW3YW82" }, { "task_id": "ws_B09J4PRB13_11916", "instruction": "i want to find xx-large black workout sweatpants with a relaxed fit.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "black a34", "xx-large" ] }, "asin": "B09J4PRB13" }, { "task_id": "ws_B07QXV6T4K_11917", "instruction": "i want a majestic pure argan oil hair mask.", "target_attributes": { "attributes": [ "argan oil" ], "options": [] }, "asin": "B07QXV6T4K" }, { "task_id": "ws_B00OIUBDLI_11918", "instruction": "zahara brought a cup of green tea.", "target_attributes": { "attributes": [ "green tea" ], "options": [] }, "asin": "B00OIUBDLI" }, { "task_id": "ws_B09N76DG4F_11919", "instruction": "i am looking for a green hoodie that is loose fit and a size small.", "target_attributes": { "attributes": [ "loose fit" ], "options": [ "green", "small" ] }, "asin": "B09N76DG4F" }, { "task_id": "ws_B08YS18GLB_11920", "instruction": "i want to find black women's walking shoes with great arch support. the shoes should be in size 8.5 and lean on the wide side.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "black 1", "8.5 wide" ] }, "asin": "B08YS18GLB" }, { "task_id": "ws_B07N34HVW3_11921", "instruction": "i am looking for style edit root concealer touch up spray with unique pinpoint applicator provides targeted gray root coverage in seconds, natural emollients adhere to hair, while keeping a soft, natural feel. pack of 3 in medium brown color preferable.", "target_attributes": { "attributes": [ "cruelty free", "permanent hair", "hair dye", "beauty salon" ], "options": [ "medium brown", "pack of 3" ] }, "asin": "B07N34HVW3" }, { "task_id": "ws_B09JLY4R5N_11922", "instruction": "let me get some birthday party cake toppers in red color.", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "red" ] }, "asin": "B09JLY4R5N" }, { "task_id": "ws_B079TJP1FM_11923", "instruction": "i need a set of leak proof, bpa free jars.", "target_attributes": { "attributes": [ "leak proof", "bpa free" ], "options": [] }, "asin": "B079TJP1FM" }, { "task_id": "ws_B09HQ2ZNN1_11924", "instruction": "i am looking for stainless steel tongue scraper with rose gold for oral hygiene", "target_attributes": { "attributes": [ "stainless steel" ], "options": [ "rose gold" ] }, "asin": "B09HQ2ZNN1" }, { "task_id": "ws_B07NRZ1G6P_11925", "instruction": "i want a 3 pack of dr. pawpaw multi-purpose balm for dry skin.", "target_attributes": { "attributes": [ "dry skin" ], "options": [ "3 pack" ] }, "asin": "B07NRZ1G6P" }, { "task_id": "ws_B00NR5QGAS_11926", "instruction": "i am looking for women's 3x-large plus sized capri pants with regular fit. get me a white one.", "target_attributes": { "attributes": [ "regular fit" ], "options": [ "white", "3x-large plus petite" ] }, "asin": "B00NR5QGAS" }, { "task_id": "ws_B09T33NQZ8_11927", "instruction": "i want to find pink massage table sheets that are 70 x 185 centimeters in size. they must be high quality and non-toxic.", "target_attributes": { "attributes": [ "high quality", "non toxic" ], "options": [ "pink", "70*185cm" ] }, "asin": "B09T33NQZ8" }, { "task_id": "ws_B07YLJPMC3_11928", "instruction": "i am looking for fragrance free foaming cream cleanser.", "target_attributes": { "attributes": [ "fragrance free" ], "options": [] }, "asin": "B07YLJPMC3" }, { "task_id": "ws_B081B4JGDW_11929", "instruction": "i am looking for mysteek color pop temporary hair color that is easy to use for hair dye . color bougie blue , 0.25 fl oz (pack of 1) preferable.", "target_attributes": { "attributes": [ "easy use", "natural hair", "hair dye" ], "options": [ "bougie blue", "0.25 fl oz (pack of 1)" ] }, "asin": "B081B4JGDW" }, { "task_id": "ws_B07CR22SWM_11930", "instruction": "i am looking for 20 pack set 10ml protable refill bulk atomizer spray of high quality sprayer glass bottles with fine mist sprayers, are perfect for storing your essential oils, perfumes or colognes in red color.", "target_attributes": { "attributes": [ "high quality", "fine mist" ], "options": [ "red" ] }, "asin": "B07CR22SWM" }, { "task_id": "ws_B077BFH5FZ_11931", "instruction": "i need a gift set of snacks.", "target_attributes": { "attributes": [ "gift set" ], "options": [] }, "asin": "B077BFH5FZ" }, { "task_id": "ws_B07NB7XWLW_11932", "instruction": "i want luseta tea tree oil shampoo.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "shampoo" ] }, "asin": "B07NB7XWLW" }, { "task_id": "ws_B00BBUSCQC_11933", "instruction": "i need a vanity light with four bulbs and glass shades.", "target_attributes": { "attributes": [ "vanity light", "glass shade" ], "options": [ "4-light" ] }, "asin": "B00BBUSCQC" }, { "task_id": "ws_B09SFXT82T_11934", "instruction": "i am searching for elastic waist black color boxer briefs underwear", "target_attributes": { "attributes": [ "elastic waist" ], "options": [ "black" ] }, "asin": "B09SFXT82T" }, { "task_id": "ws_B000WLXMB6_11935", "instruction": "i want lundberg family farms organic california wild blend white jasmine rice.", "target_attributes": { "attributes": [ "certified organic" ], "options": [ "wild blend" ] }, "asin": "B000WLXMB6" }, { "task_id": "ws_B07256GKZ5_11936", "instruction": "i want to find resealable bags of sea salt and fine ground celtic sea salt. the bags should be 16 ounces each and come in a pack of 6.", "target_attributes": { "attributes": [ "resealable bag" ], "options": [ "sea salt + fine ground celtic sea salt", "16 ounce (pack of 6)", "bag" ] }, "asin": "B07256GKZ5" }, { "task_id": "ws_B09Q2D29MR_11937", "instruction": "i want a quick release 360\u00b0 panoramic ball head.", "target_attributes": { "attributes": [ "quick release" ], "options": [] }, "asin": "B09Q2D29MR" }, { "task_id": "ws_B00JHGSANM_11938", "instruction": "i would like a gluten free blue cheese dressing that is 15 oz", "target_attributes": { "attributes": [ "gluten free" ], "options": [ "fat free chunky blue cheese 15 oz", "15 ounce (pack of 1)" ] }, "asin": "B00JHGSANM" }, { "task_id": "ws_B08M3FNT2M_11939", "instruction": "i want to find an extra soft toothbrush that can help with sensitive teeth.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [] }, "asin": "B08M3FNT2M" }, { "task_id": "ws_B07VYWC1SH_11940", "instruction": "i want to find a kelly green women's 3x-large t-shirt that has a classic fit.", "target_attributes": { "attributes": [ "classic fit" ], "options": [ "kelly green", "women", "3x-large" ] }, "asin": "B07VYWC1SH" }, { "task_id": "ws_B09CSRTBJ1_11941", "instruction": "i want to find 45 grams of dark green edible glitter that is dairy free.", "target_attributes": { "attributes": [ "dairy free" ], "options": [ "dark green", "45g shaker" ] }, "asin": "B09CSRTBJ1" }, { "task_id": "ws_B09F9NV74S_11942", "instruction": "i want silver beaupretty mirror nail polish.", "target_attributes": { "attributes": [ "nail polish" ], "options": [ "silver" ] }, "asin": "B09F9NV74S" }, { "task_id": "ws_B01913CX6U_11943", "instruction": "i want to shop for some sulfate free, paraben free conditioner for dry, damaged hair.", "target_attributes": { "attributes": [ "sulfate free", "paraben free", "dry hair", "damaged hair" ], "options": [] }, "asin": "B01913CX6U" }, { "task_id": "ws_B0143NQVJ8_11944", "instruction": "i am interested in a high protein bar that is mixed berry flavor.", "target_attributes": { "attributes": [ "high protein" ], "options": [ "mixed berry" ] }, "asin": "B0143NQVJ8" }, { "task_id": "ws_B08QJTPHLS_11945", "instruction": "ultra soft - charcoal toothbrush for adults and sensitive teeth with pack consists of 8 count.", "target_attributes": { "attributes": [ "sensitive teeth" ], "options": [ "charcoal - ultra soft - adults", "8 count (pack of 1)" ] }, "asin": "B08QJTPHLS" }, { "task_id": "ws_B07FYDYR9J_11946", "instruction": "i'm searching for long spaghetti straps satin ball dry clean gown .its size is 6, and lilac color", "target_attributes": { "attributes": [ "dry clean" ], "options": [ "lilac", "6" ] }, "asin": "B07FYDYR9J" }, { "task_id": "ws_B0936Y95DB_11947", "instruction": "i am looking for yellow color stool cover. it should be washable in machine.", "target_attributes": { "attributes": [ "machine washable" ], "options": [ "yellow" ] }, "asin": "B0936Y95DB" }, { "task_id": "ws_B09DPF82NP_11948", "instruction": "i need a smart watch protective case. get the one for a 40mm apple watch.", "target_attributes": { "attributes": [ "compatible apple", "case cover" ], "options": [ "40mm" ] }, "asin": "B09DPF82NP" }, { "task_id": "ws_B09NRP78WV_11949", "instruction": "i need an extra large twin box spring with a four inch foundation. get the white one.", "target_attributes": { "attributes": [ "box spring" ], "options": [ "white", "twin xl", "4\" foundation" ] }, "asin": "B09NRP78WV" }, { "task_id": "ws_B09CKS7B2J_11950", "instruction": "i want grey and light weight wygrqbn mens walking shoes.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "grey" ] }, "asin": "B09CKS7B2J" }, { "task_id": "ws_B093D82ZGC_11951", "instruction": "i want black straight leg shopessa harem sweatpants for women.", "target_attributes": { "attributes": [ "straight leg" ], "options": [ "a7 - black" ] }, "asin": "B093D82ZGC" }, { "task_id": "ws_B093SYBT18_11952", "instruction": "i want to find a laundry bag for my blouses and hosiery.", "target_attributes": { "attributes": [ "blouse hosiery", "laundry bag" ], "options": [] }, "asin": "B093SYBT18" }, { "task_id": "ws_B09FLHHWNX_11953", "instruction": "my living room in grey color", "target_attributes": { "attributes": [ "living room" ], "options": [ "grey" ] }, "asin": "B09FLHHWNX" }, { "task_id": "ws_B09R3N24W6_11954", "instruction": "i want a black women's shoe in size 7 with a lace closure. it should have a metal decoration.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "black", "6.5-7" ] }, "asin": "B09R3N24W6" }, { "task_id": "ws_B092CJR3ST_11955", "instruction": "i want a cheery cacao flavored bar that is gluten and diary free.", "target_attributes": { "attributes": [ "gluten free", "dairy free" ], "options": [ "cherry cacao" ] }, "asin": "B092CJR3ST" }, { "task_id": "ws_B08XV5X86G_11956", "instruction": "i would like a tablet that has a 1080p screen.", "target_attributes": { "attributes": [ "1080p hd" ], "options": [] }, "asin": "B08XV5X86G" }, { "task_id": "ws_B094XVH5SR_11957", "instruction": "i want to find a white security camera system that produces high definition footage.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "white" ] }, "asin": "B094XVH5SR" }, { "task_id": "ws_B08RF3WW88_11958", "instruction": "i need space saving coat rack in the style of a contemporary branch.", "target_attributes": { "attributes": [ "space saving", "contemporary style" ], "options": [] }, "asin": "B08RF3WW88" }, { "task_id": "ws_B09MHXYT1Y_11959", "instruction": "i'm looking for cosmetic container need to buy a high quality green colored want to buy.", "target_attributes": { "attributes": [ "high quality" ], "options": [ "green" ] }, "asin": "B09MHXYT1Y" }, { "task_id": "ws_B07X7CKYBG_11960", "instruction": "i am looking for a dust proof cheapest 8 inch octa core tablet pc", "target_attributes": { "attributes": [ "dust proof" ], "options": [] }, "asin": "B07X7CKYBG" }, { "task_id": "ws_B0971B7XQ3_11961", "instruction": "i looking casual flat loose fitting open toe having ankle strap woman slipper size-9 ,color :z92 -camouflage", "target_attributes": { "attributes": [ "open toe", "loose fit", "ankle strap" ], "options": [ "z92-camouflage", "9" ] }, "asin": "B0971B7XQ3" }, { "task_id": "ws_B07S2H6J7T_11962", "instruction": "i want red bull energy drink sugar free.", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "energy drink" ] }, "asin": "B07S2H6J7T" }, { "task_id": "ws_B08CD2NJPH_11963", "instruction": "i am looking for long lasting and pink color gaming headset ps4 3.5 mm stereo wired", "target_attributes": { "attributes": [ "long lasting" ], "options": [ "pink" ] }, "asin": "B08CD2NJPH" }, { "task_id": "ws_B07X2QXM96_11964", "instruction": "i want to find a 3-pack of 50-foot long nylon microphone cables that are heavy duty.", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "50ft 3pack", "nylon" ] }, "asin": "B07X2QXM96" }, { "task_id": "ws_B07F2TFTRW_11965", "instruction": "i am looking for easy assemble and box spring mainstay 14\" high profile foldabel steel bed frame", "target_attributes": { "attributes": [ "easy assemble", "box spring" ], "options": [] }, "asin": "B07F2TFTRW" }, { "task_id": "ws_B07QN3K2XN_11966", "instruction": "i am looking for a tummy control high waist active short for woman ,size -x- small color : tie dye light blue", "target_attributes": { "attributes": [ "tummy control", "high waist" ], "options": [ "tie dye light blue", "x-small" ] }, "asin": "B07QN3K2XN" }, { "task_id": "ws_B07PJ1CXXY_11967", "instruction": "i am looking for a light weight jumpsuit which is washable in machine. also choose medium size and teal color.", "target_attributes": { "attributes": [ "light weight", "machine wash" ], "options": [ "n51, teal", "medium" ] }, "asin": "B07PJ1CXXY" }, { "task_id": "ws_B09HL9DTF5_11968", "instruction": "can you help me find a pair of women's high heel sandal with a rubber sole? i want bubble pink one and size 11.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "bubble pink", "11" ] }, "asin": "B09HL9DTF5" }, { "task_id": "ws_B07WLYZRZJ_11969", "instruction": "i'd like to find a soy wax candle that is scented to smell like the sea and citrus.", "target_attributes": { "attributes": [ "soy wax" ], "options": [ "seaside | citrus" ] }, "asin": "B07WLYZRZJ" }, { "task_id": "ws_B08BLBPWC5_11970", "instruction": "i want to find a 3x-large short-sleeve hawaiian shirt for men in the 1685 color.", "target_attributes": { "attributes": [ "short sleeve" ], "options": [ "1685", "3x-large" ] }, "asin": "B08BLBPWC5" }, { "task_id": "ws_B07J4L9VCX_11971", "instruction": "i want to buy some sulfate free body wash for sensitive skin. get me one that's peppermint scented.", "target_attributes": { "attributes": [ "sulfate free", "sensitive skin" ], "options": [ "sweet peppermint 1pk" ] }, "asin": "B07J4L9VCX" }, { "task_id": "ws_B07KLZJ8RH_11972", "instruction": "i am interested in solid wood storage cabinets.", "target_attributes": { "attributes": [ "solid wood" ], "options": [] }, "asin": "B07KLZJ8RH" }, { "task_id": "ws_B09NSDTJQ5_11973", "instruction": "i want to find an s22 ultra 2+2 screen protector that's easy to install, and it needs to be made of tempered glass.", "target_attributes": { "attributes": [ "ultra hd", "easy install", "glass screen", "tempered glass" ], "options": [ "s22 ultra 2+2" ] }, "asin": "B09NSDTJQ5" }, { "task_id": "ws_B08CDRZH7B_11974", "instruction": "i am looking easy use long curly hairpieces density top size -14 inch -130% density,color: medium brown -e", "target_attributes": { "attributes": [ "easy use" ], "options": [ "medium brown-e", "14 inch-130% density" ] }, "asin": "B08CDRZH7B" }, { "task_id": "ws_B09NWC91MH_11975", "instruction": "i want to find toothpaste that helps whiten teeth and kill bad breath.", "target_attributes": { "attributes": [ "teeth whitening", "bad breath" ], "options": [ "b" ] }, "asin": "B09NWC91MH" }, { "task_id": "ws_B001E0XSAE_11976", "instruction": "i am looking for a sandy golden blonde permanent hair color that is cruelty free. pick the 8g one.", "target_attributes": { "attributes": [ "cruelty free", "permanent hair" ], "options": [ "8g sandy golden blonde" ] }, "asin": "B001E0XSAE" }, { "task_id": "ws_B01JPENOTK_11977", "instruction": "i need argan oil lotion for anti aging hair treatment.", "target_attributes": { "attributes": [ "anti aging", "hair treatment" ], "options": [ "argan oil lotion" ] }, "asin": "B01JPENOTK" }, { "task_id": "ws_B07KY81F8T_11978", "instruction": "i am looking for a portable wireless security cameras with motion detection for home monitoring", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B07KY81F8T" }, { "task_id": "ws_B08PNW7WS8_11979", "instruction": "i'd like to buy some machine washable drapes for my living room. look for multicolored drapes that are one hundred and four by sixty-three inches.", "target_attributes": { "attributes": [ "machine washable", "living room" ], "options": [ "multi 60", "104\" x 63\"" ] }, "asin": "B08PNW7WS8" }, { "task_id": "ws_B08MZ9HY8Y_11980", "instruction": "i want an o christmas tree, large christmas gift basket.", "target_attributes": { "attributes": [ "gift basket" ], "options": [] }, "asin": "B08MZ9HY8Y" }, { "task_id": "ws_B075H6L5RC_11981", "instruction": "i want a satin nickel design house 578849 dane 4-light indoor bathroom vanity light.", "target_attributes": { "attributes": [ "vanity light" ], "options": [ "satin nickel" ] }, "asin": "B075H6L5RC" }, { "task_id": "ws_B08Y6K393G_11982", "instruction": "i would like a shower cap for my natural hair that has corgis on them.", "target_attributes": { "attributes": [ "natural hair" ], "options": [ "cute corgi" ] }, "asin": "B08Y6K393G" }, { "task_id": "ws_B089GRDSCZ_11983", "instruction": "camera is easy carry and it's high resolution photo are there ,also size:8x6.5ft.", "target_attributes": { "attributes": [ "high resolution", "easy carry" ], "options": [ "8x6.5ft" ] }, "asin": "B089GRDSCZ" }, { "task_id": "ws_B09MTLYMPM_11984", "instruction": "i am looking for women's high heel boots of 8.5 size and green one", "target_attributes": { "attributes": [ "high heel" ], "options": [ "green", "8.5" ] }, "asin": "B09MTLYMPM" }, { "task_id": "ws_B08TR29R32_11985", "instruction": "i want to find a pair of construction work shoes that are black and gray with rubber soles. they should come in a size 8 and be extra wide.", "target_attributes": { "attributes": [ "rubber sole" ], "options": [ "black+gray", "8 wide" ] }, "asin": "B08TR29R32" }, { "task_id": "ws_B07ZHXJT92_11986", "instruction": "i am looking for a cupcake topper for a birthday party. also choose black color", "target_attributes": { "attributes": [ "birthday party" ], "options": [ "black" ] }, "asin": "B07ZHXJT92" }, { "task_id": "ws_B08YY6XQGH_11987", "instruction": "i am looking for miracase glass case for iphone 12/ iphone 12 pro 6.1 inch with military grade protection support wireless charging without taking off the iphone 12/ iphone 12 pro. the 2 pieces design offers easy install only for iphone, cover the front case onto the face of iphone, purple color preferable.", "target_attributes": { "attributes": [ "easy install", "glass screen", "tempered glass", "wireless charging" ], "options": [ "purple" ] }, "asin": "B08YY6XQGH" }, { "task_id": "ws_B08T21G734_11988", "instruction": "i want to find a 3.5 foot printed backdrop that i can use for my digital photography.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "printed backdrop 07", "3x5 ft" ] }, "asin": "B08T21G734" }, { "task_id": "ws_B073BRKKV8_11989", "instruction": "i am looking for mally beauty h3 hydrating concealer which glides on smoothly and easily, providing excellent coverage on the areas you need it the most. that is lightweight, creamy formula gives skin the look of radiance, blurring the appearance of imperfections and softening the look of fine lines. medium size preferable.", "target_attributes": { "attributes": [ "anti aging", "hyaluronic acid" ], "options": [ "medium" ] }, "asin": "B073BRKKV8" }, { "task_id": "ws_B001H0FR6O_11990", "instruction": "i want big & tall levi's men's 550 relaxed fit jeans.", "target_attributes": { "attributes": [ "relaxed fit" ], "options": [ "big & tall" ] }, "asin": "B001H0FR6O" }, { "task_id": "ws_B09CNPZJTJ_11991", "instruction": "i need some cupcake toppers for a baby shower.", "target_attributes": { "attributes": [ "baby shower" ], "options": [] }, "asin": "B09CNPZJTJ" }, { "task_id": "ws_B08LPCBR3X_11992", "instruction": "i want a ownest 6 colors matte crayon lipstick for sensitive skin.", "target_attributes": { "attributes": [ "sensitive skin" ], "options": [] }, "asin": "B08LPCBR3X" }, { "task_id": "ws_B0065PZY1O_11993", "instruction": "i need a small chef jacket that has a button closure and is a charcoal color.", "target_attributes": { "attributes": [ "button closure" ], "options": [ "charcoal", "small" ] }, "asin": "B0065PZY1O" }, { "task_id": "ws_B072QY1N34_11994", "instruction": "i want a double sided pillow case that can be washed in a machine. choose a black and white one.", "target_attributes": { "attributes": [ "double sided", "machine washable" ], "options": [ "black and white" ] }, "asin": "B072QY1N34" }, { "task_id": "ws_B07RM5BDTF_11995", "instruction": "i use olive color moisture wicking", "target_attributes": { "attributes": [ "moisture wicking" ], "options": [ "olive" ] }, "asin": "B07RM5BDTF" }, { "task_id": "ws_B08WYD18X9_11996", "instruction": "i am looking for twin size bed. color should be light grey.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "light grey" ] }, "asin": "B08WYD18X9" }, { "task_id": "ws_B00CP53C6W_11997", "instruction": "i am looking for a victorian style queen size bed.", "target_attributes": { "attributes": [ "queen size" ], "options": [ "bed" ] }, "asin": "B00CP53C6W" }, { "task_id": "ws_B09JKMM837_11998", "instruction": "i am looking for kitchen bar table set in industrial brown and black color with space saving, easy clean , easy assemble option", "target_attributes": { "attributes": [ "space saving", "easy clean", "easy assemble" ], "options": [ "industrial brown and black", "kitchen bar table set" ] }, "asin": "B09JKMM837" }, { "task_id": "ws_B07TD6T9WP_11999", "instruction": "i am looking for a area rug for living room with easy to clean which is in rectangular shape. also choose gold color and 2ft 8in x 8ft in size", "target_attributes": { "attributes": [ "easy clean", "living room" ], "options": [ "gold", "rectangular", "2 ft 8 in x 8 ft" ] }, "asin": "B07TD6T9WP" }, { "task_id": "ws_B07R1WCC3H_12000", "instruction": "i want a 52\"x84\" 100% blackout window curtain for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "52\"x84\"" ] }, "asin": "B07R1WCC3H" }, { "task_id": "ws_B08R3V8RC1_12001", "instruction": "i looking a fruit & nut bar low sodium low carb gluteen free having dietry fiber individually wrapped flavor cocoa & chocolate", "target_attributes": { "attributes": [ "low sodium", "low carb", "gluten free", "individually wrapped", "dietary fiber" ], "options": [ "cocoa & chocolate" ] }, "asin": "B08R3V8RC1" }, { "task_id": "ws_B08ZGWYWXS_12002", "instruction": "i need a non gmo ginger candy pack with assorted flavors.", "target_attributes": { "attributes": [ "non gmo", "gluten free" ], "options": [ "assorted 2" ] }, "asin": "B08ZGWYWXS" }, { "task_id": "ws_B07GRQ7Q5F_12003", "instruction": "i need to buy a roller shade that's easy to install in my living room. get the mocha color, 79 inches wide.", "target_attributes": { "attributes": [ "easy install", "living room" ], "options": [ "11.mocha", "w79 3 | 4 x h95 (inch)" ] }, "asin": "B07GRQ7Q5F" }, { "task_id": "ws_B08PC4GGHL_12004", "instruction": "i am looking for verizon 700mhz cell phone signal booster which is easy to install with 4g lte. color 4g band 5 | 13 preferable.", "target_attributes": { "attributes": [ "easy install", "4g lte" ], "options": [ "4g band 5 | 13" ] }, "asin": "B08PC4GGHL" }, { "task_id": "ws_B09B3RQZLM_12005", "instruction": "i want a pink long sleeved t-shirt in size 12.", "target_attributes": { "attributes": [ "long sleeve" ], "options": [ "pink", "12" ] }, "asin": "B09B3RQZLM" }, { "task_id": "ws_B09PL5QXZM_12006", "instruction": "i am looking for face mask brushes for easy apply and easy carry with color blue", "target_attributes": { "attributes": [ "easy apply", "easy carry" ], "options": [ "blue" ] }, "asin": "B09PL5QXZM" }, { "task_id": "ws_B096FJX5RM_12007", "instruction": "i'm looking reddhoon 3 colors liquid glitter eyeshadow, i want color a12, show me the price too.", "target_attributes": { "attributes": [ "eye shadow" ], "options": [ "a12" ] }, "asin": "B096FJX5RM" }, { "task_id": "ws_B09KBZR5Y6_12008", "instruction": "i want a blue high definition android tablet 8 inch.", "target_attributes": { "attributes": [ "high definition" ], "options": [ "blue" ] }, "asin": "B09KBZR5Y6" }, { "task_id": "ws_B08T2122SB_12009", "instruction": "i am looking for some keto snacks that are grain free.", "target_attributes": { "attributes": [ "grain free", "keto friendly" ], "options": [] }, "asin": "B08T2122SB" }, { "task_id": "ws_B07QV3RKCB_12010", "instruction": "i am looking for gluten free and grass fed patties - 6 chipotle chicken + 6 thai style turkey", "target_attributes": { "attributes": [ "grass fed", "gluten free" ], "options": [ "6 chipotle chicken + 6 thai style turkey" ] }, "asin": "B07QV3RKCB" }, { "task_id": "ws_B09S6LTK2D_12011", "instruction": "i am looking for low rise cotton underwear. please choose sky blue color.", "target_attributes": { "attributes": [ "low rise" ], "options": [ "sky blue" ] }, "asin": "B09S6LTK2D" }, { "task_id": "ws_B088WFLJNF_12012", "instruction": "i need a black henley that is made of cotton spandex.", "target_attributes": { "attributes": [ "cotton spandex" ], "options": [ "a1 black", "x-large" ] }, "asin": "B088WFLJNF" }, { "task_id": "ws_B09QH2T5R3_12013", "instruction": "i am looking for purple color cotton heather assistants t-shirts for women with machine wash type and size : large", "target_attributes": { "attributes": [ "machine wash", "cotton heather" ], "options": [ "purple", "women", "large" ] }, "asin": "B09QH2T5R3" }, { "task_id": "ws_B09PNKGWYX_12014", "instruction": "i am looking for black knee high winter boots for women.", "target_attributes": { "attributes": [ "knee high" ], "options": [ "a03-black" ] }, "asin": "B09PNKGWYX" }, { "task_id": "ws_B09QCY1MGX_12015", "instruction": "i am looking for a light grey sectional couch that is easy to assemble for my living room.", "target_attributes": { "attributes": [ "living room" ], "options": [ "light grey" ] }, "asin": "B09QCY1MGX" }, { "task_id": "ws_B07XLG6HVZ_12016", "instruction": "i am looking for a high performance desktop tower with core i5. also choose refurbished from certified dealers.", "target_attributes": { "attributes": [ "certified refurbished", "high performance", "core i5" ], "options": [] }, "asin": "B07XLG6HVZ" }, { "task_id": "ws_B009JITV9U_12017", "instruction": "i am interested in flouride free mouthwash that is 1 oz", "target_attributes": { "attributes": [ "fluoride free" ], "options": [ "1 fl oz (pack of 2)" ] }, "asin": "B009JITV9U" }, { "task_id": "ws_B09NBZ5ZTL_12018", "instruction": "i want a wireless bluetooth speaker,portable audio mini music player,usb easy to carry rechargble usb port color: pink", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [ "pink" ] }, "asin": "B09NBZ5ZTL" }, { "task_id": "ws_B091GZRZ6K_12019", "instruction": "i'd like to find a teeth whitening kit that is not only easy to carry but also delivers high quality results.", "target_attributes": { "attributes": [ "teeth whitening", "easy carry", "high quality" ], "options": [] }, "asin": "B091GZRZ6K" }, { "task_id": "ws_B08LQCB4WJ_12020", "instruction": "i want to find a six-ounce plastic container jar that is leak proof and easy to use. ideally it will come in white.", "target_attributes": { "attributes": [ "leak proof", "easy use" ], "options": [ "white", "6 ounce" ] }, "asin": "B08LQCB4WJ" }, { "task_id": "ws_B07LGK3XR5_12021", "instruction": "i am interested in living room pendant lights that are white.", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [ "white color" ] }, "asin": "B07LGK3XR5" }, { "task_id": "ws_B09FQ6Y4N9_12022", "instruction": "find a red sweatshirt for a teen girl in size small.", "target_attributes": { "attributes": [ "teen girls" ], "options": [ "red", "small" ] }, "asin": "B09FQ6Y4N9" }, { "task_id": "ws_B084JTNDXH_12023", "instruction": "i want to find 3 dozen cookies that are individually wrapped and baked fresh for valentine's day.", "target_attributes": { "attributes": [ "baked fresh", "individually wrapped", "valentine day" ], "options": [ "3 dozen" ] }, "asin": "B084JTNDXH" }, { "task_id": "ws_B07D9JJH67_12024", "instruction": "i am looking for moisturizing shower gel with vegan , green tea and coconut oil and also mint argan scent", "target_attributes": { "attributes": [ "green tea", "coconut oil" ], "options": [ "mint argan" ] }, "asin": "B07D9JJH67" }, { "task_id": "ws_B07ST3YB1W_12025", "instruction": "i am looking for dell ultra small desktop computer with core i5 , 16gb ram , 256gb ssd and windows 10 pro", "target_attributes": { "attributes": [ "core i5" ], "options": [ "16gb ram | 256gb ssd" ] }, "asin": "B07ST3YB1W" }, { "task_id": "ws_B096WSKLRV_12026", "instruction": "i need a contemporary design acrylic leg bench for living room in navy velvet color.", "target_attributes": { "attributes": [ "contemporary design", "living room" ], "options": [ "navy velvet", "acrylic legs bench" ] }, "asin": "B096WSKLRV" }, { "task_id": "ws_B09R9PN89Q_12027", "instruction": "i need a machine washable costume tank top. pick a classic fit in navy.", "target_attributes": { "attributes": [ "machine wash", "classic fit" ], "options": [ "navy" ] }, "asin": "B09R9PN89Q" }, { "task_id": "ws_B07L9KXTM4_12028", "instruction": "show me this brand zeskit cinema plus 4k 1.5ft (2-pack) i'm looking for high speed with ethernet 22.28gbps hdmi 2.0b cable.", "target_attributes": { "attributes": [ "high speed" ], "options": [] }, "asin": "B07L9KXTM4" }, { "task_id": "ws_B09RBB5DTP_12029", "instruction": "i need a loose fitting tee for daily wear. find a x-large shirt.", "target_attributes": { "attributes": [ "loose fit", "daily wear" ], "options": [ "x-large" ] }, "asin": "B09RBB5DTP" }, { "task_id": "ws_B07ZXFTJ67_12030", "instruction": "i want spicy beef meat and cheese gift baskets.", "target_attributes": { "attributes": [ "gift basket" ], "options": [ "spicy beef" ] }, "asin": "B07ZXFTJ67" }, { "task_id": "ws_B0797QCG79_12031", "instruction": "i need a white high heel pump shoes with a rubber sole.", "target_attributes": { "attributes": [ "high heel", "rubber sole" ], "options": [ "white-matt" ] }, "asin": "B0797QCG79" }, { "task_id": "ws_B010AJ5DXY_12032", "instruction": "i need a plant based cleansing conditioner with coconut oil in it.", "target_attributes": { "attributes": [ "plant based", "coconut oil" ], "options": [] }, "asin": "B010AJ5DXY" }, { "task_id": "ws_B09DVP1Z8Q_12033", "instruction": "i am interested in monoculars that are good for bird watching.", "target_attributes": { "attributes": [ "bird watching" ], "options": [] }, "asin": "B09DVP1Z8Q" }, { "task_id": "ws_B07NJN4VJT_12034", "instruction": "i need a black camo headset with stereo sound and noise cancelling microphone.", "target_attributes": { "attributes": [ "noise cancelling", "stereo sound" ], "options": [ "black camo" ] }, "asin": "B07NJN4VJT" }, { "task_id": "ws_B0819ZH1RC_12035", "instruction": "i want coconut scented hask invigorating tea tree oil.", "target_attributes": { "attributes": [ "tea tree" ], "options": [ "coconut monoi" ] }, "asin": "B0819ZH1RC" }, { "task_id": "ws_B09MLRX3H7_12036", "instruction": "i need a grey twin sized bed.", "target_attributes": { "attributes": [ "twin size" ], "options": [ "grey+slide" ] }, "asin": "B09MLRX3H7" }, { "task_id": "ws_B096FSKXTD_12037", "instruction": "i want by a haoch cotton spa massage treatment table bed cover eco friendly, size 70x190cm please show me.", "target_attributes": { "attributes": [ "eco friendly" ], "options": [ "70x190cm" ] }, "asin": "B096FSKXTD" }, { "task_id": "ws_B07MTLTRHD_12038", "instruction": "i am looking for a office chair ready use assembly required color: heron with tilt feature", "target_attributes": { "attributes": [ "ready use", "assembly required" ], "options": [ "heron | with tilt feature" ] }, "asin": "B07MTLTRHD" }, { "task_id": "ws_B09DPXST7F_12039", "instruction": "i like motion detection machine in white color", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B09DPXST7F" }, { "task_id": "ws_B09PJDHN14_12040", "instruction": "i am looking for long sleeve wide leg daily casual medium size jumpsuit for young woman color :b-white", "target_attributes": { "attributes": [ "daily casual", "wide leg", "long sleeve" ], "options": [ "b-white", "medium" ] }, "asin": "B09PJDHN14" }, { "task_id": "ws_B001BM4RC8_12041", "instruction": "i need unsalted blue corn tortillas which are non gmo, gluten free and are certified organic.", "target_attributes": { "attributes": [ "certified organic", "non gmo", "gluten free" ], "options": [ "unsalted blue corn" ] }, "asin": "B001BM4RC8" }, { "task_id": "ws_B08F4WC928_12042", "instruction": "i am looking wireless home security camera for motion detection 1080hd", "target_attributes": { "attributes": [ "1080p hd", "motion detection" ], "options": [] }, "asin": "B08F4WC928" }, { "task_id": "ws_B08738RTBF_12043", "instruction": "i want to find a pair of black men's workout shorts with an elastic waistband. the shorts need to be in size 30.", "target_attributes": { "attributes": [ "elastic waistband" ], "options": [ "#1 black", "30" ] }, "asin": "B08738RTBF" }, { "task_id": "ws_B08JG22BX6_12044", "instruction": "i want to find a mini home security camera that has a motion detection feature.", "target_attributes": { "attributes": [ "motion detection" ], "options": [] }, "asin": "B08JG22BX6" }, { "task_id": "ws_B08L24QYC1_12045", "instruction": "i am looking for stirrings simple cosmopolitan non-alcoholic cocktail mix which is non alcoholic and made up with real fruit. cosmopolitan cocktail mix flavor preferable.", "target_attributes": { "attributes": [ "non alcoholic", "real fruit" ], "options": [ "cosmopolitan cocktail mix" ] }, "asin": "B08L24QYC1" }, { "task_id": "ws_B07PRFZ25L_12046", "instruction": "i need a background for digital photography that is 10ft by 7ft.", "target_attributes": { "attributes": [ "digital photography" ], "options": [ "10x7ft" ] }, "asin": "B07PRFZ25L" }, { "task_id": "ws_B09H5GJCML_12047", "instruction": "i am interested in a home theatre system that has stereo sound", "target_attributes": { "attributes": [ "stereo sound" ], "options": [] }, "asin": "B09H5GJCML" }, { "task_id": "ws_B07TLNZL9W_12048", "instruction": "i want an officially licensed navy teenage mutant ninja turtles chillin' tank top.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "navy" ] }, "asin": "B07TLNZL9W" }, { "task_id": "ws_B003EWKPSI_12049", "instruction": "for my work i want pro studio solutions ez pro beauty dish octagon softbox 60in (150 cm) with speedring, sturdy. contact me if you find", "target_attributes": { "attributes": [ "heavy duty" ], "options": [ "60in (150cm)" ] }, "asin": "B003EWKPSI" }, { "task_id": "ws_B08S7F8F17_12050", "instruction": "i am looking for a hand decorated valentine day cookies gift set. it should be perfect.", "target_attributes": { "attributes": [ "valentine day", "perfect gift" ], "options": [] }, "asin": "B08S7F8F17" }, { "task_id": "ws_B0885R9QCJ_12051", "instruction": "i need to buy some shave oil for dry skin with argan oil in it.", "target_attributes": { "attributes": [ "argan oil", "dry skin" ], "options": [] }, "asin": "B0885R9QCJ" }, { "task_id": "ws_B005II6BUC_12052", "instruction": "i want to find an 11 inch light fixture with a bronze finish that i can put outside.", "target_attributes": { "attributes": [ "bronze finish", "light fixture" ], "options": [ "11\" w led" ] }, "asin": "B005II6BUC" }, { "task_id": "ws_B09287QZSX_12053", "instruction": "i want to find a black-colored waxing kit for women that can help remove hair using natural ingredients.", "target_attributes": { "attributes": [ "natural ingredients", "hair removal" ], "options": [ "black" ] }, "asin": "B09287QZSX" }, { "task_id": "ws_B09JZF19JN_12054", "instruction": "i'm looking for fine mist it can the bottle continues the stream of water.", "target_attributes": { "attributes": [ "fine mist" ], "options": [] }, "asin": "B09JZF19JN" }, { "task_id": "ws_B09PJP57GD_12055", "instruction": "i am looking for a men's t-shirt with a fruit motif that is machine washable.", "target_attributes": { "attributes": [ "machine wash" ], "options": [ "men" ] }, "asin": "B09PJP57GD" }, { "task_id": "ws_B08VRBPZJF_12056", "instruction": "i am in need of memory foam slippers that are in a size 5.5.-7.5 women.", "target_attributes": { "attributes": [ "memory foam" ], "options": [ "5.5-7.5 women | 4.5-6.5 men" ] }, "asin": "B08VRBPZJF" }, { "task_id": "ws_B09MKW5WTF_12057", "instruction": "i like ax color synthetic hair", "target_attributes": { "attributes": [ "synthetic hair" ], "options": [ "a" ] }, "asin": "B09MKW5WTF" }, { "task_id": "ws_B092DDRXTQ_12058", "instruction": "it was time for his food high density breakfast, so kitchen background color is black", "target_attributes": { "attributes": [ "high density" ], "options": [ "black" ] }, "asin": "B092DDRXTQ" }, { "task_id": "ws_B09RH5VMGX_12059", "instruction": "i am looking for a swimsuit with tummy control for a women. also choose navy color and small size.", "target_attributes": { "attributes": [ "tummy control" ], "options": [ "a1_navy", "small" ] }, "asin": "B09RH5VMGX" }, { "task_id": "ws_B07V6D1G16_12060", "instruction": "i am looking for a women's wine red prom dress with a lace closure.", "target_attributes": { "attributes": [ "lace closure" ], "options": [ "wine red" ] }, "asin": "B07V6D1G16" }, { "task_id": "ws_B085YB2DRL_12061", "instruction": "i am interested in some chocolate grain free granola.", "target_attributes": { "attributes": [ "grain free" ], "options": [ "chocolate" ] }, "asin": "B085YB2DRL" }, { "task_id": "ws_B07K1MJP78_12062", "instruction": "i want to find a gold pendant light for my living room ceiling.", "target_attributes": { "attributes": [ "pendant light", "living room" ], "options": [ "gold" ] }, "asin": "B07K1MJP78" }, { "task_id": "ws_B09C8D3ZHK_12063", "instruction": "i need some folding tables that are easy to assemble and are white.", "target_attributes": { "attributes": [ "easy assemble" ], "options": [ "white" ] }, "asin": "B09C8D3ZHK" }, { "task_id": "ws_B09JRKJ35C_12064", "instruction": "painting my living room with multi 31 color", "target_attributes": { "attributes": [ "living room" ], "options": [ "multi 31" ] }, "asin": "B09JRKJ35C" }, { "task_id": "ws_B01IP5MBSU_12065", "instruction": "i am looking for wireless bluetooth speaker.", "target_attributes": { "attributes": [ "wireless bluetooth" ], "options": [] }, "asin": "B01IP5MBSU" }, { "task_id": "ws_B01I5N7JMU_12066", "instruction": "i want to find a rinse that can treat my hair and promote hair growth.", "target_attributes": { "attributes": [ "hair treatment", "hair growth" ], "options": [] }, "asin": "B01I5N7JMU" }, { "task_id": "ws_B08QVM52CQ_12067", "instruction": "i need a cake topper for a birthday party", "target_attributes": { "attributes": [ "birthday party" ], "options": [] }, "asin": "B08QVM52CQ" }, { "task_id": "ws_B09B9WRP24_12068", "instruction": "i want to find a pair of pink women's sneakers with good arch support. they need to come in a size 8.5.", "target_attributes": { "attributes": [ "arch support" ], "options": [ "z6-pink", "8.5" ] }, "asin": "B09B9WRP24" }, { "task_id": "ws_B016B10NAS_12069", "instruction": "i would like a extra round 53mm brush for hair styling.", "target_attributes": { "attributes": [ "hair styling" ], "options": [ "extra round brush 53mm" ] }, "asin": "B016B10NAS" }, { "task_id": "ws_B092V9RY16_12070", "instruction": "i want to find a silver case with a glass screen protector for my phone.", "target_attributes": { "attributes": [ "case cover", "glass screen" ], "options": [ "silver" ] }, "asin": "B092V9RY16" }, { "task_id": "ws_B09DV1GMLP_12071", "instruction": "i am looking for gua sha facial tools set which mattifying face roller for oily and acne prone skin, dark circles, fine lines beauty tools and high-pigment, the bold color makeup.", "target_attributes": { "attributes": [ "dark circles", "fine lines" ], "options": [] }, "asin": "B09DV1GMLP" }, { "task_id": "ws_B09D7TVJKT_12072", "instruction": "a bath sponge for bathing remove dead skin easy clean pink color size 8.5*6 inch", "target_attributes": { "attributes": [ "easy clean", "dead skin" ], "options": [ "pink", "8.5x6inch" ] }, "asin": "B09D7TVJKT" }, { "task_id": "ws_B07PK1NZY6_12073", "instruction": "i want an officially licensed white marvel guardians of the galaxy retro logo tee.", "target_attributes": { "attributes": [ "officially licensed" ], "options": [ "white" ] }, "asin": "B07PK1NZY6" }, { "task_id": "ws_B07QBPL36R_12074", "instruction": "i am looking for sugar free beverages with lemonade and 0.14 ounce (pack of 4)", "target_attributes": { "attributes": [ "sugar free" ], "options": [ "lemonade", "0.14 ounce (pack of 4)" ] }, "asin": "B07QBPL36R" }, { "task_id": "ws_B07JMF85DY_12075", "instruction": "search the electronics department, computers & tablets for a renewed rugged 11.6 inch screen with 8 gigabytes of data. model number 7202. must be certified refurbished and high performance.", "target_attributes": { "attributes": [ "certified refurbished", "high performance" ], "options": [] }, "asin": "B07JMF85DY" }, { "task_id": "ws_B0962P6LCS_12076", "instruction": "i am looking for ataiwee women's wide width ballet flats which is well made of soft leather, flexible tpr out-sole, lightweight and comfortable. tan 1905019-5, 9 wide size preferable.", "target_attributes": { "attributes": [ "anti slip", "rubber sole" ], "options": [ "9 wide" ] }, "asin": "B0962P6LCS" }, { "task_id": "ws_B07DKVQTXT_12077", "instruction": "i'm looking for a solid wood bookcase in espresso color. would prefer it to be in the size of 5-shelf.", "target_attributes": { "attributes": [ "solid wood" ], "options": [ "espresso (new)", "5-shelf" ] }, "asin": "B07DKVQTXT" }, { "task_id": "ws_B000R30X2A_12078", "instruction": "i want capri sun pacific cooler mixed fruit naturally flavored juice drinks.", "target_attributes": { "attributes": [ "natural ingredients" ], "options": [ "pacific cooler" ] }, "asin": "B000R30X2A" }, { "task_id": "ws_B07LC6DF3G_12079", "instruction": "i want to find high volume 71a mink lashes that are cruelty-free and easy to apply.", "target_attributes": { "attributes": [ "easy apply", "cruelty free" ], "options": [ "71a" ] }, "asin": "B07LC6DF3G" }, { "task_id": "ws_B07TB1TCXK_12080", "instruction": "i am looking for protein bites by protein power ball organic plant based pumpkin protein powder ideal for healthy, on the go nutrition for men, women, and kids. usda organic, vegan, gluten free, dairy free, lactose free, low net carbs, no added sugar, soy free, kosher, non gmo, carrageenan free, and no artificial ingredients 4.5 ounce (pack of 4) preferable.", "target_attributes": { "attributes": [ "soy free", "dairy free", "gluten free", "protein serving", "keto friendly", "high protein", "plant based", "non gmo", "resealable bag" ], "options": [ "pumpkin", "4.5 ounce (pack of 4)" ] }, "asin": "B07TB1TCXK" }, { "task_id": "ws_B00286361O_12081", "instruction": "i want to find a six-pack of 32 ounce packages of raisins that have no added artificial flavors.", "target_attributes": { "attributes": [ "artificial flavors" ], "options": [ "32 ounce (pack of 6)" ] }, "asin": "B00286361O" }, { "task_id": "ws_B09436HZFC_12082", "instruction": "i am looking for natural flavor clear fruit water 20 ounce bottles non carbonated water beverage which is caffeine free . 6 flavor sampler flavor preferable.", "target_attributes": { "attributes": [ "caffeine free", "natural flavors" ], "options": [ "6 flavor sampler" ] }, "asin": "B09436HZFC" }, { "task_id": "ws_B09PV47N89_12083", "instruction": "i am looking for 10x10ft | 3x3m high resolution backdrops for photo studio", "target_attributes": { "attributes": [ "high resolution" ], "options": [ "10x10ft | 3x3m" ] }, "asin": "B09PV47N89" }, { "task_id": "ws_B09QZPKF8N_12084", "instruction": "i am looking for twin bunk bed with slide & ladder , assembly required and also color is black", "target_attributes": { "attributes": [ "assembly required" ], "options": [ "black" ] }, "asin": "B09QZPKF8N" }, { "task_id": "ws_B08TM1D58H_12085", "instruction": "i want to find a white security camera that is easy to install.", "target_attributes": { "attributes": [ "easy install" ], "options": [ "2.white" ] }, "asin": "B08TM1D58H" }, { "task_id": "ws_B074W81C8L_12086", "instruction": "i want an xx-large light grey colored jogger pants with zipper pockets.", "target_attributes": { "attributes": [ "light weight" ], "options": [ "xx-large" ] }, "asin": "B074W81C8L" } ] ================================================ FILE: contrib/recipes/webshop/aml/compute.yml ================================================ # Azure ML Compute Cluster for WebShop Training # # Creates a GPU compute cluster with A100 GPUs for VERL training. # Auto-scales from 0-1 nodes to minimize costs when idle. # # Usage: # az ml compute create -f compute.yml -g -w $schema: https://azuremlschemas.azureedge.net/latest/amlCompute.schema.json name: gpu-a100-cluster type: amlcompute size: Standard_NC24ads_A100_v4 # A100 40GB GPU, 24 vCPU, 220 GB RAM min_instances: 0 max_instances: 1 idle_time_before_scale_down: 600 # 10 minutes tier: Dedicated ================================================ FILE: contrib/recipes/webshop/aml/jobs/webshop-qwen.yml ================================================ # Copyright (c) Microsoft. All rights reserved. # Azure ML command job for WebShop agent training with Qwen model. # # Submit from repo root: # az ml job create -f contrib/recipes/webshop/aml/jobs/webshop-qwen.yml --stream \ # --set environment_variables.HF_TOKEN="$HF_TOKEN" \ # --set environment_variables.WANDB_API_KEY="$WANDB_API_KEY" $schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json type: command display_name: webshop-qwen experiment_name: webshop-training # Submit full repo so uv.lock and pyproject.toml are available code: ../../../../.. command: >- bash contrib/recipes/webshop/aml/run_webshop_aml.sh qwen compute: azureml:gpu-a100-cluster resources: instance_count: 1 # Image-only environment to avoid conda overlay issues environment: image: mcr.microsoft.com/azureml/openmpi5.0-cuda12.6-ubuntu24.04:latest environment_variables: # Dependency lane: legacy|stable|latest (matches upstream CI concept) SETUP_SCRIPT: stable # Debug and performance NCCL_DEBUG: INFO PYTHONUNBUFFERED: "1" # Enable vLLM V1 mode - build tools are installed at runtime VLLM_USE_V1: "1" # Logging verbosity (use DEBUG to show span pipeline diagnostics) LOG_LEVEL: INFO # Number of headless runners N_RUNNERS: "2" # HF_TOKEN and WANDB_API_KEY should be passed via --set at submit time ================================================ FILE: contrib/recipes/webshop/aml/run_webshop_aml.sh ================================================ #!/usr/bin/env bash # Copyright (c) Microsoft. All rights reserved. # Runtime launcher script for WebShop agent training on Azure ML. # # This script installs dependencies using uv sync (locked) and runs training, # avoiding the conda overlay issues that cause flash-attn and vLLM failures. # # Usage: # ./run_webshop_aml.sh [config] [setup_script] # # Arguments: # config - Training config: dev|fast|qwen (default: qwen) # setup_script - Dependency lane: legacy|stable|latest (default: stable) set -euo pipefail CONFIG="${1:-qwen}" SETUP_SCRIPT="${SETUP_SCRIPT:-${2:-stable}}" echo "== WebShop AML Job ==" echo "Config: ${CONFIG}" echo "Setup script: ${SETUP_SCRIPT}" echo "" echo "== Diagnostics ==" nvidia-smi || true python -V || true which python || true df -h || true echo "" # Recommended caches (avoid re-downloading HF/W&B repeatedly) export HF_HOME="${HF_HOME:-$PWD/.cache/huggingface}" export TRANSFORMERS_CACHE="${TRANSFORMERS_CACHE:-$HF_HOME/transformers}" export HF_DATASETS_CACHE="${HF_DATASETS_CACHE:-$HF_HOME/datasets}" export WANDB_DIR="${WANDB_DIR:-$PWD/.cache/wandb}" # Ray/vLLM often benefit from higher fd limits ulimit -n 65535 || true # Install build tools needed for vLLM V1 torch.compile/Triton echo "== Installing build dependencies ==" apt-get update && apt-get install -y --no-install-recommends \ gcc g++ python3-dev curl wget gnupg ca-certificates || true # Install Node.js 20 + pnpm for headless runner echo "== Installing Node.js 20 ==" curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt-get install -y --no-install-recommends nodejs npm install -g pnpm # Install Java 21 for pyserini (WebShop search engine) echo "== Installing Java 21 (Temurin) ==" # Create man page directories (missing in minimal containers, causes dpkg failures) mkdir -p /usr/share/man/man1 mkdir -p /etc/apt/keyrings wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor -o /etc/apt/keyrings/adoptium.gpg echo "deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb noble main" > /etc/apt/sources.list.d/adoptium.list apt-get update && apt-get install -y --no-install-recommends temurin-21-jdk export JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64 export PATH="${JAVA_HOME}/bin:${PATH}" # Ensure pip tooling is sane echo "== Installing uv ==" python -m pip install -U pip python -m pip install -U uv # Install dependencies using uv sync with locked versions. # This mirrors upstream "Examples - Spider" CI approach. echo "== Installing Python dependencies with uv sync (${SETUP_SCRIPT}) ==" uv sync --frozen --no-default-groups --extra verl \ --group dev --group experiment --group agents --group "torch-gpu-${SETUP_SCRIPT}" # Use explicit venv Python path to avoid conda/system Python conflicts VENV_PYTHON=".venv/bin/python" echo "Using Python: $VENV_PYTHON" $VENV_PYTHON --version # Install WebShop Python dependencies using uv pip (uv doesn't install pip into venv) echo "== Installing WebShop server dependencies ==" uv pip install --no-cache -r contrib/recipes/webshop/server/requirements.txt || { echo "ERROR: Failed to install server requirements" exit 1 } uv pip install --no-cache -r contrib/recipes/webshop/agl/requirements.txt || { echo "ERROR: Failed to install agl requirements" exit 1 } # Verify critical packages are installed echo "== Verifying critical packages ==" $VENV_PYTHON -c "import cleantext; print(f'cleantext version: {cleantext.__version__}')" || { echo "ERROR: cleantext not installed, trying explicit install..." uv pip install "cleantext>=1.1.4" } $VENV_PYTHON -c "import pyserini; print('pyserini OK')" || echo "WARNING: pyserini not available" # Download spacy model (required by WebShop's web_agent_site) echo "== Downloading spaCy model en_core_web_sm ==" $VENV_PYTHON -m spacy download en_core_web_sm || { echo "WARNING: spacy download failed, trying uv pip install..." uv pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl } # Verify spacy model is available $VENV_PYTHON -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('spaCy model en_core_web_sm loaded successfully')" || { echo "ERROR: Failed to load spaCy model en_core_web_sm" echo "Attempting fallback install..." uv pip install en_core_web_sm@https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl $VENV_PYTHON -c "import spacy; nlp = spacy.load('en_core_web_sm'); print('spaCy model loaded after fallback')" || { echo "FATAL: Cannot load spaCy model, WebShop will fail" exit 1 } } # Activate for subsequent commands (ray, etc.) source .venv/bin/activate # Install Node.js dependencies for headless runner echo "== Installing Node.js dependencies ==" cd contrib/recipes/webshop pnpm install --frozen-lockfile || pnpm install cd ../../.. # Start Ray cluster echo "== Starting Ray cluster ==" if [[ -f "./scripts/restart_ray.sh" ]]; then ./scripts/restart_ray.sh else ray stop --force || true env RAY_DEBUG=legacy HYDRA_FULL_ERROR=1 ray start --head --disable-usage-stats fi sleep 5 # Run training echo "== Starting WebShop training ==" cd contrib/recipes/webshop # Debug: list scripts directory echo "Contents of scripts/:" ls -la scripts/ || echo "scripts/ directory not found!" # Make script executable and run if [[ -f "scripts/run_stack.sh" ]]; then chmod +x scripts/run_stack.sh PYTHONUNBUFFERED=1 bash scripts/run_stack.sh "${CONFIG}" else echo "ERROR: scripts/run_stack.sh not found!" echo "Current directory: $(pwd)" echo "Directory listing:" ls -la exit 1 fi ================================================ FILE: contrib/recipes/webshop/package.json ================================================ { "name": "@example/webshop-training", "version": "0.0.0", "private": true, "scripts": { "build:headless": "tsup scripts/headless-runner.ts --format cjs --out-dir dist --clean", "headless": "node dist/headless-runner.js" }, "dependencies": { "@ai-sdk/openai": "3.0.0-beta.89", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.57.0", "@opentelemetry/resources": "^1.30.0", "@opentelemetry/sdk-trace-base": "^1.30.0", "@opentelemetry/semantic-conventions": "^1.30.0", "ai": "6.0.0-beta.139", "zod": "3.25.76" }, "devDependencies": { "@types/node": "20.17.24", "tsup": "^8.0.0", "tsx": "^4.19.0", "typescript": "5.8.3" } } ================================================ FILE: contrib/recipes/webshop/scripts/headless-runner.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Headless WebShop Rollout Runner * * Continuously dequeues rollouts from Agent Lightning Store and executes them * without the UI. Reports results back via REST API. * * Usage: * npx tsx scripts/headless-runner.ts --worker-id runner-1 * npx tsx scripts/headless-runner.ts --once # Run single task and exit * * Environment Variables: * AGENT_LIGHTNING_STORE_URL - Agent Lightning Store URL (required) * WEBSHOP_URL - WebShop server URL (default: http://localhost:3000) * OPENAI_API_KEY - OpenAI API key * OPENAI_API_BASE - OpenAI-compatible endpoint base URL * WEBSHOP_MODEL - Model ID to use (default: gpt-4o-mini) * AGENT_LIGHTNING_SERVICE_NAME - Service name for tracing */ import { createOpenAI } from '@ai-sdk/openai'; import { generateText } from 'ai'; import { AgentLightningStoreClient, createRolloutTracer, getOtlpEndpoint, emitReward, getProxyLLMBaseUrl, getMainLLM, isProxyLLM, type AttemptedRollout, type ProxyLLMResource, type LLMResource, } from '../src/utils/agentlightning'; import { WebShopServerEnv } from '../src/environment/webshop-server'; import { WEBSHOP_SYSTEM_PROMPT } from '../src/agent/prompts'; interface RunnerOptions { workerId: string; pollIntervalMs: number; once: boolean; maxSteps: number; } interface WebShopTask { task_id: string; instruction: string; target_attributes?: Record; } /** * Parse action from model response text. * Looks for search[...] or click[...] patterns. */ function parseAction(text: string): string | null { // Look for search[...] pattern const searchMatch = text.match(/search\[([^\]]+)\]/i); if (searchMatch) return `search[${searchMatch[1]}]`; // Look for click[...] pattern const clickMatch = text.match(/click\[([^\]]+)\]/i); if (clickMatch) return `click[${clickMatch[1]}]`; // Look for buy now const buyMatch = text.match(/buy\s*now|buy\[\]/i); if (buyMatch) return 'click[Buy Now]'; return null; } /** * Result of action validation. */ interface ValidationResult { valid: boolean; feedback?: string; } /** * Validate action format and detect common errors (e.g., placeholder text). * Returns feedback to help the model correct its output. */ function validateAction(action: string): ValidationResult { // Detect literal placeholder text from prompts const placeholderPatterns = [ { pattern: /^search\[(query|your query here)\]$/i, feedback: 'Invalid: Replace "query" with actual search terms from the task. Example: search[red t-shirt size large]' }, { pattern: /^click\[(element|exact text)\]$/i, feedback: 'Invalid: Replace "element" with a specific product ID or button text from the observation.' }, { pattern: /^search\[\.\.\.?\]$/i, feedback: 'Invalid: Replace "..." with actual search terms. Example: search[blue running shoes size 10]' }, ]; for (const { pattern, feedback } of placeholderPatterns) { if (pattern.test(action)) { return { valid: false, feedback }; } } // Validate search has meaningful content (at least 3 characters) const searchMatch = action.match(/search\[([^\]]+)\]/i); if (searchMatch && searchMatch[1].trim().length < 3) { return { valid: false, feedback: 'Invalid: Search query too short. Include product type and attributes from the task.', }; } return { valid: true }; } /** * Execute a single rollout. */ async function runRollout( rollout: AttemptedRollout, storeClient: AgentLightningStoreClient, options: RunnerOptions, llmResource: ProxyLLMResource | LLMResource | null ): Promise { const { rollout_id, attempt } = rollout; const { attempt_id } = attempt; const task = rollout.input as WebShopTask; console.log(`[TASK] ${options.workerId} | rollout=${rollout_id.slice(0, 8)}... | ${task.instruction.slice(0, 60)}...`); // Initialize WebShop environment const webshopUrl = process.env.WEBSHOP_URL ?? 'http://localhost:3000'; const env = new WebShopServerEnv({ baseUrl: webshopUrl, timeoutMs: 30_000 }); // Reset environment with task try { await env.reset({ task: { taskId: task.task_id, instruction: task.instruction, targetAttributes: task.target_attributes ?? {}, }, }); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error( `[${options.workerId}] Failed to reset environment:`, errorMessage ); await storeClient.completeAttempt(rollout_id, attempt_id, { success: false, error: `Failed to reset environment: ${errorMessage}`, }); return; } // Create OpenAI-compatible client // Priority: 1. LLM resource from Store (with rollout routing), 2. OPENAI_API_BASE env var let baseURL: string | undefined; let modelId = process.env.WEBSHOP_MODEL ?? 'gpt-4o-mini'; if (llmResource) { // Use the LLM resource from the Store if (isProxyLLM(llmResource)) { // ProxyLLM: construct routed endpoint for proper trace attribution baseURL = getProxyLLMBaseUrl(llmResource, rollout_id, attempt_id); } else { // Regular LLM: use endpoint directly baseURL = llmResource.endpoint; } modelId = llmResource.model; console.log(`[${options.workerId}] Using LLM Proxy: ${baseURL} (model: ${modelId})`); } else if (process.env.OPENAI_API_BASE) { // Fallback to environment variable baseURL = process.env.OPENAI_API_BASE; console.log(`[${options.workerId}] Using OPENAI_API_BASE: ${baseURL}`); } const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY ?? 'dummy', ...(baseURL && { baseURL }), }); // Create tracer for this rollout (custom telemetry with token IDs for training) const otlpEndpoint = getOtlpEndpoint(); const serviceName = process.env.AGENT_LIGHTNING_SERVICE_NAME ?? 'webshop-headless-runner'; let provider: Awaited>['provider'] | undefined; let tracer: Awaited>['tracer'] | undefined; if (otlpEndpoint) { console.log(`[${options.workerId}] Tracing enabled: ${otlpEndpoint}`); const result = createRolloutTracer({ otlpEndpoint, serviceName, rolloutId: rollout_id, attemptId: attempt_id, }); provider = result.provider; tracer = result.tracer; } else { console.log(`[${options.workerId}] Tracing DISABLED (no OTLP endpoint)`); } try { // Execute agent loop let stepCount = 0; let done = false; let reward = 0; let currentObservation = env.getState().observation; while (!done && stepCount < options.maxSteps) { stepCount++; // Construct the prompt for this step let stepPrompt = `Task: ${task.instruction}\n\nCurrent observation:\n${currentObservation}\n\nWhat action should I take next? Respond with a single action like search[your search terms] or click[button text].`; // Retry loop for invalid actions (max 2 retries) const MAX_RETRIES = 2; let action: string | null = null; let retryCount = 0; while (retryCount <= MAX_RETRIES) { // Generate next action using the model const response = await generateText({ model: openai(modelId), system: WEBSHOP_SYSTEM_PROMPT, prompt: stepPrompt, }); // Parse action from response action = parseAction(response.text); if (!action) { console.log( `[${options.workerId}] Step ${stepCount}: Could not parse action from: ${response.text.slice(0, 100)}...` ); // Try to extract any actionable text const fallbackAction = response.text.includes('search') ? 'search[product]' : response.text.includes('click') ? 'click[Buy Now]' : null; if (!fallbackAction) break; action = fallbackAction; } // Validate the action format const validation = validateAction(action); if (validation.valid) { break; // Action is valid, proceed } // Action is invalid, retry with feedback retryCount++; if (retryCount <= MAX_RETRIES) { console.log( `[${options.workerId}] Step ${stepCount}: Invalid action "${action}" - ${validation.feedback} (retry ${retryCount}/${MAX_RETRIES})` ); stepPrompt = `Task: ${task.instruction}\n\nCurrent observation:\n${currentObservation}\n\nPrevious action was invalid: ${validation.feedback}\n\nWhat action should I take? Respond with a single action.`; } else { console.log( `[${options.workerId}] Step ${stepCount}: Max retries reached for invalid action "${action}"` ); } } // If no valid action after retries, skip this step if (!action) break; // Execute action const result = await env.step(action); currentObservation = result.observation; done = result.done; reward = result.reward ?? 0; // Compact step log for easy filtering with grep const resultIcon = done ? (reward > 0 ? '✓' : '✗') : '→'; console.log(`[STEP] ${stepCount}. ${action} ${resultIcon}${done ? ` reward=${reward.toFixed(2)}` : ''}`); } // Emit reward span so the daemon can extract final_reward from traces // This must happen BEFORE flushing traces if (tracer) { emitReward(tracer, reward); } // Flush traces BEFORE completing the attempt to avoid race condition // The coordinator queries for spans immediately when it sees the rollout is complete if (provider) { console.log(`[${options.workerId}] Flushing traces to ${otlpEndpoint}...`); const flushStart = Date.now(); await provider.forceFlush(); const flushDuration = Date.now() - flushStart; console.log(`[${options.workerId}] Traces flushed in ${flushDuration}ms for rollout ${rollout_id.slice(0, 8)}...`); } // Report success await storeClient.completeAttempt(rollout_id, attempt_id, { success: reward > 0, reward, }); // Summary log for training progress tracking const status = reward > 0 ? 'SUCCESS' : 'FAIL'; console.log(`[DONE] ${options.workerId} | reward=${reward.toFixed(2)} | steps=${stepCount} | ${status}`); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error( `[${options.workerId}] Rollout ${rollout_id} failed:`, errorMessage ); // Flush traces before reporting error too if (provider) { await provider.forceFlush().catch(() => {}); } await storeClient.completeAttempt(rollout_id, attempt_id, { success: false, error: errorMessage, }); } } /** * Main runner loop. */ async function runLoop(options: RunnerOptions): Promise { const storeUrl = process.env.AGENT_LIGHTNING_STORE_URL; if (!storeUrl) { console.error('Error: AGENT_LIGHTNING_STORE_URL environment variable is not set'); process.exit(1); } const storeClient = new AgentLightningStoreClient({ baseUrl: storeUrl }); // Check if store is healthy const healthy = await storeClient.health(); if (!healthy) { console.error(`Error: Agent Lightning Store at ${storeUrl} is not healthy`); process.exit(1); } console.log(`[${options.workerId}] Starting headless runner`); console.log(`[${options.workerId}] Store URL: ${storeUrl}`); console.log(`[${options.workerId}] Poll interval: ${options.pollIntervalMs}ms`); console.log(`[${options.workerId}] Max steps per task: ${options.maxSteps}`); // Track consecutive errors to detect server shutdown let consecutiveErrors = 0; const MAX_CONSECUTIVE_ERRORS = 3; while (true) { try { // Try to dequeue a rollout const rollouts = await storeClient.dequeueRollouts(1, options.workerId); if (rollouts.length > 0) { // Fetch LLM resource from Store on each rollout (not cached at startup) // This ensures we discover the vLLM endpoint after VERL registers it let llmResource: ProxyLLMResource | LLMResource | null = null; const resources = await storeClient.getLatestResources(); if (resources) { llmResource = getMainLLM(resources); if (llmResource) { const resourceType = isProxyLLM(llmResource) ? 'ProxyLLM' : 'LLM'; console.log(`[${options.workerId}] Using ${resourceType}: ${llmResource.model} @ ${llmResource.endpoint}`); } } if (!llmResource && process.env.OPENAI_API_BASE) { console.log(`[${options.workerId}] No LLM resource in Store, using OPENAI_API_BASE fallback`); } else if (!llmResource) { console.log(`[${options.workerId}] No LLM resource found, using OpenAI default endpoint`); } await runRollout(rollouts[0], storeClient, options, llmResource); consecutiveErrors = 0; // Reset on successful processing if (options.once) { console.log(`[${options.workerId}] Single run mode, exiting`); break; } } else { // No work available, wait and poll again consecutiveErrors = 0; // Server is responsive, reset error counter if (options.once) { console.log(`[${options.workerId}] No tasks available, exiting (single run mode)`); break; } await new Promise((resolve) => setTimeout(resolve, options.pollIntervalMs) ); } } catch (error) { consecutiveErrors++; console.error(`[${options.workerId}] Error:`, error); // Check if server might be down (e.g., ECONNREFUSED after training completes) if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) { console.log(`[${options.workerId}] Too many consecutive errors (${consecutiveErrors}), server may be down. Exiting gracefully.`); break; } await new Promise((resolve) => setTimeout(resolve, options.pollIntervalMs) ); } } } // Parse CLI arguments function parseArgs(): RunnerOptions { const args = process.argv.slice(2); const getArg = (flag: string): string | undefined => { const index = args.findIndex((a) => a === flag); return index !== -1 && index + 1 < args.length ? args[index + 1] : undefined; }; return { workerId: getArg('--worker-id') ?? `runner-${Date.now()}`, pollIntervalMs: parseInt(getArg('--poll-interval') ?? '1000'), once: args.includes('--once'), maxSteps: parseInt(getArg('--max-steps') ?? '15'), }; } // Run const options = parseArgs(); runLoop(options).catch((error) => { console.error('Fatal error:', error); process.exit(1); }); ================================================ FILE: contrib/recipes/webshop/scripts/run_stack.sh ================================================ #!/usr/bin/env bash # WebShop Training Stack Orchestrator # # Runs all three services (WebShop, AGL Coordinator, Runners) as processes # within a single container. This pattern is recommended for Azure ML jobs # where all services communicate via localhost. # # Usage: # ./run_stack.sh qwen # GPU training with Qwen model # ./run_stack.sh fast # Fast training mode # # Environment Variables: # N_RUNNERS Number of runner processes (default: 1) # HF_TOKEN HuggingFace token for model access # WANDB_API_KEY Weights & Biases API key for logging set -euo pipefail # Parse arguments MODE="${1:-qwen}" # Configuration N_RUNNERS="${N_RUNNERS:-1}" # Local URLs for inter-service communication export WEBSHOP_URL="${WEBSHOP_URL:-http://127.0.0.1:3000}" export AGENT_LIGHTNING_STORE_URL="${AGENT_LIGHTNING_STORE_URL:-http://127.0.0.1:4747}" export AGENT_LIGHTNING_OTLP_ENDPOINT="${AGENT_LIGHTNING_OTLP_ENDPOINT:-http://127.0.0.1:4747/v1/traces}" export AGENT_LIGHTNING_MODE="${AGENT_LIGHTNING_MODE:-train}" export AGENT_LIGHTNING_SERVICE_NAME="${AGENT_LIGHTNING_SERVICE_NAME:-webshop-runner}" # PID tracking for cleanup PIDS=() cleanup() { echo "" echo ">> Shutting down services..." for pid in "${PIDS[@]}"; do if kill -0 "$pid" 2>/dev/null; then echo " Stopping PID $pid" kill "$pid" 2>/dev/null || true fi done wait echo ">> All services stopped." } trap cleanup EXIT INT TERM wait_for_health() { local url="$1" local name="$2" local max_wait="${3:-120}" echo ">> Waiting for $name to be healthy ($url)..." local count=0 until curl -sf "$url" >/dev/null 2>&1; do sleep 2 count=$((count + 2)) if [ $count -ge $max_wait ]; then echo " ERROR: $name did not become healthy within ${max_wait}s" return 1 fi done echo " $name is healthy." } echo "========================================" echo "WebShop Training Stack" echo "========================================" echo "Mode: $MODE" echo "Runners: $N_RUNNERS" echo "" # Determine base directory (support both Docker /app and Azure ML relative paths) if [[ -d "/app/webshop" ]]; then # Docker container BASE_DIR="/app" WEBSHOP_BASE="/app/webshop" else # Azure ML or local - use current directory BASE_DIR="$(pwd)" WEBSHOP_BASE="$BASE_DIR/server/webshop" fi echo "Base directory: $BASE_DIR" echo "WebShop base: $WEBSHOP_BASE" echo "" # Add WebShop to PYTHONPATH so web_agent_site module can be imported export PYTHONPATH="$WEBSHOP_BASE:${PYTHONPATH:-}" echo "PYTHONPATH: $PYTHONPATH" # ============================================================================== # Step 1: Initialize WebShop Data (if needed) # ============================================================================== DATA_DIR="$WEBSHOP_BASE/data" SEARCH_DIR="$WEBSHOP_BASE/search_engine" INDEX_DIR="$SEARCH_DIR/indexes_1k" if [[ ! -f "$DATA_DIR/items_shuffle_1000.json" ]]; then echo ">> Downloading WebShop dataset (first run only)..." mkdir -p "$DATA_DIR" gdown --quiet "https://drive.google.com/uc?id=1EgHdxQ_YxqIQlvvq5iKlCrkEKR6-j0Ib" -O "$DATA_DIR/items_shuffle_1000.json" gdown --quiet "https://drive.google.com/uc?id=1IduG0xl544V_A_jv3tHXC0kyFi7PnyBu" -O "$DATA_DIR/items_ins_v2_1000.json" gdown --quiet "https://drive.google.com/uc?id=14Kb5SPBk_jfdLZ_CDBNitW98QLDlKR5O" -O "$DATA_DIR/items_human_ins.json" echo " Dataset downloaded." else echo ">> Dataset found. Skipping download." fi if [[ ! -d "$INDEX_DIR" ]]; then echo ">> Building search index (first run only)..." mkdir -p "$SEARCH_DIR/resources" mkdir -p "$SEARCH_DIR/resources_100" mkdir -p "$SEARCH_DIR/resources_1k" mkdir -p "$SEARCH_DIR/resources_100k" cd "$SEARCH_DIR" python convert_product_file_format.py python -m pyserini.index.lucene \ --collection JsonCollection \ --input resources_1k \ --index indexes_1k \ --generator DefaultLuceneDocumentGenerator \ --threads 1 \ --storePositions --storeDocvectors --storeRaw cd "$BASE_DIR" echo " Search index built." else echo ">> Search index found. Skipping build." fi # ============================================================================== # Step 2: Start WebShop Server # ============================================================================== echo "" echo ">> Starting WebShop server on port 3000..." # Run WebShop without GPU (CUDA_VISIBLE_DEVICES="") CUDA_VISIBLE_DEVICES="" python "$BASE_DIR/server/webshop_server.py" --host 127.0.0.1 --port 3000 & WEBSHOP_PID=$! PIDS+=("$WEBSHOP_PID") echo " WebShop PID: $WEBSHOP_PID" # ============================================================================== # Step 3: Start Agent Lightning Coordinator # ============================================================================== echo "" echo ">> Starting Agent Lightning coordinator on port 4747..." cd "$BASE_DIR/agl" echo " Mode: Training ($MODE)" python run_training.py "$MODE" & AGL_PID=$! PIDS+=("$AGL_PID") echo " Coordinator PID: $AGL_PID" cd "$BASE_DIR" # ============================================================================== # Step 4: Wait for Services # ============================================================================== echo "" wait_for_health "http://127.0.0.1:3000/health" "WebShop" 120 wait_for_health "http://127.0.0.1:4747/v1/agl/health" "Coordinator" 60 # ============================================================================== # Step 5: Build and Start Runners # ============================================================================== echo "" echo ">> Building headless runner..." # Ensure we're in the right directory for pnpm cd "$BASE_DIR" # Build the headless runner (compiles TypeScript, resolves path aliases) pnpm build:headless || { echo " ERROR: Failed to build headless runner" exit 1 } echo " Build complete." echo "" echo ">> Starting $N_RUNNERS runner(s)..." for i in $(seq 1 "$N_RUNNERS"); do export WORKER_ID="runner-$i" echo " Starting runner-$i..." pnpm headless -- --worker-id "runner-$i" & RUNNER_PID=$! PIDS+=("$RUNNER_PID") echo " Runner-$i PID: $RUNNER_PID" done # ============================================================================== # Step 6: Wait for Training to Complete # ============================================================================== echo "" echo "========================================" echo "All services started. Training in progress..." echo "========================================" echo "" echo "Services:" echo " - WebShop: http://127.0.0.1:3000" echo " - Coordinator: http://127.0.0.1:4747" echo " - Runners: $N_RUNNERS process(es)" echo "" echo "Press Ctrl+C to stop all services." echo "" # Wait for the coordinator to finish (it drives the training) wait "$AGL_PID" || true echo "" echo ">> Training completed or coordinator exited." ================================================ FILE: contrib/recipes/webshop/server/.dockerignore ================================================ venv/ webshop/ __pycache__/ *.pyc *.pyo .git/ activate.sh ================================================ FILE: contrib/recipes/webshop/server/requirements.txt ================================================ # WebShop Flask Server Dependencies # Python 3.8+ required # Flask server flask>=2.1.0 flask-cors>=3.0.0 # OpenAI Gym (pinned - WebShop uses this version) gym==0.24.0 # WebShop dependencies (modern versions for Python 3.11 compatibility) beautifulsoup4>=4.11.0 cleantext>=1.1.4 Flask>=2.1.0 gdown numpy<2.0 pandas>=1.4.0 rank_bm25>=0.2.2 requests>=2.27.0 rich>=12.0.0 scikit-learn>=1.2.0 selenium>=4.2.0 spacy>=3.5.0 thefuzz>=0.19.0 torch>=2.0.0 tqdm>=4.64.0 transformers>=4.30.0 lxml PyYAML>=6.0 pyserini>=0.21.0 ================================================ FILE: contrib/recipes/webshop/server/webshop_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ WebShop Flask Server A lightweight Flask server that wraps the WebShop OpenAI Gym environment, exposing /reset and /step HTTP endpoints for the Next.js frontend. Usage: python webshop_server.py [--port PORT] [--num-products NUM] Requires: - WebShop installed (run setup.sh first) - Python 3.8+ """ import argparse import logging import os import sys import time import uuid from dataclasses import dataclass, field from threading import Lock from typing import Any, Dict, Optional from flask import Flask, jsonify, request from flask_cors import CORS # Configure logging logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # Session configuration SESSION_TTL_SECONDS = 30 * 60 # 30 minutes DEFAULT_NUM_PRODUCTS = 1000 # Small dataset for fast startup app = Flask(__name__) CORS(app) # Enable CORS for Next.js frontend @dataclass class Session: """Represents a WebShop session with its gym environment.""" id: str env: Any # gym.Env created_at: float = field(default_factory=time.time) last_accessed: float = field(default_factory=time.time) instruction: str = "" class SessionManager: """Manages WebShop gym environment sessions.""" def __init__(self, num_products: int = DEFAULT_NUM_PRODUCTS): self.num_products = num_products self.sessions: Dict[str, Session] = {} self.lock = Lock() self._gym_registered = False def _ensure_gym_registered(self): """Lazily register the gym environment.""" if self._gym_registered: return try: import gym # Import WebShop environment - this registers it with gym from web_agent_site.envs import WebAgentTextEnv self._gym_registered = True logger.info("WebShop gym environment registered successfully") except ImportError as e: logger.error(f"Failed to import WebShop: {e}") logger.error("Run setup.sh first to install WebShop") raise def _cleanup_expired(self): """Remove expired sessions.""" now = time.time() expired = [sid for sid, session in self.sessions.items() if now - session.last_accessed > SESSION_TTL_SECONDS] for sid in expired: logger.info(f"Cleaning up expired session: {sid}") del self.sessions[sid] def create_session(self, session_id: Optional[str] = None, instruction: Optional[str] = None) -> Session: """Create a new session with a fresh gym environment.""" import gym self._ensure_gym_registered() self._cleanup_expired() sid = session_id or f"session_{uuid.uuid4().hex[:12]}" # Create gym environment env = gym.make("WebAgentTextEnv-v0", observation_mode="text", num_products=self.num_products) # Reset environment if instruction: obs = env.reset(instruction_text=instruction) else: obs = env.reset() instruction_text = env.get_instruction_text() if hasattr(env, "get_instruction_text") else "" session = Session(id=sid, env=env, instruction=instruction_text) with self.lock: self.sessions[sid] = session logger.info(f"Created session {sid} with {self.num_products} products") return session def get_session(self, session_id: str) -> Optional[Session]: """Get a session by ID, updating last accessed time.""" with self.lock: session = self.sessions.get(session_id) if session: session.last_accessed = time.time() return session def reset_session(self, session_id: str, instruction: Optional[str] = None) -> Optional[Session]: """Reset an existing session or create a new one.""" session = self.get_session(session_id) if session: # Reset existing environment if instruction: session.env.reset(instruction_text=instruction) else: session.env.reset() if hasattr(session.env, "get_instruction_text"): session.instruction = session.env.get_instruction_text() logger.info(f"Reset existing session {session_id}") return session else: # Create new session return self.create_session(session_id, instruction) # Global session manager (initialized on first request) session_manager: Optional[SessionManager] = None def get_session_manager() -> SessionManager: """Get or create the global session manager.""" global session_manager if session_manager is None: num_products = int(os.environ.get("WEBSHOP_NUM_PRODUCTS", DEFAULT_NUM_PRODUCTS)) session_manager = SessionManager(num_products=num_products) return session_manager @app.route("/reset", methods=["POST"]) def reset(): """ Reset or create a WebShop session. Request body: { "session_id": "optional_session_id", "instruction": "optional custom instruction" } Response: { "session_id": "session_xxx", "observation": "WebShop [SEP] Instruction: ...", "done": false, "reward": 0 } """ try: data = request.get_json() or {} session_id = data.get("session_id") or data.get("sessionId") instruction = data.get("instruction") manager = get_session_manager() if session_id: session = manager.reset_session(session_id, instruction) else: session = manager.create_session(instruction=instruction) if session is None: return jsonify({"error": "Failed to create session"}), 500 # Get initial observation env = session.env obs = env.observation if hasattr(env, "observation") else "" # Try to get the current observation from the environment state if hasattr(env, "state") and hasattr(env.state, "get"): obs = env.state.get("observation", obs) # Construct observation text with instruction if session.instruction and session.instruction not in obs: obs = f"WebShop [SEP] Instruction: {session.instruction} [SEP] {obs}" return jsonify({"session_id": session.id, "observation": obs, "done": False, "reward": 0}) except Exception as e: logger.exception("Error in /reset") return jsonify({"error": str(e)}), 500 @app.route("/step", methods=["POST"]) def step(): """ Execute an action in the WebShop environment. Request body: { "session_id": "session_xxx", "action": "search[red t-shirt]" } Response: { "session_id": "session_xxx", "observation": "[Back to Search] ...", "done": false, "reward": 0.0 } """ try: data = request.get_json() or {} session_id = data.get("session_id") or data.get("sessionId") action = data.get("action", "") if not session_id: return jsonify({"error": "session_id is required"}), 400 if not action: return jsonify({"error": "action is required"}), 400 manager = get_session_manager() session = manager.get_session(session_id) if session is None: return jsonify({"error": f"Session {session_id} not found"}), 404 # Execute action in gym environment obs, reward, done, info = session.env.step(action) logger.info(f"Session {session_id}: action={action}, reward={reward}, done={done}") return jsonify( { "session_id": session.id, "observation": obs, "done": done, "reward": reward, "info": info if isinstance(info, dict) else {}, } ) except Exception as e: logger.exception("Error in /step") return jsonify({"error": str(e)}), 500 @app.route("/health", methods=["GET"]) def health(): """Health check endpoint.""" return jsonify({"status": "ok", "sessions": len(get_session_manager().sessions) if session_manager else 0}) @app.route("/", methods=["GET"]) def index(): """Root endpoint with API info.""" return jsonify( { "name": "WebShop API Server", "version": "1.0.0", "endpoints": { "POST /reset": "Create or reset a session", "POST /step": "Execute an action", "GET /health": "Health check", }, } ) def main(): parser = argparse.ArgumentParser(description="WebShop Flask Server") parser.add_argument("--port", type=int, default=3000, help="Port to run server on") parser.add_argument("--host", type=str, default="0.0.0.0", help="Host to bind to") parser.add_argument( "--num-products", type=int, default=DEFAULT_NUM_PRODUCTS, help="Number of products to load (default: 1000)" ) parser.add_argument("--debug", action="store_true", help="Enable debug mode") args = parser.parse_args() # Set environment variable for session manager os.environ["WEBSHOP_NUM_PRODUCTS"] = str(args.num_products) logger.info(f"Starting WebShop server on {args.host}:{args.port}") logger.info(f"Loading {args.num_products} products...") # Pre-initialize session manager to load data try: manager = get_session_manager() # Create a test session to trigger loading test_session = manager.create_session() logger.info("WebShop environment initialized successfully") # Clean up test session del manager.sessions[test_session.id] except Exception as e: logger.error(f"Failed to initialize WebShop: {e}") logger.error("Run setup.sh first to install WebShop and download data") sys.exit(1) app.run(host=args.host, port=args.port, debug=args.debug) if __name__ == "__main__": main() ================================================ FILE: contrib/recipes/webshop/src/agent/prompts.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * System prompts for WebShop agents. * * Shared between the UI agent (webshop-agent.ts) and headless runner. */ /** * System prompt for the WebShop agent. * Includes explicit few-shot examples to ensure the model outputs correct action format. */ export const WEBSHOP_SYSTEM_PROMPT = `You are a shopping assistant agent navigating the WebShop environment. ## Action Format (CRITICAL - follow exactly) - search[your query here] - Search for products. Example: search[red cotton t-shirt men size large] - click[exact text] - Click buttons/products. Examples: - click[B07XYZ123] - Click a product by its ID - click[Buy Now] - Complete purchase - click[Large] - Select size option ## Examples Task: Find a red cotton t-shirt for men, size L, under $30 Step 1: search[red cotton t-shirt men size large under 30 dollars] Step 2: click[B09ABC123] # Click a matching product Step 3: click[Large] # Select size Step 4: click[Red] # Select color Step 5: click[Buy Now] # Purchase Task: Buy blue running shoes, size 10 Step 1: search[blue running shoes size 10] Step 2: click[B08DEF456] # Click matching shoes Step 3: click[10] # Select size Step 4: click[Blue] # Select color Step 5: click[Buy Now] # Complete purchase ## Strategy 1. Search for products matching the main attributes (type, color, material, size) 2. Click on promising results to view product details 3. On product pages, click option values to configure (size, color, etc.) 4. Click "Buy Now" when all required options are selected ## Important - NEVER output search[query] literally - always fill in actual search terms! - Read the observation text carefully after each action - Keep within the 15-step limit - Consider price constraints if mentioned in the task`; ================================================ FILE: contrib/recipes/webshop/src/agent/webshop-agent.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * WebShop Agent * * A ToolLoopAgent that navigates the real WebShop server environment * to find and purchase products matching user instructions. * * NOTE: This module is for the Next.js UI and requires @/tools which uses * Next.js-specific features. For headless/CLI usage, use prompts.ts directly. */ import { createOpenAI } from '@ai-sdk/openai'; import { ToolLoopAgent, InferAgentUIMessage, stepCountIs } from 'ai'; import { createWebShopTools, WebShopTools } from '@/tools'; import { WEBSHOP_SYSTEM_PROMPT } from './prompts'; // Re-export for backwards compatibility export { WEBSHOP_SYSTEM_PROMPT }; /** * Options for creating a WebShop agent. */ export interface WebShopAgentOptions { /** Model ID to use (defaults to WEBSHOP_MODEL env var or 'gpt-4o-mini') */ modelId?: string; /** AI SDK telemetry settings for OpenTelemetry tracing */ telemetry?: { isEnabled: boolean; tracer?: unknown; recordInputs?: boolean; recordOutputs?: boolean; }; } /** * Create an OpenAI-compatible client. * Supports configurable base URL for vLLM, LLMProxy, or other OpenAI-compatible endpoints. */ const openaiCompatible = createOpenAI({ apiKey: process.env.OPENAI_API_KEY ?? 'dummy', baseURL: process.env.OPENAI_API_BASE, }); /** * Create a WebShop agent bound to a session. */ export function createWebShopAgent( sessionId: string, options?: WebShopAgentOptions ) { const tools = createWebShopTools(sessionId); const modelId = options?.modelId ?? process.env.WEBSHOP_MODEL ?? 'gpt-4o-mini'; // Build agent configuration const agentConfig: Record = { model: openaiCompatible(modelId), instructions: WEBSHOP_SYSTEM_PROMPT, tools, stopWhen: stepCountIs(15), }; // Add telemetry if configured if (options?.telemetry) { agentConfig.experimental_telemetry = options.telemetry; } return new ToolLoopAgent(agentConfig as Parameters[0]); } /** * Type for agent UI messages. */ export type WebShopAgentUIMessage = InferAgentUIMessage< ReturnType >; /** * Type for tool invocations in UI messages. */ export type WebShopUIToolInvocation = NonNullable< WebShopAgentUIMessage['parts'][number] extends infer P ? P extends { type: `tool-${string}` } ? P : never : never >; ================================================ FILE: contrib/recipes/webshop/src/data/sample-tasks.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Sample WebShop Tasks * * A collection of sample tasks for the WebShop environment, designed to * test agent navigation, product matching, and option selection capabilities. */ import { WebShopTask } from '@/environment/types'; /** * Sample tasks covering different product categories and requirements. */ export const SAMPLE_TASKS: WebShopTask[] = [ { taskId: 'ws_001', instruction: "I need a red cotton t-shirt for men, size large, under $30", targetAttributes: { color: 'red', material: 'cotton', size: 'L', priceMax: 30, }, }, { taskId: 'ws_002', instruction: "Find me black running shorts for men, size medium, athletic style", targetAttributes: { color: 'black', style: 'athletic', size: 'M', }, }, { taskId: 'ws_003', instruction: 'I want a cozy gray fleece hoodie for women, size small', targetAttributes: { color: 'gray', material: 'fleece', size: 'S', }, }, { taskId: 'ws_004', instruction: 'Looking for white canvas sneakers, size 9, under $50', targetAttributes: { color: 'white', material: 'canvas', size: '9', priceMax: 50, }, }, { taskId: 'ws_005', instruction: 'I need navy slim fit chino pants, waist 32, length 32', targetAttributes: { color: 'navy', style: 'slim fit', waist: '32', length: '32', }, }, { taskId: 'ws_006', instruction: 'Find black yoga leggings for women, size medium, high-waisted', targetAttributes: { color: 'black', style: 'leggings', size: 'M', }, }, { taskId: 'ws_007', instruction: 'I want a white organic cotton blouse for women, size medium', targetAttributes: { color: 'white', material: 'organic cotton', size: 'M', }, }, { taskId: 'ws_008', instruction: 'Looking for a navy polo shirt for men, size XL, under $50', targetAttributes: { color: 'navy', style: 'polo', size: 'XL', priceMax: 50, }, }, ]; /** * Get a random subset of tasks. */ export function getRandomTasks(count: number): WebShopTask[] { const shuffled = [...SAMPLE_TASKS].sort(() => Math.random() - 0.5); return shuffled.slice(0, Math.min(count, shuffled.length)); } /** * Get a task by ID. */ export function getTaskById(taskId: string): WebShopTask | undefined { return SAMPLE_TASKS.find(t => t.taskId === taskId); } ================================================ FILE: contrib/recipes/webshop/src/environment/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './types'; export * from './webshop-server'; ================================================ FILE: contrib/recipes/webshop/src/environment/types.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * WebShop Environment Types (Server-backed) * * Types for connecting to the real WebShop Docker environment. */ /** * Product attributes for task metadata and training data. */ export interface ProductAttributes { color?: string; size?: string; material?: string; brand?: string; style?: string; [key: string]: string | number | undefined; } /** * Task instruction for the WebShop agent. */ export interface WebShopTask { taskId: string; instruction: string; targetAttributes: ProductAttributes & { priceMax?: number; priceMin?: number; }; /** * Optional: environment-native goal id/index for real WebShop datasets. */ goalId?: string | number; } /** * Server-oriented state - only tracks what the server returns. */ export interface WebShopState { sessionId?: string; step: number; observation: string; done: boolean; reward: number; info?: unknown; lastAction?: string; } /** * Result of executing an action in the WebShop environment. */ export interface ActionResult { success: boolean; observation: string; done: boolean; reward?: number; info?: unknown; state: WebShopState; } /** * WebShop environment interface (async for server communication). */ export interface WebShopEnvironment { getState(): WebShopState; /** * Start a new episode/session on the server. */ reset(options?: { task?: WebShopTask }): Promise; /** * Low-level step - send an action string to the server. */ step(action: string): Promise; /** * Search for products. Maps to search[query] in WebShop. */ search(query: string): Promise; /** * Click on an element. Maps to click[element] in WebShop. */ click(element: string): Promise; /** * Convenience method for purchasing (usually click[Buy Now]). */ buy(): Promise; } /** * Search result item (parsed from observation text). */ export interface SearchResultItem { id: string; name: string; price: number; rating?: number; attributes: ProductAttributes; } /** * Product info (parsed from observation text). */ export interface Product { id: string; name: string; price: number; description: string; attributes: ProductAttributes; options: Array<{ name: string; values: string[] }>; rating?: number; reviewCount?: number; } /** * Selected options for a product purchase. */ export interface SelectedOptions { [optionName: string]: string; } ================================================ FILE: contrib/recipes/webshop/src/environment/webshop-server.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * WebShop Server Environment * * HTTP adapter for connecting to the WebShop Python server. * * Run the server: * cd server && source activate.sh && python webshop_server.py */ import { ActionResult, WebShopEnvironment, WebShopState, WebShopTask, } from './types'; type JsonRecord = Record; export interface WebShopServerEnvOptions { baseUrl: string; /** * Try multiple API prefixes to handle different server configurations. */ candidateApiPrefixes?: string[]; timeoutMs?: number; } export class WebShopServerEnv implements WebShopEnvironment { private baseUrl: string; private candidateApiPrefixes: string[]; private timeoutMs: number; private state: WebShopState = { step: 0, observation: '', done: false, reward: 0, }; constructor(options: WebShopServerEnvOptions) { this.baseUrl = options.baseUrl.replace(/\/+$/, ''); this.candidateApiPrefixes = options.candidateApiPrefixes ?? ['']; this.timeoutMs = options.timeoutMs ?? 30_000; } getState(): WebShopState { return this.state; } async reset(options?: { task?: WebShopTask }): Promise { const task = options?.task; // Send task info to server - unknown fields are usually ignored const payload: JsonRecord = { session_id: this.state.sessionId, goal_id: task?.goalId, instruction: task?.instruction, task_id: task?.taskId, }; const data = await this.postJsonWithFallback(['/reset'], payload); const observation = this.pickString(data, ['observation', 'obs', 'text']) ?? ''; const done = this.pickBool(data, ['done', 'terminal']) ?? false; const reward = this.pickNumber(data, ['reward']) ?? 0; const sessionId = this.pickString(data, ['session_id', 'sessionId', 'sid']) ?? this.state.sessionId; this.state = { sessionId, step: 0, observation, done, reward, info: (data as JsonRecord).info, lastAction: undefined, }; return { success: true, observation, done, reward, info: (data as JsonRecord).info, state: this.state, }; } async step(action: string): Promise { const payload: JsonRecord = { session_id: this.state.sessionId, action, }; const data = await this.postJsonWithFallback(['/step'], payload); const observation = this.pickString(data, ['observation', 'obs', 'text']) ?? ''; const done = this.pickBool(data, ['done', 'terminal']) ?? false; const reward = this.pickNumber(data, ['reward']) ?? 0; const sessionId = this.pickString(data, ['session_id', 'sessionId', 'sid']) ?? this.state.sessionId; this.state = { sessionId, step: this.state.step + 1, observation, done, reward, info: (data as JsonRecord).info, lastAction: action, }; return { success: true, observation, done, reward, info: (data as JsonRecord).info, state: this.state, }; } async search(query: string): Promise { return this.step(`search[${query}]`); } async click(element: string): Promise { return this.step(`click[${element}]`); } async buy(): Promise { // In canonical WebShop, buying is just a click return this.click('Buy Now'); } // ----------------------- // HTTP plumbing // ----------------------- private async postJsonWithFallback( paths: string[], body: JsonRecord ): Promise { let lastErr: unknown; for (const prefix of this.candidateApiPrefixes) { for (const p of paths) { const url = `${this.baseUrl}${prefix}${p}`; try { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), this.timeoutMs); const res = await fetch(url, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal, }).finally(() => clearTimeout(timer)); if (res.status === 404) { // Try next prefix/path candidate continue; } if (!res.ok) { const text = await res.text().catch(() => ''); throw new Error( `WebShop server error ${res.status} on ${url}: ${text.slice(0, 500)}` ); } const contentType = res.headers.get('content-type') || ''; if (contentType.includes('application/json')) { return await res.json(); } // Some servers return plain text; wrap it const text = await res.text(); return { observation: text }; } catch (err) { lastErr = err; } } } const isTimeout = lastErr instanceof Error && lastErr.name === 'AbortError'; const hint = isTimeout ? `\n\nMake sure the WebShop Docker container is running:\n docker run --rm -p 3000:3000 ainikolai/webshop:latest "0.0.0.0"` : ''; throw new Error( `Could not reach WebShop server at ${this.baseUrl}. ` + `Tried prefixes=${JSON.stringify(this.candidateApiPrefixes)}, ` + `paths=${JSON.stringify(paths)}. ` + `Last error: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}${hint}` ); } private pickString(obj: unknown, keys: string[]): string | undefined { if (!obj || typeof obj !== 'object') return undefined; const o = obj as Record; for (const k of keys) { const v = o[k]; if (typeof v === 'string') return v; } return undefined; } private pickBool(obj: unknown, keys: string[]): boolean | undefined { if (!obj || typeof obj !== 'object') return undefined; const o = obj as Record; for (const k of keys) { const v = o[k]; if (typeof v === 'boolean') return v; } return undefined; } private pickNumber(obj: unknown, keys: string[]): number | undefined { if (!obj || typeof obj !== 'object') return undefined; const o = obj as Record; for (const k of keys) { const v = o[k]; if (typeof v === 'number') return v; } return undefined; } } ================================================ FILE: contrib/recipes/webshop/src/utils/agentlightning/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Agent Lightning Integration Utilities * * Exports for integrating with Agent Lightning Store and OpenTelemetry tracing. */ export * from './types'; export * from './store-client'; export * from './otel'; export * from './proxy-llm'; ================================================ FILE: contrib/recipes/webshop/src/utils/agentlightning/otel.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Agent Lightning OpenTelemetry Tracer Factory * * Creates tracers that embed rollout_id and attempt_id in Resource attributes, * following Agent Lightning's conventions for span correlation. */ import { diag, DiagConsoleLogger, DiagLogLevel, SpanKind, type Tracer, type Context, } from '@opentelemetry/api'; import { Resource } from '@opentelemetry/resources'; import { BasicTracerProvider, SimpleSpanProcessor, type SpanProcessor, type Span as SdkSpan, type ReadableSpan, } from '@opentelemetry/sdk-trace-base'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; export interface TracerConfig { otlpEndpoint: string; serviceName: string; rolloutId: string; attemptId: string; } /** * Custom SpanProcessor that stamps rollout metadata and sequence_id on spans. * Agent Lightning expects sequence_id for ordering within an attempt. */ class RolloutSpanProcessor implements SpanProcessor { private seq = 0; constructor( private delegate: SpanProcessor, private rolloutId: string, private attemptId: string ) {} onStart(span: SdkSpan, parentContext: Context): void { // Stamp rollout metadata on every span span.setAttribute('agentlightning.rollout_id', this.rolloutId); span.setAttribute('agentlightning.attempt_id', this.attemptId); span.setAttribute('agentlightning.span_sequence_id', this.seq++); this.delegate.onStart(span, parentContext); } onEnd(span: ReadableSpan): void { this.delegate.onEnd(span); } shutdown(): Promise { return this.delegate.shutdown(); } forceFlush(): Promise { return this.delegate.forceFlush(); } } /** * Create a per-rollout tracer whose Resource contains rollout_id/attempt_id. * This mirrors Agent Lightning's OTel tracer approach. */ export function createRolloutTracer(config: TracerConfig): { tracer: Tracer; provider: BasicTracerProvider; } { // Enable OTel diagnostics in debug mode (DEBUG_OTLP=1 or OTEL_DIAG_LOG_LEVEL=DEBUG) if (process.env.DEBUG_OTLP || process.env.OTEL_DIAG_LOG_LEVEL) { const level = (process.env.OTEL_DIAG_LOG_LEVEL as keyof typeof DiagLogLevel) || 'DEBUG'; if (DiagLogLevel[level] !== undefined) { diag.setLogger(new DiagConsoleLogger(), DiagLogLevel[level]); console.log(`[OTLP DEBUG] Enabled with level=${level}`); } } console.log(`[OTLP] Creating tracer for rollout=${config.rolloutId.slice(0, 12)}..., endpoint=${config.otlpEndpoint}`); // Create Resource with rollout metadata (Agent Lightning convention) const resource = new Resource({ [ATTR_SERVICE_NAME]: config.serviceName, 'agentlightning.rollout_id': config.rolloutId, 'agentlightning.attempt_id': config.attemptId, }); const provider = new BasicTracerProvider({ resource }); // Configure OTLP exporter to send to Agent Lightning Store const exporter = new OTLPTraceExporter({ url: config.otlpEndpoint, }); const simpleProcessor = new SimpleSpanProcessor(exporter); provider.addSpanProcessor( new RolloutSpanProcessor(simpleProcessor, config.rolloutId, config.attemptId) ); const tracer = provider.getTracer(config.serviceName); return { tracer, provider }; } /** * Get OTLP endpoint from environment variables. * If AGENT_LIGHTNING_OTLP_ENDPOINT is not set, derives it from AGENT_LIGHTNING_STORE_URL. */ export function getOtlpEndpoint(): string | null { const explicit = process.env.AGENT_LIGHTNING_OTLP_ENDPOINT; if (explicit) return explicit; const storeUrl = process.env.AGENT_LIGHTNING_STORE_URL; if (storeUrl) return `${storeUrl.replace(/\/+$/, '')}/v1/traces`; return null; } /** * Emit a reward span that can be recognized by Agent Lightning daemon. * Uses the Agent Lightning format: agentlightning.reward.{index}.name/value * * This span will be matched by the daemon's get_reward_value() function * when extracting final_reward for training. */ export function emitReward(tracer: Tracer, reward: number): void { const span = tracer.startSpan('reward', { kind: SpanKind.INTERNAL }); span.setAttribute('agentlightning.reward.0.name', 'primary'); span.setAttribute('agentlightning.reward.0.value', reward); span.end(); } ================================================ FILE: contrib/recipes/webshop/src/utils/agentlightning/proxy-llm.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * ProxyLLM Utilities * * Utilities for working with ProxyLLM resources from Agent Lightning. * These match the behavior of Python's ProxyLLM.get_base_url() method. */ import type { ProxyLLMResource, LLMResource, ResourcesUpdate } from './types'; /** * Construct the base URL for a ProxyLLM with rollout/attempt routing. * * This matches the Python implementation in agentlightning/types/resources.py: * ProxyLLM.get_base_url(rollout_id, attempt_id) * * The returned endpoint is: * {endpoint}/rollout/{rollout_id}/attempt/{attempt_id}/v1 * * @param resource - The ProxyLLM resource containing the base endpoint * @param rolloutId - Rollout identifier for span attribution * @param attemptId - Attempt identifier for span attribution * @returns Fully qualified endpoint including rollout metadata */ export function getProxyLLMBaseUrl( resource: ProxyLLMResource | LLMResource, rolloutId: string, attemptId: string ): string { let prefix = resource.endpoint; // Normalize: remove trailing slash if (prefix.endsWith('/')) { prefix = prefix.slice(0, -1); } // Handle /v1 suffix let hasV1 = false; if (prefix.endsWith('/v1')) { prefix = prefix.slice(0, -3); hasV1 = true; } // Append rollout/attempt routing prefix = `${prefix}/rollout/${rolloutId}/attempt/${attemptId}`; if (hasV1) { prefix += '/v1'; } return prefix; } /** * Extract the main LLM resource from a ResourcesUpdate. * * VERL publishes resources with a 'main_llm' key that typically contains * a ProxyLLM resource pointing to the LLM Proxy endpoint. * * @param resources - The resources update from the Store * @returns The main LLM resource, or null if not found */ export function getMainLLM( resources: ResourcesUpdate ): ProxyLLMResource | LLMResource | null { const mainLlm = resources.resources['main_llm']; if (!mainLlm) { return null; } if (mainLlm.resource_type === 'proxy_llm' || mainLlm.resource_type === 'llm') { return mainLlm as ProxyLLMResource | LLMResource; } return null; } /** * Check if a resource is a ProxyLLM (supports rollout/attempt routing). */ export function isProxyLLM( resource: ProxyLLMResource | LLMResource ): resource is ProxyLLMResource { return resource.resource_type === 'proxy_llm'; } ================================================ FILE: contrib/recipes/webshop/src/utils/agentlightning/store-client.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Agent Lightning Store REST Client * * HTTP client for communicating with the Agent Lightning Store server. * Based on endpoints defined in agentlightning/store/client_server.py. */ import type { AttemptedRollout, Attempt, Rollout, StartRolloutRequest, UpdateAttemptRequest, AttemptStatus, TaskInput, PaginatedResult, ResourcesUpdate, } from './types'; const API_V1_AGL_PREFIX = '/v1/agl'; export interface StoreClientOptions { baseUrl: string; timeoutMs?: number; } export class AgentLightningStoreClient { private baseUrl: string; private timeoutMs: number; constructor(options: StoreClientOptions) { this.baseUrl = options.baseUrl.replace(/\/+$/, ''); this.timeoutMs = options.timeoutMs ?? 30_000; } get isConfigured(): boolean { return Boolean(this.baseUrl); } private get apiBase(): string { return `${this.baseUrl}${API_V1_AGL_PREFIX}`; } /** * Check if the Store server is healthy. */ async health(): Promise { try { const response = await this.get('/health'); return (response as { status: string }).status === 'ok'; } catch { return false; } } /** * Start a new rollout immediately (POST /v1/agl/rollouts). * Returns an AttemptedRollout with the initial attempt already started. */ async startRollout(request: StartRolloutRequest): Promise { const response = await this.post('/rollouts', request); return response as AttemptedRollout; } /** * Enqueue rollouts for later processing (POST /v1/agl/queues/rollouts/enqueue). */ async enqueueRollouts( rollouts: Array<{ input: TaskInput; mode?: 'train' | 'val' | 'test'; metadata?: Record; }> ): Promise { const response = await this.post('/queues/rollouts/enqueue', { rollouts }); return response as Rollout[]; } /** * Dequeue available rollouts (POST /v1/agl/queues/rollouts/dequeue). */ async dequeueRollouts( limit: number = 1, workerId?: string ): Promise { const payload: Record = { limit }; if (workerId) payload.worker_id = workerId; const response = await this.post('/queues/rollouts/dequeue', payload); return response as AttemptedRollout[]; } /** * Get a rollout by ID (GET /v1/agl/rollouts/{rollout_id}). */ async getRollout(rolloutId: string): Promise { try { const response = await this.get(`/rollouts/${encodeURIComponent(rolloutId)}`); return response as Rollout | AttemptedRollout; } catch (error) { if (error instanceof Error && error.message.includes('404')) { return null; } throw error; } } /** * Update rollout metadata (POST /v1/agl/rollouts/{rollout_id}). */ async updateRollout( rolloutId: string, update: { status?: string; metadata?: Record; } ): Promise { const response = await this.post( `/rollouts/${encodeURIComponent(rolloutId)}`, update ); return response as Rollout; } /** * Start a new attempt for a rollout (POST /v1/agl/rollouts/{rollout_id}/attempts). */ async startAttempt( rolloutId: string, workerId?: string ): Promise { const payload = workerId ? { worker_id: workerId } : undefined; const response = await this.post( `/rollouts/${encodeURIComponent(rolloutId)}/attempts`, payload ); return response as AttemptedRollout; } /** * Update attempt status/metadata (POST /v1/agl/rollouts/{rollout_id}/attempts/{attempt_id}). */ async updateAttempt( rolloutId: string, attemptId: string, update: UpdateAttemptRequest ): Promise { const response = await this.post( `/rollouts/${encodeURIComponent(rolloutId)}/attempts/${encodeURIComponent(attemptId)}`, update ); return response as Attempt; } /** * Get all attempts for a rollout (GET /v1/agl/rollouts/{rollout_id}/attempts). */ async getAttempts(rolloutId: string): Promise> { const response = await this.get( `/rollouts/${encodeURIComponent(rolloutId)}/attempts` ); return response as PaginatedResult; } /** * Get the latest attempt for a rollout (GET /v1/agl/rollouts/{rollout_id}/attempts/latest). */ async getLatestAttempt(rolloutId: string): Promise { try { const response = await this.get( `/rollouts/${encodeURIComponent(rolloutId)}/attempts/latest` ); return response as Attempt | null; } catch { return null; } } /** * Convenience method: Complete an attempt with success/failure status. */ async completeAttempt( rolloutId: string, attemptId: string, options: { success: boolean; reward?: number; error?: string; } ): Promise { const status: AttemptStatus = options.success ? 'succeeded' : 'failed'; return this.updateAttempt(rolloutId, attemptId, { status, metadata: { reward: options.reward, success: options.success, error_message: options.error, completed_at: Date.now(), }, }); } /** * Update worker heartbeat (POST /v1/agl/workers/{worker_id}). */ async updateWorker( workerId: string, heartbeatStats?: Record ): Promise { return this.post(`/workers/${encodeURIComponent(workerId)}`, { heartbeat_stats: heartbeatStats, }); } // ========================================================================= // Resource Methods // ========================================================================= /** * Get the latest resources (GET /v1/agl/resources/latest). * Returns the most recently published resource configuration. */ async getLatestResources(): Promise { try { const response = await this.get('/resources/latest'); return response as ResourcesUpdate | null; } catch { return null; } } /** * Get resources by ID (GET /v1/agl/resources/{resources_id}). */ async getResourcesById(resourcesId: string): Promise { try { const response = await this.get( `/resources/${encodeURIComponent(resourcesId)}` ); return response as ResourcesUpdate | null; } catch (error) { if (error instanceof Error && error.message.includes('404')) { return null; } throw error; } } // HTTP helpers private async post(path: string, body?: unknown): Promise { const url = `${this.apiBase}${path}`; const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), this.timeoutMs); try { const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: body !== undefined ? JSON.stringify(body) : undefined, signal: controller.signal, }); if (!res.ok) { const text = await res.text().catch(() => ''); throw new Error(`Store error ${res.status}: ${text.slice(0, 500)}`); } const contentType = res.headers.get('content-type') ?? ''; if (contentType.includes('application/json')) { return await res.json(); } return await res.text(); } finally { clearTimeout(timer); } } private async get(path: string): Promise { const url = `${this.apiBase}${path}`; const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), this.timeoutMs); try { const res = await fetch(url, { method: 'GET', signal: controller.signal, }); if (!res.ok) { const text = await res.text().catch(() => ''); throw new Error(`Store error ${res.status}: ${text.slice(0, 500)}`); } const contentType = res.headers.get('content-type') ?? ''; if (contentType.includes('application/json')) { return await res.json(); } return await res.text(); } finally { clearTimeout(timer); } } } /** * Get a Store client instance from environment variables. * Returns null if AGENT_LIGHTNING_STORE_URL is not configured. */ export function getStoreClient(): AgentLightningStoreClient | null { const baseUrl = process.env.AGENT_LIGHTNING_STORE_URL; if (!baseUrl) return null; return new AgentLightningStoreClient({ baseUrl }); } ================================================ FILE: contrib/recipes/webshop/src/utils/agentlightning/types.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Agent Lightning TypeScript Types * * Type definitions matching the Python models in agentlightning/types/core.py. * Used by the Store client to communicate with the Agent Lightning REST API. */ /** * Possible rollout modes for training/evaluation. */ export type RolloutMode = 'train' | 'val' | 'test'; /** * Status of a rollout through its lifecycle. */ export type RolloutStatus = | 'queuing' // initial status | 'preparing' // after the trace is claimed | 'running' // after receiving the first trace | 'failed' // crashed | 'succeeded' // status OK | 'cancelled' // cancelled by user (or watchdog) | 'requeuing'; // retrying /** * Status of an execution attempt. */ export type AttemptStatus = | 'preparing' | 'running' | 'failed' | 'succeeded' | 'unresponsive' // worker has not reported results for a while | 'timeout'; // worker has been working too long /** * Task input type - accepts arbitrary payloads. */ export type TaskInput = Record; /** * Configuration controlling rollout retries and timeouts. */ export interface RolloutConfig { timeout_seconds?: number | null; unresponsive_seconds?: number | null; max_attempts?: number; retry_condition?: AttemptStatus[]; } /** * Execution attempt for a rollout, including metadata for retries. */ export interface Attempt { rollout_id: string; attempt_id: string; sequence_id: number; start_time: number; end_time?: number | null; status: AttemptStatus; worker_id?: string | null; last_heartbeat_time?: number | null; metadata?: Record | null; } /** * A rollout represents a unit of work to be executed by an agent. */ export interface Rollout { rollout_id: string; input: TaskInput; start_time: number; end_time?: number | null; mode?: RolloutMode | null; resources_id?: string | null; status: RolloutStatus; config: RolloutConfig; metadata?: Record | null; } /** * Rollout paired with the currently active attempt. */ export interface AttemptedRollout extends Rollout { attempt: Attempt; } /** * Request payload for starting a new rollout. */ export interface StartRolloutRequest { input: TaskInput; mode?: RolloutMode; resources_id?: string; config?: RolloutConfig; metadata?: Record; worker_id?: string; } /** * Request payload for enqueueing a rollout. */ export interface EnqueueRolloutRequest { input: TaskInput; mode?: RolloutMode; resources_id?: string; config?: RolloutConfig; metadata?: Record; } /** * Request payload for updating an attempt. */ export interface UpdateAttemptRequest { status?: AttemptStatus; worker_id?: string; last_heartbeat_time?: number; metadata?: Record; } /** * Request payload for dequeueing rollouts. */ export interface DequeueRolloutsRequest { limit?: number; worker_id?: string; } /** * Worker status type. */ export type WorkerStatus = 'idle' | 'busy' | 'unknown'; /** * Worker information. */ export interface Worker { worker_id: string; status: WorkerStatus; heartbeat_stats?: Record | null; last_heartbeat_time?: number | null; last_dequeue_time?: number | null; last_busy_time?: number | null; last_idle_time?: number | null; current_rollout_id?: string | null; current_attempt_id?: string | null; } /** * Paginated result wrapper. */ export interface PaginatedResult { items: T[]; limit: number; offset: number; total: number; } /** * WebShop task input format. */ export interface WebShopTaskInput { task_id: string; instruction: string; target_attributes?: Record; } // ============================================================================= // Resource Types (matching Python agentlightning/types/resources.py) // ============================================================================= /** * Base LLM resource that identifies an LLM endpoint and its configuration. */ export interface LLMResource { resource_type: 'llm'; endpoint: string; model: string; api_key?: string | null; sampling_parameters?: Record; } /** * LLM resource that rewrites endpoints through LLMProxy. * The proxy injects rollout- and attempt-specific routing information into the * endpoint so that downstream services can attribute requests correctly. */ export interface ProxyLLMResource { resource_type: 'proxy_llm'; endpoint: string; model: string; api_key?: string | null; sampling_parameters?: Record; } /** * Prompt template resource. */ export interface PromptTemplateResource { resource_type: 'prompt_template'; template: string; engine: 'jinja' | 'f-string' | 'poml'; } /** * Union of all resource types. */ export type ResourceUnion = LLMResource | ProxyLLMResource | PromptTemplateResource; /** * Mapping from resource names to their configured instances. */ export type NamedResources = Record; /** * Update payload broadcast to clients when resources change. */ export interface ResourcesUpdate { resources_id: string; create_time: number; update_time: number; version: number; resources: NamedResources; } ================================================ FILE: contrib/recipes/webshop/tests/__init__.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Tests for the Vercel AI WebShop example.""" ================================================ FILE: contrib/recipes/webshop/tests/conftest.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Shared fixtures for Vercel AI WebShop tests.""" import itertools import json from typing import Any, Dict, List, Optional import pytest from agentlightning.adapter.triplet import TracerTraceToTriplet from agentlightning.types import Span # Counter for generating unique sequence IDs _SEQ = itertools.count() # Pattern to match Vercel AI SDK span names VERCEL_AI_SDK_LLM_CALL_PATTERN = r"ai\.(generateText|streamText|generateObject)(\.do(Generate|Stream))?" @pytest.fixture def adapter() -> TracerTraceToTriplet: """Create adapter configured for Vercel AI SDK spans.""" return TracerTraceToTriplet(llm_call_match=VERCEL_AI_SDK_LLM_CALL_PATTERN) @pytest.fixture def make_span(): """Factory for creating generic test spans.""" def _make( name: str, *, attributes: Optional[Dict[str, Any]] = None, parent_id: Optional[str] = None, start_time: float = 0.0, end_time: float = 1.0, span_id: Optional[str] = None, ) -> Span: return Span.from_attributes( rollout_id="rollout-test-001", attempt_id="attempt-test-001", sequence_id=next(_SEQ), trace_id="trace-test-001", span_id=span_id or f"span-{next(_SEQ):04d}", parent_id=parent_id, name=name, attributes=attributes or {}, start_time=start_time, end_time=end_time, ) return _make @pytest.fixture def make_vercel_ai_span(make_span): """Factory for creating Vercel AI SDK style spans. Creates spans that match the ai.generateText pattern with optional token IDs. """ def _make( name: str = "ai.generateText", *, prompt_text: str = "Hello", response_text: str = "World", token_ids: Optional[Dict[str, List[int]]] = None, parent_id: Optional[str] = None, start_time: float = 0.0, end_time: float = 1.0, ) -> Span: attrs: Dict[str, Any] = { "gen_ai.prompt.0.role": "user", "gen_ai.prompt.0.content": prompt_text, "gen_ai.completion.0.content": response_text, "gen_ai.completion.0.role": "assistant", "gen_ai.response.id": f"resp-{next(_SEQ):04d}", } # Add token IDs if provided if token_ids: if "prompt" in token_ids: attrs["prompt_token_ids"] = token_ids["prompt"] if "response" in token_ids: attrs["response_token_ids"] = token_ids["response"] return make_span( name, attributes=attrs, parent_id=parent_id, start_time=start_time, end_time=end_time, ) return _make @pytest.fixture def make_reward_span(make_span): """Factory for creating reward spans in AgentOps format.""" def _make( reward: float, *, parent_id: Optional[str] = None, start_time: float = 0.0, end_time: float = 1.0, ) -> Span: attrs = { "agentops.task.output": json.dumps({"type": "reward", "value": reward}), } return make_span( "reward", attributes=attrs, parent_id=parent_id, start_time=start_time, end_time=end_time, ) return _make @pytest.fixture def make_session_span(make_span): """Factory for creating agent session spans (root spans).""" def _make( *, start_time: float = 0.0, end_time: float = 10.0, ) -> Span: return make_span( "agent.session", attributes={"agent.name": "webshop-agent"}, parent_id=None, start_time=start_time, end_time=end_time, span_id="root-session", ) return _make ================================================ FILE: contrib/recipes/webshop/tests/test_span_adapter.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Tests for TracerTraceToTriplet adapter with Vercel AI SDK span format. These tests validate that the adapter correctly processes spans from the Vercel AI SDK's experimental_telemetry feature, including: - Matching ai.generateText/ai.streamText span names - Extracting token IDs from span attributes - Handling spans without token IDs (current production behavior) - Extracting rewards from agentops.task.output format """ import json from typing import List import pytest from agentlightning.adapter.triplet import TracerTraceToTriplet from agentlightning.types import Span # Pattern to match Vercel AI SDK span names (duplicated from conftest for direct import) VERCEL_AI_SDK_LLM_CALL_PATTERN = r"ai\.(generateText|streamText|generateObject)(\.do(Generate|Stream))?" class TestVercelAiSdkSpanMatching: """Tests for verifying the adapter matches Vercel AI SDK span names.""" @pytest.mark.parametrize( "span_name", [ "ai.generateText", "ai.streamText", "ai.generateObject", "ai.generateText.doGenerate", "ai.streamText.doStream", ], ) def test_adapter_matches_vercel_ai_sdk_span_names( self, adapter: TracerTraceToTriplet, make_vercel_ai_span, span_name: str ): """Verify adapter matches various Vercel AI SDK span name patterns.""" span = make_vercel_ai_span( name=span_name, prompt_text="Test prompt", response_text="Test response", token_ids={"prompt": [1, 2, 3], "response": [4, 5, 6]}, ) triplets = adapter.adapt([span]) assert len(triplets) == 1, f"Expected 1 triplet for span name '{span_name}'" def test_adapter_does_not_match_non_ai_spans(self, adapter: TracerTraceToTriplet, make_span): """Verify adapter ignores non-AI SDK spans.""" span = make_span( "http.request", attributes={"http.method": "GET", "http.url": "https://example.com"}, ) triplets = adapter.adapt([span]) assert len(triplets) == 0, "Should not match non-AI spans" class TestTokenIdExtraction: """Tests for token ID extraction from span attributes.""" def test_extracts_token_ids_when_present(self, adapter: TracerTraceToTriplet, make_vercel_ai_span): """Verify token IDs are extracted when present in span attributes.""" prompt_ids = [1, 2, 3, 4, 5] response_ids = [6, 7, 8, 9, 10] span = make_vercel_ai_span( prompt_text="Hello world", response_text="Hi there", token_ids={"prompt": prompt_ids, "response": response_ids}, ) triplets = adapter.adapt([span]) assert len(triplets) == 1 assert triplets[0].prompt["token_ids"] == prompt_ids assert triplets[0].response["token_ids"] == response_ids def test_empty_token_ids_when_not_present(self, adapter: TracerTraceToTriplet, make_vercel_ai_span): """Verify triplets have empty token_ids when not present in spans. This is the current production behavior - Vercel AI SDK doesn't emit token IDs. The test documents this limitation. """ span = make_vercel_ai_span( prompt_text="Hello world", response_text="Hi there", token_ids=None, # No token IDs ) triplets = adapter.adapt([span]) assert len(triplets) == 1 # Token IDs should be empty lists assert triplets[0].prompt.get("token_ids", []) == [] assert triplets[0].response.get("token_ids", []) == [] def test_raw_content_preserved_even_without_token_ids(self, adapter: TracerTraceToTriplet, make_vercel_ai_span): """Verify raw content is preserved in triplets even without token IDs.""" span = make_vercel_ai_span( prompt_text="Test prompt content", response_text="Test response content", token_ids=None, ) triplets = adapter.adapt([span]) assert len(triplets) == 1 # Raw content should be preserved for potential retokenization raw_prompt = triplets[0].prompt.get("raw_content") raw_response = triplets[0].response.get("raw_content") # Note: The exact format of raw_content depends on adapter implementation # This test just verifies something is captured assert raw_prompt is not None or raw_response is not None or True # Placeholder class TestRewardExtraction: """Tests for reward extraction from spans.""" def test_extracts_reward_from_agentops_format( self, adapter: TracerTraceToTriplet, make_session_span, make_vercel_ai_span, make_reward_span ): """Verify reward extraction from agentops.task.output format.""" session = make_session_span() llm = make_vercel_ai_span( prompt_text="Buy product", response_text="click[Buy Now]", token_ids={"prompt": [1, 2], "response": [3, 4]}, parent_id=session.span_id, start_time=1.0, end_time=2.0, ) reward = make_reward_span( reward=0.75, parent_id=session.span_id, start_time=3.0, end_time=3.1, ) triplets = adapter.adapt([session, llm, reward]) # Should have at least one triplet with the LLM call assert len(triplets) >= 1 # Check if reward was associated with any triplet # Note: Reward association depends on adapter configuration rewards = [t.reward for t in triplets if t.reward is not None] # This may or may not include the reward depending on adapter settings # The key test is that the spans are processed without errors def test_reward_span_parsed_correctly(self, make_reward_span): """Verify reward span has correct attributes.""" span = make_reward_span(reward=0.5) assert "agentops.task.output" in span.attributes output = json.loads(span.attributes["agentops.task.output"]) assert output["type"] == "reward" assert output["value"] == 0.5 class TestMultiTurnConversations: """Tests for multi-turn conversation handling.""" def test_multiple_llm_calls_create_multiple_triplets( self, adapter: TracerTraceToTriplet, make_session_span, make_vercel_ai_span ): """Verify multiple LLM calls in a session create multiple triplets.""" session = make_session_span() llm1 = make_vercel_ai_span( prompt_text="Search for shoes", response_text="search[shoes]", token_ids={"prompt": [1, 2], "response": [3]}, parent_id=session.span_id, start_time=1.0, end_time=2.0, ) llm2 = make_vercel_ai_span( prompt_text="Click on first result", response_text="click[item-1]", token_ids={"prompt": [4, 5], "response": [6]}, parent_id=session.span_id, start_time=3.0, end_time=4.0, ) triplets = adapter.adapt([session, llm1, llm2]) assert len(triplets) == 2, "Should create 2 triplets for 2 LLM calls" class TestEdgeCases: """Tests for edge cases and error handling.""" def test_empty_span_list_raises_error(self, adapter: TracerTraceToTriplet): """Verify adapter raises ValueError for empty span list. The adapter requires at least one span to build a trace tree. """ with pytest.raises(ValueError, match="No spans provided"): adapter.adapt([]) def test_only_non_llm_spans(self, adapter: TracerTraceToTriplet, make_span): """Verify adapter handles list with no LLM spans.""" spans = [ make_span("http.request", attributes={"http.method": "GET"}), make_span("db.query", attributes={"db.statement": "SELECT *"}), ] triplets = adapter.adapt(spans) assert len(triplets) == 0 def test_span_with_string_token_ids(self, adapter: TracerTraceToTriplet, make_span): """Verify adapter handles spans with string token ID attributes. This simulates a common edge case where token IDs might be serialized as a string instead of a list. """ span = make_span( "ai.generateText", attributes={ "gen_ai.prompt.0.content": "Test", "gen_ai.completion.0.content": "Response", "prompt_token_ids": "[1, 2, 3]", # JSON string instead of list "response_token_ids": "[4, 5, 6]", # JSON string instead of list }, ) # Should not raise an exception triplets = adapter.adapt([span]) # May or may not produce triplets correctly, but should not crash assert isinstance(triplets, list) ================================================ FILE: contrib/recipes/webshop/tests/test_store_integration.py ================================================ # Copyright (c) Microsoft. All rights reserved. """End-to-end integration tests for OTLP span ingestion and query. These tests validate the complete flow: 1. Create rollout in LightningStore 2. Dequeue to get attempt 3. Add spans (simulating TypeScript runner) 4. Query spans back 5. Convert to triplets using adapter This tests the core issue: spans being sent but not found when queried. """ import pytest from agentlightning.adapter.triplet import TracerTraceToTriplet from agentlightning.store.memory import InMemoryLightningStore from agentlightning.types import Span # Pattern to match Vercel AI SDK span names VERCEL_AI_SDK_LLM_CALL_PATTERN = r"ai\.(generateText|streamText|generateObject)(\.do(Generate|Stream))?" @pytest.fixture def store(): """Create an in-memory LightningStore.""" return InMemoryLightningStore() @pytest.fixture def integration_adapter(): """Adapter configured for Vercel AI SDK spans.""" return TracerTraceToTriplet(llm_call_match=VERCEL_AI_SDK_LLM_CALL_PATTERN) @pytest.mark.asyncio async def test_full_flow_rollout_to_triplet(store, integration_adapter): """Test complete flow: Create rollout -> Add spans -> Query spans -> Convert to triplets. This test validates that: 1. Spans can be added to a valid rollout/attempt 2. Spans can be queried back with attempt_id="latest" 3. Adapter produces triplets with token IDs """ # 1. Create rollout rollout = await store.enqueue_rollout( input={"instruction": "Buy shoes"}, mode="train", ) rollout_id = rollout.rollout_id # 2. Dequeue to get attempt dequeued = await store.dequeue_rollout(worker_id="test-worker") assert dequeued is not None, "Should dequeue a rollout" attempt_id = dequeued.attempt.attempt_id # 3. Add spans (simulating TypeScript runner) llm_span = Span.from_attributes( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=0, trace_id="trace-001", span_id="span-001", parent_id=None, name="ai.generateText", attributes={ "gen_ai.prompt.0.role": "user", "gen_ai.prompt.0.content": "Buy shoes", "gen_ai.completion.0.role": "assistant", "gen_ai.completion.0.content": "search[shoes]", "prompt_token_ids": [1, 2, 3], "response_token_ids": [4, 5], }, start_time=0.0, end_time=1.0, ) reward_span = Span.from_attributes( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=1, trace_id="trace-001", span_id="span-002", parent_id=None, name="reward", attributes={ "agentops.task.output": '{"type": "reward", "value": 0.75}', }, start_time=1.0, end_time=1.1, ) added = await store.add_many_spans([llm_span, reward_span]) assert len(added) == 2, f"Expected 2 spans added, got {len(added)}" # 4. Query spans back (using "latest" like the daemon does) spans = await store.query_spans(rollout_id, attempt_id="latest") assert len(spans) == 2, f"Expected 2 spans from query, got {len(spans)}" # Verify span attributes are preserved span_names = {s.name for s in spans} assert "ai.generateText" in span_names, "Should have LLM span" assert "reward" in span_names, "Should have reward span" # 5. Convert to triplets triplets = integration_adapter.adapt(list(spans)) assert len(triplets) >= 1, f"Expected at least 1 triplet, got {len(triplets)}" # 6. Verify triplet has token IDs llm_triplet = triplets[0] assert llm_triplet.prompt.get("token_ids") == [ 1, 2, 3, ], f"Expected prompt token_ids [1,2,3], got {llm_triplet.prompt.get('token_ids')}" assert llm_triplet.response.get("token_ids") == [ 4, 5, ], f"Expected response token_ids [4,5], got {llm_triplet.response.get('token_ids')}" @pytest.mark.asyncio async def test_span_ingestion_requires_valid_attempt(store): """Test that spans can only be added to existing rollouts/attempts. This validates the span rejection behavior when rollout_id/attempt_id is invalid. """ # Create rollout and dequeue rollout = await store.enqueue_rollout(input={}, mode="train") dequeued = await store.dequeue_rollout(worker_id="test") assert dequeued is not None rollout_id = rollout.rollout_id attempt_id = dequeued.attempt.attempt_id # Adding span to valid rollout/attempt should succeed valid_span = Span.from_attributes( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=0, trace_id="t1", span_id="s1", parent_id=None, name="test.span", attributes={"key": "value"}, start_time=0.0, end_time=1.0, ) result = await store.add_many_spans([valid_span]) assert len(result) == 1, "Should successfully add span with valid IDs" # Adding span to INVALID rollout should fail invalid_span = Span.from_attributes( rollout_id="invalid-rollout-id", attempt_id=attempt_id, sequence_id=0, trace_id="t2", span_id="s2", parent_id=None, name="test.span", attributes={}, start_time=0.0, end_time=1.0, ) with pytest.raises(ValueError, match="Rollout.*not found"): await store.add_many_spans([invalid_span]) @pytest.mark.asyncio async def test_query_spans_by_explicit_attempt_id(store): """Test querying spans by explicit attempt_id (not 'latest').""" # Create rollout and dequeue rollout = await store.enqueue_rollout(input={}, mode="train") dequeued = await store.dequeue_rollout(worker_id="test") assert dequeued is not None rollout_id = rollout.rollout_id attempt_id = dequeued.attempt.attempt_id # Add span span = Span.from_attributes( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=0, trace_id="t1", span_id="s1", parent_id=None, name="test.span", attributes={"marker": "test-value"}, start_time=0.0, end_time=1.0, ) await store.add_many_spans([span]) # Query by explicit attempt_id queried = await store.query_spans(rollout_id, attempt_id=attempt_id) assert len(queried) == 1, f"Expected 1 span, got {len(queried)}" assert queried[0].attributes["marker"] == "test-value" # Query by "latest" should give same result queried_latest = await store.query_spans(rollout_id, attempt_id="latest") assert len(queried_latest) == 1, "Query with 'latest' should return same span" @pytest.mark.asyncio async def test_empty_spans_query_returns_empty_list(store): """Test that querying spans for a rollout with no spans returns empty list.""" # Create rollout and dequeue (but don't add spans) rollout = await store.enqueue_rollout(input={}, mode="train") await store.dequeue_rollout(worker_id="test") rollout_id = rollout.rollout_id # Query should return empty spans = await store.query_spans(rollout_id, attempt_id="latest") assert len(spans) == 0, "Should return empty list when no spans exist" @pytest.mark.asyncio async def test_adapter_produces_empty_triplets_without_token_ids(store, integration_adapter): """Test that adapter handles spans without token_ids (current Vercel AI SDK behavior). This documents the limitation: Vercel AI SDK doesn't emit token_ids by default. """ # Create rollout and dequeue rollout = await store.enqueue_rollout(input={}, mode="train") dequeued = await store.dequeue_rollout(worker_id="test") assert dequeued is not None rollout_id = rollout.rollout_id attempt_id = dequeued.attempt.attempt_id # Add span WITHOUT token_ids (like Vercel AI SDK would emit) llm_span = Span.from_attributes( rollout_id=rollout_id, attempt_id=attempt_id, sequence_id=0, trace_id="trace-001", span_id="span-001", parent_id=None, name="ai.generateText", attributes={ "gen_ai.prompt.0.content": "Hello", "gen_ai.completion.0.content": "World", # No prompt_token_ids or response_token_ids! }, start_time=0.0, end_time=1.0, ) await store.add_many_spans([llm_span]) # Query and convert spans = await store.query_spans(rollout_id, attempt_id="latest") triplets = integration_adapter.adapt(list(spans)) # Should still produce triplet, but with empty token_ids assert len(triplets) == 1, "Should produce 1 triplet" assert triplets[0].prompt.get("token_ids", []) == [], "Should have empty prompt token_ids" assert triplets[0].response.get("token_ids", []) == [], "Should have empty response token_ids" ================================================ FILE: contrib/recipes/webshop/tsconfig.json ================================================ { "compilerOptions": { "lib": [ "dom", "dom.iterable", "esnext" ], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": [ "./src/*" ] }, "target": "ES2017" }, "include": [ "next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts" ], "exclude": [ "node_modules" ] } ================================================ FILE: contrib/recipes/webshop/tsup.config.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { defineConfig } from 'tsup'; export default defineConfig({ entry: ['scripts/headless-runner.ts'], format: ['cjs'], outDir: 'dist', clean: true, // Resolve @/ path aliases from tsconfig esbuildOptions(options) { options.alias = { '@': './src', }; }, // Bundle local src/ files but keep node_modules external external: [/node_modules/], // Target Node.js platform: 'node', target: 'node20', }); ================================================ FILE: dashboard/.gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* .pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage *.lcov # nyc test coverage .nyc_output # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Snowpack dependency directory (https://snowpack.dev/) web_modules/ # TypeScript cache *.tsbuildinfo # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional stylelint cache .stylelintcache # Microbundle cache .rpt2_cache/ .rts2_cache_cjs/ .rts2_cache_es/ .rts2_cache_umd/ # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variable files .env .env.development.local .env.test.local .env.production.local .env.local # parcel-bundler cache (https://parceljs.org/) .cache .parcel-cache # Next.js build output .next out # Nuxt.js build / generate output .nuxt dist # Gatsby files .cache/ # Comment in the public line in if your project uses Gatsby and not Next.js # https://nextjs.org/blog/next-9-1#public-directory-support # public # vuepress build output .vuepress/dist # vuepress v2.x temp and cache directory .temp .cache # Docusaurus cache and generated files .docusaurus # Serverless directories .serverless/ # FuseBox cache .fusebox/ # DynamoDB Local files .dynamodb/ # TernJS port file .tern-port # Stores VSCode versions used for testing VSCode extensions .vscode-test # yarn v2 .yarn/cache .yarn/unplugged .yarn/build-state.yml .yarn/install-state.gz .pnp.* .DS_Store # Storybook build output storybook-static ================================================ FILE: dashboard/.prettierrc.mjs ================================================ // Copyright (c) Microsoft. All rights reserved. /** @type {import("@ianvs/prettier-plugin-sort-imports").PrettierConfig} */ const config = { printWidth: 120, singleQuote: true, tabWidth: 2, useTabs: false, semi: true, quoteProps: 'consistent', jsxSingleQuote: true, trailingComma: 'all', bracketSpacing: true, objectWrap: 'preserve', arrowParens: 'always', proseWrap: 'preserve', endOfLine: 'lf', plugins: ['@ianvs/prettier-plugin-sort-imports'], importOrder: [ '.*styles.css$', '', 'dayjs', '^react$', '^next$', '^next/.*$', '', '', '^@mantine/(.*)$', '^@mantinex/(.*)$', '^@mantine-tests/(.*)$', '^@docs/(.*)$', '^@/.*$', '^../(?!.*.css$).*$', '^./(?!.*.css$).*$', '\\.css$', ], overrides: [ { files: '*.mdx', options: { printWidth: 120, }, }, ], }; export default config; ================================================ FILE: dashboard/.storybook/constants.ts ================================================ // Copyright (c) Microsoft. All rights reserved. // Centralized constants that keep Storybook fixtures deterministic so Chromatic // snapshots do not drift when the build environment changes. export const STORY_DATE_NOW_MS = 1762775145209; export const STORY_DATE_NOW_SECONDS = Math.floor(STORY_DATE_NOW_MS / 1000); // Use a fixed origin so any code that would normally read window.location.* // in the app can rely on the same value from Storybook fixtures. Prefer HTTPS // so Chromatic (which is served over HTTPS) avoids mixed-content fetch errors. export const STORY_BASE_URL = 'https://storybook.agentlightning.invalid'; export const STORY_LOCATION_HREF = `${STORY_BASE_URL}/storybook`; ================================================ FILE: dashboard/.storybook/main.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { core: { disableWhatsNewNotifications: true, disableTelemetry: true, enableCrashReports: false, }, stories: ['../src/**/*.mdx', '../src/**/*.story.@(js|jsx|ts|tsx)'], staticDirs: ['../static'], addons: ['@storybook/addon-themes', '@storybook/addon-vitest'], framework: { name: '@storybook/react-vite', options: {}, }, }; export default config; ================================================ FILE: dashboard/.storybook/modes.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export const allModes = { MD: { viewport: 'md', }, LG: { viewport: 'lg', }, XL: { viewport: 'xl', }, } as const; ================================================ FILE: dashboard/.storybook/preview.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import '@mantine/core/styles.css'; import 'mantine-datatable/styles.css'; import '../src/styles/theme.css'; import '../src/styles/app.css'; import { initialize, mswLoader } from 'msw-storybook-addon'; import { ColorSchemeScript, MantineProvider } from '@mantine/core'; import { shadcnCssVariableResolver } from '../src/cssVariableResolver'; import { theme as mantineTheme } from '../src/theme'; import { STORY_DATE_NOW_MS } from './constants'; type ColorSchemeValue = 'light' | 'dark'; initialize({ onUnhandledRequest: 'bypass', serviceWorker: { url: '/mockServiceWorker.js', }, }); const fixedDateNow = (() => { const patched = Date.now as typeof Date.now & { __storybookPatched?: boolean }; if (patched.__storybookPatched) { return patched; } const replacement = (() => STORY_DATE_NOW_MS) as typeof Date.now & { __storybookPatched?: boolean }; replacement.__storybookPatched = true; return replacement; })(); Date.now = fixedDateNow; export const parameters = { layout: 'fullscreen', options: { showPanel: false, // @ts-expect-error – storybook throws build error for (a: any, b: any) storySort: (a, b) => a.title.localeCompare(b.title, undefined, { numeric: true }), }, backgrounds: { disable: true }, viewport: { options: { md: { name: 'md', styles: { width: '1280px', height: '800px' } }, lg: { name: 'lg', styles: { width: '1920px', height: '1080px' } }, xl: { name: 'xl', styles: { width: '2560px', height: '1440px' } }, }, }, }; export const globalTypes = { theme: { name: 'Theme', description: 'Mantine color scheme', defaultValue: 'light', toolbar: { icon: 'mirror', items: [ { value: 'light', title: 'Light' }, { value: 'dark', title: 'Dark' }, ], }, }, }; export const decorators = [ (Story: any, context: any) => { const scheme = (context.parameters.theme ?? context.globals.theme ?? 'light') as ColorSchemeValue; return ( ); }, ]; export const loaders = [mswLoader]; ================================================ FILE: dashboard/.storybook/vitest.setup.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { setProjectAnnotations } from '@storybook/react-vite'; import * as projectAnnotations from './preview'; // This is an important step to apply the right configuration when testing your stories. // More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations setProjectAnnotations([projectAnnotations]); ================================================ FILE: dashboard/.stylelintignore ================================================ # Generated files dist # Theme files theme.css ================================================ FILE: dashboard/.stylelintrc.json ================================================ { "extends": ["stylelint-config-standard-scss"], "rules": { "custom-property-pattern": null, "selector-class-pattern": null, "scss/no-duplicate-mixins": null, "declaration-empty-line-before": null, "declaration-block-no-redundant-longhand-properties": null, "alpha-value-notation": null, "custom-property-empty-line-before": null, "property-no-vendor-prefix": null, "color-function-notation": null, "length-zero-no-unit": null, "selector-not-notation": null, "no-descending-specificity": null, "comment-empty-line-before": null, "scss/at-mixin-pattern": null, "scss/at-rule-no-unknown": null, "value-keyword-case": null, "media-feature-range-notation": null, "selector-pseudo-class-no-unknown": [ true, { "ignorePseudoClasses": ["global"] } ] } } ================================================ FILE: dashboard/README.md ================================================ # Agent-lightning Dashboard This is the dashboard for Agent-lightning. It is a web application that allows you to inspect your Agent-lightning store and debug running experiments. The dashboard is built with React, Mantine UI, and Storybook. ## npm scripts ## Build and dev scripts - `dev` – start development server - `build` – build production version of the app - `preview` – locally preview production build ### Testing scripts - `eslint` - runs ESLint - `stylelint` - runs Stylelint - `prettier` - runs Prettier - `typecheck` - runs TypeScript typecheck - `vitest` – runs vitest tests - `chromatic` – runs chromatic tests ### Other scripts - `storybook` – starts storybook dev server - `build-storybook` – build production storybook bundle to `storybook-static` ================================================ FILE: dashboard/eslint.config.js ================================================ // Copyright (c) Microsoft. All rights reserved. // @ts-check import stylistic from '@stylistic/eslint-plugin'; import mantine from 'eslint-config-mantine'; import { defineConfig } from 'eslint/config'; import tseslint from 'typescript-eslint'; export default defineConfig([ // These are arrays → safe to spread ...tseslint.configs.recommended, stylistic.configs.customize({ semi: true }), // mantine is often a single object → include as-is (or spread only if it's actually an array) ...(Array.isArray(mantine) ? mantine : [mantine]), // ignores go as their own entry { ignores: ['**/*.{mjs,cjs,js,d.ts,d.mts}'] }, // file-specific rules { files: ['**/*.story.tsx'], rules: { 'no-console': 'off' }, }, // project/TS settings + your custom rules { languageOptions: { parserOptions: { tsconfigRootDir: process.cwd(), project: ['./tsconfig.json'], }, }, rules: { // Disabling conflict rules with prettier '@stylistic/brace-style': ['error', '1tbs', { allowSingleLine: false }], '@stylistic/no-trailing-spaces': 'error', '@stylistic/no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }], '@stylistic/jsx-quotes': ['error', 'prefer-single'], '@stylistic/multiline-ternary': 'off', '@stylistic/arrow-parens': ['error', 'always'], '@stylistic/jsx-closing-bracket-location': 'off', '@stylistic/operator-linebreak': 'off', '@stylistic/jsx-newline': 'off', '@stylistic/jsx-one-expression-per-line': 'off', '@stylistic/indent': 'off', '@stylistic/indent-binary-ops': 'off', }, }, ]); ================================================ FILE: dashboard/package.json ================================================ { "name": "agent-lightning-dashboard", "type": "module", "version": "0.3.1", "scripts": { "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", "typecheck": "tsc --noEmit", "eslint": "eslint .", "stylelint": "stylelint '**/*.css'", "prettier": "prettier --check \"**/*.{ts,tsx,mjs,cjs}\"", "vitest": "vitest run --project unit", "vitest-storybook": "vitest run --project storybook", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "chromatic": "chromatic" }, "dependencies": { "@mantine/core": "8.3.5", "@mantine/hooks": "8.3.5", "@monaco-editor/react": "^4.7.0", "@reduxjs/toolkit": "^2.9.2", "@tabler/icons-react": "^3.35.0", "clsx": "^2.1.1", "dayjs": "^1.11.18", "mantine-datatable": "^8.2.0", "react": "^19.2.0", "react-dom": "^19.2.0", "react-redux": "^9.2.0", "react-router-dom": "^7.9.4" }, "devDependencies": { "@eslint/js": "^9.37.0", "@ianvs/prettier-plugin-sort-imports": "^4.7.0", "@storybook/addon-themes": "^9.1.10", "@storybook/addon-vitest": "^9.1.16", "@storybook/react": "^9.1.10", "@storybook/react-vite": "^9.1.10", "@stylistic/eslint-plugin": "^5.5.0", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@types/node": "^24.7.1", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.1", "@vitejs/plugin-react": "^5.0.4", "chromatic": "^13.3.3", "eslint": "^9.37.0", "eslint-config-mantine": "^4.0.3", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "identity-obj-proxy": "^3.0.0", "jsdom": "^27.0.0", "msw": "^2.11.6", "msw-storybook-addon": "^2.0.6", "postcss": "^8.5.6", "postcss-preset-mantine": "1.18.0", "postcss-simple-vars": "^7.0.1", "prettier": "^3.6.2", "prop-types": "^15.8.1", "storybook": "^9.1.10", "stylelint": "^16.25.0", "stylelint-config-standard-scss": "^16.0.0", "typescript": "^5.9.3", "typescript-eslint": "^8.46.0", "vite": "^7.1.9", "vite-tsconfig-paths": "^5.1.4", "vitest": "^4.0.0", "playwright": "^1.56.1", "@vitest/browser-playwright": "4.0.4", "@vitest/coverage-v8": "4.0.4" } } ================================================ FILE: dashboard/postcss.config.cjs ================================================ // Copyright (c) Microsoft. All rights reserved. module.exports = { plugins: { 'postcss-preset-mantine': {}, 'postcss-simple-vars': { variables: { 'mantine-breakpoint-xs': '36em', 'mantine-breakpoint-sm': '48em', 'mantine-breakpoint-md': '62em', 'mantine-breakpoint-lg': '75em', 'mantine-breakpoint-xl': '88em', }, }, }, }; ================================================ FILE: dashboard/public/index.html ================================================ Agent-lightning Dashboard
================================================ FILE: dashboard/public/main.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import '../src/main.js'; ================================================ FILE: dashboard/src/App.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import '@mantine/core/styles.css'; import 'mantine-datatable/styles.css'; import './styles/theme.css'; import './styles/app.css'; import { MantineProvider } from '@mantine/core'; import { useColorScheme } from '@mantine/hooks'; import { shadcnCssVariableResolver } from './cssVariableResolver'; import { selectThemePreference } from './features/config/selectors'; import { Router } from './Router'; import { useAppSelector } from './store/hooks'; import { shadcnTheme } from './theme'; export default function App() { const themePreference = useAppSelector(selectThemePreference); const systemColorScheme = useColorScheme(); const resolvedColorScheme = themePreference === 'system' ? systemColorScheme : themePreference; return ( ); } ================================================ FILE: dashboard/src/Router.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { createBrowserRouter, Navigate, RouterProvider } from 'react-router-dom'; import { AppLayoutWithState } from './layouts/AppLayout'; import { ResourcesPage } from './pages/Resources.page'; import { RolloutsPage } from './pages/Rollouts.page'; import { SettingsPage } from './pages/Settings.page'; import { TracesPage } from './pages/Traces.page'; import { WorkersPage } from './pages/Workers.page'; const router = createBrowserRouter([ { path: '/', element: , children: [ { index: true, element: , }, { path: 'rollouts', element: , }, { path: 'resources', element: , }, { path: 'traces', element: , }, { path: 'runners', element: , }, { path: 'settings', element: , }, ], }, ]); export function Router() { return ; } ================================================ FILE: dashboard/src/components/AppAlertBanner.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { Provider } from 'react-redux'; import { initialConfigState } from '@/features/config/slice'; import { initialRolloutsUiState } from '@/features/rollouts/slice'; import type { AlertsState, AlertTone } from '@/features/ui/alert'; import { initialDrawerState } from '@/features/ui/drawer/slice'; import { createAppStore } from '@/store'; import { STORY_BASE_URL, STORY_DATE_NOW_MS } from '../../.storybook/constants'; import { AppAlertBanner } from './AppAlertBanner'; const meta: Meta = { title: 'Components/AppAlertBanner', component: AppAlertBanner, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; function renderWithAlert(message: string, tone: AlertTone) { const alertState: AlertsState = { alerts: [ { id: 'storybook-alert', message, tone, isVisible: true, createdAt: STORY_DATE_NOW_MS, }, ], }; const store = createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, }, drawer: initialDrawerState, rollouts: initialRolloutsUiState, alert: alertState, }); return (
); } export const InfoAlert: Story = { render: () => renderWithAlert('Background synchronization completed successfully.', 'info'), }; export const WarningAlert: Story = { render: () => renderWithAlert('Rollout data may be stale. Check your network connection before continuing.', 'warning'), }; export const ErrorAlert: Story = { render: () => renderWithAlert('Unable to reach the Agent-lightning API. Retry or adjust the backend settings.', 'error'), }; export const NoAlert: Story = { render: () => { const store = createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, }, drawer: initialDrawerState, rollouts: initialRolloutsUiState, alert: { alerts: [] }, }); return (
); }, }; ================================================ FILE: dashboard/src/components/AppAlertBanner.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useEffect, useState } from 'react'; import { IconAlertCircle, IconAlertTriangle, IconInfoCircle } from '@tabler/icons-react'; import { Notification, Portal, Transition } from '@mantine/core'; import { hideAlert, selectHighestPriorityAlert, type AppAlert } from '@/features/ui/alert'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; const ALERT_META = { info: { color: 'blue', icon: IconInfoCircle, }, warning: { color: 'yellow', icon: IconAlertTriangle, }, error: { color: 'red', icon: IconAlertCircle, }, } as const; export function AppAlertBanner() { const dispatch = useAppDispatch(); const alert = useAppSelector(selectHighestPriorityAlert); const [transitionAlert, setTransitionAlert] = useState(alert); useEffect(() => { if (alert) { setTransitionAlert(alert); } }, [alert]); const handleClose = (id?: string) => { if (id) { dispatch(hideAlert({ id })); } }; const currentAlert = alert ?? transitionAlert; const mounted = Boolean(alert); if (!currentAlert) { return null; } const meta = ALERT_META[currentAlert.tone]; const IconComponent = meta.icon; return ( setTransitionAlert(null)} > {(styles) => ( } color={meta.color} variant='light' withCloseButton onClose={() => handleClose(currentAlert.id)} style={{ position: 'fixed', top: 16, right: 16, maxWidth: 450, width: 'calc(100% - 32px)', zIndex: 2000, boxShadow: 'var(--mantine-shadow-md)', ...styles, }} > {currentAlert.message} )} ); } ================================================ FILE: dashboard/src/components/AppDrawer.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'; import { Editor } from '@monaco-editor/react'; import { IconCheck, IconCopy } from '@tabler/icons-react'; import type { DataTableSortStatus } from 'mantine-datatable'; import { createSearchParams, Link, useInRouterContext, useLocation } from 'react-router-dom'; import { ActionIcon, Anchor, Badge, Box, CopyButton, Drawer, Group, Stack, Text, Tooltip, useMantineColorScheme, } from '@mantine/core'; import { useGetSpansQuery } from '@/features/rollouts'; import { closeDrawer, openDrawer, selectDrawerContent, selectDrawerIsOpen } from '@/features/ui/drawer'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import type { Attempt, AttemptStatus, Rollout, RolloutStatus, Span, Worker } from '@/types'; import { formatStatusLabel } from '@/utils/format'; import { TracesTable, type TracesTableRecord } from './TracesTable.component'; const ATTEMPT_STATUS_COLORS: Record = { failed: 'red', preparing: 'violet', running: 'blue', succeeded: 'teal', timeout: 'orange', unresponsive: 'orange', }; const ROLLOUT_STATUS_COLORS: Record = { cancelled: 'gray', failed: 'red', preparing: 'violet', queuing: 'blue', requeuing: 'cyan', running: 'blue', succeeded: 'teal', }; const SPAN_STATUS_COLORS: Record = { UNSET: 'gray', OK: 'teal', ERROR: 'red', }; const WORKER_STATUS_COLORS: Record = { busy: 'orange', idle: 'teal', unknown: 'gray', }; const TRACES_SORT_FIELD_MAP: Record = { name: 'name', traceId: 'trace_id', spanId: 'span_id', parentId: 'parent_id', statusCode: 'status_code', startTime: 'start_time', duration: 'duration', }; type SortDirection = 'asc' | 'desc'; type LocalSortState = { column: string; direction: SortDirection; }; function resolveTracesSortField(column: string): string { return TRACES_SORT_FIELD_MAP[column] ?? 'start_time'; } function getStatusBadgeColor(status: RolloutStatus | AttemptStatus, isAttempt: boolean) { if (isAttempt) { return ATTEMPT_STATUS_COLORS[status as AttemptStatus] ?? 'gray'; } return ROLLOUT_STATUS_COLORS[status as RolloutStatus] ?? 'gray'; } function formatJson(value: unknown) { try { return JSON.stringify(value, null, 2); } catch { return String(value); } } export type AppDrawerProps = { opened: boolean; onClose: () => void; title?: ReactNode; body?: ReactNode; }; export function AppDrawer({ opened, onClose, title, body }: AppDrawerProps) { return ( {body} ); } type TraceDrawerTitleProps = { span: Span; }; export function TraceDrawerTitle({ span }: TraceDrawerTitleProps) { const spanStatusCode = span.status?.status_code ?? null; const spanBadgeColor = spanStatusCode ? (SPAN_STATUS_COLORS[spanStatusCode] ?? 'gray') : undefined; return ( {span.name ?? span.spanId} {spanStatusCode ? ( {spanStatusCode} ) : null} {span.spanId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} Rollout {span.rolloutId} Attempt {span.attemptId ?? '—'} ); } type RolloutAttemptDrawerTitleProps = { rollout: Rollout; attempt: Attempt | null; }; export function RolloutAttemptDrawerTitle({ rollout, attempt }: RolloutAttemptDrawerTitleProps) { const rolloutId = rollout.rolloutId; const attemptId = attempt?.attemptId ?? null; const rolloutStatus = rollout.status ?? null; const attemptStatus = attempt?.status ?? null; const rolloutStatusLabel = rolloutStatus ? formatStatusLabel(rolloutStatus) : null; const attemptStatusLabel = attemptStatus ? formatStatusLabel(attemptStatus) : null; const hasStatusMismatch = rolloutStatus !== null && attemptStatus !== null && rolloutStatus !== attemptStatus; const rolloutBadgeColor = rolloutStatus ? getStatusBadgeColor(rolloutStatus, false) : undefined; const attemptBadgeColor = attemptStatus ? getStatusBadgeColor(attemptStatus, true) : undefined; const showRolloutBadgeInHeading = Boolean(rolloutStatusLabel && (!attemptStatus || hasStatusMismatch)); const showAttemptBadge = Boolean(attemptStatusLabel && attemptStatus); return ( {rolloutId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} {showRolloutBadgeInHeading && rolloutStatusLabel ? ( {rolloutStatusLabel} ) : null} {attemptId ? ( Attempt {attemptId} ) : null} {showAttemptBadge && attemptStatusLabel ? ( {attemptStatusLabel} ) : null} {!showRolloutBadgeInHeading && !attemptStatus && rolloutStatusLabel ? ( {rolloutStatusLabel} ) : null} ); } type JsonEditorProps = { value: unknown; }; export function JsonEditor({ value }: JsonEditorProps) { const { colorScheme } = useMantineColorScheme(); const editorTheme = colorScheme === 'dark' ? 'vs-dark' : 'vs-light'; return ( ); } type RolloutTracesDrawerBodyProps = { rollout: Rollout; attempt: Attempt | null; onShowRollout: (record: TracesTableRecord) => void; onShowSpanDetail: (record: TracesTableRecord) => void; }; function RolloutTracesDrawerBody({ rollout, attempt, onShowRollout, onShowSpanDetail }: RolloutTracesDrawerBodyProps) { const [page, setPage] = useState(1); const [recordsPerPage, setRecordsPerPage] = useState(100); const [sort, setSort] = useState({ column: 'startTime', direction: 'desc', }); useEffect(() => { setPage(1); }, [rollout.rolloutId, attempt?.attemptId]); const queryArgs = useMemo( () => ({ rolloutId: rollout.rolloutId, attemptId: attempt?.attemptId ?? undefined, limit: recordsPerPage, offset: Math.max(0, (page - 1) * recordsPerPage), sortBy: resolveTracesSortField(sort.column), sortOrder: sort.direction, }), [rollout.rolloutId, attempt?.attemptId, recordsPerPage, page, sort], ); const { data, isFetching, isError, error, refetch } = useGetSpansQuery(queryArgs); const spans = data?.items ?? []; const totalRecords = data?.total ?? 0; const tracesLinkSearch = useMemo(() => { const params = createSearchParams({ rolloutId: rollout.rolloutId, ...(attempt?.attemptId ? { attemptId: attempt.attemptId } : {}), }); return params.toString(); }, [attempt?.attemptId, rollout.rolloutId]); const tracesLinkHref = tracesLinkSearch ? `/traces?${tracesLinkSearch}` : '/traces'; const isWithinRouter = useInRouterContext(); const handleSortStatusChange = useCallback((status: DataTableSortStatus) => { setSort({ column: status.columnAccessor as string, direction: status.direction, }); }, []); const handlePageChange = useCallback((nextPage: number) => { setPage(nextPage); }, []); const handleRecordsPerPageChange = useCallback((value: number) => { setRecordsPerPage(value); setPage(1); }, []); return ( Showing spans for{' '} {rollout.rolloutId} {attempt ? ` · Attempt ${attempt.sequenceId} (${attempt.attemptId})` : ' · Latest attempt'} {isWithinRouter ? ( View full traces ) : ( View full traces )} {}} onRefetch={refetch} onShowRollout={onShowRollout} onShowSpanDetail={onShowSpanDetail} recordsPerPageOptions={[50, 100, 200, 500]} /> ); } type WorkerDrawerTitleProps = { worker: Worker; }; function WorkerDrawerTitle({ worker }: WorkerDrawerTitleProps) { const badgeColor = WORKER_STATUS_COLORS[worker.status] ?? 'gray'; return ( {worker.workerId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} {formatStatusLabel(worker.status)} Rollout {worker.currentRolloutId ?? '—'} Attempt {worker.currentAttemptId ?? '—'} ); } export function AppDrawerContainer() { const dispatch = useAppDispatch(); const isOpen = useAppSelector(selectDrawerIsOpen); const content = useAppSelector(selectDrawerContent); const isRouterAvailable = useInRouterContext(); const handleClose = useCallback(() => { dispatch(closeDrawer()); }, [dispatch]); const handleNavigation = useCallback(() => { if (isOpen) { dispatch(closeDrawer()); } }, [dispatch, isOpen]); const derivedContent = useMemo(() => { if (!content) { return null; } if (content.type === 'worker-detail') { const { worker } = content; const title = ; const body = ; return { title, body }; } if (content.type === 'trace-detail') { const { span } = content; const title = ; const body = ; return { title, body }; } const rollout = content.rollout; const attempt = content.attempt; const title = ; if (content.type === 'rollout-json') { const jsonValue = content.isNested && content.attempt ? content.attempt : rollout; const body = jsonValue ? : null; return { title, body }; } if (content.type === 'rollout-traces') { const body = ( { const attemptForRecord = attempt ?? rollout.attempt ?? null; dispatch( openDrawer({ type: 'rollout-json', rollout, attempt: attemptForRecord, isNested: content.isNested, }), ); }} onShowSpanDetail={(record) => { const attemptForRecord = attempt ?? rollout.attempt ?? null; dispatch( openDrawer({ type: 'trace-detail', span: record, rollout, attempt: attemptForRecord, }), ); }} /> ); return { title, body }; } return null; }, [content, dispatch]); if (!content || !derivedContent) { return null; } const { title, body } = derivedContent; return ( <> {isRouterAvailable ? : null} ); } type DrawerLocationWatcherProps = { onNavigation: () => void; }; function DrawerLocationWatcher({ onNavigation }: DrawerLocationWatcherProps) { const location = useLocation(); const lastLocationKeyRef = useRef(location.key); useEffect(() => { if (lastLocationKeyRef.current === location.key) { return; } lastLocationKeyRef.current = location.key; onNavigation(); }, [location.key, onNavigation]); return null; } ================================================ FILE: dashboard/src/components/AppDrawer.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { Provider } from 'react-redux'; import { initialConfigState } from '@/features/config/slice'; import { initialResourcesUiState } from '@/features/resources/slice'; import { rolloutsApi } from '@/features/rollouts'; import { initialRolloutsUiState } from '@/features/rollouts/slice'; import { initialTracesUiState } from '@/features/traces/slice'; import type { DrawerContent } from '@/features/ui/drawer'; import { createAppStore } from '@/store'; import type { Attempt, Rollout, Span } from '@/types'; import { STORY_BASE_URL, STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { AppDrawerContainer } from './AppDrawer.component'; const meta = { title: 'Components/AppDrawer', component: AppDrawerContainer, parameters: { layout: 'fullscreen', }, } satisfies Meta; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const baseAttempt: Attempt = { rolloutId: 'ro-story-001', attemptId: 'at-story-001', sequenceId: 1, startTime: now - 3600, endTime: null, status: 'running', workerId: 'worker-story', lastHeartbeatTime: now - 42, metadata: { info: 'Sample metadata', runId: 'run-123' }, }; const baseRollout: Rollout = { rolloutId: 'ro-story-001', input: { task: 'Generate daily summary', payload: { account: 'enterprise', date: '2024-02-19' }, }, startTime: now - 4000, endTime: null, mode: 'train', resourcesId: 'rs-story-001', status: 'running', config: { retries: 1, priority: 'high' }, metadata: { owner: 'storybook' }, attempt: baseAttempt, }; const noAttemptRollout: Rollout = { ...baseRollout, status: 'queuing', attempt: null, }; const mismatchRollout: Rollout = { ...baseRollout, status: 'running', attempt: { ...baseAttempt, status: 'failed', endTime: now - 1200, metadata: { info: 'Latest attempt failed', reason: 'Timeout' }, }, }; const sampleSpan: Span = { rolloutId: 'ro-story-001', attemptId: 'at-story-001', sequenceId: 2, traceId: 'tr-story-001', spanId: 'sp-story-001', parentId: null, name: 'Fetch Resources', status: { status_code: 'OK', description: 'Completed successfully' }, attributes: { 'http.method': 'GET', 'http.url': 'https://api.example.com/resources', 'duration_ms': 120, }, startTime: now - 240, endTime: now - 120, events: [], links: [], context: {}, parent: null, resource: {}, }; const sampleTraces: Span[] = [ sampleSpan, { ...sampleSpan, spanId: 'sp-story-002', name: 'Process Response', parentId: 'sp-story-001', sequenceId: 3, status: { status_code: 'ERROR', description: 'Unexpected response code' }, attributes: { ...sampleSpan.attributes, duration_ms: 240, }, startTime: now - 120, endTime: now - 30, }, ]; function renderWithDrawer(content: DrawerContent, options?: { spans?: Span[] }) { const store = createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, }, rollouts: initialRolloutsUiState, resources: initialResourcesUiState, traces: initialTracesUiState, drawer: { isOpen: true, content, }, }); if (content.type === 'rollout-traces' && options?.spans) { const defaultLimit = 100; const queryArgs = { rolloutId: content.rollout.rolloutId, attemptId: content.attempt?.attemptId ?? undefined, limit: defaultLimit, offset: 0, sortBy: 'start_time', sortOrder: 'desc' as const, }; store.dispatch( rolloutsApi.util.upsertQueryData('getSpans', queryArgs, { items: options.spans, total: options.spans.length, limit: defaultLimit, offset: 0, }), ); } return ( ); } export const RolloutJson: Story = { render: () => renderWithDrawer({ type: 'rollout-json', rollout: baseRollout, attempt: baseRollout.attempt, isNested: false, }), }; export const NestedAttemptJson: Story = { render: () => renderWithDrawer({ type: 'rollout-json', rollout: baseRollout, attempt: { ...baseAttempt, attemptId: 'at-story-002', sequenceId: 2, status: 'failed', endTime: now - 1200, metadata: { info: 'Secondary attempt', reason: 'Timeout' }, }, isNested: true, }), }; export const RolloutTraces: Story = { render: () => renderWithDrawer( { type: 'rollout-traces', rollout: baseRollout, attempt: baseRollout.attempt, isNested: false, }, { spans: sampleTraces }, ), }; export const NoAttempt: Story = { render: () => renderWithDrawer({ type: 'rollout-json', rollout: noAttemptRollout, attempt: null, isNested: false, }), }; export const StatusMismatch: Story = { render: () => renderWithDrawer({ type: 'rollout-json', rollout: mismatchRollout, attempt: mismatchRollout.attempt, isNested: false, }), }; export const SpanDetail: Story = { render: () => renderWithDrawer({ type: 'trace-detail', span: sampleSpan, rollout: mismatchRollout, attempt: mismatchRollout.attempt, }), }; export const LightTheme: Story = { render: () => renderWithDrawer({ type: 'rollout-json', rollout: baseRollout, attempt: baseRollout.attempt, isNested: false, }), parameters: { theme: 'light', }, }; export const DarkTheme: Story = { render: () => renderWithDrawer({ type: 'trace-detail', span: { ...sampleSpan, spanId: 'sp-story-002', name: 'Process Response', status: { status_code: 'ERROR', description: 'Unexpected response code' }, }, rollout: mismatchRollout, attempt: mismatchRollout.attempt, }), parameters: { theme: 'dark', }, }; ================================================ FILE: dashboard/src/components/ResourcesTable.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo, useState, type ReactNode, type SetStateAction } from 'react'; import { IconCheck, IconCopy, IconRefresh } from '@tabler/icons-react'; import { DataTable, type DataTableColumn, type DataTableSortStatus } from 'mantine-datatable'; import { ActionIcon, Box, Button, CopyButton, Group, Stack, Text, Tooltip } from '@mantine/core'; import { useElementSize, useViewportSize } from '@mantine/hooks'; import { getLayoutAwareWidth } from '@/layouts/helper'; import type { Resources } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; import { formatDateTime, safeStringify } from '@/utils/format'; import { createResponsiveColumns, type ColumnVisibilityConfig } from '@/utils/table'; const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [50, 100, 200, 500]; const COLUMN_VISIBILITY: Record = { resourcesId: { fixedWidth: 12, priority: 0 }, version: { fixedWidth: 8, priority: 1 }, createTime: { fixedWidth: 14, priority: 2 }, updateTime: { fixedWidth: 14, priority: 2 }, resourceCount: { fixedWidth: 8, priority: 3 }, resourcesPreview: { minWidth: 16, priority: 4 }, }; export type ResourcesTableRecord = Resources & { resourceCount: number; canExpand: boolean; resourcesPreview: string; }; function buildResourcesRecord(resources: Resources): ResourcesTableRecord { const resourceCount = Object.keys(resources.resources ?? {}).length; const resourcesValue = resources.resources === null || typeof resources.resources === 'undefined' ? '—' : typeof resources.resources === 'string' ? resources.resources : safeStringify(resources.resources); return { ...resources, resourceCount, canExpand: resourceCount > 0, resourcesPreview: resourcesValue, }; } type ResourcesColumnsOptions = Record; function createResourcesColumns(_options: ResourcesColumnsOptions): DataTableColumn[] { return [ { accessor: 'resourcesId', title: 'Resources ID', sortable: true, render: ({ resourcesId }) => ( {resourcesId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} ), }, { accessor: 'version', title: 'Version', sortable: true, textAlign: 'left', render: ({ version }) => {version}, }, { accessor: 'createTime', title: 'Created', sortable: true, textAlign: 'left', render: ({ createTime }) => {formatDateTime(createTime)}, }, { accessor: 'updateTime', title: 'Updated', sortable: true, textAlign: 'left', render: ({ updateTime }) => {formatDateTime(updateTime)}, }, { accessor: 'resourceCount', title: 'Count', sortable: true, textAlign: 'left', render: ({ resourceCount }) => {resourceCount}, }, { accessor: 'resourcesPreview', title: 'Preview', render: ({ resourcesPreview }) => ( {resourcesPreview} ), }, ]; } type RowExpansionRenderer = (context: { resources: Resources; columns: DataTableColumn[]; }) => ReactNode; export type ResourcesTableProps = { resourcesList: Resources[] | undefined; totalRecords: number; isFetching: boolean; isError: boolean; error: unknown; searchTerm: string; sort: { column: string; direction: 'asc' | 'desc' }; page: number; recordsPerPage: number; onSortStatusChange: (status: DataTableSortStatus) => void; onPageChange: (page: number) => void; onRecordsPerPageChange: (value: number) => void; onResetFilters: () => void; onRefetch: () => void; recordsPerPageOptions?: number[]; renderRowExpansion?: RowExpansionRenderer; }; export function ResourcesTable({ resourcesList, totalRecords, isFetching, isError, error, searchTerm, sort, page, recordsPerPage, onSortStatusChange, onPageChange, onRecordsPerPageChange, onResetFilters, onRefetch, recordsPerPageOptions = DEFAULT_RECORDS_PER_PAGE_OPTIONS, renderRowExpansion, }: ResourcesTableProps) { const [expandedRecordIds, setExpandedRecordIds] = useState([]); const { ref: tableContainerRef, width: containerWidth } = useElementSize(); const { width: viewportWidth } = useViewportSize(); const layoutAwareContainerWidth = useMemo( () => getLayoutAwareWidth(containerWidth, viewportWidth), [containerWidth, viewportWidth], ); const resourcesRecords = useMemo(() => { if (!resourcesList) { return []; } return resourcesList.map((resourcesItem) => buildResourcesRecord(resourcesItem)); }, [resourcesList]); const columns = useMemo(() => createResourcesColumns({}), []); const responsiveColumns = useMemo( () => createResponsiveColumns(columns, layoutAwareContainerWidth, COLUMN_VISIBILITY), [columns, layoutAwareContainerWidth], ); const totalPages = useMemo( () => Math.max(1, Math.ceil(Math.max(0, totalRecords) / Math.max(1, recordsPerPage))), [recordsPerPage, totalRecords], ); useEffect(() => { if (page > totalPages) { onPageChange(totalPages); } }, [onPageChange, page, totalPages]); useEffect(() => { setExpandedRecordIds((current) => current.filter((id) => resourcesRecords.some((record) => record.resourcesId === id && record.canExpand)), ); }, [resourcesRecords]); const hasActiveFilters = searchTerm.trim().length > 0; const sortStatus: DataTableSortStatus = { columnAccessor: sort.column, direction: sort.direction, }; const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { onSortStatusChange(status); }, [onSortStatusChange], ); const errorDescriptor = isError ? getErrorDescriptor(error) : null; const errorMessage = isError ? `Resources are temporarily unavailable${errorDescriptor ? ` (${errorDescriptor})` : ''}.` : 'Resources are temporarily unavailable.'; const emptyState = ( {isError ? ( <> {errorMessage} Use the retry button to try again, or adjust the filters to broaden the results. {hasActiveFilters ? ( ) : null} ) : ( <> No resources found {hasActiveFilters ? 'Try adjusting the search to see more results.' : 'Try refreshing to fetch the latest resources.'} {hasActiveFilters ? ( ) : null} )} ); return ( classNames={{ root: 'resources-table' }} withTableBorder withColumnBorders highlightOnHover verticalAlign='center' minHeight={resourcesRecords.length === 0 ? 500 : undefined} idAccessor='resourcesId' records={resourcesRecords} columns={responsiveColumns} totalRecords={totalRecords} recordsPerPage={recordsPerPage} page={page} onPageChange={onPageChange} onRecordsPerPageChange={onRecordsPerPageChange} recordsPerPageOptions={recordsPerPageOptions} sortStatus={sortStatus} onSortStatusChange={handleSortStatusChange} fetching={isFetching} loaderSize='sm' emptyState={resourcesRecords.length === 0 ? emptyState : undefined} rowExpansion={ renderRowExpansion ? { allowMultiple: true, expandable: ({ record }) => record.canExpand, expanded: { recordIds: expandedRecordIds, onRecordIdsChange: (nextRecordIds: SetStateAction) => { setExpandedRecordIds((previous) => { const resolved = typeof nextRecordIds === 'function' ? nextRecordIds(previous) : ((nextRecordIds ?? []) as (string | number)[]); return resolved .map(String) .filter((id) => resourcesRecords.some( (tableRecord) => tableRecord.resourcesId === id && tableRecord.canExpand, ), ); }); }, }, content: ({ record }) => renderRowExpansion({ resources: record, columns: responsiveColumns }), } : undefined } /> ); } ================================================ FILE: dashboard/src/components/ResourcesTable.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useMemo, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { IconSearch } from '@tabler/icons-react'; import { Box, Stack, TextInput, Title } from '@mantine/core'; import type { Resources } from '@/types'; import { ResourcesTable } from './ResourcesTable.component'; import { ResourcesTree } from './ResourcesTree.component'; const meta: Meta = { title: 'Components/ResourcesTable', component: ResourcesTable, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; const sampleResources: Resources[] = [ { resourcesId: 'rs-story-001', version: 1, createTime: 1710806400, updateTime: 1713412800, resources: { model: { name: 'gpt-4', version: '2024-01-01', temperature: 0.7, maxTokens: 2048, topP: 0.9, }, database: { host: 'db.example.com', port: 5432, name: 'production', pool: { min: 2, max: 10, idle: 30000, }, }, cache: { type: 'redis', host: 'cache.example.com', port: 6379, ttl: 3600, }, }, }, { resourcesId: 'rs-story-002', version: 2, createTime: 1712217600, updateTime: 1714823200, resources: { model: { name: 'claude-3-opus', version: '2024-02-01', temperature: 0.5, maxTokens: 4096, }, storage: { type: 's3', bucket: 'training-data', region: 'us-east-1', credentials: { accessKeyId: 'AKIA***', encrypted: true, }, }, compute: { instances: [ { id: 'i-001', type: 't3.large', zone: 'us-east-1a' }, { id: 'i-002', type: 't3.large', zone: 'us-east-1b' }, ], autoScaling: { min: 2, max: 10, targetCpu: 70, }, }, }, }, { resourcesId: 'rs-story-003', version: 3, createTime: 1709251200, updateTime: 1711856800, resources: { model: { name: 'gpt-3.5-turbo', version: '2023-12-01', temperature: 0.8, maxTokens: 1024, }, monitoring: { enabled: true, interval: 60, metrics: ['cpu', 'memory', 'disk', 'network'], alerts: { email: 'ops@example.com', slack: '#alerts', pagerduty: true, }, }, }, }, { resourcesId: 'rs-story-004', version: 1, createTime: 1706745600, updateTime: 1709347200, resources: { apiKeys: { openai: 'sk-***', anthropic: 'sk-ant-***', replicate: 'r8-***', }, rateLimits: { requestsPerMinute: 100, tokensPerDay: 1000000, concurrent: 5, }, }, }, { resourcesId: 'rs-story-005', version: 1, createTime: 1704067200, updateTime: 1706668800, resources: {}, }, ]; type WrapperProps = { maxWidth: number; resourcesList?: Resources[] | undefined; isFetching?: boolean; isError?: boolean; error?: unknown; }; function ResourcesTableStoryWrapper({ maxWidth, resourcesList = sampleResources, isFetching = false, isError = false, error = null, }: WrapperProps) { const [searchTerm, setSearchTerm] = useState(''); const [page, setPage] = useState(1); const [recordsPerPage, setRecordsPerPage] = useState(5); const [sort, setSort] = useState<{ column: string; direction: 'asc' | 'desc' }>({ column: 'resourcesId', direction: 'asc', }); const baseResources = resourcesList ?? []; const filteredResources = useMemo(() => { const normalized = searchTerm.trim().toLowerCase(); if (normalized.length === 0) { return baseResources; } return baseResources.filter((resource) => resource.resourcesId.toLowerCase().includes(normalized)); }, [baseResources, searchTerm]); const sortedResources = useMemo(() => { const items = filteredResources.slice(); const resolveSortValue = (resource: Resources, column: string) => { switch (column) { case 'version': return resource.version; case 'createTime': return resource.createTime; case 'updateTime': return resource.updateTime; case 'resourceCount': return Object.keys(resource.resources ?? {}).length; case 'resourcesId': default: return resource.resourcesId; } }; items.sort((a, b) => { const aValue = resolveSortValue(a, sort.column); const bValue = resolveSortValue(b, sort.column); if (aValue === bValue) { return 0; } if (typeof aValue === 'number' && typeof bValue === 'number') { return aValue - bValue; } return String(aValue).localeCompare(String(bValue)); }); if (sort.direction === 'desc') { items.reverse(); } return items; }, [filteredResources, sort]); const totalRecordsValue = sortedResources.length; const pagedResources = useMemo(() => { const startIndex = (page - 1) * recordsPerPage; return sortedResources.slice(startIndex, startIndex + recordsPerPage); }, [page, recordsPerPage, sortedResources]); return ( Resources { setSearchTerm(event.currentTarget.value); setPage(1); }} leftSection={} data-testid='resources-search-input' w='100%' style={{ maxWidth: 360 }} /> { setSort({ column: status.columnAccessor as string, direction: status.direction, }); }} onPageChange={setPage} onRecordsPerPageChange={(value) => { setRecordsPerPage(value); setPage(1); }} onResetFilters={() => { setSearchTerm(''); setSort({ column: 'resourcesId', direction: 'asc' }); setPage(1); }} onRefetch={() => undefined} recordsPerPageOptions={[5, 10, 20]} renderRowExpansion={({ resources }) => } /> ); } export const WideContainer: Story = { render: () => , }; export const MediumContainer: Story = { render: () => , }; export const NarrowContainer: Story = { render: () => , }; export const DrawerWidth: Story = { render: () => , }; export const ErrorState: Story = { render: () => ( ), }; export const EmptyResources: Story = { render: () => ( ), }; export const LoadingState: Story = { render: () => , }; ================================================ FILE: dashboard/src/components/ResourcesTree.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useMemo } from 'react'; import { IconAlertCircle, IconChevronRight } from '@tabler/icons-react'; import { Box, Group, Stack, Text, Tree, type TreeNodeData } from '@mantine/core'; import type { Resources } from '@/types'; import { safeStringify } from '@/utils/format'; function convertToTreeData(obj: any, key: string = 'root', parentPath = ''): TreeNodeData { const isObject = obj !== null && typeof obj === 'object' && !Array.isArray(obj); const isArray = Array.isArray(obj); const currentPath = parentPath ? `${parentPath}.${key}` : key; if (isObject) { const children = Object.entries(obj).map(([childKey, childValue]) => convertToTreeData(childValue, childKey, currentPath), ); return { value: currentPath, label: ( {key} (Object) ), children: children.length > 0 ? children : undefined, }; } if (isArray) { const children = obj.map((item: any, index: number) => convertToTreeData(item, `[${index}]`, currentPath)); return { value: currentPath, label: ( {key} (Array[ {obj.length} ]) ), children: children.length > 0 ? children : undefined, }; } // Primitive value return { value: currentPath, label: ( {key}: {safeStringify(obj)} ), }; } export type ResourcesTreeProps = { resources: Resources; }; export function ResourcesTree({ resources }: ResourcesTreeProps) { const resourcesDict = resources.resources ?? {}; const treeData = useMemo(() => { const entries = Object.entries(resourcesDict); if (entries.length === 0) { return []; } return entries.map(([key, value]) => convertToTreeData(value, key)); }, [resourcesDict]); if (treeData.length === 0) { return ( No resources found ); } return ( ( {hasChildren && ( )} {node.label} )} /> ); } ================================================ FILE: dashboard/src/components/ResourcesTree.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { Box, Stack, Title } from '@mantine/core'; import type { Resources } from '@/types'; import { ResourcesTree } from './ResourcesTree.component'; const meta: Meta = { title: 'Components/ResourcesTree', component: ResourcesTree, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; const simpleResources: Resources = { resourcesId: 'rs-simple-001', version: 1, createTime: 1704067200, updateTime: 1706668800, resources: { apiKey: { value: 'sk-test-key-123', type: 'secret' }, maxRetries: { value: 3, description: 'Maximum retry attempts' }, timeout: { value: 30000, unit: 'ms' }, enabled: { value: true }, }, }; const nestedResources: Resources = { resourcesId: 'rs-nested-001', version: 2, createTime: 1709251200, updateTime: 1711856800, resources: { model: { name: 'gpt-4', version: '2024-01-01', temperature: 0.7, maxTokens: 2048, topP: 0.9, }, database: { host: 'db.example.com', port: 5432, name: 'production', pool: { min: 2, max: 10, idle: 30000, }, }, cache: { type: 'redis', host: 'cache.example.com', port: 6379, ttl: 3600, }, }, }; const arrayResources: Resources = { resourcesId: 'rs-array-001', version: 3, createTime: 1712217600, updateTime: 1714823200, resources: { compute: { instances: [ { id: 'i-001', type: 't3.large', zone: 'us-east-1a', status: 'running' }, { id: 'i-002', type: 't3.large', zone: 'us-east-1b', status: 'running' }, { id: 'i-003', type: 't3.xlarge', zone: 'us-east-1c', status: 'stopped' }, ], autoScaling: { min: 2, max: 10, targetCpu: 70, }, }, tags: ['production', 'ml-training', 'auto-scale'], ports: [80, 443, 8080], }, }; const complexResources: Resources = { resourcesId: 'rs-complex-001', version: 4, createTime: 1706745600, updateTime: 1710000000, resources: { model: { name: 'claude-3-opus', version: '2024-02-01', temperature: 0.5, maxTokens: 4096, providers: [ { name: 'anthropic', priority: 1, enabled: true }, { name: 'aws-bedrock', priority: 2, enabled: false }, ], }, storage: { type: 's3', bucket: 'training-data', region: 'us-east-1', credentials: { accessKeyId: 'AKIA***', encrypted: true, }, lifecycle: { transitionToIA: 30, transitionToGlacier: 90, expiration: 365, }, }, monitoring: { enabled: true, interval: 60, metrics: ['cpu', 'memory', 'disk', 'network'], alerts: { email: 'ops@example.com', slack: '#alerts', pagerduty: true, thresholds: { cpu: { warning: 70, critical: 90 }, memory: { warning: 80, critical: 95 }, disk: { warning: 75, critical: 90 }, }, }, }, apiKeys: { openai: 'sk-***', anthropic: 'sk-ant-***', replicate: 'r8-***', }, rateLimits: { requestsPerMinute: 100, tokensPerDay: 1000000, concurrent: 5, burstMultiplier: 1.5, }, }, }; const emptyResources: Resources = { resourcesId: 'rs-empty-001', version: 1, createTime: 1702000000, updateTime: 1704600000, resources: {}, }; type WrapperProps = { resources: Resources; maxWidth?: number; }; function ResourcesTreeStoryWrapper({ resources, maxWidth = 800 }: WrapperProps) { return ( Resources: {resources.resourcesId} ); } export const SimpleValues: Story = { render: () => , }; export const NestedObjects: Story = { render: () => , }; export const WithArrays: Story = { render: () => , }; export const ComplexStructure: Story = { render: () => , }; export const EmptyResources: Story = { render: () => , }; export const NarrowContainer: Story = { render: () => , }; export const WideContainer: Story = { render: () => , }; ================================================ FILE: dashboard/src/components/RolloutTable.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo, useState, type ReactNode, type SetStateAction } from 'react'; import { IconAlertCircle, IconCheck, IconCopy, IconFileDescription, IconRefresh, IconReload, IconTimeline, } from '@tabler/icons-react'; import { DataTable, type DataTableColumn, type DataTableSortStatus } from 'mantine-datatable'; import { ActionIcon, Alert, Badge, Box, Button, CopyButton, Group, MultiSelect, Stack, Text, Tooltip, } from '@mantine/core'; import { useElementSize, useViewportSize } from '@mantine/hooks'; import { type Attempt, type AttemptStatus, type Rollout, type RolloutMode, type RolloutsSortState, type RolloutStatus, } from '@/features/rollouts'; import { getLayoutAwareWidth } from '@/layouts/helper'; import { clampToNow, formatDateTime, formatDuration, formatRelativeTime, formatStatusLabel, safeStringify, toTimestamp, } from '@/utils/format'; import { createResponsiveColumns, type ColumnVisibilityConfig } from '@/utils/table'; const ROLLOUT_STATUS_OPTIONS: RolloutStatus[] = [ 'queuing', 'preparing', 'running', 'failed', 'succeeded', 'cancelled', 'requeuing', ]; const ATTEMPT_STATUS_COLORS: Record = { failed: 'red', preparing: 'violet', running: 'blue', succeeded: 'teal', timeout: 'orange', unresponsive: 'orange', }; const ROLLOUT_STATUS_COLORS: Record = { cancelled: 'gray', failed: 'red', preparing: 'violet', queuing: 'gray', requeuing: 'gray', running: 'blue', succeeded: 'teal', }; const ROLLOUT_MODE_OPTIONS: RolloutMode[] = ['train', 'val', 'test']; const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [50, 100, 200, 500]; const COLUMN_VISIBILITY: Record = { rolloutId: { fixedWidth: 12.5, priority: 0 }, actionsPlaceholder: { fixedWidth: 6.5, priority: 0 }, inputText: { minWidth: 14, priority: 1 }, statusValue: { fixedWidth: 10, priority: 1 }, startTimestamp: { fixedWidth: 12, priority: 2 }, durationSeconds: { fixedWidth: 10, priority: 2 }, attemptId: { fixedWidth: 12, priority: 3 }, resourcesId: { fixedWidth: 10, priority: 3 }, mode: { fixedWidth: 8, priority: 3 }, lastHeartbeatTimestamp: { fixedWidth: 10, priority: 3 }, workerId: { fixedWidth: 10, priority: 3 }, }; export type RolloutTableRecord = Rollout & { attemptId: string | null; attemptSequence: number | null; isNested: boolean; canExpand: boolean; inputText: string; attemptStatus?: AttemptStatus; statusValue: string; startTimestamp: number | null; durationSeconds: number | null; lastHeartbeatTimestamp: number | null; workerId: string | null; actionsPlaceholder?: null; }; function selectHeartbeatTimestamp(attempt?: Attempt | null): number | null { if (!attempt || attempt.lastHeartbeatTime == null || Number.isNaN(attempt.lastHeartbeatTime)) { return null; } return attempt.lastHeartbeatTime; } export function buildRolloutRecord(rollout: Rollout): RolloutTableRecord { const latestAttempt = rollout.attempt; const inputValue = rollout.input === null || typeof rollout.input === 'undefined' ? '—' : typeof rollout.input === 'string' ? rollout.input : safeStringify(rollout.input); const startTimestamp = toTimestamp(latestAttempt?.startTime ?? rollout.startTime); const endTimestamp = toTimestamp(latestAttempt?.endTime ?? rollout.endTime); const durationSeconds = clampToNow(startTimestamp, endTimestamp); const attemptStatus = latestAttempt?.status; const sequenceId = latestAttempt?.sequenceId; const statusValue = attemptStatus && attemptStatus !== rollout.status ? `${rollout.status}-${attemptStatus}` : rollout.status; return { ...rollout, attempt: latestAttempt ?? null, attemptId: latestAttempt?.attemptId ?? null, attemptSequence: latestAttempt?.sequenceId ?? null, isNested: false, canExpand: Boolean(sequenceId && sequenceId > 1), inputText: inputValue, attemptStatus, statusValue, startTimestamp, durationSeconds, lastHeartbeatTimestamp: rollout.attempt?.lastHeartbeatTime ?? null, workerId: latestAttempt?.workerId ?? null, actionsPlaceholder: null, }; } function buildAttemptRecord(rollout: Rollout, attempt: Attempt): RolloutTableRecord { const inputValue = rollout.input === null || typeof rollout.input === 'undefined' ? '—' : typeof rollout.input === 'string' ? rollout.input : safeStringify(rollout.input); const startTimestamp = toTimestamp(attempt.startTime ?? rollout.startTime); const endTimestamp = toTimestamp(attempt.endTime); const durationSeconds = clampToNow(startTimestamp, endTimestamp); const lastHeartbeatTimestamp = selectHeartbeatTimestamp(attempt); return { ...rollout, attempt, attemptId: attempt.attemptId, attemptSequence: attempt.sequenceId, isNested: true, canExpand: false, inputText: inputValue, attemptStatus: attempt.status, statusValue: attempt.status, startTimestamp, durationSeconds, lastHeartbeatTimestamp, workerId: attempt.workerId ?? null, actionsPlaceholder: null, }; } function getStatusBadge(status: string, kind: 'rollout' | 'attempt') { const color = kind === 'rollout' ? (ROLLOUT_STATUS_COLORS[status as RolloutStatus] ?? 'gray') : (ATTEMPT_STATUS_COLORS[status as AttemptStatus] ?? 'gray'); return ( {formatStatusLabel(status)} ); } type RolloutColumnsOptions = { statusFilters: RolloutStatus[]; onStatusFilterChange: (values: RolloutStatus[]) => void; onStatusFilterReset: () => void; modeFilters: RolloutMode[]; onModeFilterChange: (values: RolloutMode[]) => void; onModeFilterReset: () => void; onViewRawJson?: (record: RolloutTableRecord) => void; onViewTraces?: (record: RolloutTableRecord) => void; }; function createRolloutColumns({ statusFilters, onStatusFilterChange, onStatusFilterReset, modeFilters, onModeFilterChange, onModeFilterReset, onViewRawJson, onViewTraces, }: RolloutColumnsOptions): DataTableColumn[] { const statusOptions = ROLLOUT_STATUS_OPTIONS.map((status) => ({ value: status, label: formatStatusLabel(status), })); const modeOptions = ROLLOUT_MODE_OPTIONS.map((mode) => ({ value: mode, label: formatStatusLabel(mode), })); return [ { accessor: 'rolloutId', title: 'Rollout', sortable: true, render: ({ rolloutId }) => ( {rolloutId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} ), }, { accessor: 'attemptId', title: 'Attempt', sortable: true, render: ({ attemptId, attemptSequence, isNested }) => ( {attemptId ?? '—'} {attemptId && ( {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} )} {attemptSequence && (isNested || attemptSequence > 1) && ( } pl={6} pr={6}> {attemptSequence} )} ), }, { accessor: 'inputText', title: 'Input', render: ({ inputText }) => ( {inputText} ), }, { accessor: 'statusValue', title: 'Status', sortable: true, filter: ({ close }) => ( onStatusFilterChange(values as RolloutStatus[])} /> ), filtering: statusFilters.length > 0, render: ({ status, attemptStatus, isNested }) => { if (isNested) { return {getStatusBadge(attemptStatus ?? 'unknown', 'attempt')}; } if (attemptStatus && attemptStatus !== status) { return ( {getStatusBadge(status, 'rollout')} {getStatusBadge(attemptStatus, 'attempt')} ); } return getStatusBadge(status, 'rollout'); }, }, { accessor: 'resourcesId', title: 'Resources', sortable: true, render: ({ resourcesId }) => ( {resourcesId ?? '—'} ), }, { accessor: 'mode', title: 'Mode', sortable: true, filter: ({ close }) => ( onModeFilterChange(values as RolloutMode[])} /> ), filtering: modeFilters.length > 0, render: ({ mode }) => ( {mode ?? '—'} ), }, { accessor: 'startTimestamp', title: 'Start Time', sortable: true, textAlign: 'left', render: ({ startTimestamp }) => {formatDateTime(startTimestamp)}, }, { accessor: 'durationSeconds', title: 'Duration', sortable: true, textAlign: 'left', render: ({ durationSeconds }) => {formatDuration(durationSeconds)}, }, { accessor: 'lastHeartbeatTimestamp', title: 'Last Heartbeat', sortable: true, textAlign: 'left', render: ({ lastHeartbeatTimestamp, attempt, isNested }) => { if (!attempt && isNested) { return ( ); } return {formatRelativeTime(lastHeartbeatTimestamp)}; }, }, { accessor: 'workerId', title: 'Worker', sortable: true, render: ({ workerId }) => ( {workerId ?? '—'} ), }, { accessor: 'actionsPlaceholder', title: 'Actions', render: (record) => ( { event.stopPropagation(); onViewRawJson?.(record); }} > { event.stopPropagation(); onViewTraces?.(record); }} > ), }, ]; } type RowExpansionRenderer = (context: { rollout: Rollout; columns: DataTableColumn[]; }) => ReactNode; export type RolloutTableProps = { rollouts: Rollout[] | undefined; totalRecords: number; isFetching: boolean; isError: boolean; error: unknown; searchTerm: string; statusFilters: RolloutStatus[]; modeFilters: RolloutMode[]; sort: RolloutsSortState; page: number; recordsPerPage: number; onStatusFilterChange: (values: RolloutStatus[]) => void; onStatusFilterReset: () => void; onModeFilterChange: (values: RolloutMode[]) => void; onModeFilterReset: () => void; onSortStatusChange: (status: DataTableSortStatus) => void; onPageChange: (page: number) => void; onRecordsPerPageChange: (value: number) => void; onResetFilters: () => void; onRefetch: () => void; onViewRawJson?: (record: RolloutTableRecord) => void; onViewTraces?: (record: RolloutTableRecord) => void; recordsPerPageOptions?: number[]; renderRowExpansion?: RowExpansionRenderer; }; export function RolloutTable({ rollouts, totalRecords, isFetching, isError, error, searchTerm, statusFilters, modeFilters, sort, page, recordsPerPage, onStatusFilterChange, onStatusFilterReset, onModeFilterChange, onModeFilterReset, onSortStatusChange, onPageChange, onRecordsPerPageChange, onResetFilters, onRefetch, onViewRawJson, onViewTraces, recordsPerPageOptions = DEFAULT_RECORDS_PER_PAGE_OPTIONS, renderRowExpansion, }: RolloutTableProps) { const [expandedRecordIds, setExpandedRecordIds] = useState([]); const { ref: tableContainerRef, width: containerWidth } = useElementSize(); const { width: viewportWidth } = useViewportSize(); const layoutAwareContainerWidth = useMemo(() => { return getLayoutAwareWidth(containerWidth, viewportWidth); }, [containerWidth, viewportWidth]); const rolloutRecords = useMemo(() => { if (!rollouts) { return []; } return rollouts.map((rolloutItem) => buildRolloutRecord(rolloutItem)); }, [rollouts]); const columns = useMemo( () => createRolloutColumns({ statusFilters, onStatusFilterChange, onStatusFilterReset, modeFilters, onModeFilterChange, onModeFilterReset, onViewRawJson, onViewTraces, }), [ statusFilters, onStatusFilterChange, onStatusFilterReset, modeFilters, onModeFilterChange, onModeFilterReset, onViewRawJson, onViewTraces, ], ); const responsiveColumns = useMemo( () => createResponsiveColumns(columns, layoutAwareContainerWidth, COLUMN_VISIBILITY), [columns, layoutAwareContainerWidth], ); const totalPages = useMemo( () => Math.max(1, Math.ceil(Math.max(0, totalRecords) / Math.max(1, recordsPerPage))), [recordsPerPage, totalRecords], ); useEffect(() => { if (page > totalPages) { onPageChange(totalPages); } }, [onPageChange, page, totalPages]); useEffect(() => { setExpandedRecordIds((current) => current.filter((id) => rolloutRecords.some((record) => record.rolloutId === id && record.canExpand)), ); }, [rolloutRecords]); const hasActiveFilters = searchTerm.trim().length > 0 || statusFilters.length > 0 || modeFilters.length > 0; const sortStatus: DataTableSortStatus = { columnAccessor: sort.column, direction: sort.direction, }; const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { onSortStatusChange(status); }, [onSortStatusChange], ); const errorMessage = isError && error && typeof error === 'object' && 'status' in (error as Record) ? `Rollouts are temporarily unavailable (status: ${String((error as Record).status)}).` : 'Rollouts are temporarily unavailable.'; const emptyState = ( {isError ? ( <> {errorMessage} Use the retry button to try again, or adjust the filters to broaden the results. {hasActiveFilters ? ( ) : null} ) : ( <> No rollouts found {hasActiveFilters ? 'Try adjusting the search or filters to see more results.' : 'Try refreshing to fetch the latest rollouts.'} {hasActiveFilters ? ( ) : null} )} ); return ( classNames={{ root: 'rollouts-table' }} withTableBorder withColumnBorders highlightOnHover verticalAlign='center' minHeight={rolloutRecords.length === 0 ? 500 : undefined} idAccessor='rolloutId' records={rolloutRecords} columns={responsiveColumns} totalRecords={totalRecords} recordsPerPage={recordsPerPage} page={page} onPageChange={onPageChange} onRecordsPerPageChange={onRecordsPerPageChange} recordsPerPageOptions={recordsPerPageOptions} sortStatus={sortStatus} onSortStatusChange={handleSortStatusChange} fetching={isFetching} loaderSize='sm' emptyState={rolloutRecords.length === 0 ? emptyState : undefined} rowExpansion={ renderRowExpansion ? { allowMultiple: true, expandable: ({ record }) => record.canExpand, expanded: { recordIds: expandedRecordIds, onRecordIdsChange: (nextRecordIds: SetStateAction) => { setExpandedRecordIds((previous) => { const resolved = typeof nextRecordIds === 'function' ? nextRecordIds(previous) : ((nextRecordIds ?? []) as (string | number)[]); return resolved .map(String) .filter((id) => rolloutRecords.some((tableRecord) => tableRecord.rolloutId === id && tableRecord.canExpand), ); }); }, }, content: ({ record }) => renderRowExpansion({ rollout: record, columns: responsiveColumns }), } : undefined } /> ); } export type RolloutAttemptsTableProps = { rollout: Rollout; attempts: Attempt[] | undefined; isFetching: boolean; isError: boolean; onRetry: () => void; columns: DataTableColumn[]; }; export function RolloutAttemptsTable({ rollout, attempts, isFetching, isError, onRetry, columns, }: RolloutAttemptsTableProps) { const attemptRecords = useMemo(() => { if (!attempts) { return []; } return attempts .map((attempt) => buildAttemptRecord(rollout, attempt)) .sort((a, b) => (b.attemptSequence ?? 0) - (a.attemptSequence ?? 0)) .filter((record) => record.attemptSequence !== rollout.attempt?.sequenceId); }, [attempts, rollout]); if (isError && !attemptRecords.length) { return ( }> Unable to load attempts for this rollout. ); } const emptyState = ( No attempts found for this rollout. ); return ( classNames={{ root: 'rollouts-table rollouts-table--nested' }} withColumnBorders noHeader minHeight={0} idAccessor='attemptId' verticalAlign='center' fetching={isFetching} loaderSize='sm' records={attemptRecords} columns={columns} emptyState={attemptRecords.length === 0 ? emptyState : undefined} /> ); } ================================================ FILE: dashboard/src/components/RolloutTable.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useMemo, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { IconSearch } from '@tabler/icons-react'; import { Box, Stack, TextInput, Title } from '@mantine/core'; import type { RolloutsSortState } from '@/features/rollouts'; import type { Rollout, RolloutMode, RolloutStatus } from '@/types'; import { compareRecords } from '@/utils/table'; import { STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { buildRolloutRecord, RolloutTable, type RolloutTableRecord } from './RolloutTable.component'; const meta: Meta = { title: 'Components/RolloutTable', component: RolloutTable, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const sampleRollouts: Rollout[] = [ { rolloutId: 'ro-story-001', input: { task: 'Generate onboarding summary' }, startTime: now - 3200, endTime: null, mode: 'train', resourcesId: 'rs-story-001', status: 'running', config: { retries: 1 }, metadata: { owner: 'alice' }, attempt: { rolloutId: 'ro-story-001', attemptId: 'at-story-010', sequenceId: 1, startTime: now - 3200, endTime: null, status: 'running', workerId: 'worker-east', lastHeartbeatTime: now - 45, metadata: { info: 'Worker is processing' }, }, }, { rolloutId: 'ro-story-002', input: { task: 'Classify feedback tickets' }, startTime: now - 7200, endTime: now - 5400, mode: 'val', resourcesId: 'rs-story-002', status: 'succeeded', config: { retries: 2 }, metadata: { owner: 'bob' }, attempt: { rolloutId: 'ro-story-002', attemptId: 'at-story-011', sequenceId: 2, startTime: now - 6200, endTime: now - 5400, status: 'succeeded', workerId: 'worker-north', lastHeartbeatTime: now - 5400, metadata: { previousAttempt: 'at-story-010' }, }, }, { rolloutId: 'ro-story-003', input: { task: 'Analyze experiment results' }, startTime: now - 10800, endTime: now - 9600, mode: 'test', resourcesId: 'rs-story-003', status: 'failed', config: { retries: 1 }, metadata: { owner: 'carol' }, attempt: { rolloutId: 'ro-story-003', attemptId: 'at-story-012', sequenceId: 3, startTime: now - 10200, endTime: now - 9600, status: 'failed', workerId: 'worker-west', lastHeartbeatTime: now - 9600, metadata: { reason: 'Timeout' }, }, }, { rolloutId: 'ro-story-004', input: { task: 'Evaluate prompt variants' }, startTime: now - 3600, endTime: null, mode: 'train', resourcesId: null, status: 'preparing', config: { retries: 0 }, metadata: { owner: 'dave' }, attempt: null, }, { rolloutId: 'ro-story-005', input: { task: 'Generate quick answers' }, startTime: now - 1800, endTime: null, mode: 'val', resourcesId: 'rs-story-004', status: 'running', config: { retries: 0 }, metadata: { owner: 'eva' }, attempt: { rolloutId: 'ro-story-005', attemptId: 'at-story-013', sequenceId: 1, startTime: now - 1800, endTime: null, status: 'running', workerId: null, lastHeartbeatTime: now - 75, metadata: null, }, }, { rolloutId: 'ro-story-006', input: { task: 'Compile release notes' }, startTime: now - 9600, endTime: now - 9000, mode: null, resourcesId: 'rs-story-005', status: 'cancelled', config: { retries: 3 }, metadata: null, attempt: { rolloutId: 'ro-story-006', attemptId: 'at-story-014', sequenceId: 1, startTime: now - 9600, endTime: now - 9000, status: 'timeout', workerId: 'worker-south', lastHeartbeatTime: now - 9000, metadata: { info: 'Cancelled by operator' }, }, }, ]; type WrapperProps = { maxWidth: number; rollouts?: Rollout[] | undefined; isFetching?: boolean; isError?: boolean; error?: unknown; }; function RolloutTableStoryWrapper({ maxWidth, rollouts = sampleRollouts, isFetching = false, isError = false, error = null, }: WrapperProps) { const [searchTerm, setSearchTerm] = useState(''); const [statusFilters, setStatusFilters] = useState([]); const [modeFilters, setModeFilters] = useState([]); const [page, setPage] = useState(1); const [recordsPerPage, setRecordsPerPage] = useState(5); const [sort, setSort] = useState({ column: 'startTimestamp', direction: 'desc', }); const tableRecords = useMemo(() => { if (!rollouts) { return []; } return rollouts.map((rolloutItem) => buildRolloutRecord(rolloutItem)); }, [rollouts]); const filteredRecords = useMemo(() => { const normalizedSearch = searchTerm.trim().toLowerCase(); return tableRecords.filter((record) => { const matchesSearch = normalizedSearch.length === 0 || record.rolloutId.toLowerCase().includes(normalizedSearch); const matchesStatus = statusFilters.length === 0 || statusFilters.includes(record.status); const matchesMode = modeFilters.length === 0 || (record.mode !== null && modeFilters.includes(record.mode)); return matchesSearch && matchesStatus && matchesMode; }); }, [modeFilters, searchTerm, statusFilters, tableRecords]); const sortedRecords = useMemo(() => { const sorted = filteredRecords.slice(); if (!sorted.length) { return sorted; } const comparatorKey = sort.column as keyof RolloutTableRecord; if (!(comparatorKey in sorted[0])) { return sorted; } sorted.sort((a, b) => compareRecords(a, b, comparatorKey)); if (sort.direction === 'desc') { sorted.reverse(); } return sorted; }, [filteredRecords, sort]); const totalRecordsValue = sortedRecords.length; const pagedRecords = useMemo(() => { const startIndex = (page - 1) * recordsPerPage; const endIndex = startIndex + recordsPerPage; return sortedRecords.slice(startIndex, endIndex); }, [page, recordsPerPage, sortedRecords]); const pagedRollouts = useMemo(() => pagedRecords.map((record) => record as Rollout), [pagedRecords]); return ( Rollouts setSearchTerm(event.currentTarget.value)} leftSection={} data-testid='rollouts-search-input' w='100%' style={{ maxWidth: 360 }} /> { setStatusFilters(values); setPage(1); }} onStatusFilterReset={() => { setStatusFilters([]); setPage(1); }} onModeFilterChange={(values) => { setModeFilters(values); setPage(1); }} onModeFilterReset={() => { setModeFilters([]); setPage(1); }} onSortStatusChange={(status) => { setSort({ column: status.columnAccessor as string, direction: status.direction, }); }} onPageChange={setPage} onRecordsPerPageChange={(value) => { setRecordsPerPage(value); setPage(1); }} onResetFilters={() => { setSearchTerm(''); setStatusFilters([]); setModeFilters([]); setSort({ column: 'startTimestamp', direction: 'desc' }); setPage(1); }} onRefetch={() => undefined} recordsPerPageOptions={[5, 10, 20]} /> ); } export const WideContainer: Story = { render: () => , }; export const MediumContainer: Story = { render: () => , }; export const NarrowContainer: Story = { render: () => , }; export const DrawerWidth: Story = { render: () => , }; export const ErrorState: Story = { render: () => ( ), }; ================================================ FILE: dashboard/src/components/TracesTable.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo } from 'react'; import { IconAlertCircle, IconCheck, IconCopy, IconFileDescription, IconRefresh, IconRouteSquare, } from '@tabler/icons-react'; import { DataTable, type DataTableColumn, type DataTableSortStatus } from 'mantine-datatable'; import { ActionIcon, Badge, Box, Button, CopyButton, Group, Stack, Text, Tooltip } from '@mantine/core'; import { useElementSize, useViewportSize } from '@mantine/hooks'; import { getLayoutAwareWidth } from '@/layouts/helper'; import type { Span } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; import { formatDateTimeWithMilliseconds, formatDuration, toTimestamp } from '@/utils/format'; import { createResponsiveColumns, type ColumnVisibilityConfig } from '@/utils/table'; const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [50, 100, 200, 500]; const COLUMN_VISIBILITY: Record = { name: { minWidth: 12.5, priority: 0 }, sequenceId: { fixedWidth: 6, priority: 1 }, spanId: { fixedWidth: 14, priority: 1 }, traceId: { fixedWidth: 24, priority: 3 }, parentId: { fixedWidth: 12, priority: 2 }, statusCode: { fixedWidth: 8, priority: 2 }, attributeKeys: { minWidth: 12.5, priority: 2 }, startTime: { fixedWidth: 15, priority: 1 }, endTime: { fixedWidth: 15, priority: 1 }, duration: { fixedWidth: 10, priority: 3 }, actionsPlaceholder: { fixedWidth: 6, priority: 0 }, }; const STATUS_COLORS: Record = { UNSET: 'gray', OK: 'teal', ERROR: 'red', }; export type TracesTableRecord = Span & { statusCode: string; attributeKeys: string; duration: number; actionsPlaceholder?: null; }; export function buildTraceRecord(span: Span): TracesTableRecord { const statusCode = span.status.status_code; const attributeKeys = Object.keys(span.attributes ?? {}).join(', ') || ''; const startTimestamp = toTimestamp(span.startTime); const endTimestamp = toTimestamp(span.endTime); const duration = endTimestamp && startTimestamp ? endTimestamp - startTimestamp : 0; return { ...span, statusCode, attributeKeys, duration, actionsPlaceholder: null, }; } type TracesColumnsOptions = { onShowRollout?: (record: TracesTableRecord) => void; onShowSpanDetail?: (record: TracesTableRecord) => void; onParentIdClick?: (parentId: string) => void; spanIds: Set; }; function createTracesColumns({ onShowRollout, onShowSpanDetail, onParentIdClick, spanIds, }: TracesColumnsOptions): DataTableColumn[] { return [ { accessor: 'name', title: 'Name', sortable: true, render: ({ name }) => ( {name} ), }, { accessor: 'sequenceId', title: 'Seq.', sortable: true, render: ({ sequenceId }) => {sequenceId}, }, { accessor: 'traceId', title: 'Trace ID', sortable: true, render: ({ traceId }) => ( {traceId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} ), }, { accessor: 'spanId', title: 'Span ID', sortable: true, render: ({ spanId }) => ( {spanId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} ), }, { accessor: 'parentId', title: 'Parent ID', sortable: true, render: ({ parentId }) => { if (!parentId) { return ( ); } const parentExists = spanIds.has(parentId); const isInteractive = parentExists && typeof onParentIdClick === 'function'; return ( { if (isInteractive) { event.stopPropagation(); onParentIdClick?.(parentId); } }} > {parentId.slice(0, 8)} {!parentExists && ( )} ); }, }, { accessor: 'statusCode', title: 'Status', sortable: true, render: ({ statusCode }) => ( {statusCode} ), }, { accessor: 'attributeKeys', title: 'Attribute Keys', render: ({ attributeKeys }) => attributeKeys ? ( {/* TODO: dim "." and "," and other characters are just normal text */} {attributeKeys} ) : ( ), }, { accessor: 'startTime', title: 'Start Time', sortable: true, textAlign: 'left', render: ({ startTime }) => {formatDateTimeWithMilliseconds(toTimestamp(startTime))}, }, { accessor: 'endTime', title: 'End Time', sortable: true, textAlign: 'left', render: ({ endTime }) => {formatDateTimeWithMilliseconds(toTimestamp(endTime))}, }, { accessor: 'duration', title: 'Duration', sortable: true, textAlign: 'left', render: ({ duration }) => {formatDuration(duration)}, }, { accessor: 'actionsPlaceholder', title: 'Actions', render: (record) => ( { event.stopPropagation(); onShowRollout?.(record); }} > { event.stopPropagation(); onShowSpanDetail?.(record); }} > ), }, ]; } export type TracesTableProps = { spans: Span[] | undefined; totalRecords: number; isFetching: boolean; isError: boolean; error: unknown; selectionMessage?: string; searchTerm: string; sort: { column: string; direction: 'asc' | 'desc' }; page: number; recordsPerPage: number; onSortStatusChange: (status: DataTableSortStatus) => void; onPageChange: (page: number) => void; onRecordsPerPageChange: (value: number) => void; onResetFilters: () => void; onRefetch: () => void; onShowRollout?: (record: TracesTableRecord) => void; onShowSpanDetail?: (record: TracesTableRecord) => void; onParentIdClick?: (parentId: string) => void; recordsPerPageOptions?: number[]; }; export function TracesTable({ spans, totalRecords, isFetching, isError, error, selectionMessage, searchTerm, sort, page, recordsPerPage, onSortStatusChange, onPageChange, onRecordsPerPageChange, onResetFilters, onRefetch, onShowRollout, onShowSpanDetail, onParentIdClick, recordsPerPageOptions = DEFAULT_RECORDS_PER_PAGE_OPTIONS, }: TracesTableProps) { const { ref: tableContainerRef, width: containerWidth } = useElementSize(); const { width: viewportWidth } = useViewportSize(); const traceRecords = useMemo(() => { if (!spans) { return []; } return spans.map((span) => buildTraceRecord(span)); }, [spans]); const spanIds = useMemo(() => { return new Set(traceRecords.map((record) => record.spanId)); }, [traceRecords]); const columns = useMemo( () => createTracesColumns({ onShowRollout, onShowSpanDetail, onParentIdClick, spanIds, }), [onShowRollout, onShowSpanDetail, onParentIdClick, spanIds], ); const layoutAwareContainerWidth = useMemo( () => getLayoutAwareWidth(containerWidth, viewportWidth), [containerWidth, viewportWidth], ); const responsiveColumns = useMemo( () => createResponsiveColumns(columns, layoutAwareContainerWidth, COLUMN_VISIBILITY), [columns, layoutAwareContainerWidth], ); const totalPages = useMemo( () => Math.max(1, Math.ceil(Math.max(0, totalRecords) / Math.max(1, recordsPerPage))), [recordsPerPage, totalRecords], ); useEffect(() => { if (page > totalPages) { onPageChange(totalPages); } }, [onPageChange, page, totalPages]); const hasActiveFilters = searchTerm.trim().length > 0; const sortStatus: DataTableSortStatus = { columnAccessor: sort.column, direction: sort.direction, }; const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { onSortStatusChange(status); }, [onSortStatusChange], ); const errorDescriptor = isError ? getErrorDescriptor(error) : null; const errorMessage = isError ? `Traces are temporarily unavailable${errorDescriptor ? ` (${errorDescriptor})` : ''}.` : 'Traces are temporarily unavailable.'; const selectionEmptyState = selectionMessage ? ( {selectionMessage} Choose a rollout and attempt from the controls above to load trace results. ) : null; const fallbackEmptyState = ( {isError ? ( <> {errorMessage} Use the retry button to try again, or adjust the filters to broaden the results. {hasActiveFilters ? ( ) : null} ) : ( <> No traces found {hasActiveFilters ? 'Try adjusting the search to see more results.' : 'Try refreshing to fetch the latest traces.'} {hasActiveFilters ? ( ) : null} )} ); const emptyState = selectionEmptyState ?? fallbackEmptyState; return ( classNames={{ root: 'traces-table' }} withTableBorder withColumnBorders highlightOnHover verticalAlign='center' minHeight={traceRecords.length === 0 ? 500 : undefined} idAccessor='spanId' records={traceRecords} columns={responsiveColumns} totalRecords={totalRecords} recordsPerPage={recordsPerPage} page={page} onPageChange={onPageChange} onRecordsPerPageChange={onRecordsPerPageChange} recordsPerPageOptions={recordsPerPageOptions} sortStatus={sortStatus} onSortStatusChange={handleSortStatusChange} fetching={isFetching} loaderSize='sm' emptyState={traceRecords.length === 0 ? emptyState : undefined} /> ); } ================================================ FILE: dashboard/src/components/TracesTable.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useMemo, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { IconSearch } from '@tabler/icons-react'; import { waitFor, within } from '@testing-library/dom'; import userEvent from '@testing-library/user-event'; import { Box, Stack, TextInput, Title } from '@mantine/core'; import type { Span } from '@/types'; import { compareRecords } from '@/utils/table'; import { buildTraceRecord, TracesTable, type TracesTableRecord } from './TracesTable.component'; const meta: Meta = { title: 'Components/TracesTable', component: TracesTable, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; const now = Math.floor(1762775145209 / 1000); const sampleSpans: Span[] = [ { rolloutId: 'ro-trace-001', attemptId: 'at-trace-001', sequenceId: 1, traceId: 'trace-abc123def456', spanId: 'span-root-001', parentId: null, name: 'main_task', status: { status_code: 'OK', description: null }, attributes: { 'task.type': 'generation', 'task.priority': 'high', 'user.id': 'user-123', }, startTime: now - 100, endTime: now - 10, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-001', attemptId: 'at-trace-001', sequenceId: 1, traceId: 'trace-abc123def456', spanId: 'span-child-001', parentId: 'span-root-001', name: 'llm_call', status: { status_code: 'OK', description: null }, attributes: { 'llm.model': 'gpt-4', 'llm.temperature': 0.7, 'llm.max_tokens': 2048, }, startTime: now - 90, endTime: now - 50, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-001', attemptId: 'at-trace-001', sequenceId: 1, traceId: 'trace-abc123def456', spanId: 'span-child-002', parentId: 'span-root-001', name: 'database_query', status: { status_code: 'OK', description: null }, attributes: { 'db.system': 'postgresql', 'db.operation': 'SELECT', 'db.table': 'users', }, startTime: now - 80, endTime: now - 70, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-002', attemptId: 'at-trace-002', sequenceId: 1, traceId: 'trace-xyz789ghi012', spanId: 'span-error-001', parentId: 'span-missing-parent', name: 'failed_operation', status: { status_code: 'ERROR', description: 'Connection timeout' }, attributes: { 'error.type': 'TimeoutError', 'error.message': 'Connection timed out after 30s', }, startTime: now - 150, endTime: now - 120, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-003', attemptId: 'at-trace-003', sequenceId: 1, traceId: 'trace-unset123', spanId: 'span-unset-001', parentId: null, name: 'pending_task', status: { status_code: 'UNSET', description: null }, attributes: {}, startTime: now - 30, endTime: now - 5, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-004', attemptId: 'at-trace-004', sequenceId: 2, traceId: 'trace-nested456', spanId: 'span-parent-001', parentId: null, name: 'workflow_execution', status: { status_code: 'OK', description: null }, attributes: { 'workflow.name': 'data_processing', 'workflow.version': '2.1.0', }, startTime: now - 200, endTime: now - 50, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-004', attemptId: 'at-trace-004', sequenceId: 2, traceId: 'trace-nested456', spanId: 'span-child-nested-001', parentId: 'span-parent-001', name: 'step_1_validation', status: { status_code: 'OK', description: null }, attributes: { 'step.name': 'validation', 'step.index': 1, }, startTime: now - 195, endTime: now - 180, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-trace-004', attemptId: 'at-trace-004', sequenceId: 2, traceId: 'trace-nested456', spanId: 'span-child-nested-002', parentId: 'span-parent-001', name: 'step_2_processing', status: { status_code: 'ERROR', description: 'Validation failed' }, attributes: { 'step.name': 'processing', 'step.index': 2, 'error.type': 'ValidationError', }, startTime: now - 175, endTime: now - 160, events: [], links: [], context: {}, parent: null, resource: {}, }, ]; type WrapperProps = { maxWidth: number; spans?: Span[] | undefined; isFetching?: boolean; isError?: boolean; error?: unknown; }; function TracesTableStoryWrapper({ maxWidth, spans = sampleSpans, isFetching = false, isError = false, error = null, }: WrapperProps) { const [searchTerm, setSearchTerm] = useState(''); const [page, setPage] = useState(1); const [recordsPerPage, setRecordsPerPage] = useState(10); const [sort, setSort] = useState<{ column: string; direction: 'asc' | 'desc' }>({ column: 'startTime', direction: 'desc', }); const tableRecords = useMemo(() => { if (!spans) { return []; } return spans.map((span) => buildTraceRecord(span)); }, [spans]); const filteredRecords = useMemo(() => { const normalizedSearch = searchTerm.trim().toLowerCase(); if (normalizedSearch.length === 0) { return tableRecords; } return tableRecords.filter( (record) => record.traceId.toLowerCase().includes(normalizedSearch) || record.spanId.toLowerCase().includes(normalizedSearch) || record.name.toLowerCase().includes(normalizedSearch), ); }, [searchTerm, tableRecords]); const sortedRecords = useMemo(() => { const sorted = filteredRecords.slice(); if (!sorted.length) { return sorted; } const comparatorKey = sort.column as keyof TracesTableRecord; if (!(comparatorKey in sorted[0])) { return sorted; } sorted.sort((a, b) => compareRecords(a, b, comparatorKey)); if (sort.direction === 'desc') { sorted.reverse(); } return sorted; }, [filteredRecords, sort]); const totalRecordsValue = sortedRecords.length; const pagedRecords = useMemo(() => { const startIndex = (page - 1) * recordsPerPage; const endIndex = startIndex + recordsPerPage; return sortedRecords.slice(startIndex, endIndex); }, [page, recordsPerPage, sortedRecords]); const pagedSpans = useMemo(() => pagedRecords.map((record) => record as Span), [pagedRecords]); const handleShowRollout = (record: any) => { console.log('Show rollout for:', record.rolloutId); }; const handleShowSpanDetail = (record: any) => { console.log('Show span detail for:', record.spanId, record); }; const handleParentIdClick = (parentId: string) => { console.log('Navigate to parent span:', parentId); setSearchTerm(parentId); }; return ( Traces setSearchTerm(event.currentTarget.value)} leftSection={} data-testid='traces-search-input' w='100%' style={{ maxWidth: 360 }} /> { setSort({ column: status.columnAccessor as string, direction: status.direction, }); }} onPageChange={setPage} onRecordsPerPageChange={(value) => { setRecordsPerPage(value); setPage(1); }} onResetFilters={() => { setSearchTerm(''); setSort({ column: 'startTime', direction: 'desc' }); setPage(1); }} onRefetch={() => undefined} onShowRollout={handleShowRollout} onShowSpanDetail={handleShowSpanDetail} onParentIdClick={handleParentIdClick} recordsPerPageOptions={[10, 20, 50]} /> ); } export const WideContainer: Story = { render: () => , }; export const MediumContainer: Story = { render: () => , }; export const NarrowContainer: Story = { render: () => , }; export const DrawerWidth: Story = { render: () => , }; export const ErrorState: Story = { render: () => , }; export const LoadingState: Story = { render: () => , }; export const EmptyState: Story = { render: () => , }; export const WithMissingParent: Story = { render: () => ( s.spanId === 'span-error-001')} /> ), }; export const NestedSpans: Story = { render: () => ( s.traceId === 'trace-nested456')} /> ), }; // Test data with sequence IDs that would sort incorrectly if treated as strings const sequenceSortTestSpans: Span[] = [ { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 2, traceId: 'trace-seq-002', spanId: 'span-seq-002', parentId: null, name: 'task_sequence_2', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 200, endTime: now - 190, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 10, traceId: 'trace-seq-010', spanId: 'span-seq-010', parentId: null, name: 'task_sequence_10', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 180, endTime: now - 170, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 3, traceId: 'trace-seq-003', spanId: 'span-seq-003', parentId: null, name: 'task_sequence_3', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 160, endTime: now - 150, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 11, traceId: 'trace-seq-011', spanId: 'span-seq-011', parentId: null, name: 'task_sequence_11', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 140, endTime: now - 130, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 9, traceId: 'trace-seq-009', spanId: 'span-seq-009', parentId: null, name: 'task_sequence_9', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 120, endTime: now - 110, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 12, traceId: 'trace-seq-012', spanId: 'span-seq-012', parentId: null, name: 'task_sequence_12', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 100, endTime: now - 90, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 4, traceId: 'trace-seq-004', spanId: 'span-seq-004', parentId: null, name: 'task_sequence_4', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 80, endTime: now - 70, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 6, traceId: 'trace-seq-006', spanId: 'span-seq-006', parentId: null, name: 'task_sequence_6', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 60, endTime: now - 50, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 7, traceId: 'trace-seq-007', spanId: 'span-seq-007', parentId: null, name: 'task_sequence_7', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 40, endTime: now - 30, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 13, traceId: 'trace-seq-013', spanId: 'span-seq-013', parentId: null, name: 'task_sequence_13', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 20, endTime: now - 10, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-seq-test', attemptId: 'at-seq-test', sequenceId: 14, traceId: 'trace-seq-014', spanId: 'span-seq-014', parentId: null, name: 'task_sequence_14', status: { status_code: 'UNSET', description: null }, attributes: {}, startTime: now - 5, endTime: now, events: [], links: [], context: {}, parent: null, resource: {}, }, ]; export const SequenceIdSortTest: Story = { render: () => , play: async ({ canvasElement }) => { const canvas = within(canvasElement); const seqHeader = await canvas.findByRole('button', { name: /seq\./i }); await userEvent.click(seqHeader); await waitFor(() => { const rows = canvas.getAllByRole('row'); const firstRow = rows[1]; if (!firstRow) { throw new Error('Expected at least one data row after sorting by sequence ID'); } within(firstRow).getByText('task_sequence_14'); }); }, }; ================================================ FILE: dashboard/src/components/WorkersTable.component.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo } from 'react'; import { IconCheck, IconCopy, IconInfoCircle, IconRefresh } from '@tabler/icons-react'; import { DataTable, type DataTableColumn, type DataTableSortStatus } from 'mantine-datatable'; import { ActionIcon, Badge, Box, Button, CopyButton, Group, Stack, Text, Tooltip } from '@mantine/core'; import { useElementSize, useViewportSize } from '@mantine/hooks'; import { getLayoutAwareWidth } from '@/layouts/helper'; import type { Worker } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; import { formatDateTime, formatRelativeTime, formatStatusLabel } from '@/utils/format'; import { createResponsiveColumns, type ColumnVisibilityConfig } from '@/utils/table'; const DEFAULT_RECORDS_PER_PAGE_OPTIONS = [50, 100, 200, 500]; const COLUMN_VISIBILITY: Record = { workerId: { fixedWidth: 12, priority: 0 }, status: { fixedWidth: 6, priority: 1 }, currentRolloutId: { fixedWidth: 14, priority: 3 }, currentAttemptId: { fixedWidth: 14, priority: 3 }, lastHeartbeatTime: { fixedWidth: 10, priority: 2 }, lastBusyTime: { fixedWidth: 10, priority: 3 }, lastIdleTime: { fixedWidth: 10, priority: 3 }, lastDequeueTime: { fixedWidth: 10, priority: 1 }, actions: { fixedWidth: 5, priority: 0 }, }; export type WorkersTableRecord = Worker & { timestamps: Record< 'lastHeartbeatTime' | 'lastBusyTime' | 'lastIdleTime' | 'lastDequeueTime', { absolute: string; relative: string } >; }; const buildTimestampMeta = (value: Worker['lastHeartbeatTime']) => ({ absolute: formatDateTime(value), relative: formatRelativeTime(value), }); function buildWorkerRecord(worker: Worker): WorkersTableRecord { return { ...worker, timestamps: { lastHeartbeatTime: buildTimestampMeta(worker.lastHeartbeatTime), lastBusyTime: buildTimestampMeta(worker.lastBusyTime), lastIdleTime: buildTimestampMeta(worker.lastIdleTime), lastDequeueTime: buildTimestampMeta(worker.lastDequeueTime), }, }; } type WorkersColumnsOptions = { onShowDetails: (worker: Worker) => void; }; const STATUS_COLORS: Record = { busy: 'orange', idle: 'teal', unknown: 'gray', }; function createWorkersColumns({ onShowDetails }: WorkersColumnsOptions): DataTableColumn[] { return [ { accessor: 'workerId', title: 'Runner ID', sortable: true, render: ({ workerId }) => ( {workerId} {({ copied, copy }) => ( { event.stopPropagation(); copy(); }} > {copied ? : } )} ), }, { accessor: 'status', title: 'Status', sortable: true, render: ({ status }) => { const color = STATUS_COLORS[status] ?? 'gray'; return ( {formatStatusLabel(status)} ); }, }, { accessor: 'currentRolloutId', title: 'Current Rollout', sortable: true, render: ({ currentRolloutId }) => {currentRolloutId ?? '—'}, }, { accessor: 'currentAttemptId', title: 'Current Attempt', sortable: true, render: ({ currentAttemptId }) => {currentAttemptId ?? '—'}, }, { accessor: 'lastHeartbeatTime', title: 'Heartbeat', sortable: true, render: ({ timestamps }) => ( {timestamps.lastHeartbeatTime.relative} {timestamps.lastHeartbeatTime.absolute !== '—' && ( {timestamps.lastHeartbeatTime.absolute} )} ), }, { accessor: 'lastBusyTime', title: 'Last Busy', sortable: true, render: ({ timestamps }) => ( {timestamps.lastBusyTime.relative} {timestamps.lastBusyTime.absolute !== '—' && ( {timestamps.lastBusyTime.absolute} )} ), }, { accessor: 'lastIdleTime', title: 'Last Idle', sortable: true, render: ({ timestamps }) => ( {timestamps.lastIdleTime.relative} {timestamps.lastIdleTime.absolute !== '—' && ( {timestamps.lastIdleTime.absolute} )} ), }, { accessor: 'lastDequeueTime', title: 'Last Dequeue', sortable: true, render: ({ timestamps }) => ( {timestamps.lastDequeueTime.relative} {timestamps.lastDequeueTime.absolute !== '—' && ( {timestamps.lastDequeueTime.absolute} )} ), }, { accessor: 'actions', title: 'Actions', textAlign: 'left', render: (record) => ( { event.stopPropagation(); onShowDetails(record); }} > ), }, ]; } export type WorkersTableProps = { workers: Worker[] | undefined; totalRecords: number; isFetching: boolean; isError: boolean; error: unknown; searchTerm: string; sort: { column: string; direction: 'asc' | 'desc' }; page: number; recordsPerPage: number; onSortStatusChange: (status: DataTableSortStatus) => void; onPageChange: (page: number) => void; onRecordsPerPageChange: (value: number) => void; onResetFilters: () => void; onRefetch: () => void; onShowDetails: (worker: Worker) => void; recordsPerPageOptions?: number[]; }; export function WorkersTable({ workers, totalRecords, isFetching, isError, error, searchTerm, sort, page, recordsPerPage, onSortStatusChange, onPageChange, onRecordsPerPageChange, onResetFilters, onRefetch, onShowDetails, recordsPerPageOptions = DEFAULT_RECORDS_PER_PAGE_OPTIONS, }: WorkersTableProps) { const { ref: tableContainerRef, width: containerWidth } = useElementSize(); const { width: viewportWidth } = useViewportSize(); const layoutAwareContainerWidth = useMemo( () => getLayoutAwareWidth(containerWidth, viewportWidth), [containerWidth, viewportWidth], ); const workerRecords = useMemo(() => { if (!workers) { return []; } return workers.map((worker) => buildWorkerRecord(worker)); }, [workers]); const columns = useMemo(() => createWorkersColumns({ onShowDetails }), [onShowDetails]); const responsiveColumns = useMemo( () => createResponsiveColumns(columns, layoutAwareContainerWidth, COLUMN_VISIBILITY), [columns, layoutAwareContainerWidth], ); const totalPages = useMemo( () => Math.max(1, Math.ceil(Math.max(0, totalRecords) / Math.max(1, recordsPerPage))), [recordsPerPage, totalRecords], ); useEffect(() => { if (page > totalPages) { onPageChange(totalPages); } }, [onPageChange, page, totalPages]); const hasActiveFilters = searchTerm.trim().length > 0; const sortStatus: DataTableSortStatus = { columnAccessor: sort.column, direction: sort.direction, }; const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { onSortStatusChange(status); }, [onSortStatusChange], ); const errorDescriptor = isError ? getErrorDescriptor(error) : null; const errorMessage = isError ? `Workers are temporarily unavailable${errorDescriptor ? ` (${errorDescriptor})` : ''}.` : 'Workers are temporarily unavailable.'; const emptyState = ( {isError ? ( <> {errorMessage} Use the retry button to try again, or adjust the search to broaden the results. {hasActiveFilters ? ( ) : null} ) : ( <> No workers found {hasActiveFilters ? 'Try adjusting the search to see more results.' : 'Try refreshing to fetch the latest worker status.'} {hasActiveFilters ? ( ) : null} )} ); return ( classNames={{ root: 'workers-table' }} withTableBorder withColumnBorders highlightOnHover verticalAlign='center' minHeight={workerRecords.length === 0 ? 400 : undefined} idAccessor='workerId' records={workerRecords} columns={responsiveColumns} totalRecords={totalRecords} recordsPerPage={recordsPerPage} page={page} onPageChange={onPageChange} onRecordsPerPageChange={onRecordsPerPageChange} recordsPerPageOptions={recordsPerPageOptions} sortStatus={sortStatus} onSortStatusChange={handleSortStatusChange} fetching={isFetching} loaderSize='sm' emptyState={workerRecords.length === 0 ? emptyState : undefined} /> ); } ================================================ FILE: dashboard/src/components/WorkersTable.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useMemo, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { IconSearch } from '@tabler/icons-react'; import { Box, Stack, TextInput, Title } from '@mantine/core'; import type { Worker } from '@/types'; import { WorkersTable } from './WorkersTable.component'; const meta: Meta = { title: 'Components/WorkersTable', component: WorkersTable, parameters: { layout: 'fullscreen', }, }; export default meta; type Story = StoryObj; const now = Math.floor(Date.now() / 1000); const sampleWorkers: Worker[] = [ { workerId: 'worker-east', status: 'busy', heartbeatStats: { queueDepth: 2, gpuUtilization: 0.82 }, lastHeartbeatTime: now - 20, lastDequeueTime: now - 60, lastBusyTime: now - 120, lastIdleTime: now - 600, currentRolloutId: 'ro-story-001', currentAttemptId: 'at-story-010', }, { workerId: 'worker-west', status: 'busy', heartbeatStats: { queueDepth: 1 }, lastHeartbeatTime: now - 45, lastDequeueTime: now - 300, lastBusyTime: now - 200, lastIdleTime: now - 4800, currentRolloutId: 'ro-story-003', currentAttemptId: 'at-story-033', }, { workerId: 'worker-north', status: 'idle', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 90, lastDequeueTime: now - 3600, lastBusyTime: now - 5400, lastIdleTime: now - 5400, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-south', status: 'idle', heartbeatStats: null, lastHeartbeatTime: now - 900, lastDequeueTime: now - 7200, lastBusyTime: now - 8600, lastIdleTime: now - 8600, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-standby', status: 'unknown', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 15, lastDequeueTime: now - 4000, lastBusyTime: null, lastIdleTime: null, currentRolloutId: null, currentAttemptId: null, }, ]; type WorkersTableStoryWrapperProps = { maxWidth: number; initialSort?: { column: string; direction: 'asc' | 'desc' }; }; function WorkersTableStoryWrapper({ maxWidth, initialSort }: WorkersTableStoryWrapperProps) { const [searchTerm, setSearchTerm] = useState(''); const [page, setPage] = useState(1); const [recordsPerPage, setRecordsPerPage] = useState(5); const [sort, setSort] = useState<{ column: string; direction: 'asc' | 'desc' }>( () => initialSort ?? { column: 'lastHeartbeatTime', direction: 'desc' }, ); const filteredWorkers = useMemo(() => { const normalized = searchTerm.trim().toLowerCase(); if (!normalized) { return sampleWorkers; } return sampleWorkers.filter((worker) => worker.workerId.toLowerCase().includes(normalized)); }, [searchTerm]); return ( Workers ({maxWidth}px max width) } value={searchTerm} onChange={(event) => setSearchTerm(event.currentTarget.value)} w='100%' style={{ maxWidth: 360 }} /> { return setSort({ column: status.columnAccessor as string, direction: status.direction }); }} onPageChange={setPage} onRecordsPerPageChange={setRecordsPerPage} onResetFilters={() => { setSearchTerm(''); setPage(1); }} onRefetch={() => {}} onShowDetails={() => {}} /> ); } export const Wide: Story = { render: () => , }; export const Narrow: Story = { render: () => , }; export const SortedByCurrentRollout: Story = { render: () => ( ), }; ================================================ FILE: dashboard/src/cssVariableResolver.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { alpha, CSSVariablesResolver } from '@mantine/core'; export const shadcnCssVariableResolver: CSSVariablesResolver = () => ({ variables: { // variables that do not depend on color scheme '--mantine-heading-font-weight': '600', '--mantine-primary-color-filled-hover': alpha('var(--mantine-primary-color-filled)', 0.9), '--mantine-primary-color-light': 'var(--mantine-color-zinc-light)', '--mantine-primary-color-light-hover': 'var(--mantine-color-zinc-light-hover)', '--mantine-primary-color-light-color': 'var(--mantine-color-zinc-light-color)', }, light: { // all variables that depend on light color scheme '--mantine-primary-color-contrast': 'var(--mantine-color-zinc-0)', // used as primary color contrast '--mantine-color-text': 'var(--mantine-color-secondary-9)', // used as text color '--mantine-color-body': 'var(--mantine-color-white)', // used as body color '--mantine-color-error': 'var(--mantine-color-error-10)', // used as error color '--mantine-color-placeholder': 'var(--mantine-color-secondary-10)', // used as placeholder color '--mantine-color-anchor': 'var(--mantine-color-secondary-10)', // used as anchor color '--mantine-color-default': 'var(--mantine-color-secondary-0)', // used as default surface color '--mantine-color-default-hover': 'var(--mantine-color-secondary-1)', // used as default hover color '--mantine-color-default-color': 'var(--mantine-color-secondary-9)', // used as default text color '--mantine-color-default-border': 'var(--mantine-color-secondary-2)', // used as default border color '--mantine-color-dimmed': 'var(--mantine-color-secondary-10)', // used as dimmed text color '--mantine-color-secondary-filled': 'var(--mantine-color-white)', // used as secondary surface color '--mantine-color-secondary-filled-hover': 'var(--mantine-color-secondary-1)', // used as secondary hover color '--mantine-color-secondary-light': 'var(--mantine-color-secondary-1)', // used as primary light color '--mantine-color-secondary-light-hover': alpha('var(--mantine-color-secondary-light)', 0.8), // used as primary light hover color '--mantine-color-secondary-text': 'var(--mantine-primary-color-contrast)', // can be used as secondary text color '--mantine-color-secondary-light-color': 'var(--mantine-color-secondary-8)', // used as primary light variant's text color '--mantine-color-secondary-outline': 'var(--mantine-color-secondary-2)', '--mantine-color-secondary-outline-hover': 'var(--mantine-color-secondary-1)', // all filled colors '--mantine-color-zinc-filled': 'var(--mantine-color-zinc-8)', '--mantine-color-zinc-filled-hover': alpha('var(--mantine-color-zinc-8)', 0.9), '--mantine-color-slate-filled': 'var(--mantine-color-slate-8)', '--mantine-color-slate-filled-hover': alpha('var(--mantine-color-slate-8)', 0.9), '--mantine-color-gray-filled': 'var(--mantine-color-gray-8)', '--mantine-color-gray-filled-hover': alpha('var(--mantine-color-gray-8)', 0.9), '--mantine-color-neutral-filled': 'var(--mantine-color-neutral-8)', '--mantine-color-neutral-filled-hover': alpha('var(--mantine-color-neutral-8)', 0.9), '--mantine-color-stone-filled': 'var(--mantine-color-stone-8)', '--mantine-color-stone-filled-hover': alpha('var(--mantine-color-stone-8)', 0.9), '--mantine-color-red-filled': 'var(--mantine-color-red-5)', '--mantine-color-red-filled-hover': alpha('var(--mantine-color-red-5)', 0.9), '--mantine-color-rose-filled': 'var(--mantine-color-rose-5)', '--mantine-color-rose-filled-hover': alpha('var(--mantine-color-rose-5)', 0.9), '--mantine-color-orange-filled': 'var(--mantine-color-orange-5)', '--mantine-color-orange-filled-hover': alpha('var(--mantine-color-orange-5)', 0.9), '--mantine-color-amber-filled': 'var(--mantine-color-amber-5)', '--mantine-color-amber-filled-hover': alpha('var(--mantine-color-amber-5)', 0.9), '--mantine-color-yellow-filled': 'var(--mantine-color-yellow-4)', '--mantine-color-yellow-filled-hover': alpha('var(--mantine-color-yellow-4)', 0.9), '--mantine-color-lime-filled': 'var(--mantine-color-lime-5)', '--mantine-color-lime-filled-hover': alpha('var(--mantine-color-lime-5)', 0.9), '--mantine-color-green-filled': 'var(--mantine-color-green-6)', '--mantine-color-green-filled-hover': alpha('var(--mantine-color-green-6)', 0.9), '--mantine-color-emerald-filled': 'var(--mantine-color-emerald-5)', '--mantine-color-emerald-filled-hover': alpha('var(--mantine-color-emerald-5)', 0.9), '--mantine-color-teal-filled': 'var(--mantine-color-teal-5)', '--mantine-color-teal-filled-hover': alpha('var(--mantine-color-teal-5)', 0.9), '--mantine-color-cyan-filled': 'var(--mantine-color-cyan-5)', '--mantine-color-cyan-filled-hover': alpha('var(--mantine-color-cyan-5)', 0.9), '--mantine-color-sky-filled': 'var(--mantine-color-sky-5)', '--mantine-color-sky-filled-hover': alpha('var(--mantine-color-sky-5)', 0.9), '--mantine-color-blue-filled': 'var(--mantine-color-blue-6)', '--mantine-color-blue-filled-hover': alpha('var(--mantine-color-blue-6)', 0.9), '--mantine-color-indigo-filled': 'var(--mantine-color-indigo-5)', '--mantine-color-indigo-filled-hover': alpha('var(--mantine-color-indigo-5)', 0.9), '--mantine-color-violet-filled': 'var(--mantine-color-violet-5)', '--mantine-color-violet-filled-hover': alpha('var(--mantine-color-violet-5)', 0.9), '--mantine-color-purple-filled': 'var(--mantine-color-purple-5)', '--mantine-color-purple-filled-hover': alpha('var(--mantine-color-purple-5)', 0.9), '--mantine-color-fuchsia-filled': 'var(--mantine-color-fuchsia-5)', '--mantine-color-fuchsia-filled-hover': alpha('var(--mantine-color-fuchsia-5)', 0.9), '--mantine-color-pink-filled': 'var(--mantine-color-pink-5)', '--mantine-color-pink-filled-hover': alpha('var(--mantine-color-pink-5)', 0.9), // all light colors '--mantine-color-zinc-light': alpha('var(--mantine-color-zinc-4)', 0.1), '--mantine-color-zinc-light-hover': alpha('var(--mantine-color-zinc-light)', 0.8), '--mantine-color-zinc-light-color': 'var(--mantine-color-zinc-6)', '--mantine-color-slate-light': alpha('var(--mantine-color-slate-4)', 0.1), '--mantine-color-slate-light-hover': alpha('var(--mantine-color-slate-light)', 0.8), '--mantine-color-slate-light-color': 'var(--mantine-color-slate-6)', '--mantine-color-gray-light': alpha('var(--mantine-color-gray-4)', 0.1), '--mantine-color-gray-light-hover': alpha('var(--mantine-color-gray-light)', 0.8), '--mantine-color-gray-light-color': 'var(--mantine-color-gray-6)', '--mantine-color-neutral-light': alpha('var(--mantine-color-neutral-4)', 0.1), '--mantine-color-neutral-light-hover': alpha('var(--mantine-color-neutral-light)', 0.8), '--mantine-color-neutral-light-color': 'var(--mantine-color-neutral-6)', '--mantine-color-stone-light': alpha('var(--mantine-color-stone-4)', 0.1), '--mantine-color-stone-light-hover': alpha('var(--mantine-color-stone-light)', 0.8), '--mantine-color-stone-light-color': 'var(--mantine-color-stone-6)', '--mantine-color-red-light': alpha('var(--mantine-color-red-4)', 0.1), '--mantine-color-red-light-hover': alpha('var(--mantine-color-red-light)', 0.8), '--mantine-color-red-light-color': 'var(--mantine-color-red-6)', '--mantine-color-rose-light': alpha('var(--mantine-color-rose-4)', 0.1), '--mantine-color-rose-light-hover': alpha('var(--mantine-color-rose-light)', 0.8), '--mantine-color-rose-light-color': 'var(--mantine-color-rose-6)', '--mantine-color-orange-light': alpha('var(--mantine-color-orange-4)', 0.1), '--mantine-color-orange-light-hover': alpha('var(--mantine-color-orange-light)', 0.8), '--mantine-color-orange-light-color': 'var(--mantine-color-orange-6)', '--mantine-color-amber-light': alpha('var(--mantine-color-amber-4)', 0.1), '--mantine-color-amber-light-hover': alpha('var(--mantine-color-amber-light)', 0.8), '--mantine-color-amber-light-color': 'var(--mantine-color-amber-6)', '--mantine-color-yellow-light': alpha('var(--mantine-color-yellow-4)', 0.1), '--mantine-color-yellow-light-hover': alpha('var(--mantine-color-yellow-light)', 0.8), '--mantine-color-yellow-light-color': 'var(--mantine-color-yellow-6)', '--mantine-color-lime-light': alpha('var(--mantine-color-lime-4)', 0.1), '--mantine-color-lime-light-hover': alpha('var(--mantine-color-lime-light)', 0.8), '--mantine-color-lime-light-color': 'var(--mantine-color-lime-6)', '--mantine-color-green-light': alpha('var(--mantine-color-green-4)', 0.1), '--mantine-color-green-light-hover': alpha('var(--mantine-color-green-light)', 0.8), '--mantine-color-green-light-color': 'var(--mantine-color-green-6)', '--mantine-color-emerald-light': alpha('var(--mantine-color-emerald-4)', 0.1), '--mantine-color-emerald-light-hover': alpha('var(--mantine-color-emerald-light)', 0.8), '--mantine-color-emerald-light-color': 'var(--mantine-color-emerald-6)', '--mantine-color-teal-light': alpha('var(--mantine-color-teal-4)', 0.1), '--mantine-color-teal-light-hover': alpha('var(--mantine-color-teal-light)', 0.8), '--mantine-color-teal-light-color': 'var(--mantine-color-teal-6)', '--mantine-color-cyan-light': alpha('var(--mantine-color-cyan-4)', 0.1), '--mantine-color-cyan-light-hover': alpha('var(--mantine-color-cyan-light)', 0.8), '--mantine-color-cyan-light-color': 'var(--mantine-color-cyan-6)', '--mantine-color-sky-light': alpha('var(--mantine-color-sky-4)', 0.1), '--mantine-color-sky-light-hover': alpha('var(--mantine-color-sky-light)', 0.8), '--mantine-color-sky-light-color': 'var(--mantine-color-sky-6)', '--mantine-color-blue-light': alpha('var(--mantine-color-blue-4)', 0.1), '--mantine-color-blue-light-hover': alpha('var(--mantine-color-blue-light)', 0.8), '--mantine-color-blue-light-color': 'var(--mantine-color-blue-6)', '--mantine-color-indigo-light': alpha('var(--mantine-color-indigo-4)', 0.1), '--mantine-color-indigo-light-hover': alpha('var(--mantine-color-indigo-light)', 0.8), '--mantine-color-indigo-light-color': 'var(--mantine-color-indigo-6)', '--mantine-color-violet-light': alpha('var(--mantine-color-violet-4)', 0.1), '--mantine-color-violet-light-hover': alpha('var(--mantine-color-violet-light)', 0.8), '--mantine-color-violet-light-color': 'var(--mantine-color-violet-6)', '--mantine-color-purple-light': alpha('var(--mantine-color-purple-4)', 0.1), '--mantine-color-purple-light-hover': alpha('var(--mantine-color-purple-light)', 0.8), '--mantine-color-purple-light-color': 'var(--mantine-color-purple-6)', '--mantine-color-fuchsia-light': alpha('var(--mantine-color-fuchsia-4)', 0.1), '--mantine-color-fuchsia-light-hover': alpha('var(--mantine-color-fuchsia-light)', 0.8), '--mantine-color-fuchsia-light-color': 'var(--mantine-color-fuchsia-6)', '--mantine-color-pink-light': alpha('var(--mantine-color-pink-4)', 0.1), '--mantine-color-pink-light-hover': alpha('var(--mantine-color-pink-light)', 0.8), '--mantine-color-pink-light-color': 'var(--mantine-color-pink-6)', // all outline colors '--mantine-color-zinc-outline': 'var(--mantine-color-zinc-8)', '--mantine-color-zinc-outline-hover': alpha('var(--mantine-color-zinc-4)', 0.1), '--mantine-color-slate-outline': 'var(--mantine-color-slate-8)', '--mantine-color-slate-outline-hover': alpha('var(--mantine-color-slate-4)', 0.1), '--mantine-color-gray-outline': 'var(--mantine-color-gray-8)', '--mantine-color-gray-outline-hover': alpha('var(--mantine-color-gray-4)', 0.1), '--mantine-color-neutral-outline': 'var(--mantine-color-neutral-8)', '--mantine-color-neutral-outline-hover': alpha('var(--mantine-color-neutral-4)', 0.1), '--mantine-color-stone-outline': 'var(--mantine-color-stone-8)', '--mantine-color-stone-outline-hover': alpha('var(--mantine-color-stone-4)', 0.1), '--mantine-color-red-outline': 'var(--mantine-color-red-5)', '--mantine-color-red-outline-hover': alpha('var(--mantine-color-red-4)', 0.1), '--mantine-color-rose-outline': 'var(--mantine-color-rose-5)', '--mantine-color-rose-outline-hover': alpha('var(--mantine-color-rose-4)', 0.1), '--mantine-color-orange-outline': 'var(--mantine-color-orange-5)', '--mantine-color-orange-outline-hover': alpha('var(--mantine-color-orange-4)', 0.1), '--mantine-color-amber-outline': 'var(--mantine-color-amber-5)', '--mantine-color-amber-outline-hover': alpha('var(--mantine-color-amber-4)', 0.1), '--mantine-color-yellow-outline': 'var(--mantine-color-yellow-4)', '--mantine-color-yellow-outline-hover': alpha('var(--mantine-color-yellow-4)', 0.1), '--mantine-color-lime-outline': 'var(--mantine-color-lime-5)', '--mantine-color-lime-outline-hover': alpha('var(--mantine-color-lime-4)', 0.1), '--mantine-color-green-outline': 'var(--mantine-color-green-6)', '--mantine-color-green-outline-hover': alpha('var(--mantine-color-green-4)', 0.1), '--mantine-color-emerald-outline': 'var(--mantine-color-emerald-5)', '--mantine-color-emerald-outline-hover': alpha('var(--mantine-color-emerald-4)', 0.1), '--mantine-color-teal-outline': 'var(--mantine-color-teal-5)', '--mantine-color-teal-outline-hover': alpha('var(--mantine-color-teal-4)', 0.1), '--mantine-color-cyan-outline': 'var(--mantine-color-cyan-5)', '--mantine-color-cyan-outline-hover': alpha('var(--mantine-color-cyan-4)', 0.1), '--mantine-color-sky-outline': 'var(--mantine-color-sky-5)', '--mantine-color-sky-outline-hover': alpha('var(--mantine-color-sky-4)', 0.1), '--mantine-color-blue-outline': 'var(--mantine-color-blue-6)', '--mantine-color-blue-outline-hover': alpha('var(--mantine-color-blue-4)', 0.1), '--mantine-color-indigo-outline': 'var(--mantine-color-indigo-5)', '--mantine-color-indigo-outline-hover': alpha('var(--mantine-color-indigo-4)', 0.1), '--mantine-color-violet-outline': 'var(--mantine-color-violet-5)', '--mantine-color-violet-outline-hover': alpha('var(--mantine-color-violet-4)', 0.1), '--mantine-color-purple-outline': 'var(--mantine-color-purple-5)', '--mantine-color-purple-outline-hover': alpha('var(--mantine-color-purple-4)', 0.1), '--mantine-color-fuchsia-outline': 'var(--mantine-color-fuchsia-5)', '--mantine-color-fuchsia-outline-hover': alpha('var(--mantine-color-fuchsia-4)', 0.1), '--mantine-color-pink-outline': 'var(--mantine-color-pink-5)', '--mantine-color-pink-outline-hover': alpha('var(--mantine-color-pink-4)', 0.1), // all contrast colors '--mantine-color-zinc-contrast': 'var(--mantine-color-zinc-0)', '--mantine-color-slate-contrast': 'var(--mantine-color-slate-0)', '--mantine-color-gray-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-neutral-contrast': 'var(--mantine-color-neutral-0)', '--mantine-color-stone-contrast': 'var(--mantine-color-stone-0)', '--mantine-color-red-contrast': 'var(--mantine-color-red-0)', '--mantine-color-rose-contrast': 'var(--mantine-color-rose-0)', '--mantine-color-orange-contrast': 'var(--mantine-color-stone-0)', '--mantine-color-amber-contrast': 'var(--mantine-color-amber-0)', '--mantine-color-yellow-contrast': '#422006', '--mantine-color-lime-contrast': 'var(--mantine-color-lime-0)', '--mantine-color-green-contrast': 'var(--mantine-color-rose-0)', '--mantine-color-emerald-contrast': 'var(--mantine-color-emerald-0)', '--mantine-color-teal-contrast': 'var(--mantine-color-teal-0)', '--mantine-color-cyan-contrast': 'var(--mantine-color-cyan-0)', '--mantine-color-sky-contrast': 'var(--mantine-color-sky-0)', '--mantine-color-blue-contrast': 'var(--mantine-color-slate-0)', '--mantine-color-indigo-contrast': 'var(--mantine-color-indigo-0)', '--mantine-color-violet-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-purple-contrast': 'var(--mantine-color-purple-0)', '--mantine-color-fuchsia-contrast': 'var(--mantine-color-fuchsia-0)', '--mantine-color-pink-contrast': 'var(--mantine-color-pink-0)', }, dark: { // all variables that depend on dark color scheme '--mantine-primary-color-contrast': 'var(--mantine-color-zinc-8)', // used as primary color contrast '--mantine-color-text': 'var(--mantine-color-secondary-0)', // used as text color '--mantine-color-body': 'var(--mantine-color-secondary-9)', // used as body color '--mantine-color-error': 'var(--mantine-color-error-10)', // used as error color '--mantine-color-placeholder': 'var(--mantine-color-secondary-4)', // used as placeholder color '--mantine-color-anchor': 'var(--mantine-color-secondary-4)', // used as anchor color '--mantine-color-default': 'var(--mantine-color-secondary-9)', // used as default surface color '--mantine-color-default-hover': 'var(--mantine-color-secondary-7)', // used as default hover color '--mantine-color-default-color': 'var(--mantine-color-secondary-1)', // used as default text color '--mantine-color-default-border': 'var(--mantine-color-secondary-7)', // used as default border color '--mantine-color-dimmed': 'var(--mantine-color-secondary-4)', // used as dimmed text color '--mantine-color-secondary-filled': 'var(--mantine-color-secondary-8)', // used as secondary surface color '--mantine-color-secondary-filled-hover': alpha('var(--mantine-color-secondary-filled)', 0.9), // used as secondary hover color '--mantine-color-secondary-light': 'var(--mantine-color-secondary-7)', // used as primary light color '--mantine-color-secondary-light-hover': alpha('var(--mantine-color-secondary-light)', 0.8), // used as primary light hover color '--mantine-color-secondary-text': 'var(--mantine-primary-color-contrast)', // can be used as secondary text color '--mantine-color-secondary-light-color': 'var(--mantine-color-secondary-0)', // used as primary light text color '--mantine-color-secondary-outline': 'var(--mantine-color-secondary-7)', '--mantine-color-secondary-outline-hover': 'var(--mantine-color-secondary-7)', // all filled colors '--mantine-color-zinc-filled': 'var(--mantine-color-zinc-0)', '--mantine-color-zinc-filled-hover': alpha('var(--mantine-color-zinc-0)', 0.9), '--mantine-color-slate-filled': 'var(--mantine-color-slate-0)', '--mantine-color-slate-filled-hover': alpha('var(--mantine-color-slate-0)', 0.9), '--mantine-color-gray-filled': 'var(--mantine-color-gray-0)', '--mantine-color-gray-filled-hover': alpha('var(--mantine-color-gray-0)', 0.9), '--mantine-color-neutral-filled': 'var(--mantine-color-neutral-0)', '--mantine-color-neutral-filled-hover': alpha('var(--mantine-color-neutral-0)', 0.9), '--mantine-color-stone-filled': 'var(--mantine-color-stone-0)', '--mantine-color-stone-filled-hover': alpha('var(--mantine-color-stone-0)', 0.9), '--mantine-color-red-filled': 'var(--mantine-color-red-5)', '--mantine-color-red-filled-hover': alpha('var(--mantine-color-red-5)', 0.9), '--mantine-color-rose-filled': 'var(--mantine-color-rose-5)', '--mantine-color-rose-filled-hover': alpha('var(--mantine-color-rose-5)', 0.9), '--mantine-color-orange-filled': 'var(--mantine-color-orange-6)', '--mantine-color-orange-filled-hover': alpha('var(--mantine-color-orange-6)', 0.9), '--mantine-color-amber-filled': 'var(--mantine-color-amber-5)', '--mantine-color-amber-filled-hover': alpha('var(--mantine-color-amber-5)', 0.9), '--mantine-color-yellow-filled': 'var(--mantine-color-yellow-4)', '--mantine-color-yellow-filled-hover': alpha('var(--mantine-color-yellow-4)', 0.9), '--mantine-color-lime-filled': 'var(--mantine-color-lime-4)', '--mantine-color-lime-filled-hover': alpha('var(--mantine-color-lime-4)', 0.9), '--mantine-color-green-filled': 'var(--mantine-color-green-5)', '--mantine-color-green-filled-hover': alpha('var(--mantine-color-green-5)', 0.9), '--mantine-color-emerald-filled': 'var(--mantine-color-emerald-5)', '--mantine-color-emerald-filled-hover': alpha('var(--mantine-color-emerald-5)', 0.9), '--mantine-color-teal-filled': 'var(--mantine-color-teal-4)', '--mantine-color-teal-filled-hover': alpha('var(--mantine-color-teal-4)', 0.9), '--mantine-color-cyan-filled': 'var(--mantine-color-cyan-4)', '--mantine-color-cyan-filled-hover': alpha('var(--mantine-color-cyan-4)', 0.9), '--mantine-color-sky-filled': 'var(--mantine-color-sky-4)', '--mantine-color-sky-filled-hover': alpha('var(--mantine-color-sky-4)', 0.9), '--mantine-color-blue-filled': 'var(--mantine-color-blue-5)', '--mantine-color-blue-filled-hover': alpha('var(--mantine-color-blue-5)', 0.9), '--mantine-color-indigo-filled': 'var(--mantine-color-indigo-6)', '--mantine-color-indigo-filled-hover': alpha('var(--mantine-color-indigo-6)', 0.9), '--mantine-color-violet-filled': 'var(--mantine-color-violet-6)', '--mantine-color-violet-filled-hover': alpha('var(--mantine-color-violet-6)', 0.9), '--mantine-color-purple-filled': 'var(--mantine-color-purple-6)', '--mantine-color-purple-filled-hover': alpha('var(--mantine-color-purple-6)', 0.9), '--mantine-color-fuchsia-filled': 'var(--mantine-color-fuchsia-7)', '--mantine-color-fuchsia-filled-hover': alpha('var(--mantine-color-fuchsia-7)', 0.9), '--mantine-color-pink-filled': 'var(--mantine-color-pink-6)', '--mantine-color-pink-filled-hover': alpha('var(--mantine-color-pink-6)', 0.9), // all light colors '--mantine-color-zinc-light': alpha('var(--mantine-color-zinc-4)', 0.15), '--mantine-color-zinc-light-hover': alpha('var(--mantine-color-zinc-light)', 0.8), '--mantine-color-zinc-light-color': 'var(--mantine-color-zinc-3)', '--mantine-color-slate-light': alpha('var(--mantine-color-slate-4)', 0.15), '--mantine-color-slate-light-hover': alpha('var(--mantine-color-slate-light)', 0.8), '--mantine-color-slate-light-color': 'var(--mantine-color-slate-3)', '--mantine-color-gray-light': alpha('var(--mantine-color-gray-4)', 0.15), '--mantine-color-gray-light-hover': alpha('var(--mantine-color-gray-light)', 0.8), '--mantine-color-gray-light-color': 'var(--mantine-color-gray-3)', '--mantine-color-neutral-light': alpha('var(--mantine-color-neutral-4)', 0.15), '--mantine-color-neutral-light-hover': alpha('var(--mantine-color-neutral-light)', 0.8), '--mantine-color-neutral-light-color': 'var(--mantine-color-neutral-3)', '--mantine-color-stone-light': alpha('var(--mantine-color-stone-4)', 0.15), '--mantine-color-stone-light-hover': alpha('var(--mantine-color-stone-light)', 0.8), '--mantine-color-stone-light-color': 'var(--mantine-color-stone-3)', '--mantine-color-red-light': alpha('var(--mantine-color-red-4)', 0.15), '--mantine-color-red-light-hover': alpha('var(--mantine-color-red-light)', 0.8), '--mantine-color-red-light-color': 'var(--mantine-color-red-3)', '--mantine-color-rose-light': alpha('var(--mantine-color-rose-4)', 0.15), '--mantine-color-rose-light-hover': alpha('var(--mantine-color-rose-light)', 0.8), '--mantine-color-rose-light-color': 'var(--mantine-color-rose-3)', '--mantine-color-orange-light': alpha('var(--mantine-color-orange-4)', 0.15), '--mantine-color-orange-light-hover': alpha('var(--mantine-color-orange-light)', 0.8), '--mantine-color-orange-light-color': 'var(--mantine-color-orange-3)', '--mantine-color-amber-light': alpha('var(--mantine-color-amber-4)', 0.15), '--mantine-color-amber-light-hover': alpha('var(--mantine-color-amber-light)', 0.8), '--mantine-color-amber-light-color': 'var(--mantine-color-amber-3)', '--mantine-color-yellow-light': alpha('var(--mantine-color-yellow-4)', 0.15), '--mantine-color-yellow-light-hover': alpha('var(--mantine-color-yellow-light)', 0.8), '--mantine-color-yellow-light-color': 'var(--mantine-color-yellow-3)', '--mantine-color-lime-light': alpha('var(--mantine-color-lime-4)', 0.15), '--mantine-color-lime-light-hover': alpha('var(--mantine-color-lime-light)', 0.8), '--mantine-color-lime-light-color': 'var(--mantine-color-lime-3)', '--mantine-color-green-light': alpha('var(--mantine-color-green-4)', 0.15), '--mantine-color-green-light-hover': alpha('var(--mantine-color-green-light)', 0.8), '--mantine-color-green-light-color': 'var(--mantine-color-green-3)', '--mantine-color-emerald-light': alpha('var(--mantine-color-emerald-4)', 0.15), '--mantine-color-emerald-light-hover': alpha('var(--mantine-color-emerald-light)', 0.8), '--mantine-color-emerald-light-color': 'var(--mantine-color-emerald-3)', '--mantine-color-teal-light': alpha('var(--mantine-color-teal-4)', 0.15), '--mantine-color-teal-light-hover': alpha('var(--mantine-color-teal-light)', 0.8), '--mantine-color-teal-light-color': 'var(--mantine-color-teal-3)', '--mantine-color-cyan-light': alpha('var(--mantine-color-cyan-4)', 0.15), '--mantine-color-cyan-light-hover': alpha('var(--mantine-color-cyan-light)', 0.8), '--mantine-color-cyan-light-color': 'var(--mantine-color-cyan-3)', '--mantine-color-sky-light': alpha('var(--mantine-color-sky-4)', 0.15), '--mantine-color-sky-light-hover': alpha('var(--mantine-color-sky-light)', 0.8), '--mantine-color-sky-light-color': 'var(--mantine-color-sky-3)', '--mantine-color-blue-light': alpha('var(--mantine-color-blue-4)', 0.15), '--mantine-color-blue-light-hover': alpha('var(--mantine-color-blue-light)', 0.8), '--mantine-color-blue-light-color': 'var(--mantine-color-blue-3)', '--mantine-color-indigo-light': alpha('var(--mantine-color-indigo-4)', 0.15), '--mantine-color-indigo-light-hover': alpha('var(--mantine-color-indigo-light)', 0.8), '--mantine-color-indigo-light-color': 'var(--mantine-color-indigo-3)', '--mantine-color-violet-light': alpha('var(--mantine-color-violet-4)', 0.15), '--mantine-color-violet-light-hover': alpha('var(--mantine-color-violet-light)', 0.8), '--mantine-color-violet-light-color': 'var(--mantine-color-violet-3)', '--mantine-color-purple-light': alpha('var(--mantine-color-purple-4)', 0.15), '--mantine-color-purple-light-hover': alpha('var(--mantine-color-purple-light)', 0.8), '--mantine-color-purple-light-color': 'var(--mantine-color-purple-3)', '--mantine-color-fuchsia-light': alpha('var(--mantine-color-fuchsia-4)', 0.15), '--mantine-color-fuchsia-light-hover': alpha('var(--mantine-color-fuchsia-light)', 0.8), '--mantine-color-fuchsia-light-color': 'var(--mantine-color-fuchsia-3)', '--mantine-color-pink-light': alpha('var(--mantine-color-pink-4)', 0.15), '--mantine-color-pink-light-hover': alpha('var(--mantine-color-pink-light)', 0.8), '--mantine-color-pink-light-color': 'var(--mantine-color-pink-3)', // all outline colors '--mantine-color-zinc-outline': 'var(--mantine-color-zinc-0)', '--mantine-color-zinc-outline-hover': alpha('var(--mantine-color-zinc-4)', 0.15), '--mantine-color-slate-outline': 'var(--mantine-color-slate-0)', '--mantine-color-slate-outline-hover': alpha('var(--mantine-color-slate-4)', 0.15), '--mantine-color-gray-outline': 'var(--mantine-color-gray-0)', '--mantine-color-gray-outline-hover': alpha('var(--mantine-color-gray-4)', 0.15), '--mantine-color-neutral-outline': 'var(--mantine-color-neutral-0)', '--mantine-color-neutral-outline-hover': alpha('var(--mantine-color-neutral-4)', 0.15), '--mantine-color-stone-outline': 'var(--mantine-color-stone-0)', '--mantine-color-stone-outline-hover': alpha('var(--mantine-color-stone-4)', 0.15), '--mantine-color-red-outline': 'var(--mantine-color-red-5)', '--mantine-color-red-outline-hover': alpha('var(--mantine-color-red-4)', 0.15), '--mantine-color-rose-outline': 'var(--mantine-color-rose-5)', '--mantine-color-rose-outline-hover': alpha('var(--mantine-color-rose-4)', 0.15), '--mantine-color-orange-outline': 'var(--mantine-color-orange-6)', '--mantine-color-orange-outline-hover': alpha('var(--mantine-color-orange-4)', 0.15), '--mantine-color-amber-outline': 'var(--mantine-color-amber-5)', '--mantine-color-amber-outline-hover': alpha('var(--mantine-color-amber-4)', 0.15), '--mantine-color-yellow-outline': 'var(--mantine-color-yellow-4)', '--mantine-color-yellow-outline-hover': alpha('var(--mantine-color-yellow-4)', 0.15), '--mantine-color-lime-outline': 'var(--mantine-color-lime-4)', '--mantine-color-lime-outline-hover': alpha('var(--mantine-color-lime-4)', 0.15), '--mantine-color-green-outline': 'var(--mantine-color-green-5)', '--mantine-color-green-outline-hover': alpha('var(--mantine-color-green-4)', 0.15), '--mantine-color-emerald-outline': 'var(--mantine-color-emerald-5)', '--mantine-color-emerald-outline-hover': alpha('var(--mantine-color-emerald-4)', 0.15), '--mantine-color-teal-outline': 'var(--mantine-color-teal-4)', '--mantine-color-teal-outline-hover': alpha('var(--mantine-color-teal-4)', 0.15), '--mantine-color-cyan-outline': 'var(--mantine-color-cyan-4)', '--mantine-color-cyan-outline-hover': alpha('var(--mantine-color-cyan-4)', 0.15), '--mantine-color-sky-outline': 'var(--mantine-color-sky-4)', '--mantine-color-sky-outline-hover': alpha('var(--mantine-color-sky-4)', 0.15), '--mantine-color-blue-outline': 'var(--mantine-color-blue-5)', '--mantine-color-blue-outline-hover': alpha('var(--mantine-color-blue-4)', 0.15), '--mantine-color-indigo-outline': 'var(--mantine-color-indigo-6)', '--mantine-color-indigo-outline-hover': alpha('var(--mantine-color-indigo-4)', 0.15), '--mantine-color-violet-outline': 'var(--mantine-color-violet-6)', '--mantine-color-violet-outline-hover': alpha('var(--mantine-color-violet-4)', 0.15), '--mantine-color-purple-outline': 'var(--mantine-color-purple-6)', '--mantine-color-purple-outline-hover': alpha('var(--mantine-color-purple-4)', 0.15), '--mantine-color-fuchsia-outline': 'var(--mantine-color-fuchsia-7)', '--mantine-color-fuchsia-outline-hover': alpha('var(--mantine-color-fuchsia-4)', 0.15), '--mantine-color-pink-outline': 'var(--mantine-color-pink-6)', '--mantine-color-pink-outline-hover': alpha('var(--mantine-color-pink-4)', 0.15), // all contrast colors '--mantine-color-zinc-contrast': 'var(--mantine-color-zinc-8)', '--mantine-color-slate-contrast': 'var(--mantine-color-slate-8)', '--mantine-color-gray-contrast': 'var(--mantine-color-gray-8)', '--mantine-color-neutral-contrast': 'var(--mantine-color-neutral-8)', '--mantine-color-stone-contrast': 'var(--mantine-color-stone-8)', '--mantine-color-red-contrast': 'var(--mantine-color-red-0)', '--mantine-color-rose-contrast': 'var(--mantine-color-rose-0)', '--mantine-color-orange-contrast': 'var(--mantine-color-stone-0)', '--mantine-color-amber-contrast': 'var(--mantine-color-stone-8)', '--mantine-color-yellow-contrast': '#422006', '--mantine-color-lime-contrast': 'var(--mantine-color-stone-8)', '--mantine-color-green-contrast': 'var(--mantine-color-green-9)', '--mantine-color-emerald-contrast': 'var(--mantine-color-stone-0)', '--mantine-color-teal-contrast': 'var(--mantine-color-slate-8)', '--mantine-color-cyan-contrast': 'var(--mantine-color-slate-8)', '--mantine-color-sky-contrast': 'var(--mantine-color-slate-8)', '--mantine-color-blue-contrast': 'var(--mantine-color-slate-0)', '--mantine-color-indigo-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-violet-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-purple-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-fuchsia-contrast': 'var(--mantine-color-gray-0)', '--mantine-color-pink-contrast': 'var(--mantine-color-gray-0)', }, }); ================================================ FILE: dashboard/src/features/config/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; ================================================ FILE: dashboard/src/features/config/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import type { RootState } from '../../store'; export const selectConfig = (state: RootState) => state.config; export const selectAutoRefreshMs = (state: RootState) => state.config.autoRefreshMs; export const selectBaseUrl = (state: RootState) => state.config.baseUrl; export const selectThemePreference = (state: RootState) => state.config.theme; ================================================ FILE: dashboard/src/features/config/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import type { ConfigState, ThemePreference } from '@/types'; export const initialConfigState: ConfigState = { baseUrl: typeof window !== 'undefined' ? window.location.origin : '', autoRefreshMs: 0, theme: 'system', }; const configSlice = createSlice({ name: 'config', initialState: initialConfigState, reducers: { setBaseUrl(state, action: PayloadAction) { state.baseUrl = action.payload; }, setAutoRefreshMs(state, action: PayloadAction) { state.autoRefreshMs = action.payload; }, setTheme(state, action: PayloadAction) { state.theme = action.payload; }, }, }); export const { setAutoRefreshMs, setBaseUrl, setTheme } = configSlice.actions; export const configReducer = configSlice.reducer; ================================================ FILE: dashboard/src/features/resources/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; export { useGetResourcesQuery } from '../rollouts'; ================================================ FILE: dashboard/src/features/resources/resources.test.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createServerBackedStore } from '@test-utils'; import { describe, expect, it } from 'vitest'; import { rolloutsApi } from '@/features/rollouts'; import type { Resources } from '@/types'; import { selectResourcesQueryArgs } from './selectors'; import { resetResourcesFilters, setResourcesPage, setResourcesRecordsPerPage, setResourcesSearchTerm, setResourcesSort, } from './slice'; const extractResourceIds = (resources: Resources[]): string[] => resources.map((resource) => resource.resourcesId); describe('resources feature integration', () => { it('builds default query arguments from the UI state', () => { const store = createServerBackedStore(); const queryArgs = selectResourcesQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 50, offset: 0, sortBy: 'update_time', sortOrder: 'desc', resourcesIdContains: undefined, }); }); it('fetches resources from the Python LightningStore server', async () => { const store = createServerBackedStore(); const queryArgs = selectResourcesQueryArgs(store.getState()); const subscription = store.dispatch(rolloutsApi.endpoints.getResources.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.total).toBe(5); expect(data.items).toHaveLength(5); const resourceIds = extractResourceIds(data.items); expect(resourceIds).toEqual(expect.arrayContaining(['rs-story-001', 'rs-story-005'])); const updateTimes = data.items.map((resource) => resource.updateTime); const sortedUpdateTimes = [...updateTimes].sort((a, b) => b - a); expect(updateTimes).toEqual(sortedUpdateTimes); expect(data.items[0].resources).toBeDefined(); expect(Object.keys(data.items[0].resources)).not.toHaveLength(0); }); it('paginates resource results based on UI state', async () => { const store = createServerBackedStore(); store.dispatch(setResourcesRecordsPerPage(2)); store.dispatch(setResourcesPage(2)); const queryArgs = selectResourcesQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 2, offset: 2 }); const subscription = store.dispatch(rolloutsApi.endpoints.getResources.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(2); expect(data.total).toBe(5); expect(data.items.map((resource) => resource.resourcesId)).toEqual(['rs-story-005', 'rs-story-002']); }); it('applies search and sorting preferences', async () => { const store = createServerBackedStore(); store.dispatch(resetResourcesFilters()); store.dispatch(setResourcesSearchTerm('rs-story-003')); store.dispatch(setResourcesSort({ column: 'version', direction: 'asc' })); const queryArgs = selectResourcesQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 50, offset: 0, sortBy: 'version', sortOrder: 'asc', resourcesIdContains: 'rs-story-003', }); const subscription = store.dispatch(rolloutsApi.endpoints.getResources.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(1); expect(data.items[0].resourcesId).toBe('rs-story-003'); expect(data.items[0].version).toBeGreaterThan(0); }); }); ================================================ FILE: dashboard/src/features/resources/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSelector } from '@reduxjs/toolkit'; import type { GetResourcesQueryArgs } from '@/features/rollouts'; import type { RootState } from '@/store'; import type { ResourcesSortState } from './slice'; const RESOURCES_SORT_FIELD_MAP: Record = { resourcesId: 'resources_id', version: 'version', createTime: 'create_time', updateTime: 'update_time', }; const resolveResourcesSortField = (sort: ResourcesSortState): string => RESOURCES_SORT_FIELD_MAP[sort.column] ?? 'update_time'; export const selectResourcesUiState = (state: RootState) => state.resources; export const selectResourcesSearchTerm = (state: RootState) => selectResourcesUiState(state).searchTerm; export const selectResourcesPage = (state: RootState) => selectResourcesUiState(state).page; export const selectResourcesRecordsPerPage = (state: RootState) => selectResourcesUiState(state).recordsPerPage; export const selectResourcesSort = (state: RootState) => selectResourcesUiState(state).sort; export const selectResourcesQueryArgs = createSelector( [selectResourcesSearchTerm, selectResourcesPage, selectResourcesRecordsPerPage, selectResourcesSort], (searchTerm, page, recordsPerPage, sort): GetResourcesQueryArgs => { const normalizedSearch = searchTerm.trim(); const limit = Math.max(1, recordsPerPage); const offset = Math.max(0, (page - 1) * limit); const sortBy = resolveResourcesSortField(sort); return { limit, offset, sortBy, sortOrder: sort.direction, resourcesIdContains: normalizedSearch.length > 0 ? normalizedSearch : undefined, }; }, ); ================================================ FILE: dashboard/src/features/resources/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; export type SortDirection = 'asc' | 'desc'; export type ResourcesSortState = { column: string; direction: SortDirection; }; export type ResourcesUiState = { searchTerm: string; page: number; recordsPerPage: number; sort: ResourcesSortState; }; export const initialResourcesUiState: ResourcesUiState = { searchTerm: '', page: 1, recordsPerPage: 50, sort: { column: 'updateTime', direction: 'desc', }, }; const resourcesSlice = createSlice({ name: 'resources', initialState: initialResourcesUiState, reducers: { setResourcesSearchTerm(state, action: PayloadAction) { state.searchTerm = action.payload; state.page = 1; }, setResourcesPage(state, action: PayloadAction) { state.page = action.payload; }, setResourcesRecordsPerPage(state, action: PayloadAction) { state.recordsPerPage = action.payload; state.page = 1; }, setResourcesSort(state, action: PayloadAction) { state.sort = action.payload; }, resetResourcesFilters(state) { state.searchTerm = initialResourcesUiState.searchTerm; state.page = initialResourcesUiState.page; state.recordsPerPage = initialResourcesUiState.recordsPerPage; state.sort = initialResourcesUiState.sort; }, }, }); export const { setResourcesSearchTerm, setResourcesPage, setResourcesRecordsPerPage, setResourcesSort, resetResourcesFilters, } = resourcesSlice.actions; export const resourcesReducer = resourcesSlice.reducer; ================================================ FILE: dashboard/src/features/rollouts/api.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import type { BaseQueryFn } from '@reduxjs/toolkit/query'; import { createApi, fetchBaseQuery, type FetchArgs, type FetchBaseQueryError } from '@reduxjs/toolkit/query/react'; import type { RootState } from '@/store'; import { camelCaseKeys } from '@/utils/format'; import type { Attempt, PaginatedResponse, Resources, Rollout, RolloutMode, RolloutStatus, Span, Timestamp, Worker, WorkerStatus, } from '../../types'; const rawBaseQuery = fetchBaseQuery({ baseUrl: '/', }); const buildAbsoluteUrl = (baseUrl: string, path: string) => { if (path.startsWith('http://') || path.startsWith('https://')) { return path; } const normalizedBase = baseUrl.replace(/\/+$/, ''); const normalizedPath = path.replace(/^\/+/, ''); if (!normalizedBase) { return `/${normalizedPath}`; } return `${normalizedBase}/${normalizedPath}`; }; const normalizeHeartbeat = ( attempt: Partial & { lastHeartbeatTime?: Timestamp | null; lastHeartBeatTime?: Timestamp | null }, ): Timestamp | null => { if (typeof attempt.lastHeartbeatTime === 'number') { return attempt.lastHeartbeatTime; } if (typeof attempt.lastHeartBeatTime === 'number') { return attempt.lastHeartBeatTime; } if (typeof attempt.startTime === 'number') { return attempt.startTime; } return null; }; const normalizeAttempt = (value: unknown): Attempt | null => { if (value === null || typeof value === 'undefined') { return null; } const camelized = camelCaseKeys(value) as Attempt & { lastHeartbeatTime?: Timestamp | null; lastHeartBeatTime?: Timestamp | null; }; const { lastHeartbeatTime, lastHeartBeatTime, ...rest } = camelized; return { ...rest, lastHeartbeatTime: normalizeHeartbeat({ ...rest, lastHeartbeatTime, lastHeartBeatTime }), }; }; const normalizeAttemptStrict = (value: unknown): Attempt => { const normalized = normalizeAttempt(value); if (!normalized) { throw new Error('Expected attempt payload'); } return normalized; }; const normalizeRollout = (value: unknown): Rollout => { const camelized = camelCaseKeys(value) as Rollout & { attempt?: unknown }; const { attempt, ...rest } = camelized; return { ...rest, attempt: normalizeAttempt(attempt), }; }; const normalizeSpan = (value: unknown): Span => { const camelized = camelCaseKeys(value) as Span & { status?: { status_code?: Span['status']['status_code']; statusCode?: Span['status']['status_code']; description?: string | null; }; }; const rawStatus = camelized.status ?? { status_code: 'UNSET', description: null }; const result = { ...camelized, parentId: camelized.parentId ?? null, // The following fields does not need to be normalized to camel case // For example, gen_ai.xxx should not become genAi.xxx attributes: (value as any).attributes ?? {}, context: (value as any).context ?? {}, parent: (value as any).parent ?? null, resource: (value as any).resource ?? {}, status: { status_code: rawStatus.status_code ?? rawStatus.statusCode ?? 'UNSET', description: rawStatus.description ?? null, }, }; return result; }; const normalizeResources = (value: unknown): Resources => { const camelized = camelCaseKeys(value) as Resources; return { resourcesId: camelized.resourcesId, version: camelized.version, createTime: camelized.createTime, updateTime: camelized.updateTime, resources: camelized.resources ?? {}, }; }; const normalizeWorker = (value: unknown): Worker => { const camelized = camelCaseKeys(value) as Worker; return { workerId: camelized.workerId, status: camelized.status, heartbeatStats: camelized.heartbeatStats ?? null, lastHeartbeatTime: camelized.lastHeartbeatTime ?? null, lastDequeueTime: camelized.lastDequeueTime ?? null, lastBusyTime: camelized.lastBusyTime ?? null, lastIdleTime: camelized.lastIdleTime ?? null, currentRolloutId: camelized.currentRolloutId ?? null, currentAttemptId: camelized.currentAttemptId ?? null, }; }; const normalizePaginatedResponse = (value: unknown, normalizer: (item: unknown) => T): PaginatedResponse => { if (!value || typeof value !== 'object') { throw new Error('Expected paginated response payload'); } const converted = value as { items?: unknown; limit?: number; offset?: number; total?: number; }; const itemsSource = Array.isArray(converted.items) ? converted.items : []; return { items: itemsSource.map((item) => normalizer(item)), limit: typeof converted.limit === 'number' ? converted.limit : itemsSource.length, offset: typeof converted.offset === 'number' ? converted.offset : 0, total: typeof converted.total === 'number' ? converted.total : itemsSource.length, }; }; const dynamicBaseQuery: BaseQueryFn = async ( args, api, extraOptions, ) => { const state = api.getState() as RootState; const stateBaseUrl = state.config?.baseUrl; const fallbackBaseUrl = typeof window !== 'undefined' ? window.location.origin : ''; const baseUrl = stateBaseUrl && stateBaseUrl.trim().length > 0 ? stateBaseUrl : fallbackBaseUrl; const preparedArgs: FetchArgs = typeof args === 'string' ? { url: args } : { ...args, url: args.url ?? '', }; const absoluteUrl = buildAbsoluteUrl(baseUrl, preparedArgs.url ?? ''); return rawBaseQuery({ ...preparedArgs, url: absoluteUrl }, api, extraOptions); }; export type GetRolloutsQueryArgs = { limit: number; offset: number; sortBy?: string | null; sortOrder?: 'asc' | 'desc'; statusIn?: RolloutStatus[]; rolloutIdContains?: string | null; modeIn?: RolloutMode[]; }; export type GetResourcesQueryArgs = { limit: number; offset: number; sortBy?: string | null; sortOrder?: 'asc' | 'desc'; resourcesIdContains?: string | null; }; export type GetWorkersQueryArgs = { limit: number; offset: number; sortBy?: string | null; sortOrder?: 'asc' | 'desc'; workerIdContains?: string | null; statusIn?: WorkerStatus[]; }; export type GetRolloutAttemptsQueryArgs = { rolloutId: string; limit?: number; offset?: number; sortBy?: string | null; sortOrder?: 'asc' | 'desc'; }; export type GetSpansQueryArgs = { rolloutId: string; attemptId?: string | null; limit?: number; offset?: number; sortBy?: string | null; sortOrder?: 'asc' | 'desc'; traceIdContains?: string | null; spanIdContains?: string | null; parentIdContains?: string | null; nameContains?: string | null; filterLogic?: 'and' | 'or' | null; }; export const rolloutsApi = createApi({ reducerPath: 'rolloutsApi', baseQuery: dynamicBaseQuery, tagTypes: ['Rollout', 'Span', 'Resources', 'Worker'], endpoints: (builder) => ({ getResources: builder.query, GetResourcesQueryArgs>({ query: ({ limit, offset, sortBy, sortOrder, resourcesIdContains }) => { const searchParams = new URLSearchParams(); searchParams.set('limit', String(typeof limit === 'number' ? limit : -1)); searchParams.set('offset', String(typeof offset === 'number' ? offset : 0)); if (sortBy) { searchParams.set('sort_by', sortBy); } if (sortOrder) { searchParams.set('sort_order', sortOrder); } if (resourcesIdContains && resourcesIdContains.trim().length > 0) { searchParams.set('resources_id_contains', resourcesIdContains.trim()); } const queryString = searchParams.toString(); const url = queryString.length > 0 ? `v1/agl/resources?${queryString}` : 'v1/agl/resources'; return { url, method: 'GET' }; }, transformResponse: (response: unknown) => normalizePaginatedResponse(response, normalizeResources), providesTags: (result) => result ? [ { type: 'Resources' as const, id: 'LIST' }, ...result.items.map((item) => ({ type: 'Resources' as const, id: item.resourcesId })), ] : [{ type: 'Resources' as const, id: 'LIST' }], }), getWorkers: builder.query, GetWorkersQueryArgs>({ query: ({ limit, offset, sortBy, sortOrder, workerIdContains, statusIn }) => { const searchParams = new URLSearchParams(); searchParams.set('limit', String(typeof limit === 'number' ? limit : -1)); searchParams.set('offset', String(typeof offset === 'number' ? offset : 0)); if (sortBy) { searchParams.set('sort_by', sortBy); } if (sortOrder) { searchParams.set('sort_order', sortOrder); } if (workerIdContains && workerIdContains.trim().length > 0) { searchParams.set('worker_id_contains', workerIdContains.trim()); } if (statusIn && statusIn.length > 0) { statusIn.forEach((status) => searchParams.append('status_in', status)); } const queryString = searchParams.toString(); const url = queryString.length > 0 ? `v1/agl/workers?${queryString}` : 'v1/agl/workers'; return { url, method: 'GET' }; }, transformResponse: (response: unknown) => normalizePaginatedResponse(response, normalizeWorker), providesTags: (result) => result ? [ { type: 'Worker' as const, id: 'LIST' }, ...result.items.map((worker) => ({ type: 'Worker' as const, id: worker.workerId })), ] : [{ type: 'Worker' as const, id: 'LIST' }], }), getRollouts: builder.query, GetRolloutsQueryArgs>({ query: ({ limit, offset, sortBy, sortOrder, statusIn, rolloutIdContains, modeIn }) => { const searchParams = new URLSearchParams(); searchParams.set('limit', String(typeof limit === 'number' ? limit : -1)); searchParams.set('offset', String(typeof offset === 'number' ? offset : 0)); if (sortBy) { searchParams.set('sort_by', sortBy); } if (sortOrder) { searchParams.set('sort_order', sortOrder); } if (statusIn && statusIn.length > 0) { statusIn.forEach((status) => searchParams.append('status_in', status)); } if (modeIn && modeIn.length > 0) { modeIn.forEach((mode) => searchParams.append('mode_in', mode)); } if (rolloutIdContains && rolloutIdContains.trim().length > 0) { searchParams.set('rollout_id_contains', rolloutIdContains.trim()); } const queryString = searchParams.toString(); const url = queryString.length > 0 ? `v1/agl/rollouts?${queryString}` : 'v1/agl/rollouts'; return { url, method: 'GET' }; }, transformResponse: (response: unknown) => normalizePaginatedResponse(response, normalizeRollout), providesTags: (result) => result ? [ { type: 'Rollout' as const, id: 'LIST' }, ...result.items.map((rollout) => ({ type: 'Rollout' as const, id: rollout.rolloutId })), ] : [{ type: 'Rollout' as const, id: 'LIST' }], }), getRolloutAttempts: builder.query, GetRolloutAttemptsQueryArgs>({ query: ({ rolloutId, limit = -1, offset = 0, sortBy, sortOrder }) => { const searchParams = new URLSearchParams(); searchParams.set('limit', String(typeof limit === 'number' ? limit : -1)); searchParams.set('offset', String(typeof offset === 'number' ? offset : 0)); if (sortBy) { searchParams.set('sort_by', sortBy); } if (sortOrder) { searchParams.set('sort_order', sortOrder); } const queryString = searchParams.toString(); const url = queryString.length > 0 ? `v1/agl/rollouts/${rolloutId}/attempts?${queryString}` : `v1/agl/rollouts/${rolloutId}/attempts`; return { url, method: 'GET' }; }, transformResponse: (response: unknown) => normalizePaginatedResponse(response, normalizeAttemptStrict), providesTags: (_result, _error, queryArgs) => [{ type: 'Rollout', id: queryArgs.rolloutId }], }), getSpans: builder.query, GetSpansQueryArgs>({ query: (args) => { if (!args.rolloutId) { throw new Error('rolloutId is required to fetch spans'); } const searchParams = new URLSearchParams({ rollout_id: args.rolloutId }); if (args.attemptId) { searchParams.set('attempt_id', args.attemptId); } if (typeof args.limit === 'number') { searchParams.set('limit', String(args.limit)); } if (typeof args.offset === 'number') { searchParams.set('offset', String(args.offset)); } if (args.sortBy) { searchParams.set('sort_by', args.sortBy); } if (args.sortOrder) { searchParams.set('sort_order', args.sortOrder); } if (args.traceIdContains) { searchParams.set('trace_id_contains', args.traceIdContains); } if (args.spanIdContains) { searchParams.set('span_id_contains', args.spanIdContains); } if (args.parentIdContains) { searchParams.set('parent_id_contains', args.parentIdContains); } if (args.nameContains) { searchParams.set('name_contains', args.nameContains); } if (args.filterLogic) { searchParams.set('filter_logic', args.filterLogic); } return { url: `v1/agl/spans?${searchParams.toString()}`, method: 'GET' }; }, transformResponse: (response: unknown) => normalizePaginatedResponse(response, normalizeSpan), providesTags: (_result, _error, args) => args ? [ { type: 'Span' as const, id: `${args.rolloutId}:${args.attemptId ?? 'latest'}` }, { type: 'Span' as const, id: 'LIST' }, ] : [{ type: 'Span' as const, id: 'LIST' }], }), }), }); export const { useGetResourcesQuery, useGetWorkersQuery, useGetRolloutsQuery, useGetRolloutAttemptsQuery, useGetSpansQuery, } = rolloutsApi; ================================================ FILE: dashboard/src/features/rollouts/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './api'; export * from './slice'; export * from './selectors'; export * from '../../types'; ================================================ FILE: dashboard/src/features/rollouts/rollouts.test.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createServerBackedStore } from '@test-utils'; import { describe, expect, it } from 'vitest'; import { rolloutsApi } from './api'; import { selectRolloutsQueryArgs } from './selectors'; import { resetRolloutsFilters, setRolloutsModeFilters, setRolloutsPage, setRolloutsRecordsPerPage, setRolloutsSearchTerm, setRolloutsSort, setRolloutsStatusFilters, } from './slice'; describe('rollouts feature integration', () => { it('builds default query arguments from the UI state', () => { const store = createServerBackedStore(); const queryArgs = selectRolloutsQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 100, offset: 0, sortBy: 'start_time', sortOrder: 'desc', rolloutIdContains: undefined, statusIn: undefined, modeIn: undefined, }); }); it('retrieves rollouts from the Python LightningStore server', async () => { const store = createServerBackedStore(); const queryArgs = selectRolloutsQueryArgs(store.getState()); const subscription = store.dispatch(rolloutsApi.endpoints.getRollouts.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.total).toBe(6); expect(data.items).toHaveLength(6); const rolloutIds = data.items.map((rollout) => rollout.rolloutId); expect(rolloutIds).toEqual( expect.arrayContaining(['ro-story-001', 'ro-story-002', 'ro-story-003', 'ro-story-004', 'ro-story-005']), ); const startTimes = data.items.map((rollout) => rollout.startTime); const sortedStartTimes = [...startTimes].sort((a, b) => b - a); expect(startTimes).toEqual(sortedStartTimes); expect(data.items[0].rolloutId).toBe('ro-story-005'); expect(data.items[0].status).toBeDefined(); }); it('includes attempts directly on rollout payloads when they exist', async () => { const store = createServerBackedStore(); const queryArgs = selectRolloutsQueryArgs(store.getState()); const subscription = store.dispatch(rolloutsApi.endpoints.getRollouts.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); const rolloutWithAttempt = data.items.find((rollout) => rollout.rolloutId === 'ro-story-002'); expect(rolloutWithAttempt).toBeDefined(); expect(rolloutWithAttempt?.attempt).not.toBeNull(); expect(rolloutWithAttempt?.attempt?.attemptId).toBe('at-story-022'); const rolloutWithoutAttempt = data.items.find((rollout) => rollout.rolloutId === 'ro-story-004'); expect(rolloutWithoutAttempt).toBeDefined(); expect(rolloutWithoutAttempt?.attempt).toBeNull(); }); it('retrieves attempts for a rollout from the Python server', async () => { const store = createServerBackedStore(); const subscription = store.dispatch( rolloutsApi.endpoints.getRolloutAttempts.initiate({ rolloutId: 'ro-story-002' }), ); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.total).toBe(2); expect(data.items.map((attempt) => attempt.attemptId)).toEqual(['at-story-021', 'at-story-022']); }); it('paginates rollouts with custom UI state', async () => { const store = createServerBackedStore(); store.dispatch(setRolloutsRecordsPerPage(2)); store.dispatch(setRolloutsPage(2)); const queryArgs = selectRolloutsQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 2, offset: 2 }); const subscription = store.dispatch(rolloutsApi.endpoints.getRollouts.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(2); expect(data.items.map((rollout) => rollout.rolloutId)).toEqual(['ro-story-004', 'ro-story-002']); }); it('filters and sorts rollouts based on UI selections', async () => { const store = createServerBackedStore(); store.dispatch(resetRolloutsFilters()); store.dispatch(setRolloutsStatusFilters(['succeeded'])); store.dispatch(setRolloutsModeFilters(['val'])); store.dispatch(setRolloutsSearchTerm('ro-story-002')); store.dispatch(setRolloutsSort({ column: 'rolloutId', direction: 'asc' })); const queryArgs = selectRolloutsQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ statusIn: ['succeeded'], modeIn: ['val'], rolloutIdContains: 'ro-story-002', sortBy: 'rollout_id', sortOrder: 'asc', }); const subscription = store.dispatch(rolloutsApi.endpoints.getRollouts.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(1); expect(data.items[0].rolloutId).toBe('ro-story-002'); expect(data.items[0].status).toBe('succeeded'); }); }); ================================================ FILE: dashboard/src/features/rollouts/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSelector } from '@reduxjs/toolkit'; import type { RootState } from '@/store'; import type { RolloutMode, RolloutStatus } from '@/types'; import type { RolloutsSortState } from './slice'; const ROLLOUTS_SORT_FIELD_MAP: Record = { rolloutId: 'rollout_id', attemptId: 'attempt_id', statusValue: 'status', resourcesId: 'resources_id', mode: 'mode', startTimestamp: 'start_time', durationSeconds: 'duration', lastHeartbeatTimestamp: 'last_heartbeat_time', workerId: 'worker_id', }; const resolveRolloutsSortField = (sort: RolloutsSortState): string => ROLLOUTS_SORT_FIELD_MAP[sort.column] ?? 'start_time'; export const selectRolloutsUiState = (state: RootState) => state.rollouts; export const selectRolloutsSearchTerm = (state: RootState) => state.rollouts.searchTerm; export const selectRolloutsStatusFilters = (state: RootState) => state.rollouts.statusFilters; export const selectRolloutsModeFilters = (state: RootState) => state.rollouts.modeFilters; export const selectRolloutsPage = (state: RootState) => state.rollouts.page; export const selectRolloutsRecordsPerPage = (state: RootState) => state.rollouts.recordsPerPage; export const selectRolloutsSort = (state: RootState) => state.rollouts.sort; export const selectRolloutsQueryArgs = createSelector( [ selectRolloutsSearchTerm, selectRolloutsStatusFilters, selectRolloutsModeFilters, selectRolloutsPage, selectRolloutsRecordsPerPage, selectRolloutsSort, ], ( searchTerm: string, statusFilters: RolloutStatus[], modeFilters: RolloutMode[], page: number, recordsPerPage: number, sort: RolloutsSortState, ) => { const normalizedSearch = searchTerm.trim(); const limit = Math.max(1, recordsPerPage); const offset = Math.max(0, (page - 1) * limit); const sortBy = resolveRolloutsSortField(sort); return { limit, offset, sortBy, sortOrder: sort.direction, statusIn: statusFilters.length > 0 ? statusFilters : undefined, rolloutIdContains: normalizedSearch.length > 0 ? normalizedSearch : undefined, modeIn: modeFilters.length > 0 ? modeFilters : undefined, }; }, ); ================================================ FILE: dashboard/src/features/rollouts/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import type { RolloutMode, RolloutStatus } from '../../types'; export type SortDirection = 'asc' | 'desc'; export type RolloutsSortState = { column: string; direction: SortDirection; }; export type RolloutsUiState = { searchTerm: string; statusFilters: RolloutStatus[]; modeFilters: RolloutMode[]; page: number; recordsPerPage: number; sort: RolloutsSortState; }; export const initialRolloutsUiState: RolloutsUiState = { searchTerm: '', statusFilters: [], modeFilters: [], page: 1, recordsPerPage: 100, sort: { column: 'startTimestamp', direction: 'desc', }, }; const rolloutsSlice = createSlice({ name: 'rollouts', initialState: initialRolloutsUiState, reducers: { setRolloutsSearchTerm(state, action: PayloadAction) { state.searchTerm = action.payload; state.page = 1; }, setRolloutsStatusFilters(state, action: PayloadAction) { state.statusFilters = action.payload; state.page = 1; }, setRolloutsModeFilters(state, action: PayloadAction) { state.modeFilters = action.payload; state.page = 1; }, setRolloutsPage(state, action: PayloadAction) { state.page = action.payload; }, setRolloutsRecordsPerPage(state, action: PayloadAction) { state.recordsPerPage = action.payload; state.page = 1; }, setRolloutsSort(state, action: PayloadAction) { state.sort = action.payload; }, resetRolloutsFilters(state) { state.statusFilters = initialRolloutsUiState.statusFilters; state.modeFilters = initialRolloutsUiState.modeFilters; state.searchTerm = initialRolloutsUiState.searchTerm; state.page = initialRolloutsUiState.page; state.sort = initialRolloutsUiState.sort; }, }, }); export const { setRolloutsSearchTerm, setRolloutsStatusFilters, setRolloutsModeFilters, setRolloutsPage, setRolloutsRecordsPerPage, setRolloutsSort, resetRolloutsFilters, } = rolloutsSlice.actions; export const rolloutsReducer = rolloutsSlice.reducer; ================================================ FILE: dashboard/src/features/traces/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; ================================================ FILE: dashboard/src/features/traces/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSelector } from '@reduxjs/toolkit'; import type { GetSpansQueryArgs } from '@/features/rollouts'; import type { RootState } from '@/store'; import type { TracesSortState } from './slice'; export const selectTracesState = (state: RootState) => state.traces; export const selectTracesRolloutId = (state: RootState) => selectTracesState(state).rolloutId; export const selectTracesAttemptId = (state: RootState) => selectTracesState(state).attemptId; export const selectTracesSearchTerm = (state: RootState) => selectTracesState(state).searchTerm; export const selectTracesPage = (state: RootState) => selectTracesState(state).page; export const selectTracesRecordsPerPage = (state: RootState) => selectTracesState(state).recordsPerPage; export const selectTracesSort = (state: RootState) => selectTracesState(state).sort; export const selectTracesViewMode = (state: RootState) => selectTracesState(state).viewMode; const TRACES_SORT_FIELD_MAP: Record = { name: 'name', sequenceId: 'sequence_id', traceId: 'trace_id', spanId: 'span_id', parentId: 'parent_id', statusCode: 'status_code', startTime: 'start_time', duration: 'duration', }; const resolveTracesSortField = (sort: TracesSortState): string => TRACES_SORT_FIELD_MAP[sort.column] ?? 'start_time'; export const selectTracesQueryArgs = createSelector( [ selectTracesRolloutId, selectTracesAttemptId, selectTracesSearchTerm, selectTracesPage, selectTracesRecordsPerPage, selectTracesSort, ], (rolloutId, attemptId, searchTerm, page, recordsPerPage, sort): GetSpansQueryArgs | undefined => { if (!rolloutId) { return undefined; } const limit = Math.max(1, recordsPerPage); const offset = Math.max(0, (page - 1) * limit); const normalizedSearch = searchTerm.trim(); const containsValue = normalizedSearch.length > 0 ? normalizedSearch : undefined; const sortBy = resolveTracesSortField(sort); return { rolloutId, attemptId: attemptId ?? undefined, limit, offset, sortBy, sortOrder: sort.direction, traceIdContains: containsValue, spanIdContains: containsValue, nameContains: containsValue, filterLogic: containsValue ? 'or' : undefined, }; }, ); ================================================ FILE: dashboard/src/features/traces/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; export type SortDirection = 'asc' | 'desc'; export type TracesSortState = { column: string; direction: SortDirection; }; export type TracesViewMode = 'table' | 'waterfall' | 'tree'; export type TracesUiState = { rolloutId: string | null; attemptId: string | null; searchTerm: string; page: number; recordsPerPage: number; sort: TracesSortState; viewMode: TracesViewMode; }; export const initialTracesUiState: TracesUiState = { rolloutId: null, attemptId: null, searchTerm: '', page: 1, recordsPerPage: 100, sort: { column: 'startTime', direction: 'desc', }, viewMode: 'table', }; const tracesSlice = createSlice({ name: 'traces', initialState: initialTracesUiState, reducers: { setTracesRolloutId(state, action: PayloadAction) { state.rolloutId = action.payload; state.page = 1; state.attemptId = null; }, setTracesAttemptId(state, action: PayloadAction) { state.attemptId = action.payload; state.page = 1; }, setTracesSearchTerm(state, action: PayloadAction) { state.searchTerm = action.payload; state.page = 1; }, setTracesPage(state, action: PayloadAction) { state.page = action.payload; }, setTracesRecordsPerPage(state, action: PayloadAction) { state.recordsPerPage = action.payload; state.page = 1; }, setTracesSort(state, action: PayloadAction) { state.sort = action.payload; }, setTracesViewMode(state, action: PayloadAction) { state.viewMode = action.payload; }, resetTracesFilters(state) { state.searchTerm = initialTracesUiState.searchTerm; state.page = initialTracesUiState.page; state.sort = initialTracesUiState.sort; }, hydrateTracesStateFromQuery( state, action: PayloadAction<{ rolloutId?: string | null; attemptId?: string | null }>, ) { const payload = action.payload; if (Object.hasOwn(payload, 'rolloutId')) { const nextRolloutId = payload.rolloutId ?? null; if (state.rolloutId !== nextRolloutId) { state.rolloutId = nextRolloutId; state.page = 1; state.attemptId = null; } else if (nextRolloutId === null) { state.attemptId = null; } } if (Object.hasOwn(payload, 'attemptId')) { if (state.rolloutId === null) { state.attemptId = null; return; } const nextAttemptId = payload.attemptId ?? null; if (state.attemptId !== nextAttemptId) { state.attemptId = nextAttemptId; state.page = 1; } } }, }, }); export const { setTracesRolloutId, setTracesAttemptId, setTracesSearchTerm, setTracesPage, setTracesRecordsPerPage, setTracesSort, setTracesViewMode, resetTracesFilters, hydrateTracesStateFromQuery, } = tracesSlice.actions; export const tracesReducer = tracesSlice.reducer; ================================================ FILE: dashboard/src/features/traces/traces.test.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createServerBackedStore } from '@test-utils'; import { describe, expect, it } from 'vitest'; import { rolloutsApi } from '../rollouts'; import { selectTracesQueryArgs } from './selectors'; import { setTracesPage, setTracesRecordsPerPage, setTracesRolloutId, setTracesSearchTerm } from './slice'; describe('traces feature integration', () => { it('requires a rollout id before building query arguments', () => { const store = createServerBackedStore(); expect(selectTracesQueryArgs(store.getState())).toBeUndefined(); }); it('builds query arguments when targeting a rollout', () => { const store = createServerBackedStore(); store.dispatch(setTracesRolloutId('ro-story-001')); const queryArgs = selectTracesQueryArgs(store.getState()); expect(queryArgs).toBeDefined(); expect(queryArgs).toMatchObject({ rolloutId: 'ro-story-001', limit: 100, offset: 0, sortBy: 'start_time', sortOrder: 'desc', filterLogic: undefined, }); store.dispatch(setTracesSearchTerm('span-00')); const filteredArgs = selectTracesQueryArgs(store.getState()); expect(filteredArgs?.filterLogic).toBe('or'); }); it('fetches spans from the Python LightningStore server', async () => { const store = createServerBackedStore(); store.dispatch(setTracesRolloutId('ro-story-001')); const queryArgs = selectTracesQueryArgs(store.getState()); expect(queryArgs).toBeDefined(); const subscription = store.dispatch(rolloutsApi.endpoints.getSpans.initiate(queryArgs!)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.total).toBe(3); const spanIds = data.items.map((span) => span.spanId).sort(); expect(spanIds).toEqual(['span-001-root', 'span-002-llm', 'span-003-tool']); expect(new Set(data.items.map((span) => span.status.status_code))).toEqual(new Set(['OK'])); }); it('paginates spans based on UI state', async () => { const store = createServerBackedStore(); store.dispatch(setTracesRolloutId('ro-story-001')); store.dispatch(setTracesRecordsPerPage(2)); const firstPageArgs = selectTracesQueryArgs(store.getState()); expect(firstPageArgs).toMatchObject({ limit: 2, offset: 0 }); const firstPageSub = store.dispatch(rolloutsApi.endpoints.getSpans.initiate(firstPageArgs!)); const firstPage = await firstPageSub.unwrap(); firstPageSub.unsubscribe(); expect(firstPage.items.map((span) => span.spanId)).toEqual(['span-003-tool', 'span-002-llm']); store.dispatch(setTracesPage(2)); const secondPageArgs = selectTracesQueryArgs(store.getState()); expect(secondPageArgs).toMatchObject({ limit: 2, offset: 2 }); const secondPageSub = store.dispatch(rolloutsApi.endpoints.getSpans.initiate(secondPageArgs!)); const secondPage = await secondPageSub.unwrap(); secondPageSub.unsubscribe(); expect(secondPage.items.map((span) => span.spanId)).toEqual(['span-001-root']); expect(secondPage.total).toBe(3); }); it('filters spans using the search term', async () => { const store = createServerBackedStore(); store.dispatch(setTracesRolloutId('ro-story-001')); store.dispatch(setTracesSearchTerm('span-003')); const queryArgs = selectTracesQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ traceIdContains: 'span-003', spanIdContains: 'span-003', nameContains: 'span-003', filterLogic: 'or', }); const subscription = store.dispatch(rolloutsApi.endpoints.getSpans.initiate(queryArgs!)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(1); expect(data.items[0].spanId).toBe('span-003-tool'); }); }); ================================================ FILE: dashboard/src/features/ui/alert/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; ================================================ FILE: dashboard/src/features/ui/alert/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSelector } from '@reduxjs/toolkit'; import type { RootState } from '@/store'; import type { AlertsState, AlertTone } from './slice'; const ALERT_PRIORITY: Record = { error: 3, warning: 2, info: 1, }; const selectAlertState = (state: RootState): AlertsState => state.alert; export const selectVisibleAlerts = createSelector(selectAlertState, (state) => state.alerts.filter((alert) => alert.isVisible), ); export const selectHighestPriorityAlert = createSelector(selectVisibleAlerts, (alerts) => { if (alerts.length === 0) { return null; } return alerts .slice() .sort((a, b) => { const priorityDiff = ALERT_PRIORITY[a.tone] - ALERT_PRIORITY[b.tone]; if (priorityDiff !== 0) { return priorityDiff; } return a.createdAt - b.createdAt; }) .at(-1)!; }); ================================================ FILE: dashboard/src/features/ui/alert/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; export type AlertTone = 'info' | 'warning' | 'error'; export type AppAlert = { id: string; message: string; tone: AlertTone; isVisible: boolean; createdAt: number; }; export type AlertsState = { alerts: AppAlert[]; }; const initialState: AlertsState = { alerts: [], }; type ShowAlertPayload = { id: string; message: string; tone?: AlertTone; }; type HideAlertPayload = { id: string; }; const alertsSlice = createSlice({ name: 'alert', initialState, reducers: { showAlert(state, action: PayloadAction) { const { id, message, tone = 'info' } = action.payload; const existing = state.alerts.find((alert) => alert.id === id); if (existing) { existing.message = message; existing.tone = tone; existing.isVisible = true; existing.createdAt = Date.now(); } else { state.alerts.push({ id, message, tone, isVisible: true, createdAt: Date.now(), }); } }, hideAlert(state, action: PayloadAction) { state.alerts = state.alerts.filter((alert) => alert.id !== action.payload.id); }, dismissAlert(state, action: PayloadAction) { const entry = state.alerts.find((alert) => alert.id === action.payload.id); if (entry) { entry.isVisible = false; } }, clearAlerts(state) { state.alerts = []; }, }, }); export const { showAlert, hideAlert, dismissAlert, clearAlerts } = alertsSlice.actions; export const alertReducer = alertsSlice.reducer; ================================================ FILE: dashboard/src/features/ui/drawer/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; ================================================ FILE: dashboard/src/features/ui/drawer/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import type { RootState } from '@/store'; export const selectDrawerState = (state: RootState) => state.drawer; export const selectDrawerIsOpen = (state: RootState) => selectDrawerState(state).isOpen; export const selectDrawerContent = (state: RootState) => selectDrawerState(state).content; ================================================ FILE: dashboard/src/features/ui/drawer/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; import type { Attempt, Rollout, Span, Worker } from '@/types'; export type DrawerType = 'rollout-json' | 'rollout-traces' | 'trace-detail' | 'worker-detail'; export type DrawerContent = | { type: 'rollout-json' | 'rollout-traces'; rollout: Rollout; attempt: Attempt | null; isNested: boolean; } | { type: 'trace-detail'; span: Span; rollout: Rollout | null; attempt: Attempt | null; } | { type: 'worker-detail'; worker: Worker; }; export type DrawerState = { isOpen: boolean; content: DrawerContent | null; }; export const initialDrawerState: DrawerState = { isOpen: false, content: null, }; const drawerSlice = createSlice({ name: 'drawer', initialState: initialDrawerState, reducers: { openDrawer(state, action: PayloadAction) { state.isOpen = true; state.content = action.payload; }, closeDrawer(state) { state.isOpen = false; state.content = null; }, }, }); export const { openDrawer, closeDrawer } = drawerSlice.actions; export const drawerReducer = drawerSlice.reducer; ================================================ FILE: dashboard/src/features/workers/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. export * from './slice'; export * from './selectors'; export { useGetWorkersQuery } from '../rollouts'; ================================================ FILE: dashboard/src/features/workers/selectors.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSelector } from '@reduxjs/toolkit'; import type { GetWorkersQueryArgs } from '@/features/rollouts'; import type { RootState } from '@/store'; import type { WorkersSortState } from './slice'; const WORKERS_SORT_FIELD_MAP: Record = { workerId: 'worker_id', status: 'status', currentRolloutId: 'current_rollout_id', currentAttemptId: 'current_attempt_id', lastHeartbeatTime: 'last_heartbeat_time', lastDequeueTime: 'last_dequeue_time', lastBusyTime: 'last_busy_time', lastIdleTime: 'last_idle_time', }; const resolveWorkersSortField = (sort: WorkersSortState): string => WORKERS_SORT_FIELD_MAP[sort.column] ?? 'last_heartbeat_time'; export const selectWorkersUiState = (state: RootState) => state.workers; export const selectWorkersSearchTerm = (state: RootState) => selectWorkersUiState(state).searchTerm; export const selectWorkersPage = (state: RootState) => selectWorkersUiState(state).page; export const selectWorkersRecordsPerPage = (state: RootState) => selectWorkersUiState(state).recordsPerPage; export const selectWorkersSort = (state: RootState) => selectWorkersUiState(state).sort; export const selectWorkersQueryArgs = createSelector( [selectWorkersSearchTerm, selectWorkersPage, selectWorkersRecordsPerPage, selectWorkersSort], (searchTerm, page, recordsPerPage, sort): GetWorkersQueryArgs => { const normalizedSearch = searchTerm.trim(); const limit = Math.max(1, recordsPerPage); const offset = Math.max(0, (page - 1) * limit); const sortBy = resolveWorkersSortField(sort); return { limit, offset, sortBy, sortOrder: sort.direction, workerIdContains: normalizedSearch.length > 0 ? normalizedSearch : undefined, }; }, ); ================================================ FILE: dashboard/src/features/workers/slice.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createSlice, type PayloadAction } from '@reduxjs/toolkit'; export type SortDirection = 'asc' | 'desc'; export type WorkersSortState = { column: string; direction: SortDirection; }; export type WorkersUiState = { searchTerm: string; page: number; recordsPerPage: number; sort: WorkersSortState; }; export const initialWorkersUiState: WorkersUiState = { searchTerm: '', page: 1, recordsPerPage: 50, sort: { column: 'lastHeartbeatTime', direction: 'desc', }, }; const workersSlice = createSlice({ name: 'workers', initialState: initialWorkersUiState, reducers: { setWorkersSearchTerm(state, action: PayloadAction) { state.searchTerm = action.payload; state.page = 1; }, setWorkersPage(state, action: PayloadAction) { state.page = action.payload; }, setWorkersRecordsPerPage(state, action: PayloadAction) { state.recordsPerPage = action.payload; state.page = 1; }, setWorkersSort(state, action: PayloadAction) { state.sort = action.payload; }, resetWorkersFilters(state) { state.searchTerm = initialWorkersUiState.searchTerm; state.page = initialWorkersUiState.page; state.recordsPerPage = initialWorkersUiState.recordsPerPage; state.sort = initialWorkersUiState.sort; }, }, }); export const { setWorkersSearchTerm, setWorkersPage, setWorkersRecordsPerPage, setWorkersSort, resetWorkersFilters } = workersSlice.actions; export const workersReducer = workersSlice.reducer; ================================================ FILE: dashboard/src/features/workers/workers.test.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { createServerBackedStore } from '@test-utils'; import { describe, expect, it } from 'vitest'; import { rolloutsApi } from '@/features/rollouts'; import type { Worker } from '@/types'; import { selectWorkersQueryArgs } from './selectors'; import { resetWorkersFilters, setWorkersPage, setWorkersRecordsPerPage, setWorkersSearchTerm, setWorkersSort, } from './slice'; const extractWorkerIds = (workers: Worker[]): string[] => workers.map((worker) => worker.workerId); describe('workers feature integration', () => { it('builds default query arguments from the UI state', () => { const store = createServerBackedStore(); const queryArgs = selectWorkersQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 50, offset: 0, sortBy: 'last_heartbeat_time', sortOrder: 'desc', workerIdContains: undefined, }); }); it('fetches workers from the Python LightningStore server', async () => { const store = createServerBackedStore(); const queryArgs = selectWorkersQueryArgs(store.getState()); const subscription = store.dispatch(rolloutsApi.endpoints.getWorkers.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.total).toBeGreaterThanOrEqual(4); expect(data.items).toHaveLength(Math.min(queryArgs.limit, data.total)); const workerIds = extractWorkerIds(data.items); expect(workerIds).toEqual(expect.arrayContaining(['worker-east', 'worker-west'])); const heartbeatTimes = data.items.map((worker) => worker.lastHeartbeatTime ?? 0); const sortedHeartbeatTimes = [...heartbeatTimes].sort((a, b) => b - a); expect(heartbeatTimes).toEqual(sortedHeartbeatTimes); }); it('paginates worker results based on UI state', async () => { const store = createServerBackedStore(); store.dispatch(setWorkersRecordsPerPage(2)); store.dispatch(setWorkersPage(2)); const queryArgs = selectWorkersQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 2, offset: 2 }); const subscription = store.dispatch(rolloutsApi.endpoints.getWorkers.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(2); expect(data.total).toBeGreaterThanOrEqual(4); }); it('applies search and sorting preferences', async () => { const store = createServerBackedStore(); store.dispatch(resetWorkersFilters()); store.dispatch(setWorkersSearchTerm('worker-west')); store.dispatch(setWorkersSort({ column: 'workerId', direction: 'asc' })); const queryArgs = selectWorkersQueryArgs(store.getState()); expect(queryArgs).toMatchObject({ limit: 50, offset: 0, sortBy: 'worker_id', sortOrder: 'asc', workerIdContains: 'worker-west', }); const subscription = store.dispatch(rolloutsApi.endpoints.getWorkers.initiate(queryArgs)); const data = await subscription.unwrap(); subscription.unsubscribe(); expect(data.items).toHaveLength(1); expect(data.items[0].workerId).toBe('worker-west'); }); it('maps current rollout/attempt sorting to backend fields', () => { const store = createServerBackedStore(); store.dispatch(setWorkersSort({ column: 'currentRolloutId', direction: 'desc' })); let queryArgs = selectWorkersQueryArgs(store.getState()); expect(queryArgs.sortBy).toBe('current_rollout_id'); expect(queryArgs.sortOrder).toBe('desc'); store.dispatch(setWorkersSort({ column: 'currentAttemptId', direction: 'asc' })); queryArgs = selectWorkersQueryArgs(store.getState()); expect(queryArgs.sortBy).toBe('current_attempt_id'); expect(queryArgs.sortOrder).toBe('asc'); }); }); ================================================ FILE: dashboard/src/layouts/AppLayout.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { http, HttpResponse } from 'msw'; import { Provider } from 'react-redux'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { Stack, Text } from '@mantine/core'; import { initialConfigState } from '@/features/config/slice'; import type { AlertsState, AlertTone } from '@/features/ui/alert'; import { createAppStore } from '@/store'; import { STORY_BASE_URL, STORY_DATE_NOW_MS } from '../../.storybook/constants'; import { AppLayout, AppLayoutProps } from './AppLayout'; const Placeholder = ({ title, description }: { title: string; description: string }) => ( {title} {description} ); const ROUTES = [ { path: '/', element: , children: [ { path: 'rollouts', element: , }, { path: 'resources', element: , }, { path: 'traces', element: , }, { path: 'runners', element: , }, { path: 'settings', element: ( ), }, ], }, ]; function createAlertState(message: string, tone: AlertTone): AlertsState { return { alerts: [ { id: 'storybook-alert', message, tone, isVisible: true, createdAt: STORY_DATE_NOW_MS, }, ], }; } function renderAppLayout(args: AppLayoutProps, initialEntry = '/rollouts', alertState?: AlertsState) { const store = createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, }, alert: alertState ?? { alerts: [] }, }); const router = createMemoryRouter( ROUTES.map((route) => ({ ...route, element: , })), { initialEntries: [initialEntry] }, ); return ( ); } const meta: Meta = { title: 'Layouts/AppLayout', component: AppLayout, parameters: { layout: 'fullscreen', }, render: (args) => renderAppLayout(args, '/rollouts'), args: { config: { baseUrl: STORY_BASE_URL, autoRefreshMs: 0, }, }, }; export default meta; type Story = StoryObj; export const NoServerConfigured: Story = { args: { config: { baseUrl: '', autoRefreshMs: 0, }, }, }; export const ServerOnline: Story = { parameters: { msw: { handlers: [ http.get(`${STORY_BASE_URL}/v1/agl/health`, () => HttpResponse.json({ status: 'ok' }, { status: 200 })), ], }, }, }; export const ServerOffline: Story = { parameters: { msw: { handlers: [ http.get(`${STORY_BASE_URL}/v1/agl/health`, () => HttpResponse.json({ message: 'unavailable' }, { status: 503 }), ), ], }, }, }; export const ResourcesNavActive: Story = { render: (args) => renderAppLayout(args, '/resources'), }; export const TracesNavActive: Story = { render: (args) => renderAppLayout(args, '/traces'), }; export const SettingsNavActive: Story = { render: (args) => renderAppLayout(args, '/settings'), }; export const PollingEveryFiveSeconds: Story = { args: { config: { baseUrl: STORY_BASE_URL, autoRefreshMs: 5000, }, }, parameters: { msw: { handlers: [ http.get(`${STORY_BASE_URL}/v1/agl/health`, () => HttpResponse.json({ status: 'ok' }, { status: 200 })), ], }, }, }; export const InfoAlertActive: Story = { render: (args) => renderAppLayout(args, '/rollouts', createAlertState('Background synchronization completed successfully.', 'info')), }; export const WarningAlertActive: Story = { render: (args) => renderAppLayout( args, '/rollouts', createAlertState('Rollout data may be stale. Check connectivity before proceeding.', 'warning'), ), }; export const ErrorAlertActive: Story = { render: (args) => renderAppLayout( args, '/rollouts', createAlertState('Unable to reach Agent-lightning API. Retry or adjust server settings.', 'error'), ), }; ================================================ FILE: dashboard/src/layouts/AppLayout.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useEffect, useMemo, useState, type ReactNode } from 'react'; import { IconCpu, IconRouteSquare, IconRun, IconSettings, IconTimeline } from '@tabler/icons-react'; import { Outlet, NavLink as RouterNavLink, useLocation, useNavigate } from 'react-router-dom'; import { AppShell, Badge, Group, Image, NavLink as MantineNavLink, Stack, Text, UnstyledButton } from '@mantine/core'; import { AppAlertBanner } from '@/components/AppAlertBanner'; import { AppDrawerContainer } from '@/components/AppDrawer.component'; import faviconUrl from '../favicon.svg'; import { selectConfig } from '../features/config'; import { useAppSelector } from '../store/hooks'; type ConnectionStatus = 'online' | 'offline' | 'unknown'; type NavItem = { label: string; to: string; icon: ReactNode; }; const NAV_ITEMS: NavItem[] = [ { label: 'Rollouts', to: '/rollouts', icon: }, { label: 'Resources', to: '/resources', icon: }, { label: 'Traces', to: '/traces', icon: }, { label: 'Runners', to: '/runners', icon: }, { label: 'Settings', to: '/settings', icon: }, ]; const CONNECTION_STATUS_META: Record = { offline: { color: 'red', label: 'Offline' }, online: { color: 'teal', label: 'Online' }, unknown: { color: 'gray', label: 'Unknown' }, }; const DEFAULT_AUTO_REFRESH_MS = 30_000; type ConnectionOptions = { baseUrl?: string; autoRefreshMs?: number; }; function getSameOriginUrl() { return window.location.origin; } function buildHealthUrl(baseUrl: string) { if (baseUrl.startsWith('http://') || baseUrl.startsWith('https://')) { const normalized = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`; return new URL('v1/agl/health', normalized).toString(); } const normalizedBase = baseUrl.startsWith('/') ? baseUrl : `/${baseUrl}`; const trimmed = normalizedBase.replace(/\/+$/, ''); return `${trimmed}/v1/agl/health`; } function useServerConnection({ baseUrl, autoRefreshMs }: ConnectionOptions) { const [status, setStatus] = useState('unknown'); const [isRefreshing, setIsRefreshing] = useState(false); useEffect(() => { if (!baseUrl) { setStatus('unknown'); setIsRefreshing(false); return; } let disposed = false; let intervalId: number | undefined; let activeController: AbortController | undefined; const healthUrl = buildHealthUrl(baseUrl); const check = async () => { activeController?.abort(); const controller = new AbortController(); activeController = controller; if (!disposed) { setIsRefreshing(true); } try { const response = await fetch(healthUrl, { signal: controller.signal }); if (!disposed && activeController === controller) { setStatus(response.ok ? 'online' : 'offline'); } } catch (error) { if (disposed || (error instanceof DOMException && error.name === 'AbortError')) { return; } if (!disposed && activeController === controller) { setStatus('offline'); } } finally { if (!disposed && activeController === controller) { setIsRefreshing(false); } } }; check(); // FIXME: autorefresh only refresh server status, not the data if (autoRefreshMs && autoRefreshMs > 0) { intervalId = window.setInterval(check, autoRefreshMs); } return () => { disposed = true; activeController?.abort(); if (intervalId) { window.clearInterval(intervalId); } }; }, [autoRefreshMs, baseUrl]); return { status, isRefreshing }; } function ConnectionIndicator({ baseUrl, status = 'unknown', isRefreshing = false, onClick, }: { baseUrl?: string; status?: ConnectionStatus; isRefreshing?: boolean; onClick?: () => void; }) { const { color, label } = CONNECTION_STATUS_META[status ?? 'unknown']; const connectionTarget = baseUrl && baseUrl.length > 0 ? baseUrl : 'No server configured'; const content = ( Server connection {isRefreshing ? ( Refreshing ) : ( {label} )} {connectionTarget} ); if (!onClick) { return content; } return ( {content} ); } export type AppLayoutProps = { config?: ConnectionOptions; }; export function AppLayout({ config }: AppLayoutProps = {}) { const location = useLocation(); const navigate = useNavigate(); const resolvedBaseUrl = config?.baseUrl ?? getSameOriginUrl() ?? ''; const autoRefreshMs = config?.autoRefreshMs !== undefined ? config.autoRefreshMs : DEFAULT_AUTO_REFRESH_MS; const connectionState = useServerConnection({ baseUrl: resolvedBaseUrl || undefined, autoRefreshMs, }); const navItems = useMemo( () => NAV_ITEMS.map((item) => ({ ...item, active: location.pathname === item.to || location.pathname.startsWith(`${item.to}/`), })), [location.pathname], ); return ( Agent-lightning logo Agent-lightning Dashboard {navItems.map((item) => ( ))} navigate('/settings')} /> ); } export function AppLayoutWithState() { const config = useAppSelector(selectConfig); return ( <> ); } ================================================ FILE: dashboard/src/layouts/helper.ts ================================================ // Copyright (c) Microsoft. All rights reserved. function parseCssNumber(value: string | null | undefined): number { if (!value) { return 0; } const parsed = Number.parseFloat(value); return Number.isFinite(parsed) ? parsed : 0; } function getElementWidth(selectors: string | string[]): number { if (typeof window === 'undefined') { return 0; } const selectorList = Array.isArray(selectors) ? selectors : [selectors]; for (const selector of selectorList) { const element = window.document.querySelector(selector); if (element) { return element.getBoundingClientRect().width || 0; } } return 0; } function getAppShellContentWidth(): number { if (typeof window === 'undefined') { return 0; } const selectors = ['.mantine-AppShell-main', '[data-mantine-component="AppShellMain"]']; return getElementWidth(selectors); } export function getAppShellOffsets(): number { if (typeof window === 'undefined' || !window.document?.documentElement) { return 0; } const rootStyles = window.getComputedStyle(window.document.documentElement); const navbarOffset = parseCssNumber(rootStyles.getPropertyValue('--app-shell-navbar-offset')) || getElementWidth(['.mantine-AppShell-navbar', '[data-mantine-component="AppShellNavbar"]']); const asideOffset = parseCssNumber(rootStyles.getPropertyValue('--app-shell-aside-offset')) || getElementWidth(['.mantine-AppShell-aside', '[data-mantine-component="AppShellAside"]']); const paddingVar = parseCssNumber(rootStyles.getPropertyValue('--app-shell-padding')); let paddingTotal = paddingVar ? paddingVar * 2 : 0; if (paddingTotal === 0) { const selectors = ['.mantine-AppShell-main', '[data-mantine-component="AppShellMain"]']; for (const selector of selectors) { const main = window.document.querySelector(selector); if (!main) { continue; } const mainStyles = window.getComputedStyle(main); const computedPadding = parseCssNumber(mainStyles.paddingLeft) + parseCssNumber(mainStyles.paddingRight); if (computedPadding > 0) { paddingTotal = computedPadding; break; } } } return navbarOffset + asideOffset + paddingTotal; } export function getLayoutAwareWidth(containerWidth: number, viewportWidth: number): number { const appShellContentWidth = getAppShellContentWidth(); const layoutOffsets = getAppShellOffsets(); const viewportAvailable = viewportWidth && viewportWidth > 0 ? Math.max(viewportWidth - layoutOffsets, 0) : undefined; const effectiveAvailable = appShellContentWidth > 0 ? appShellContentWidth : viewportAvailable; if (!containerWidth && effectiveAvailable) { return effectiveAvailable; } if (!effectiveAvailable) { return containerWidth; } return Math.min(containerWidth, effectiveAvailable); } ================================================ FILE: dashboard/src/main.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import ReactDOM from 'react-dom/client'; import { Provider } from 'react-redux'; import App from './App'; import { store } from './store'; ReactDOM.createRoot(document.getElementById('root')!).render( , ); ================================================ FILE: dashboard/src/pages/Resources.page.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { waitFor, within } from '@testing-library/dom'; import userEvent from '@testing-library/user-event'; import { delay, http, HttpResponse } from 'msw'; import { Provider } from 'react-redux'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { AppAlertBanner } from '@/components/AppAlertBanner'; import { AppDrawerContainer } from '@/components/AppDrawer.component'; import { initialConfigState } from '@/features/config/slice'; import { initialResourcesUiState } from '@/features/resources/slice'; import { initialRolloutsUiState } from '@/features/rollouts/slice'; import { AppLayout } from '@/layouts/AppLayout'; import { createAppStore } from '@/store'; import type { Resources } from '@/types'; import { createResourcesHandlers } from '@/utils/mock'; import { STORY_BASE_URL, STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { allModes } from '../../.storybook/modes'; import { ResourcesPage } from './Resources.page'; const meta: Meta = { title: 'Pages/ResourcesPage', component: ResourcesPage, parameters: { layout: 'fullscreen', chromatic: { modes: allModes, }, }, }; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const sampleResources: Resources[] = [ { resourcesId: 'rs-a1b2c3d4e5f6', version: 3, createTime: now - 7 * 24 * 3600, updateTime: now - 3600, resources: { main_llm: { resource_type: 'llm', endpoint: 'https://api.openai.com/v1', model: 'gpt-4', sampling_parameters: { temperature: 0.7, max_tokens: 2048, }, }, backup_llm: { resource_type: 'llm', endpoint: 'https://api.anthropic.com/v1', model: 'claude-3-opus-20240229', sampling_parameters: { temperature: 0.5, max_tokens: 4096, }, }, greeting_template: { resource_type: 'prompt_template', template: 'Hello {name}! Welcome to {service}.', engine: 'f-string', }, }, }, { resourcesId: 'rs-f6e5d4c3b2a1', version: 2, createTime: now - 14 * 24 * 3600, updateTime: now - 2 * 24 * 3600, resources: { production_llm: { resource_type: 'llm', endpoint: 'https://api.openai.com/v1', model: 'gpt-3.5-turbo', sampling_parameters: { temperature: 0.8, max_tokens: 1024, }, }, system_prompt: { resource_type: 'prompt_template', template: 'You are a helpful assistant. {context}', engine: 'f-string', }, }, }, { resourcesId: 'rs-1234567890ab', version: 1, createTime: now - 30 * 24 * 3600, updateTime: now - 15 * 24 * 3600, resources: { legacy_llm: { resource_type: 'llm', endpoint: 'https://api.openai.com/v1', model: 'gpt-3.5-turbo-0301', sampling_parameters: { temperature: 0.9, }, }, }, }, { resourcesId: 'rs-abcdef123456', version: 5, createTime: now - 60 * 24 * 3600, updateTime: now - 12 * 3600, resources: { eval_llm: { resource_type: 'llm', endpoint: 'https://api.anthropic.com/v1', model: 'claude-3-sonnet-20240229', sampling_parameters: { temperature: 0.3, max_tokens: 2048, }, }, judge_template: { resource_type: 'prompt_template', template: 'Evaluate the following response: {response}\n\nCriteria: {criteria}', engine: 'jinja2', }, dataset: { resource_type: 'dataset', path: 's3://my-bucket/eval-data/v1/', format: 'jsonl', }, }, }, { resourcesId: 'rs-999888777666', version: 1, createTime: now - 2 * 24 * 3600, updateTime: now - 2 * 24 * 3600, resources: { test_llm: { resource_type: 'llm', endpoint: 'http://localhost:8080/v1', model: 'local-model', sampling_parameters: { temperature: 1.0, }, }, }, }, ]; const defaultHandlers = createResourcesHandlers(sampleResources); function createStoryStore(configOverrides?: Partial) { return createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, autoRefreshMs: 0, ...configOverrides, }, rollouts: initialRolloutsUiState, resources: initialResourcesUiState, }); } function renderWithStore(configOverrides?: Partial) { const store = createStoryStore(configOverrides); return ( <> ); } function renderWithAppLayout(configOverrides?: Partial) { const store = createStoryStore(configOverrides); const router = createMemoryRouter( [ { path: '/', element: ( ), children: [ { path: '/resources', element: , }, ], }, ], { initialEntries: ['/resources'] }, ); return ( <> ); } export const Default: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, }; export const WithSidebarLayout: Story = { name: 'Within AppLayout', render: () => renderWithAppLayout(), parameters: { msw: { handlers: defaultHandlers, }, }, }; export const Search: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByText('rs-a1b2c3d4e5f6'); const searchInput = canvas.getByPlaceholderText('Search by Resources ID'); await userEvent.type(searchInput, 'rs-abcdef123456'); await waitFor(() => { if (canvas.queryByText('rs-a1b2c3d4e5f6')) { throw new Error('Expected search to filter out non-matching resources'); } if (!canvas.queryByText('rs-abcdef123456')) { throw new Error('Expected matching resource to remain visible'); } }); }, }; export const EmptyState: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [http.get('*/v1/agl/resources', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }))], }, }, }; export const ServerError: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/resources', () => HttpResponse.json({ detail: 'Internal server error' }, { status: 500 })), ], }, }, }; export const RequestTimeout: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/resources', async () => { await delay(1200); return HttpResponse.json({ detail: 'Request timed out' }, { status: 504, statusText: 'Timeout' }); }), ], }, }, }; export const SingleResource: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createResourcesHandlers([sampleResources[0]]), }, }, }; export const ParseFailure: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/resources', () => HttpResponse.text('{ malformed json', { status: 200, headers: { 'Content-Type': 'application/json', }, }), ), ], }, }, }; export const ManyResources: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createResourcesHandlers( Array.from({ length: 50 }, (_, index) => ({ resourcesId: `rs-generated-${index + 1}`.padEnd(17, '0'), version: (index % 5) + 1, createTime: now - (50 - index) * 24 * 3600, updateTime: now - (50 - index) * 3600, resources: { llm: { resource_type: 'llm', endpoint: `https://api.example.com/v${(index % 3) + 1}`, model: index % 2 === 0 ? 'gpt-4' : 'claude-3-opus', sampling_parameters: { temperature: 0.5 + (index % 5) * 0.1, }, }, }, })), ), }, }, }; export const ComplexResources: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createResourcesHandlers([ { resourcesId: 'rs-complex-123456', version: 10, createTime: now - 90 * 24 * 3600, updateTime: now - 600, resources: { primary_llm: { resource_type: 'llm', endpoint: 'https://api.openai.com/v1', model: 'gpt-4-turbo-preview', sampling_parameters: { temperature: 0.7, top_p: 0.95, frequency_penalty: 0.1, presence_penalty: 0.1, max_tokens: 4096, }, }, fallback_llm: { resource_type: 'llm', endpoint: 'https://api.anthropic.com/v1', model: 'claude-3-opus-20240229', sampling_parameters: { temperature: 0.7, max_tokens: 4096, top_k: 40, }, }, embedding_model: { resource_type: 'embedding', endpoint: 'https://api.openai.com/v1', model: 'text-embedding-3-large', dimensions: 1536, }, system_prompt: { resource_type: 'prompt_template', template: 'You are an AI assistant. Context: {context}\nUser: {user_input}\nAssistant:', engine: 'jinja2', variables: ['context', 'user_input'], }, training_dataset: { resource_type: 'dataset', path: 's3://ml-datasets/training/v2/data.jsonl', format: 'jsonl', size_bytes: 1024000000, num_examples: 50000, }, validation_dataset: { resource_type: 'dataset', path: 's3://ml-datasets/validation/v2/data.jsonl', format: 'jsonl', size_bytes: 102400000, num_examples: 5000, }, }, }, ]), }, }, }; export const DarkTheme: Story = { render: () => renderWithStore({ theme: 'dark' }), parameters: { theme: 'dark', msw: { handlers: defaultHandlers, }, }, }; ================================================ FILE: dashboard/src/pages/Resources.page.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect } from 'react'; import { IconSearch } from '@tabler/icons-react'; import type { DataTableSortStatus } from 'mantine-datatable'; import { Skeleton, Stack, TextInput, Title } from '@mantine/core'; import { ResourcesTable, type ResourcesTableRecord } from '@/components/ResourcesTable.component'; import { ResourcesTree } from '@/components/ResourcesTree.component'; import { selectAutoRefreshMs } from '@/features/config'; import { resetResourcesFilters, selectResourcesPage, selectResourcesQueryArgs, selectResourcesRecordsPerPage, selectResourcesSearchTerm, selectResourcesSort, setResourcesPage, setResourcesRecordsPerPage, setResourcesSearchTerm, setResourcesSort, } from '@/features/resources'; import { useGetResourcesQuery } from '@/features/rollouts'; import { hideAlert, showAlert } from '@/features/ui/alert'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import type { PaginatedResponse, Resources } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; export function ResourcesPage() { const dispatch = useAppDispatch(); const autoRefreshMs = useAppSelector(selectAutoRefreshMs); const searchTerm = useAppSelector(selectResourcesSearchTerm); const page = useAppSelector(selectResourcesPage); const recordsPerPage = useAppSelector(selectResourcesRecordsPerPage); const sort = useAppSelector(selectResourcesSort); const queryArgs = useAppSelector(selectResourcesQueryArgs); const resourcesQueryResult = useGetResourcesQuery(queryArgs, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const resourcesData = resourcesQueryResult.data as PaginatedResponse | undefined; const { isLoading, isFetching, isError, error, refetch } = resourcesQueryResult; const handleSearchTermChange = useCallback( (value: string) => { dispatch(setResourcesSearchTerm(value)); }, [dispatch], ); const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { dispatch( setResourcesSort({ column: status.columnAccessor, direction: status.direction, }), ); }, [dispatch], ); const handlePageChange = useCallback( (nextPage: number) => { dispatch(setResourcesPage(nextPage)); }, [dispatch], ); const handleRecordsPerPageChange = useCallback( (value: number) => { dispatch(setResourcesRecordsPerPage(value)); }, [dispatch], ); const handleResetFilters = useCallback(() => { dispatch(resetResourcesFilters()); }, [dispatch]); const showSkeleton = isLoading && !((resourcesData?.items?.length ?? 0) > 0); useEffect(() => { const descriptor = isError ? getErrorDescriptor(error) : null; if (isError) { const detailSuffix = descriptor ? ` (${descriptor})` : ''; dispatch( showAlert({ id: 'resources-fetch', message: `Unable to refresh resources${detailSuffix}. The table may be out of date until the connection recovers.`, tone: 'error', }), ); return; } if (!isLoading && !isFetching) { dispatch(hideAlert({ id: 'resources-fetch' })); } }, [dispatch, error, isError, isFetching, isLoading]); useEffect( () => () => { dispatch(hideAlert({ id: 'resources-fetch' })); }, [dispatch], ); return ( Resources handleSearchTermChange(event.currentTarget.value)} leftSection={} data-testid='resources-search-input' w='100%' style={{ maxWidth: 360 }} /> {showSkeleton ? ( ) : ( } /> )} ); } ================================================ FILE: dashboard/src/pages/Rollouts.page.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { waitFor, within } from '@testing-library/dom'; import userEvent from '@testing-library/user-event'; import { delay, http, HttpResponse } from 'msw'; import { Provider } from 'react-redux'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { AppAlertBanner } from '@/components/AppAlertBanner'; import { AppDrawerContainer } from '@/components/AppDrawer.component'; import { AppLayout } from '@/layouts/AppLayout'; import { createMockHandlers } from '@/utils/mock'; import { STORY_BASE_URL, STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { allModes } from '../../.storybook/modes'; import { initialConfigState } from '../features/config/slice'; import { initialResourcesUiState } from '../features/resources/slice'; import type { Attempt, Rollout, Span } from '../features/rollouts'; import { initialRolloutsUiState, type RolloutsUiState } from '../features/rollouts/slice'; import { createAppStore } from '../store'; import { RolloutsPage } from './Rollouts.page'; const meta: Meta = { title: 'Pages/RolloutsPage', component: RolloutsPage, parameters: { layout: 'fullscreen', chromatic: { modes: allModes, }, }, }; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const sampleRollouts: Rollout[] = [ { rolloutId: 'ro-7fa3b6e2', input: { task: 'Summarize report' }, status: 'running', mode: 'train', resourcesId: 'rs-100', startTime: now - 1200, endTime: null, attempt: { rolloutId: 'ro-7fa3b6e2', attemptId: 'at-9001', sequenceId: 1, status: 'running', startTime: now - 1200, endTime: null, workerId: 'worker-alpha', lastHeartbeatTime: now - 30, metadata: { lastHeartbeatAt: now - 30 }, }, config: { retries: 0 }, metadata: { owner: 'alice' }, }, { rolloutId: 'ro-116eab45', input: { task: 'Classify dataset' }, status: 'succeeded', mode: 'val', resourcesId: 'rs-101', startTime: now - 5400, endTime: now - 3600, attempt: { rolloutId: 'ro-116eab45', attemptId: 'at-9002', sequenceId: 2, status: 'succeeded', startTime: now - 4000, endTime: now - 3600, workerId: 'worker-beta', lastHeartbeatTime: now - 3600, metadata: { lastHeartbeatAt: now - 3600 }, }, config: { retries: 1 }, metadata: { owner: 'bob' }, }, { rolloutId: 'ro-9ae77c11', input: { task: 'Evaluate prompt variations' }, status: 'failed', mode: 'test', resourcesId: 'rs-102', startTime: now - 9600, endTime: now - 8400, attempt: { rolloutId: 'ro-9ae77c11', attemptId: 'at-9005', sequenceId: 3, status: 'failed', startTime: now - 8800, endTime: now - 8400, workerId: 'worker-gamma', lastHeartbeatTime: now - 8400, metadata: { lastHeartbeatAt: now - 8400 }, }, config: { retries: 2 }, metadata: { owner: 'carol' }, }, ]; const attemptsByRollout: Record = { 'ro-7fa3b6e2': [ { rolloutId: 'ro-7fa3b6e2', attemptId: 'at-9001', sequenceId: 1, status: 'running', startTime: now - 1200, endTime: null, workerId: 'worker-alpha', lastHeartbeatTime: now - 30, metadata: { lastHeartbeatAt: now - 30 }, }, ], 'ro-116eab45': [ { rolloutId: 'ro-116eab45', attemptId: 'at-9000', sequenceId: 1, status: 'failed', startTime: now - 5400, endTime: now - 5000, workerId: 'worker-beta', lastHeartbeatTime: now - 5000, metadata: { lastHeartbeatAt: now - 5000 }, }, { rolloutId: 'ro-116eab45', attemptId: 'at-9002', sequenceId: 2, status: 'succeeded', startTime: now - 4000, endTime: now - 3600, workerId: 'worker-beta', lastHeartbeatTime: now - 3600, metadata: { lastHeartbeatAt: now - 3600 }, }, ], 'ro-9ae77c11': [ { rolloutId: 'ro-9ae77c11', attemptId: 'at-9003', sequenceId: 1, status: 'preparing', startTime: now - 9600, endTime: now - 9300, workerId: 'worker-gamma', lastHeartbeatTime: now - 9300, metadata: { lastHeartbeatAt: now - 9300 }, }, { rolloutId: 'ro-9ae77c11', attemptId: 'at-9004', sequenceId: 2, status: 'running', startTime: now - 9200, endTime: now - 8800, workerId: 'worker-delta', lastHeartbeatTime: now - 8800, metadata: { lastHeartbeatAt: now - 8800 }, }, { rolloutId: 'ro-9ae77c11', attemptId: 'at-9005', sequenceId: 3, status: 'failed', startTime: now - 8800, endTime: now - 8400, workerId: 'worker-gamma', lastHeartbeatTime: now - 8400, metadata: { lastHeartbeatAt: now - 8400 }, }, ], }; const sampleSpansByAttempt: Record = { 'ro-7fa3b6e2:at-9001': [ { rolloutId: 'ro-7fa3b6e2', attemptId: 'at-9001', sequenceId: 1, traceId: 'tr-7fa3b6e2-1', spanId: 'sp-7fa3b6e2-setup', parentId: null, name: 'Initialize rollout', status: { status_code: 'OK', description: null }, attributes: { step: 'init', duration_ms: 120 }, startTime: now - 1100, endTime: now - 1000, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-7fa3b6e2', attemptId: 'at-9001', sequenceId: 2, traceId: 'tr-7fa3b6e2-1', spanId: 'sp-7fa3b6e2-run', parentId: 'sp-7fa3b6e2-setup', name: 'Execute task', status: { status_code: 'OK', description: null }, attributes: { step: 'run', duration_ms: 450 }, startTime: now - 950, endTime: now - 500, events: [], links: [], context: {}, parent: null, resource: {}, }, ], 'ro-116eab45:at-9002': [ { rolloutId: 'ro-116eab45', attemptId: 'at-9002', sequenceId: 1, traceId: 'tr-116eab45-1', spanId: 'sp-116eab45-validate', parentId: null, name: 'Validate input', status: { status_code: 'OK', description: null }, attributes: { step: 'validate', duration_ms: 80 }, startTime: now - 3800, endTime: now - 3720, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-116eab45', attemptId: 'at-9002', sequenceId: 2, traceId: 'tr-116eab45-1', spanId: 'sp-116eab45-execute', parentId: 'sp-116eab45-validate', name: 'Execute workflow', status: { status_code: 'OK', description: null }, attributes: { step: 'execute', duration_ms: 260 }, startTime: now - 3700, endTime: now - 3440, events: [], links: [], context: {}, parent: null, resource: {}, }, ], 'ro-9ae77c11:at-9005': [ { rolloutId: 'ro-9ae77c11', attemptId: 'at-9005', sequenceId: 1, traceId: 'tr-9ae77c11-1', spanId: 'sp-9ae77c11-fetch', parentId: null, name: 'Fetch resources', status: { status_code: 'OK', description: null }, attributes: { step: 'fetch', duration_ms: 200 }, startTime: now - 8700, endTime: now - 8500, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-9ae77c11', attemptId: 'at-9005', sequenceId: 2, traceId: 'tr-9ae77c11-1', spanId: 'sp-9ae77c11-run', parentId: 'sp-9ae77c11-fetch', name: 'Run evaluation', status: { status_code: 'ERROR', description: 'Worker timeout' }, attributes: { step: 'evaluate', duration_ms: 600 }, startTime: now - 8450, endTime: now - 7850, events: [], links: [], context: {}, parent: null, resource: {}, }, ], }; const overflowDrawerSpans: Span[] = Array.from({ length: 160 }, (_, index) => ({ rolloutId: 'ro-7fa3b6e2', attemptId: 'at-9001', sequenceId: index + 1, traceId: `tr-overflow-${Math.floor(index / 5)}`, spanId: `sp-overflow-${index + 1}`, parentId: index === 0 ? null : `sp-overflow-${index}`, name: `Overflow span ${index + 1}`, status: { status_code: 'OK', description: null }, attributes: { step: `overflow-${index + 1}`, duration_ms: 20 + (index % 5) }, startTime: now - 1_200 - index * 20, endTime: now - 1_180 - index * 20, events: [], links: [], context: {}, parent: null, resource: {}, })); const overflowSpansByAttempt: Record = { ...sampleSpansByAttempt, 'ro-7fa3b6e2:at-9001': overflowDrawerSpans, }; const longJsonLogs = Array.from({ length: 200 }, (_, index) => ({ id: index + 1, detail: `Log entry ${index + 1} ${'x'.repeat(32)}`, timestamp: now - index * 2, })); const jsonOverflowAttempt: Attempt = { rolloutId: 'ro-json-overflow', attemptId: 'at-json-overflow', sequenceId: 1, status: 'succeeded', startTime: now - 600, endTime: now - 300, workerId: 'worker-scroll', lastHeartbeatTime: now - 300, metadata: { notes: 'Completed with a very large JSON payload' }, }; const jsonOverflowAttemptEndTime = jsonOverflowAttempt.endTime ?? jsonOverflowAttempt.startTime + 1; const jsonOverflowRollout: Rollout = { rolloutId: 'ro-json-overflow', input: { task: 'Render large JSON', payload: longJsonLogs, summary: 'This rollout includes many log lines to test scroll behavior.', }, status: 'succeeded', mode: 'train', resourcesId: 'rs-json-overflow', startTime: jsonOverflowAttempt.startTime, endTime: jsonOverflowAttemptEndTime, attempt: jsonOverflowAttempt, config: { retries: 0, parameters: { max_steps: 200, batch: 5 }, }, metadata: { owner: 'scroll-tester', description: 'Synthetic rollout with oversized JSON payload for storybook validation.', tags: Array.from({ length: 40 }, (_, index) => `tag-${index + 1}`), }, }; const jsonOverflowSpans: Span[] = [ { rolloutId: jsonOverflowRollout.rolloutId, attemptId: jsonOverflowAttempt.attemptId, sequenceId: 1, traceId: 'tr-json-overflow', spanId: 'sp-json-root', parentId: null, name: 'json-overflow-root', status: { status_code: 'OK', description: null }, attributes: { detail: 'root span' }, startTime: jsonOverflowAttempt.startTime, endTime: jsonOverflowAttemptEndTime, events: [], links: [], context: {}, parent: null, resource: {}, }, ]; const jsonOverflowRollouts = [jsonOverflowRollout, ...sampleRollouts]; const jsonOverflowAttemptsByRollout: Record = { ...attemptsByRollout, [jsonOverflowRollout.rolloutId]: [jsonOverflowAttempt], }; const jsonOverflowSpansByAttempt: Record = { ...sampleSpansByAttempt, [`${jsonOverflowRollout.rolloutId}:${jsonOverflowAttempt.attemptId}`]: jsonOverflowSpans, }; const longDurationRollouts: Rollout[] = [ { rolloutId: 'ro-long-duration', input: { task: 'Long running training' }, status: 'running', mode: 'train', resourcesId: 'rs-200', startTime: now - 7 * 24 * 3600, endTime: null, attempt: { rolloutId: 'ro-long-duration', attemptId: 'at-long-001', sequenceId: 1, status: 'running', startTime: now - 7 * 24 * 3600, endTime: null, workerId: 'worker-long', lastHeartbeatTime: now - 45, metadata: null, }, config: { retries: 0 }, metadata: { owner: 'delta' }, }, ]; const longDurationAttempts: Record = { 'ro-long-duration': [ { rolloutId: 'ro-long-duration', attemptId: 'at-long-001', sequenceId: 1, status: 'running', startTime: now - 7 * 24 * 3600, endTime: null, workerId: 'worker-long', lastHeartbeatTime: now - 45, metadata: null, }, ], }; const staleHeartbeatRollouts: Rollout[] = [ { rolloutId: 'ro-stale-heartbeat', input: { task: 'Investigate stale worker' }, status: 'running', mode: 'test', resourcesId: 'rs-201', startTime: now - 6 * 3600, endTime: null, attempt: { rolloutId: 'ro-stale-heartbeat', attemptId: 'at-stale-001', sequenceId: 1, status: 'running', startTime: now - 6 * 3600, endTime: null, workerId: 'worker-stale', lastHeartbeatTime: now - 3 * 24 * 3600, metadata: null, }, config: { retries: 0 }, metadata: { owner: 'echo' }, }, ]; const staleHeartbeatAttempts: Record = { 'ro-stale-heartbeat': [ { rolloutId: 'ro-stale-heartbeat', attemptId: 'at-stale-001', sequenceId: 1, status: 'running', startTime: now - 6 * 3600, endTime: null, workerId: 'worker-stale', lastHeartbeatTime: now - 3 * 24 * 3600, metadata: null, }, ], }; const statusMismatchRollouts: Rollout[] = [ { rolloutId: 'ro-status-mismatch', input: { task: 'Edge case validation' }, status: 'running', mode: 'val', resourcesId: null, startTime: now - 3600, endTime: now - 1800, attempt: { rolloutId: 'ro-status-mismatch', attemptId: 'at-mismatch-003', sequenceId: 3, status: 'failed', startTime: now - 4200, endTime: now - 1800, workerId: 'worker-mismatch', lastHeartbeatTime: now - 1700, metadata: null, }, config: { retries: 3 }, metadata: { owner: 'foxtrot' }, }, ]; const statusMismatchAttempts: Record = { 'ro-status-mismatch': [ { rolloutId: 'ro-status-mismatch', attemptId: 'at-mismatch-001', sequenceId: 1, status: 'preparing', startTime: now - 5400, endTime: now - 5000, workerId: 'worker-mismatch', lastHeartbeatTime: now - 5000, metadata: null, }, { rolloutId: 'ro-status-mismatch', attemptId: 'at-mismatch-002', sequenceId: 2, status: 'running', startTime: now - 5000, endTime: now - 4200, workerId: 'worker-mismatch', lastHeartbeatTime: now - 4000, metadata: null, }, { rolloutId: 'ro-status-mismatch', attemptId: 'at-mismatch-003', sequenceId: 3, status: 'failed', startTime: now - 4200, endTime: now - 1800, workerId: 'worker-mismatch', lastHeartbeatTime: now - 1700, metadata: null, }, ], }; const veryLongInput = `{"prompt":"${'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(12)}"}`; const longInputRollouts: Rollout[] = [ { rolloutId: 'ro-long-input', input: veryLongInput, status: 'queuing', mode: 'test', resourcesId: 'rs-300', startTime: now - 120, endTime: null, attempt: null, config: { retries: 0 }, metadata: { owner: 'golf' }, }, ]; const longInputAttempts: Record = { 'ro-long-input': [], }; const paginationRollouts: Rollout[] = Array.from({ length: 120 }, (_item, index) => { const startOffset = index * 90; const rolloutId = `ro-page-${index + 1}`; return { rolloutId, input: { item: index + 1 }, status: index % 3 === 0 ? 'running' : index % 3 === 1 ? 'failed' : 'succeeded', mode: index % 2 === 0 ? 'train' : 'test', resourcesId: index % 5 === 0 ? `rs-${100 + index}` : null, startTime: now - startOffset - 300, endTime: index % 3 === 0 ? null : now - startOffset, attempt: { rolloutId, attemptId: `at-page-${index + 1}`, sequenceId: 1, status: index % 3 === 0 ? 'running' : index % 3 === 1 ? 'failed' : 'succeeded', startTime: now - startOffset - 300, endTime: index % 3 === 0 ? null : now - startOffset, workerId: `worker-${(index % 7) + 1}`, lastHeartbeatTime: index % 3 === 0 ? now - startOffset - 60 : now - startOffset, metadata: null, }, config: {}, metadata: null, }; }); const paginationAttempts: Record = Object.fromEntries( paginationRollouts.map((rollout) => [rollout.rolloutId, rollout.attempt ? [rollout.attempt] : []]), ); const autoExpandRollouts: Rollout[] = [ { rolloutId: 'ro-auto-expand', input: { task: 'Auto expand test' }, status: 'running', mode: 'train', resourcesId: 'rs-400', startTime: now - 3600, endTime: null, attempt: { rolloutId: 'ro-auto-expand', attemptId: 'at-expand-003', sequenceId: 3, status: 'running', startTime: now - 3600, endTime: null, workerId: 'worker-auto', lastHeartbeatTime: now - 30, metadata: null, }, config: {}, metadata: null, }, ]; const autoExpandAttempts: Record = { 'ro-auto-expand': [ { rolloutId: 'ro-auto-expand', attemptId: 'at-expand-001', sequenceId: 1, status: 'preparing', startTime: now - 5400, endTime: now - 5000, workerId: 'worker-auto', lastHeartbeatTime: now - 5000, metadata: null, }, { rolloutId: 'ro-auto-expand', attemptId: 'at-expand-002', sequenceId: 2, status: 'failed', startTime: now - 5000, endTime: now - 4200, workerId: 'worker-auto', lastHeartbeatTime: now - 4200, metadata: null, }, { rolloutId: 'ro-auto-expand', attemptId: 'at-expand-003', sequenceId: 3, status: 'running', startTime: now - 3600, endTime: null, workerId: 'worker-auto', lastHeartbeatTime: now - 30, metadata: null, }, ], }; function createStoryStore( uiOverrides?: Partial, configOverrides?: Partial, ) { return createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, autoRefreshMs: 0, ...configOverrides, }, rollouts: { ...initialRolloutsUiState, ...uiOverrides, }, resources: initialResourcesUiState, }); } function renderWithStore(uiOverrides?: Partial, configOverrides?: Partial) { const store = createStoryStore(uiOverrides, configOverrides); return ( <> ); } function renderWithAppLayout( uiOverrides?: Partial, configOverrides?: Partial, ) { const store = createStoryStore(uiOverrides, configOverrides); const router = createMemoryRouter( [ { path: '/', element: ( ), children: [ { path: '/rollouts', element: , }, ], }, ], { initialEntries: ['/rollouts'] }, ); return ( <> ); } const defaultHandlers = createMockHandlers(sampleRollouts, attemptsByRollout, sampleSpansByAttempt); const overflowHandlers = createMockHandlers(sampleRollouts, attemptsByRollout, overflowSpansByAttempt); const jsonOverflowHandlers = createMockHandlers( jsonOverflowRollouts, jsonOverflowAttemptsByRollout, jsonOverflowSpansByAttempt, ); export const Default: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, }; export const WithSidebarLayout: Story = { name: 'Within AppLayout', render: () => renderWithAppLayout(), parameters: { msw: { handlers: defaultHandlers, }, }, }; export const WithSidebarStatusFilter: Story = { name: 'Within AppLayout (Status Filter)', render: () => renderWithAppLayout({ statusFilters: ['running'] }), parameters: { msw: { handlers: defaultHandlers, }, }, play: async () => { await waitFor(() => { const container = document.querySelector('[data-testid="rollouts-table-container"]'); const main = document.querySelector('.mantine-AppShell-main'); if (!container || !main) { throw new Error('Unable to locate rollout table container or AppShell main region'); } const containerRect = container.getBoundingClientRect(); const mainRect = main.getBoundingClientRect(); if (containerRect.right > mainRect.right + 1) { throw new Error('Rollouts table extends beyond the AppShell content area'); } }); }, }; export const DarkTheme: Story = { render: () => renderWithStore(undefined, { theme: 'dark' }), parameters: { theme: 'dark', msw: { handlers: defaultHandlers, }, }, }; export const EmptyState: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/rollouts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 })), http.get('*/v1/agl/rollouts/:rolloutId/attempts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }), ), ], }, }, }; export const ServerError: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/rollouts', () => HttpResponse.json({ detail: 'Internal error' }, { status: 500 })), http.get('*/v1/agl/rollouts/:rolloutId/attempts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }, { status: 200 }), ), ], }, }, }; export const Loading: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: [ http.get('*/v1/agl/rollouts', async () => { await delay('infinite'); return HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }); }), http.get('*/v1/agl/rollouts/:rolloutId/attempts', async () => { await delay('infinite'); return HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }); }), ], }, }, }; export const LongDuration: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createMockHandlers(longDurationRollouts, longDurationAttempts, {}), }, }, }; export const StaleHeartbeat: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createMockHandlers(staleHeartbeatRollouts, staleHeartbeatAttempts, {}), }, }, }; export const StatusMismatch: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createMockHandlers(statusMismatchRollouts, statusMismatchAttempts, {}), }, }, }; export const LongInput: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createMockHandlers(longInputRollouts, longInputAttempts, {}), }, }, }; export const Pagination: Story = { render: () => renderWithStore({ recordsPerPage: 20 }), parameters: { msw: { handlers: createMockHandlers(paginationRollouts, paginationAttempts, {}), }, }, }; export const AutoExpandedAttempt: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createMockHandlers(autoExpandRollouts, autoExpandAttempts, {}), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByText('ro-auto-expand'); const rolloutCell = canvas.getByText('ro-auto-expand'); const rolloutRow = rolloutCell.closest('tr'); if (!rolloutRow) { throw new Error('Unable to locate the rollout row for expansion'); } await userEvent.click(rolloutRow); await waitFor( async () => { await canvas.findByText('at-expand-001'); }, { timeout: 3_000 }, ); }, }; export const Search: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByText('ro-7fa3b6e2'); const searchInput = canvas.getByPlaceholderText('Search by Rollout ID'); await userEvent.type(searchInput, 'ro-116eab45'); await waitFor(() => { if (canvas.queryByText('ro-7fa3b6e2')) { throw new Error('Expected search to filter out non-matching rollouts'); } if (!canvas.queryByText('ro-116eab45')) { throw new Error('Expected search to keep the matching rollout visible'); } }); }, }; async function openSampleTracesDrawer(canvasElement: HTMLElement) { const canvas = within(canvasElement); await canvas.findByText('ro-7fa3b6e2'); const rolloutCell = canvas.getByText('ro-7fa3b6e2'); const rolloutRow = rolloutCell.closest('tr'); if (!rolloutRow) { throw new Error('Unable to locate rollout row for traces drawer'); } const rowScope = within(rolloutRow); const traceButtons = rowScope.getAllByRole('button', { name: 'View traces' }); const tracesButton = traceButtons[0]; await userEvent.click(tracesButton); return within(document.body).findByRole('dialog'); } async function openRawJsonDrawer(canvasElement: HTMLElement, rolloutId = 'ro-7fa3b6e2') { const canvas = within(canvasElement); await canvas.findByText(rolloutId); const rolloutCell = canvas.getByText(rolloutId); const rolloutRow = rolloutCell.closest('tr'); if (!rolloutRow) { throw new Error(`Unable to locate rollout row for ${rolloutId}`); } const rowScope = within(rolloutRow); const rawButtons = rowScope.getAllByRole('button', { name: 'View raw JSON' }); const rawButton = rawButtons[0]; await userEvent.click(rawButton); return within(document.body).findByRole('dialog'); } export const RawJsonDrawer: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const drawer = await openRawJsonDrawer(canvasElement); await waitFor( async () => { await within(drawer).findByText('Attempt'); await within(drawer).findByText(/worker-alpha/); }, { timeout: 3_000 }, ); }, }; export const RawJsonDrawerScrollable: Story = { name: 'Raw JSON Drawer Scrollable', render: () => renderWithStore(), parameters: { msw: { handlers: jsonOverflowHandlers, }, }, play: async ({ canvasElement }) => { const drawer = await openRawJsonDrawer(canvasElement, 'ro-json-overflow'); const editorContainer = drawer.querySelector('[data-testid="json-editor-container"]') as HTMLElement | null; if (!editorContainer) { throw new Error('Unable to locate JSON editor container'); } await waitFor(() => { const scrollable = editorContainer.querySelector('.monaco-scrollable-element') as HTMLElement | null; if (!scrollable) { throw new Error('Monaco editor not ready yet'); } if (scrollable.scrollHeight <= scrollable.clientHeight) { throw new Error('Expected JSON content to overflow and allow scrolling'); } }); }, }; export const TracesDrawer: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { await openSampleTracesDrawer(canvasElement); }, }; export const TracesDrawerLink: Story = { name: 'Traces Drawer Link', render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const drawer = await openSampleTracesDrawer(canvasElement); const link = await within(drawer).findByText('View full traces'); const href = link.getAttribute('href'); if (!href) { throw new Error('Expected traces drawer to render a link to the traces page'); } if (!href.includes('rolloutId=ro-7fa3b6e2')) { throw new Error(`Link href ${href} is missing rolloutId query parameter`); } if (!href.includes('attemptId=at-9001')) { throw new Error(`Link href ${href} is missing attemptId query parameter`); } }, }; export const TracesDrawerScrollableTable: Story = { name: 'Traces Drawer Scrollable Table', render: () => renderWithStore(), parameters: { msw: { handlers: overflowHandlers, }, }, play: async ({ canvasElement }) => { const drawer = await openSampleTracesDrawer(canvasElement); const container = drawer.querySelector('[data-testid="traces-drawer-table-container"]') as HTMLElement | null; if (!container) { throw new Error('Unable to locate traces table container inside drawer'); } const overflowStyle = window.getComputedStyle(container).overflowY; if (overflowStyle !== 'auto' && overflowStyle !== 'scroll') { throw new Error('Expected traces table container to allow vertical scrolling'); } await waitFor(() => { if (container.scrollHeight <= container.clientHeight) { throw new Error('Expected traces table content to overflow and enable scrolling'); } }); }, }; ================================================ FILE: dashboard/src/pages/Rollouts.page.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect } from 'react'; import { IconSearch } from '@tabler/icons-react'; import type { DataTableColumn, DataTableSortStatus } from 'mantine-datatable'; import { Skeleton, Stack, TextInput, Title } from '@mantine/core'; import { RolloutAttemptsTable, RolloutTable, type RolloutTableRecord } from '@/components/RolloutTable.component'; import { selectAutoRefreshMs } from '@/features/config'; import { resetRolloutsFilters, selectRolloutsModeFilters, selectRolloutsPage, selectRolloutsQueryArgs, selectRolloutsRecordsPerPage, selectRolloutsSearchTerm, selectRolloutsSort, selectRolloutsStatusFilters, setRolloutsModeFilters, setRolloutsPage, setRolloutsRecordsPerPage, setRolloutsSearchTerm, setRolloutsSort, setRolloutsStatusFilters, useGetRolloutAttemptsQuery, useGetRolloutsQuery, type Rollout, type RolloutMode, type RolloutStatus, } from '@/features/rollouts'; import { hideAlert, showAlert } from '@/features/ui/alert'; import { openDrawer } from '@/features/ui/drawer'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; function RolloutAttemptsContent({ rollout, columns, }: { rollout: Rollout; columns: DataTableColumn[]; }) { const { data, isFetching, isError, refetch } = useGetRolloutAttemptsQuery({ rolloutId: rollout.rolloutId, limit: 100, sortBy: 'sequence_id', sortOrder: 'desc', }); return ( ); } function toRolloutFromRecord(record: RolloutTableRecord): Rollout { const { rolloutId, input, startTime, endTime, mode, resourcesId, status, config, metadata, attempt } = record; return { rolloutId, input, startTime, endTime, mode, resourcesId, status, config, metadata, attempt: attempt ?? null, }; } export function RolloutsPage() { const dispatch = useAppDispatch(); const autoRefreshMs = useAppSelector(selectAutoRefreshMs); const searchTerm = useAppSelector(selectRolloutsSearchTerm); const statusFilters = useAppSelector(selectRolloutsStatusFilters); const modeFilters = useAppSelector(selectRolloutsModeFilters); const page = useAppSelector(selectRolloutsPage); const recordsPerPage = useAppSelector(selectRolloutsRecordsPerPage); const sort = useAppSelector(selectRolloutsSort); const rolloutsQueryArgs = useAppSelector(selectRolloutsQueryArgs); const { data: rolloutsData, isLoading, isFetching, isError, error, refetch, } = useGetRolloutsQuery(rolloutsQueryArgs, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const handleSearchTermChange = useCallback( (value: string) => { dispatch(setRolloutsSearchTerm(value)); }, [dispatch], ); const handleStatusFilterChange = useCallback( (values: RolloutStatus[]) => { dispatch(setRolloutsStatusFilters(values)); }, [dispatch], ); const handleStatusFilterReset = useCallback(() => { dispatch(setRolloutsStatusFilters([])); }, [dispatch]); const handleModeFilterChange = useCallback( (values: RolloutMode[]) => { dispatch(setRolloutsModeFilters(values)); }, [dispatch], ); const handleModeFilterReset = useCallback(() => { dispatch(setRolloutsModeFilters([])); }, [dispatch]); const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { dispatch( setRolloutsSort({ column: status.columnAccessor as string, direction: status.direction, }), ); }, [dispatch], ); const handlePageChange = useCallback( (nextPage: number) => { dispatch(setRolloutsPage(nextPage)); }, [dispatch], ); const handleRecordsPerPageChange = useCallback( (value: number) => { dispatch(setRolloutsRecordsPerPage(value)); }, [dispatch], ); const handleResetFilters = useCallback(() => { dispatch(resetRolloutsFilters()); }, [dispatch]); const handleViewRawJson = useCallback( (record: RolloutTableRecord) => { dispatch( openDrawer({ type: 'rollout-json', rollout: toRolloutFromRecord(record), attempt: record.attempt ?? null, isNested: record.isNested, }), ); }, [dispatch], ); const handleViewTraces = useCallback( (record: RolloutTableRecord) => { dispatch( openDrawer({ type: 'rollout-traces', rollout: toRolloutFromRecord(record), attempt: record.attempt ?? null, isNested: record.isNested, }), ); }, [dispatch], ); const hasRollouts = Array.isArray(rolloutsData?.items) && rolloutsData.items.length > 0; const showSkeleton = isLoading && !hasRollouts; useEffect(() => { if (isError) { dispatch( showAlert({ id: 'rollouts-fetch', message: 'Unable to refresh rollouts. The list below may be out of date until the connection recovers.', tone: 'error', }), ); return; } if (!isLoading && !isFetching) { dispatch(hideAlert({ id: 'rollouts-fetch' })); } }, [dispatch, isError, isFetching, isLoading]); useEffect( () => () => { dispatch(hideAlert({ id: 'rollouts-fetch' })); }, [dispatch], ); return ( Rollouts handleSearchTermChange(event.currentTarget.value)} leftSection={} data-testid='rollouts-search-input' w='100%' style={{ maxWidth: 360 }} /> {showSkeleton ? ( ) : ( } /> )} ); } ================================================ FILE: dashboard/src/pages/Settings.page.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { Provider } from 'react-redux'; import { initialConfigState } from '@/features/config/slice'; import { createAppStore } from '@/store'; import type { ConfigState } from '@/types'; import { STORY_BASE_URL } from '../../.storybook/constants'; import { SettingsPage } from './Settings.page'; const meta: Meta = { title: 'Pages/SettingsPage', component: SettingsPage, parameters: { layout: 'centered', }, }; export default meta; type Story = StoryObj; function renderWithConfig(partial?: Partial) { const store = createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, ...partial, }, }); return ( ); } export const Default: Story = { render: () => renderWithConfig(), }; export const AutoRefreshEveryMinute: Story = { render: () => renderWithConfig({ autoRefreshMs: 60_000 }), }; export const DarkThemeSelected: Story = { render: () => renderWithConfig({ theme: 'dark' }), parameters: { theme: 'dark', }, }; export const CustomBackendUrl: Story = { render: () => renderWithConfig({ baseUrl: 'https://api.agent-lightning.dev' }), }; ================================================ FILE: dashboard/src/pages/Settings.page.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useEffect, useState } from 'react'; import { Divider, Select, Stack, Text, TextInput, Title } from '@mantine/core'; import { selectConfig } from '../features/config'; import { setAutoRefreshMs, setBaseUrl, setTheme } from '../features/config/slice'; import { useAppDispatch, useAppSelector } from '../store/hooks'; const AUTO_REFRESH_OPTIONS = [ { label: 'Off', value: '0' }, // TODO: Support real auto-refresh { label: 'Every 5 seconds', value: '5000', disabled: true }, { label: 'Every 15 seconds', value: '15000', disabled: true }, { label: 'Every 60 seconds', value: '60000', disabled: true }, { label: 'Every 5 minutes', value: '300000', disabled: true }, ]; const THEME_OPTIONS = [ { label: 'System default', value: 'system' }, { label: 'Light', value: 'light' }, { label: 'Dark', value: 'dark' }, ]; export function SettingsPage() { const dispatch = useAppDispatch(); const config = useAppSelector(selectConfig); const [baseUrlInput, setBaseUrlInput] = useState(config.baseUrl); useEffect(() => { setBaseUrlInput(config.baseUrl); }, [config.baseUrl]); return ( Settings Backend base URL The dashboard uses this address for health checks and API calls. setBaseUrlInput(event.currentTarget.value)} onBlur={() => dispatch(setBaseUrl(baseUrlInput.trim()))} data-testid='settings-base-url' /> Auto-refresh interval Controls how often the dashboard polls the server. { if (!value) { return; } dispatch(setTheme(value as typeof config.theme)); }} data-testid='settings-theme' /> ); } ================================================ FILE: dashboard/src/pages/Traces.page.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { waitFor, within } from '@testing-library/dom'; import userEvent from '@testing-library/user-event'; import { delay, http, HttpResponse } from 'msw'; import { Provider } from 'react-redux'; import { createMemoryRouter, MemoryRouter, RouterProvider } from 'react-router-dom'; import { AppAlertBanner } from '@/components/AppAlertBanner'; import { AppDrawerContainer } from '@/components/AppDrawer.component'; import { AppLayout } from '@/layouts/AppLayout'; import { createMockHandlers } from '@/utils/mock'; import { STORY_BASE_URL, STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { allModes } from '../../.storybook/modes'; import { initialConfigState } from '../features/config/slice'; import { initialResourcesUiState } from '../features/resources/slice'; import { initialRolloutsUiState } from '../features/rollouts/slice'; import { initialTracesUiState, type TracesUiState } from '../features/traces/slice'; import { createAppStore } from '../store'; import type { Attempt, Rollout, Span } from '../types'; import { TracesPage } from './Traces.page'; const meta: Meta = { title: 'Pages/TracesPage', component: TracesPage, parameters: { layout: 'fullscreen', chromatic: { modes: allModes, }, }, }; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const sampleRollouts: Rollout[] = [ { rolloutId: 'ro-traces-001', input: { task: 'Generate onboarding flow' }, status: 'running', mode: 'train', resourcesId: 'rs-traces-001', startTime: now - 1800, endTime: null, attempt: { rolloutId: 'ro-traces-001', attemptId: 'at-traces-001', sequenceId: 1, status: 'running', startTime: now - 1800, endTime: null, workerId: 'worker-delta', lastHeartbeatTime: now - 30, metadata: { region: 'us-east-1' }, }, config: { retries: 0 }, metadata: { owner: 'ava' }, }, { rolloutId: 'ro-traces-002', input: { task: 'Classify support emails' }, status: 'succeeded', mode: 'val', resourcesId: 'rs-traces-002', startTime: now - 5400, endTime: now - 3600, attempt: { rolloutId: 'ro-traces-002', attemptId: 'at-traces-004', sequenceId: 4, status: 'succeeded', startTime: now - 4000, endTime: now - 3600, workerId: 'worker-epsilon', lastHeartbeatTime: now - 3600, metadata: { region: 'us-west-2' }, }, config: { retries: 2 }, metadata: { owner: 'ben' }, }, ]; const attemptsByRollout: Record = { 'ro-traces-001': [ { rolloutId: 'ro-traces-001', attemptId: 'at-traces-001', sequenceId: 1, status: 'running', startTime: now - 1800, endTime: null, workerId: 'worker-delta', lastHeartbeatTime: now - 30, metadata: { region: 'us-east-1' }, }, { rolloutId: 'ro-traces-001', attemptId: 'at-traces-002', sequenceId: 2, status: 'failed', startTime: now - 5400, endTime: now - 4800, workerId: 'worker-theta', lastHeartbeatTime: now - 4800, metadata: { error: 'Network timeout' }, }, ], 'ro-traces-002': [ { rolloutId: 'ro-traces-002', attemptId: 'at-traces-004', sequenceId: 4, status: 'succeeded', startTime: now - 4000, endTime: now - 3600, workerId: 'worker-epsilon', lastHeartbeatTime: now - 3600, metadata: { region: 'us-west-2' }, }, ], }; const spansByAttempt: Record = { 'ro-traces-001:at-traces-001': [ { rolloutId: 'ro-traces-001', attemptId: 'at-traces-001', sequenceId: 1, traceId: 'tr-001', spanId: 'sp-001', parentId: null, name: 'Initialize rollout', status: { status_code: 'OK', description: null }, attributes: { stage: 'init', duration_ms: 120 }, startTime: now - 1600, endTime: now - 1580, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-traces-001', attemptId: 'at-traces-001', sequenceId: 2, traceId: 'tr-001', spanId: 'sp-002', parentId: 'sp-001', name: 'Fetch resources', status: { status_code: 'OK', description: null }, attributes: { endpoint: '/resources/latest', duration_ms: 240 }, startTime: now - 1580, endTime: now - 1540, events: [], links: [], context: {}, parent: null, resource: {}, }, ], 'ro-traces-001:at-traces-002': [ { rolloutId: 'ro-traces-001', attemptId: 'at-traces-002', sequenceId: 1, traceId: 'tr-002', spanId: 'sp-101', parentId: null, name: 'Initialize rollout', status: { status_code: 'ERROR', description: 'Timeout' }, attributes: { stage: 'init', duration_ms: 600 }, startTime: now - 5300, endTime: now - 4700, events: [], links: [], context: {}, parent: null, resource: {}, }, ], 'ro-traces-002:at-traces-004': [ { rolloutId: 'ro-traces-002', attemptId: 'at-traces-004', sequenceId: 1, traceId: 'tr-200', spanId: 'sp-201', parentId: null, name: 'Load dataset', status: { status_code: 'OK', description: null }, attributes: { records: 1200, duration_ms: 420 }, startTime: now - 3800, endTime: now - 3720, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-traces-002', attemptId: 'at-traces-004', sequenceId: 2, traceId: 'tr-200', spanId: 'sp-202', parentId: 'sp-201', name: 'Classify batch', status: { status_code: 'OK', description: null }, attributes: { batch: 1, duration_ms: 320 }, startTime: now - 3720, endTime: now - 3660, events: [], links: [], context: {}, parent: null, resource: {}, }, ], }; const emptyAttemptsByRollout: Record = {}; const emptySpansByAttempt: Record = {}; const singleRollout = sampleRollouts[1]; const singleRollouts: Rollout[] = [singleRollout]; const singleAttemptsByRollout: Record = { [singleRollout.rolloutId]: attemptsByRollout[singleRollout.rolloutId] ?? [], }; const singleSpansByAttempt = Object.fromEntries( Object.entries(spansByAttempt).filter(([key]) => key.startsWith(`${singleRollout.rolloutId}:`)), ) as Record; const rolloutWithoutAttempt: Rollout = { rolloutId: 'ro-traces-no-attempt', input: { task: 'Legacy rollout without attempts' }, status: 'failed', mode: 'train', resourcesId: 'rs-traces-no-attempt', startTime: now - 7200, endTime: now - 7000, attempt: null, config: { retries: 0 }, metadata: { owner: 'casey' }, }; const noAttemptRollouts: Rollout[] = [rolloutWithoutAttempt]; const noAttemptAttemptsByRollout: Record = { [rolloutWithoutAttempt.rolloutId]: [], }; const noAttemptSpansByAttempt: Record = {}; const owners = ['ava', 'ben', 'carla', 'diego'] as const; function createSyntheticRollouts(prefix: string, count: number) { const attemptsByRollout: Record = {}; const spansByAttemptByRollout: Record = {}; const rollouts: Rollout[] = Array.from({ length: count }, (_, index) => { const rolloutId = `ro-${prefix}-${String(index + 1).padStart(3, '0')}`; const statusOptions = ['running', 'succeeded', 'failed'] as const; const modeOptions = ['train', 'val', 'test'] as const; const status = statusOptions[index % statusOptions.length]; const mode = modeOptions[index % modeOptions.length]; const startTime = now - (index + 1) * 420; const endTime = status === 'running' ? null : startTime + 240; const attemptId = `${rolloutId}-attempt`; const attemptStatus: Attempt['status'] = status === 'failed' ? 'failed' : status === 'succeeded' ? 'succeeded' : 'running'; const attempt: Attempt = { rolloutId, attemptId, sequenceId: 1, status: attemptStatus, startTime, endTime, workerId: `worker-${String.fromCharCode(97 + (index % 26))}`, lastHeartbeatTime: endTime ?? startTime + 180, metadata: { region: index % 2 === 0 ? 'us-east-1' : 'eu-west-1' }, }; attemptsByRollout[rolloutId] = [attempt]; spansByAttemptByRollout[`${rolloutId}:${attemptId}`] = [ { rolloutId, attemptId, sequenceId: 1, traceId: `tr-${prefix}-${index + 1}`, spanId: `sp-${prefix}-${index + 1}-root`, parentId: null, name: `Synthetic root span ${prefix} ${index + 1}`, status: { status_code: status === 'failed' ? 'ERROR' : 'OK', description: status === 'failed' ? 'Synthetic failure' : null, }, attributes: { 'trace.sample': index + 1, 'duration_ms': 240, }, startTime, endTime: endTime ?? startTime + 240, events: [], links: [], context: {}, parent: null, resource: {}, }, ]; return { rolloutId, input: { task: `Synthetic trace ${index + 1}` }, status, mode, resourcesId: `rs-${prefix}-${(index % 7) + 1}`, startTime, endTime, attempt, config: { retries: index % 3 }, metadata: { owner: owners[index % owners.length] }, }; }); return { rollouts, attemptsByRollout, spansByAttempt: spansByAttemptByRollout }; } const { rollouts: manyRollouts, attemptsByRollout: manyAttemptsByRollout, spansByAttempt: manySpansByAttempt, } = createSyntheticRollouts('many', 24); const { rollouts: vastRollouts, attemptsByRollout: vastAttemptsByRollout, spansByAttempt: vastSpansByAttempt, } = createSyntheticRollouts('vast', 160); function createHandlers(delayMs?: number) { return createMockHandlers(sampleRollouts, attemptsByRollout, spansByAttempt, delayMs); } function createRequestTimeoutHandlers() { return [ http.get('*/v1/agl/rollouts', async () => { await delay(1200); return HttpResponse.json({ detail: 'Request timed out' }, { status: 504, statusText: 'Timeout' }); }), http.get('*/v1/agl/rollouts/:rolloutId/attempts', async ({ params }) => { await delay(1200); return HttpResponse.json( { detail: 'Request timed out', rolloutId: params.rolloutId }, { status: 504, statusText: 'Timeout' }, ); }), http.get('*/v1/agl/spans', async () => { await delay(1200); return HttpResponse.json({ detail: 'Request timed out' }, { status: 504, statusText: 'Timeout' }); }), ]; } const rolloutsAndAttemptsHandlers = createMockHandlers(sampleRollouts, attemptsByRollout); function createStoryStore( preloadedTracesState?: Partial, configOverrides?: Partial, ) { return createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, ...configOverrides, }, rollouts: initialRolloutsUiState, resources: initialResourcesUiState, traces: { ...initialTracesUiState, ...preloadedTracesState }, }); } function renderTracesPage( preloadedTracesState?: Partial, configOverrides?: Partial, ) { const store = createStoryStore(preloadedTracesState, configOverrides); return ( ); } function renderTracesPageWithAppLayout( preloadedTracesState?: Partial, configOverrides?: Partial, initialEntry: string = '/traces', ) { const store = createStoryStore(preloadedTracesState, configOverrides); const router = createMemoryRouter( [ { path: '/', element: ( ), children: [ { path: '/traces', element: , }, ], }, ], { initialEntries: [initialEntry] }, ); return ( <> ); } export const DefaultView: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createHandlers(), }, }, }; export const WithSidebarLayout: Story = { name: 'Within AppLayout', render: () => renderTracesPageWithAppLayout(), parameters: { msw: { handlers: createHandlers(), }, }, }; export const QueryParams: Story = { name: 'Loads From Query Params', render: () => renderTracesPageWithAppLayout(undefined, undefined, '/traces?rolloutId=ro-traces-002&attemptId=at-traces-004'), parameters: { msw: { handlers: createHandlers(), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); const rolloutInput = (await canvas.findByLabelText('Select rollout')) as HTMLInputElement; await waitFor(() => { if (rolloutInput.value !== 'ro-traces-002') { throw new Error('Expected rollout select to use value from query string'); } }); const attemptInput = (await canvas.findByLabelText('Select attempt')) as HTMLInputElement; await waitFor(() => { if (attemptInput.value.indexOf('at-traces-004') === -1) { throw new Error('Expected attempt select to use value from query string'); } }); }, }; export const MissingRolloutQuery: Story = { name: 'Missing Rollout From Query Params', render: () => renderTracesPageWithAppLayout(undefined, undefined, '/traces?rolloutId=ro-missing-999'), parameters: { msw: { handlers: createMockHandlers(manyRollouts, manyAttemptsByRollout, manySpansByAttempt), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); const rolloutInput = (await canvas.findByLabelText('Select rollout')) as HTMLInputElement; await waitFor(() => { if (rolloutInput.value !== '') { throw new Error('Expected rollout select to remain empty when the query rollout does not exist'); } }); await waitFor(() => { if (!canvas.getByText('Select a rollout and attempt to view traces.')) { throw new Error('Expected empty selection message when rollout query param is invalid'); } }); }, }; export const DarkTheme: Story = { render: () => renderTracesPage(undefined, { theme: 'dark' }), parameters: { theme: 'dark', msw: { handlers: createHandlers(), }, }, }; export const EmptyState: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createMockHandlers([], emptyAttemptsByRollout, emptySpansByAttempt), }, }, }; export const SingleResult: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createMockHandlers(singleRollouts, singleAttemptsByRollout, singleSpansByAttempt), }, }, }; export const NoAttemptPlaceholder: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createMockHandlers(noAttemptRollouts, noAttemptAttemptsByRollout, noAttemptSpansByAttempt), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); const attemptInput = (await canvas.findByLabelText('Select attempt')) as HTMLInputElement; await waitFor(() => { if (attemptInput.placeholder !== 'No Attempt') { throw new Error('Expected attempt select placeholder to read "No Attempt" when no attempts are available'); } }); }, }; export const ManyResults: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createMockHandlers(manyRollouts, manyAttemptsByRollout, manySpansByAttempt), }, }, }; export const LargeDatasetSearch: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createMockHandlers(vastRollouts, vastAttemptsByRollout, vastSpansByAttempt), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); const rolloutTrigger = (await canvas.findByLabelText('Select rollout')) as HTMLInputElement; await userEvent.click(rolloutTrigger); for (let i = 0; i < 'ro-vast-001'.length + 1; i++) { await userEvent.type(rolloutTrigger, '{backspace}'); } await userEvent.type(rolloutTrigger, 'ro-vast-150'); await waitFor(() => { const option = within(document.body).queryByText('ro-vast-150'); if (!option) { throw new Error('Expected remote rollout search to return IDs beyond the initial list'); } }); const option = within(document.body).getByText('ro-vast-150'); await userEvent.click(option); await waitFor(() => { if (rolloutTrigger.value !== 'ro-vast-150') { throw new Error('Expected rollout select to use the searched rollout ID'); } }); await canvas.findByText('Synthetic root span vast 150'); }, }; export const Search: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createHandlers(), }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByLabelText('Search spans'); const searchInput = canvas.getByLabelText('Search spans'); await userEvent.type(searchInput, 'Fetch'); await waitFor(() => { if (!canvas.queryByText('Fetch resources')) { throw new Error('Expected matching span to be displayed after searching'); } if (canvas.queryByText('Initialize rollout')) { throw new Error('Expected non-matching spans to be filtered out'); } }); }, }; export const LoadingState: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createHandlers(800), }, }, }; export const RequestTimeout: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: createRequestTimeoutHandlers(), }, }, }; export const AttemptScoped: Story = { render: () => renderTracesPage({ attemptId: 'at-traces-002', rolloutId: 'ro-traces-001', }), parameters: { msw: { handlers: createHandlers(), }, }, }; export const ServerError: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: [ http.get('*/v1/agl/rollouts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }, { status: 200 }), ), http.get('*/v1/agl/rollouts/:rolloutId/attempts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }, { status: 200 }), ), http.get('*/v1/agl/spans', () => HttpResponse.json({ detail: 'server error' }, { status: 500 })), ], }, }, }; export const RolloutParseFailure: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: [ http.get('*/v1/agl/rollouts', () => HttpResponse.text('not valid json', { status: 200, headers: { 'Content-Type': 'application/json', }, }), ), http.get('*/v1/agl/rollouts/:rolloutId/attempts', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 }), ), http.get('*/v1/agl/spans', () => HttpResponse.json({ items: [], limit: 0, offset: 0, total: 0 })), ], }, }, }; export const ParseFailure: Story = { render: () => renderTracesPage(), parameters: { msw: { handlers: [ ...rolloutsAndAttemptsHandlers, http.get('*/v1/agl/spans', () => HttpResponse.text('not valid json', { status: 200, headers: { 'Content-Type': 'application/json', }, }), ), ], }, }, }; ================================================ FILE: dashboard/src/pages/Traces.page.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect, useMemo, useState } from 'react'; import { skipToken } from '@reduxjs/toolkit/query'; import { IconCheck, IconChevronDown, IconSearch } from '@tabler/icons-react'; import type { DataTableSortStatus } from 'mantine-datatable'; import { useSearchParams } from 'react-router-dom'; import { Button, Group, Menu, Select, Skeleton, Stack, TextInput, Title } from '@mantine/core'; import { useDebouncedValue } from '@mantine/hooks'; import { TracesTable, type TracesTableRecord } from '@/components/TracesTable.component'; import { selectAutoRefreshMs } from '@/features/config'; import { useGetRolloutAttemptsQuery, useGetRolloutsQuery, useGetSpansQuery, type GetRolloutsQueryArgs, } from '@/features/rollouts'; import { hydrateTracesStateFromQuery, resetTracesFilters, selectTracesAttemptId, selectTracesPage, selectTracesQueryArgs, selectTracesRecordsPerPage, selectTracesRolloutId, selectTracesSearchTerm, selectTracesSort, selectTracesViewMode, setTracesAttemptId, setTracesPage, setTracesRecordsPerPage, setTracesRolloutId, setTracesSearchTerm, setTracesSort, setTracesViewMode, } from '@/features/traces'; import { hideAlert, showAlert } from '@/features/ui/alert'; import { openDrawer } from '@/features/ui/drawer'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import type { Attempt, Rollout, Span } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; import { formatStatusLabel } from '@/utils/format'; const VIEW_OPTIONS = [ { value: 'table', label: 'Table View', disabled: false }, { value: 'waterfall', label: 'Waterfall View (Coming Soon)', disabled: true }, { value: 'tree', label: 'Tree View (Coming Soon)', disabled: true }, ] as const; type ViewOptionValue = (typeof VIEW_OPTIONS)[number]['value']; function getLatestAttempt(attempts: Attempt[]): Attempt | null { if (!attempts.length) { return null; } return [...attempts].sort((a, b) => a.sequenceId - b.sequenceId).at(-1) ?? null; } function mergeRolloutCache(cache: Record, items: Rollout[]): Record { if (!items.length) { return cache; } let changed = false; const next = { ...cache }; for (const item of items) { const existing = next[item.rolloutId]; if (!existing || existing !== item) { next[item.rolloutId] = item; changed = true; } } return changed ? next : cache; } export function TracesPage() { const dispatch = useAppDispatch(); const autoRefreshMs = useAppSelector(selectAutoRefreshMs); const [searchParams, setSearchParams] = useSearchParams(); const searchParamsKey = searchParams.toString(); const [hydratedSearchParamsKey, setHydratedSearchParamsKey] = useState(null); const [rolloutSearchValue, setRolloutSearchValue] = useState(''); const [debouncedRolloutSearchValue] = useDebouncedValue(rolloutSearchValue, 300); const normalizedRolloutSearchValue = debouncedRolloutSearchValue.trim(); const rolloutSearchActive = normalizedRolloutSearchValue.length > 0; const [rolloutLookup, setRolloutLookup] = useState>({}); const hasRolloutQueryParam = searchParams.has('rolloutId'); const hasAttemptQueryParam = searchParams.has('attemptId'); const [initialHasRolloutQueryParam] = useState(hasRolloutQueryParam); const rolloutIdFromQuery = hasRolloutQueryParam ? searchParams.get('rolloutId') || null : undefined; const attemptIdFromQuery = hasAttemptQueryParam ? searchParams.get('attemptId') || null : undefined; const rolloutId = useAppSelector(selectTracesRolloutId); const attemptId = useAppSelector(selectTracesAttemptId); const searchTerm = useAppSelector(selectTracesSearchTerm); const page = useAppSelector(selectTracesPage); const recordsPerPage = useAppSelector(selectTracesRecordsPerPage); const sort = useAppSelector(selectTracesSort); const viewMode = useAppSelector(selectTracesViewMode); const spansQueryArgs = useAppSelector(selectTracesQueryArgs); const baseRolloutsQueryArgs = useMemo( () => ({ limit: 100, offset: 0, sortBy: 'start_time', sortOrder: 'desc', }), [], ); const { data: rolloutsData, isLoading: rolloutsLoading, isFetching: rolloutsFetching, isError: rolloutsIsError, error: rolloutsError, } = useGetRolloutsQuery(baseRolloutsQueryArgs, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const baseRolloutItems = rolloutsData?.items ?? []; const rolloutSearchQueryArgs = useMemo(() => { if (!rolloutSearchActive) { return null; } return { limit: 20, offset: 0, sortBy: 'start_time', sortOrder: 'desc', rolloutIdContains: normalizedRolloutSearchValue, }; }, [normalizedRolloutSearchValue, rolloutSearchActive]); const { data: rolloutSearchData, isFetching: rolloutSearchFetching } = useGetRolloutsQuery( rolloutSearchQueryArgs ?? skipToken, ); const rolloutByIdQueryArgs = useMemo(() => { if (!rolloutId || rolloutLookup[rolloutId]) { return null; } return { limit: 20, offset: 0, sortBy: 'start_time', sortOrder: 'desc', rolloutIdContains: rolloutId, }; }, [rolloutId, rolloutLookup]); const { data: rolloutByIdData, isFetching: rolloutByIdFetching } = useGetRolloutsQuery( rolloutByIdQueryArgs ?? skipToken, ); const searchRolloutItems = rolloutSearchData?.items ?? []; const rolloutByIdItems = rolloutByIdData?.items ?? []; useEffect(() => { if (baseRolloutItems.length > 0) { setRolloutLookup((prev) => mergeRolloutCache(prev, baseRolloutItems)); } }, [baseRolloutItems]); useEffect(() => { if (searchRolloutItems.length > 0) { setRolloutLookup((prev) => mergeRolloutCache(prev, searchRolloutItems)); } }, [searchRolloutItems]); useEffect(() => { if (rolloutByIdItems.length > 0) { setRolloutLookup((prev) => mergeRolloutCache(prev, rolloutByIdItems)); } }, [rolloutByIdItems]); const selectedRollout = rolloutId ? (rolloutLookup[rolloutId] ?? null) : null; const attemptsQueryArgs = rolloutId !== null ? { rolloutId, limit: 200, sortBy: 'sequence_id', sortOrder: 'desc' as const, } : skipToken; const { data: attemptsData, isFetching: attemptsFetching, isError: attemptsIsError, error: attemptsError, } = useGetRolloutAttemptsQuery(attemptsQueryArgs, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const { data: spansData, isFetching: spansFetching, isError: spansIsError, error: spansError, refetch: refetchSpans, } = useGetSpansQuery(spansQueryArgs ?? skipToken, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const shouldResolveRollout = rolloutId !== null && !rolloutLookup[rolloutId]; useEffect(() => { if (!rolloutsData) { return; } if (rolloutsData.total === 0) { if (rolloutId !== null) { dispatch(setTracesRolloutId(null)); } return; } if (rolloutId === null) { if (!initialHasRolloutQueryParam && baseRolloutItems[0]) { dispatch(setTracesRolloutId(baseRolloutItems[0].rolloutId)); } return; } if (!shouldResolveRollout) { return; } if (rolloutSearchActive && normalizedRolloutSearchValue === rolloutId) { return; } if (rolloutByIdQueryArgs) { if (rolloutByIdFetching || !rolloutByIdData || rolloutsLoading) { return; } if (rolloutByIdData.items.length === 0) { dispatch(setTracesRolloutId(null)); } return; } dispatch(setTracesRolloutId(null)); }, [ baseRolloutItems, dispatch, initialHasRolloutQueryParam, normalizedRolloutSearchValue, rolloutByIdData, rolloutByIdFetching, rolloutByIdQueryArgs, rolloutId, rolloutLookup, rolloutSearchActive, rolloutsData, rolloutsLoading, shouldResolveRollout, ]); useEffect(() => { if (!rolloutId) { if (attemptId !== null) { dispatch(setTracesAttemptId(null)); } return; } if (attemptsData && attemptsData.items.length > 0) { const hasSelected = attemptId ? attemptsData.items.some((attempt) => attempt.attemptId === attemptId) : false; if (!hasSelected) { const latest = getLatestAttempt(attemptsData.items); if (latest && latest.attemptId !== attemptId) { dispatch(setTracesAttemptId(latest.attemptId)); } } return; } if (attemptId === null) { const fallbackAttemptId = selectedRollout?.attempt?.attemptId ?? null; if (fallbackAttemptId !== attemptId) { dispatch(setTracesAttemptId(fallbackAttemptId)); } } }, [attemptsData, attemptId, dispatch, rolloutId, selectedRollout]); const visibleRolloutItems = rolloutSearchActive ? searchRolloutItems : baseRolloutItems; const rolloutSelectIsFetching = (rolloutSearchActive ? rolloutSearchFetching : rolloutsFetching) || Boolean(rolloutByIdQueryArgs && rolloutByIdFetching); const rolloutOptions = useMemo(() => { const options = visibleRolloutItems.map((rollout) => ({ value: rollout.rolloutId, label: rollout.rolloutId, })); if (rolloutId && !visibleRolloutItems.some((rollout) => rollout.rolloutId === rolloutId)) { options.push({ value: rolloutId, label: rolloutId }); } return options; }, [rolloutId, visibleRolloutItems]); const attemptOptions = useMemo(() => { if (attemptsData && attemptsData.items.length > 0) { return [...attemptsData.items] .sort((a, b) => b.sequenceId - a.sequenceId) .map((attempt) => ({ value: attempt.attemptId, label: `Attempt ${attempt.sequenceId} (${attempt.attemptId}) - ${formatStatusLabel(attempt.status)}`, })); } if (selectedRollout?.attempt) { const attempt = selectedRollout.attempt; return [ { value: attempt.attemptId, label: `Attempt ${attempt.sequenceId} (${attempt.attemptId}) - ${formatStatusLabel(attempt.status)}`, }, ]; } return []; }, [attemptsData, selectedRollout]); const attemptPlaceholder = useMemo(() => { if (!rolloutId) { return 'Select Attempt'; } if (attemptOptions.length === 0) { return 'No Attempt'; } return 'Latest Attempt'; }, [attemptOptions.length, rolloutId]); const rawSpansData = spansData as any as { items?: Span[]; total?: number } | undefined; const spans = rawSpansData?.items ?? []; const spansTotal = rawSpansData?.total ?? 0; const recordsPerPageOptions = [50, 100, 200, 500]; const isInitialLoading = rolloutsLoading && baseRolloutItems.length === 0; const isFetching = spansFetching || rolloutsFetching || attemptsFetching; const selectionMessage = useMemo(() => { if (!rolloutId && !attemptId) { return 'Select a rollout and attempt to view traces.'; } if (!rolloutId) { return 'Select a rollout to view traces.'; } if (!attemptId) { return 'Select an attempt to view traces.'; } return undefined; }, [attemptId, rolloutId]); const tableSpans = selectionMessage ? [] : spans; const tableIsError = selectionMessage ? false : spansIsError; const tableError = selectionMessage ? undefined : spansError; const tableIsFetching = selectionMessage ? false : isFetching; useEffect(() => { const anyError = rolloutsIsError || attemptsIsError || spansIsError; if (anyError) { const descriptor = (rolloutsIsError && getErrorDescriptor(rolloutsError)) || (attemptsIsError && getErrorDescriptor(attemptsError)) || (spansIsError && getErrorDescriptor(spansError)) || null; const detailSuffix = descriptor ? ` (${descriptor})` : ''; dispatch( showAlert({ id: 'traces-fetch', message: `Unable to refresh traces${detailSuffix}. The table may be out of date until the connection recovers.`, tone: 'error', }), ); return; } if (!rolloutsLoading && !rolloutsFetching && !spansFetching && !attemptsFetching) { dispatch(hideAlert({ id: 'traces-fetch' })); } }, [ attemptsError, attemptsFetching, attemptsIsError, dispatch, rolloutsError, rolloutsFetching, rolloutsIsError, rolloutsLoading, spansError, spansFetching, spansIsError, ]); useEffect( () => () => { dispatch(hideAlert({ id: 'traces-fetch' })); }, [dispatch], ); useEffect(() => { const payload: { rolloutId?: string | null; attemptId?: string | null } = {}; if (hasRolloutQueryParam) { payload.rolloutId = rolloutIdFromQuery; } if (hasAttemptQueryParam) { payload.attemptId = attemptIdFromQuery; } if (Object.keys(payload).length > 0) { dispatch(hydrateTracesStateFromQuery(payload)); } setHydratedSearchParamsKey((prev) => (prev === searchParamsKey ? prev : searchParamsKey)); }, [attemptIdFromQuery, dispatch, hasAttemptQueryParam, hasRolloutQueryParam, rolloutIdFromQuery, searchParamsKey]); useEffect(() => { if (hydratedSearchParamsKey !== searchParamsKey) { return; } const next = new URLSearchParams(searchParams); let changed = false; if (rolloutId) { if (next.get('rolloutId') !== rolloutId) { next.set('rolloutId', rolloutId); changed = true; } } else if (next.has('rolloutId')) { next.delete('rolloutId'); changed = true; } if (rolloutId && attemptId) { if (next.get('attemptId') !== attemptId) { next.set('attemptId', attemptId); changed = true; } } else if (next.has('attemptId')) { next.delete('attemptId'); changed = true; } if (changed) { setSearchParams(next, { replace: true }); } }, [attemptId, hydratedSearchParamsKey, rolloutId, searchParams, searchParamsKey, setSearchParams]); const handleSearchTermChange = useCallback( (value: string) => { dispatch(setTracesSearchTerm(value)); }, [dispatch], ); const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { dispatch( setTracesSort({ column: status.columnAccessor as string, direction: status.direction, }), ); }, [dispatch], ); const handlePageChange = useCallback( (nextPage: number) => { dispatch(setTracesPage(nextPage)); }, [dispatch], ); const handleRecordsPerPageChange = useCallback( (value: number) => { dispatch(setTracesRecordsPerPage(value)); }, [dispatch], ); const handleResetFilters = useCallback(() => { dispatch(resetTracesFilters()); }, [dispatch]); const handleRefetch = useCallback(() => { if (rolloutId) { void refetchSpans(); } }, [refetchSpans, rolloutId]); const handleShowRollout = useCallback( (record: TracesTableRecord) => { const rollout = rolloutLookup[record.rolloutId]; if (!rollout) { return; } const attempts = attemptsData?.items ?? []; const attemptForRecord = attempts.find((attempt) => attempt.attemptId === record.attemptId) ?? rollout.attempt ?? null; dispatch( openDrawer({ type: 'rollout-json', rollout, attempt: attemptForRecord, isNested: false, }), ); }, [attemptsData, dispatch, rolloutLookup], ); const handleShowSpanDetail = useCallback( (record: TracesTableRecord) => { const rolloutForSpan = rolloutLookup[record.rolloutId] ?? null; const attempts = attemptsData?.items ?? []; const attemptForSpan = attempts.find((attempt) => attempt.attemptId === record.attemptId) ?? rolloutForSpan?.attempt ?? null; dispatch( openDrawer({ type: 'trace-detail', span: record, rollout: rolloutForSpan, attempt: attemptForSpan, }), ); }, [attemptsData, dispatch, rolloutLookup], ); const handleParentIdClick = useCallback( (parentId: string) => { dispatch(setTracesSearchTerm(parentId)); }, [dispatch], ); const handleViewChange = useCallback( (value: ViewOptionValue) => { dispatch(setTracesViewMode(value)); }, [dispatch], ); const activeViewLabel = VIEW_OPTIONS.find((option) => option.value === viewMode)?.label ?? 'Table View'; return ( Traces { if (value !== attemptId) { dispatch(setTracesAttemptId(value)); } }} searchable placeholder={attemptPlaceholder} aria-label='Select attempt' nothingFoundMessage={attemptsFetching ? 'Loading...' : 'No attempts'} comboboxProps={{ withinPortal: true }} w={280} disabled={!rolloutId || attemptOptions.length === 0} /> handleSearchTermChange(event.currentTarget.value)} placeholder='Search spans' aria-label='Search spans' leftSection={} w={280} /> {VIEW_OPTIONS.map((option) => ( : null} onClick={() => { if (!option.disabled) { handleViewChange(option.value); } }} > {option.label} ))} ); } ================================================ FILE: dashboard/src/pages/Workers.page.story.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import type { Meta, StoryObj } from '@storybook/react'; import { waitFor, within } from '@testing-library/dom'; import userEvent from '@testing-library/user-event'; import { Provider } from 'react-redux'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { AppAlertBanner } from '@/components/AppAlertBanner'; import { AppDrawerContainer } from '@/components/AppDrawer.component'; import { initialConfigState } from '@/features/config/slice'; import { initialWorkersUiState } from '@/features/workers/slice'; import { AppLayout } from '@/layouts/AppLayout'; import { createAppStore } from '@/store'; import type { Worker } from '@/types'; import { createWorkersHandlers } from '@/utils/mock'; import { STORY_BASE_URL, STORY_DATE_NOW_SECONDS } from '../../.storybook/constants'; import { allModes } from '../../.storybook/modes'; import { WorkersPage } from './Workers.page'; const meta: Meta = { title: 'Pages/WorkersPage', component: WorkersPage, parameters: { layout: 'fullscreen', chromatic: { modes: allModes, }, }, }; export default meta; type Story = StoryObj; const now = STORY_DATE_NOW_SECONDS; const sampleWorkers: Worker[] = [ { workerId: 'worker-east', status: 'busy', heartbeatStats: { queueDepth: 2, gpuUtilization: 0.82 }, lastHeartbeatTime: now - 20, lastDequeueTime: now - 120, lastBusyTime: now - 60, lastIdleTime: now - 600, currentRolloutId: 'ro-story-001', currentAttemptId: 'at-story-010', }, { workerId: 'worker-west', status: 'busy', heartbeatStats: { queueDepth: 1 }, lastHeartbeatTime: now - 45, lastDequeueTime: now - 300, lastBusyTime: now - 120, lastIdleTime: now - 4800, currentRolloutId: 'ro-story-003', currentAttemptId: 'at-story-033', }, { workerId: 'worker-north', status: 'idle', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 120, lastDequeueTime: now - 3600, lastBusyTime: now - 5400, lastIdleTime: now - 180, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-south', status: 'idle', heartbeatStats: null, lastHeartbeatTime: now - 900, lastDequeueTime: now - 7200, lastBusyTime: now - 8600, lastIdleTime: now - 8600, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-central', status: 'busy', heartbeatStats: { queueDepth: 3, cpuUtilization: 0.55 }, lastHeartbeatTime: now - 8, lastDequeueTime: now - 45, lastBusyTime: now - 10, lastIdleTime: now - 900, currentRolloutId: 'ro-story-005', currentAttemptId: 'at-story-013', }, { workerId: 'worker-standby', status: 'idle', heartbeatStats: { queueDepth: 0, threads: 32 }, lastHeartbeatTime: now - 300, lastDequeueTime: now - 10800, lastBusyTime: now - 14400, lastIdleTime: now - 200, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-observer', status: 'unknown', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 30, lastDequeueTime: now - 6400, lastBusyTime: null, lastIdleTime: null, currentRolloutId: null, currentAttemptId: null, }, ]; const defaultHandlers = createWorkersHandlers(sampleWorkers); function createStoryStore(configOverrides?: Partial) { return createAppStore({ config: { ...initialConfigState, baseUrl: STORY_BASE_URL, autoRefreshMs: 0, ...configOverrides, }, workers: initialWorkersUiState, }); } function renderWithStore(configOverrides?: Partial) { const store = createStoryStore(configOverrides); return ( <> ); } function renderWithinAppLayout(configOverrides?: Partial) { const store = createStoryStore(configOverrides); const router = createMemoryRouter( [ { path: '/', element: ( ), children: [ { path: '/runners', element: , }, ], }, ], { initialEntries: ['/runners'] }, ); return ( <> ); } const manyWorkers = Array.from({ length: 80 }, (_, index) => { const suffix = (index + 1).toString().padStart(3, '0'); const busy = index % 2 === 0; return { workerId: `worker-batch-${suffix}`, status: busy ? 'busy' : 'idle', heartbeatStats: busy ? { queueDepth: (index % 5) + 1 } : { queueDepth: 0 }, lastHeartbeatTime: now - (index * 5 + 15), lastDequeueTime: now - (index * 20 + 60), lastBusyTime: busy ? now - (index * 10 + 30) : null, lastIdleTime: busy ? null : now - (index * 10 + 45), currentRolloutId: busy ? `ro-many-${suffix}` : null, currentAttemptId: busy ? `at-many-${suffix}` : null, } satisfies Worker; }); export const Default: Story = { render: () => renderWithinAppLayout(), parameters: { msw: { handlers: defaultHandlers, }, }, }; export const Search: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByText('worker-east'); const searchInput = canvas.getByPlaceholderText('Search by Runner ID'); await userEvent.type(searchInput, 'worker-west'); await waitFor(() => { if (canvas.queryByText('worker-east')) { throw new Error('Expected filtered table to hide worker-east'); } if (!canvas.queryByText('worker-west')) { throw new Error('Expected worker-west to remain visible'); } }); }, }; export const DrawerOpen: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: defaultHandlers, }, }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); await canvas.findByText('worker-east'); const detailsButtons = await canvas.findAllByRole('button', { name: /detail/i }); await userEvent.click(detailsButtons[0]); const body = within(document.body); await waitFor(() => { if (!body.queryByTestId('json-editor-container')) { throw new Error('Expected worker detail drawer with JSON view'); } }); }, }; export const ManyWorkers: Story = { render: () => renderWithStore(), parameters: { msw: { handlers: createWorkersHandlers(manyWorkers), }, }, }; export const DarkTheme: Story = { render: () => renderWithStore({ theme: 'dark' }), parameters: { theme: 'dark', msw: { handlers: defaultHandlers, }, }, }; ================================================ FILE: dashboard/src/pages/Workers.page.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { useCallback, useEffect } from 'react'; import { IconSearch } from '@tabler/icons-react'; import type { DataTableSortStatus } from 'mantine-datatable'; import { Skeleton, Stack, TextInput, Title } from '@mantine/core'; import { WorkersTable, type WorkersTableRecord } from '@/components/WorkersTable.component'; import { selectAutoRefreshMs } from '@/features/config'; import { hideAlert, showAlert } from '@/features/ui/alert'; import { openDrawer } from '@/features/ui/drawer'; import { resetWorkersFilters, selectWorkersPage, selectWorkersQueryArgs, selectWorkersRecordsPerPage, selectWorkersSearchTerm, selectWorkersSort, setWorkersPage, setWorkersRecordsPerPage, setWorkersSearchTerm, setWorkersSort, useGetWorkersQuery, } from '@/features/workers'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import type { PaginatedResponse, Worker } from '@/types'; import { getErrorDescriptor } from '@/utils/error'; export function WorkersPage() { const dispatch = useAppDispatch(); const autoRefreshMs = useAppSelector(selectAutoRefreshMs); const searchTerm = useAppSelector(selectWorkersSearchTerm); const page = useAppSelector(selectWorkersPage); const recordsPerPage = useAppSelector(selectWorkersRecordsPerPage); const sort = useAppSelector(selectWorkersSort); const queryArgs = useAppSelector(selectWorkersQueryArgs); const workersQueryResult = useGetWorkersQuery(queryArgs, { pollingInterval: autoRefreshMs > 0 ? autoRefreshMs : undefined, }); const workersData = workersQueryResult.data as PaginatedResponse | undefined; const { isLoading, isFetching, isError, error, refetch } = workersQueryResult; const handleSearchTermChange = useCallback( (value: string) => { dispatch(setWorkersSearchTerm(value)); }, [dispatch], ); const handleSortStatusChange = useCallback( (status: DataTableSortStatus) => { dispatch( setWorkersSort({ column: status.columnAccessor, direction: status.direction, }), ); }, [dispatch], ); const handlePageChange = useCallback( (nextPage: number) => { dispatch(setWorkersPage(nextPage)); }, [dispatch], ); const handleRecordsPerPageChange = useCallback( (value: number) => { dispatch(setWorkersRecordsPerPage(value)); }, [dispatch], ); const handleResetFilters = useCallback(() => { dispatch(resetWorkersFilters()); }, [dispatch]); const handleShowWorkerDetails = useCallback( (worker: Worker) => { dispatch( openDrawer({ type: 'worker-detail', worker, }), ); }, [dispatch], ); const hasWorkers = Array.isArray(workersData?.items) && workersData.items.length > 0; const showSkeleton = isLoading && !hasWorkers; useEffect(() => { if (isError) { const descriptor = getErrorDescriptor(error); const suffix = descriptor ? ` (${descriptor})` : ''; dispatch( showAlert({ id: 'workers-fetch', message: `Unable to refresh workers${suffix}. The table may be out of date until the connection recovers.`, tone: 'error', }), ); return; } if (!isLoading && !isFetching) { dispatch(hideAlert({ id: 'workers-fetch' })); } }, [dispatch, error, isError, isFetching, isLoading]); useEffect( () => () => { dispatch(hideAlert({ id: 'workers-fetch' })); }, [dispatch], ); return ( Runners handleSearchTermChange(event.currentTarget.value)} leftSection={} data-testid='workers-search-input' w='100%' style={{ maxWidth: 360 }} /> {showSkeleton ? ( ) : ( )} ); } ================================================ FILE: dashboard/src/store/hooks.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; import type { AppDispatch, RootState } from './index'; export const useAppDispatch = () => useDispatch(); export const useAppSelector: TypedUseSelectorHook = useSelector; ================================================ FILE: dashboard/src/store/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { combineReducers, configureStore } from '@reduxjs/toolkit'; import { configReducer } from '../features/config'; import { resourcesReducer } from '../features/resources'; import { rolloutsApi, rolloutsReducer } from '../features/rollouts'; import { tracesReducer } from '../features/traces'; import { alertReducer } from '../features/ui/alert'; import { drawerReducer } from '../features/ui/drawer'; import { workersReducer } from '../features/workers'; const rootReducer = combineReducers({ config: configReducer, drawer: drawerReducer, alert: alertReducer, rollouts: rolloutsReducer, resources: resourcesReducer, workers: workersReducer, traces: tracesReducer, [rolloutsApi.reducerPath]: rolloutsApi.reducer, }); export type RootState = ReturnType; export const createAppStore = (preloadedState?: Partial) => configureStore({ reducer: rootReducer, middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(rolloutsApi.middleware), preloadedState, }); export const store = createAppStore(); export type AppStore = ReturnType; export type AppDispatch = AppStore['dispatch']; ================================================ FILE: dashboard/src/styles/app.css ================================================ @keyframes connection-refreshing-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .connection-refreshing { animation: connection-refreshing-blink 1s linear infinite; } .connection-indicator-button { display: block; width: 100%; text-align: left; padding: var(--mantine-spacing-xs); border-radius: var(--mantine-radius-sm); transition: background-color 150ms ease; cursor: pointer; } .connection-indicator-button:hover, .connection-indicator-button:focus-visible { background-color: var(--mantine-color-gray-0); } [data-mantine-color-scheme='dark'] .connection-indicator-button:hover, [data-mantine-color-scheme='dark'] .connection-indicator-button:focus-visible { background-color: var(--mantine-color-dark-8); } .connection-indicator-button:focus-visible { outline: 2px solid var(--mantine-color-blue-filled); outline-offset: 2px; } [data-mantine-color-scheme='dark'] .mantine-AppShell-root .mantine-AppShell-navbar { --app-shell-border-color: var(--mantine-color-dark-6); } .mantine-datatable { --mantine-datatable-background-color: var(--mantine-color-body); } .mantine-datatable .mantine-datatable-empty-state { pointer-events: none; } .mantine-datatable .mantine-datatable-empty-state[data-active] { pointer-events: auto; } [data-mantine-color-scheme='dark'] .mantine-datatable { --mantine-datatable-border-color-dark: var(--mantine-color-dark-6); --mantine-datatable-highlight-on-hover-color: var(--mantine-color-dark-7); } /* Rollout Nested Table */ .rollouts-table .mantine-datatable-row-expansion-cell { padding: 0; } .rollouts-table .mantine-datatable-row-expansion-cell-content { border: 0; padding: 0; background-color: transparent; } .rollouts-table--nested { --mantine-datatable-background-color: var(--mantine-color-gray-1); } .rollouts-table--nested .mantine-datatable-table, .rollouts-table--nested .mantine-datatable-table td, .rollouts-table--nested .mantine-datatable-table th { background-color: var(--mantine-datatable-background-color); } .rollouts-table--nested .mantine-datatable-table tbody tr:first-of-type td { border-top: 1px solid var(--mantine-color-gray-3); } [data-mantine-color-scheme='dark'] .rollouts-table--nested { --mantine-datatable-background-color: var(--mantine-color-dark-6); } [data-mantine-color-scheme='dark'] .rollouts-table--nested .mantine-datatable-table tbody tr:first-of-type td { border-top: 1px solid var(--mantine-color-dark-4); } /* Fix Mantine Conflicts with Mantine-datatable */ .mantine-datatable-page-size-selector-active { color: var(--mantine-color-text); background: transparent; } ================================================ FILE: dashboard/src/styles/theme.css ================================================ /* Checkbox */ .mantine-Checkbox-root { --checkbox-color: var(--mantine-primary-color-filled); --checkbox-icon-color: var(--mantine-primary-color-contrast); .mantine-Checkbox-input { background-color: transparent; border-color: var(--checkbox-color); &[data-indeterminate], &:checked { background-color: var(--checkbox-color); } &:disabled { opacity: 0.5; & + .mantine-Checkbox-icon { opacity: 0.5; color: var(--checkbox-icon-color); } } } .mantine-Checkbox-label { &[data-disabled] { color: inherit; opacity: 0.7; } } &[data-variant='outline'] { .mantine-Checkbox-input { background-color: transparent; & + .mantine-Checkbox-icon { color: var(--checkbox-color); } } } } /* Checkbox Group */ .mantine-CheckboxGroup-root { .mantine-CheckboxGroup-error { margin-top: 8px; } } /* Chip */ .mantine-Chip-root { --chip-color: var(--mantine-primary-color-contrast); &[data-variant='outline']:not([data-disabled]) { .mantine-Chip-label { background-color: transparent; --chip-bd: 1px solid var(--mantine-color-default-border); &:hover { background-color: var(--mantine-color-default-hover); } &:where([data-disabled]) { --chip-icon-color: var(--mantine-color-text); border-color: var(--mantine-color-default-border); color: var(--mantine-color-text); opacity: 0.5; &:hover { background-color: transparent; color: var(--mantine-color-text); --chip-bd: 1px solid var(--mantine-color-default-border); --chip-icon-color: var(--mantine-color-text); } } } } } /* Input */ [data-mantine-color-scheme='light'], [data-mantine-color-scheme='dark'] { .mantine-Input-wrapper { --input-disabled-bg: alpha(var(--mantine-color-default-hover), 0.5); --input-disabled-color: alpha(var(--mantine-color-text), 0.5); &[data-variant='default'] { --input-bd: var(--mantine-color-default-border); --input-bg: transparent; --input-bd-focus: var(--mantine-primary-color-filled); } &[data-variant='filled'] { --input-bd: transparent; --input-bg: var(--mantine-color-default-hover); --input-bd-focus: var(--mantine-primary-color-filled); } &[data-variant='unstyled'] { --input-bd: transparent; --input-bg: transparent; --input-bd-focus: transparent; } } } /* Color Input */ .mantine-ColorInput-dropdown { background-color: var(--mantine-color-default); border-color: var(--mantine-color-default-border); } /* Fieldset */ .mantine-Fieldset-root { border-color: var(--mantine-color-default-border); background-color: transparent; &[data-variant='filled'] { border-color: var(--mantine-color-default-border); background-color: alpha(var(--mantine-color-default-hover), 0.4); } &[data-variant='unstyled'] { border-color: transparent; background-color: transparent; } } /* Radio */ .mantine-Radio-root { .mantine-Radio-radio { background-color: transparent; border-color: var(--radio-color); &:checked { background-color: var(--radio-color); border-color: var(--radio-color); } & + .mantine-Radio-icon { color: var(--radio-icon-color); } &:disabled { opacity: 0.5; } } &[data-variant='outline'] { .mantine-Radio-radio { background-color: transparent; border-color: var(--radio-color); &:checked:not(:disabled) { background-color: transparent; border-color: var(--radio-color); } &:disabled { opacity: 0.5; & + .mantine-Radio-icon { color: var(--radio-color); --radio-icon-opacity: 0.5; } } } } } /* Segmented Control */ .mantine-SegmentedControl-root { background-color: var(--mantine-color-secondary-outline-hover); .mantine-SegmentedControl-label { color: var(--mantine-color-dimmed); &[data-active] { color: var(--mantine-color-text); } } } [data-mantine-color-scheme='light'] { .mantine-SegmentedControl-root { .mantine-SegmentedControl-label { &:where(:not([data-disabled], [data-active], [data-read-only])) { &:hover { color: var(--mantine-color-black); } } } } } [data-mantine-color-scheme='dark'] { .mantine-SegmentedControl-root { .mantine-SegmentedControl-label { &:where(:not([data-disabled], [data-active], [data-read-only])) { &:hover { color: var(--mantine-color-white); } } } } } [data-mantine-color-scheme='light'] { .mantine-SegmentedControl-root { .mantine-SegmentedControl-label { &:where(:not([data-disabled], [data-active], [data-read-only])) { &:hover { color: var(--mantine-color-black); } } } } } [data-mantine-color-scheme='dark'] { .mantine-SegmentedControl-root { .mantine-SegmentedControl-label { &:where(:not([data-disabled], [data-active], [data-read-only])) { &:hover { color: var(--mantine-color-white); } } } } } /* Switch */ /* Slider */ [data-mantine-color-scheme='light'], [data-mantine-color-scheme='dark'] { .mantine-Slider-root { --slider-track-bg: var(--mantine-color-secondary-outline-hover); } } .mantine-Slider-root { .mantine-Slider-trackContainer { &[data-disabled] { opacity: 0.5; } } .mantine-Slider-label { background-color: var(--mantine-color-default) !important; color: var(--mantine-color-text); border: 1px solid var(--mantine-color-default-border) !important; top: -45px; } } /* Pills Input */ .mantine-PillsInput-wrapper { .mantine-PillsInput-input { &[data-variant='filled'] { .mantine-Pill-root { background-color: var(--mantine-color-body); } } } } /* Tags Input */ .mantine-TagsInput-wrapper { .mantine-TagsInput-input { &[data-variant='filled'] { .mantine-Pill-root { background-color: var(--mantine-color-body); } } } } /* ActionIcon */ .mantine-ActionIcon-root { &:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) { border: var(--ai-bd); opacity: 0.5; &:active { transform: none; } } } /* Button */ .mantine-Button-root { &:where(:disabled:not([data-loading]), [data-disabled]:not([data-loading])) { border: var(--button-bd); opacity: 0.5; } } /* Close Button */ .mantine-CloseButton-root { &[data-variant='subtle']:where(:not([data-disabled], :disabled)) { &:hover { background-color: var(--mantine-color-default-hover); } } } /* NavLink */ .mantine-NavLink-root { &:hover { background-color: var(--mantine-color-default-hover); } &:where([data-active], [aria-current='page']) { background-color: var(--nl-bg); color: var(--nl-color); &:hover { background-color: var(--nl-hover); } .description { --description-opacity: 0.9; --description-color: var(--nl-color); } } } /* Pagination */ .mantine-Pagination-root { .mantine-Pagination-control { border-color: var(--mantine-color-default-border); background-color: var(--mantine-color-body); &:hover { &:where(:not(:disabled, [data-disabled])) { background-color: var(--mantine-color-default-hover); } } &:where([data-active]) { background-color: var(--pagination-active-bg); border-color: var(--pagination-active-bg); color: var(--pagination-active-color, var(--mantine-primary-color-contrast)); &:hover { background-color: rgb(from var(--pagination-active-bg) r g b / 0.9); } } } } /* Stepper */ .mantine-Stepper-root { .mantine-Stepper-stepIcon { background-color: var(--mantine-color-body); border-color: var(--mantine-color-default-border); color: var(--mantine-color-text); &:where([data-progress]) { border-color: var(--step-color); } &:where([data-completed]) { color: var(--stepper-icon-color, var(--mantine-color-white)); background-color: var(--step-color); border-color: var(--step-color); } } } /* Tabs */ [data-mantine-color-scheme='light'], [data-mantine-color-scheme='dark'] { .mantine-Tabs-root { --tab-border-color: var(--mantine-color-default-border); &[data-variant='default'] { --tabs-list-border-width: 2px; --tab-hover-color: var(--mantine-color-default-hover); } &[data-variant='pills'] { --tabs-list-gap: calc(var(--mantine-spacing-sm) / 2); --tabs-text-color: var(--mantine-color-body) !important; --tab-hover-color: var(--mantine-color-default-hover); } .mantine-Tabs-tab { color: var(--mantine-color-dimmed); &[data-variant='default'], &[data-variant='outline'] { &[data-active='true'] { color: var(--mantine-color-text); } &:hover { background-color: transparent; color: var(--mantine-color-text); } } &[data-variant='pills'] { &[data-active='true'] { color: var(--mantine-primary-color-contrast); &:hover { color: var(--mantine-primary-color-contrast); } } &:hover { color: var(--mantine-color-text); } } } } } /* Notification */ .mantine-Notification-root { background-color: var(--mantine-color-secondary-filled); &:where([data-with-border]) { border: 1px solid var(--mantine-color-default-border); } } /* Progress */ .mantine-Progress-root { background-color: var(--mantine-color-default-hover); } /* Ring Progress */ .mantine-RingProgress-root { .mantine-RingProgress-curve { --rp-curve-root-color: var(--mantine-color-default-hover); } } /* SemiCircle Progress */ .mantine-SemiCircleProgress-root { --scp-empty-segment-color: var(--mantine-color-default-hover); } /* Skeleton */ .mantine-Skeleton-root { &:where([data-visible]) { &::after { background-color: var(--mantine-color-default-hover); } } } /* Drawer */ .mantine-Drawer-root { .mantine-Drawer-content { border-right: 1px solid var(--mantine-color-default-border); border-left: 1px solid var(--mantine-color-default-border); } } /* Hover Card */ .mantine-HoverCard-dropdown { background-color: var(--mantine-color-body); border-color: var(--mantine-color-default-border); border-radius: var(--mantine-radius-default); } /* Menu Dropdown */ .mantine-Menu-dropdown { background-color: var(--mantine-color-body); border-color: var(--mantine-color-default-border); .mantine-Menu-item { background-color: transparent; &:where([data-hovered]) { background-color: var(--menu-item-hover, var(--mantine-color-default-hover)); } } .mantine-Menu-divider { border-color: var(--mantine-color-default-border); } } /* Modal */ .mantine-Modal-root { .mantine-Modal-content { border: 1px solid var(--mantine-color-default-border); border-radius: var(--mantine-radius-default); } } /* Popover Start */ .mantine-Popover-dropdown { --popover-border-color: var(--mantine-color-default-border); background-color: var(--mantine-color-body); } .mantine-Popover-arrow { --popover-border-color: var(--mantine-color-default-border); } /* Popover End */ /* Tooltip */ .mantine-Tooltip-tooltip { font-size: var(--mantine-font-size-xs); padding-top: 0; padding-bottom: 0; } /* Accordion */ .mantine-Accordion-root { .mantine-Accordion-control { color: var(--mantine-color-text); } .mantine-Accordion-item { --item-border-color: var(--mantine-color-default-border); --item-filled-color: var(--mantine-color-default-hover); } &[data-variant='default'] { .mantine-Accordion-control { &:where(:not(:disabled, [data-disabled])) { &:hover { background-color: transparent; } } } .mantine-Accordion-label { &:where(:not(:disabled, [data-disabled])) { &:hover { text-decoration: underline; } } } } &[data-variant='contained'], &[data-variant='filled'] { .mantine-Accordion-control { &:where(:not(:disabled, [data-disabled])) { &:hover { background-color: var(--mantine-color-default-hover); } } } } } /* Avatar */ .mantine-Avatar-root { --avatar-bg: var(--mantine-primary-color-light); --avatar-bd: 1px solid transparent; --avatar-color: var(--mantine-primary-color-light-color); } /* Badge */ .mantine-Badge-root { --badge-color: var(--mantine-primary-color-contrast); &[data-variant='dot'] { background-color: var(--mantine-color-secondary-light); border-color: var(--mantine-color-secondary-light); color: var(--mantine-color-text); } } /* Card */ .mantine-Card-root { background-color: var(--mantine-color-default); .mantine-Card-section { border-color: var(--mantine-color-default-border); } } /* Timeline */ .mantine-Timeline-root { --item-border-color: var(--mantine-color-default-border); .mantine-Timeline-itemBullet { border-color: var(--mantine-color-default-border); &:where([data-with-child]) { background-color: var(--mantine-color-secondary-light); } &:where([data-active]) { border-color: var(--tli-color, var(--tl-color)); background-color: var(--mantine-color-white); color: var(--tl-icon-color, var(--mantine-color-white)); &:where([data-with-child]) { background-color: var(--tli-color, var(--tl-color)); color: var(--tl-icon-color, var(--mantine-color-white)); } } } } /* Code */ .mantine-Code-root { background-color: var(--code-bg, var(--mantine-color-secondary-filled)); color: var(--mantine-color-text); } /* Table */ .mantine-Table-table { --table-hover-color: var(--mantine-color-default-hover); --table-striped-color: var(--mantine-color-default-hover); --table-border-color: var(--mantine-color-default-border); &:where([data-with-table-border]) { border: rem(1px) solid var(--table-border-color); } } /* Title */ .mantine-Title-root, .mantine-Modal-title, .mantine-Drawer-title { letter-spacing: -0.025em; } /* Divider */ .mantine-Divider-root { --divider-color: var(--mantine-color-default-border); } /* Paper */ .mantine-Paper-root { &:where([data-with-border]) { border: rem(1px) solid var(--mantine-color-default-border); } } /* Date Picker */ .mantine-DatePicker-levelsGroup { .mantine-DatePicker-calendarHeader { --dch-control-size-xs: calc(1.25rem * var(--mantine-scale)); --dch-control-size-sm: calc(1.75rem * var(--mantine-scale)); --dch-control-size-md: calc(2.25rem * var(--mantine-scale)); --dch-control-size-lg: calc(2.5rem * var(--mantine-scale)); --dch-control-size-xl: calc(2.75rem * var(--mantine-scale)); max-width: none; gap: var(--mantine-spacing-xs); .mantine-DatePicker-calendarHeaderControl { border: 1px solid var(--mantine-color-default-border); border-radius: var(--mantine-radius-default); &:hover { background-color: var(--mantine-color-default-hover) !important; } } .mantine-DatePicker-calendarHeaderLevel { &:hover { background-color: var(--mantine-color-default-hover) !important; } font-size: var(--mantine-font-size-sm); } } .mantine-DatePicker-month { border-collapse: separate; border-spacing: 0 5px; .mantine-DatePicker-weekdaysRow { .mantine-DatePicker-weekday { font-size: var(--mantine-font-size-xs); } } .mantine-DatePicker-monthRow { margin-top: var(--mantine-spacing-xs); margin-bottom: var(--mantine-spacing-xs); .mantine-DatePicker-day { --day-size-xs: calc(1.5rem * var(--mantine-scale)); --day-size-sm: calc(2rem * var(--mantine-scale)); --day-size-md: calc(2.5rem * var(--mantine-scale)); --day-size-lg: calc(3rem * var(--mantine-scale)); --day-size-xl: calc(3.5rem * var(--mantine-scale)); font-size: calc(var(--day-size) / 2.28); &:hover:where(:not([data-static], [data-disabled], [data-selected], [data-in-range])) { background-color: var(--mantine-color-default-hover) !important; border-radius: var(--mantine-radius-default); &[data-in-range] { border-radius: 0; } } &:where([data-selected]):hover:where(:not([data-disabled], [data-static])) { background-color: var(--mantine-primary-color-filled-hover); border-radius: var(--mantine-radius-default); } &[data-weekend] { color: var(--mantine-color-text); } &[data-last-in-range], &[data-first-in-range] { border-radius: var(--mantine-radius-default); } } } } .mantine-DatePicker-monthsList { .mantine-DatePicker-monthsListControl { --dpc-size-xs: calc(1.5rem * var(--mantine-scale)); --dpc-size-sm: calc(1.96rem * var(--mantine-scale)); --dpc-size-md: calc(2.5rem * var(--mantine-scale)); --dpc-size-lg: calc(3rem * var(--mantine-scale)); --dpc-size-xl: calc(3.5rem * var(--mantine-scale)); &:hover:where(:not([data-disabled], :disabled)) { background-color: var(--mantine-color-default-hover) !important; } } } .mantine-DatePicker-yearsList { .mantine-DatePicker-yearsListControl { --dpc-size-xs: calc(1.5rem * var(--mantine-scale)); --dpc-size-sm: calc(1.96rem * var(--mantine-scale)); --dpc-size-md: calc(2.5rem * var(--mantine-scale)); --dpc-size-lg: calc(3rem * var(--mantine-scale)); --dpc-size-xl: calc(3.5rem * var(--mantine-scale)); &:hover:where(:not([data-disabled], :disabled)) { background-color: var(--mantine-color-default-hover) !important; } } } } /* Spotlight */ .mantine-Spotlight-root { .mantine-Spotlight-content { border: 1px solid var(--mantine-color-default-border); } .mantine-Spotlight-actionsList { border-color: var(--mantine-color-default-border); } .mantine-Spotlight-action { &:where(:not([data-selected])) { &:hover { background-color: var(--mantine-color-default-hover); } } } .mantine-Spotlight-footer { border-color: var(--mantine-color-default-border); } } /* Code Highlight */ .mantine-CodeHighlightTabs-root { .mantine-CodeHighlightTabs-file { color: var(--mantine-color-text); border-color: var(--mantine-color-default-border); padding: 7px 12px; font-size: 12px; &:where([data-active]) { background-color: var(--mantine-color-default-hover); color: var(--mantine-color-text); } } .mantine-CodeHighlightTabs-control { color: var(--mantine-primary-color-contrast); } } /* Chart Tooltip */ .mantine-ChartTooltip-tooltip { border: 1px solid var(--mantine-color-default-border); } ================================================ FILE: dashboard/src/theme.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { ActionIcon, Alert, Anchor, Avatar, Badge, Blockquote, Button, Card, Checkbox, Chip, Container, createTheme, Dialog, Indicator, MantineColorsTuple, MantineThemeOverride, Mark, NavLink, Pagination, Paper, Radio, rem, SegmentedControl, Select, Stepper, Switch, ThemeIcon, Timeline, Tooltip, } from '@mantine/core'; const CONTAINER_SIZES: Record = { xxs: rem('200px'), xs: rem('300px'), sm: rem('400px'), md: rem('500px'), lg: rem('600px'), xl: rem('1400px'), xxl: rem('1600px'), }; export const FONT_FAMILY = 'ui-sans-serif, -apple-system, system-ui, "Segoe UI", Helvetica, "Apple Color Emoji", Arial, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"'; const zincColors: MantineColorsTuple = [ '#fafafa', '#f4f4f5', '#e4e4e7', '#d4d4d8', '#a1a1aa', '#52525b', '#3f3f46', '#27272a', '#18181b', '#09090b', '#71717A', ]; const slateColors: MantineColorsTuple = [ '#f8fafc', '#f1f5f9', '#e2e8f0', '#cbd5e1', '#94a3b8', '#475569', '#334155', '#1e293b', '#0f172a', '#020817', '#64748B', ]; const grayColors: MantineColorsTuple = [ '#f9fafb', '#f3f4f6', '#e5e7eb', '#d1d5db', '#9ca3af', '#4b5563', '#374151', '#1f2937', '#111827', '#030712', '#6B7280', ]; const neutralColors: MantineColorsTuple = [ '#fafafa', '#f5f5f5', '#e5e5e5', '#d4d4d4', '#a3a3a3', '#525252', '#404040', '#262626', '#171717', '#0a0a0a', '#737373', ]; const stoneColors: MantineColorsTuple = [ '#fafaf9', '#f5f5f4', '#e7e5e4', '#d6d3d1', '#a8a29e', '#57534e', '#44403c', '#292524', '#1c1917', '#0c0a09', '#78716C', ]; const redColors: MantineColorsTuple = [ '#FEF2F2', '#FEE2E2', '#FECACA', '#FCA5A5', '#F87171', '#DC2626', '#B91C1C', '#991B1B', '#7F1D1D', '#450A0A', '#EF4444', ]; const roseColors: MantineColorsTuple = [ '#fff1f2', '#ffe4e6', '#fecdd3', '#fda4af', '#fb7185', '#e11d48', '#be123c', '#9f1239', '#881337', '#4c0519', '#F43F5E', ]; const orangeColors: MantineColorsTuple = [ '#fff7ed', '#ffedd5', '#fed7aa', '#fdba74', '#fb923c', '#f97316', '#ea580c', '#9a3412', '#7c2d12', '#431407', '#F97316', ]; const amberColors: MantineColorsTuple = [ '#FFFBEB', '#FEF3C7', '#FDE68A', '#FCD34D', '#FBBF24', '#f59e0b', '#D97706', '#92400E', '#78350F', '#451A03', '#F59E0B', ]; const yellowColors: MantineColorsTuple = [ '#fefce8', '#fef9c3', '#fef08a', '#fde047', '#facc15', '#ca8a04', '#a16207', '#854d0e', '#713f12', '#3f2c06', '#F59E0B', ]; const limeColors: MantineColorsTuple = [ '#f7fee7', '#ecfccb', '#d9f99d', '#bef264', '#a3e635', '#4d7c0f', '#3f6212', '#365314', '#1a2e05', '#0f1903', '#84CC16', ]; const greenColors: MantineColorsTuple = [ '#F0FDF4', '#DCFCE7', '#BBF7D0', '#86EFAC', '#4ADE80', '#22c55e', '#16A34A', '#166534', '#14532D', '#052E16', '#10B981', ]; const emeraldColors: MantineColorsTuple = [ '#ecfdf5', '#d1fae5', '#a7f3d0', '#6ee7b7', '#34d399', '#059669', '#047857', '#065f46', '#064e3b', '#022c22', '#10B981', ]; const tealColors: MantineColorsTuple = [ '#f0fdfa', '#ccfbf1', '#99f6e4', '#5eead4', '#2dd4bf', '#0d9488', '#0f766e', '#115e59', '#134e4a', '#042f2e', '#14B8A6', ]; const cyanColors: MantineColorsTuple = [ '#ecfeff', '#cffafe', '#a5f3fc', '#67e8f9', '#22d3ee', '#0891b2', '#0e7490', '#155e75', '#164e63', '#083344', '#06B6D4', ]; const skyColors: MantineColorsTuple = [ '#f0f9ff', '#e0f2fe', '#bae6fd', '#7dd3fc', '#38bdf8', '#0284c7', '#0369a1', '#075985', '#0c4a6e', '#082f49', '#0EA5E9', ]; const blueColors: MantineColorsTuple = [ '#eff6ff', '#dbeafe', '#bfdbfe', '#93c5fd', '#60a5fa', '#3b82f6', '#2563eb', '#1e40af', '#1e3a8a', '#172554', '#3B82F6', ]; const indigoColors: MantineColorsTuple = [ '#eef2ff', '#e0e7ff', '#c7d2fe', '#a5b4fc', '#818cf8', '#4f46e5', '#4338ca', '#3730a3', '#312e81', '#1e1b4b', '#6366F1', ]; const violetColors: MantineColorsTuple = [ '#f5f3ff', '#ede9fe', '#ddd6fe', '#c4b5fd', '#a78bfa', '#7c3aed', '#6d28d9', '#5b21b6', '#4c1d95', '#1e1b4b', '#8B5CF6', ]; const purpleColors: MantineColorsTuple = [ '#faf5ff', '#f3e8ff', '#e9d5ff', '#d8b4fe', '#c084fc', '#9333ea', '#7e22ce', '#6b21a8', '#581c87', '#2e1065', '#A855F7', ]; const fuchsiaColors: MantineColorsTuple = [ '#fdf4ff', '#fae8ff', '#f5d0fe', '#f0abfc', '#e879f9', '#c026d3', '#a21caf', '#86198f', '#701a75', '#4a044e', '#D946EF', ]; const pinkColors: MantineColorsTuple = [ '#fdf2f8', '#fce7f3', '#fbcfe8', '#f9a8d4', '#f472b6', '#db2777', '#be185d', '#9d174d', '#831843', '#500724', '#EC4899', ]; export const shadcnTheme: MantineThemeOverride = createTheme({ colors: { slate: slateColors, gray: grayColors, zinc: zincColors, neutral: neutralColors, stone: stoneColors, red: redColors, rose: roseColors, orange: orangeColors, amber: amberColors, yellow: yellowColors, lime: limeColors, green: greenColors, emerald: emeraldColors, teal: tealColors, cyan: cyanColors, sky: skyColors, blue: blueColors, indigo: indigoColors, violet: violetColors, purple: purpleColors, fuchsia: fuchsiaColors, pink: pinkColors, primary: zincColors, secondary: zincColors, dark: zincColors, error: redColors as MantineColorsTuple, success: greenColors, info: blueColors, warning: amberColors, }, focusRing: 'never', scale: 1, primaryColor: 'primary', primaryShade: { light: 8, dark: 0 }, autoContrast: true, luminanceThreshold: 0.3, fontFamily: FONT_FAMILY, radius: { xs: rem('6px'), sm: rem('8px'), md: rem('12px'), lg: rem('16px'), xl: rem('24px'), }, defaultRadius: 'sm', spacing: { '4xs': rem('2px'), '3xs': rem('4px'), '2xs': rem('8px'), 'xs': rem('10px'), 'sm': rem('12px'), 'md': rem('16px'), 'lg': rem('20px'), 'xl': rem('24px'), '2xl': rem('28px'), '3xl': rem('32px'), '4xl': rem('40px'), }, fontSizes: { 'xs': rem('12px'), 'sm': rem('14px'), 'md': rem('16px'), 'lg': rem('18px'), 'xl': rem('20px'), '2xl': rem('24px'), '3xl': rem('30px'), '4xl': rem('36px'), '5xl': rem('48px'), }, lineHeights: { xs: rem('18px'), sm: rem('20px'), md: rem('24px'), lg: rem('28px'), }, headings: { fontFamily: FONT_FAMILY, sizes: { h1: { fontSize: rem('36px'), lineHeight: rem('44px'), fontWeight: '600', }, h2: { fontSize: rem('30px'), lineHeight: rem('38px'), fontWeight: '600', }, h3: { fontSize: rem('24px'), lineHeight: rem('32px'), fontWeight: '600', }, h4: { fontSize: rem('20px'), lineHeight: rem('30px'), fontWeight: '600', }, }, }, shadows: { xs: '0 1px 2px rgba(0, 0, 0, 0.05)', sm: '0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06)', md: '0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06)', lg: '0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05)', xl: '0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04)', xxl: '0 25px 50px rgba(0, 0, 0, 0.25)', }, cursorType: 'pointer', other: { style: 'shadcn', }, components: { Container: Container.extend({ vars: (_, { size, fluid }) => ({ root: { '--container-size': fluid ? '100%' : size !== undefined && size in CONTAINER_SIZES ? CONTAINER_SIZES[size] : rem(size), }, }), }), Checkbox: Checkbox.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--checkbox-color': colorKey ? `var(--mantine-color-${colorKey}-filled)` : 'var(--mantine-primary-color-filled)', '--checkbox-icon-color': colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)', }, }; }, }), Chip: Chip.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const variant = props.variant ?? 'filled'; return { root: { '--chip-bg': variant !== 'light' ? colorKey ? `var(--mantine-color-${colorKey}-filled)` : 'var(--mantine-primary-color-filled)' : undefined, '--chip-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : undefined, }, }; }, }), Radio: Radio.extend({ vars: (theme, props) => ({ root: { '--radio-color': props.color ? Object.keys(theme.colors).includes(props.color) ? `var(--mantine-color-${props.color}-filled)` : props.color : 'var(--mantine-primary-color-filled)', '--radio-icon-color': props.color ? Object.keys(theme.colors).includes(props.color) ? `var(--mantine-color-${props.color}-contrast)` : props.color : 'var(--mantine-primary-color-contrast)', }, }), }), SegmentedControl: SegmentedControl.extend({ vars: (theme, props) => ({ root: { '--sc-color': props.color ? Object.keys(theme.colors).includes(props.color) ? ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(props.color) ? 'var(--mantine-color-body)' : `var(--mantine-color-${props.color}-filled)` : props.color : 'var(--mantine-color-default)', }, }), }), Switch: Switch.extend({ styles: () => ({ thumb: { backgroundColor: 'var(--mantine-color-default)', borderColor: 'var(--mantine-color-default-border)', }, track: { borderColor: 'var(--mantine-color-default-border)', }, }), }), Select: Select.extend({ defaultProps: { checkIconPosition: 'right', }, }), ActionIcon: ActionIcon.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'filled'; return { root: { '--ai-color': (() => { if (variant === 'filled') { if (colorKey) { return `var(--mantine-color-${colorKey}-contrast)`; } return 'var(--mantine-primary-color-contrast)'; } if (variant === 'white') { if (isNeutralColor || isNeutralPrimaryColor) { return 'var(--mantine-color-black)'; } return undefined; } return undefined; })(), }, }; }, }), Button: Button.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'filled'; return { root: { '--button-color': (() => { if (variant === 'filled') { if (colorKey) { return `var(--mantine-color-${colorKey}-contrast)`; } return 'var(--mantine-primary-color-contrast)'; } if (variant === 'white') { if (isNeutralColor || isNeutralPrimaryColor) { return 'var(--mantine-color-black)'; } return undefined; } return undefined; })(), }, }; }, }), Anchor: Anchor.extend({ defaultProps: { underline: 'always', }, }), NavLink: NavLink.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const variant = props.variant ?? 'light'; return { root: { '--nl-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : undefined, }, children: {}, }; }, }), Pagination: Pagination.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--pagination-active-color': colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)', }, }; }, }), Stepper: Stepper.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--stepper-icon-color': colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)', }, }; }, }), Alert: Alert.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'light'; return { root: { '--alert-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : variant === 'white' ? isNeutralColor || isNeutralPrimaryColor ? 'var(--mantine-color-black)' : undefined : undefined, }, }; }, }), Dialog: Dialog.extend({ defaultProps: { withBorder: true, }, }), Tooltip: Tooltip.extend({ vars: () => ({ tooltip: { '--tooltip-bg': 'var(--mantine-color-primary-color-filled)', '--tooltip-color': 'var(--mantine-color-primary-color-contrast)', }, }), }), Avatar: Avatar.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'light'; return { root: { '--avatar-bg': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-filled)` : 'var(--mantine-primary-color-filled)' : variant === 'light' ? colorKey ? `var(--mantine-color-${colorKey}-light)` : 'var(--mantine-primary-color-light)' : undefined, '--avatar-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : variant === 'light' ? colorKey ? `var(--mantine-color-${colorKey}-light-color)` : 'var(--mantine-primary-color-light-color)' : variant === 'white' ? isNeutralColor || isNeutralPrimaryColor ? 'var(--mantine-color-black)' : colorKey ? `var(--mantine-color-${colorKey}-outline)` : 'var(--mantine-primary-color-filled)' : variant === 'outline' || variant === 'transparent' ? colorKey ? `var(--mantine-color-${colorKey}-outline)` : 'var(--mantine-primary-color-filled)' : undefined, '--avatar-bd': variant === 'outline' ? colorKey ? `1px solid var(--mantine-color-${colorKey}-outline)` : '1px solid var(--mantine-primary-color-filled)' : undefined, }, }; }, }), Badge: Badge.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'filled'; return { root: { '--badge-bg': variant === 'filled' && colorKey ? `var(--mantine-color-${colorKey}-filled)` : undefined, '--badge-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : variant === 'white' ? isNeutralColor || isNeutralPrimaryColor ? 'var(--mantine-color-black)' : undefined : undefined, }, }; }, }), Card: Card.extend({ defaultProps: { p: 'xl', shadow: 'xl', withBorder: true, }, styles: (theme) => { return { root: { backgroundColor: theme.primaryColor === 'rose' || theme.primaryColor === 'green' ? 'var(--mantine-color-secondary-filled)' : undefined, }, }; }, }), Indicator: Indicator.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--indicator-text-color': colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)', }, }; }, }), ThemeIcon: ThemeIcon.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); const isNeutralPrimaryColor = !colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(theme.primaryColor); const variant = props.variant ?? 'filled'; return { root: { '--ti-color': variant === 'filled' ? colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)' : variant === 'white' ? isNeutralColor || isNeutralPrimaryColor ? 'var(--mantine-color-black)' : undefined : undefined, }, }; }, }), Timeline: Timeline.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--tl-icon-color': colorKey ? `var(--mantine-color-${colorKey}-contrast)` : 'var(--mantine-primary-color-contrast)', }, }; }, }), Blockquote: Blockquote.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : undefined; return { root: { '--bq-bg-dark': colorKey ? `var(--mantine-color-${colorKey}-light)` : 'var(--mantine-primary-color-light)', '--bq-bg-light': colorKey ? `var(--mantine-color-${colorKey}-light)` : 'var(--mantine-primary-color-light)', }, }; }, }), Mark: Mark.extend({ vars: (theme, props) => { const colorKey = props.color && Object.keys(theme.colors).includes(props.color) ? props.color : 'yellow'; const isNeutralColor = colorKey && ['zinc', 'slate', 'gray', 'neutral', 'stone'].includes(colorKey); return { root: { '--mark-bg-light': `var(--mantine-color-${colorKey}-${isNeutralColor ? '3' : 'filled-hover'})`, '--mark-bg-dark': `var(--mantine-color-${colorKey}-filled)`, }, }; }, }), Paper: Paper.extend({ defaultProps: { shadow: 'xl', }, }), }, }); export const theme = shadcnTheme; ================================================ FILE: dashboard/src/types.ts ================================================ // Copyright (c) Microsoft. All rights reserved. // This file should sync with agentlightning/types/core.py export type RolloutStatus = 'queuing' | 'preparing' | 'running' | 'failed' | 'succeeded' | 'cancelled' | 'requeuing'; export type AttemptStatus = 'preparing' | 'running' | 'failed' | 'succeeded' | 'unresponsive' | 'timeout'; export type RolloutMode = 'train' | 'val' | 'test'; export type TaskInput = any; export type Timestamp = number; /** * Synced with agentlightning.types.core.Attempt * with camel case and snake case conversions */ export type Attempt = { rolloutId: string; attemptId: string; sequenceId: number; startTime: Timestamp; endTime: Timestamp | null; status: AttemptStatus; workerId: string | null; lastHeartbeatTime: Timestamp | null; metadata: Record | null; }; export type WorkerStatus = 'idle' | 'busy' | 'unknown'; /** * Synced with agentlightning.types.core.Worker * with camel case and snake case conversions */ export type Worker = { workerId: string; status: WorkerStatus; heartbeatStats: Record | null; lastHeartbeatTime: Timestamp | null; lastDequeueTime: Timestamp | null; lastBusyTime: Timestamp | null; lastIdleTime: Timestamp | null; currentRolloutId: string | null; currentAttemptId: string | null; }; /** * Synced with agentlightning.types.core.Rollout * with camel case and snake case conversions * * The `attempt` field is from `AttemptedRollout` class, * which is the latest attempt of the rollout, if any. */ export type Rollout = { rolloutId: string; input: TaskInput; startTime: Timestamp; endTime: Timestamp | null; mode: RolloutMode | null; resourcesId: string | null; status: RolloutStatus; config: Record; metadata: Record | null; attempt: Attempt | null; }; export type Resource = Record; /** * Synced with agentlightning.types.resources.Resources * with camel case and snake case conversions */ export type Resources = { resourcesId: string; version: number; createTime: Timestamp; updateTime: Timestamp; resources: Record; }; /** * Paginated response structure matching the Python server's PaginatedResponse */ export type PaginatedResponse = { items: T[]; limit: number; offset: number; total: number; }; /** * Synced with agentlightning.types.traces.Span * with camel case and snake case conversions */ export type Span = { rolloutId: string; attemptId: string; sequenceId: number; traceId: string; spanId: string; parentId: string | null; name: string; status: { status_code: 'UNSET' | 'OK' | 'ERROR'; description: string | null }; attributes: Record; startTime: Timestamp; endTime: Timestamp; // The fields below are less frequently used events: any; links: any; context: any; parent: any; resource: any; }; // Configs like server connection export type Config = { baseUrl: string; // e.g. http://localhost:8000 autoRefreshMs: number; // polling/refresh interval theme: 'light' | 'dark'; }; export type ThemePreference = 'light' | 'dark' | 'system'; export type ConfigState = { baseUrl: string; autoRefreshMs: number; theme: ThemePreference; }; ================================================ FILE: dashboard/src/utils/error.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Derive a human readable descriptor for an RTK Query-style error object. * Normalises common timeout representations to "Timeout" so the UI can surface a friendly label. */ export function getErrorDescriptor(error: unknown): string | null { if (!error || typeof error !== 'object') { return null; } const record = error as Record; const statusValue = record.status; const statusString = typeof statusValue === 'number' || typeof statusValue === 'string' ? String(statusValue) : null; const data = record.data; let detail: string | null = null; if (data && typeof data === 'object') { const dataRecord = data as Record; const rawDetail = dataRecord.detail ?? dataRecord.message; if (typeof rawDetail === 'string') { detail = rawDetail; } } const messageValue = record.message; const errorValue = record.error; const nestedErrorMessage = errorValue && typeof errorValue === 'object' && 'message' in (errorValue as Record) ? (errorValue as Record).message : null; const directMessage = typeof messageValue === 'string' ? messageValue : typeof nestedErrorMessage === 'string' ? nestedErrorMessage : typeof errorValue === 'string' ? errorValue : null; const looksLikeTimeout = (value: string | null) => typeof value === 'string' && value.toLowerCase().includes('timeout'); if (statusString === '408' || statusString === '504') { return 'Timeout'; } if (looksLikeTimeout(detail)) { return 'Timeout'; } if (looksLikeTimeout(directMessage)) { return 'Timeout'; } if (detail && detail.trim().length > 0) { return detail; } if (directMessage && directMessage.trim().length > 0) { return directMessage; } if (statusString) { return `status: ${statusString}`; } return null; } ================================================ FILE: dashboard/src/utils/format.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import dayjs from 'dayjs'; export function toTimestamp(value: unknown): number | null { if (typeof value !== 'number' || Number.isNaN(value)) { return null; } return value; } export function clampToNow(start: number | null, end: number | null): number | null { if (start == null) { return null; } const effectiveEnd = end ?? Date.now() / 1000; const diff = effectiveEnd - start; return diff > 0 ? diff : 0; } export function formatDateTime(timestamp: number | null): string { if (timestamp == null) { return '—'; } return dayjs(timestamp * 1000).format('YYYY-MM-DD HH:mm:ss'); } export function formatDateTimeWithMilliseconds(timestamp: number | null): string { if (timestamp == null) { return '—'; } return dayjs(timestamp * 1000).format('YYYY-MM-DD HH:mm:ss.SSS'); } export function formatDuration(seconds: number | null): string { if (seconds == null) { return '—'; } const total = Math.floor(seconds); if (total <= 0) { return '—'; } const hours = Math.floor(total / 3600); const minutes = Math.floor((total % 3600) / 60); const secs = total % 60; const parts: string[] = []; if (hours > 0) { parts.push(`${hours}h`); } if (minutes > 0) { parts.push(`${minutes}m`); } if (secs > 0 || parts.length === 0) { parts.push(`${secs}s`); } return parts.join(' '); } export function formatRelativeTime(timestamp: number | null): string { if (timestamp == null) { return '—'; } const now = Date.now() / 1000; const diff = Math.floor(now - timestamp); if (diff <= 5) { return 'Just now'; } return `${formatDuration(diff)} ago`; } export function formatStatusLabel(status: string): string { return status .replace(/[_-]/g, ' ') .toLowerCase() .replace(/^\w|\s\w/g, (match) => match.toUpperCase()); } export function formatInputPreview(input: unknown, maxLength = 35): { preview: string; full: string } { if (input === null || input === undefined) { return { preview: '—', full: '—' }; } const serialized = typeof input === 'string' ? input : safeStringify(input); if (serialized.length <= maxLength) { return { preview: serialized, full: serialized }; } return { preview: `${serialized.slice(0, maxLength - 3)}...`, full: serialized }; } export function safeStringify(value: unknown): string { try { return JSON.stringify(value); } catch { return String(value); } } const isPlainObject = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value); const toCamelCaseKey = (key: string) => key.replace(/_([a-z])/g, (_match, letter: string) => letter.toUpperCase()); const toSnakeCaseKey = (key: string) => key .replace(/([A-Z])/g, '_$1') .replace(/[-\s]+/g, '_') .toLowerCase(); export const camelCaseKeys = (value: T): T => { if (Array.isArray(value)) { return value.map((item) => camelCaseKeys(item)) as unknown as T; } if (isPlainObject(value)) { const entries = Object.entries(value).map(([key, item]) => [toCamelCaseKey(key), camelCaseKeys(item)]); return Object.fromEntries(entries) as T; } return value; }; export const snakeCaseKeys = (value: T): T => { if (Array.isArray(value)) { return value.map((item) => snakeCaseKeys(item)) as unknown as T; } if (isPlainObject(value)) { const entries = Object.entries(value).map(([key, item]) => [toSnakeCaseKey(key), snakeCaseKeys(item)]); return Object.fromEntries(entries) as T; } return value; }; ================================================ FILE: dashboard/src/utils/mock.test.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Tests for mock API handlers. * * These tests verify that the mock implementation behaves consistently with * the Python server in agentlightning/store/client_server.py. */ import { describe, expect, it } from 'vitest'; import type { Attempt, Resources, Rollout, Span, Worker } from '@/types'; import { buildAttemptsResponse, buildResourcesResponse, buildRolloutsResponse, buildSpansResponse, buildWorkersResponse, createMockHandlers, createResourcesHandlers, createRolloutsHandlers, createSpansHandlers, createWorkersHandlers, filterResourcesForParams, filterRolloutsForParams, filterSpansForParams, filterWorkersForParams, getResourcesSortValue, getRolloutSortValue, getSpanSortValue, getWorkerSortValue, parseNumberParam, sortAttemptsForParams, sortResourcesForParams, sortRolloutsForParams, sortSpansForParams, sortWorkersForParams, } from './mock'; const now = Math.floor(Date.now() / 1000); const sampleRollouts: Rollout[] = [ { rolloutId: 'ro-001', input: { task: 'Test 1' }, status: 'running', mode: 'train', resourcesId: 'rs-100', startTime: now - 1000, endTime: null, attempt: { rolloutId: 'ro-001', attemptId: 'at-001', sequenceId: 1, status: 'running', startTime: now - 1000, endTime: null, workerId: 'worker-1', lastHeartbeatTime: now - 10, metadata: null, }, config: {}, metadata: null, }, { rolloutId: 'ro-002', input: { task: 'Test 2' }, status: 'succeeded', mode: 'val', resourcesId: 'rs-101', startTime: now - 2000, endTime: now - 1500, attempt: { rolloutId: 'ro-002', attemptId: 'at-002', sequenceId: 1, status: 'succeeded', startTime: now - 2000, endTime: now - 1500, workerId: 'worker-2', lastHeartbeatTime: now - 1500, metadata: null, }, config: {}, metadata: null, }, { rolloutId: 'ro-003', input: { task: 'Test 3' }, status: 'failed', mode: 'test', resourcesId: null, startTime: now - 3000, endTime: now - 2500, attempt: { rolloutId: 'ro-003', attemptId: 'at-003', sequenceId: 1, status: 'failed', startTime: now - 3000, endTime: now - 2500, workerId: 'worker-3', lastHeartbeatTime: now - 2500, metadata: null, }, config: {}, metadata: null, }, ]; const sampleAttempts: Attempt[] = [ { rolloutId: 'ro-001', attemptId: 'at-001', sequenceId: 1, status: 'running', startTime: now - 1000, endTime: null, workerId: 'worker-1', lastHeartbeatTime: now - 10, metadata: null, }, { rolloutId: 'ro-001', attemptId: 'at-002', sequenceId: 2, status: 'failed', startTime: now - 900, endTime: now - 800, workerId: 'worker-1', lastHeartbeatTime: now - 800, metadata: null, }, { rolloutId: 'ro-001', attemptId: 'at-003', sequenceId: 3, status: 'running', startTime: now - 700, endTime: null, workerId: 'worker-2', lastHeartbeatTime: now - 5, metadata: null, }, ]; const sampleSpans: Span[] = [ { rolloutId: 'ro-001', attemptId: 'at-001', sequenceId: 1, traceId: 'tr-001', spanId: 'sp-001', parentId: null, name: 'Initialize', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 1000, endTime: now - 950, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-001', attemptId: 'at-001', sequenceId: 2, traceId: 'tr-001', spanId: 'sp-002', parentId: 'sp-001', name: 'Process', status: { status_code: 'OK', description: null }, attributes: {}, startTime: now - 950, endTime: now - 900, events: [], links: [], context: {}, parent: null, resource: {}, }, { rolloutId: 'ro-001', attemptId: 'at-001', sequenceId: 3, traceId: 'tr-002', spanId: 'sp-003', parentId: null, name: 'Finalize', status: { status_code: 'ERROR', description: 'Failed' }, attributes: {}, startTime: now - 850, endTime: now - 800, events: [], links: [], context: {}, parent: null, resource: {}, }, ]; const sampleResources: Resources[] = [ { resourcesId: 'rs-001', version: 2, createTime: now - 400, updateTime: now - 200, resources: { config: { learning_rate: 0.01 } }, }, { resourcesId: 'rs-002', version: 3, createTime: now - 300, updateTime: now - 100, resources: { config: { learning_rate: 0.001 } }, }, { resourcesId: 'rs-003', version: 1, createTime: now - 200, updateTime: now - 50, resources: { config: { learning_rate: 0.1 } }, }, ]; const sampleWorkers: Worker[] = [ { workerId: 'worker-alpha', status: 'busy', heartbeatStats: { queueDepth: 2 }, lastHeartbeatTime: now - 30, lastDequeueTime: now - 300, lastBusyTime: now - 60, lastIdleTime: now - 600, currentRolloutId: 'ro-001', currentAttemptId: 'at-001', }, { workerId: 'worker-beta', status: 'idle', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 120, lastDequeueTime: now - 1200, lastBusyTime: now - 3600, lastIdleTime: now - 180, currentRolloutId: null, currentAttemptId: null, }, { workerId: 'worker-gamma', status: 'busy', heartbeatStats: null, lastHeartbeatTime: now - 10, lastDequeueTime: now - 60, lastBusyTime: now - 20, lastIdleTime: now - 4000, currentRolloutId: 'ro-003', currentAttemptId: 'at-003', }, { workerId: 'worker-delta', status: 'unknown', heartbeatStats: { queueDepth: 0 }, lastHeartbeatTime: now - 5, lastDequeueTime: now - 80, lastBusyTime: null, lastIdleTime: null, currentRolloutId: null, currentAttemptId: null, }, ]; describe('parseNumberParam', () => { it('returns default value when param is missing', () => { const params = new URLSearchParams(); expect(parseNumberParam(params, 'limit', 10)).toBe(10); }); it('parses valid number', () => { const params = new URLSearchParams('limit=25'); expect(parseNumberParam(params, 'limit', 10)).toBe(25); }); it('returns default for invalid number', () => { const params = new URLSearchParams('limit=invalid'); expect(parseNumberParam(params, 'limit', 10)).toBe(10); }); it('returns default for NaN', () => { const params = new URLSearchParams('limit=NaN'); expect(parseNumberParam(params, 'limit', 10)).toBe(10); }); it('handles negative numbers', () => { const params = new URLSearchParams('offset=-1'); expect(parseNumberParam(params, 'offset', 0)).toBe(-1); }); }); describe('filterRolloutsForParams', () => { it('returns all rollouts when no filters are provided', () => { const params = new URLSearchParams(); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(3); }); it('filters by single status', () => { const params = new URLSearchParams('status_in=running'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(1); expect(result[0].status).toBe('running'); }); it('filters by multiple statuses', () => { const params = new URLSearchParams(); params.append('status_in', 'running'); params.append('status_in', 'succeeded'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(2); }); it('filters by mode', () => { const params = new URLSearchParams(); params.append('mode_in', 'train'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(1); expect(result[0].mode).toBe('train'); }); it('filters by rollout_id_contains', () => { const params = new URLSearchParams('rollout_id_contains=002'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(1); expect(result[0].rolloutId).toBe('ro-002'); }); it('applies multiple filters together', () => { const params = new URLSearchParams(); params.append('status_in', 'running'); params.append('mode_in', 'train'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result).toHaveLength(1); expect(result[0].rolloutId).toBe('ro-001'); }); it('supports filter_logic=or across filters', () => { const params = new URLSearchParams(); params.append('status_in', 'failed'); params.append('mode_in', 'train'); params.set('filter_logic', 'or'); const result = filterRolloutsForParams(sampleRollouts, params); expect(result.map((r) => r.rolloutId).sort()).toEqual(['ro-001', 'ro-003']); }); }); describe('getRolloutSortValue', () => { const rollout = sampleRollouts[0]; it('returns rollout_id for rollout_id sort', () => { expect(getRolloutSortValue(rollout, 'rollout_id')).toBe('ro-001'); }); it('returns status for status sort', () => { expect(getRolloutSortValue(rollout, 'status')).toBe('running'); }); it('returns mode for mode sort', () => { expect(getRolloutSortValue(rollout, 'mode')).toBe('train'); }); it('returns empty string for null mode', () => { const rolloutWithoutMode = { ...rollout, mode: null }; expect(getRolloutSortValue(rolloutWithoutMode, 'mode')).toBe(''); }); it('returns start_time as default', () => { expect(getRolloutSortValue(rollout, 'unknown_field')).toBe(now - 1000); }); it('falls back to rollout.startTime when attempt is null', () => { const rolloutWithoutAttempt = { ...rollout, attempt: null }; expect(getRolloutSortValue(rolloutWithoutAttempt, 'start_time')).toBe(now - 1000); }); }); describe('sortRolloutsForParams', () => { it('sorts by start_time ascending by default', () => { const result = sortRolloutsForParams(sampleRollouts, null, 'asc'); expect(result[0].rolloutId).toBe('ro-003'); expect(result[2].rolloutId).toBe('ro-001'); }); it('sorts by start_time descending', () => { const result = sortRolloutsForParams(sampleRollouts, 'start_time', 'desc'); expect(result[0].rolloutId).toBe('ro-001'); expect(result[2].rolloutId).toBe('ro-003'); }); it('sorts by rollout_id ascending', () => { const result = sortRolloutsForParams(sampleRollouts, 'rollout_id', 'asc'); expect(result[0].rolloutId).toBe('ro-001'); expect(result[2].rolloutId).toBe('ro-003'); }); it('sorts by status', () => { const result = sortRolloutsForParams(sampleRollouts, 'status', 'asc'); expect(result[0].status).toBe('failed'); expect(result[1].status).toBe('running'); expect(result[2].status).toBe('succeeded'); }); it('handles null values in sorting', () => { const rolloutsWithNull: Rollout[] = [{ ...sampleRollouts[0], attempt: null, startTime: 0 }, sampleRollouts[1]]; const result = sortRolloutsForParams(rolloutsWithNull, 'start_time', 'asc'); expect(result[0].attempt).toBeNull(); }); }); describe('buildRolloutsResponse', () => { it('returns all rollouts with default pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(3); expect(response.total).toBe(3); expect(response.limit).toBe(3); expect(response.offset).toBe(0); }); it('applies limit pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts?limit=2'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(2); expect(response.limit).toBe(2); expect(response.total).toBe(3); }); it('applies offset pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts?offset=1'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(2); expect(response.offset).toBe(1); }); it('applies limit and offset together', () => { const request = new Request('http://localhost/v1/agl/rollouts?limit=1&offset=1'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(1); expect(response.limit).toBe(1); expect(response.offset).toBe(1); }); it('handles negative limit (returns all)', () => { const request = new Request('http://localhost/v1/agl/rollouts?limit=-1'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(3); expect(response.limit).toBe(3); }); it('applies filtering before pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts?status_in=running&limit=10'); const response = buildRolloutsResponse(sampleRollouts, request); expect(response.items).toHaveLength(1); expect(response.total).toBe(1); }); it('applies sorting before pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts?sort_by=rollout_id&sort_order=desc&limit=1'); const response = buildRolloutsResponse(sampleRollouts, request); const items = response.items as Array>; expect(items[0].rollout_id).toBe('ro-003'); }); it('uses snake_case keys in response', () => { const request = new Request('http://localhost/v1/agl/rollouts'); const response = buildRolloutsResponse(sampleRollouts, request); const items = response.items as Array>; expect(items[0]).toHaveProperty('rollout_id'); expect(items[0]).toHaveProperty('start_time'); expect(items[0]).not.toHaveProperty('rolloutId'); }); }); describe('sortAttemptsForParams', () => { it('sorts by sequence_id ascending by default', () => { const result = sortAttemptsForParams(sampleAttempts, null, 'asc'); expect(result[0].sequenceId).toBe(1); expect(result[2].sequenceId).toBe(3); }); it('sorts by sequence_id descending', () => { const result = sortAttemptsForParams(sampleAttempts, 'sequence_id', 'desc'); expect(result[0].sequenceId).toBe(3); expect(result[2].sequenceId).toBe(1); }); it('sorts by start_time', () => { const result = sortAttemptsForParams(sampleAttempts, 'start_time', 'asc'); expect(result[0].startTime).toBe(now - 1000); expect(result[2].startTime).toBe(now - 700); }); }); describe('buildAttemptsResponse', () => { it('returns all attempts with default pagination', () => { const request = new Request('http://localhost/v1/agl/rollouts/ro-001/attempts'); const response = buildAttemptsResponse(sampleAttempts, request); expect(response.items).toHaveLength(3); expect(response.total).toBe(3); }); it('applies pagination correctly', () => { const request = new Request('http://localhost/v1/agl/rollouts/ro-001/attempts?limit=2&offset=1'); const response = buildAttemptsResponse(sampleAttempts, request); expect(response.items).toHaveLength(2); expect(response.offset).toBe(1); }); it('sorts before paginating', () => { const request = new Request( 'http://localhost/v1/agl/rollouts/ro-001/attempts?sort_by=sequence_id&sort_order=desc&limit=1', ); const response = buildAttemptsResponse(sampleAttempts, request); const items = response.items as Array>; expect(items[0].sequence_id).toBe(3); }); }); describe('filterSpansForParams', () => { it('returns all spans when no filters are provided', () => { const params = new URLSearchParams(); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(3); }); it('filters by trace_id_contains', () => { const params = new URLSearchParams('trace_id_contains=tr-001'); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(2); }); it('filters by span_id_contains', () => { const params = new URLSearchParams('span_id_contains=sp-003'); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(1); expect(result[0].spanId).toBe('sp-003'); }); it('filters by name_contains (case insensitive)', () => { const params = new URLSearchParams('name_contains=INIT'); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(1); expect(result[0].name).toBe('Initialize'); }); it('applies multiple filters together', () => { const params = new URLSearchParams(); params.set('trace_id_contains', 'tr-001'); params.set('name_contains', 'Process'); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(1); expect(result[0].name).toBe('Process'); }); it('supports filter_logic=or for spans', () => { const params = new URLSearchParams(); params.set('trace_id_contains', 'tr-001'); params.set('name_contains', 'Finalize'); params.set('filter_logic', 'or'); const result = filterSpansForParams(sampleSpans, params); expect(result).toHaveLength(3); }); }); describe('getSpanSortValue', () => { const span = sampleSpans[0]; it('returns trace_id for trace_id sort', () => { expect(getSpanSortValue(span, 'trace_id')).toBe('tr-001'); }); it('returns span_id for span_id sort', () => { expect(getSpanSortValue(span, 'span_id')).toBe('sp-001'); }); it('returns parent_id for parent_id sort', () => { expect(getSpanSortValue(sampleSpans[1], 'parent_id')).toBe('sp-001'); }); it('returns empty string for null parent_id', () => { expect(getSpanSortValue(span, 'parent_id')).toBe(''); }); it('returns name for name sort', () => { expect(getSpanSortValue(span, 'name')).toBe('Initialize'); }); it('returns status_code for status_code sort', () => { expect(getSpanSortValue(span, 'status_code')).toBe('OK'); }); it('calculates duration', () => { const duration = getSpanSortValue(span, 'duration'); expect(duration).toBe(50); }); it('returns null duration when times are missing', () => { const spanWithoutEnd: Span = { ...span, endTime: now - 950 }; expect(getSpanSortValue(spanWithoutEnd, 'duration')).toBe(50); }); it('returns start_time as default', () => { expect(getSpanSortValue(span, 'unknown_field')).toBe(now - 1000); }); }); describe('sortSpansForParams', () => { it('sorts by start_time ascending by default', () => { const result = sortSpansForParams(sampleSpans, null, 'asc'); expect(result[0].spanId).toBe('sp-001'); expect(result[2].spanId).toBe('sp-003'); }); it('sorts by name', () => { const result = sortSpansForParams(sampleSpans, 'name', 'asc'); expect(result[0].name).toBe('Finalize'); expect(result[2].name).toBe('Process'); }); it('sorts by duration', () => { const result = sortSpansForParams(sampleSpans, 'duration', 'desc'); // All spans have duration of 50, so we just check that sorting works expect(result[0].endTime! - result[0].startTime!).toBe(50); }); }); describe('buildSpansResponse', () => { const spansByAttempt = { 'ro-001:at-001': sampleSpans, }; it('returns empty when rollout_id is missing', () => { const request = new Request('http://localhost/v1/agl/spans'); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(0); expect(response.total).toBe(0); }); it('returns spans for rollout and attempt', () => { const request = new Request('http://localhost/v1/agl/spans?rollout_id=ro-001&attempt_id=at-001'); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(3); expect(response.total).toBe(3); }); it('handles missing attempt_id', () => { const request = new Request('http://localhost/v1/agl/spans?rollout_id=ro-001'); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(0); }); it('applies filtering', () => { const request = new Request( 'http://localhost/v1/agl/spans?rollout_id=ro-001&attempt_id=at-001&trace_id_contains=tr-001', ); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(2); }); it('applies sorting and pagination', () => { const request = new Request( 'http://localhost/v1/agl/spans?rollout_id=ro-001&attempt_id=at-001&sort_by=name&limit=2', ); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(2); const items = response.items as Span[]; expect(items[0].name).toBe('Finalize'); }); it('supports filter_logic=or in responses', () => { const request = new Request( 'http://localhost/v1/agl/spans?rollout_id=ro-001&attempt_id=at-001&trace_id_contains=tr-001&name_contains=Finalize&filter_logic=or', ); const response = buildSpansResponse(spansByAttempt, request); expect(response.items).toHaveLength(3); }); }); describe('filterResourcesForParams', () => { it('returns all resources when no filter is applied', () => { const params = new URLSearchParams(); const result = filterResourcesForParams(sampleResources, params); expect(result).toHaveLength(3); }); it('filters resources by resources_id_contains', () => { const params = new URLSearchParams('resources_id_contains=002'); const result = filterResourcesForParams(sampleResources, params); expect(result).toHaveLength(1); expect(result[0].resourcesId).toBe('rs-002'); }); }); describe('getResourcesSortValue', () => { const resource = sampleResources[0]; it('returns resources_id value', () => { expect(getResourcesSortValue(resource, 'resources_id')).toBe('rs-001'); }); it('returns version value', () => { expect(getResourcesSortValue(resource, 'version')).toBe(2); }); it('returns create_time value', () => { expect(getResourcesSortValue(resource, 'create_time')).toBe(now - 400); }); it('returns update_time for unknown sort keys', () => { expect(getResourcesSortValue(resource, 'unknown')).toBe(now - 200); }); }); describe('sortResourcesForParams', () => { it('sorts by update_time ascending by default', () => { const result = sortResourcesForParams(sampleResources, null, 'asc'); expect(result[0].resourcesId).toBe('rs-001'); expect(result[2].resourcesId).toBe('rs-003'); }); it('sorts by update_time descending', () => { const result = sortResourcesForParams(sampleResources, 'update_time', 'desc'); expect(result[0].resourcesId).toBe('rs-003'); expect(result[2].resourcesId).toBe('rs-001'); }); it('sorts by version', () => { const result = sortResourcesForParams(sampleResources, 'version', 'asc'); expect(result[0].version).toBe(1); expect(result[2].version).toBe(3); }); }); describe('buildResourcesResponse', () => { it('returns paginated resources with defaults', () => { const request = new Request('http://localhost/v1/agl/resources'); const response = buildResourcesResponse(sampleResources, request); expect(response.items).toHaveLength(3); expect(response.offset).toBe(0); expect(response.limit).toBe(3); expect(response.total).toBe(3); }); it('applies filter before pagination', () => { const request = new Request('http://localhost/v1/agl/resources?resources_id_contains=003'); const response = buildResourcesResponse(sampleResources, request); expect(response.items).toHaveLength(1); const items = response.items as Array>; expect(items[0].resources_id).toBe('rs-003'); }); it('applies sort order and pagination parameters', () => { const request = new Request('http://localhost/v1/agl/resources?sort_by=version&sort_order=desc&limit=1&offset=1'); const response = buildResourcesResponse(sampleResources, request); expect(response.items).toHaveLength(1); expect(response.offset).toBe(1); const items = response.items as Array>; expect(items[0].version).toBe(2); }); }); describe('createResourcesHandlers', () => { it('creates handler for resources endpoint', () => { const handlers = createResourcesHandlers(sampleResources); expect(handlers).toHaveLength(1); expect(handlers[0].info.header).toContain('GET'); }); }); describe('filterWorkersForParams', () => { it('returns all workers without filters', () => { const params = new URLSearchParams(); const result = filterWorkersForParams(sampleWorkers, params); expect(result).toHaveLength(4); }); it('filters by status and worker ID substring using AND logic', () => { const params = new URLSearchParams('status_in=busy&worker_id_contains=gamma'); const result = filterWorkersForParams(sampleWorkers, params); expect(result).toHaveLength(1); expect(result[0].workerId).toBe('worker-gamma'); }); it('supports filter_logic=or', () => { const params = new URLSearchParams('status_in=idle&worker_id_contains=gamma&filter_logic=or'); const result = filterWorkersForParams(sampleWorkers, params); expect(result).toHaveLength(2); }); it('filters by unknown status', () => { const params = new URLSearchParams('status_in=unknown'); const result = filterWorkersForParams(sampleWorkers, params); expect(result).toHaveLength(1); expect(result[0].workerId).toBe('worker-delta'); }); }); describe('getWorkerSortValue', () => { const worker = sampleWorkers[0]; it('returns worker_id', () => { expect(getWorkerSortValue(worker, 'worker_id')).toBe('worker-alpha'); }); it('returns status', () => { expect(getWorkerSortValue(worker, 'status')).toBe('busy'); }); it('returns timestamp fields', () => { expect(getWorkerSortValue(worker, 'last_busy_time')).toBe(worker.lastBusyTime); expect(getWorkerSortValue(worker, 'last_idle_time')).toBe(worker.lastIdleTime); expect(getWorkerSortValue(worker, 'last_dequeue_time')).toBe(worker.lastDequeueTime); }); it('returns rollout and attempt identifiers', () => { expect(getWorkerSortValue(worker, 'current_rollout_id')).toBe(worker.currentRolloutId); expect(getWorkerSortValue(worker, 'current_attempt_id')).toBe(worker.currentAttemptId); }); it('falls back to last_heartbeat_time', () => { expect(getWorkerSortValue(worker, 'unknown')).toBe(worker.lastHeartbeatTime); }); }); describe('sortWorkersForParams', () => { it('sorts by last heartbeat ascending by default', () => { const result = sortWorkersForParams(sampleWorkers, null, 'asc'); expect(result.map((worker) => worker.workerId)).toEqual([ 'worker-beta', 'worker-alpha', 'worker-gamma', 'worker-delta', ]); }); it('sorts descending by worker_id when requested', () => { const result = sortWorkersForParams(sampleWorkers, 'worker_id', 'desc'); expect(result.map((worker) => worker.workerId)).toEqual([ 'worker-gamma', 'worker-delta', 'worker-beta', 'worker-alpha', ]); }); it('sorts by current_rollout_id', () => { const result = sortWorkersForParams(sampleWorkers, 'current_rollout_id', 'asc'); expect(result.map((worker) => worker.currentRolloutId)).toEqual([null, null, 'ro-001', 'ro-003']); }); }); describe('buildWorkersResponse', () => { it('applies filters before pagination', () => { const request = new Request('http://localhost/v1/agl/workers?worker_id_contains=beta&limit=5'); const response = buildWorkersResponse(sampleWorkers, request); expect(response.items).toHaveLength(1); const items = response.items as Array>; expect(items[0].worker_id).toBe('worker-beta'); }); it('applies sort and pagination parameters', () => { const request = new Request('http://localhost/v1/agl/workers?sort_by=worker_id&limit=2&offset=1'); const response = buildWorkersResponse(sampleWorkers, request); expect(response.items).toHaveLength(2); const items = response.items as Array>; expect(items[0].worker_id).toBe('worker-beta'); expect(response.total).toBe(4); }); }); describe('createWorkersHandlers', () => { it('creates handler for workers endpoint', () => { const handlers = createWorkersHandlers(sampleWorkers); expect(handlers).toHaveLength(1); expect(handlers[0].info.header).toContain('GET'); }); }); describe('createRolloutsHandlers', () => { it('creates handlers that return correct rollout data', async () => { const attemptsByRollout = { 'ro-001': sampleAttempts }; const handlers = createRolloutsHandlers(sampleRollouts, attemptsByRollout); expect(handlers).toHaveLength(2); expect(handlers[0].info.header).toContain('GET'); expect(handlers[1].info.header).toContain('GET'); }); }); describe('createSpansHandlers', () => { it('creates handler for spans endpoint', () => { const spansByAttempt = { 'ro-001:at-001': sampleSpans }; const handlers = createSpansHandlers(spansByAttempt); expect(handlers).toHaveLength(1); expect(handlers[0].info.header).toContain('GET'); }); }); describe('createMockHandlers', () => { it('creates combined handlers for rollouts and attempts', () => { const attemptsByRollout = { 'ro-001': sampleAttempts }; const handlers = createMockHandlers(sampleRollouts, attemptsByRollout); expect(handlers).toHaveLength(2); }); it('includes spans handlers when provided', () => { const attemptsByRollout = { 'ro-001': sampleAttempts }; const spansByAttempt = { 'ro-001:at-001': sampleSpans }; const handlers = createMockHandlers(sampleRollouts, attemptsByRollout, spansByAttempt); expect(handlers).toHaveLength(3); }); it('works without spans handlers', () => { const attemptsByRollout = { 'ro-001': sampleAttempts }; const handlers = createMockHandlers(sampleRollouts, attemptsByRollout); expect(handlers).toHaveLength(2); }); }); ================================================ FILE: dashboard/src/utils/mock.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /** * Mock API handlers for testing and Storybook. * * This module provides utilities for creating MSW (Mock Service Worker) handlers * that simulate the Agent Lightning Store API. The implementation is based on the * actual Python server in agentlightning/store/client_server.py. * The mock covers a useful subset of the server's behavior; when functionality * is missing compared to the Python implementation it is an intentional tradeoff * aimed at keeping the mocks light for UI tests. * * @module mock */ import { delay, http, HttpResponse } from 'msw'; import type { Attempt, Resources, Rollout, Span, Worker } from '@/types'; import { snakeCaseKeys } from './format'; /** * Parse a numeric query parameter with a default value. * Returns the parsed number or the default if parsing fails. */ export function parseNumberParam(params: URLSearchParams, key: string, defaultValue: number): number { const raw = params.get(key); if (raw == null) { return defaultValue; } const value = Number(raw); if (!Number.isFinite(value)) { return defaultValue; } return value; } /** * Filter rollouts based on query parameters. * Supports: status_in, mode_in, rollout_id_contains */ export function filterRolloutsForParams(rollouts: Rollout[], params: URLSearchParams): Rollout[] { const statusFilters = params.getAll('status_in'); const modeFilters = params.getAll('mode_in'); const rolloutIdContains = params.get('rollout_id_contains'); const filterLogic = params.get('filter_logic') === 'or' ? 'or' : 'and'; return rollouts.filter((rollout) => { const checks: boolean[] = []; if (statusFilters.length > 0) { checks.push(statusFilters.includes(rollout.status)); } if (modeFilters.length > 0) { checks.push(rollout.mode != null && modeFilters.includes(rollout.mode)); } if (rolloutIdContains) { checks.push(rollout.rolloutId.includes(rolloutIdContains)); } if (checks.length === 0) { return true; } return filterLogic === 'or' ? checks.some(Boolean) : checks.every(Boolean); }); } /** * Get the sort value for a rollout based on the sort_by field. */ export function getRolloutSortValue(rollout: Rollout, sortBy: string): string | number | null { switch (sortBy) { case 'rollout_id': return rollout.rolloutId; case 'status': return rollout.status; case 'mode': return rollout.mode ?? ''; case 'start_time': default: return rollout.attempt?.startTime ?? rollout.startTime ?? null; } } /** * Sort rollouts based on query parameters. * Default sort_by is 'start_time', default sort_order is 'asc'. */ export function sortRolloutsForParams( rollouts: Rollout[], sortBy: string | null, sortOrder: 'asc' | 'desc', ): Rollout[] { const resolvedSortBy = sortBy ?? 'start_time'; const sorted = [...rollouts].sort((a, b) => { const aValue = getRolloutSortValue(a, resolvedSortBy); const bValue = getRolloutSortValue(b, resolvedSortBy); if (aValue === bValue) { return 0; } if (aValue == null) { return -1; } if (bValue == null) { return 1; } if (typeof aValue === 'number' && typeof bValue === 'number') { return aValue - bValue; } return String(aValue).localeCompare(String(bValue)); }); if (sortOrder === 'desc') { sorted.reverse(); } return sorted; } /** * Build a paginated rollouts response matching the Python server's format. * Applies filtering, sorting, and pagination based on query parameters. */ export function buildRolloutsResponse(rollouts: Rollout[], request: Request): Record { const url = new URL(request.url); const params = url.searchParams; const filtered = filterRolloutsForParams(rollouts, params); const sortBy = params.get('sort_by'); const sortOrder = params.get('sort_order') === 'desc' ? 'desc' : 'asc'; const sorted = sortRolloutsForParams(filtered, sortBy, sortOrder); const limitParam = parseNumberParam(params, 'limit', sorted.length); const offsetParam = parseNumberParam(params, 'offset', 0); const effectiveLimit = limitParam < 0 ? sorted.length : limitParam; const offset = offsetParam < 0 ? 0 : offsetParam; const paginated = effectiveLimit >= 0 ? sorted.slice(offset, offset + effectiveLimit) : [...sorted]; return snakeCaseKeys({ items: paginated, limit: effectiveLimit, offset, total: filtered.length, }); } /** * Sort attempts based on query parameters. * Default sort_by is 'sequence_id', default sort_order is 'asc'. */ export function sortAttemptsForParams( attempts: Attempt[], sortBy: string | null, sortOrder: 'asc' | 'desc', ): Attempt[] { const sorted = [...attempts]; const resolvedSortBy = sortBy ?? 'sequence_id'; sorted.sort((a, b) => { if (resolvedSortBy === 'start_time') { return a.startTime - b.startTime; } return a.sequenceId - b.sequenceId; }); if (sortOrder === 'desc') { sorted.reverse(); } return sorted; } /** * Build a paginated attempts response matching the Python server's format. * Applies sorting and pagination based on query parameters. */ export function buildAttemptsResponse(attempts: Attempt[], request: Request): Record { const url = new URL(request.url); const params = url.searchParams; const sortBy = params.get('sort_by'); const sortOrder = params.get('sort_order') === 'desc' ? 'desc' : 'asc'; const sorted = sortAttemptsForParams(attempts, sortBy, sortOrder); const limitParam = parseNumberParam(params, 'limit', sorted.length); const offsetParam = parseNumberParam(params, 'offset', 0); const effectiveLimit = limitParam < 0 ? sorted.length : limitParam; const offset = offsetParam < 0 ? 0 : offsetParam; const paginated = effectiveLimit >= 0 ? sorted.slice(offset, offset + effectiveLimit) : [...sorted]; return snakeCaseKeys({ items: paginated, limit: effectiveLimit, offset, total: attempts.length, }); } /** * Filter spans based on query parameters. * Supports: trace_id_contains, span_id_contains, name_contains */ export function filterSpansForParams(spans: Span[], params: URLSearchParams): Span[] { const traceContains = params.get('trace_id_contains'); const spanContains = params.get('span_id_contains'); const nameContains = params.get('name_contains'); const filterLogic = params.get('filter_logic') === 'or' ? 'or' : 'and'; return spans.filter((span) => { const checks: boolean[] = []; if (traceContains) { checks.push(span.traceId.includes(traceContains)); } if (spanContains) { checks.push(span.spanId.includes(spanContains)); } if (nameContains) { checks.push(span.name.toLowerCase().includes(nameContains.toLowerCase())); } if (checks.length === 0) { return true; } return filterLogic === 'or' ? checks.some(Boolean) : checks.every(Boolean); }); } /** * Get the sort value for a span based on the sort_by field. */ export function getSpanSortValue(span: Span, sortBy: string): string | number | null { switch (sortBy) { case 'trace_id': return span.traceId; case 'span_id': return span.spanId; case 'parent_id': return span.parentId ?? ''; case 'name': return span.name; case 'status_code': return span.status?.status_code ?? ''; case 'duration': { if (span.startTime != null && span.endTime != null) { return span.endTime - span.startTime; } return null; } case 'start_time': default: return span.startTime ?? null; } } /** * Sort spans based on query parameters. * Default sort_by is 'start_time', default sort_order is 'asc'. */ export function sortSpansForParams(spans: Span[], sortBy: string | null, sortOrder: 'asc' | 'desc'): Span[] { const resolvedSortBy = sortBy ?? 'start_time'; const sorted = [...spans].sort((a, b) => { const aValue = getSpanSortValue(a, resolvedSortBy); const bValue = getSpanSortValue(b, resolvedSortBy); if (aValue === bValue) { return 0; } if (aValue == null) { return -1; } if (bValue == null) { return 1; } if (typeof aValue === 'number' && typeof bValue === 'number') { return aValue - bValue; } return String(aValue).localeCompare(String(bValue)); }); if (sortOrder === 'desc') { sorted.reverse(); } return sorted; } /** * Build a paginated spans response matching the Python server's format. * Applies filtering, sorting, and pagination based on query parameters. */ export function buildSpansResponse(spansByAttempt: Record, request: Request): Record { const url = new URL(request.url); const params = url.searchParams; const rolloutId = params.get('rollout_id'); if (!rolloutId) { return snakeCaseKeys({ items: [], limit: 0, offset: 0, total: 0 }); } const attemptId = params.get('attempt_id'); const key = attemptId ? `${rolloutId}:${attemptId}` : rolloutId; const spans = spansByAttempt[key] ?? []; const filtered = filterSpansForParams(spans, params); const sortBy = params.get('sort_by'); const sortOrder = params.get('sort_order') === 'desc' ? 'desc' : 'asc'; const sorted = sortSpansForParams(filtered, sortBy, sortOrder); const limitParam = parseNumberParam(params, 'limit', sorted.length); const offsetParam = parseNumberParam(params, 'offset', 0); const effectiveLimit = limitParam < 0 ? sorted.length : limitParam; const offset = offsetParam < 0 ? 0 : offsetParam; const paginated = effectiveLimit >= 0 ? sorted.slice(offset, offset + effectiveLimit) : [...sorted]; return snakeCaseKeys({ items: paginated, limit: effectiveLimit, offset, total: filtered.length, }); } /** * Create MSW handlers for rollouts and attempts endpoints. * * @param rollouts - Array of rollout objects to serve * @param attemptsByRollout - Map of rollout IDs to their attempts * @returns Array of MSW request handlers * * @example * ```ts * const handlers = createRolloutsHandlers(sampleRollouts, attemptsByRollout); * ``` */ export function createRolloutsHandlers(rollouts: Rollout[], attemptsByRollout: Record) { return [ http.get('*/v1/agl/rollouts', ({ request }) => HttpResponse.json(buildRolloutsResponse(rollouts, request))), http.get('*/v1/agl/rollouts/:rolloutId/attempts', ({ params, request }) => { const rolloutId = params.rolloutId as string; const attempts = attemptsByRollout[rolloutId] ?? []; return HttpResponse.json(buildAttemptsResponse(attempts, request)); }), ]; } /** * Create MSW handlers for spans endpoints. * * @param spansByAttempt - Map of "rolloutId:attemptId" to their spans * @returns Array of MSW request handlers * * @example * ```ts * const handlers = createSpansHandlers({ 'ro-1:at-1': [span1, span2] }); * ``` */ export function createSpansHandlers(spansByAttempt: Record) { return [http.get('*/v1/agl/spans', ({ request }) => HttpResponse.json(buildSpansResponse(spansByAttempt, request)))]; } /** * Filter resources based on query parameters. * Supports: resources_id_contains */ export function filterResourcesForParams(resources: Resources[], params: URLSearchParams): Resources[] { const resourcesIdContains = params.get('resources_id_contains'); return resources.filter((resource) => { if (resourcesIdContains && !resource.resourcesId.includes(resourcesIdContains)) { return false; } return true; }); } /** * Get the sort value for resources based on the sort_by field. */ export function getResourcesSortValue(resource: Resources, sortBy: string): string | number | null { switch (sortBy) { case 'resources_id': return resource.resourcesId; case 'version': return resource.version; case 'create_time': return resource.createTime; case 'update_time': default: return resource.updateTime; } } /** * Sort resources based on query parameters. * Default sort_by is 'update_time', default sort_order is 'desc'. */ export function sortResourcesForParams( resources: Resources[], sortBy: string | null, sortOrder: 'asc' | 'desc', ): Resources[] { const resolvedSortBy = sortBy ?? 'update_time'; const sorted = [...resources].sort((a, b) => { const aValue = getResourcesSortValue(a, resolvedSortBy); const bValue = getResourcesSortValue(b, resolvedSortBy); if (aValue === bValue) { return 0; } if (aValue == null) { return -1; } if (bValue == null) { return 1; } if (typeof aValue === 'number' && typeof bValue === 'number') { return aValue - bValue; } return String(aValue).localeCompare(String(bValue)); }); if (sortOrder === 'desc') { sorted.reverse(); } return sorted; } /** * Build a paginated resources response matching the Python server's format. * Applies filtering, sorting, and pagination based on query parameters. */ export function buildResourcesResponse(resources: Resources[], request: Request): Record { const url = new URL(request.url); const params = url.searchParams; const filtered = filterResourcesForParams(resources, params); const sortBy = params.get('sort_by'); const sortOrder = params.get('sort_order') === 'desc' ? 'desc' : 'asc'; const sorted = sortResourcesForParams(filtered, sortBy, sortOrder); const limitParam = parseNumberParam(params, 'limit', sorted.length); const offsetParam = parseNumberParam(params, 'offset', 0); const effectiveLimit = limitParam < 0 ? sorted.length : limitParam; const offset = offsetParam < 0 ? 0 : offsetParam; const paginated = effectiveLimit >= 0 ? sorted.slice(offset, offset + effectiveLimit) : [...sorted]; return snakeCaseKeys({ items: paginated, limit: effectiveLimit, offset, total: filtered.length, }); } /** * Filter workers based on query parameters. * Supports: status_in, worker_id_contains */ export function filterWorkersForParams(workers: Worker[], params: URLSearchParams): Worker[] { const statusFilters = params.getAll('status_in'); const workerIdContains = params.get('worker_id_contains'); const filterLogic = params.get('filter_logic') === 'or' ? 'or' : 'and'; return workers.filter((worker) => { const checks: boolean[] = []; if (statusFilters.length > 0) { checks.push(statusFilters.includes(worker.status)); } if (workerIdContains) { checks.push(worker.workerId.toLowerCase().includes(workerIdContains.toLowerCase())); } if (checks.length === 0) { return true; } return filterLogic === 'or' ? checks.some(Boolean) : checks.every(Boolean); }); } /** * Resolve a worker sort value for the given column. */ export function getWorkerSortValue(worker: Worker, sortBy: string): string | number | null { switch (sortBy) { case 'worker_id': return worker.workerId; case 'status': return worker.status; case 'current_rollout_id': return worker.currentRolloutId ?? ''; case 'current_attempt_id': return worker.currentAttemptId ?? ''; case 'last_busy_time': return worker.lastBusyTime ?? null; case 'last_idle_time': return worker.lastIdleTime ?? null; case 'last_dequeue_time': return worker.lastDequeueTime ?? null; case 'last_heartbeat_time': default: return worker.lastHeartbeatTime ?? null; } } /** * Sort workers based on query parameters. * Default sort_by is 'last_heartbeat_time'. */ export function sortWorkersForParams(workers: Worker[], sortBy: string | null, sortOrder: 'asc' | 'desc'): Worker[] { const resolvedSortBy = sortBy ?? 'last_heartbeat_time'; const sorted = [...workers].sort((a, b) => { const aValue = getWorkerSortValue(a, resolvedSortBy); const bValue = getWorkerSortValue(b, resolvedSortBy); if (aValue === bValue) { return 0; } if (aValue == null) { return -1; } if (bValue == null) { return 1; } if (typeof aValue === 'number' && typeof bValue === 'number') { return aValue - bValue; } return String(aValue).localeCompare(String(bValue)); }); if (sortOrder === 'desc') { sorted.reverse(); } return sorted; } /** * Build a paginated workers response matching the Python server's format. */ export function buildWorkersResponse(workers: Worker[], request: Request): Record { const url = new URL(request.url); const params = url.searchParams; const filtered = filterWorkersForParams(workers, params); const sortBy = params.get('sort_by'); const sortOrder = params.get('sort_order') === 'desc' ? 'desc' : 'asc'; const sorted = sortWorkersForParams(filtered, sortBy, sortOrder); const limitParam = parseNumberParam(params, 'limit', sorted.length); const offsetParam = parseNumberParam(params, 'offset', 0); const effectiveLimit = limitParam < 0 ? sorted.length : limitParam; const offset = offsetParam < 0 ? 0 : offsetParam; const paginated = effectiveLimit >= 0 ? sorted.slice(offset, offset + effectiveLimit) : [...sorted]; return snakeCaseKeys({ items: paginated, limit: effectiveLimit, offset, total: filtered.length, }); } /** * Create MSW handlers for workers endpoints. */ export function createWorkersHandlers(workers: Worker[]) { return [http.get('*/v1/agl/workers', ({ request }) => HttpResponse.json(buildWorkersResponse(workers, request)))]; } /** * Create MSW handlers for resources endpoints. * * @param resources - Array of resources objects to serve * @returns Array of MSW request handlers * * @example * ```ts * const handlers = createResourcesHandlers(sampleResources); * ``` */ export function createResourcesHandlers(resources: Resources[]) { return [ http.get('*/v1/agl/resources', ({ request }) => HttpResponse.json(buildResourcesResponse(resources, request))), ]; } /** * Create complete MSW handlers for rollouts, attempts, and spans. * * This is a convenience function that combines createRolloutsHandlers and * createSpansHandlers for stories that need both. * * @param rollouts - Array of rollout objects to serve * @param attemptsByRollout - Map of rollout IDs to their attempts * @param spansByAttempt - Map of "rolloutId:attemptId" to their spans * @param delayMs - Optional delay in milliseconds to add before each response (for testing loading states) * @returns Array of MSW request handlers * * @example * ```ts * // Create handlers without delay * const handlers = createMockHandlers(rollouts, attempts, spans); * * // Create handlers with 800ms delay to test loading states * const loadingHandlers = createMockHandlers(rollouts, attempts, spans, 800); * ``` */ export function createMockHandlers( rollouts: Rollout[], attemptsByRollout: Record, spansByAttempt?: Record, delayMs?: number, ) { // If no delay, use synchronous handlers if (!delayMs) { const handlers = createRolloutsHandlers(rollouts, attemptsByRollout); if (spansByAttempt) { handlers.push(...createSpansHandlers(spansByAttempt)); } return handlers; } // Create delayed handlers return [ http.get('*/v1/agl/rollouts', async ({ request }) => { await delay(delayMs); return HttpResponse.json(buildRolloutsResponse(rollouts, request)); }), http.get('*/v1/agl/rollouts/:rolloutId/attempts', async ({ params, request }) => { await delay(delayMs); const rolloutId = params.rolloutId as string; const attempts = attemptsByRollout[rolloutId] ?? []; return HttpResponse.json(buildAttemptsResponse(attempts, request)); }), ...(spansByAttempt ? [ http.get('*/v1/agl/spans', async ({ request }) => { await delay(delayMs); return HttpResponse.json(buildSpansResponse(spansByAttempt, request)); }), ] : []), ]; } ================================================ FILE: dashboard/src/utils/table.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import type { DataTableColumn } from 'mantine-datatable'; /** * Configuration for column visibility based on screen width */ export type ColumnVisibilityConfig = | { minWidth: number; priority: number; fixedWidth?: never; } | { fixedWidth: number; priority: number; minWidth?: never; }; /** * Compare two records for sorting purposes * Handles null/undefined values and both string and number comparisons */ export function compareRecords(a: T, b: T, key: K): number { const valueA = a[key]; const valueB = b[key]; if (valueA === valueB) { return 0; } if (valueA === null || valueA === undefined) { return 1; } if (valueB === null || valueB === undefined) { return -1; } if (typeof valueA === 'number' && typeof valueB === 'number') { return valueA - valueB; } return String(valueA).localeCompare(String(valueB)); } /** * Create responsive columns based on container width * Columns with priority 0 are always shown, others are shown based on available space */ const FALLBACK_EM_IN_PIXELS = 16; function getEmInPixels(): number { if (typeof window === 'undefined' || !window.document?.documentElement) { return FALLBACK_EM_IN_PIXELS; } const rootFontSize = window.getComputedStyle(window.document.documentElement).fontSize; const parsed = Number.parseFloat(rootFontSize); if (Number.isFinite(parsed) && parsed > 0) { return parsed; } return FALLBACK_EM_IN_PIXELS; } function resolveWidth(config: ColumnVisibilityConfig): { widthEm: number; fixed: boolean } { if ('fixedWidth' in config && typeof config.fixedWidth === 'number') { return { widthEm: config.fixedWidth, fixed: true }; } return { widthEm: config.minWidth, fixed: false }; } export function createResponsiveColumns( columns: DataTableColumn[], containerWidth: number, columnVisibilityConfig: Record, ): DataTableColumn[] { const measuredWidth = containerWidth ? Math.max(containerWidth, 0) : Number.POSITIVE_INFINITY; const emInPixels = getEmInPixels(); const columnEntries = columns.map((column, index) => { const accessorKey = String(column.accessor); const config = columnVisibilityConfig[accessorKey] ?? ({ minWidth: 10, priority: 3, } satisfies ColumnVisibilityConfig); const { widthEm, fixed } = resolveWidth(config); return { column, index, accessorKey, ...config, widthEm, widthPx: widthEm * emInPixels, fixed, }; }); const sortedByPriority = columnEntries .slice() .sort((a, b) => (a.priority === b.priority ? a.index - b.index : a.priority - b.priority)); const visibleColumnIndices = new Set(); let usedWidth = 0; // First pass: add all priority 0 columns sortedByPriority.forEach((entry) => { if (entry.priority === 0) { visibleColumnIndices.add(entry.index); usedWidth += entry.widthPx; } }); // Second pass: add remaining columns that fit sortedByPriority.forEach((entry) => { if (visibleColumnIndices.has(entry.index)) { return; } if (usedWidth + entry.widthPx <= measuredWidth) { visibleColumnIndices.add(entry.index); usedWidth += entry.widthPx; } }); return columnEntries.map(({ column, index, fixed, widthEm }) => { const columnWidth = `${widthEm}em`; const existingStyle = (column as any).style ?? {}; return { ...column, width: fixed ? columnWidth : column.width, style: { ...existingStyle, minWidth: columnWidth, }, hidden: !visibleColumnIndices.has(index), }; }); } ================================================ FILE: dashboard/src/vite-env.d.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /// ================================================ FILE: dashboard/static/mockServiceWorker.js ================================================ // Copyright (c) Microsoft. All rights reserved. /* eslint-disable */ /* tslint:disable */ /** * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. */ const PACKAGE_VERSION = '2.11.6'; const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'; const IS_MOCKED_RESPONSE = Symbol('isMockedResponse'); const activeClientIds = new Set(); addEventListener('install', function () { self.skipWaiting(); }); addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()); }); addEventListener('message', async function (event) { const clientId = Reflect.get(event.source || {}, 'id'); if (!clientId || !self.clients) { return; } const client = await self.clients.get(clientId); if (!client) { return; } const allClients = await self.clients.matchAll({ type: 'window', }); switch (event.data) { case 'KEEPALIVE_REQUEST': { sendToClient(client, { type: 'KEEPALIVE_RESPONSE', }); break; } case 'INTEGRITY_CHECK_REQUEST': { sendToClient(client, { type: 'INTEGRITY_CHECK_RESPONSE', payload: { packageVersion: PACKAGE_VERSION, checksum: INTEGRITY_CHECKSUM, }, }); break; } case 'MOCK_ACTIVATE': { activeClientIds.add(clientId); sendToClient(client, { type: 'MOCKING_ENABLED', payload: { client: { id: client.id, frameType: client.frameType, }, }, }); break; } case 'CLIENT_CLOSED': { activeClientIds.delete(clientId); const remainingClients = allClients.filter((client) => { return client.id !== clientId; }); // Unregister itself when there are no more clients if (remainingClients.length === 0) { self.registration.unregister(); } break; } } }); addEventListener('fetch', function (event) { const requestInterceptedAt = Date.now(); // Bypass navigation requests. if (event.request.mode === 'navigate') { return; } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') { return; } // Bypass all requests when there are no active clients. // Prevents the self-unregistered worked from handling requests // after it's been terminated (still remains active until the next reload). if (activeClientIds.size === 0) { return; } const requestId = crypto.randomUUID(); event.respondWith(handleRequest(event, requestId, requestInterceptedAt)); }); /** * @param {FetchEvent} event * @param {string} requestId * @param {number} requestInterceptedAt */ async function handleRequest(event, requestId, requestInterceptedAt) { const client = await resolveMainClient(event); const requestCloneForEvents = event.request.clone(); const response = await getResponse(event, client, requestId, requestInterceptedAt); // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { const serializedRequest = await serializeRequest(requestCloneForEvents); // Clone the response so both the client and the library could consume it. const responseClone = response.clone(); sendToClient( client, { type: 'RESPONSE', payload: { isMockedResponse: IS_MOCKED_RESPONSE in response, request: { id: requestId, ...serializedRequest, }, response: { type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, headers: Object.fromEntries(responseClone.headers.entries()), body: responseClone.body, }, }, }, responseClone.body ? [serializedRequest.body, responseClone.body] : [], ); } return response; } /** * Resolve the main client for the given event. * Client that issues a request doesn't necessarily equal the client * that registered the worker. It's with the latter the worker should * communicate with during the response resolving phase. * @param {FetchEvent} event * @returns {Promise} */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId); if (activeClientIds.has(event.clientId)) { return client; } if (client?.frameType === 'top-level') { return client; } const allClients = await self.clients.matchAll({ type: 'window', }); return allClients .filter((client) => { // Get only those clients that are currently visible. return client.visibilityState === 'visible'; }) .find((client) => { // Find the client ID that's recorded in the // set of clients that have registered the worker. return activeClientIds.has(client.id); }); } /** * @param {FetchEvent} event * @param {Client | undefined} client * @param {string} requestId * @param {number} requestInterceptedAt * @returns {Promise} */ async function getResponse(event, client, requestId, requestInterceptedAt) { // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). const requestClone = event.request.clone(); function passthrough() { // Cast the request headers to a new Headers instance // so the headers can be manipulated with. const headers = new Headers(requestClone.headers); // Remove the "accept" header value that marked this request as passthrough. // This prevents request alteration and also keeps it compliant with the // user-defined CORS policies. const acceptHeader = headers.get('accept'); if (acceptHeader) { const values = acceptHeader.split(',').map((value) => value.trim()); const filteredValues = values.filter((value) => value !== 'msw/passthrough'); if (filteredValues.length > 0) { headers.set('accept', filteredValues.join(', ')); } else { headers.delete('accept'); } } return fetch(requestClone, { headers }); } // Bypass mocking when the client is not active. if (!client) { return passthrough(); } // Bypass initial page load requests (i.e. static assets). // The absence of the immediate/parent client in the map of the active clients // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet // and is not ready to handle requests. if (!activeClientIds.has(client.id)) { return passthrough(); } // Notify the client that a request has been intercepted. const serializedRequest = await serializeRequest(event.request); const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, interceptedAt: requestInterceptedAt, ...serializedRequest, }, }, [serializedRequest.body], ); switch (clientMessage.type) { case 'MOCK_RESPONSE': { return respondWithMock(clientMessage.data); } case 'PASSTHROUGH': { return passthrough(); } } return passthrough(); } /** * @param {Client} client * @param {any} message * @param {Array} transferrables * @returns {Promise} */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel(); channel.port1.onmessage = (event) => { if (event.data && event.data.error) { return reject(event.data.error); } resolve(event.data); }; client.postMessage(message, [channel.port2, ...transferrables.filter(Boolean)]); }); } /** * @param {Response} response * @returns {Response} */ function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create // a Response instance with status code 0, handle that use-case separately. if (response.status === 0) { return Response.error(); } const mockedResponse = new Response(response.body, response); Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { value: true, enumerable: true, }); return mockedResponse; } /** * @param {Request} request */ async function serializeRequest(request) { return { url: request.url, mode: request.mode, method: request.method, headers: Object.fromEntries(request.headers.entries()), cache: request.cache, credentials: request.credentials, destination: request.destination, integrity: request.integrity, redirect: request.redirect, referrer: request.referrer, referrerPolicy: request.referrerPolicy, body: await request.arrayBuffer(), keepalive: request.keepalive, }; } ================================================ FILE: dashboard/test-utils/index.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import userEvent from '@testing-library/user-event'; export * from '@testing-library/react'; export { render } from './render'; export { userEvent }; export { createServerBackedStore, getPythonServerBaseUrl } from './server'; ================================================ FILE: dashboard/test-utils/python-server.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ Script to inject mock data directly into an InMemoryLightningStore. This script creates sample rollouts, attempts, spans, and resources that match the TypeScript mock data (from dashboard/src/components/RolloutTable.story.tsx) and injects them directly into the store's private variables for testing. Usage: from dashboard.test_utils.inject_mock_data import inject_mock_data store = InMemoryLightningStore() inject_mock_data(store) """ # pyright: reportPrivateUsage=false import argparse import asyncio import time from typing import List from agentlightning.store.client_server import LightningStoreServer from agentlightning.store.memory import InMemoryLightningStore from agentlightning.types import ( LLM, Attempt, OtelResource, PromptTemplate, ResourcesUpdate, Rollout, RolloutConfig, Span, TraceStatus, Worker, ) async def inject_mock_data(store: InMemoryLightningStore, now: float | None = None) -> None: """ Inject mock data directly into the InMemoryLightningStore. Args: store: The InMemoryLightningStore instance to inject data into now: The current timestamp (defaults to current time) """ if now is None: now = time.time() # Create rollouts matching the TypeScript mock data # Based on sampleRollouts from dashboard/src/components/RolloutTable.story.tsx # Rollout 1: Running rollout1 = Rollout( rollout_id="ro-story-001", input=dict(task="Generate onboarding summary"), start_time=now - 3200, end_time=None, mode="train", resources_id="rs-story-001", status="running", config=RolloutConfig(max_attempts=1), metadata={"owner": "alice"}, ) attempt1 = Attempt( rollout_id="ro-story-001", attempt_id="at-story-010", sequence_id=1, start_time=now - 3200, end_time=None, status="running", worker_id="worker-east", last_heartbeat_time=now - 45, metadata={"info": "Worker is processing"}, ) # Rollout 2: Succeeded rollout2 = Rollout( rollout_id="ro-story-002", # NOTE: input is a string here, not a dict input="Classify feedback tickets", start_time=now - 7200, end_time=now - 5400, mode="val", resources_id="rs-story-002", status="succeeded", config=RolloutConfig(max_attempts=2, timeout_seconds=86400, unresponsive_seconds=86400 * 2), metadata={"owner": "bob"}, ) attempt2_1 = Attempt( rollout_id="ro-story-002", attempt_id="at-story-021", sequence_id=1, start_time=now - 7200, end_time=now - 5400, status="timeout", last_heartbeat_time=None, worker_id=None, metadata=None, ) attempt2_2 = Attempt( rollout_id="ro-story-002", attempt_id="at-story-022", sequence_id=2, start_time=now - 6200, end_time=now - 5400, status="succeeded", worker_id="worker-north", last_heartbeat_time=now - 5400, metadata={"previousAttempt": "at-story-010"}, ) # Rollout 3: Failed rollout3 = Rollout( rollout_id="ro-story-003", input=dict(task="Analyze experiment results"), start_time=now - 10800, end_time=now - 9600, mode="test", resources_id="rs-story-003", status="failed", config=RolloutConfig(max_attempts=3), metadata={"owner": "carol"}, ) attempt3_1 = Attempt( rollout_id="ro-story-003", attempt_id="at-story-031", sequence_id=3, start_time=now - 10200, end_time=now - 9600, status="failed", worker_id="worker-west", last_heartbeat_time=now - 9600, metadata={"reason": "Timeout"}, ) attempt3_2 = Attempt( rollout_id="ro-story-003", attempt_id="at-story-032", sequence_id=2, start_time=now - 9600, end_time=None, status="unresponsive", worker_id="worker-west", last_heartbeat_time=now - 3600, metadata={"reason": "Unresponsive"}, ) attempt3_3 = Attempt( rollout_id="ro-story-003", attempt_id="at-story-033", sequence_id=3, start_time=now - 9000, end_time=now - 3600, status="failed", worker_id="worker-west", ) # Rollout 4: Queuing (no attempt yet) rollout4 = Rollout( rollout_id="ro-story-004", input=dict(task="Evaluate prompt variants"), start_time=now - 3600, end_time=None, mode="train", resources_id=None, status="requeuing", config=RolloutConfig(max_attempts=5, retry_condition=["timeout"]), metadata={"owner": "dave"}, ) # Rollout 5: Running rollout5 = Rollout( rollout_id="ro-story-005", input=dict(task="Generate quick answers"), start_time=now - 1800, end_time=None, mode="val", resources_id="rs-story-004", status="running", config=RolloutConfig(max_attempts=1), metadata={"owner": "eva"}, ) attempt5 = Attempt( rollout_id="ro-story-005", attempt_id="at-story-013", sequence_id=1, start_time=now - 1800, end_time=None, status="running", worker_id=None, last_heartbeat_time=now - 75, metadata=None, ) # Rollout 6: Cancelled rollout6 = Rollout( rollout_id="ro-story-006", input=dict(task="Compile release notes"), start_time=now - 9600, end_time=now - 9000, mode=None, resources_id="rs-story-005", status="cancelled", config=RolloutConfig(max_attempts=3), metadata=None, ) attempt6 = Attempt( rollout_id="ro-story-006", attempt_id="at-story-014", sequence_id=1, start_time=now - 9600, end_time=now - 9000, status="timeout", worker_id="worker-south", last_heartbeat_time=now - 9000, metadata={"info": "Cancelled by operator"}, ) # Inject rollouts directly into store await store.collections.rollouts.insert([rollout1, rollout2, rollout3, rollout4, rollout5, rollout6]) # Inject attempts directly into store await store.collections.attempts.insert( [attempt1, attempt2_1, attempt2_2, attempt3_1, attempt3_2, attempt3_3, attempt5, attempt6] ) # Create and inject spans with diverse data # Spans for ro-story-001 (Running) - Multiple nested spans with ongoing execution spans_ro1: List[Span] = [ Span( rollout_id="ro-story-001", attempt_id="at-story-010", sequence_id=1, trace_id="trace-001-main", span_id="span-001-root", parent_id=None, name="agent_execution", status=TraceStatus(status_code="OK", description=None), attributes={"component": "agent", "framework": "autogen", "version": "0.2.0"}, events=[], links=[], start_time=now - 3200, end_time=now - 3100, context=None, parent=None, resource=OtelResource(attributes={"service.name": "agent-service"}, schema_url=""), ), Span( rollout_id="ro-story-001", attempt_id="at-story-010", sequence_id=2, trace_id="trace-001-main", span_id="span-002-llm", parent_id="span-001-root", name="llm_call", status=TraceStatus(status_code="OK", description=None), attributes={"model": "gpt-4", "temperature": 0.7, "tokens": 150}, events=[], links=[], start_time=now - 3180, end_time=now - 3120, context=None, parent=None, resource=OtelResource(attributes={"service.name": "llm-service"}, schema_url=""), ), Span( rollout_id="ro-story-001", attempt_id="at-story-010", sequence_id=3, trace_id="trace-001-main", span_id="span-003-tool", parent_id="span-001-root", name="tool_execution", status=TraceStatus(status_code="OK", description=None), attributes={"tool": "web_search", "query": "onboarding summary"}, events=[], links=[], start_time=now - 3140, end_time=now - 3100, context=None, parent=None, resource=OtelResource(attributes={"service.name": "tool-service"}, schema_url=""), ), ] # Spans for ro-story-002 attempt 1 (timeout) - Failed workflow spans_ro2_a1: List[Span] = [ Span( rollout_id="ro-story-002", attempt_id="at-story-021", sequence_id=1, trace_id="trace-002-attempt1", span_id="span-004-root", parent_id=None, name="classification_pipeline", status=TraceStatus(status_code="ERROR", description="Request timeout"), attributes={"type": "classification", "model": "bert-classifier", "timeout": True}, events=[], links=[], start_time=now - 7200, end_time=now - 6800, context=None, parent=None, resource=OtelResource(attributes={"service.name": "classifier"}, schema_url=""), ), ] # Spans for ro-story-002 attempt 2 (succeeded) - Successful workflow spans_ro2_a2: List[Span] = [ Span( rollout_id="ro-story-002", attempt_id="at-story-022", sequence_id=1, trace_id="trace-002-attempt2", span_id="span-005-root", parent_id=None, name="classification_pipeline", status=TraceStatus(status_code="OK", description=None), attributes={"type": "classification", "model": "bert-classifier", "retry": True}, events=[], links=[], start_time=now - 6200, end_time=now - 5400, context=None, parent=None, resource=OtelResource(attributes={"service.name": "classifier"}, schema_url=""), ), Span( rollout_id="ro-story-002", attempt_id="at-story-022", sequence_id=2, trace_id="trace-002-attempt2", span_id="span-006-preprocess", parent_id="span-005-root", name="preprocess_tickets", status=TraceStatus(status_code="OK", description=None), attributes={"tickets_count": 50, "duration_ms": 120}, events=[], links=[], start_time=now - 6200, end_time=now - 6100, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), Span( rollout_id="ro-story-002", attempt_id="at-story-022", sequence_id=3, trace_id="trace-002-attempt2", span_id="span-007-classify", parent_id="span-005-root", name="run_classifier", status=TraceStatus(status_code="OK", description=None), attributes={"batch_size": 10, "accuracy": 0.95}, events=[], links=[], start_time=now - 6000, end_time=now - 5400, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), ] # Spans for ro-story-003 attempt 3 (failed) - Error scenario with nested failures spans_ro3_a3: List[Span] = [ Span( rollout_id="ro-story-003", attempt_id="at-story-033", sequence_id=1, trace_id="trace-003-experiment", span_id="span-008-root", parent_id=None, name="experiment_analysis", status=TraceStatus(status_code="ERROR", description="Analysis failed"), attributes={"experiment_id": "exp-123", "timeout_seconds": 300}, events=[], links=[], start_time=now - 9000, end_time=now - 3600, context=None, parent=None, resource=OtelResource(attributes={"service.name": "experiment-runner"}, schema_url=""), ), Span( rollout_id="ro-story-003", attempt_id="at-story-033", sequence_id=2, trace_id="trace-003-experiment", span_id="span-009-fetch", parent_id="span-008-root", name="fetch_experiment_data", status=TraceStatus(status_code="ERROR", description="Connection timeout"), attributes={"data_source": "database", "retry_count": 3}, events=[], links=[], start_time=now - 9000, end_time=now - 7000, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), Span( rollout_id="ro-story-003", attempt_id="at-story-033", sequence_id=3, trace_id="trace-003-experiment", span_id="span-010-process", parent_id="span-008-root", name="process_results", status=TraceStatus(status_code="UNSET", description=None), attributes={"stage": "aggregation", "partial_results": True}, events=[], links=[], start_time=now - 6000, end_time=now - 3600, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), ] # Spans for ro-story-005 (Running) - In-progress with mixed statuses spans_ro5: List[Span] = [ Span( rollout_id="ro-story-005", attempt_id="at-story-013", sequence_id=1, trace_id="trace-005-answers", span_id="span-011-root", parent_id=None, name="quick_answer_generation", status=TraceStatus(status_code="OK", description=None), attributes={"batch_size": 10, "model": "llama-3"}, events=[], links=[], start_time=now - 1800, end_time=now - 1500, context=None, parent=None, resource=OtelResource(attributes={"service.name": "qa-service"}, schema_url=""), ), Span( rollout_id="ro-story-005", attempt_id="at-story-013", sequence_id=2, trace_id="trace-005-answers", span_id="span-012-llm", parent_id="span-011-root", name="llm_inference", status=TraceStatus(status_code="UNSET", description=None), attributes={"model": "llama-3-70b", "batch_id": "batch-001"}, events=[], links=[], start_time=now - 1700, end_time=None, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), Span( rollout_id="ro-story-005", attempt_id="at-story-013", sequence_id=3, trace_id="trace-005-answers", span_id="span-013-retrieve", parent_id="span-011-root", name="retrieve_context", status=TraceStatus(status_code="OK", description=None), attributes={"documents_count": 5, "vector_db": "chroma"}, events=[], links=[], start_time=now - 1780, end_time=now - 1700, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), ] # Spans for ro-story-006 (Cancelled) - Cancelled workflow spans_ro6: List[Span] = [ Span( rollout_id="ro-story-006", attempt_id="at-story-014", sequence_id=1, trace_id="trace-006-release", span_id="span-014-root", parent_id=None, name="compile_release_notes", status=TraceStatus(status_code="ERROR", description="Operation cancelled by user"), attributes={"release_version": "v2.0.0", "cancelled": True}, events=[], links=[], start_time=now - 9600, end_time=now - 9000, context=None, parent=None, resource=OtelResource(attributes={"service.name": "release-automation"}, schema_url=""), ), Span( rollout_id="ro-story-006", attempt_id="at-story-014", sequence_id=2, trace_id="trace-006-release", span_id="span-015-git", parent_id="span-014-root", name="fetch_git_commits", status=TraceStatus(status_code="OK", description=None), attributes={"repo": "main", "commits_count": 45}, events=[], links=[], start_time=now - 9600, end_time=now - 9400, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), Span( rollout_id="ro-story-006", attempt_id="at-story-014", sequence_id=3, trace_id="trace-006-release", span_id="span-016-format", parent_id="span-014-root", name="format_changelog", status=TraceStatus(status_code="ERROR", description="Cancelled during formatting"), attributes={"format": "markdown", "cancelled_at": "50%"}, events=[], links=[], start_time=now - 9300, end_time=now - 9000, context=None, parent=None, resource=OtelResource(attributes={}, schema_url=""), ), ] await store.collections.spans.insert(spans_ro1 + spans_ro2_a1 + spans_ro2_a2 + spans_ro3_a3 + spans_ro5 + spans_ro6) # Create and inject resources with diverse types resource1 = ResourcesUpdate( resources_id="rs-story-001", version=1, create_time=now - 86400, update_time=now - 86400, resources={ "model": LLM( endpoint="https://api.openai.com/v1", model="gpt-4", sampling_parameters={"temperature": 0.7, "max_tokens": 1000}, ), }, ) resource2 = ResourcesUpdate( resources_id="rs-story-002", version=1, create_time=now - 86400, update_time=now - 43200, resources={ "prompt_main": PromptTemplate( template="Classify the following ticket: {ticket}\nCategory:", engine="f-string", ), }, ) resource3 = ResourcesUpdate( resources_id="rs-story-003", version=2, create_time=now - 86400, update_time=now - 3600, resources={ "model": LLM( endpoint="https://api.anthropic.com/v1", model="claude-3-sonnet", sampling_parameters={"temperature": 0.8, "max_tokens": 2048}, ), "prompt": PromptTemplate( template="Analyze experiment results:\n{% for result in results %}\n- {{ result }}\n{% endfor %}", engine="jinja", ), }, ) resource4 = ResourcesUpdate( resources_id="rs-story-004", version=1, create_time=now - 7200, update_time=now - 7200, resources={ "system_prompt": PromptTemplate( template="You are a helpful assistant that generates quick, concise answers.", engine="f-string", ), "model": LLM( endpoint="http://localhost:8000/v1", model="llama-3-70b", sampling_parameters={"temperature": 0.6, "top_p": 0.95}, ), }, ) resource5 = ResourcesUpdate( resources_id="rs-story-005", version=1, create_time=now - 14400, update_time=now - 14400, resources={ "prompt": PromptTemplate( template="## Release Notes v{{ version }}\n\n### Changes\n{{ changes }}", engine="jinja", ), }, ) await store.collections.resources.insert([resource1, resource2, resource3, resource4, resource5]) store._latest_resources_id = "rs-story-005" # Register workers with diverse states and activity windows. workers = [ Worker( worker_id="worker-east", status="busy", heartbeat_stats={"queue_depth": 2, "gpu_utilization": 0.82}, last_heartbeat_time=now - 20, last_dequeue_time=now - 60, last_busy_time=now - 120, last_idle_time=now - 600, current_rollout_id="ro-story-001", current_attempt_id="at-story-010", ), Worker( worker_id="worker-north", status="idle", heartbeat_stats={"queue_depth": 0, "gpu_utilization": 0.15}, last_heartbeat_time=now - 90, last_dequeue_time=now - 3600, last_busy_time=now - 5400, last_idle_time=now - 5400, current_rollout_id=None, current_attempt_id=None, ), Worker( worker_id="worker-west", status="busy", heartbeat_stats={"queue_depth": 1, "gpu_utilization": 0.41}, last_heartbeat_time=now - 45, last_dequeue_time=now - 300, last_busy_time=now - 200, last_idle_time=now - 4800, current_rollout_id="ro-story-003", current_attempt_id="at-story-033", ), Worker( worker_id="worker-south", status="idle", heartbeat_stats={"queue_depth": 0}, last_heartbeat_time=now - 900, last_dequeue_time=now - 7200, last_busy_time=now - 8600, last_idle_time=now - 8600, current_rollout_id=None, current_attempt_id=None, ), Worker( worker_id="worker-observer", status="unknown", heartbeat_stats={"queue_depth": 0}, last_heartbeat_time=now - 15, last_dequeue_time=now - 4000, last_busy_time=None, last_idle_time=None, current_rollout_id=None, current_attempt_id=None, ), ] await store.collections.workers.insert(workers) async def main(): parser = argparse.ArgumentParser(description="Run a Python server for the LightningStore") parser.add_argument("--now", type=float, default=time.time(), help="The current timestamp") args = parser.parse_args() store = InMemoryLightningStore() await inject_mock_data(store, now=args.now) # Start server server = LightningStoreServer(store, "127.0.0.1", 8765, "*") await server.start() print(f"Server started at {server.endpoint}") print("Press Ctrl+C to stop...") try: # Keep server running await asyncio.Event().wait() except KeyboardInterrupt: print("\nStopping server...") await server.stop() if __name__ == "__main__": asyncio.run(main()) ================================================ FILE: dashboard/test-utils/render.tsx ================================================ // Copyright (c) Microsoft. All rights reserved. import { render as testingLibraryRender } from '@testing-library/react'; import { MantineProvider } from '@mantine/core'; import { theme } from '../src/theme'; export function render(ui: React.ReactNode) { return testingLibraryRender(ui, { wrapper: ({ children }: { children: React.ReactNode }) => ( {children} ), }); } ================================================ FILE: dashboard/test-utils/server.ts ================================================ // Copyright (c) Microsoft. All rights reserved. import { setBaseUrl } from '@/features/config'; import { createAppStore, type AppStore } from '@/store'; const resolvePythonServerBaseUrl = (): string => { const host = process.env.VITEST_PYTHON_HOST ?? '127.0.0.1'; const port = process.env.VITEST_PYTHON_PORT ?? '8765'; const configured = process.env.VITEST_PYTHON_URL; const base = configured && configured.trim().length > 0 ? configured : `http://${host}:${port}`; return base.replace(/\/$/, ''); }; export const getPythonServerBaseUrl = (): string => resolvePythonServerBaseUrl(); export const createServerBackedStore = (preloadedState?: Parameters[0]): AppStore => { const store = createAppStore(preloadedState); store.dispatch(setBaseUrl(getPythonServerBaseUrl())); return store; }; ================================================ FILE: dashboard/tsconfig.json ================================================ { "compilerOptions": { "types": ["node", "@testing-library/jest-dom", "vitest/globals"], "target": "ESNext", "useDefineForClassFields": true, "lib": ["DOM", "DOM.Iterable", "ESNext"], "allowJs": false, "skipLibCheck": true, "esModuleInterop": false, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", "moduleResolution": "Node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", "paths": { "@/*": ["./src/*"], "@test-utils": ["./test-utils"] } }, "include": ["src", "public", "test-utils", ".storybook/main.ts", ".storybook/preview.tsx", ".storybook/modes.ts", ".storybook/constants.ts", ".storybook/vitest.setup.ts"] } ================================================ FILE: dashboard/vite.config.mjs ================================================ // Copyright (c) Microsoft. All rights reserved. /// import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; import react from '@vitejs/plugin-react'; import { playwright } from '@vitest/browser-playwright'; import { defineConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const projectRoot = __dirname; const appRoot = path.resolve(projectRoot, 'public'); export default defineConfig({ root: appRoot, plugins: [react(), tsconfigPaths()], publicDir: path.resolve(projectRoot, 'static'), server: { fs: { allow: [projectRoot], }, }, build: { outDir: path.resolve(projectRoot, '../agentlightning/dashboard'), emptyOutDir: true, }, test: { globals: true, environment: 'jsdom', setupFiles: './vitest.setup.mjs', root: projectRoot, projects: [ { extends: true, test: { name: 'unit', globalSetup: './vitest.global-setup.mjs', }, }, { // TODO: vitest for storybook has been setup but it's not working yet. extends: true, plugins: [ // The plugin will run tests for the stories defined in your Storybook config // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest storybookTest({ configDir: path.join(dirname, '.storybook'), }), ], test: { name: 'storybook', browser: { enabled: true, headless: true, provider: playwright({}), instances: [ { browser: 'chromium', }, ], }, setupFiles: ['.storybook/vitest.setup.ts'], }, }, ], }, }); ================================================ FILE: dashboard/vitest.global-setup.mjs ================================================ // Copyright (c) Microsoft. All rights reserved. import { spawn, spawnSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; import { setTimeout as sleep } from 'node:timers/promises'; import { fileURLToPath } from 'node:url'; const serverHost = process.env.VITEST_PYTHON_HOST ?? '127.0.0.1'; const serverPort = Number.parseInt(process.env.VITEST_PYTHON_PORT ?? '8765', 10); const serverUrl = (process.env.VITEST_PYTHON_URL && process.env.VITEST_PYTHON_URL.trim().replace(/\/$/, '')) ?? `http://${serverHost}:${Number.isFinite(serverPort) ? serverPort : 8765}`; const serverHealthUrl = `${serverUrl}/v1/agl/health`; let pythonServerProcess = null; let startedByGlobalSetup = false; const locatePythonServerPaths = () => { const candidates = []; const cwd = process.cwd(); candidates.push({ workspace: cwd, repo: path.resolve(cwd, '..') }); if ( typeof import.meta !== 'undefined' && typeof import.meta.url === 'string' && import.meta.url.startsWith('file:') ) { const moduleDir = path.dirname(fileURLToPath(import.meta.url)); candidates.push({ workspace: moduleDir, repo: path.resolve(moduleDir, '..') }); } for (const candidate of candidates) { const serverScript = path.resolve(candidate.workspace, 'test-utils/python-server.py'); if (fs.existsSync(serverScript)) { return { repoRoot: candidate.repo, serverScript }; } } throw new Error('Unable to locate dashboard/test-utils/python-server.py from Vitest global setup.'); }; const waitForHealth = async (timeoutMs) => { const deadline = Date.now() + timeoutMs; while (Date.now() < deadline) { try { const controller = new AbortController(); const abortTimer = setTimeout(() => controller.abort(), 1000); const response = await fetch(serverHealthUrl, { signal: controller.signal }); clearTimeout(abortTimer); if (response.ok) { return true; } } catch { // Retry until timeout. } await sleep(200); } return false; }; const resolvePythonRunners = (repoRoot) => { const runners = []; const seenCommands = new Set(); const pushRunner = (command, args, description, extraEnv = {}) => { if (seenCommands.has(command)) { return; } seenCommands.add(command); runners.push({ command, args, description, env: extraEnv }); }; const explicit = process.env.VITEST_PYTHON_BIN?.trim(); if (explicit) { pushRunner(explicit, [], explicit); } const hasUv = (() => { try { const result = spawnSync('uv', ['--version'], { stdio: 'ignore' }); return result.status === 0; } catch { return false; } })(); if (hasUv) { const uvCacheDir = path.resolve(repoRoot, '.uv-cache'); pushRunner('uv', ['run', '--no-sync'], 'uv run --no-sync', { UV_CACHE_DIR: uvCacheDir }); } const candidates = [process.env.PYTHON, process.env.PYTHON3, 'python3', 'python'].filter( (candidate) => typeof candidate === 'string' && candidate.length > 0, ); for (const candidate of candidates) { if (seenCommands.has(candidate)) { continue; } try { const result = spawnSync(candidate, ['--version'], { stdio: 'ignore' }); if (result.status === 0) { pushRunner(candidate, [], candidate); } } catch { // try next candidate } } if (runners.length === 0) { throw new Error('Unable to locate a Python interpreter or uv CLI for launching the LightningStore server.'); } return runners; }; const ensurePythonServer = async () => { if (await waitForHealth(1000)) { startedByGlobalSetup = false; return; } const { repoRoot, serverScript } = locatePythonServerPaths(); const runners = resolvePythonRunners(repoRoot); const attemptErrors = []; const collectOutput = (stream, buffer) => { if (!stream) { return; } stream.on('data', (chunk) => { buffer.push(chunk.toString()); if (process.env.VITEST_DEBUG_PYTHON_SERVER) { process.stderr.write(chunk); } }); }; for (const runner of runners) { const child = spawn(runner.command, [...runner.args, serverScript], { cwd: repoRoot, stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env, PYTHONUNBUFFERED: '1', ...runner.env, }, }); pythonServerProcess = child; const recordedStdout = []; const recordedStderr = []; collectOutput(child.stdout, recordedStdout); collectOutput(child.stderr, recordedStderr); let exitPayload = null; const exitPromise = new Promise((resolve) => { child.on('exit', (code, signal) => { exitPayload = { code, signal }; resolve(); }); }); const ready = await waitForHealth(10000); if (ready) { startedByGlobalSetup = true; return; } const reused = await waitForHealth(3000); if (reused) { startedByGlobalSetup = false; if (child.exitCode == null) { child.kill('SIGTERM'); await exitPromise; } pythonServerProcess = null; return; } if (child.exitCode == null) { child.kill('SIGTERM'); await exitPromise; } else { await exitPromise; } const extra = exitPayload ? ` (code: ${exitPayload.code ?? 'null'}, signal: ${exitPayload.signal ?? 'null'})` : ''; const stderrLog = recordedStderr.join('').trim(); const stdoutLog = recordedStdout.join('').trim(); const message = [ `[${runner.description}] Failed to start LightningStore server at ${serverUrl}${extra}.`, stderrLog.length > 0 ? `stderr:\n${stderrLog}` : '', stdoutLog.length > 0 ? `stdout:\n${stdoutLog}` : '', ] .filter(Boolean) .join('\n\n'); attemptErrors.push(message); } throw new Error(attemptErrors.join('\n\n')); }; export default async function setup() { await ensurePythonServer(); return async () => { if (!startedByGlobalSetup || !pythonServerProcess) { return; } if (pythonServerProcess.exitCode == null) { pythonServerProcess.kill('SIGTERM'); await new Promise((resolve) => { pythonServerProcess?.once('exit', resolve); }); } }; } ================================================ FILE: dashboard/vitest.setup.mjs ================================================ // Copyright (c) Microsoft. All rights reserved. import '@testing-library/jest-dom/vitest'; import { vi } from 'vitest'; const { getComputedStyle } = window; window.getComputedStyle = (elt) => getComputedStyle(elt); window.HTMLElement.prototype.scrollIntoView = () => {}; Object.defineProperty(window, 'matchMedia', { writable: true, value: vi.fn().mockImplementation((query) => ({ matches: false, media: query, onchange: null, addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })), }); class ResizeObserver { observe() {} unobserve() {} disconnect() {} } window.ResizeObserver = ResizeObserver; ================================================ FILE: dashboard/vitest.shims.d.ts ================================================ // Copyright (c) Microsoft. All rights reserved. /// ================================================ FILE: docker/Dockerfile.dev ================================================ # Use a Python image with uv pre-installed FROM ghcr.io/astral-sh/uv:python3.12-bookworm # Setup a non-root user RUN groupadd --system --gid 999 nonroot \ && useradd --system --gid 999 --uid 999 --create-home nonroot # Install the project into `/app` WORKDIR /app # Enable bytecode compilation ENV UV_COMPILE_BYTECODE=1 # Copy from the cache instead of linking since it's a mounted volume ENV UV_LINK_MODE=copy # Ensure installed tools can be executed out of the box ENV UV_TOOL_BIN_DIR=/usr/local/bin # Install the project's dependencies using the lockfile and settings RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --locked --no-install-project --group dev --extra mongo --group core-stable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching COPY . /app RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --locked --group dev --extra mongo --group core-stable # Place executables in the environment at the front of the path ENV PATH="/app/.venv/bin:$PATH" # Reset the entrypoint, don't invoke `uv` ENTRYPOINT [] # Use the non-root user to run our application USER nonroot ================================================ FILE: docker/compose.grafana.yml ================================================ services: prometheus: image: prom/prometheus:latest command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" volumes: - ./prometheus/prometheus.base.yml:/etc/prometheus/prometheus.yml:ro - ${AGL_MONITORING_DATA_PATH:?Set AGL_MONITORING_DATA_PATH to the metrics directory}/prometheus:/prometheus ports: - "9090:9090" grafana: image: grafana/grafana:latest depends_on: - prometheus ports: - "9091:3000" volumes: - ./data/grafana:/var/lib/grafana - ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml - ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml - ./grafana/dashboards:/var/lib/grafana/dashboards environment: - GF_INSTALL_PLUGINS=grafana-piechart-panel - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_DISABLE_LOGIN_FORM=true - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json ================================================ FILE: docker/compose.mongo.yml ================================================ # Docker-compose file to launch a MongoDB server for development. # It's used to test the MongoDB store implementation. services: mongo: image: mongo:8.2 ulimits: nofile: soft: 65535 hard: 65535 ports: - "27017:27017" command: ["mongod", "--bind_ip_all", "--replSet", "rs0"] volumes: - ../scripts/mongodb_init_rs_host.js:/docker-entrypoint-initdb.d/init-rs.js:ro - ./data/mongo-host:/data/db healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 10s timeout: 5s retries: 5 start_period: 30s ================================================ FILE: docker/compose.prometheus-memory-store.yml ================================================ services: app: extends: file: compose.store.yml service: app depends_on: - app-exporter # Wait for the exporter to be ready first command: agl store --host 0.0.0.0 --port 4747 --tracker console prometheus --backend memory environment: - PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc volumes: - prometheus_multiproc:/tmp/prometheus_multiproc app-exporter: build: context: ../ dockerfile: docker/Dockerfile.dev command: agl prometheus --host 0.0.0.0 --port 4748 ports: - "4748:4748" environment: - PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc volumes: - prometheus_multiproc:/tmp/prometheus_multiproc node-exporter: image: prom/node-exporter:latest # In CI you might not have full /proc, but this is OK for container-level stats pid: "host" command: - "--path.rootfs=/host" volumes: - "/:/host:ro,rslave" prometheus: image: prom/prometheus:latest command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=1h" volumes: - ./prometheus/prometheus.base.yml:/etc/prometheus/prometheus.yml:ro - ./data/prometheus:/prometheus depends_on: - app - app-exporter - node-exporter ports: - "9090:9090" grafana: image: grafana/grafana:latest ports: - "9091:3000" depends_on: - prometheus volumes: - ./data/grafana:/var/lib/grafana # 1. Mount the Datasource Config - ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml # 2. Mount the Dashboard Provider Config - ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml # 3. Mount the folder containing the actual JSON files - ./grafana/dashboards:/var/lib/grafana/dashboards environment: - GF_INSTALL_PLUGINS=grafana-piechart-panel - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_DISABLE_LOGIN_FORM=true - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json volumes: prometheus_multiproc: driver: local driver_opts: type: tmpfs device: tmpfs ================================================ FILE: docker/compose.prometheus-mongo-store.yml ================================================ services: mongo: extends: file: compose.mongo.yml service: mongo hostname: mongo volumes: - ./data/mongo-container:/data/db - ../scripts/mongodb_init_rs_profiling.js:/docker-entrypoint-initdb.d/init-rs.js:ro # This forces "mongo" to resolve to localhost ONLY inside this container. # This allows rs.initiate to succeed using the hostname "mongo". extra_hosts: - "mongo:127.0.0.1" app: extends: file: compose.store.yml service: app depends_on: - mongo - app-exporter # Wait for the exporter to be ready first command: - /bin/bash - -c - | agl store --host 0.0.0.0 --port 4747 \ --tracker console prometheus --backend mongo \ --mongo-uri mongodb://mongo:27017/?replicaSet=rs0 \ --n-workers ${AGL_STORE_N_WORKERS:-32} environment: - PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc volumes: - prometheus_multiproc:/tmp/prometheus_multiproc app-exporter: build: context: ../ dockerfile: docker/Dockerfile.dev command: agl prometheus --host 0.0.0.0 --port 4748 ports: - "4748:4748" environment: - PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_multiproc volumes: - prometheus_multiproc:/tmp/prometheus_multiproc mongodb-exporter: image: percona/mongodb_exporter:0.47.1 command: - "--mongodb.uri=mongodb://mongo:27017/" - "--collect-all" - "--mongodb.collstats-colls=agentlightning.rollouts,agentlightning.attempts,agentlightning.spans,agentlightning.resources,agentlightning.workers,agentlightning.rollout_queue,agentlightning.span_sequence_ids" depends_on: - mongo ports: - "9216:9216" node-exporter: image: prom/node-exporter:latest # In CI you might not have full /proc, but this is OK for container-level stats pid: "host" command: - "--path.rootfs=/host" volumes: - "/:/host:ro,rslave" prometheus: image: prom/prometheus:latest command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=1h" volumes: - ./prometheus/prometheus.mongo.yml:/etc/prometheus/prometheus.yml:ro - ./data/prometheus:/prometheus depends_on: - app - app-exporter - mongodb-exporter - node-exporter ports: - "9090:9090" grafana: image: grafana/grafana:latest ports: - "9091:3000" depends_on: - prometheus volumes: - ./data/grafana:/var/lib/grafana # 1. Mount the Datasource Config - ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml # 2. Mount the Dashboard Provider Config - ./grafana/dashboard-provider.yml:/etc/grafana/provisioning/dashboards/provider.yml # 3. Mount the folder containing the actual JSON files - ./grafana/dashboards:/var/lib/grafana/dashboards environment: - GF_INSTALL_PLUGINS=grafana-piechart-panel - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_DISABLE_LOGIN_FORM=true - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/agentlightning.json volumes: prometheus_multiproc: driver: local driver_opts: type: tmpfs device: tmpfs ================================================ FILE: docker/compose.store.yml ================================================ services: app: build: context: ../ dockerfile: docker/Dockerfile.dev ports: - "4747:4747" command: agl store --host 0.0.0.0 --port 4747 ulimits: nofile: soft: 65535 hard: 65535 develop: watch: # Sync the working directory with the `/app` directory in the container - action: sync path: .. target: /app # Exclude the project virtual environment — it could be for a # different platform in the container ignore: - .venv/ # Rebuild the image if dependencies change by checking uv.lock - action: rebuild path: ../uv.lock ================================================ FILE: docker/grafana/dashboard-provider.yml ================================================ apiVersion: 1 providers: - name: "default" orgId: 1 folder: "" type: file disableDeletion: false updateIntervalSeconds: 10 options: # This tells Grafana to look for JSON files in this directory inside the container path: /var/lib/grafana/dashboards ================================================ FILE: docker/grafana/dashboards/1860_rev42.json ================================================ { "__requires": [ { "type": "panel", "id": "bargauge", "name": "Bar gauge", "version": "" }, { "type": "panel", "id": "gauge", "name": "Gauge", "version": "" }, { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "11.6.1" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" }, { "type": "panel", "id": "stat", "name": "Stat", "version": "" }, { "type": "panel", "id": "timeseries", "name": "Time series", "version": "" } ], "annotations": { "list": [ { "builtIn": 1, "datasource": { "type": "datasource", "uid": "grafana" }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": false, "tags": [], "type": "dashboard" }, "type": "dashboard" } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, "id": null, "links": [ { "icon": "external link", "tags": [], "targetBlank": true, "title": "GitHub", "type": "link", "url": "https://github.com/rfmoz/grafana-dashboards" }, { "icon": "external link", "tags": [], "targetBlank": true, "title": "Grafana", "type": "link", "url": "https://grafana.com/grafana/dashboards/1860" } ], "panels": [ { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 261, "panels": [], "title": "Quick CPU / Mem / Disk", "type": "row" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Resource pressure via PSI", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "links": [], "mappings": [], "max": 1, "min": 0, "thresholds": { "mode": "percentage", "steps": [ { "color": "green" }, { "color": "dark-yellow", "value": 70 }, { "color": "dark-red", "value": 90 } ] }, "unit": "percentunit" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 0, "y": 1 }, "id": 323, "options": { "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": false }, "maxVizHeight": 300, "minVizHeight": 10, "minVizWidth": 0, "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showUnfilled": true, "sizing": "auto", "text": {}, "valueMode": "color" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "irate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": true, "legendFormat": "CPU", "range": false, "refId": "A", "step": 240 }, { "editorMode": "code", "exemplar": false, "expr": "irate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": true, "legendFormat": "Mem", "range": false, "refId": "B", "step": 240 }, { "editorMode": "code", "exemplar": false, "expr": "irate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": true, "legendFormat": "I/O", "range": false, "refId": "C", "step": 240 }, { "editorMode": "code", "exemplar": false, "expr": "irate(node_pressure_irq_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": true, "legendFormat": "Irq", "range": false, "refId": "D", "step": 240 } ], "title": "Pressure", "type": "bargauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Overall CPU busy percentage (averaged across all cores)", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 85 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 95 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 3, "y": 1 }, "id": 20, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\"$node\"}[$__rate_interval])))", "instant": true, "legendFormat": "", "range": false, "refId": "A", "step": 240 } ], "title": "CPU Busy", "type": "gauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "System load over all CPU cores together", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 85 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 95 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 6, "y": 1 }, "id": 155, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "scalar(node_load1{instance=\"$node\",job=\"$job\"}) * 100 / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", "format": "time_series", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "Sys Load", "type": "gauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Real RAM usage excluding cache and reclaimable memory", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 80 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 90 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 9, "y": 1 }, "id": 16, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "clamp_min((1 - (node_memory_MemAvailable_bytes{instance=\"$node\", job=\"$job\"} / node_memory_MemTotal_bytes{instance=\"$node\", job=\"$job\"})) * 100, 0)", "format": "time_series", "instant": true, "range": false, "refId": "B", "step": 240 } ], "title": "RAM Used", "type": "gauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Percentage of swap space currently used by the system", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 10 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 25 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 12, "y": 1 }, "id": 21, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"})) * 100", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "SWAP Used", "type": "gauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Used Root FS", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 80 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 90 } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 15, "y": 1 }, "id": 154, "options": { "minVizHeight": 75, "minVizWidth": 75, "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true, "sizing": "auto" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "(\n (node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}\n - node_filesystem_avail_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"})\n / node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}\n) * 100\n", "format": "time_series", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "Root FS Used", "type": "gauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 2, "w": 2, "x": 18, "y": 1 }, "id": 14, "maxDataPoints": 100, "options": { "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", "instant": true, "legendFormat": "__auto", "range": false, "refId": "A" } ], "title": "CPU Cores", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 0, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 2, "w": 2, "x": 20, "y": 1 }, "id": 75, "maxDataPoints": 100, "options": { "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "RAM Total", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 0, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 2, "w": 2, "x": 22, "y": 1 }, "id": 18, "maxDataPoints": 100, "options": { "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "SWAP Total", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 0, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "rgba(50, 172, 45, 0.97)" }, { "color": "rgba(237, 129, 40, 0.89)", "value": 70 }, { "color": "rgba(245, 54, 54, 0.9)", "value": 90 } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 2, "w": 2, "x": 18, "y": 3 }, "id": 23, "maxDataPoints": 100, "options": { "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", "format": "time_series", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "RootFS Total", "type": "stat" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 1, "mappings": [ { "options": { "match": "null", "result": { "text": "N/A" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 2, "w": 4, "x": 20, "y": 3 }, "id": 15, "maxDataPoints": 100, "options": { "colorMode": "none", "graphMode": "none", "justifyMode": "auto", "orientation": "horizontal", "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showPercentChange": false, "textMode": "auto", "wideLayout": true }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}", "instant": true, "range": false, "refId": "A", "step": 240 } ], "title": "Uptime", "type": "stat" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 263, "panels": [], "title": "Basic CPU / Mem / Net / Disk", "type": "row" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "CPU time spent busy vs idle, split by activity type", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "percent" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byName", "options": "Busy Iowait" }, "properties": [ { "id": "color", "value": { "fixedColor": "#890F02", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Idle" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Busy System" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EAB839", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Busy User" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A437C", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Busy Other" }, "properties": [ { "id": "color", "value": { "fixedColor": "#6D1F62", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 6 }, "id": 77, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true, "width": 250 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "desc" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "exemplar": false, "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "instant": false, "legendFormat": "Busy System", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Busy User", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Busy Iowait", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Busy IRQs", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Busy Other", "range": true, "refId": "E", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Idle", "range": true, "refId": "F", "step": 240 } ], "title": "CPU Basic", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "RAM and swap usage overview, including caches", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Swap used" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Total" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E0F9D7", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.stacking", "value": { "group": false, "mode": "normal" } } ] }, { "matcher": { "id": "byName", "options": "Cache + Buffer" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Free" }, "properties": [ { "id": "color", "value": { "fixedColor": "#7EB26D", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 6 }, "id": 78, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Total", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", "legendFormat": "Used", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Cache + Buffer", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Free", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", "legendFormat": "Swap used", "range": true, "refId": "E", "step": 240 } ], "title": "Memory Basic", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Per-interface network traffic (receive and transmit) in bits per second", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Tx.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 13 }, "id": 74, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", "legendFormat": "Rx {{device}}", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", "legendFormat": "Tx {{device}} ", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic Basic", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Percentage of filesystem space used for each mounted device", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "max": 100, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percent" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 13 }, "id": 152, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "((node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", device!~\"rootfs\"} - node_filesystem_avail_bytes{instance=\"$node\", job=\"$job\", device!~\"rootfs\"}) / node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", device!~\"rootfs\"}) * 100", "format": "time_series", "legendFormat": "{{mountpoint}}", "range": true, "refId": "A", "step": 240 } ], "title": "Disk Space Used Basic", "type": "timeseries" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 20 }, "id": 265, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "CPU time usage split by state, normalized across all CPU cores", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 70, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "percent" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byName", "options": "Idle - Waiting for something to happen" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Iowait - Waiting for I/O to complete" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EAB839", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Irq - Servicing interrupts" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Nice - Niced processes executing in user mode" }, "properties": [ { "id": "color", "value": { "fixedColor": "#C15C17", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Softirq - Servicing softirqs" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E24D42", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Steal - Time spent in other operating systems when running in a virtualized environment" }, "properties": [ { "id": "color", "value": { "fixedColor": "#FCE2DE", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "System - Processes executing in kernel mode" }, "properties": [ { "id": "color", "value": { "fixedColor": "#508642", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "User - Normal processes executing in user mode" }, "properties": [ { "id": "color", "value": { "fixedColor": "#5195CE", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Guest CPU usage" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "custom.stacking", "value": { "group": "A", "mode": "none" } } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 0, "y": 21 }, "id": 3, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 250 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "desc" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"system\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "interval": "", "legendFormat": "System - Processes executing in kernel mode", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"user\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "User - Normal processes executing in user mode", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"nice\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Nice - Niced processes executing in user mode", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"iowait\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Iowait - Waiting for I/O to complete", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"irq\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Irq - Servicing interrupts", "range": true, "refId": "E", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"softirq\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Softirq - Servicing softirqs", "range": true, "refId": "F", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"steal\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment", "range": true, "refId": "G", "step": 240 }, { "editorMode": "code", "expr": "sum(irate(node_cpu_seconds_total{mode=\"idle\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", "format": "time_series", "legendFormat": "Idle - Waiting for something to happen", "range": true, "refId": "H", "step": 240 }, { "editorMode": "code", "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]))) > 0", "format": "time_series", "legendFormat": "Guest CPU usage", "range": true, "refId": "I", "step": 240 } ], "title": "CPU", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Breakdown of physical memory and swap usage. Hardware-detected memory errors are also displayed", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Apps" }, "properties": [ { "id": "color", "value": { "fixedColor": "#629E51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Buffers" }, "properties": [ { "id": "color", "value": { "fixedColor": "#614D93", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#6D1F62", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Cached" }, "properties": [ { "id": "color", "value": { "fixedColor": "#511749", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Committed" }, "properties": [ { "id": "color", "value": { "fixedColor": "#508642", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Free" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A437C", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" }, "properties": [ { "id": "color", "value": { "fixedColor": "#CFFAFF", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Inactive" }, "properties": [ { "id": "color", "value": { "fixedColor": "#584477", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "PageTables" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A50A1", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Page_Tables" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A50A1", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "RAM_Free" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E0F9D7", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Slab" }, "properties": [ { "id": "color", "value": { "fixedColor": "#806EB7", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Slab_Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E0752D", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap - Swap memory usage" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap_Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#C15C17", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap_Free" }, "properties": [ { "id": "color", "value": { "fixedColor": "#2F575E", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Unused" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EAB839", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Unused - Free memory unassigned" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byRegexp", "options": "/.*Hardware Corrupted - *./" }, "properties": [ { "id": "custom.stacking", "value": { "group": false, "mode": "normal" } } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 12, "y": 21 }, "id": 24, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Apps - Memory used by user-space applications", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Cache - Parked file data (file content) cache", "range": true, "refId": "E", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Buffers - Block device (e.g. harddisk) cache", "range": true, "refId": "F", "step": 240 }, { "editorMode": "code", "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Unused - Free memory unassigned", "range": true, "refId": "G", "step": 240 }, { "editorMode": "code", "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", "legendFormat": "Swap - Swap space used", "range": true, "refId": "H", "step": 240 }, { "editorMode": "code", "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working", "range": true, "refId": "I", "step": 240 } ], "title": "Memory", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Incoming and outgoing network traffic per interface", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 0, "y": 433 }, "id": 84, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Network interface utilization as a percentage of its maximum capacity", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 12, "y": 433 }, "id": 338, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])\n / ignoring(speed) node_network_speed_bytes{instance=\"$node\",job=\"$job\", speed!=\"-1\"}", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "(rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])\n / ignoring(speed) node_network_speed_bytes{instance=\"$node\",job=\"$job\", speed!=\"-1\"})", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Saturation", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Disk I/O operations per second for each device", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (-) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "iops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 0, "y": 445 }, "id": 229, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])", "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk IOps", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Disk I/O throughput per device", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (-) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "Bps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read*./" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 12, "y": 445 }, "id": 42, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk Throughput", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Amount of available disk space per mounted filesystem, excluding rootfs. Based on block availability to non-root users", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 12, "w": 12, "x": 0, "y": 457 }, "id": 43, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "legendFormat": "{{mountpoint}}", "metric": "", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "hide": true, "legendFormat": "{{mountpoint}} - Free", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "hide": true, "legendFormat": "{{mountpoint}} - Size", "range": true, "refId": "C", "step": 240 } ], "title": "Filesystem Space Available", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Disk usage (used = total - available) per mountpoint", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 12, "w": 12, "x": 12, "y": 457 }, "id": 156, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "legendFormat": "{{mountpoint}}", "range": true, "refId": "A", "step": 240 } ], "title": "Filesystem Used", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Percentage of time the disk was actively processing I/O operations", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 40, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [] }, "gridPos": { "h": 12, "w": 12, "x": 0, "y": 469 }, "id": 127, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"} [$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{device}}", "range": true, "refId": "A", "step": 240 } ], "title": "Disk I/O Utilization", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "How often tasks experience CPU, memory, or I/O delays. “Some” indicates partial slowdown; “Full” indicates all tasks are stalled. Based on Linux PSI metrics:\nhttps://docs.kernel.org/accounting/psi.html", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "some (-) / full (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 10, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Some.*/" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 } ] }, { "matcher": { "id": "byRegexp", "options": "/.*Some.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 12, "w": 12, "x": 12, "y": 469 }, "id": 322, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "CPU - Some", "range": true, "refId": "CPU some", "step": 240 }, { "editorMode": "code", "expr": "rate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Memory - Some", "range": true, "refId": "Memory some", "step": 240 }, { "editorMode": "code", "expr": "rate(node_pressure_memory_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Memory - Full", "range": true, "refId": "Memory full", "step": 240 }, { "editorMode": "code", "expr": "rate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "I/O - Some", "range": true, "refId": "I/O some", "step": 240 }, { "editorMode": "code", "expr": "rate(node_pressure_io_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "I/O - Full", "range": true, "refId": "I/O full", "step": 240 }, { "editorMode": "code", "expr": "rate(node_pressure_irq_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "IRQ - Full", "range": true, "refId": "A", "step": 240 } ], "title": "Pressure Stall Information", "type": "timeseries" } ], "title": "CPU / Memory / Net / Disk", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 21 }, "id": 266, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Displays committed memory usage versus the system's commit limit. Exceeding the limit is allowed under Linux overcommit policies but may increase OOM risks under high load", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*CommitLimit - *./" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 732 }, "id": 135, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Committed_AS – Memory promised to processes (not necessarily used)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "CommitLimit - Max allowable committed memory", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Committed", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Memory currently dirty (modified but not yet written to disk), being actively written back, or held by writeback buffers. High dirty or writeback memory may indicate disk I/O pressure or delayed flushing", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 732 }, "id": 130, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Writeback – Memory currently being flushed to disk", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "WritebackTmp – FUSE temporary writeback buffers", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Dirty – Memory marked dirty (pending write to disk)", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "NFS Unstable – Pages sent to NFS server, awaiting storage commit", "range": true, "refId": "D", "step": 240 } ], "title": "Memory Writeback and Dirty", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Kernel slab memory usage, separated into reclaimable and non-reclaimable categories. Reclaimable memory can be freed under memory pressure (e.g., caches), while unreclaimable memory is locked by the kernel for core functions", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 932 }, "id": 131, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "SUnreclaim – Non-reclaimable slab memory (kernel objects)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "SReclaimable – Potentially reclaimable slab memory (e.g., inode cache)", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Slab", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Memory used for mapped files (such as libraries) and shared memory (shmem and tmpfs), including variants backed by huge pages", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 932 }, "id": 138, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Mapped – Memory mapped from files (e.g., libraries, mmap)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Shmem – Shared memory used by processes and tmpfs", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "ShmemHugePages – Shared memory (shmem/tmpfs) allocated with HugePages", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PMD Mapped – Shmem/tmpfs backed by Transparent HugePages (PMD)", "range": true, "refId": "D", "step": 240 } ], "title": "Memory Shared and Mapped", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Proportion of memory pages in the kernel's active and inactive LRU lists relative to total RAM. Active pages have been recently used, while inactive pages are less recently accessed but still resident in memory", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Active.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } } ] }, { "matcher": { "id": "byRegexp", "options": "/.*Inactive.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "dark-blue", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 942 }, "id": 136, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "(node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}) \n/ \n(node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})", "format": "time_series", "legendFormat": "Inactive – Less recently used memory, more likely to be reclaimed", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "(node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}) \n/ \n(node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})\n", "format": "time_series", "legendFormat": "Active – Recently used memory, retained unless under pressure", "range": true, "refId": "B", "step": 240 } ], "title": "Memory LRU Active / Inactive (%)", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Breakdown of memory pages in the kernel's active and inactive LRU lists, separated by anonymous (heap, tmpfs) and file-backed (caches, mmap) pages.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 942 }, "id": 191, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Inactive_file - File-backed memory on inactive LRU list", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Inactive_anon – Anonymous memory on inactive LRU (incl. tmpfs & swap cache)", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Active_file - File-backed memory on active LRU list", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Active_anon – Anonymous memory on active LRU (incl. tmpfs & swap cache)", "range": true, "refId": "D", "step": 240 } ], "title": "Memory LRU Active / Inactive Detail", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks kernel memory used for CPU-local structures, per-thread stacks, and bounce buffers used for I/O on DMA-limited devices. These areas are typically small but critical for low-level operations", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 952 }, "id": 160, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "KernelStack – Kernel stack memory (per-thread, non-reclaimable)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PerCPU – Dynamically allocated per-CPU memory (used by kernel modules)", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Bounce Memory – I/O buffer for DMA-limited devices", "range": true, "refId": "C", "step": 240 } ], "title": "Memory Kernel / CPU / IO", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Usage of the kernel's vmalloc area, which provides virtual memory allocations for kernel modules and drivers. Includes total, used, and largest free block sizes", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Total.*/" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 952 }, "id": 70, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Vmalloc Free Chunk – Largest available block in vmalloc area", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Vmalloc Total – Total size of the vmalloc memory area", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Vmalloc Used – Portion of vmalloc area currently in use", "range": true, "refId": "C", "step": 240 } ], "title": "Memory Vmalloc", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Memory used by anonymous pages (not backed by files), including standard and huge page allocations. Includes heap, stack, and memory-mapped anonymous regions", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 962 }, "id": 129, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "AnonHugePages – Anonymous memory using HugePages", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "AnonPages – Anonymous memory (non-file-backed)", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Anonymous", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Memory that is locked in RAM and cannot be swapped out. Includes both kernel-unevictable memory and user-level memory locked with mlock()", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" }, "properties": [ { "id": "color", "value": { "fixedColor": "#CFFAFF", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 962 }, "id": 137, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Unevictable – Kernel-pinned memory (not swappable)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Mlocked – Application-locked memory via mlock()", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Unevictable and MLocked", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "How much memory is directly mapped in the kernel using different page sizes (4K, 2M, 1G). Helps monitor large page utilization in the direct map region", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Active" }, "properties": [ { "id": "color", "value": { "fixedColor": "#99440A", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Buffers" }, "properties": [ { "id": "color", "value": { "fixedColor": "#58140C", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#6D1F62", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Cached" }, "properties": [ { "id": "color", "value": { "fixedColor": "#511749", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Committed" }, "properties": [ { "id": "color", "value": { "fixedColor": "#508642", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Dirty" }, "properties": [ { "id": "color", "value": { "fixedColor": "#6ED0E0", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Free" }, "properties": [ { "id": "color", "value": { "fixedColor": "#B7DBAB", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Inactive" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EA6460", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Mapped" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "PageTables" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A50A1", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Page_Tables" }, "properties": [ { "id": "color", "value": { "fixedColor": "#0A50A1", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Slab_Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EAB839", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap" }, "properties": [ { "id": "color", "value": { "fixedColor": "#BF1B00", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Swap_Cache" }, "properties": [ { "id": "color", "value": { "fixedColor": "#C15C17", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Total" }, "properties": [ { "id": "color", "value": { "fixedColor": "#511749", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Total RAM" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Total RAM + Swap" }, "properties": [ { "id": "color", "value": { "fixedColor": "#052B51", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "VmallocUsed" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EA6460", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 972 }, "id": 128, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "DirectMap 1G – Memory mapped with 1GB pages", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "DirectMap 2M – Memory mapped with 2MB pages", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "DirectMap 4K – Memory mapped with 4KB pages", "range": true, "refId": "C", "step": 240 } ], "title": "Memory DirectMap", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Displays HugePages memory usage in bytes, including allocated, free, reserved, and surplus memory. All values are calculated based on the number of huge pages multiplied by their configured size", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 972 }, "id": 140, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "HugePages Used – Currently allocated", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "HugePages Reserved – Promised but unused", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "HugePages Surplus – Dynamic pool extension", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "HugePages Total – Reserved memory", "range": true, "refId": "D", "step": 240 } ], "title": "Memory HugePages", "type": "timeseries" } ], "title": "Memory Meminfo", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 22 }, "id": 267, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of memory pages being read from or written to disk (page-in and page-out operations). High page-out may indicate memory pressure or swapping activity", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 733 }, "id": 176, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pagesin - Page in ops", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pagesout - Page out ops", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Pages In / Out", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate at which memory pages are being swapped in from or out to disk. High swap-out activity may indicate memory pressure", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 733 }, "id": 22, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pswpin - Pages swapped in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pswpout - Pages swapped out", "range": true, "refId": "B", "step": 240 } ], "title": "Memory Pages Swap In / Out", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of memory page faults, split into total, major (disk-backed), and derived minor (non-disk) faults. High major fault rates may indicate memory pressure or insufficient RAM", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byName", "options": "Pgfault - Page major and minor fault ops" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.stacking", "value": { "group": false, "mode": "none" } }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 913 }, "id": 175, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 350 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pgfault - Page major and minor fault ops", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pgmajfault - Major page fault ops", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Pgminfault - Minor page fault ops", "range": true, "refId": "C", "step": 240 } ], "title": "Memory Page Faults", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of Out-of-Memory (OOM) kill events. A non-zero value indicates the kernel has terminated one or more processes due to memory exhaustion", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byName", "options": "OOM Kills" }, "properties": [ { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 913 }, "id": 307, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "OOM Kills", "range": true, "refId": "A", "step": 240 } ], "title": "OOM Killer", "type": "timeseries" } ], "title": "Memory Vmstat", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 23 }, "id": 293, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks the system clock's estimated and maximum error, as well as its offset from the reference clock (e.g., via NTP). Useful for detecting synchronization drift", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 734 }, "id": 260, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Estimated error", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Offset local vs reference", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Maximum error", "range": true, "refId": "C", "step": 240 } ], "title": "Time Synchronized Drift", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "NTP phase-locked loop (PLL) time constant used by the kernel to control time adjustments. Lower values mean faster correction but less stability", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 734 }, "id": 291, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PLL Time Constant", "range": true, "refId": "A", "step": 240 } ], "title": "Time PLL Adjust", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows whether the system clock is synchronized to a reliable time source, and the current frequency correction ratio applied by the kernel to maintain synchronization", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 884 }, "id": 168, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Sync status (1 = ok)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Frequency Adjustment", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "Tick Interval", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "TAI Offset", "range": true, "refId": "D", "step": 240 } ], "title": "Time Synchronized Status", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Displays the PPS signal's frequency offset and stability (jitter) in hertz. Useful for monitoring high-precision time sources like GPS or atomic clocks", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "rothz" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 884 }, "id": 333, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_timex_pps_frequency_hertz{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PPS Frequency Offset", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_timex_pps_stability_hertz{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PPS Frequency Stability", "range": true, "refId": "B", "step": 240 } ], "title": "PPS Frequency / Stability", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks PPS signal timing jitter and shift compared to system clock", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 894 }, "id": 334, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_timex_pps_jitter_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PPS Jitter", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_timex_pps_shift_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PPS Shift", "range": true, "refId": "B", "step": 240 } ], "title": "PPS Time Accuracy", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of PPS synchronization diagnostics including calibration events, jitter violations, errors, and frequency stability exceedances", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 894 }, "id": 335, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_timex_pps_calibration_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "PPS Calibrations/sec", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_timex_pps_error_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "PPS Errors/sec", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_timex_pps_stability_exceeded_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "PPS Stability Exceeded/sec", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "irate(node_timex_pps_jitter_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "PPS Jitter Events/sec", "range": true, "refId": "D", "step": 240 } ], "title": "PPS Sync Events", "type": "timeseries" } ], "title": "System Timesync", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 24 }, "id": 312, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Processes currently in runnable or blocked states. Helps identify CPU contention or I/O wait bottlenecks.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 735 }, "id": 62, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Blocked (I/O Wait)", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Runnable (Ready for CPU)", "range": true, "refId": "B", "step": 240 } ], "title": "Processes Status", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Current number of processes in each state (e.g., running, sleeping, zombie). Requires --collector.processes to be enabled in node_exporter", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "D" }, "properties": [ { "id": "displayName", "value": "Uninterruptible Sleeping" } ] }, { "matcher": { "id": "byName", "options": "I" }, "properties": [ { "id": "displayName", "value": "Idle Kernel Thread" } ] }, { "matcher": { "id": "byName", "options": "R" }, "properties": [ { "id": "displayName", "value": "Running" } ] }, { "matcher": { "id": "byName", "options": "S" }, "properties": [ { "id": "displayName", "value": "Interruptible Sleeping" } ] }, { "matcher": { "id": "byName", "options": "T" }, "properties": [ { "id": "displayName", "value": "Stopped" } ] }, { "matcher": { "id": "byName", "options": "X" }, "properties": [ { "id": "displayName", "value": "Dead" } ] }, { "matcher": { "id": "byName", "options": "Z" }, "properties": [ { "id": "displayName", "value": "Zombie" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 735 }, "id": 315, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ state }}", "range": true, "refId": "A", "step": 240 } ], "title": "Processes Detailed States", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of new processes being created on the system (forks/sec).", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 765 }, "id": 148, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Process Forks per second", "range": true, "refId": "A", "step": 240 } ], "title": "Processes Forks", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows CPU saturation per core, calculated as the proportion of time spent waiting to run relative to total time demanded (running + waiting).", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*waiting.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 765 }, "id": 305, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "hide": true, "interval": "", "legendFormat": "CPU {{ cpu }} - Running", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "hide": true, "interval": "", "legendFormat": "CPU {{cpu}} - Waiting Queue", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])\n/\n(irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) + irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]))\n", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}}", "range": true, "refId": "C", "step": 240 } ], "title": "CPU Saturation per Core", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of active PIDs on the system and the configured maximum allowed. Useful for detecting PID exhaustion risk. Requires --collector.processes in node_exporter", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "PIDs limit" }, "properties": [ { "id": "color", "value": { "fixedColor": "#F2495C", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 775 }, "id": 313, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Number of PIDs", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "PIDs limit", "range": true, "refId": "B", "step": 240 } ], "title": "PIDs Number and Limit", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of active threads on the system and the configured thread limit. Useful for monitoring thread pressure. Requires --collector.processes in node_exporter", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "Threads limit" }, "properties": [ { "id": "color", "value": { "fixedColor": "#F2495C", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 775 }, "id": 314, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Allocated threads", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Threads limit", "range": true, "refId": "B", "step": 240 } ], "title": "Threads Number and Limit", "type": "timeseries" } ], "title": "System Processes", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 25 }, "id": 269, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Per-second rate of context switches and hardware interrupts. High values may indicate intense CPU or I/O activity", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 816 }, "id": 8, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Context switches", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "Interrupts", "range": true, "refId": "B", "step": 240 } ], "title": "Context Switches / Interrupts", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "System load average over 1, 5, and 15 minutes. Reflects the number of active or waiting processes. Values above CPU core count may indicate overload", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "CPU Core Count" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 816 }, "id": 7, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_load1{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Load 1m", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_load5{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Load 5m", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_load15{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Load 15m", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", "format": "time_series", "legendFormat": "CPU Core Count", "range": true, "refId": "D", "step": 240 } ], "title": "System Load", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Real-time CPU frequency scaling per core, including average minimum and maximum allowed scaling frequencies", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "hertz" }, "overrides": [ { "matcher": { "id": "byName", "options": "Max" }, "properties": [ { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } }, { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": false, "viz": false } } ] }, { "matcher": { "id": "byName", "options": "Min" }, "properties": [ { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } }, { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": false, "viz": false } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 826 }, "id": 321, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "desc" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_cpu_scaling_frequency_hertz{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "CPU {{ cpu }}", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "avg(node_cpu_scaling_frequency_max_hertz{instance=\"$node\",job=\"$job\"})", "format": "time_series", "interval": "", "legendFormat": "Max", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "avg(node_cpu_scaling_frequency_min_hertz{instance=\"$node\",job=\"$job\"})", "format": "time_series", "interval": "", "legendFormat": "Min", "range": true, "refId": "C", "step": 240 } ], "title": "CPU Frequency Scaling", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of scheduling timeslices executed per CPU. Reflects how frequently the scheduler switches tasks on each core", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 826 }, "id": 306, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{ cpu }}", "range": true, "refId": "A", "step": 240 } ], "title": "CPU Schedule Timeslices", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Breaks down hardware interrupts by type and device. Useful for diagnosing IRQ load on network, disk, or CPU interfaces. Requires --collector.interrupts to be enabled in node_exporter", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 836 }, "id": 259, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{ type }} - {{ info }}", "range": true, "refId": "A", "step": 240 } ], "title": "IRQ Detail", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of bits of entropy currently available to the system's random number generators (e.g., /dev/random). Low values may indicate that random number generation could block or degrade performance of cryptographic operations", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "decbits" }, "overrides": [ { "matcher": { "id": "byName", "options": "Entropy pool max" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 836 }, "id": 151, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Entropy available", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_entropy_pool_size_bits{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Entropy pool max", "range": true, "refId": "B", "step": 240 } ], "title": "Entropy", "type": "timeseries" } ], "title": "System Misc", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 26 }, "id": 304, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Monitors hardware sensor temperatures and critical thresholds as exposed by Linux hwmon. Includes CPU, GPU, and motherboard sensors where available", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "celsius" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Critical*./" }, "properties": [ { "id": "color", "value": { "fixedColor": "#E24D42", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 737 }, "id": 158, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }}", "range": true, "refId": "A", "step": 240 }, { "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }} Critical Alarm", "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }} Critical", "range": true, "refId": "C", "step": 240 }, { "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }} Critical Historical", "refId": "D", "step": 240 }, { "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }} Max", "refId": "E", "step": 240 } ], "title": "Hardware Temperature Monitor", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows how hard each cooling device (fan/throttle) is working relative to its maximum capacity", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percent" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Max*./" }, "properties": [ { "id": "color", "value": { "fixedColor": "#EF843C", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 737 }, "id": 300, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "100 * node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"} / node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ name }} - {{ type }} ", "range": true, "refId": "A", "step": 240 } ], "title": "Cooling Device Utilization", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows the online status of power supplies (e.g., AC, battery). A value of 1-Yes indicates the power supply is active/online", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "bool_yes_no" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 747 }, "id": 302, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ power_supply }} online", "range": true, "refId": "A", "step": 240 } ], "title": "Power Supply", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Displays the current fan speeds (RPM) from hardware sensors via the hwmon interface", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "rotrpm" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 747 }, "id": 325, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_hwmon_fan_rpm{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }}", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_hwmon_fan_min_rpm{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "interval": "", "legendFormat": "{{ chip_name }} {{ sensor }} rpm min", "range": true, "refId": "B", "step": 240 } ], "title": "Hardware Fan Speed", "type": "timeseries" } ], "title": "Hardware Misc", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 27 }, "id": 296, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Current number of systemd units in each operational state, such as active, failed, inactive, or transitioning", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "Failed" }, "properties": [ { "id": "color", "value": { "fixedColor": "#F2495C", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Active" }, "properties": [ { "id": "color", "value": { "fixedColor": "#73BF69", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Activating" }, "properties": [ { "id": "color", "value": { "fixedColor": "#C8F2C2", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Deactivating" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] }, { "matcher": { "id": "byName", "options": "Inactive" }, "properties": [ { "id": "color", "value": { "fixedColor": "dark-blue", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 4228 }, "id": 298, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}", "format": "time_series", "interval": "", "legendFormat": "Activating", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}", "format": "time_series", "interval": "", "legendFormat": "Active", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}", "format": "time_series", "interval": "", "legendFormat": "Deactivating", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}", "format": "time_series", "interval": "", "legendFormat": "Failed", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}", "format": "time_series", "interval": "", "legendFormat": "Inactive", "range": true, "refId": "E", "step": 240 } ], "title": "Systemd Units State", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Current number of active connections per systemd socket, as reported by the Node Exporter systemd collector", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 4228 }, "id": 331, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_systemd_socket_current_connections{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{ name }}", "range": true, "refId": "A", "step": 240 } ], "title": "Systemd Sockets Current", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of accepted connections per second for each systemd socket", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "eps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 4238 }, "id": 297, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{ name }}", "range": true, "refId": "A", "step": 240 } ], "title": "Systemd Sockets Accepted", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of systemd socket connection refusals per second, typically due to service unavailability or backlog overflow", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "eps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 4238 }, "id": 332, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_systemd_socket_refused_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{ name }}", "range": true, "refId": "A", "step": 240 } ], "title": "Systemd Sockets Refused", "type": "timeseries" } ], "title": "Systemd", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 28 }, "id": 270, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of I/O operations completed per second for the device (after merges), including both reads and writes", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (–) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "iops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] }, { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 29 }, "id": 9, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk Read/Write IOps", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of bytes read from or written to the device per second", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (–) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "Bps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] }, { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 29 }, "id": 33, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "exemplar": false, "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": false, "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk Read/Write Data", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (–) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "s" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] }, { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 389 }, "id": 37, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk Average Wait Time", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Average queue length of the requests that were issued to the device", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "none" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/sda_*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "#7EB26D", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 389 }, "id": 35, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}}", "range": true, "refId": "A", "step": 240 } ], "title": "Average Queue Size", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of read and write requests merged per second that were queued to the device", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "read (–) / write (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "iops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Read.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] }, { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 399 }, "id": 133, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "legendFormat": "{{device}} - Read", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "legendFormat": "{{device}} - Write", "range": true, "refId": "B", "step": 240 } ], "title": "Disk R/W Merged", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Percentage of time the disk spent actively processing I/O operations, including general I/O, discards (TRIM), and write cache flushes", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 399 }, "id": 36, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - General IO", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Discard/TRIM", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_flush_requests_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Flush (write cache)", "range": true, "refId": "C", "step": 240 } ], "title": "Time Spent Doing I/Os", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Per-second rate of discard (TRIM) and flush (write cache) operations. Useful for monitoring low-level disk activity on SSDs and advanced storage", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 409 }, "id": 301, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Discards completed", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Discards merged", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_disk_flush_requests_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}} - Flush", "range": true, "refId": "C", "step": 240 } ], "title": "Disk Ops Discards / Flush", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows how many disk sectors are discarded (TRIMed) per second. Useful for monitoring SSD behavior and storage efficiency", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 409 }, "id": 326, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_disk_discarded_sectors_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "{{device}}", "range": true, "refId": "A", "step": 240 } ], "title": "Disk Sectors Discarded Successfully", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of in-progress I/O requests at the time of sampling (active requests in the disk queue)", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "none" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/sda.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 419 }, "id": 34, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "{{device}}", "range": true, "refId": "A", "step": 240 } ], "title": "Instantaneous Queue Size", "type": "timeseries" } ], "title": "Storage Disk", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 29 }, "id": 271, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of file descriptors currently allocated system-wide versus the system limit. Important for detecting descriptor exhaustion risks", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Max.*/" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 30 }, "id": 28, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "single", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Max open files", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "Open files", "range": true, "refId": "B", "step": 240 } ], "title": "File Descriptor", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of free file nodes (inodes) available per mounted filesystem. A low count may prevent file creation even if disk space is available", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 30 }, "id": 41, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "legendFormat": "{{mountpoint}}", "range": true, "refId": "A", "step": 240 } ], "title": "File Nodes Free", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Indicates filesystems mounted in read-only mode or reporting device-level I/O errors.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "max": 1, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bool_yes_no" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 370 }, "id": 44, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "legendFormat": "{{mountpoint}} - ReadOnly", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}", "format": "time_series", "interval": "", "legendFormat": "{{mountpoint}} - Device error", "range": true, "refId": "B", "step": 240 } ], "title": "Filesystem in ReadOnly / Error", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of file nodes (inodes) available per mounted filesystem. Reflects maximum file capacity regardless of disk size", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 370 }, "id": 219, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}", "format": "time_series", "legendFormat": "{{mountpoint}}", "range": true, "refId": "A", "step": 240 } ], "title": "File Nodes Size", "type": "timeseries" } ], "title": "Storage Filesystem", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 30 }, "id": 272, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of network packets received and transmitted per second, by interface.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 31 }, "id": 60, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic by Packets", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of packet-level errors for each network interface. Receive errors may indicate physical or driver issues; transmit errors may reflect collisions or hardware faults", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 31 }, "id": 142, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic Errors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of dropped packets per network interface. Receive drops can indicate buffer overflow or driver issues; transmit drops may result from outbound congestion or queuing limits", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 251 }, "id": 143, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic Drop", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of compressed network packets received and transmitted per interface. These are common in low-bandwidth or special interfaces like PPP or SLIP", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 251 }, "id": 141, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic Compressed", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of incoming multicast packets received per network interface. Multicast is used by protocols such as mDNS, SSDP, and some streaming or cluster services", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 261 }, "id": 146, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 } ], "title": "Network Traffic Multicast", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of received packets that could not be processed due to missing protocol or handler in the kernel. May indicate unsupported traffic or misconfiguration", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 261 }, "id": 327, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_nohandler_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 } ], "title": "Network Traffic NoHandler", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of frame errors on received packets, typically caused by physical layer issues such as bad cables, duplex mismatches, or hardware problems", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 271 }, "id": 145, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 } ], "title": "Network Traffic Frame", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks FIFO buffer overrun errors on network interfaces. These occur when incoming or outgoing packets are dropped due to queue or buffer overflows, often indicating congestion or hardware limits", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 271 }, "id": 144, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "rate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Network Traffic Fifo", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of packet collisions detected during transmission. Mostly relevant on half-duplex or legacy Ethernet networks", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 281 }, "id": 232, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "A", "step": 240 } ], "title": "Network Traffic Collision", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of carrier errors during transmission. These typically indicate physical layer issues like faulty cabling or duplex mismatches", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 281 }, "id": 231, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "rate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "{{device}} - Tx out", "range": true, "refId": "A", "step": 240 } ], "title": "Network Traffic Carrier Errors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of ARP entries per interface. Useful for detecting excessive ARP traffic or table growth due to scanning or misconfiguration", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 291 }, "id": 230, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "{{ device }} ARP Table", "range": true, "refId": "A", "step": 240 } ], "title": "ARP Entries", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Current and maximum connection tracking entries used by Netfilter (nf_conntrack). High usage approaching the limit may cause packet drops or connection issues", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byName", "options": "NF conntrack limit" }, "properties": [ { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 291 }, "id": 61, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "NF conntrack entries", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "NF conntrack limit", "range": true, "refId": "B", "step": 240 } ], "title": "NF Conntrack", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Operational and physical link status of each network interface. Values are Yes for 'up' or link present, and No for 'down' or no carrier.\"", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bool_yes_no" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 301 }, "id": 309, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}", "format": "time_series", "hide": true, "legendFormat": "{{interface}} - Operational state UP", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}", "format": "time_series", "instant": false, "legendFormat": "{{device}} - Physical link", "refId": "B" } ], "title": "Network Operational Status", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Maximum speed of each network interface as reported by the operating system. This is a static hardware capability, not current throughput", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 0, "fieldMinMax": false, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 6, "x": 12, "y": 301 }, "id": 280, "options": { "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": false }, "maxVizHeight": 30, "minVizHeight": 16, "minVizWidth": 8, "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showUnfilled": true, "sizing": "manual", "valueMode": "color" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"} * 8", "format": "time_series", "legendFormat": "{{ device }}", "range": true, "refId": "A", "step": 240 } ], "title": "Speed", "type": "bargauge" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "MTU (Maximum Transmission Unit) in bytes for each network interface. Affects packet size and transmission efficiency", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "decimals": 0, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "none" }, "overrides": [] }, "gridPos": { "h": 10, "w": 6, "x": 18, "y": 301 }, "id": 288, "options": { "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": false }, "maxVizHeight": 30, "minVizHeight": 16, "minVizWidth": 8, "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showUnfilled": true, "sizing": "manual", "valueMode": "color" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "legendFormat": "{{ device }}", "range": true, "refId": "A", "step": 240 } ], "title": "MTU", "type": "bargauge" } ], "title": "Network Traffic", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 31 }, "id": 273, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks TCP socket usage and memory per node", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 32 }, "id": 63, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Allocated Sockets", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "In-Use Sockets", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Orphaned Sockets", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "TIME_WAIT Sockets", "range": true, "refId": "D", "step": 240 } ], "title": "Sockstat TCP", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of UDP and UDPLite sockets currently in use", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 32 }, "id": 124, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "UDPLite - In-Use Sockets", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "UDP - In-Use Sockets", "range": true, "refId": "B", "step": 240 } ], "title": "Sockstat UDP", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Total number of sockets currently in use across all protocols (TCP, UDP, UNIX, etc.), as reported by /proc/net/sockstat", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 42 }, "id": 126, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Total sockets", "range": true, "refId": "A", "step": 240 } ], "title": "Sockstat Used", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of FRAG and RAW sockets currently in use. RAW sockets are used for custom protocols or tools like ping; FRAG sockets are used internally for IP packet defragmentation", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 42 }, "id": 125, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "FRAG - In-Use Sockets", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "RAW - In-Use Sockets", "range": true, "refId": "C", "step": 240 } ], "title": "Sockstat FRAG / RAW", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Kernel memory used by TCP, UDP, and IP fragmentation buffers", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 52 }, "id": 220, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "TCP", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "UDP", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "Fragmentation", "range": true, "refId": "C" } ], "title": "Sockstat Memory Size", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Average memory used per socket (TCP/UDP). Helps tune net.ipv4.tcp_rmem / tcp_wmem", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 52 }, "id": 339, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"} / node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "TCP", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"} / node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "UDP", "range": true, "refId": "B", "step": 240 } ], "title": "Sockstat Average Socket Memory", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "TCP/UDP socket memory usage in kernel (in pages)", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 62 }, "id": 336, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "TCP", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "UDP", "range": true, "refId": "B", "step": 240 } ], "title": "TCP/UDP Kernel Buffer Memory Pages", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Packets processed and dropped by the softnet network stack per CPU. Drops may indicate CPU saturation or network driver limitations", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "drop (-) / process (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Dropped.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 62 }, "id": 290, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}} - Processed", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}} - Dropped", "range": true, "refId": "B", "step": 240 } ], "title": "Softnet Packets", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "How often the kernel was unable to process all packets in the softnet queue before time ran out. Frequent squeezes may indicate CPU contention or driver inefficiency", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "eps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 72 }, "id": 310, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}} - Times Squeezed", "range": true, "refId": "A", "step": 240 } ], "title": "Softnet Out of Quota", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks the number of packets processed or dropped by Receive Packet Steering (RPS), a mechanism to distribute packet processing across CPUs", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Dropped.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 72 }, "id": 330, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_softnet_received_rps_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}} - Processed", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_softnet_flow_limit_count_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "CPU {{cpu}} - Dropped", "range": true, "refId": "B", "step": 240 } ], "title": "Softnet RPS", "type": "timeseries" } ], "title": "Network Sockstat", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 32 }, "id": 274, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of octets sent and received at the IP layer, as reported by /proc/net/netstat", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "Bps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 163 }, "id": 221, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true, "width": 300 }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "IP Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "legendFormat": "IP Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "Netstat IP In / Out Octets", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of TCP segments sent and received per second, including data and control segments", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] }, { "matcher": { "id": "byRegexp", "options": "/.*Snd.*/" }, "properties": [] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 163 }, "id": 299, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "instant": false, "interval": "", "legendFormat": "TCP Rx in", "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "TCP Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "TCP In / Out", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of UDP datagrams sent and received per second, based on /proc/net/netstat", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 193 }, "id": 55, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "UDP In / Out", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of ICMP messages sent and received per second, including error and control messages", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 193 }, "id": 115, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "ICMP Rx in", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "ICMP Tx out", "range": true, "refId": "B", "step": 240 } ], "title": "ICMP In / Out", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks various TCP error and congestion-related events, including retransmissions, timeouts, dropped connections, and buffer issues", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 203 }, "id": 104, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "Listen Overflows", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "Listen Drops", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "SYN Retransmits", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "Segment Retransmits", "range": true, "refId": "D" }, { "editorMode": "code", "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "Receive Errors", "range": true, "refId": "E" }, { "editorMode": "code", "expr": "irate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "RST Sent", "range": true, "refId": "F" }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_TCPRcvQDrop{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "Receive Queue Drops", "range": true, "refId": "G" }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_TCPOFOQueue{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "Out-of-order Queued", "range": true, "refId": "H" }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_TCPTimeouts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "TCP Timeouts", "range": true, "refId": "I" } ], "title": "TCP Errors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of UDP and UDPLite datagram delivery errors, including missing listeners, buffer overflows, and protocol-specific issues", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "pps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 203 }, "id": 109, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP Rx in Errors", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP No Listener", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "interval": "", "legendFormat": "UDPLite Rx in Errors", "range": true, "refId": "C" }, { "editorMode": "code", "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP Rx in Buffer Errors", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "UDP Tx out Buffer Errors", "range": true, "refId": "E", "step": 240 } ], "title": "UDP Errors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of incoming ICMP messages that contained protocol-specific errors, such as bad checksums or invalid lengths", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "out (-) / in (+)", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "pps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*out.*/" }, "properties": [ { "id": "custom.transform", "value": "negative-Y" } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 213 }, "id": 50, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "ICMP Rx In", "range": true, "refId": "A", "step": 240 } ], "title": "ICMP Errors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of TCP SYN cookies sent, validated, and failed. These are used to protect against SYN flood attacks and manage TCP handshake resources under load", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "eps" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Failed.*/" }, "properties": [ { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 213 }, "id": 91, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "SYN Cookies Failed", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "SYN Cookies Validated", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "SYN Cookies Sent", "range": true, "refId": "C", "step": 240 } ], "title": "TCP SynCookie", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of currently established TCP connections and the system's max supported limit. On Linux, MaxConn may return -1 to indicate a dynamic/unlimited configuration", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Max*./" }, "properties": [ { "id": "color", "value": { "fixedColor": "#890F02", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } } ] } ] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 223 }, "id": 85, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Current Connections", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Max Connections", "range": true, "refId": "B", "step": 240 } ], "title": "TCP Connections", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of UDP packets currently queued in the receive (RX) and transmit (TX) buffers. A growing queue may indicate a bottleneck", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 223 }, "id": 337, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_udp_queues{instance=\"$node\",job=\"$job\",ip=\"v4\",queue=\"rx\"}", "format": "time_series", "interval": "", "legendFormat": "UDP Rx in Queue", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_udp_queues{instance=\"$node\",job=\"$job\",ip=\"v4\",queue=\"tx\"}", "format": "time_series", "interval": "", "legendFormat": "UDP Tx out Queue", "range": true, "refId": "B", "step": 240 } ], "title": "UDP Queue", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of TCP connection initiations per second. 'Active' opens are initiated by this host. 'Passive' opens are accepted from incoming connections", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "eps" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 233 }, "id": 82, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "Active Opens", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "Passive Opens", "range": true, "refId": "B", "step": 240 } ], "title": "TCP Direct Transition", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of TCP sockets in key connection states. Requires the --collector.tcpstat flag on node_exporter", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "noValue": "0", "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 233 }, "id": 320, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Established", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "FIN_WAIT2", "range": true, "refId": "B", "step": 240 }, { "editorMode": "code", "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "Listen", "range": true, "refId": "C", "step": 240 }, { "editorMode": "code", "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "TIME_WAIT", "range": true, "refId": "D", "step": 240 }, { "editorMode": "code", "expr": "node_tcp_connection_states{state=\"close_wait\", instance=\"$node\", job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "CLOSE_WAIT", "range": true, "refId": "E", "step": 240 } ], "title": "TCP Stat", "type": "timeseries" } ], "title": "Network Netstat", "type": "row" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 33 }, "id": 279, "panels": [ { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Duration of each individual collector executed during a Node Exporter scrape. Useful for identifying slow or failing collectors", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "normal" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "red", "value": 80 } ] }, "unit": "s" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 0, "y": 164 }, "id": 40, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{collector}}", "range": true, "refId": "A", "step": 240 } ], "title": "Node Exporter Scrape Time", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Rate of CPU time used by the process exposing this metric (user + system mode)", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "percentunit" }, "overrides": [] }, "gridPos": { "h": 10, "w": 12, "x": 12, "y": 164 }, "id": 308, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", "format": "time_series", "interval": "", "legendFormat": "Process CPU Usage", "range": true, "refId": "A", "step": 240 } ], "title": "Exporter Process CPU Usage", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Tracks the memory usage of the process exposing this metric (e.g., node_exporter), including current virtual memory and maximum virtual memory limit", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "bytes" }, "overrides": [ { "matcher": { "id": "byName", "options": "Virtual Memory Limit" }, "properties": [ { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } }, { "id": "color", "value": { "fixedColor": "dark-red", "mode": "fixed" } } ] }, { "__systemRef": "hideSeriesFrom", "matcher": { "id": "byNames", "options": { "mode": "exclude", "names": [ "Virtual Memory" ], "prefix": "All except:", "readOnly": true } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": false, "tooltip": false, "viz": true } } ] } ] }, "gridPos": { "h": 10, "w": 10, "x": 0, "y": 174 }, "id": 149, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "Virtual Memory", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "Virtual Memory Limit", "range": true, "refId": "B", "step": 240 } ], "title": "Exporter Processes Memory", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Number of file descriptors used by the exporter process versus its configured limit", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "links": [], "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green" } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byRegexp", "options": "/.*Max*./" }, "properties": [ { "id": "color", "value": { "fixedColor": "#890F02", "mode": "fixed" } }, { "id": "custom.fillOpacity", "value": 0 }, { "id": "custom.lineStyle", "value": { "dash": [ 10, 10 ], "fill": "dash" } } ] }, { "__systemRef": "hideSeriesFrom", "matcher": { "id": "byNames", "options": { "mode": "exclude", "names": [ "Open file descriptors" ], "prefix": "All except:", "readOnly": true } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": false, "tooltip": false, "viz": true } } ] } ] }, "gridPos": { "h": 10, "w": 10, "x": 10, "y": 174 }, "id": 64, "options": { "legend": { "calcs": [ "min", "mean", "max" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "hideZeros": false, "mode": "multi", "sort": "none" } }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "Maximum open file descriptors", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}", "interval": "", "legendFormat": "Open file descriptors", "range": true, "refId": "B", "step": 240 } ], "title": "Exporter File Descriptor Usage", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "description": "Shows whether each Node Exporter collector scraped successfully (1 = success, 0 = failure), and whether the textfile collector returned an error.", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "links": [], "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green" }, { "color": "dark-red", "value": 0 }, { "color": "green", "value": 1 } ] }, "unit": "bool" }, "overrides": [] }, "gridPos": { "h": 10, "w": 4, "x": 20, "y": 174 }, "id": 157, "options": { "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": false }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, "namePlacement": "auto", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showUnfilled": true, "sizing": "auto", "valueMode": "color" }, "pluginVersion": "11.6.1", "targets": [ { "editorMode": "code", "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "{{collector}}", "range": true, "refId": "A", "step": 240 }, { "editorMode": "code", "expr": "1 - node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}", "format": "time_series", "interval": "", "legendFormat": "textfile", "range": true, "refId": "B", "step": 240 } ], "title": "Node Exporter Scrape", "type": "bargauge" } ], "title": "Node Exporter", "type": "row" } ], "refresh": "1m", "schemaVersion": 41, "tags": [ "linux" ], "templating": { "list": [ { "current": {}, "includeAll": false, "label": "Datasource", "name": "ds_prometheus", "options": [], "query": "prometheus", "refresh": 1, "regex": "", "type": "datasource" }, { "current": {}, "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "definition": "", "includeAll": false, "label": "Job", "name": "job", "options": [], "query": { "query": "label_values(node_uname_info, job)", "refId": "Prometheus-job-Variable-Query" }, "refresh": 1, "regex": "", "sort": 1, "type": "query" }, { "current": {}, "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "definition": "label_values(node_uname_info{job=\"$job\"}, nodename)", "includeAll": false, "label": "Nodename", "name": "nodename", "options": [], "query": { "query": "label_values(node_uname_info{job=\"$job\"}, nodename)", "refId": "Prometheus-nodename-Variable-Query" }, "refresh": 1, "regex": "", "sort": 1, "type": "query" }, { "current": {}, "datasource": { "type": "prometheus", "uid": "${ds_prometheus}" }, "definition": "label_values(node_uname_info{job=\"$job\", nodename=\"$nodename\"}, instance)", "includeAll": false, "label": "Instance", "name": "node", "options": [], "query": { "query": "label_values(node_uname_info{job=\"$job\", nodename=\"$nodename\"}, instance)", "refId": "Prometheus-node-Variable-Query" }, "refresh": 1, "regex": "", "sort": 1, "type": "query" } ] }, "time": { "from": "now-24h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "Node Exporter Full", "uid": "rYdddlPWk", "version": 98, "weekStart": "", "gnetId": 1860 } ================================================ FILE: docker/grafana/dashboards/20192_rev1.json ================================================ { "__inputs": [], "__elements": {}, "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "10.1.5" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" }, { "type": "panel", "id": "timeseries", "name": "Time series", "version": "" } ], "annotations": { "list": [ { "builtIn": 1, "datasource": { "type": "datasource", "uid": "grafana" }, "enable": true, "hide": false, "iconColor": "#e0752d", "limit": 100, "name": "PMM Annotations", "showIn": 0, "tags": [ "pmm_annotation" ], "type": "tags" } ] }, "description": "Dashboard from Percona Monitoring and Management project. https://github.com/percona/grafana-dashboards", "editable": true, "fiscalYearStartMonth": 0, "gnetId": 20192, "graphTooltip": 1, "id": null, "links": [ { "icon": "dashboard", "includeVars": true, "keepTime": true, "tags": [ "QAN" ], "targetBlank": false, "title": "Query Analytics", "type": "link", "url": "/graph/dashboard/db/_pmm-query-analytics" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "OS" ], "targetBlank": false, "title": "OS", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "MySQL" ], "targetBlank": false, "title": "MySQL", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "MongoDB" ], "targetBlank": false, "title": "MongoDB", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "HA" ], "targetBlank": false, "title": "HA", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "Cloud" ], "targetBlank": false, "title": "Cloud", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "Insight" ], "targetBlank": false, "title": "Insight", "type": "dashboards" }, { "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "PMM" ], "targetBlank": false, "title": "PMM", "type": "dashboards" } ], "liveNow": false, "panels": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Shows how many times a command is executed per second on average during the selected interval.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 24, "x": 0, "y": 0 }, "id": 15, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_opcounters{instance=\"$host\", legacy_op_type!=\"command\"}[$interval])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "{{legacy_op_type}}", "range": true, "refId": "J", "step": 300 }, { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_opcountersRepl{instance=\"$host\", legacy_op_type!~\"(command|query|getmore)\"}[$interval])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "repl_{{legacy_op_type}}", "range": true, "refId": "A", "step": 300 }, { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_opcounters_deprecated_delete{instance=\"$host\"}[$interval])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "ttl_delete", "range": true, "refId": "B", "step": 300 } ], "title": "Command Operations", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Keep in mind the hard limit on the maximum number of connections set by your distribution.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 7 }, "id": 38, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "mongodb_ss_connections{instance=\"$host\", conn_type=\"current\"}", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Connections", "range": true, "refId": "J", "step": 300 } ], "title": "Connections", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Helps identify why connections are increasing. Shows active cursors compared to cursors being automatically killed after 10 minutes due to an application not closing the connection.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 7 }, "id": 25, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "mongodb_ss_metrics_cursor_open{instance=\"$host\"}", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "{{csr_type}}", "range": true, "refId": "J", "step": 300 } ], "title": "Cursors", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "When used in combination with 'Command Operations', this graph can help identify write amplification. For example, when one insert or update command actually inserts or updates hundreds, thousands, or even millions of documents.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 14 }, "id": 36, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_document{instance=\"$host\"}[$interval])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "{{doc_op_type}}", "range": true, "refId": "J", "step": 300 } ], "title": "Document Operations", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Any number of queued operations for long periods of time is an indication of possible issues. Find the cause and fix it before requests get stuck in the queue.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 14 }, "id": 40, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "mongodb_ss_globalLock_currentQueue{instance=\"$host\"}", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "{{count_type}}", "range": true, "refId": "J", "step": 300 } ], "title": "Queued Operations", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "percentunit" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 21 }, "id": 63, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "sum(increase(mongodb_ss_metrics_queryExecutor_scanned{instance=\"$host\"}[5m]))/sum(increase(mongodb_ss_metrics_document{instance=\"$host\", doc_op_type=\"returned\"}[5m]))", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Document", "range": true, "refId": "J", "step": 300 }, { "datasource": { "uid": "$datasource" }, "expr": "sum(increase(mongodb_mongod_metrics_query_executor_total{instance=\"$host\", state=\"scanned\"}[5m]))/sum(increase(mongodb_mongod_metrics_document_total{instance=\"$host\", state=\"returned\"}[5m]))", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Index", "refId": "A", "step": 300 } ], "title": "Query Efficiency", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 21 }, "id": 64, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_queryExecutor_scanned{instance=\"$host\"}[$interval]) or irate(mongodb_ss_metrics_queryExecutor_scanned{instance=\"$host\"}[5m])", "format": "time_series", "interval": "$interval", "intervalFactor": 1, "legendFormat": "scanned", "metric": "", "range": true, "refId": "A", "step": 300 }, { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_record_moves{instance=\"$host\"}[$interval]) or irate(mongodb_ss_metrics_record_moves{instance=\"$host\"}[5m])", "format": "time_series", "interval": "$interval", "intervalFactor": 1, "legendFormat": "moved", "range": true, "refId": "B", "step": 300 } ], "title": "Scanned and Moved Objects", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "This is useful for write-heavy workloads to understand how long it takes to verify writes and how many concurrent writes are occurring.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ms" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 28 }, "id": 41, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_commands_getLastError_total{instance=\"$host\"}[$interval]) or \nirate(mongodb_ss_metrics_commands_getLastError_total{instance=\"$host\"}[5m])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Write Wait Time", "range": true, "refId": "J", "step": 300 } ], "title": "getLastError Write Time", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "This is useful for write-heavy workloads to understand how long it takes to verify writes and how many concurrent writes are occurring.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ops" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 28 }, "id": 62, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_getLastError_wtime_totalMillis{instance=\"$host\"}[$interval]) or \nirate(mongodb_ss_metrics_getLastError_wtime_totalMillis{instance=\"$host\"}[5m])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Total", "range": true, "refId": "J", "step": 300 }, { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_metrics_getLastError_wtimeouts{instance=\"$host\"}[$interval]) or\nirate(mongodb_ss_metrics_getLastError_wtimeouts{instance=\"$host\"}[5m])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Timeouts", "range": true, "refId": "A", "step": 300 } ], "title": "getLastError Write Operations", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Asserts are not important by themselves, but you can correlate spikes with other graphs.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "short" }, "overrides": [ { "matcher": { "id": "byValue", "options": { "op": "gte", "reducer": "allIsZero", "value": 0 } }, "properties": [ { "id": "custom.hideFrom", "value": { "legend": true, "tooltip": true, "viz": false } } ] } ] }, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 35 }, "id": 37, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_asserts{instance=\"$host\"}[$interval]) or \nirate(mongodb_ss_asserts{instance=\"$host\"}[5m])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "{{assert_type}}", "range": true, "refId": "J", "step": 300 } ], "title": "Assert Events", "type": "timeseries" }, { "datasource": { "type": "prometheus", "uid": "$datasource" }, "description": "Page faults indicate that requests are processed from disk either because an index is missing or there is not enough memory for the data set. Consider increasing memory or sharding out.", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 20, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "never", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "short" }, "overrides": [] }, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 35 }, "id": 39, "links": [], "options": { "legend": { "calcs": [ "mean", "max", "min" ], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "pluginVersion": "10.1.5", "targets": [ { "datasource": { "uid": "$datasource" }, "editorMode": "code", "expr": "rate(mongodb_ss_extra_info_page_faults{instance=\"$host\"}[$interval]) or \nirate(mongodb_ss_extra_info_page_faults{instance=\"$host\"}[5m])", "format": "time_series", "hide": false, "interval": "$interval", "intervalFactor": 1, "legendFormat": "Faults", "range": true, "refId": "J", "step": 300 } ], "title": "Page Faults", "type": "timeseries" } ], "refresh": "1m", "schemaVersion": 38, "style": "dark", "tags": [ "MongoDB", "Percona" ], "templating": { "list": [ { "allFormat": "glob", "auto": true, "auto_count": 200, "auto_min": "1s", "current": { "selected": false, "text": "auto", "value": "$__auto_interval_interval" }, "datasource": "$datasource", "hide": 0, "includeAll": false, "label": "Interval", "multi": false, "multiFormat": "glob", "name": "interval", "options": [ { "selected": true, "text": "auto", "value": "$__auto_interval_interval" }, { "selected": false, "text": "1s", "value": "1s" }, { "selected": false, "text": "5s", "value": "5s" }, { "selected": false, "text": "1m", "value": "1m" }, { "selected": false, "text": "5m", "value": "5m" }, { "selected": false, "text": "1h", "value": "1h" }, { "selected": false, "text": "6h", "value": "6h" }, { "selected": false, "text": "1d", "value": "1d" } ], "query": "1s,5s,1m,5m,1h,6h,1d", "refresh": 2, "skipUrlSync": false, "type": "interval" }, { "allFormat": "blob", "current": {}, "datasource": { "uid": "$datasource" }, "definition": "", "hide": 0, "includeAll": true, "label": "Cluster", "multi": false, "multiFormat": "glob", "name": "cluster", "options": [], "query": "label_values(cluster)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 1, "type": "query", "useTags": false }, { "allFormat": "glob", "current": {}, "datasource": { "uid": "$datasource" }, "definition": "", "hide": 0, "includeAll": false, "label": "Instance", "multi": false, "multiFormat": "glob", "name": "host", "options": [], "query": "label_values({__name__=~\"mongodb_mongod_connections{cluster=~\\\"$cluster\\\"}|mongodb_up\"}, instance)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 1, "tagsQuery": "", "type": "query", "useTags": false }, { "current": { "selected": true, "text": "Prometheus", "value": "PBFA97CFB590B2093" }, "hide": 0, "includeAll": false, "label": "Datasource", "multi": false, "name": "datasource", "options": [], "query": "prometheus", "queryValue": "", "refresh": 1, "regex": "", "skipUrlSync": false, "type": "datasource" } ] }, "time": { "from": "now-12h", "to": "now" }, "timepicker": { "hidden": false, "now": true, "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "browser", "title": "MongoDB Overview", "uid": "6Lk9wMHik", "version": 10, "weekStart": "" } ================================================ FILE: docker/grafana/dashboards/agentlightning.json ================================================ { "annotations": { "list": [] }, "editable": true, "gnetId": null, "graphTooltip": 0, "id": null, "links": [], "panels": [ { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 100, "panels": [], "title": "LightningStore HTTP API", "type": "row" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 8, "x": 0, "y": 1 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (method, path) (rate(agl_http_latency_count[15s]))", "legendFormat": "{{method}} {{path}}" } ], "title": "HTTP Requests / Sec (by Path)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 8, "x": 8, "y": 1 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.50, sum by (le) (rate(agl_http_latency_bucket[15s])))", "legendFormat": "P50" }, { "expr": "histogram_quantile(0.95, sum by (le) (rate(agl_http_latency_bucket[15s])))", "legendFormat": "P95" }, { "expr": "histogram_quantile(0.99, sum by (le) (rate(agl_http_latency_bucket[15s])))", "legendFormat": "P99" } ], "title": "HTTP Latency (P50, P95, P99)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 8, "x": 16, "y": 1 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (method, path, status) (rate(agl_http_latency_count{status!~\"2..\"}[15s]))", "legendFormat": "{{method}} {{path}} {{status}}" } ], "title": "HTTP Errors / Sec (non-2xx)", "type": "timeseries" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 9 }, "id": 200, "panels": [], "title": "LightningStore RPC Metrics", "type": "row" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 8, "x": 0, "y": 10 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (method) (rate(agl_store_latency_count[15s]))", "legendFormat": "{{method}}" } ], "title": "Store Calls / Sec (by Method)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 8, "x": 8, "y": 10 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.50, sum by (le) (rate(agl_store_latency_bucket[15s])))", "legendFormat": "P50" }, { "expr": "histogram_quantile(0.95, sum by (le) (rate(agl_store_latency_bucket[15s])))", "legendFormat": "P95" }, { "expr": "histogram_quantile(0.99, sum by (le) (rate(agl_store_latency_bucket[15s])))", "legendFormat": "P99" } ], "title": "Store Latency (P50, P95, P99)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 8, "x": 16, "y": 10 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (method, status) (rate(agl_store_latency_count{status!=\"OK\"}[15s]))", "legendFormat": "{{method}} {{status}}" } ], "title": "Store Errors / Sec (by Method)", "type": "timeseries" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 18 }, "id": 300, "panels": [], "title": "Collection Metrics", "type": "row" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 19 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (store_pubmeth, operation) (rate(agl_collections_latency_count[15s]))", "legendFormat": "{{store_pubmeth}} {{operation}}" } ], "title": "Collection Ops / Sec (by Store Method)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 19 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (store_pubmeth, collection, status) (rate(agl_collections_latency_count{status!=\"OK\"}[15s]))", "legendFormat": "{{store_pubmeth}} {{collection}} {{status}}" } ], "title": "Collection Errors / Sec", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 27 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.50, sum by (le) (rate(agl_collections_latency_bucket[15s])))", "legendFormat": "P50" }, { "expr": "histogram_quantile(0.95, sum by (le) (rate(agl_collections_latency_bucket[15s])))", "legendFormat": "P95" }, { "expr": "histogram_quantile(0.99, sum by (le) (rate(agl_collections_latency_bucket[15s])))", "legendFormat": "P99" } ], "title": "Collection Latency (P50, P95, P99)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 27 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.95, sum by (le, store_pubmeth) (rate(agl_collections_latency_bucket[15s])))", "legendFormat": "{{store_pubmeth}}" } ], "title": "Collection Latency P95 (by Store Method)", "type": "timeseries" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 35 }, "id": 400, "panels": [], "title": "Rollout Outcomes", "type": "row" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 36 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (status) (rate(agl_rollouts_duration_count[15s]))", "legendFormat": "{{status}}" } ], "title": "Rollout Completion Rate (by Status)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "ops/s" } }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 36 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "sum by (mode) (rate(agl_rollouts_duration_count[15s]))", "legendFormat": "{{mode}}" } ], "title": "Rollout Completion Rate (by Mode)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 44 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.50, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))", "legendFormat": "P50" }, { "expr": "histogram_quantile(0.95, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))", "legendFormat": "P95" }, { "expr": "histogram_quantile(0.99, sum by (le) (rate(agl_rollouts_duration_bucket[15s])))", "legendFormat": "P99" } ], "title": "Rollout Duration (P50, P95, P99)", "type": "timeseries" }, { "fieldConfig": { "defaults": { "unit": "s" } }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 44 }, "options": { "legend": { "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "expr": "histogram_quantile(0.95, sum by (le, status) (rate(agl_rollouts_duration_bucket[15s])))", "legendFormat": "{{status}}" } ], "title": "Rollout Duration P95 (by Status)", "type": "timeseries" } ], "schemaVersion": 36, "style": "dark", "tags": [ "agentlightning" ], "templating": { "list": [] }, "time": { "from": "now-10m", "to": "now" }, "title": "Agent Lightning Metrics", "version": 2 } ================================================ FILE: docker/grafana/datasource.yml ================================================ apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true ================================================ FILE: docker/prometheus/prometheus.base.yml ================================================ global: scrape_interval: 5s evaluation_interval: 5s scrape_configs: - job_name: app static_configs: - targets: ["app-exporter:4748"] metrics_path: /v1/prometheus/ - job_name: node static_configs: - targets: ["node-exporter:9100"] ================================================ FILE: docker/prometheus/prometheus.mongo.yml ================================================ global: scrape_interval: 5s evaluation_interval: 5s scrape_configs: - job_name: app static_configs: - targets: ["app-exporter:4748"] metrics_path: /v1/prometheus/ - job_name: node static_configs: - targets: ["node-exporter:9100"] - job_name: mongodb static_configs: - targets: ["mongodb-exporter:9216"] ================================================ FILE: docker/setup.sh ================================================ #!/bin/bash set -euo pipefail # Create data directories mkdir -p data/prometheus data/mongo-container data/mongo-host data/grafana # Change permissions chmod 777 data/prometheus data/mongo-container data/mongo-host data/grafana ================================================ FILE: docs/algorithm-zoo/apo.md ================================================ # APO !!! tip "Shortcut" You can use the shortcut `agl.APO(...)` to create an APO instance. ```python import agentlightning as agl agl.APO(...) ``` ## Installation ```bash pip install agentlightning[apo] ``` ## Scope of Current Implementation APO is currently scoped to optimize a single prompt template. Optimizing multiple prompt templates is not supported yet. There is however no restriction on the number of variable placeholders in the prompt template (can range from zero to many). It's possible that invalid prompts are created during the optimization process. It is up to the agent developer to ensure that the prompt template is valid for the agent's task. ## Initial Prompt APO expects the initial prompt to be provided in the `initial_resources` dictionary. This can be done in two approaches: 1. Pass to the [Trainer][agentlightning.Trainer] constructor: ```python trainer = agl.Trainer( algorithm=agl.APO(...), initial_resources={"main_prompt": agl.PromptTemplate(template="You are a helpful assistant.", engine="f-string")}, ) ``` 2. Pass to the `[APO][agentlightning.algorithm.apo.APO].set_initial_resources()` method: ```python algo = agl.APO(...) algo.set_initial_resources( {"this_is_also_valid_key": agl.PromptTemplate(template="You are a helpful assistant.", engine="f-string")} ) ``` The resource key can be arbitrary, which is used to identify the prompt template in [class-based implementations](../tutorials/write-agents.md) when you have multiple resources. When the key changes, the agent developer needs to update the key in the `rollout` method. ## Tutorials Using APO - [Train the First Agent with APO](../how-to/train-first-agent.md) - A step-by-step guide to training your first agent using APO. ## References ::: agentlightning.algorithm.apo ================================================ FILE: docs/algorithm-zoo/index.md ================================================ # Algorithm Zoo AgentLightning includes several popular and frequently requested algorithms in its built-in library, allowing agent developers to use them directly. These algorithms are designed to be compatible with most agent scenarios. For customizing algorithms, see [Algorithm-side References](../reference/algorithm.md). | Algorithm | Optimizing Resources | Description | | --------- | ------------------- | ----------- | | [APO](./apo.md) | `{: [PromptTemplate][agentlightning.PromptTemplate]}` | Automatic Prompt Optimization (APO) algorithm using textual gradients and beam search. | | [VERL](./verl.md) | `{"main_llm": [LLM][agentlightning.LLM]}` | Reinforcement Learning with [VERL framework](https://github.com/volcengine/verl). | ================================================ FILE: docs/algorithm-zoo/verl.md ================================================ # VERL !!! tip "Shortcut" You can use the shortcut `agl.VERL(...)` to create a VERL instance. ```python import agentlightning as agl agl.VERL(...) ``` ## Installation ```bash pip install agentlightning[verl] ``` !!! warning To avoid various compatibility issues, follow the steps in the [installation guide](../tutorials/installation.md) to set up VERL and its dependencies. Installing VERL directly with `pip install agentlightning[verl]` can cause issues unless you already have a compatible version of PyTorch installed. !!! note "Notes for Readers" [VERL][agentlightning.algorithm.verl.VERL] in this article refers to a wrapper, provided by Agent-lightning, of the [VERL framework](https://github.com/volcengine/verl). It's a subclass of [agentlightning.Algorithm][]. To differentiate it from the VERL framework, all references to the VERL framework shall use the term "VERL framework", and all references to the Agent-lightning wrapper shall be highlighted with a link. ## Resources [VERL][agentlightning.algorithm.verl.VERL] expects no initial resources. The first LLM endpoint is directly deployed from the VERL configuration (`.actor_rollout_ref.model.path`). The resource key is always `main_llm`. [VERL][agentlightning.algorithm.verl.VERL] currently does not support optimizing multiple [LLM][agentlightning.LLM]s together. !!! note The resource type created by [VERL][agentlightning.algorithm.verl.VERL] is actually a [ProxyLLM][agentlightning.ProxyLLM], a subclass of the [LLM][agentlightning.LLM] type. This object contains a **URL template** provided by [VERL][agentlightning.algorithm.verl.VERL], with placeholders for rollout and attempt IDs. When a rollout begins on the agent side, the framework uses the current `rollout_id` and `attempt_id` to format this template, generating a final, unique endpoint URL. This URL points to [VERL][agentlightning.algorithm.verl.VERL]'s internal proxy, allowing it to intercept and log all traffic for that specific attempt, for tracing and load balancing purposes. For agents created with the `@rollout` decorator, this resolution of the template is handled automatically ("auto-stripped"). Class-based agents will need to manually resolve the [`ProxyLLM`][agentlightning.ProxyLLM] using the rollout context. ```python proxy_llm = resources["main_llm"] proxy_llm.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id) ``` ## Customization Internally, [VERL][agentlightning.algorithm.verl.VERL] decomposes each agent execution into prompt–response pairs via the [Adapter][agentlightning.Adapter] and associates them with their corresponding reward signals as [Triplet][agentlightning.Triplet] objects. The final scalar reward, derived from the last triplet in the trajectory, is propagated to all preceding triplets following the [identical assignment strategy](https://arxiv.org/abs/2508.03680). This ensures that each triplet receives an identical reward signal and can be independently optimized as a valid RLHF trajectory within the VERL framework. At present, [VERL][agentlightning.algorithm.verl.VERL] does not expose fine-grained control over its reward propagation or credit assignment mechanisms. Users requiring customized reward shaping or trajectory decomposition are advised to clone and modify the [VERL][agentlightning.algorithm.verl.VERL] source implementation directly. ## Tutorials Using VERL - [Train SQL Agent with RL](../how-to/train-sql-agent.md) - A practical example of training a SQL agent using VERL. ## References - Entrypoint ::: agentlightning.algorithm.verl ## References - Implementation ::: agentlightning.verl ================================================ FILE: docs/assets/store-openapi.json ================================================ {"openapi": "3.1.0", "info": {"title": "LightningStore Server", "version": "0.1.0"}, "paths": {"/v1/agl/health": {"get": {"summary": "Health", "operationId": "health_v1_agl_health_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/v1/agl/queues/rollouts/enqueue": {"post": {"summary": "Enqueue Rollouts", "operationId": "enqueue_rollouts_v1_agl_queues_rollouts_enqueue_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EnqueueManyRolloutsRequest"}}}, "required": true}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/Rollout"}, "type": "array", "title": "Response Enqueue Rollouts V1 Agl Queues Rollouts Enqueue Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/queues/rollouts/dequeue": {"post": {"summary": "Dequeue Rollouts", "operationId": "dequeue_rollouts_v1_agl_queues_rollouts_dequeue_post", "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/DequeueManyRolloutsRequest"}, {"type": "null"}], "title": "Request"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/AttemptedRollout"}, "type": "array", "title": "Response Dequeue Rollouts V1 Agl Queues Rollouts Dequeue Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts": {"post": {"summary": "Start Rollout", "operationId": "start_rollout_v1_agl_rollouts_post", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RolloutRequest"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AttemptedRollout"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"summary": "Query Rollouts", "operationId": "query_rollouts_v1_agl_rollouts_get", "parameters": [{"name": "status_in", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"enum": ["queuing", "preparing", "running", "failed", "succeeded", "cancelled", "requeuing"], "type": "string"}}, {"type": "null"}], "title": "Status In"}}, {"name": "rollout_id_in", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"type": "string"}}, {"type": "null"}], "title": "Rollout Id In"}}, {"name": "rollout_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Rollout Id Contains"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": -1, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By"}}, {"name": "sort_order", "in": "query", "required": false, "schema": {"enum": ["asc", "desc"], "type": "string", "default": "asc", "title": "Sort Order"}}, {"name": "filter_logic", "in": "query", "required": false, "schema": {"enum": ["and", "or"], "type": "string", "default": "and", "title": "Filter Logic"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Union_AttemptedRollout__Rollout__"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts/search": {"post": {"summary": "Search Rollouts", "operationId": "search_rollouts_v1_agl_rollouts_search_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/QueryRolloutsRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Union_AttemptedRollout__Rollout__"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts/{rollout_id}": {"get": {"summary": "Get Rollout By Id", "operationId": "get_rollout_by_id_v1_agl_rollouts__rollout_id__get", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AttemptedRollout"}, {"$ref": "#/components/schemas/Rollout"}], "title": "Response Get Rollout By Id V1 Agl Rollouts Rollout Id Get"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "post": {"summary": "Update Rollout", "operationId": "update_rollout_v1_agl_rollouts__rollout_id__post", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateRolloutRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Rollout"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts/{rollout_id}/attempts": {"post": {"summary": "Start Attempt", "operationId": "start_attempt_v1_agl_rollouts__rollout_id__attempts_post", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}], "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/StartAttemptRequest"}, {"type": "null"}], "title": "Request"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AttemptedRollout"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"summary": "Query Attempts", "operationId": "query_attempts_v1_agl_rollouts__rollout_id__attempts_get", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": -1, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "sequence_id", "title": "Sort By"}}, {"name": "sort_order", "in": "query", "required": false, "schema": {"enum": ["asc", "desc"], "type": "string", "default": "asc", "title": "Sort Order"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Attempt_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts/{rollout_id}/attempts/search": {"post": {"summary": "Search Attempts", "operationId": "search_attempts_v1_agl_rollouts__rollout_id__attempts_search_post", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/QueryAttemptsRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Attempt_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/rollouts/{rollout_id}/attempts/{attempt_id}": {"post": {"summary": "Update Attempt", "operationId": "update_attempt_v1_agl_rollouts__rollout_id__attempts__attempt_id__post", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}, {"name": "attempt_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Attempt Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateAttemptRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Attempt"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/workers": {"get": {"summary": "Query Workers", "operationId": "query_workers_v1_agl_workers_get", "parameters": [{"name": "status_in", "in": "query", "required": false, "schema": {"anyOf": [{"type": "array", "items": {"enum": ["idle", "busy", "unknown"], "type": "string"}}, {"type": "null"}], "title": "Status In"}}, {"name": "worker_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id Contains"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": -1, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By"}}, {"name": "sort_order", "in": "query", "required": false, "schema": {"enum": ["asc", "desc"], "type": "string", "default": "asc", "title": "Sort Order"}}, {"name": "filter_logic", "in": "query", "required": false, "schema": {"enum": ["and", "or"], "type": "string", "default": "and", "title": "Filter Logic"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Worker_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/workers/search": {"post": {"summary": "Search Workers", "operationId": "search_workers_v1_agl_workers_search_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/QueryWorkersRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Worker_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/workers/{worker_id}": {"get": {"summary": "Get Worker", "operationId": "get_worker_v1_agl_workers__worker_id__get", "parameters": [{"name": "worker_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Worker Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/Worker"}, {"type": "null"}], "title": "Response Get Worker V1 Agl Workers Worker Id Get"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "post": {"summary": "Update Worker", "operationId": "update_worker_v1_agl_workers__worker_id__post", "parameters": [{"name": "worker_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Worker Id"}}], "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/UpdateWorkerRequest"}, {"type": "null"}], "title": "Request"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Worker"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/statistics": {"get": {"summary": "Get Statistics", "operationId": "get_statistics_v1_agl_statistics_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"additionalProperties": true, "type": "object", "title": "Response Get Statistics V1 Agl Statistics Get"}}}}}}}, "/v1/agl/rollouts/{rollout_id}/attempts/latest": {"get": {"summary": "Get Latest Attempt", "operationId": "get_latest_attempt_v1_agl_rollouts__rollout_id__attempts_latest_get", "parameters": [{"name": "rollout_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/Attempt"}, {"type": "null"}], "title": "Response Get Latest Attempt V1 Agl Rollouts Rollout Id Attempts Latest Get"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/resources": {"get": {"summary": "Query Resources", "operationId": "query_resources_v1_agl_resources_get", "parameters": [{"name": "resources_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}}, {"name": "resources_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id Contains"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": -1, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By"}}, {"name": "sort_order", "in": "query", "required": false, "schema": {"enum": ["asc", "desc"], "type": "string", "default": "asc", "title": "Sort Order"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_ResourcesUpdate_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "post": {"summary": "Add Resources", "operationId": "add_resources_v1_agl_resources_post", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": {"oneOf": [{"$ref": "#/components/schemas/LLM"}, {"$ref": "#/components/schemas/ProxyLLM"}, {"$ref": "#/components/schemas/PromptTemplate"}], "discriminator": {"propertyName": "resource_type", "mapping": {"llm": "#/components/schemas/LLM", "proxy_llm": "#/components/schemas/ProxyLLM", "prompt_template": "#/components/schemas/PromptTemplate"}}}, "title": "Resources"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ResourcesUpdate"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/resources/latest": {"get": {"summary": "Get Latest Resources", "operationId": "get_latest_resources_v1_agl_resources_latest_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ResourcesUpdate"}, {"type": "null"}], "title": "Response Get Latest Resources V1 Agl Resources Latest Get"}}}}}}}, "/v1/agl/resources/{resources_id}": {"post": {"summary": "Update Resources", "operationId": "update_resources_v1_agl_resources__resources_id__post", "parameters": [{"name": "resources_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Resources Id"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": {"oneOf": [{"$ref": "#/components/schemas/LLM"}, {"$ref": "#/components/schemas/ProxyLLM"}, {"$ref": "#/components/schemas/PromptTemplate"}], "discriminator": {"propertyName": "resource_type", "mapping": {"llm": "#/components/schemas/LLM", "proxy_llm": "#/components/schemas/ProxyLLM", "prompt_template": "#/components/schemas/PromptTemplate"}}}, "title": "Resources"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ResourcesUpdate"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"summary": "Get Resources By Id", "operationId": "get_resources_by_id_v1_agl_resources__resources_id__get", "parameters": [{"name": "resources_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Resources Id"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ResourcesUpdate"}, {"type": "null"}], "title": "Response Get Resources By Id V1 Agl Resources Resources Id Get"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/spans": {"post": {"summary": "Add Span", "operationId": "add_span_v1_agl_spans_post", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Span-Input"}}}}, "responses": {"201": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/Span-Output"}, {"type": "null"}], "title": "Response Add Span V1 Agl Spans Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"summary": "Query Spans", "operationId": "query_spans_v1_agl_spans_get", "parameters": [{"name": "rollout_id", "in": "query", "required": true, "schema": {"type": "string", "title": "Rollout Id"}}, {"name": "attempt_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Attempt Id"}}, {"name": "trace_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}}, {"name": "trace_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id Contains"}}, {"name": "span_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Span Id"}}, {"name": "span_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Span Id Contains"}}, {"name": "parent_id", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id"}}, {"name": "parent_id_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id Contains"}}, {"name": "name", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}}, {"name": "name_contains", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name Contains"}}, {"name": "filter_logic", "in": "query", "required": false, "schema": {"enum": ["and", "or"], "type": "string", "default": "and", "title": "Filter Logic"}}, {"name": "limit", "in": "query", "required": false, "schema": {"type": "integer", "default": -1, "title": "Limit"}}, {"name": "offset", "in": "query", "required": false, "schema": {"type": "integer", "default": 0, "title": "Offset"}}, {"name": "sort_by", "in": "query", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "sequence_id", "title": "Sort By"}}, {"name": "sort_order", "in": "query", "required": false, "schema": {"enum": ["asc", "desc"], "type": "string", "default": "asc", "title": "Sort Order"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Span_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/spans/search": {"post": {"summary": "Search Spans", "operationId": "search_spans_v1_agl_spans_search_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/QuerySpansRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedResult_Span_"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/spans/next": {"post": {"summary": "Get Next Span Sequence Id", "operationId": "get_next_span_sequence_id_v1_agl_spans_next_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NextSequenceIdRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NextSequenceIdResponse"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/agl/waits/rollouts": {"post": {"summary": "Wait For Rollouts", "operationId": "wait_for_rollouts_v1_agl_waits_rollouts_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WaitForRolloutsRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/Rollout"}, "type": "array", "title": "Response Wait For Rollouts V1 Agl Waits Rollouts Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/v1/traces": {"post": {"summary": "Otlp Traces", "operationId": "otlp_traces_v1_traces_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/v1/metrics": {"post": {"summary": "Otlp Metrics", "operationId": "otlp_metrics_v1_metrics_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/v1/logs": {"post": {"summary": "Otlp Logs", "operationId": "otlp_logs_v1_logs_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/v1/development/profiles": {"post": {"summary": "Otlp Development Profiles", "operationId": "otlp_development_profiles_v1_development_profiles_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}}, "components": {"schemas": {"Attempt": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "attempt_id": {"type": "string", "title": "Attempt Id"}, "sequence_id": {"type": "integer", "title": "Sequence Id"}, "start_time": {"type": "number", "title": "Start Time"}, "end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "End Time"}, "status": {"type": "string", "enum": ["preparing", "running", "failed", "succeeded", "unresponsive", "timeout"], "title": "Status", "default": "preparing"}, "worker_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id"}, "last_heartbeat_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Heartbeat Time"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}}, "type": "object", "required": ["rollout_id", "attempt_id", "sequence_id", "start_time"], "title": "Attempt", "description": "Execution attempt for a rollout, including metadata for retries."}, "AttemptedRollout": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "input": {"title": "Input"}, "start_time": {"type": "number", "title": "Start Time"}, "end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "End Time"}, "mode": {"anyOf": [{"type": "string", "enum": ["train", "val", "test"]}, {"type": "null"}], "title": "Mode"}, "resources_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}, "status": {"type": "string", "enum": ["queuing", "preparing", "running", "failed", "succeeded", "cancelled", "requeuing"], "title": "Status", "default": "queuing"}, "config": {"$ref": "#/components/schemas/RolloutConfig"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "attempt": {"$ref": "#/components/schemas/Attempt"}}, "type": "object", "required": ["rollout_id", "input", "start_time", "attempt"], "title": "AttemptedRollout", "description": "Rollout paired with the currently active attempt."}, "DequeueManyRolloutsRequest": {"properties": {"limit": {"type": "integer", "title": "Limit", "default": 1}, "worker_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id"}}, "type": "object", "title": "DequeueManyRolloutsRequest"}, "EnqueueManyRolloutsRequest": {"properties": {"rollouts": {"items": {"$ref": "#/components/schemas/EnqueueRolloutRequest"}, "type": "array", "title": "Rollouts"}}, "type": "object", "required": ["rollouts"], "title": "EnqueueManyRolloutsRequest"}, "EnqueueRolloutRequest": {"properties": {"input": {"title": "Input"}, "mode": {"anyOf": [{"type": "string", "enum": ["train", "val", "test"]}, {"type": "null"}], "title": "Mode"}, "resources_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}, "config": {"anyOf": [{"$ref": "#/components/schemas/RolloutConfig"}, {"type": "null"}]}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}}, "type": "object", "required": ["input"], "title": "EnqueueRolloutRequest", "description": "Payload describing a rollout to be queued via [`enqueue_rollout`][agentlightning.LightningStore.enqueue_rollout].\n\nA subset of fields from [`Rollout`][agentlightning.Rollout] used for queuing new rollouts."}, "Event": {"properties": {"name": {"type": "string", "title": "Name"}, "attributes": {"additionalProperties": {"anyOf": [{"type": "string"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"items": {"type": "string"}, "type": "array"}, {"items": {"type": "boolean"}, "type": "array"}, {"items": {"type": "integer"}, "type": "array"}, {"items": {"type": "number"}, "type": "array"}]}, "type": "object", "title": "Attributes"}, "timestamp": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Timestamp"}}, "additionalProperties": true, "type": "object", "required": ["name", "attributes"], "title": "Event", "description": "Serializable representation of OpenTelemetry `Event` values."}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "LLM": {"properties": {"resource_type": {"type": "string", "const": "llm", "title": "Resource Type", "default": "llm"}, "endpoint": {"type": "string", "title": "Endpoint"}, "model": {"type": "string", "title": "Model"}, "api_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Api Key"}, "sampling_parameters": {"additionalProperties": true, "type": "object", "title": "Sampling Parameters"}}, "type": "object", "required": ["endpoint", "model"], "title": "LLM", "description": "Resource that identifies an LLM endpoint and its configuration."}, "Link": {"properties": {"context": {"$ref": "#/components/schemas/SpanContext"}, "attributes": {"anyOf": [{"additionalProperties": {"anyOf": [{"type": "string"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"items": {"type": "string"}, "type": "array"}, {"items": {"type": "boolean"}, "type": "array"}, {"items": {"type": "integer"}, "type": "array"}, {"items": {"type": "number"}, "type": "array"}]}, "type": "object"}, {"type": "null"}], "title": "Attributes"}}, "additionalProperties": true, "type": "object", "required": ["context"], "title": "Link", "description": "Serializable representation of OpenTelemetry `Link` values."}, "NextSequenceIdRequest": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "attempt_id": {"type": "string", "title": "Attempt Id"}}, "type": "object", "required": ["rollout_id", "attempt_id"], "title": "NextSequenceIdRequest"}, "NextSequenceIdResponse": {"properties": {"sequence_id": {"type": "integer", "title": "Sequence Id"}}, "type": "object", "required": ["sequence_id"], "title": "NextSequenceIdResponse"}, "OtelResource": {"properties": {"attributes": {"additionalProperties": {"anyOf": [{"type": "string"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"items": {"type": "string"}, "type": "array"}, {"items": {"type": "boolean"}, "type": "array"}, {"items": {"type": "integer"}, "type": "array"}, {"items": {"type": "number"}, "type": "array"}]}, "type": "object", "title": "Attributes"}, "schema_url": {"type": "string", "title": "Schema Url"}}, "type": "object", "required": ["attributes", "schema_url"], "title": "OtelResource", "description": "Serializable representation of OpenTelemetry `Resource` values.\n\nNamed as `OtelResource` to avoid confusion with the [`Resource`][agentlightning.Resource] class.\nUsers will very rarely need to construct this class directly. Most of the times,\nthey deal with the [`Resource`][agentlightning.Resource] class instead, which describes\na very different concept."}, "PaginatedResult_Attempt_": {"properties": {"items": {"items": {"$ref": "#/components/schemas/Attempt"}, "type": "array", "title": "Items"}, "limit": {"type": "integer", "title": "Limit"}, "offset": {"type": "integer", "title": "Offset"}, "total": {"type": "integer", "title": "Total"}}, "type": "object", "required": ["items", "limit", "offset", "total"], "title": "PaginatedResult[Attempt]"}, "PaginatedResult_ResourcesUpdate_": {"properties": {"items": {"items": {"$ref": "#/components/schemas/ResourcesUpdate"}, "type": "array", "title": "Items"}, "limit": {"type": "integer", "title": "Limit"}, "offset": {"type": "integer", "title": "Offset"}, "total": {"type": "integer", "title": "Total"}}, "type": "object", "required": ["items", "limit", "offset", "total"], "title": "PaginatedResult[ResourcesUpdate]"}, "PaginatedResult_Span_": {"properties": {"items": {"items": {"$ref": "#/components/schemas/Span-Output"}, "type": "array", "title": "Items"}, "limit": {"type": "integer", "title": "Limit"}, "offset": {"type": "integer", "title": "Offset"}, "total": {"type": "integer", "title": "Total"}}, "type": "object", "required": ["items", "limit", "offset", "total"], "title": "PaginatedResult[Span]"}, "PaginatedResult_Union_AttemptedRollout__Rollout__": {"properties": {"items": {"items": {"anyOf": [{"$ref": "#/components/schemas/AttemptedRollout"}, {"$ref": "#/components/schemas/Rollout"}]}, "type": "array", "title": "Items"}, "limit": {"type": "integer", "title": "Limit"}, "offset": {"type": "integer", "title": "Offset"}, "total": {"type": "integer", "title": "Total"}}, "type": "object", "required": ["items", "limit", "offset", "total"], "title": "PaginatedResult[Union[AttemptedRollout, Rollout]]"}, "PaginatedResult_Worker_": {"properties": {"items": {"items": {"$ref": "#/components/schemas/Worker"}, "type": "array", "title": "Items"}, "limit": {"type": "integer", "title": "Limit"}, "offset": {"type": "integer", "title": "Offset"}, "total": {"type": "integer", "title": "Total"}}, "type": "object", "required": ["items", "limit", "offset", "total"], "title": "PaginatedResult[Worker]"}, "PromptTemplate": {"properties": {"resource_type": {"type": "string", "const": "prompt_template", "title": "Resource Type", "default": "prompt_template"}, "template": {"type": "string", "title": "Template"}, "engine": {"type": "string", "enum": ["jinja", "f-string", "poml"], "title": "Engine"}}, "type": "object", "required": ["template", "engine"], "title": "PromptTemplate", "description": "Resource describing a reusable prompt template."}, "ProxyLLM": {"properties": {"resource_type": {"type": "string", "const": "proxy_llm", "title": "Resource Type", "default": "proxy_llm"}, "endpoint": {"type": "string", "title": "Endpoint"}, "model": {"type": "string", "title": "Model"}, "api_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Api Key"}, "sampling_parameters": {"additionalProperties": true, "type": "object", "title": "Sampling Parameters"}}, "type": "object", "required": ["endpoint", "model"], "title": "ProxyLLM", "description": "LLM resource that rewrites endpoints through [`LLMProxy`][agentlightning.LLMProxy].\n\nThe proxy injects rollout- and attempt-specific routing information into the\nendpoint so that downstream services can attribute requests correctly."}, "QueryAttemptsRequest": {"properties": {"limit": {"type": "integer", "title": "Limit", "default": -1}, "offset": {"type": "integer", "title": "Offset", "default": 0}, "sort_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By", "default": "sequence_id"}, "sort_order": {"type": "string", "enum": ["asc", "desc"], "title": "Sort Order", "default": "asc"}}, "type": "object", "title": "QueryAttemptsRequest"}, "QueryRolloutsRequest": {"properties": {"status_in": {"anyOf": [{"items": {"type": "string", "enum": ["queuing", "preparing", "running", "failed", "succeeded", "cancelled", "requeuing"]}, "type": "array"}, {"type": "null"}], "title": "Status In"}, "rollout_id_in": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Rollout Id In"}, "rollout_id_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Rollout Id Contains"}, "limit": {"type": "integer", "title": "Limit", "default": -1}, "offset": {"type": "integer", "title": "Offset", "default": 0}, "sort_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By"}, "sort_order": {"type": "string", "enum": ["asc", "desc"], "title": "Sort Order", "default": "asc"}, "filter_logic": {"type": "string", "enum": ["and", "or"], "title": "Filter Logic", "default": "and"}}, "type": "object", "title": "QueryRolloutsRequest"}, "QuerySpansRequest": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "attempt_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Attempt Id"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "trace_id_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id Contains"}, "span_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Span Id"}, "span_id_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Span Id Contains"}, "parent_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id"}, "parent_id_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id Contains"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "name_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name Contains"}, "filter_logic": {"type": "string", "enum": ["and", "or"], "title": "Filter Logic", "default": "and"}, "limit": {"type": "integer", "title": "Limit", "default": -1}, "offset": {"type": "integer", "title": "Offset", "default": 0}, "sort_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By", "default": "sequence_id"}, "sort_order": {"type": "string", "enum": ["asc", "desc"], "title": "Sort Order", "default": "asc"}}, "type": "object", "required": ["rollout_id"], "title": "QuerySpansRequest"}, "QueryWorkersRequest": {"properties": {"status_in": {"anyOf": [{"items": {"type": "string", "enum": ["idle", "busy", "unknown"]}, "type": "array"}, {"type": "null"}], "title": "Status In"}, "worker_id_contains": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id Contains"}, "limit": {"type": "integer", "title": "Limit", "default": -1}, "offset": {"type": "integer", "title": "Offset", "default": 0}, "sort_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Sort By"}, "sort_order": {"type": "string", "enum": ["asc", "desc"], "title": "Sort Order", "default": "asc"}, "filter_logic": {"type": "string", "enum": ["and", "or"], "title": "Filter Logic", "default": "and"}}, "type": "object", "title": "QueryWorkersRequest"}, "ResourcesUpdate": {"properties": {"resources_id": {"type": "string", "title": "Resources Id"}, "create_time": {"type": "number", "title": "Create Time"}, "update_time": {"type": "number", "title": "Update Time"}, "version": {"type": "integer", "title": "Version"}, "resources": {"additionalProperties": {"oneOf": [{"$ref": "#/components/schemas/LLM"}, {"$ref": "#/components/schemas/ProxyLLM"}, {"$ref": "#/components/schemas/PromptTemplate"}], "discriminator": {"propertyName": "resource_type", "mapping": {"llm": "#/components/schemas/LLM", "prompt_template": "#/components/schemas/PromptTemplate", "proxy_llm": "#/components/schemas/ProxyLLM"}}}, "type": "object", "title": "Resources"}}, "type": "object", "required": ["resources_id", "create_time", "update_time", "version", "resources"], "title": "ResourcesUpdate", "description": "Update payload broadcast to clients when resources change."}, "Rollout": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "input": {"title": "Input"}, "start_time": {"type": "number", "title": "Start Time"}, "end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "End Time"}, "mode": {"anyOf": [{"type": "string", "enum": ["train", "val", "test"]}, {"type": "null"}], "title": "Mode"}, "resources_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}, "status": {"type": "string", "enum": ["queuing", "preparing", "running", "failed", "succeeded", "cancelled", "requeuing"], "title": "Status", "default": "queuing"}, "config": {"$ref": "#/components/schemas/RolloutConfig"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}}, "type": "object", "required": ["rollout_id", "input", "start_time"], "title": "Rollout"}, "RolloutConfig": {"properties": {"timeout_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Timeout Seconds"}, "unresponsive_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Unresponsive Seconds"}, "max_attempts": {"type": "integer", "minimum": 1.0, "title": "Max Attempts", "default": 1}, "retry_condition": {"items": {"type": "string", "enum": ["preparing", "running", "failed", "succeeded", "unresponsive", "timeout"]}, "type": "array", "title": "Retry Condition"}}, "type": "object", "title": "RolloutConfig", "description": "Configuration controlling rollout retries and timeouts."}, "RolloutRequest": {"properties": {"input": {"title": "Input"}, "mode": {"anyOf": [{"type": "string", "enum": ["train", "val", "test"]}, {"type": "null"}], "title": "Mode"}, "resources_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}, "config": {"anyOf": [{"$ref": "#/components/schemas/RolloutConfig"}, {"type": "null"}]}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "worker_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id"}}, "type": "object", "required": ["input"], "title": "RolloutRequest"}, "Span-Input": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "attempt_id": {"type": "string", "title": "Attempt Id"}, "sequence_id": {"type": "integer", "title": "Sequence Id"}, "trace_id": {"type": "string", "title": "Trace Id"}, "span_id": {"type": "string", "title": "Span Id"}, "parent_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id"}, "name": {"type": "string", "title": "Name"}, "status": {"$ref": "#/components/schemas/TraceStatus"}, "attributes": {"additionalProperties": {"anyOf": [{"type": "string"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"items": {"type": "string"}, "type": "array"}, {"items": {"type": "boolean"}, "type": "array"}, {"items": {"type": "integer"}, "type": "array"}, {"items": {"type": "number"}, "type": "array"}]}, "type": "object", "title": "Attributes"}, "events": {"items": {"$ref": "#/components/schemas/Event"}, "type": "array", "title": "Events"}, "links": {"items": {"$ref": "#/components/schemas/Link"}, "type": "array", "title": "Links"}, "start_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Start Time"}, "end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "End Time"}, "context": {"anyOf": [{"$ref": "#/components/schemas/SpanContext"}, {"type": "null"}]}, "parent": {"anyOf": [{"$ref": "#/components/schemas/SpanContext"}, {"type": "null"}]}, "resource": {"$ref": "#/components/schemas/OtelResource"}}, "additionalProperties": true, "type": "object", "required": ["rollout_id", "attempt_id", "sequence_id", "trace_id", "span_id", "parent_id", "name", "status", "attributes", "events", "links", "start_time", "end_time", "context", "parent", "resource"], "title": "Span", "description": "Agent Lightning's canonical span model used for persistence and analytics.\n\nThe model captures the most relevant fields from\n`opentelemetry.sdk.trace.ReadableSpan` instances while preserving unmodeled\nattributes in Pydantic `BaseModel`'s extra storage. This keeps the serialized format\nstable even as upstream OpenTelemetry types evolve."}, "Span-Output": {"properties": {"rollout_id": {"type": "string", "title": "Rollout Id"}, "attempt_id": {"type": "string", "title": "Attempt Id"}, "sequence_id": {"type": "integer", "title": "Sequence Id"}, "trace_id": {"type": "string", "title": "Trace Id"}, "span_id": {"type": "string", "title": "Span Id"}, "parent_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Id"}, "name": {"type": "string", "title": "Name"}, "status": {"$ref": "#/components/schemas/TraceStatus"}, "attributes": {"additionalProperties": {"anyOf": [{"type": "string"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"items": {"type": "string"}, "type": "array"}, {"items": {"type": "boolean"}, "type": "array"}, {"items": {"type": "integer"}, "type": "array"}, {"items": {"type": "number"}, "type": "array"}]}, "type": "object", "title": "Attributes"}, "events": {"items": {"$ref": "#/components/schemas/Event"}, "type": "array", "title": "Events"}, "links": {"items": {"$ref": "#/components/schemas/Link"}, "type": "array", "title": "Links"}, "start_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Start Time"}, "end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "End Time"}, "context": {"anyOf": [{"$ref": "#/components/schemas/SpanContext"}, {"type": "null"}]}, "parent": {"anyOf": [{"$ref": "#/components/schemas/SpanContext"}, {"type": "null"}]}, "resource": {"$ref": "#/components/schemas/OtelResource"}}, "additionalProperties": true, "type": "object", "required": ["rollout_id", "attempt_id", "sequence_id", "trace_id", "span_id", "parent_id", "name", "status", "attributes", "events", "links", "start_time", "end_time", "context", "parent", "resource"], "title": "Span", "description": "Agent Lightning's canonical span model used for persistence and analytics.\n\nThe model captures the most relevant fields from\n`opentelemetry.sdk.trace.ReadableSpan` instances while preserving unmodeled\nattributes in Pydantic `BaseModel`'s extra storage. This keeps the serialized format\nstable even as upstream OpenTelemetry types evolve."}, "SpanContext": {"properties": {"trace_id": {"type": "string", "title": "Trace Id"}, "span_id": {"type": "string", "title": "Span Id"}, "is_remote": {"type": "boolean", "title": "Is Remote"}, "trace_state": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Trace State"}}, "additionalProperties": true, "type": "object", "required": ["trace_id", "span_id", "is_remote", "trace_state"], "title": "SpanContext", "description": "Pydantic representation of `opentelemetry.trace.SpanContext` values."}, "StartAttemptRequest": {"properties": {"worker_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id"}}, "type": "object", "title": "StartAttemptRequest"}, "TraceStatus": {"properties": {"status_code": {"type": "string", "enum": ["UNSET", "OK", "ERROR"], "title": "Status Code"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}}, "additionalProperties": true, "type": "object", "required": ["status_code"], "title": "TraceStatus", "description": "Serializable variant of `opentelemetry.trace.Status`."}, "UpdateAttemptRequest": {"properties": {"status": {"anyOf": [{"type": "string", "enum": ["preparing", "running", "failed", "succeeded", "unresponsive", "timeout"]}, {"type": "null"}], "title": "Status"}, "worker_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Id"}, "last_heartbeat_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Heartbeat Time"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}}, "type": "object", "title": "UpdateAttemptRequest"}, "UpdateRolloutRequest": {"properties": {"input": {"anyOf": [{}, {"type": "null"}], "title": "Input"}, "mode": {"anyOf": [{"type": "string", "enum": ["train", "val", "test"]}, {"type": "null"}], "title": "Mode"}, "resources_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Resources Id"}, "status": {"anyOf": [{"type": "string", "enum": ["queuing", "preparing", "running", "failed", "succeeded", "cancelled", "requeuing"]}, {"type": "null"}], "title": "Status"}, "config": {"anyOf": [{"$ref": "#/components/schemas/RolloutConfig"}, {"type": "null"}]}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}}, "type": "object", "title": "UpdateRolloutRequest"}, "UpdateWorkerRequest": {"properties": {"heartbeat_stats": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Heartbeat Stats"}}, "type": "object", "title": "UpdateWorkerRequest"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "WaitForRolloutsRequest": {"properties": {"rollout_ids": {"items": {"type": "string"}, "type": "array", "title": "Rollout Ids"}, "timeout": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Timeout"}}, "type": "object", "required": ["rollout_ids"], "title": "WaitForRolloutsRequest"}, "Worker": {"properties": {"worker_id": {"type": "string", "title": "Worker Id"}, "status": {"type": "string", "enum": ["idle", "busy", "unknown"], "title": "Status", "default": "unknown"}, "heartbeat_stats": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Heartbeat Stats"}, "last_heartbeat_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Heartbeat Time"}, "last_dequeue_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Dequeue Time"}, "last_busy_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Busy Time"}, "last_idle_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Last Idle Time"}, "current_rollout_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Rollout Id"}, "current_attempt_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Attempt Id"}}, "type": "object", "required": ["worker_id"], "title": "Worker", "description": "Worker information. This is actually the same as Runner info."}}}} ================================================ FILE: docs/changelog.md ================================================ # Changelog ## Agent-lightning v0.3.0 (12/24/2025) Agent-lightning v0.3.0 is a major release that introduces several new features and bug fixes. The release is a collaborative effort between Agent-lightning core teams and the community. Thanks to all the contributors who made this release possible. ### Highlights * **Tinker integration**: Support Tinker as an alternative backend for Reinforcement Learning (#226 #245 #264 #269 #327). See [example code](https://github.com/microsoft/agent-lightning/tree/v0.3.0/examples/tinker), [blog 1](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-1-1d8c9a397f0e) and [blog 2](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-2-332c5437f0dc). * **Azure OpenAI integration**: Support Azure OpenAI as a backend for LLM inference and supervised fine-tuning (#256 #327). [Example code](https://github.com/microsoft/agent-lightning/tree/v0.3.0/examples/azure). * **MongoDB-based Lightning Store** is added as an alternative backend for Lightning Store (#323). [Documentation](https://microsoft.github.io/agent-lightning/0.3.0/tutorials/parallelize/#parallelizing-lightningstore). * **Contrib package**: Add contrib package for community projects. Search-R1 is integrated as a contrib recipe. More coming. (#239 #396 #410 #412 #417). * **RESTful API**: Stabilize and document RESTful API for Lightning Store (#241 #275). [Documentation](https://microsoft.github.io/agent-lightning/0.3.0/reference/restful/). * **OTel Semantic Conventions** that are specifically designed for Agent-optimization areas (#340). [Documentation](https://microsoft.github.io/agent-lightning/0.3.0/reference/semconv/). * *[Preview]* **Agent-lightning Dashboard** is now available (#288 #289 #291 #296 #371 #375). It's the official web application for inspecting and debugging Agent-lightning experiments. See details [here](https://microsoft.github.io/agent-lightning/0.3.0/tutorials/debug/). * *[Preview]* **Multi-modality example** featuring VERL and a LangGraph agent on ChartQA dataset (#379). [Example code](https://github.com/microsoft/agent-lightning/tree/v0.3.0/examples/chartqa). * *[Preview]* Integrate **Claude Code** as a LitAgent and support training on SWE-Bench (#332 #346 #348). [Example code](https://github.com/microsoft/agent-lightning/tree/v0.3.0/examples/claude_code). * *[Preview]* **Weave tracer** as a substitute for AgentOps tracer (#277 #411 #420 #423). [Documentation](https://microsoft.github.io/agent-lightning/0.3.0/tutorials/traces/#weave-tracer-experimental). * *[Preview]* **Trajectory Level Aggregation** for more efficient training with VERL. See [blog](https://agent-lightning.github.io/posts/trajectory_level_aggregation/) and [documentation](https://microsoft.github.io/agent-lightning/0.3.0/algorithm-zoo/verl/). ### Store Benchmark In this release, the Lightning Store core was redesigned for significantly greater efficiency and scalability (#315 #318 #328 #342 #344 #356 #380 #388 #418 #421). The benchmark results below demonstrate the impact: with large numbers of concurrent runners, v0.3.0 delivers up to a 15x increase in throughput compared to v0.2.2. | Throughput (\#rollout/sec) | v0.2.2 | v0.3.0 (in-memory) | v0.3.0 (Mongo) | | :---- | :---- | :---- | :---- | | Minimal (batch, #runner=32, #turns=6) | 8.73 | 9.06 | 8.71 | | Medium (batch, #runners=100, #turns=10) | 12.03 | 23.26 | 32.79 | | Mid-high (batch, #runners=300, #turns=6) | 10.61 | 24.42 | 40.24 | | Large (batch, #runners=1000, #turns=3) | 3.36 | 14.60 | 50.05 | | Long queue (queue, #runners=256, #turns=4) | 7.42 | 30.86 | 57.01 | | Heavy trace (queue, #runners=512, #turns=20) | 5.93 | 13.28 | 29.41 | *Notes:* 1. Benchmarks were run on a single Standard_D32as_v4 Azure VM (Large and heavy trace tests used Standard_D64ads_v5), executed via GitHub Actions. 2. Two algorithm patterns are evaluated: the batch pattern submits a group of rollouts and waits for all to finish before starting the next group, while the queue pattern maintains a set number of in-flight rollouts, submitting new ones as soon as capacity frees up. Configuration details are available [here](https://github.com/microsoft/agent-lightning/blob/v0.3.0/.github/workflows/benchmark.yml). 3. The number of turns is directly proportional to the number of spans each rollout generates. ### Maintenance and Bug fixes #### Core (Store, Interfaces, etc.) * Add Trainer port option for client-server strategies (#198) * Fix store port conflict handling (#227) * Unified PythonServerLauncher (#286 #292 #303) * Make health timeout configurable (#305) * Refactor logging (#306) * Support OTLP in LightningStore (#313) * Centralized metrics helper (#368) * Fix redundant cancel tracebacks on Ctrl+C (#370) #### Proxy, Adapters and Algorithms * Fix training metrics before and after processing in VERL (#145) * Forward streaming requests for Anthropic and OpenAI APIs (as non-streaming requests) (#299) * Check traces with reward for VERL (#317) * Patch LiteLLM root span (#341) * Handle ref_in_actor flag for LoRA compatibility (#386) * Support `with_llm_proxy` and `with_store` in algorithms (#398) * Support image URL export in TracerTraceToTriplets (#400) * Fix match_rewards assign_to elements in TraceTree (#403) * Support customizing trainer and daemon in VERL (#407) #### Runners, Tracers and Agents * Refactor tracer initialization (#321) * Fix OpenAI Agents 0.6 compatibility (#322) * `emit_operation`, `emit_annotation`, tags and links (#359) * Sunset HTTP tracer (#402) #### Examples * Fix typos in train-first-agent.md (#263) * Fix room_selector example which always runs the first task (#270) * Fix typo in SQL agent example (#285) * Add the README and script files for training SQL agent on NPU (#272) * Examples Catalog and Refine Contribution Guide (#331) * Upgrade LangChain to 1.x (#364) * Update RAG example to Agent-lightning v0.2.x (#349) #### Miscellaneous * DeepWiki Badge (#263) * Add AGENTS.md (#374) ### New Contributors Warm welcome to our first-time contributors: @cptnm3, @TerryChan, @genji970, @zxgx, @xiaochulaoban, @lspinheiro, @Kwanghoon-Choi, @Vasuk12, @totoluo, @jinghuan-Chen 🎉 **Full Changelog**: https://github.com/microsoft/agent-lightning/compare/v0.2.0...v0.3.0 --- ## Agent-lightning v0.2.2 (11/12/2025) Agent-lightning v0.2.2 is a stabilization release for v0.2.1. It introduces several bug fixes. * Fix compatibility issues with VERL 0.6.0. * Fix model name for pre-downloaded models in VERL. * Fix preparing status transition on rollout when creating attempts. * Fix OpenAI Agents SDK compatibility issues. **Full Changelog**: https://github.com/microsoft/agent-lightning/compare/v0.2.1...v0.2.2 --- ## Agent-lightning v0.2.1 (10/30/2025) Agent-lightning v0.2.1 is a stabilization release for v0.2.0. It introduces several bug fixes and new features, plus a number of unlisted CI improvements. ### Bug fixes * Fix LiteLLM issues when restarting the proxy multiple times in the same process (#174 #206) * Fix LiteLLM model name selection when multiple servers use the same model (#197) * Fix store port conflict handling (#227) ### New Features * Add trainer port option for client-server strategies (#198) ### Documentation * Add tutorial for launching workers on separate machines (#213) * Add link to VERL framework (#210) * Add link to vLLM blog (#215) * Fix a couple of typos and avoid emacs backup files (#237) ### New Contributors A warm welcome to our first-time contributors: @scott-vsi, @ddsfda99, @jeis4wpi 🎉 **Full Changelog**: https://github.com/microsoft/agent-lightning/compare/v0.2.0...v0.2.1 --- ## Agent-lightning v0.2.0 (10/22/2025) Agent-Lightning v0.2.0 introduces major framework improvements, new execution strategies, expanded documentation, and enhanced reliability across the agent training and deployment workflow. This release includes **78 pull requests** since v0.1.2. ### Core Enhancements * **Lightning Store**: Added unified interface and implementation for Agent-lightning's core storage. * **Emitter**: Emitting any objects as spans to the store. * **Adapter** and **Tracer**: Adapting to OpenAI-like messages, and OpenTelemetry dummy tracer. * **LLM Proxy**: Added LLM Proxy as the first-class citizen in Agent-lightning. * **Agent Runner**: New version providing a more modular and robust runner design. * **Embedded Algorithms**: Algorithms are now embedded directly into trainers for simplicity. * **New Execution Strategies**: Introduced *Client-Server* and *Shared Memory* execution models. * **Trainer Updates**: Integrated v0.2 interfaces and FastAlgorithm validation. ### Documentation & Examples * Revamped documentation with new guides for **agent creation**, **training**, **debugging**, and **store concepts**. * Improved quickstart tutorials, clarified installation and new deep-dive articles. * Added and updated examples: *SQL Agent*, *Calc-X*, *Local SFT*, *Search-R1*, and *APO algorithm*. ### Developer Experience * Migrated build and CI pipelines to **1ES**, split workflows and aggregate badges for clarity. * Adopted **uv** as the dependency manager. * Added GPU-based pytest workflows for full test coverage. * Enhanced debugging UX, pre-commit configs, and linting (Pyright fixes, import sorting). ### Ecosystem & Integrations * Added support for agents built with [**Agent-framework**](https://github.com/microsoft/agent-framework). * Added new community listings: [*DeepWerewolf*](https://github.com/af-74413592/DeepWerewolf) and [*AgentFlow*](https://agentflow.stanford.edu/). ### New Contributors A warm welcome to our first-time contributors: @hzy46, @lunaqiu, @syeehyn, @linhx1999, @SiyunZhao, and @acured 🎉 **Full changelog:** [v0.1.2 → v0.2.0](https://github.com/microsoft/agent-lightning/compare/v0.1.2...v0.2.0) --- ## Agent-lightning v0.1.2 (08/12/2025) ### What's Changed * Add basic documentation in https://github.com/microsoft/agent-lightning/pull/33 * RAG example by @wizardlancet in https://github.com/microsoft/agent-lightning/pull/21 ### New Contributors * @wizardlancet made their first contribution in https://github.com/microsoft/agent-lightning/pull/21 **Full Changelog**: https://github.com/microsoft/agent-lightning/compare/v0.1.1...v0.1.2 --- ## Agent-lightning v0.1.1 (08/06/2025) ### What's Changed * Disable HTTP tracer tests and bump to 0.1.1 in https://github.com/microsoft/agent-lightning/pull/26 * Fix trainer bugs in v0.1 in https://github.com/microsoft/agent-lightning/pull/24 **Full Changelog**: https://github.com/microsoft/agent-lightning/compare/v0.1...v0.1.1 --- ## Agent-lightning v0.1.0 (08/04/2025) The first release of Agent-lightning! - Turn your agent into an optimizable beast with **ZERO CODE CHANGE** (almost)! 💤 - Build with **ANY** agent framework (LangChain, OpenAI Agent SDK, AutoGen, CrewAI, ...); or even WITHOUT agent framework (Python OpenAI). You name it! 🤖 - **Selectively** optimize one or more agents in a multi-agent system. 🎯 - Embraces Reinforcement Learning, Automatic Prompt Optimization and more **algorithms**. 🤗 Install via `pip install agentlightning`. ================================================ FILE: docs/community/contributing.md ================================================ # Contributing Guide Agent Lightning gets better every time someone files a clear bug, polishes docs, improves tests, or lands a new feature. This guide collects the expectations, checklists, and tips that help you go from “I have an idea” to “my pull request just merged.” ## Before You Start Agent-lightning is built by a small Microsoft Research team with limited reviewer hours and GPU budget. For any sizeable change (new algorithm, example, or API surface) please first discuss scope with us in [Discord](https://discord.gg/RYk7CdvDR7). Early alignment keeps your effort from being blocked late in the process. ## Where You Can Help Pick a lane, or combine several. Just keep the discussion-first principle in mind for anything non-trivial. ### Documentation Improvements Documentation improvements are the easiest way to get started. You can find more about how to write good documentations and organize documentations in the following sections. Here are some general contribution points we can think of: - Tighten language, fix typos, clarify confusing sections, or add missing links. Fresh eyes catch docs gaps best. - Organize content using the directories listed below so readers can actually find it. - Avoid duplicate prose, unrelated “how-to” guides, or translations (we cannot maintain them today). !!! note "Changes that are usually rejected" - Copy/pasting existing docs with shallow edits. - Adding a `how-to` guide that is not tied to a new example. - Adding doc translations to other languages (no capacity to review/maintain yet). ### Bug Fixes Bug fixes are the fastest way to get familiar with the codebase. To get started, you can: - Browse the ["help wanted"](https://github.com/microsoft/agent-lightning/labels/help%20wanted) and ["bug"](https://github.com/microsoft/agent-lightning/labels/bug) labels; drop a comment before you start so we can mark it as taken. - For fresh bugs, open an issue with reproduction steps, logs, and expected behavior before submitting a fix. - Keep each pull request focused, ideally avoiding breaking API changes. Larger refactors should be discussed via RFC or maintainer sync. ### New Examples Examples must be curated so that we can maintain them. We generally merge only those that meet at least one (ideally several) of these criteria: - Demonstrates an agent framework or workflow that is materially different from what already exists. ([LangChain](https://www.langchain.com/) vs. [LlamaIndex](https://www.llamaindex.ai/) is not different enough; [LangChain](https://www.langchain.com/) vs. [n8n](https://n8n.io/) or [Vercel AI SDK](https://ai-sdk.dev/) is, because they either have different orchestration paradigms or differ in programming languages.) - Shows measurable performance gains on a **real-world** problem with a **real-world** dataset, such as tuning a search agent with Google Search API or improving a coding agent’s (e.g., Claude Code) SWE-Bench score. - Integrates a new algorithm, training backend, or serving stack (see “New Algorithms” below). - Validates scenarios that are rarely tested, such as multi-modality agents or long-lived memory/workflow agents. Bonus points for examples that: - Ship CI or self-test coverage so we know they still work as the core evolves. **Otherwise, we would have to mark the example as unmaintained because we won't be able to test the examples manually before each release.** - Include a [`docs/how-to/`]({{ src("docs/how-to/") }}) guide (or a detailed README if no how-to exists) without duplicating content in multiple places. - Favor simple, dependency-light code over heavy abstractions. - Ship a README that documents smoke-test instructions and includes an "Included Files" section summarizing every file and its role; keep the runnable module self-contained with a module-level docstring explaining CLI usage, plus targeted docstrings or inline comments for educational functions/classes. !!! warning "Please discuss first" Examples tend to be the most time-consuming contributions for both you and reviewers. Sync with us on Discord or through an issue before diving into a new one. ### Fresh Implementations of Core Modules If you are looking to extend [`Runner`][agentlightning.Runner], [`Tracer`][agentlightning.Tracer], [`Adapter`][agentlightning.Adapter], [`LightningStore`][agentlightning.LightningStore], or another core interface, here are the steps: 1. File an issue or proposal first. 2. Explain which interface you are extending, why existing implementations are insufficient, and how you intend to test compatibility with the rest of the stack (unit tests, documentation updates, example refreshes, etc.). 3. Any API changes must be reviewed up front. DO NOT begin coding large changes before the discussion lands! ### New Algorithms If you are integrating a new training/serving backend, check whether it already lives in the [Algorithm Zoo](../algorithm-zoo/index.md) or is covered in the [Examples Catalog](../how-to/examples-catalog.md). We especially welcome: - Currently unsupported or under-tested algorithms such as Supervised Fine-tuning (SFT), Direct Policy Optimization (DPO), or Monte Carlo Tree Search (MCTS). - Tuning [Resource][agentlightning.Resource]s that are not supported yet, such as workflows or memory. - Expansions of supported stacks, e.g., adding multi-modality to APO or multi-agent prompt tuning. - Reinforcement-learning integrations beyond our current stack of [VERL](https://github.com/volcengine/verl), [vLLM](https://vllm.ai/), [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-foundry/models/openai), and [Tinker](https://tinker-docs.thinkingmachines.ai/). Contributions using [SGLang](https://github.com/sgl-project/sglang), [TRL](https://github.com/huggingface/trl), [SkyRL](https://github.com/NovaSky-AI/SkyRL), [RLinf](https://github.com/RLinf/RLinf), [litgpt](https://github.com/Lightning-AI/litgpt), or similar are welcome. Most brand-new algorithms ultimately land as “new examples,” so read that section too. Post an issue or design doc to scope the work, reuse existing utilities, and avoid duplicating efforts. Mature, battle-tested examples graduate into the [Algorithm Zoo](../algorithm-zoo/index.md). ### Ecosystem Projects Have a project that builds on Agent-lightning but does not belong in the main repo? Fork it or depend on it externally, then let us know. We can showcase notable projects in [Community Projects](../index.md) and the main [README]({{ src("README.md") }}). ### Agent-lightning Contrib [`contrib/`]({{ src("contrib") }}) is where work-in-progress or third-party integrations, and curated recipes live before they are hardened enough for the core runtime tree. Think of it as an incubator: additions should remain easy to consume, clearly owned, and scoped so downstream users can vendor them with minimal risk. The following types of contributions are welcome in the contrib area: - **Recipes** that assemble multiple Agent Lightning components for a narrow task (`contrib/recipes//`). Each recipe must be self-contained, include running instructions and result reports. - **Runtime extensions** that would bloat the primary `agentlightning/` namespace (`contrib/agentlightning/contrib//`). These should mirror the published wheel layout so that `import agentlightning.contrib.` works out of the box. - **Supporting scripts and assets** (`contrib/scripts/`) that automate dataset downloads, environment preparation, or benchmarks required by contrib modules. If you are unsure where a contribution should live, start a thread in Discord or open an issue before writing code. The [contrib README]({{ src("contrib/README.md") }}) also lists the directory expectations. A quick checklist for contributions to be accepted: 1. **Document everything.** Include configuration steps, environment variables, and sample commands so contributors can reproduce the results without guesswork. Pin to a specific version of Agent-lightning and other dependencies to avoid unexpected changes if you don't want to update the recipe frequently. 2. **Keep quality predictable.** Match the repo’s style guide, apply exhaustive type hints, and run `uv run --no-sync pyright` plus targeted `pytest` suites for any Python module you touch. 3. **Ship reproducibility artifacts.** Store only scripts or instructions for downloading datasets, weights, or binaries. Never upload large artifacts or credentials directly. 4. **Update ownership.** Add `CODEOWNERS` entries when new directories appear so maintainers know who can review follow-up fixes. Contrib entries do not need the same maturity level as core code, but they must still meet the baseline above. Submissions that lack documentation, hide ownership, or depend on untracked assets are typically rejected until those gaps are resolved. ### Other Contribution Ideas - **Tests.** Add or improve cases in [`tests/`]({{ src("tests") }}) (unit, integration, or end-to-end). - **Benchmarks.** Expand [`tests/benchmark`]({{ src("tests/benchmark") }}) to stress large-scale training or rollouts. - **Issue triage.** Reproduce bugs, confirm whether they reproduce on `main`, or suggest short-term mitigations so maintainers can prioritize. ## Contribution Workflow The steps below keep changes reviewable and CI-friendly. Follow them in order; rerun the relevant pieces if you revisit a branch later. ### 1. Prepare Your Environment Minimum tooling: - **Python** 3.10+ (3.12 recommended). - **uv** for dependency and virtual-environment management. Install it using the [official uv docs](https://docs.astral.sh/uv/getting-started/installation/). - **Git** configured with your GitHub credentials. Clone your fork and point `upstream` at the official repo: ```bash git clone git@github.com:/agent-lightning.git cd agent-lightning git remote add upstream https://github.com/microsoft/agent-lightning.git ``` Install the default development stack: ```bash uv sync --group dev ``` Need GPU extras or specific optional dependencies? Lock them in with one command: ```bash uv sync --frozen \ --extra apo \ --extra verl \ --group dev \ --group torch-cpu \ --group torch-stable \ --group agents \ --no-default-groups ``` After `uv sync`, run commands via `uv run ...` (add `--no-sync` once the environment is locked) or activate `.venv/`. ### 2. Install and Run Pre-commit Formatting and linting are enforced through [pre-commit](https://pre-commit.com/). Install once, then run before each push: ```bash uv run --no-sync pre-commit install uv run --no-sync pre-commit run --all-files --show-diff-on-failure --color=always ``` Once installed, the hooks run automatically on every `git commit`. Running the pre-commit hooks locally keeps CI green and diffs manageable. ### 3. Branch from Fresh `main` and Code Start all work from the latest upstream state: ```bash git fetch upstream git checkout main git merge upstream/main ``` Branch naming convention: - `feature/` for new features. - `fix/` for bug fixes. - `docs/` for documentation-only updates. - `chore/` for tooling or maintenance. Use lowercase with hyphens, e.g., `feature/async-runner-hooks`. !!! note "Where should docs or examples live?" Many new contributors get confused about what to put in the `docs/how-to/` directory and what to put in the `examples/` directory (particularly README files). Here is a quick reference you can refer to: | Location | Description | | --- | --- | | `docs/algorithm-zoo/` | Documentation for **built-in algorithms** shipped with Agent-lightning. | | `docs/how-to/` | Step-by-step **how-to guides**, usually tied to an example in `examples/`. | | `docs/tutorials/` | Conceptual walkthroughs for components or workflows. See [debugging](../tutorials/debug.md) or [parallelization](../tutorials/parallelize.md) for examples. | | `docs/deep-dive/` | Advanced explanations and in-depth concepts. | | `examples//README.md` | Example-specific README. If any related how-to if that exists, link to it avoid duplicating the same instructions twice; write only brief instructions on how to install and run the example. Otherwise, you can make the README more detailed and self-explanatory. | Remember to register new docs in [`mkdocs.yml`]({{ src("mkdocs.yml") }}), add examples to [examples/README]({{ src("examples/README.md") }}), and update the [Examples Catalog](../how-to/examples-catalog.md). Before you start coding, bring the shared coding conventions with you: - Target `requires-python >= 3.10`, four-space indentation, ~120-character lines (docstrings may run longer), and formatter-owned diffs (Black + isort with the `black` profile). - Use `snake_case` for modules, functions, and variables; `PascalCase` for classes and React components; lowercase hyphenation for CLI flags, branch names, and TypeScript filenames. - Maintain exhaustive type hints (pyright enforces them), write succinct Google-style docstrings (with `[][]` cross-references). - Prefer dataclasses or Pydantic models from `agentlightning.types`. - Log via `logging.getLogger(__name__)` with targeted DEBUG/INFO/WARNING/ERROR calls—especially for long multi-step functions or broad `try/except` blocks. ### 4. Test and Validate Most contributions require automated checks. Once `uv sync` locks dependencies, prefix commands with `uv run --no-sync ...` so they share the same environment as CI. **Full test suite** ```bash uv run --no-sync pytest -v ``` **Targeted tests** ```bash uv run --no-sync pytest tests/path/to/test_file.py -k test_name ``` **Optional/gated tests:** GPU-specific suites or API-dependent tests run automatically when the required hardware or environment variables (such as `OPENAI_API_KEY`) are present. **Static analysis:** ```bash uv run --no-sync pyright ``` If you have touched code under `examples/`, you should run the example-specific smoke tests. Each directory includes a README with example-specific smoke tests—run those too. !!! note "Build documentation when needed" Keep API references under [docs/reference]({{ src("docs/reference/") }}) up to date. Doc-only changes should still build cleanly: ```bash uv run --no-sync mkdocs serve --strict # live reload uv run --no-sync mkdocs build --strict # CI-equivalent ``` `--strict` elevates warnings to errors so you catch issues before CI. Before opening a PR, double-check the basics: - Run `uv lock` if you changed dependencies. - Run `uv run --no-sync pre-commit run --all-files --show-diff-on-failure` (hooks installed via `pre-commit install` run automatically on `git commit`, but rerun them if you amended history). - Execute the relevant commands from the test list above. - Validate each affected example via its README instructions. ### 5. Open a Pull Request 1. Push your branch: ```bash git push origin ``` 2. Open a PR against `microsoft/agent-lightning:main`. 3. Fill out the template with a concise summary, the commands/tests you ran, and linked issues (use `Fixes #123` syntax to auto-close). 4. Include screenshots or logs if they clarify behavior. 5. Address review feedback promptly. Follow-up tweaks work best as focused commits; `git commit --fixup` is handy for reviewer-suggested edits. Thanks for contributing! every improvement strengthens the Agent Lightning community! ================================================ FILE: docs/community/maintainers.md ================================================ # Maintainer Guide This guide describes the day-to-day responsibilities for Agent Lightning maintainers—how to bump versions, run release ceremonies, interact with CI, and backport fixes safely. ## Release Workflow Follow this checklist throughout each release cycle. ### Immediately After Shipping Agent Lightning uses a **bump-first** strategy. As soon as a release is published: 1. Update version metadata: - `pyproject.toml`: bump the `version`. - `agentlightning/__init__.py`: update `__version__` if it exists. - `uv.lock`: refresh the lock file after the bump. 2. Refresh dependency pins as needed: ```bash uv lock --upgrade ``` 3. For a new minor or major release, create a stable branch from `main`: ```bash git checkout main git pull upstream main git checkout -b stable/v2.0.x # adjust to the new series git push upstream stable/v2.0.x ``` All future changes to the stable branch must land via pull requests. ### Preparing the Next Release When it is time to publish the next version: 1. **Draft release notes** in `docs/changelog.md`, collecting every notable change since the previous tag. 2. **Open a release PR** targeting `main` (for minor/major) or the relevant stable branch (for patch releases). Use the title `[Release] vX.Y.Z`. 3. **Run extended CI** by labeling the PR with `ci-all` and commenting `/ci`. Investigate and resolve any failures. 4. **Merge the release PR** once notes are final and CI is green. 5. **Tag the release** from the branch you just merged into: ```bash git checkout main # minor/major releases git checkout stable/vX.Y.Z # patch releases git pull git tag vX.Y.Z -m "Release vX.Y.Z" git push upstream vX.Y.Z ``` Pushing the tag publishes to PyPI and deploys the documentation. 6. **Publish the GitHub release** using the drafted notes, and confirm the docs site and PyPI listing reflect the new version. ## Working with CI Labels and `/ci` GPU suites and example end-to-end runs are opt-in. To trigger them on a pull request: 1. Apply the appropriate labels before issuing the command: - `ci-all` for every repository-dispatch workflow. - `ci-gpu` for GPU integration tests (`tests-full.yml`). - `ci-apo`, `ci-calc-x`, `ci-spider`, `ci-unsloth`, `ci-compat` for the individual example pipelines. 2. Comment `/ci` on the PR. The `issue-comment` workflow acknowledges the request and tracks job results inline. 3. Remove the labels once you have the signal to avoid accidental re-runs. Use `/ci` whenever changes touch shared infrastructure, dependencies, or training loops that require coverage beyond the default PR checks. !!! note `/ci` always executes the workflow definitions on the current `main` branch, then checks out the PR diff. If you need to test workflow modifications, push the changes to a branch in the upstream repo and run: ```bash gh workflow run examples-xxx.yml --ref your-branch-name ``` ## Backporting Pull Requests Supported stable branches rely on automated backports: 1. Identify the target branch (for example `stable/v0.2.x`). 2. Before merging the original PR into `main`, add the matching `stable/` label (e.g. `stable/v0.2.x`). 3. The `backport.yml` workflow opens a follow-up PR named `backport//` authored by `agent-lightning-bot`. 4. Review the generated PR, ensure CI is green, and merge into the stable branch. 5. Resolve conflicts by pushing manual fixes to the backport branch and re-running `/ci` if required. Keep stable branches healthy by cherry-picking only critical fixes and ensuring documentation and example metadata stay aligned with each release line. ================================================ FILE: docs/deep-dive/birds-eye-view.md ================================================ # The Bird's Eye View of Agent-lightning !!! warning "High Volume of Information Ahead" This article provides an in-depth exploration of the Agent-lightning architecture. It is not intended as a beginner’s guide or usage tutorial. This article summarizes how Agent-lightning (as of v0.2) wires the [Algorithm][agentlightning.Algorithm], [Runner][agentlightning.Runner], and [LightningStore][agentlightning.LightningStore] loop together and shows where auxiliary components (the [Tracer][agentlightning.Tracer], [Adapter][agentlightning.Adapter], and [LLM Proxy][agentlightning.LLMProxy]) plug into the loop. Each section provides a diagram for a different perspective of the system. ## Algorithm ↔ Runner ↔ Store data flow At its heart, Agent-lightning is built on three main components that work in a coordinated loop: * **[Algorithm][agentlightning.Algorithm]:** The "brain" of the system. It decides what tasks to run, learns from the results, and updates resources (like AI models or prompts). * **[Runner][agentlightning.Runner]:** The "worker" of the system. It executes tasks assigned by the algorithm, runs the agent, and records the results. * **[LightningStore][agentlightning.LightningStore]:** The central "database" and message queue. It acts as the single source of truth, storing tasks, results, and resources, and enabling communication between the Algorithm and Runner. The typical data flow in a training loop is as follows: The **[Algorithm][agentlightning.Algorithm]** enqueues tasks (called **[Rollouts][agentlightning.Rollout]**) into the **[LightningStore][agentlightning.LightningStore]**. A **[Runner][agentlightning.Runner]** then dequeues a task, executes it, and streams the results (called **[Spans][agentlightning.Span]**) back to the store. Once the task is complete, the algorithm can query the new data from the store to learn and update its resources. The diagram below shows this fundamental interaction in a simple, non-parallel setup. ```mermaid sequenceDiagram autonumber participant Algo as Algorithm participant Store as LightningStore participant Runner participant Agent loop Over the dataset Algo-->>Store: add_resources + enqueue_rollout Store-->>Runner: dequeue_rollout → AttemptedRollout Store-->>Runner: get_latest_resources Runner-->>Store: update_attempt("running", worker_id) Runner->>Agent: rollout + resources Agent->>Runner: reward / spans Runner-->>Store: add_span or add_otel_span Runner-->>Store: update_attempt("finished", status) Store-->>Algo: query_rollouts + spans Algo-->>Algo: Update resources (optional) end ``` Solid lines represent direct calls, while dashed lines are asynchronous or long-running operations. ### Key Terminology We define the following terms, which may be helpful for understanding the diagram above. * **[Resources][agentlightning.Resource]:** A collection of assets to be tuned or trained. Agents perform rollouts against resources and collect span data. Algorithms use those data to update the resources. In RL training, the resources are a tunable model. In prompt tuning, the resources are prompt templates. * **[Rollout][agentlightning.Rollout]:** A unit of work that an agent performs against a resource. A rollout (noun) can be incomplete, in which case it is also known as a **task**, **sample**, or **job** (these terms are used interchangeably). The agent executes its own defined workflow against the rollout — the process is also called "to rollout" (verb). After execution, the rollout (noun) is considered *complete*. * **[Attempt][agentlightning.Attempt]:** A single execution of a rollout. One rollout can have multiple attempts in case of failures or timeouts. * **[Span][agentlightning.Span]:** During the rollout, the agent can generate multiple spans (also known as "traces" or "events"). The recorded spans are collected in the store, which is crucial for understanding agent behavior and optimizing agents. * **[Reward][agentlightning.emit_reward]:** A special span that is defined as a number judging the quality of the rollout during some period of the rollout. * **[Dataset][agentlightning.Dataset]:** A collection of incomplete rollouts (i.e., tasks) for the agent to process. The dual datasets (train, val) serve as the initial input for the algorithm to enqueue the first batch of rollouts. ### Store As discussed previously, the [LightningStore][agentlightning.LightningStore] is the central hub for all data in Agent-lightning. The store exposes a set of APIs for algorithms and runners to interact with the data; the most important ones are: ```python from agentlightning.types import AttemptedRollout, ResourcesUpdate, Span, TaskInput class LightningStore: async def enqueue_rollout(self, input: TaskInput, ...) -> Rollout: ... async def dequeue_rollout(self) -> AttemptedRollout | None: ... async def add_span(self, span: Span) -> Span: ... async def get_latest_resources(self) -> Optional[ResourcesUpdate]: ... async def wait_for_rollouts(self, rollout_ids: List[str], ...): ... async def query_spans(self, rollout_id: str, ...): ... async def update_attempt(self, rollout_id: str, attempt_id: str, status: str, ...): ... ... ``` These interfaces operate on [`AttemptedRollout`][agentlightning.AttemptedRollout], [`ResourcesUpdate`][agentlightning.ResourcesUpdate], [`Span`][agentlightning.Span], and [`TaskInput`][agentlightning.TaskInput] instances from `agentlightning.types`. As the APIs show, the store essentially provides a queue for rollouts and storage for resources, spans, and attempts. Developers should implement the store carefully to ensure data integrity and consistency, especially when multiple runners work in parallel across multiple attempts. The store is designed to be extensible. Users can implement their own store by inheriting from [`LightningStore`][agentlightning.LightningStore] and overriding methods. Agent-lightning provides a few reference implementations, such as [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] (default) and `SqliteLightningStore` (under construction). When parallelized, the store may need special wrappers to ensure thread/process safety or delegate computation to a store in another process or machine. ## Supporting Components in the Loop While the core loop is simple, Agent-lightning provides several components to make development easier and more powerful. ### Tracer The [`Tracer`][agentlightning.Tracer] is a component within the [`Runner`][agentlightning.Runner] that records detailed spans (events) during an agent's execution and sends them to the [`LightningStore`][agentlightning.LightningStore]. Instead of requiring the agent to manually log every span, the tracer automatically instruments key methods (e.g., LLM calls) and captures their inputs, outputs, and metadata. This provides a detailed log of the agent's behavior with minimal effort. ```mermaid sequenceDiagram autonumber participant Store participant Runner participant Tracer participant Agent Note over Runner,Tracer: Runner manages tracer as member Tracer->>Agent: Apply instrumentation loop Until no more rollouts Store-->>Runner: dequeue_rollout → AttemptedRollout Store-->>Runner: get_latest_resources Runner->>Agent: training_rollout / validation_rollout loop For each finished span Agent-->>Tracer: openai.chat.completion invoked
agent.execute invoked
... Agent->>Tracer: emit intermediate reward Tracer-->>Store: add_otel_span(rollout_id, attempt_id, span) end Agent->>Runner: final reward + extra spans (if any) Runner-->>Store: add_span(rollout_id, attempt_id, span) Runner-->>Store: update_attempt(status) end Tracer->>Agent: Unapply instrumentation ``` The above diagram shows the overall data flow between store, tracer and agent. In realistic, it's a bit more complicated than that. Spans are not emitted actively by the agent; they are intercepted by the tracer by hooking and instrumenting key methods used in the agents. The tracer uses a callback (called exporter) to monitor events and log to the store. Before a rollout starts, the runner enters a [`trace_context`][agentlightning.Tracer.trace_context] before invoking the agent, wiring store identifiers into the tracer. Each span completion streams back to the store through `LightningSpanProcessor`, so the agent’s instrumentation lands in [`add_otel_span`][agentlightning.LightningStore.add_otel_span]. If the agent’s rollout method returns a numeric reward, the runner emits one more OpenTelemetry span before finalizing the attempt. ### Hooks [`Hook`][agentlightning.Hook] implementations are user-defined callback functions that allow you to augment a [`Runner`][agentlightning.Runner]'s behavior at specific points in its lifecycle. You can use hooks to add custom logging, set up resources before a rollout begins, or tear them down after it ends. Hooks can be triggered at four key moments: `on_rollout_start`, `on_trace_start`, `on_trace_end`, and `on_rollout_end`. Users should pay special attention to the difference between `on_trace_end` and `on_rollout_end`. The former is called right before the tracer exits the trace context, while the latter is called after the runner processes the final leftover rewards and spans, and finalizes the attempt in the store. ```mermaid sequenceDiagram autonumber participant Store participant Hooks participant Runner participant Tracer participant Agent Note over Runner,Hooks: Runner manages hooks as member loop Until no more rollouts Store-->>Runner: dequeue_rollout → AttemptedRollout Store-->>Runner: get_latest_resources Runner->>Hooks: on_rollout_start(agent, runner, rollout) Runner->>Agent: training_rollout / validation_rollout Tracer->>Agent: enter_trace_context activate Tracer Runner->>Hooks: on_trace_start(agent, runner, tracer, rollout) Note over Runner,Agent: Agent rollout omitted Runner->>Hooks: on_trace_end(agent, runner, tracer, rollout) Tracer->>Agent: exit_trace_context deactivate Tracer Agent->>Runner: final reward + extra spans (if any) Runner-->>Store: add_span(rollout_id, attempt_id, span) Runner->>Hooks: on_rollout_end(agent, runner, rollout, status) end ``` ### Adapter The [`Adapter`][agentlightning.Adapter] is a component used by the [`Algorithm`][agentlightning.Algorithm] to transform raw data from the [`LightningStore`][agentlightning.LightningStore] into a format suitable for learning. Runners stream raw spans into the store during execution. Later, the algorithm queries these spans and uses an adapter to convert them into structured data, like training examples for a reinforcement learning model. For instance, the [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] processes OpenTelemetry spans to create `(prompt, response, reward)` triplets, which are the fundamental data structure for many RL fine-tuning algorithms. ```mermaid flowchart LR Runner -- (1) add_otel_span --> Store Store -- (2) query_spans --> Algorithm Algorithm -- (3) spans --> Adapter Adapter -- (4) transformed data --> Algorithm ``` ### LLM Proxy The [`LLMProxy`][agentlightning.LLMProxy] is an optional bridge component that sits between an agent and the algorithms' resources. It acts as a centralized endpoint for all LLM calls. Usually the proxy URL is added to the store as a special resource, so that the [`Runner`][agentlightning.Runner] can fetch it along with other resources when dequeuing a rollout. During rollouts, the runner invokes the proxy's HTTP endpoint instead of calling a model backend directly. This design offers several benefits: 1. **Instrumentation:** It automatically captures detailed traces of LLM interactions (prompts, responses, metadata) and sends them to the store, complementing the tracer, especially when the agent's code is hard to instrument directly. 2. **Backend Abstraction:** It provides a unified interface for various LLM backends (OpenAI, Anthropic, local models) and can add features like retry logic, rate limiting, and caching. 3. **Resource Management:** The algorithm can dynamically update which LLM the agent uses (e.g., swapping to a newly fine-tuned model) by simply swapping the backend model the proxy is using, without interrupting the agent's code. The benefits above seem to be all discussed within the context of model fine-tuning. As a matter of fact, the proxy can be useful for prompt tuning as well. The algorithm can register one of the following two types of endpoints into the proxy: 1. **Endpoint served by the algorithm:** If the algorithm is internally updating the LLM weights (e.g., RL), it can launch an LLM inference engine (i.e., a model server) and register the endpoint URL with the proxy. The proxy then forwards all LLM calls to that endpoint. 2. **Third-party LLM endpoint:** If the algorithm is not updating the LLM weights (e.g., prompt tuning), it can register a third-party LLM endpoint into the proxy. We show a diagram below that illustrates how the proxy fits into the overall data flow. ```mermaid sequenceDiagram autonumber participant Algo as Algorithm participant LLMProxy as LLM Proxy participant Store participant Runner participant Agent Note over Algo,LLMProxy: Algorithm manages LLMProxy as member loop Over the Dataset Algo->>Algo: Launch LLM Inference Engine
(optional) Algo->>LLMProxy: Register Inference Engine
(optional) Algo-->>Store: enqueue_rollout LLMProxy->>Store: Proxy URL added as Resource Store-->>Runner: dequeue_rollout → AttemptedRollout Store-->>Runner: get_latest_resources Runner->>Agent: rollout + resources
(LLM Proxy URL as resource) loop Defined by Agent Agent-->>LLMProxy: LLM calls activate LLMProxy LLMProxy-->>Store: add_span or add_otel_span LLMProxy-->>Agent: LLM responses deactivate LLMProxy Agent-->>Runner: rewards Runner-->>Store: add_span or add_otel_span end Runner-->>Store: update_attempt("finished", status) Store-->>Algo: query_rollouts + spans Algo-->>Algo: Update LLM Weights
(optional) end ``` In this diagram, the store receives spans from both the proxy and the runner. We will see a problem later with parallelism where the proxy and runner are in different machines, and spans need to obtain a special counter from the store to ensure the ordering of spans. ### Trainer The [Trainer][agentlightning.Trainer] is the high-level orchestrator that initializes and connects all major components -- [Algorithm][agentlightning.Algorithm], [Runner][agentlightning.Runner], [LightningStore][agentlightning.LightningStore], [Tracer][agentlightning.Tracer], [Adapter][agentlightning.Adapter], [LLM Proxy][agentlightning.LLMProxy], and [Hook][agentlightning.Hook]. The components can have a lifecycle as long as the trainer. The trainer manages their lifecycles and handles dependency injection, ensuring that every part of the system operates within a consistent and shared environment. Below, we demonstrate how the components relate to each other and their roles. We first clarify the roles and relationships shown in the diagram: 1. **Owns:** components that the trainer constructs and manages directly (e.g., runner, tracer). 2. **Injects:** components passed into others as dependencies. 3. **References:** weak links for coordination without ownership. 4. **Uses:** components that are temporarily interacted with. For example, the [LightningStore][agentlightning.LightningStore] is injected into the [Algorithm][agentlightning.Algorithm] and [Runner][agentlightning.Runner]. The [Tracer][agentlightning.Tracer] and [LitAgent][agentlightning.LitAgent] are injected into the runner. The [Adapter][agentlightning.Adapter] and [LLM Proxy][agentlightning.LLMProxy] are injected into the algorithm. The store is further injected into the tracer, adapter and LLM proxy by the runner and algorithm respectively. ```mermaid flowchart TD %% === Left side: Algorithm domain === subgraph L["Algorithm Side"] Algorithm["Algorithm
(no default)"] Adapter["Adapter
(TracerTraceToTriplet*)"] LLMProxy["LLM Proxy
(no default)"] Algorithm -.injects.-> Adapter Algorithm -.injects.-> LLMProxy end linkStyle 0,1 stroke:#896978,stroke-width:2px; %% === Middle: Core trainer and store === subgraph M["Core"] Trainer["Trainer"] Store["LightningStore
(InMemory* default)"] Trainer --has--> Algorithm Trainer --has--> Store Trainer --has--> Adapter Trainer --has--> LLMProxy end linkStyle 2,3,4,5 stroke:#839791,stroke-width:2px; %% === Right side: Runner side === subgraph R["Runner Side"] Runner["Runner
(LitAgentRunner* default)"] Tracer["Tracer
(AgentOpsTracer*)"] Hooks["Hooks (empty default)"] Agent["Agent
(LitAgent*)"] Runner -.injects.-> Tracer Runner -.injects.-> Store Runner -.injects.-> Agent Runner -.injects.-> Hooks Tracer -.injects.-> Store Hooks -.uses.-> Runner Hooks -.uses.-> Agent Hooks -.uses.-> Tracer end linkStyle 6,7,8,9,10 stroke:#896978,stroke-width:2px; linkStyle 11,12,13 stroke:#7a89c2,stroke-width:2px; %% === Cross-section connections === Trainer --has--> Runner Trainer --has--> Tracer Trainer --has--> Hooks Trainer --uses--> Agent Algorithm -.injects.-> Store LLMProxy -.injects.-> Store Agent -.references.-> Trainer Runner -.references.-> Trainer Algorithm -.references.-> Trainer linkStyle 14,15,16 stroke:#839791,stroke-width:2px; linkStyle 17,20,21,22 stroke:#7a89c2,stroke-width:2px; linkStyle 18,19 stroke:#896978,stroke-width:2px; style L fill:none; style M fill:none; style R fill:none; ``` ## Putting It All Together: A Reinforcement Learning Example (VERL) [](){ #birds-eye-view-verl-example } VERL shows how an algorithm consumes the shared infrastructure. For historical reasons, code lives in `agentlightning.algorithm.verl` and `agentlightning.verl`. The latter is legacy and reuses terms like `Trainer` in confusing ways. The former is a thin wrapper that conforms to the new algorithm interface. Future versions will merge the two. Reinforcement learning aims to learn a policy that takes actions in states to maximize expected reward. For agents, the policy is usually a language model. Inputs are prompts (state). Outputs are generated text (action). A numeric score judges quality (reward). The `(state, action, reward)` **triplet** is the basic learning unit. In Agent-lightning, the environment is implicit in the agent’s workflow, which orchestrates one or more LLM calls and often self-judges using rules or additional model calls. During a rollout, the agent emits spans that contain everything needed for RL training, including LLM call traces and numeric judge/reward signals. The "algorithm", on the other hand, have more responsibilities. 1. Providing a language model deployment that is currently learning and improving for the agent to interact with; 2. Preparing the tasks that the agents will perform; 3. Querying the spans generated, extracting triplets, and converting them into a format that the underlying RL library can consume; 4. Updating the language model based on the learning signals. In the VERL integration, the algorithm launches a chat completion endpoint using `vLLM` and wraps training with `FSDP` for distributed optimization. It enqueues tasks from the dataset. After rollouts finish, it queries spans and converts them to triplets with `TracerTraceToTriplet`. VERL’s native training loop then consumes these triplets to update model weights. The workflow can be summarized in the following diagram. ```mermaid sequenceDiagram autonumber participant vLLM as vLLM Chat
Completion Endpoint participant FSDP as FSDP / Megatron
Weights Optimizer participant Algo as Algorithm
Main Controller
(Main Process) participant Adapter as TracerTraceToTriplet participant LLMProxy as LLM Proxy participant Store as LightningStore participant Runner as Runner + Agent Note over Algo,LLMProxy: LLMProxy and Adapter are injected by Trainer as member Note over vLLM,Algo: Algorithm creates and owns vLLM and FSDP loop Over the Dataset in Batches Algo->>vLLM: Create Chat Completion Endpoint activate vLLM vLLM->>LLMProxy: Registered as Backend Endpoint LLMProxy->>Store: Proxy URL added as Resource par Over data samples in the batch Algo-->>Store: enqueue_rollout Store-->>Runner: Dequeue Rollout +
Resources (i.e., URL) loop One Rollout Attempt Runner-->>LLMProxy: LLM calls LLMProxy-->>vLLM: Forwarded LLM calls vLLM-->>LLMProxy: LLM responses LLMProxy-->>Store: add_span / add_otel_span LLMProxy-->>Runner: Forwarded LLM responses Runner-->>Store: add_span / add_otel_span
(by tracer, including rewards) end Runner-->>Store: update_attempt("finished", status) end Algo-->>Store: Poll for completed rollouts + spans Algo->>vLLM: Chat Completion Endpoint Sleeps deactivate vLLM Algo->>Adapter: adapt(spans) Adapter->>FSDP: Triplets (state, action, reward) activate FSDP FSDP-->>Algo: Updated LLM weights deactivate FSDP end ``` **Notes:** 1. There are interactions between different components injected into or owned by algorithms in the diagram, such as the output of the adapter feeding into the FSDP optimizer. This is for simplicity of illustration and slightly different from the actual implementation, where it's the algorithm main controller that orchestrates the data flow between components. 2. **On mapping to VERL.** VERL uses a classic RLHF setup where each action is a single token, the state is the full conversation history up to that token, and reward is given at the end. This is very different from our setup where each action is actually a chunk of text, although they are both called RL! Therefore, after the adapter produces triplets, the algorithm converts each `(state, action, reward)` into a VERL trajectory (`DataProto`) with keys like `input_ids`, `position_ids`, `attention_mask`, and `token_level_scores`. That conversion happens after triplet generation and is not shown in the diagram. ## Execution Strategies and Parallelism Readers might have observed from the diagram above that there is absolutely no communication between (1) runner and agents and (2) algorithm. The only overlap of them is the [Trainer][agentlightning.Trainer] and [LightningStore][agentlightning.LightningStore]. This observation is very clear with the diagram within the trainer section. This design allows us to flexibly scale the runner and algorithm independently, which is crucial for large-scale training. Agent-lightning packages two executable bundles: a runner bundle ([Runner][agentlightning.Runner], [Tracer][agentlightning.Tracer], [Hook][agentlightning.Hook], [LitAgent][agentlightning.LitAgent]) and an algorithm bundle ([Algorithm][agentlightning.Algorithm], [Adapter][agentlightning.Adapter], [LLM Proxy][agentlightning.LLMProxy]). Both share the [LightningStore][agentlightning.LightningStore]. The trainer initializes and connects the bundles. ```mermaid graph TD subgraph Runner_Side["Runner Bundle"] direction LR R[Runner] --- T[Tracer] --- H[Hooks] --- A1[Agent] end subgraph Algorithm_Side["Algorithm Bundle"] direction LR ALG[Algorithm] --- AD[Adapter] --- LLM[LLM Proxy] end S[(Store)] TR[Trainer] Runner_Side <--> S Algorithm_Side <--> S TR --> Runner_Side TR --> Algorithm_Side linkStyle 0,1,2,3,4 opacity:0; ``` An [execution strategy][agentlightning.ExecutionStrategy], defined and owned by the trainer, governs how algorithm and runner bundles are placed, connected, scaled, and aborted. It serves four primary purposes. Execution strategies first determine **bundle placement** — whether the two bundles run in the same thread, process, machine, or across separate machines. They also define **store management**, wrapping the store and specifying how data is shared between bundles. In terms of **scalability**, the strategy can replicate the runner bundle across multiple threads, processes, or machines to expand throughput on the runner side. The algorithm side remains single-process due to the complexity of parallelization. Mature frameworks such as *DeepSpeed* and *Megatron* already support distributed model training, so scaling of the algorithm bundle is delegated to those implementations. **Abort handling** is another core responsibility. Aborts may be triggered by normal exits, failures in either bundle, or user interrupts. The trainer must include cancellation interfaces for the bundles so that bundles can be cleanly aborted. When the algorithm bundle exits normally, the strategy signals the runner bundle to terminate. If the runner exits first, no signal is sent to the algorithm, as it may still be processing completed rollouts. In cases of failure or user interruption, the strategy signals both bundles to abort; if a bundle fails to respond, the strategy should attempt a forceful termination. Agent-lightning currently provides two execution strategies: **shared-memory** and **client-server**, described in the following sections. ### Shared-memory Strategy [`SharedMemoryExecutionStrategy`][agentlightning.SharedMemoryExecutionStrategy] runs algorithm and runner bundles as threads in one process. The strategy wraps the store with [`LightningStoreThreaded`][agentlightning.LightningStoreThreaded], which guards calls with a lock for safe concurrency. This is good for lightweight debugging because components share one Python heap and avoid serialization. It is not suitable for heavy RL training or compute-intensive agents. ```mermaid flowchart TB subgraph MainProcess direction TB subgraph AlgorithmThread [Thread 0] Algorithm[Algorithm bundle] end subgraph RunnerThread1 [Thread 1] Runner1[Runner bundle #1] end subgraph RunnerThread2 [Thread 2] Runner2[Runner bundle #2] end subgraph RunnerThread3 [Thread 3] RunnerN[Runner bundle #N] end LightningStoreFacade[LightningStoreThreaded] BaseStore[Underlying LightningStore] end Algorithm -- async calls --> LightningStoreFacade Runner1 -- async calls --> LightningStoreFacade Runner2 -- async calls --> LightningStoreFacade RunnerN -- async calls --> LightningStoreFacade LightningStoreFacade -->|thread-safe delegates| BaseStore ``` You can configure which role runs on the main thread. If the main thread runs the algorithm, it is able to spawn multiple runner threads. If it runs a runner, `n_runners` must be 1 and the runner lives on the main thread. ### Client-server Strategy [](){ #birds-eye-view-client-server-strategy } [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy] splits concerns across processes. The algorithm bundle starts a [`LightningStoreServer`][agentlightning.LightningStoreServer] (HTTP API) that wraps the underlying store. Runners connect via [`LightningStoreClient`][agentlightning.LightningStoreClient] to call the same interface over REST. The server embeds a client to support algorithm-launched subprocesses (e.g., an LLM proxy worker) that need to talk back to the algorithm’s process through the same API. Currently this design introduces an extra wrapper in the Server side (as shown in the diagram), which helps debugging and improves fault tolerance. We might revisit this design in the future and enforce the client to be the only way to communicate with the store. ```mermaid flowchart TD subgraph Algorithm Process Group subgraph StoreServer[LightningStoreServer] StoreHttpClient[HTTP Client] StoreHttpServer[HTTP Server] StoreWrapper[LightningStore Wrapper] StoreHttpClient -- HTTP --> StoreHttpServer end subgraph Algorithm Bundle Algorithm[Algorithm Main Process] subgraph Another subprocess LLMProxy[LLM Proxy] end end LLMProxy -- async calls --> StoreHttpClient Algorithm -- async calls --> StoreWrapper end subgraph RunnerSide ["Runner Side"] subgraph Runner Process 1 Runner1[Runner bundle #1] Runner1 -- async calls --> LightningStoreClient1 LightningStoreClient1[LightningStoreClient] end subgraph Runner Process 2 Runner2[Runner bundle #2] Runner2 -- async calls --> LightningStoreClient2 LightningStoreClient2[LightningStoreClient] end subgraph Runner Process N RunnerN[Runner bundle #N] RunnerN -- async calls --> LightningStoreClientN LightningStoreClientN[LightningStoreClient] end end LocalStore[Underlying LightningStore] StoreHttpServer -->|delegates| StoreWrapper StoreWrapper -->|delegates| LocalStore LightningStoreClient1 -- HTTP --> StoreHttpServer LightningStoreClient2 -- HTTP --> StoreHttpServer LightningStoreClientN -- HTTP --> StoreHttpServer style RunnerSide fill:none; ``` ## Online/Continuous Learning Continuous learning keeps the algorithm loop running while runners report tasks and spans opportunistically. Key differences from batch mode: 1. The algorithm does not enqueue rollouts from a fixed dataset. Runners report tasks/rollouts and spans spontaneously. 2. The algorithm can wait for rollouts with a expected set of rollout IDs, but more often polls for new rollouts and spans or waits for a count to arrive. 3. The [`Runner`][agentlightning.Runner] processes one rollout at a time via [`step(task)`][agentlightning.Runner.step] instead of exhausting a task queue. It notifies the store when starting a rollout so the store records it. 4. A user or higher-level loop controls which resources the next step uses and when to retry. [Spans][agentlightning.Span], [Adapter][agentlightning.Adapter] implementations, and the [LLM Proxy][agentlightning.LLMProxy] work the same way. ```mermaid sequenceDiagram autonumber actor User participant Runner participant Agent participant Store as LightningStore participant Algorithm Note over Algorithm: Algorithm is long-running and loops continuously loop Continuous Learning Loop activate User opt Decide what to do next User-->>Store: get_resources_by_id Store-->>User: Resources User-->>User: Prepare input for next step end User->>Runner: step(input, resources) activate Runner Runner-->>Store: Notify: start_rollout(input) Runner->>Agent: rollout(input, resources) Agent-->>Runner: add_span / reward spans Runner-->>Store: add_span or add_otel_span Runner-->>Store: update_attempt(status="finished") deactivate Runner deactivate User Algorithm->>Store: poll for new rollouts and spans opt If there is enough new data Store-->>Algorithm: new spans Algorithm->>Algorithm: adapt spans → learning signal Algorithm->>Store: update_resources end end ``` ================================================ FILE: docs/deep-dive/serving-llm.md ================================================ # Serving LLMs under Agent-lightning Agent-lightning focuses on data, learning signals, and control flow — **not** on running model inference. This deep dive explains how to **serve** a model alongside Agent-lightning so runners can call it reliably, how the **LLM Proxy** fits into the loop, and why **token IDs** matter if you care about correctness in training and evaluation. ## General background on LLM serving [](){ #general-llm-serving-background } Serving a model is essential if you want to train it, especially when you use the model’s own generations as training data. We’ll briefly review the general background to ensure all readers are aligned. Modern LLM servers solve a difficult scheduling problem: keeping GPUs fully utilized while handling prompts of different lengths, streaming tokens as they arrive, and fitting large KV caches into limited memory. Techniques like [**continuous batching**](https://www.anyscale.com/blog/continuous-batching-llm-inference) and [**paged attention**](https://arxiv.org/abs/2309.06180) address these challenges. Continuous batching interleaves decoding across requests to reuse weights efficiently; with careful memory planning, it achieves major throughput gains without increasing latency. PagedAttention reduces KV-cache fragmentation so batching remains effective as sequences grow. See [vLLM’s PagedAttention paper](https://arxiv.org/abs/2309.06180) and [industry analyses](https://www.baseten.co/blog/continuous-vs-dynamic-batching-for-ai-inference/) for details. Balancing inference correctness and efficiency is difficult — a [recent blog](https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/) from Thinking Machines Labs highlights how inference nondeterminism ultimately affects training. Beyond scheduling, servers expose an HTTP API, often **OpenAI-compatible** (`/v1/chat/completions` and `/v1/responses`), which is itself a complex stack. In addition to text prompts and chat messages, the API defines many parameters and response fields such as [tool calls](https://platform.openai.com/docs/guides/function-calling), [structured output](https://platform.openai.com/docs/guides/structured-outputs), and [multimodal support](https://platform.openai.com/docs/guides/images-vision). Much effort has been put into implementing all these parameters for many frameworks. Popular engines like **vLLM** and [**SGLang**](https://github.com/sgl-project/sglang) ship with OpenAI-compatible frontends so you can reuse existing client code. [Ollama](https://ollama.com/blog/openai-compatibility) and [llama.cpp](https://llama-cpp-python.readthedocs.io/en/latest/server/) provide similar capabilities. However, because models differ internally, each framework interprets and implements the API slightly differently. Even with identical requests, the tokens passed to the model can vary substantially across frameworks. ## What Agent-lightning expects from a served LLM Most of the issues above either have workarounds or remain open research problems. Keep them in mind, but the key question is: what does Agent-lightning expect from a served LLM? The answer includes at least two things: * An OpenAI-compatible **Chat Completions** or **Responses** endpoint the agent can call during rollouts. * Optional training and debugging signals: **logprobs**, **usage**, and ideally **token IDs**. (OpenAI’s public API exposes usage and logprobs, but **not** token IDs — more on [why IDs matter][token-ids-matter] later.) ## Launching a serving framework For many algorithms, you’ll start an engine (e.g., **vLLM** or **SGLang**) before rollouts, then shut it down afterward to free GPU memory. Most frameworks provide a one-line “serve” command to launch the OpenAI-compatible server. You can use those to bring up `/v1/chat/completions` with your checkpoint, ensuring streaming and any required tool-calling features are enabled. A working example is shown in [Unsloth SFT](../how-to/unsloth-sft.md). Weight updates — which occur after each training step — are trickier. Some frameworks like [vLLM](https://vllm.ai/) support hot-updating model weights, but it’s usually simpler and more reliable to restart the engine to load new weights. For medium-sized tasks (hundreds of rollouts taking 10+ minutes), the restart overhead (under 30 seconds) is typically negligible. If you’re using Agent-lightning’s [**VERL**][agentlightning.algorithm.verl.VERL] integration, the algorithm can **manage the server automatically**. The [VERL framework](https://github.com/volcengine/verl) intelligently allocates compute resources and wraps vLLM/SGLang behind an `AsyncLLMServer` abstraction. You can directly use this as the LLM endpoint for agents. Since VERL can spawn multiple vLLM replicas, using [`LLMProxy`][agentlightning.LLMProxy] to manage them adds an additional safety layer. A full sequence diagram of how [VERL][agentlightning.algorithm.verl.VERL] interacts with the LLM server and proxy is available [here][birds-eye-view-verl-example]. ## LLM Proxy The **LLM Proxy** is a utility class in Agent-lightning, built on [LiteLLM](https://docs.litellm.ai/), that sits between runners and your backend engine(s) or server(s). In Agent-lightning it acts as a single URL registered as a [`Resource`][agentlightning.Resource] in the store, offering three key benefits: 1. **Unified endpoint & hot-swaps.** You can redirect traffic between OpenAI, Anthropic, local vLLM/SGLang, or canary checkpoints without modifying agent code — simply repoint the proxy. 2. **First-class tracing.** The proxy emits **OpenTelemetry** spans for every call and sends them to the [`LightningStore`][agentlightning.LightningStore]. It includes rollout and attempt identifiers in request headers so spans are correctly attributed. Sequence numbers are allocated monotonically via the store to [prevent clock-skew issues][distributed-tracing] and allow reliable reconstruction of execution trees. 3. **Token IDs.** The proxy can return prompt and response token IDs along with the model output. More details are available in the [next section][token-ids-matter]. Operationally, running the proxy alongside the algorithm works best: the algorithm registers the backend (e.g., the vLLM URL) via [`LLMProxy.update_model_list`][agentlightning.LLMProxy.update_model_list], publishes the proxy URL as a resource via [`LightningStore.add_resources`][agentlightning.LightningStore.add_resources], and runners simply use that URL during rollouts. This mirrors many production client–server setups. ## Token IDs and why they matter [](){ #token-ids-matter } This section explains how Agent-lightning handles and uses token IDs — a subtle but important detail for training stability and accuracy. Most agents interact with LLMs via **Chat Completion APIs**, exchanging chat messages. There are two main approaches to collecting training data from such agents. !!! note Tokenization here refers to the process of converting **Chat Messages** into **Token IDs**. Detokenization is the reverse process of converting **Token IDs** back to **Chat Messages**. Normally, the tokenizer is published along with the pretrained model, which includes a vocabulary, special tokens, and a chat template to dealing with chat messages. **1. Retokenizing chat messages.** In this approach, you store chat messages as text and let training algorithms **retokenize** them later, as done in many SFT workflows (e.g., [HuggingFace SFT](https://huggingface.co/docs/trl/sft_trainer)). In practice, we’ve found this method unstable and less accurate. The chart below compares training results. The retokenization approach is run twice. All settings are the same except for the retokenization approach.
This instability has three causes. Firstly, chat template used in different frameworks could be slightly different. For example, one single LLaMA model can work with multiple chat templates (multiple in [vLLM](https://github.com/vllm-project/vllm/tree/1d165d6d859d3c50720f0c07209db2363c4fd33b/examples) and one in [HuggingFace](https://huggingface.co/meta-llama)). It's possible that the chat template used in detokenization is different from the one used in tokenization (this is actually an implementation bug). Secondly, a word might be generated as two tokens (e.g., `H + AVING`) but later retokenized as `HAV + ING`. The text looks identical, but the token IDs differ from what the model originally produced. Thirdly, a generated tool call text like `{ "name": ... }` is parsed by tool call parser into an object that is required by chat completion API. Later, the object is rendered back to `{ "name": ... }` and retokenized again, tool call parsing and re-rendering might cause changes in whitespace and formatting. In some situations, JSON errors may even be auto-corrected by the tool call parser — masking the model’s true generation errors and preventing them from being trained away. ---- **2. Saving token IDs directly.** The alternative is to save the token IDs generated by the model, as done in RL setups like [Tinker](https://thinkingmachines.ai/tinker/). This requires a training pipeline that treats tokens as first-class entities, meaning agents must communicate with the inference engine at the token level. However, most agents — especially those built with frameworks like LangChain — rely on OpenAI-compatible APIs and can’t tokenize or detokenize themselves. As mentioned [earlier][general-llm-serving-background], implementing this layer manually is complex and error-prone. Some frameworks implement custom solutions (e.g., [VERL Agent Loop](https://github.com/volcengine/verl/blob/4da0d3d3188072772cb2ec817b3d6cf4a463821f/recipe/langgraph_agent/chat_model.py), [Tinker Renderer](https://github.com/thinking-machines-lab/tinker-cookbook/blob/34a6588d7055040c259985d98e71c0140b389ba7/tinker_cookbook/renderers.py)), while others leave it to users (e.g., [SkyRL Search-R1](https://novasky-ai.notion.site/skyrl-searchr1)). ---- A better solution is to use an **OpenAI-compatible API that returns token IDs directly.** This lets agents continue using familiar APIs while capturing token IDs via [tracing](../tutorials/traces.md) for training. The limitation, of course, is that the serving framework must actually support this capability. When Agent-lightning was first released, we implemented an [instrumented vLLM server](https://github.com/microsoft/agent-lightning/blob/v0.1/agentlightning/instrumentation/vllm.py) that monkey-patched vLLM’s OpenAI server to return token IDs. Since then, the Agent-lightning and vLLM teams have collaborated to add this feature directly to [vLLM core](https://github.com/vllm-project/vllm/pull/22587). Starting with **vLLM v0.10.2**, the OpenAI-compatible API includes a [`return_token_ids` parameter](https://docs.vllm.ai/en/v0.10.2/serving/openai_compatible_server.html#api-reference), allowing token IDs to be requested alongside chat messages. SGLang has tracked [similar feature requests](https://github.com/sgl-project/sglang/issues/2634), though its OpenAI-compatible layer doesn’t yet support them. In short, when using vLLM v0.10.2 or newer, [`LLMProxy`][agentlightning.LLMProxy] automatically adds `return_token_ids` to each request so the engine includes token IDs in its response. For older vLLM versions, you still need the instrumented version (via `agl vllm` CLI command). Finally, if you only save token IDs in spans, it will have its own limitations — if you train one model using spans from another model with a different tokenizer, incompatibilities can arise. In practice, though, spans in Agent-lightning always store both chat messages and token IDs (actually the full request and response objects), allowing you to fall back to retokenization when necessary. ================================================ FILE: docs/deep-dive/store.md ================================================ # Understanding Store The **[`LightningStore`][agentlightning.LightningStore]** is the central coordination point for Agent-lightning. It holds the task queue, rollouts, attempts, spans, and versioned resources, and exposes a small API both Runners and Algorithms use to communicate. This document explains what's in the store, how statuses transition, how spans are recorded, and the concurrency model (threads & processes). ## What's in the Store? ![Store Architecture](../assets/store-api-visualized.svg){ .center } At a high level: * **Task Queue** – [`enqueue_rollout`][agentlightning.LightningStore.enqueue_rollout] adds work; workers poll with [`dequeue_rollout`][agentlightning.LightningStore.dequeue_rollout]. When a rollout is dequeued, it automatically creates a new attempt associated with itself. * **Rollouts** – A rollout is one unit of work. It has input, metadata, links to resources, and a lifecycle (`queuing → preparing → running → ...`). Valid [RolloutStatus][agentlightning.RolloutStatus] are **`queuing`**, `preparing`, `running`, `succeeded`, `failed`, **`requeuing`**, **`cancelled`**. For algorithms and runners, the rollout can be seen as a whole, without worrying about the internal attempts. * **Attempts** – Each rollout can have multiple executions (retries). Attempts track [`status`][agentlightning.Attempt.status], [`start_time`][agentlightning.Attempt.start_time], [`end_time`][agentlightning.Attempt.end_time], [`last_heartbeat_time`][agentlightning.Attempt.last_heartbeat_time] and link to spans. Valid [AttemptStatus][agentlightning.AttemptStatus] are `preparing`, `running`, `succeeded`, `failed`, `requeuing`, `cancelled`. * **Spans** – Structured trace events produced by the Tracer during an attempt. Spans are ordered by a **monotonic sequence id** per `(rollout_id, attempt_id)`. * **Resources** – Versioned, named bundles (e.g., prompt templates) referenced by rollouts. * **Workers** – Metadata about runner instances: heartbeat timestamps, current assignment, and status. Rollout and Task share the same surface in practice: [`Rollout.input`][agentlightning.types.Rollout] is the task input. The queue stores rollouts that are not yet running; [Runners][agentlightning.Runner] dequeue them and update the same rollout's status as work progresses. Before we look at status transitions, it helps to keep in mind that rollouts are the "outside view," while attempts are the "inside view." Attempts are what actually run; rollouts summarize the latest attempt plus a small set of control actions like queueing and cancellation. ## Attempt Status Transitions The status model is intentionally small and operationally clear. ```mermaid stateDiagram-v2 direction LR [*] --> preparing: Runner calls dequeue_rollout()
or start_rollout()
or start_attempt() preparing --> running: Runner calls
add_[otel_]span()
for the first time state c_runner <> state c_watch <> preparing --> c_runner: Runner calls
update_attempt(...) running --> c_runner: Runner calls
update_attempt(...) running --> c_watch: Watchdog checks preparing --> c_watch: Watchdog checks state "Client-set outcome" as Client { direction TB succeeded failed } state "Watchdog / policy" as Watch { direction TB timeout unresponsive } c_runner --> succeeded: update_attempt(status=succeeded) c_runner --> failed: update_attempt(status=failed) c_watch --> timeout: now - start_time > timeout_seconds c_watch --> unresponsive: now - last_heartbeat > unresponsive_seconds unresponsive --> running: Runner calls
add_[otel_]span() ``` Each attempt begins in **preparing**, created either when a rollout is dequeued or explicitly started. It transitions to **running** the first time a span is recorded. From there, a few clear rules govern how it can change: * When the runner explicitly marks completion, the attempt becomes **succeeded** or **failed** (when the runner catches exception thrown out by the agent). * When the watchdog detects that the total elapsed time since start exceeds the configured limit, it marks the attempt as **timeout**. * If heartbeats stop arriving for too long, the watchdog marks it **unresponsive**. * A new span from the runner can immediately revive an **unresponsive** attempt back to **running**. !!! info "What's a Watchdog?" The watchdog enforces timing and liveness rules defined by each rollout’s [`RolloutConfig`][agentlightning.RolloutConfig]. It’s not a separate thread or service, but a function periodically invoked (e.g., before store mutations) to keep attempts healthy and consistent. This simple model allows the system to distinguish between normal termination, abnormal stalling, and recoverable interruption without additional state flags. ## Worker Telemetry Workers track runner-level activity timestamps (`last_heartbeat_time`, `last_dequeue_time`, `last_busy_time`, `last_idle_time`) plus their current rollout assignment. Those fields are now derived automatically: - [`dequeue_rollout(worker_id=...)`][agentlightning.LightningStore.dequeue_rollout] records which worker polled the queue and refreshes `last_dequeue_time`. - [`update_attempt(..., worker_id=...)`][agentlightning.LightningStore.update_attempt] drives the worker status machine. Assigning an attempt marks the worker **busy** and stamps `last_busy_time`; finishing with `status in {"succeeded","failed"}` switches to **idle**, while watchdog transitions such as `timeout`/`unresponsive` make the worker **unknown** and clear `current_rollout_id` / `current_attempt_id`. - [`update_worker(...)`][agentlightning.LightningStore.update_worker] is reserved for heartbeats. It snapshots optional `heartbeat_stats` and always updates `last_heartbeat_time`. Because every transition flows through these APIs, worker status is derived automatically from rollout execution and heartbeats. Note, however, that calling `update_worker` with a new `worker_id` will create a new worker record with status "unknown" if one does not exist. Thus, while manual status changes are not allowed, new worker records can be created externally via heartbeats. ## Rollout Transition Map Rollout status is an **aggregated view** of its latest attempt’s status, with additional transitions for queueing and explicit cancellation. A rollout’s retry behavior is controlled by [`Rollout.config`][agentlightning.types.Rollout] (a [`RolloutConfig`][agentlightning.types.RolloutConfig]). The key fields are: * [`timeout_seconds`][agentlightning.RolloutConfig.timeout_seconds] – maximum wall-clock time for an attempt before it is marked `timeout`. * [`unresponsive_seconds`][agentlightning.RolloutConfig.unresponsive_seconds] – maximum silence between heartbeats before an attempt is marked `unresponsive`. * [`max_attempts`][agentlightning.RolloutConfig.max_attempts] – total number of attempts allowed for the rollout (including the first). * [`retry_condition`][agentlightning.RolloutConfig.retry_condition] – which attempt terminal statuses should trigger a retry (e.g., `["failed", "timeout", "unresponsive"]`). **How it plays out:** The runner works on attempt `k`. If the attempt ends in a status that is listed in `retry_condition`, and `k < max_attempts`, the rollout moves to **requeuing** and the store creates attempt `k+1`. Otherwise, the rollout becomes **failed** (or **succeeded** if the runner marked it so). `timeout_seconds` and `unresponsive_seconds` are enforced by the watchdog and feed into the same decision flow. A minimal example of how to use `RolloutConfig`: ```python from agentlightning import RolloutConfig # Retry on explicit failures or timeouts, up to 3 attempts in total. cfg = RolloutConfig( timeout_seconds=600, unresponsive_seconds=120, max_attempts=3, retry_condition=["failed", "timeout"] ) # When creating/enqueuing a rollout, attach this config. # The store will propagate attempt outcomes according to cfg. rollout = await store.enqueue_rollout(input, config=cfg) ``` | Latest attempt status | Rollout transition | Notes / guards | | ------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------- | | N/A | `queuing` | Created by `enqueue_rollout()`. | | `preparing` | `queuing/requeuing` → `preparing` | Typically `dequeue_rollout()` or `start_rollout()`/`start_attempt()` creates a new attempt. | | `running` | `preparing/queuing/requeuing` → `running` | First `add_[otel_]span()` flips the attempt to `running`; rollout follows via `rollout_status_from_attempt`. | | `succeeded` | `*` → `succeeded` | Terminal. Rollout `end_time` set. | | `failed` / `timeout` / `unresponsive` | `*` → `requeuing` | **Only if** `status ∈ retry_condition ∧ sequence_id < max_attempts`. | | `failed` / `timeout` / `unresponsive` | `*` → `failed` | Otherwise (no retries left or retries disabled). | | `*` | `*` → `cancelled` | Explicitly set by `update_rollout(status=cancelled)`. | !!! note "Why aggregation?" In code, we use `rollout_status_from_attempt()` which actively updates the rollout based on the latest attempt. Reading the table above is usually easier than reverse-engineering the propagation logic in the code: think of the rollout’s transitions as *callbacks* on attempt state changes, plus queue/cancel paths. ## Spans Every traceable operation in a rollout is stored as a [Span][agentlightning.Span]. Spans not only capture fine-grained instrumentation but also act as periodic heartbeats that demonstrate liveness. The first span marks activation; each subsequent one both extends the trace and refreshes the attempt’s [`last_heartbeat_time`][agentlightning.Attempt.last_heartbeat_time]. If no span arrives within the configured [`unresponsive_seconds`][agentlightning.RolloutConfig.unresponsive_seconds], the watchdog downgrades the attempt to **unresponsive** until activity resumes. Spans are indexed by `(rollout_id, attempt_id, sequence_id)` where the sequence is monotonic. Tracing analysis tools like [Adapter][agentlightning.Adapter] usually rely on "time order" to reconstruct the trace. However, in a distributed system, the recorded start time and end time of a span are not necessarily in the right order when they aggregated into a central store. Therefore, we enforce every span creation to retrieve a monotonically increasing [`sequence_id`][agentlightning.Span.sequence_id] from the store before adding the span. !!! note In practice, one `sequence_id` can be used to create multiple spans. In that case, the orders between the multiple spans are determined by the order of `start_time` and `end_time` of the spans. ### OpenTelemetry conversion Runners often produce [OpenTelemetry `ReadableSpan`](https://opentelemetry.io/docs/concepts/signals/traces/#attributes) objects directly. The store normalizes them into [`Span`][agentlightning.Span] as follows: 1. The runner first requests [`get_next_span_sequence_id`][agentlightning.LightningStore.get_next_span_sequence_id] via `sequence_id = await store.get_next_span_sequence_id(rollout_id, attempt_id)`. This guarantees ordering within the attempt regardless of clock skew. 2. `trace_id`, `span_id`, `parent_id`, `name`, `status`, timestamps, attributes, events, links, and resource are copied from the OTEL span. Timestamps are auto-normalized to seconds (nanoseconds are converted). 3. OTEL `SpanContext` and parent context are preserved so downstream tools can correlate traces across systems. 4. Any additional serializable fields present on the `ReadableSpan` are retained in the stored span (after safe JSON serialization), which keeps the representation forward-compatible. Programmatically this is encapsulated by [`Span.from_opentelemetry(readable_span, rollout_id, attempt_id, sequence_id)`][agentlightning.Span.from_opentelemetry]; [`store.add_otel_span(...)`][agentlightning.LightningStore.add_otel_span] simply wraps the fetch-then-add flow. The end result is a store span that is stable to sort, merge, and query, while still preserving the richness of the original OTEL payload. !!! tip [`add_span`][agentlightning.LightningStore.add_span] or [`add_otel_span`][agentlightning.LightningStore.add_otel_span] both appends a span *and* acts as a heartbeat that can revive `unresponsive` → `running`. ### OTLP Compatibility Some of the LightningStore implementations support exporting traces via the [OTLP/HTTP specification](https://opentelemetry.io/docs/specs/otlp/). For example, [`LightningStoreServer`][agentlightning.LightningStoreServer] exposes `/v1/traces` endpoint, it implements the binary Protobuf variant defined by the spec, including the required `Content-Type: application/x-protobuf`, optional `Content-Encoding: gzip`, and status responses encoded as `google.rpc.Status`. Agent-lightning helps parsing `ExportTraceServiceRequest` messages, validate identifiers, normalize resource metadata, and allocate sequence numbers so store implementations only need to persist [`Span`][agentlightning.Span] objects in order. Because the interface speaks standard OTLP, any OpenTelemetry-compatible SDK or collector can emit spans directly to a LightningStore OTLP endpoint without custom shims. The server responds according to the OTLP contract (status code, encoding, and error payloads), which keeps Agent-lightning interoperable with existing observability tooling. This compatibility serves as a strong complement to the OpenTelemetry conversion discussed above. Check whether the store supports OTLP traces via the [`capabilities["otlp_traces"]`][agentlightning.LightningStore.capabilities] property. ## Implementation Overview The `agentlightning.store` module is organized into two distinct layers plus optional wrappers: ```mermaid classDiagram direction TB class LightningStore { <> +enqueue_rollout() +dequeue_rollout() +update_attempt() +add_span() +query_rollouts() ... } class LightningCollections { <> +rollouts: Collection +attempts: Collection +spans: Collection +resources: Collection +workers: Collection +rollout_queue: Queue +span_sequence_ids: KeyValue +atomic() } class CollectionBasedLightningStore~T~ { +collections: T -healthcheck_before() -tracked() } class InMemoryLightningStore class MongoLightningStore class InMemoryLightningCollections class MongoLightningCollections class LightningStoreServer { +store: LightningStore +start() +stop() } class LightningStoreClient { +server_address: str } class LightningStoreThreaded { +store: LightningStore } LightningStore <|-- CollectionBasedLightningStore LightningStore <|-- LightningStoreServer LightningStore <|-- LightningStoreClient LightningStore <|-- LightningStoreThreaded CollectionBasedLightningStore <|-- InMemoryLightningStore CollectionBasedLightningStore <|-- MongoLightningStore LightningCollections <|-- InMemoryLightningCollections LightningCollections <|-- MongoLightningCollections InMemoryLightningStore ..> InMemoryLightningCollections : uses MongoLightningStore ..> MongoLightningCollections : uses LightningStoreServer o-- LightningStore : wraps LightningStoreThreaded o-- LightningStore : wraps ``` 1. **Collections Layer** – Low-level storage primitives ([`LightningCollections`][agentlightning.store.collection.LightningCollections]) providing CRUD operations via [`Collection`][agentlightning.store.collection.Collection], [`Queue`][agentlightning.store.collection.Queue], and [`KeyValue`][agentlightning.store.collection.KeyValue] interfaces. Each backend (in-memory, MongoDB) implements these primitives. 2. **Store Layer** – All [`LightningStore`][agentlightning.LightningStore] implementations must inherit from [`LightningStore`][agentlightning.LightningStore] and override the methods to implement the storage logic. [`CollectionBasedLightningStore`][agentlightning.CollectionBasedLightningStore] builds on collections to implement the full [`LightningStore`][agentlightning.LightningStore] API, including business logic like status transitions, watchdog health checks, and retry policies. 3. **Wrappers** – Cross-cutting concerns live in thin wrappers: - [`LightningStoreThreaded`][agentlightning.LightningStoreThreaded] adds mutex-based thread safety. - [`LightningStoreServer`][agentlightning.LightningStoreServer] / [`LightningStoreClient`][agentlightning.LightningStoreClient] enable multi-process access over HTTP. ## Collections The collections layer provides storage primitives that [`CollectionBasedLightningStore`][agentlightning.CollectionBasedLightningStore] builds upon. This separation keeps business logic (status transitions, watchdog, retries) in the store layer while allowing different backends to focus purely on persistence. The off-the-shelf implementations are [`InMemoryLightningCollections`][agentlightning.store.collection.InMemoryLightningCollections] and [`MongoLightningCollections`][agentlightning.store.collection.mongo.MongoLightningCollections], which are the underlying collections for [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] and [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore], respectively. ### Collection Primitives [`LightningCollections`][agentlightning.store.collection.LightningCollections] bundles three primitive types: | Primitive | Purpose | Methods | |-----------|---------|---------| | [`Collection[T]`][agentlightning.store.collection.Collection] | Indexed storage with primary keys | [`query()`][agentlightning.store.collection.Collection.query], [`get()`][agentlightning.store.collection.Collection.get], [`insert()`][agentlightning.store.collection.Collection.insert], [`update()`][agentlightning.store.collection.Collection.update], [`upsert()`][agentlightning.store.collection.Collection.upsert], [`delete()`][agentlightning.store.collection.Collection.delete] | | [`Queue[T]`][agentlightning.store.collection.Queue] | FIFO queue for task scheduling | [`enqueue()`][agentlightning.store.collection.Queue.enqueue], [`dequeue()`][agentlightning.store.collection.Queue.dequeue], [`peek()`][agentlightning.store.collection.Queue.peek], [`size()`][agentlightning.store.collection.Queue.size] | | [`KeyValue[K, V]`][agentlightning.store.collection.KeyValue] | Simple key-value store | [`get()`][agentlightning.store.collection.KeyValue.get], [`set()`][agentlightning.store.collection.KeyValue.set], [`inc()`][agentlightning.store.collection.KeyValue.inc], [`chmax()`][agentlightning.store.collection.KeyValue.chmax], [`pop()`][agentlightning.store.collection.KeyValue.pop] | Every [`LightningCollections`][agentlightning.store.collection.LightningCollections] instance exposes these named collections: - `rollouts` – [`Collection[Rollout]`][agentlightning.store.collection.Collection] keyed by `rollout_id` - `attempts` – [`Collection[Attempt]`][agentlightning.store.collection.Collection] keyed by `(rollout_id, attempt_id)` - `spans` – [`Collection[Span]`][agentlightning.store.collection.Collection] keyed by `(rollout_id, attempt_id, span_id)` - `resources` – [`Collection[ResourcesUpdate]`][agentlightning.store.collection.Collection] keyed by `resources_id` - `workers` – [`Collection[Worker]`][agentlightning.store.collection.Collection] keyed by `worker_id` - `rollout_queue` – [`Queue[str]`][agentlightning.store.collection.Queue] holding rollout IDs awaiting execution - `span_sequence_ids` – [`KeyValue[str, int]`][agentlightning.store.collection.KeyValue] tracking monotonic sequence counters ### Atomic Operations Collections support atomic operations through the [`atomic()`][agentlightning.store.collection.LightningCollections.atomic] context manager: ```python async with collections.atomic(mode="rw", labels=["rollouts", "attempts"]) as ctx: rollout = await ctx.rollouts.get(filter={"rollout_id": {"exact": rollout_id}}) # modify and update within the same transaction await ctx.rollouts.update([updated_rollout]) ``` The arguments passed to [`atomic()`][agentlightning.store.collection.LightningCollections.atomic] are quite arbitrary and flexible. Different implementations may have different interpretations of the arguments. For example, to [`InMemoryLightningCollections`][agentlightning.store.collection.InMemoryLightningCollections], the `mode` parameter controls locking behavior (`"r"` for read-only, `"rw"` for read-write), while `labels` specifies which collections to lock. Acquiring locks in sorted order prevents deadlocks when multiple operations run concurrently. ### Implementing a Custom Backend To add a new storage backend, implement [`LightningCollections`][agentlightning.store.collection.LightningCollections]: ```python from agentlightning.store.collection import LightningCollections, Collection, Queue, KeyValue class MyLightningCollections(LightningCollections): @property def rollouts(self) -> Collection[Rollout]: return self._rollouts # your implementation @property def rollout_queue(self) -> Queue[str]: return self._queue # your implementation # ... implement remaining properties async def atomic(self, *, mode, snapshot=False, labels=None, **kwargs): # provide transaction / locking semantics ... ``` Then instantiate your store: ```python from agentlightning.store.collection_based import CollectionBasedLightningStore store = CollectionBasedLightningStore(collections=MyLightningCollections()) ``` The store layer handles all business logic; your collections just need to provide correct CRUD semantics. ## Collection-based Store Implementations Agent-lightning ships with two collection-based store implementations: ### InMemoryLightningStore [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] uses [`InMemoryLightningCollections`][agentlightning.store.collection.InMemoryLightningCollections] backed by Python data structures. It supports **fast startup** with zero external dependencies—ideal for local development, CI, and unit tests. It also provides two lock modes, configurable between `"asyncio"` (single-thread, multiple coroutines) and `"thread"` (multi-threaded via [aiologic](https://github.com/x42005e1f/aiologic)). [`InMemoryLightningCollections`][agentlightning.store.collection.InMemoryLightningCollections] use nested dictionaries for O(1) primary-key lookup and `deque` for the task queue. ### MongoLightningStore [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore] uses [`MongoLightningCollections`][agentlightning.store.collection.mongo.MongoLightningCollections] backed by MongoDB. It supports **persistent storage** suitable for production deployments and **multi-process safe** via database-level atomicity. It also supports **partition support** via `partition_id` for running multiple trainers against the same database. ```python from agentlightning.store.mongo import MongoLightningStore store = MongoLightningStore( mongo_uri="mongodb://localhost:27017/?replicaSet=rs0", database_name="agentlightning", partition_id="trainer-1", # optional: isolate data per trainer ) ``` !!! note [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore] requires the `mongo` optional dependency. Install with `pip install agentlightning[mongo]`. ### Capabilities [](){ #store-capabilities } Different stores have different capabilities. Check the [`capabilities`][agentlightning.LightningStore.capabilities] property to understand what a store supports: | Capability | Description | InMemory | Mongo | Server | Client | |------------|-------------|----------|-------|--------|--------| | `thread_safe` | Safe for concurrent access from multiple threads | configurable | ✓ | ✓ | ✓ | | `async_safe` | Safe for concurrent access from multiple coroutines | ✓ | ✓ | ✓ | ✓ | | `zero_copy` | Can be shared across processes without serialization | ✗ | ✓ | ✓ | ✓ | | `otlp_traces` | Exposes an OTLP-compatible `/v1/traces` endpoint | ✗ | ✗ | ✓ | ✓ | ## Thread Safety Thread safety can be achieved at different layers: **At the collections layer**: [`InMemoryLightningCollections`][agentlightning.store.collection.InMemoryLightningCollections] accepts a `lock_type` parameter: - `"asyncio"` – Uses per-event-loop `asyncio.Lock` for single-threaded, multi-coroutine scenarios. - `"thread"` – Uses `aiologic.Lock` for true multi-threaded access. **At the store layer**: [`LightningStoreThreaded`][agentlightning.LightningStoreThreaded] wraps any [`LightningStore`][agentlightning.LightningStore] to add mutex-based thread safety: * Methods like [`start_rollout`][agentlightning.LightningStore.start_rollout], [`enqueue_rollout`][agentlightning.LightningStore.enqueue_rollout], [`update_attempt`][agentlightning.LightningStore.update_attempt], [`add_span`][agentlightning.LightningStore.add_span], etc. are guarded by a lock. * Non-mutating, potentially blocking calls remain pass-through by design (e.g., [`wait_for_rollouts`][agentlightning.LightningStore.wait_for_rollouts]), as they don't modify shared state and should not hold the lock for long periods. Database-based stores like [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore] are inherently thread-safe through database atomicity guarantees. ## Process Safety and Client-server Store **[`LightningStoreServer`][agentlightning.LightningStoreServer]** wraps another underlying store and runs a FastAPI app to expose the store API over HTTP. [`LightningStoreClient`][agentlightning.LightningStoreClient] is a small [`LightningStore`][agentlightning.LightningStore] implementation that talks to the HTTP API. !!! warning The server HTTP API is not considered a stable API at this moment. Users are encouraged to use the [`LightningStoreClient`][agentlightning.LightningStoreClient] to communicate with the server as a stable interface. The server tracks the creator PID. In the owner process it delegates directly to the in-memory store; in other processes it lazily constructs a [`LightningStoreClient`][agentlightning.LightningStoreClient] to talk to the HTTP API. This prevents accidental cross-process mutation of the wrong memory image. When the server is pickled (e.g., via `multiprocessing`), only the minimal fields are serialized, but **NOT** the FastAPI/uvicorn objects. Subprocesses won’t accidentally carry live server state. Forked subprocess should also use [`LightningStoreClient`][agentlightning.LightningStoreClient] to communicate with the server in the main process. On the client side, the client retries network/5xx failures using a small backoff, and probes `/v1/agl/health` between attempts. Application exceptions inside the server are wrapped as HTTP 400 with a traceback—these are **not retried**. The client also maintains a **per-event-loop** `aiohttp.ClientSession` map so that tracer callbacks (often on separate loops/threads) don’t hang by reusing a session from another loop. Minimal lifecycle: ```python import agentlightning as agl # Server (owner process) in_memory_store = agl.InMemoryLightningStore() server = agl.LightningStoreServer(store=in_memory_store, host="0.0.0.0", port=4747) await server.start() # starts uvicorn in a daemon thread and waits for /health # or keep your own event loop and stop via await server.stop() # await server.run_forever() # Client (same or different process) client = agl.LightningStoreClient("http://localhost:4747") print(await client.query_rollouts(status_in=["queuing"])) await client.close() await server.stop() ``` Another approach is to use a dedicated command line to start a long running server process, possibly sharable across multiple processes. In the main process, you can always use [`LightningStoreClient`][agentlightning.LightningStoreClient] to communicate with the server. ```bash agl store --port 4747 ``` !!! note [`LightningStoreClient.wait_for_rollouts`][agentlightning.LightningStoreClient.wait_for_rollouts] intentionally enforces a tiny timeout (≤ 0.1s) to avoid blocking event loops. Poll with short timeouts or compose with `asyncio.wait_for` at a higher layer. ================================================ FILE: docs/how-to/examples-catalog.md ================================================ # Examples Catalog !!! tip "Want to Contribute?" We welcome contributions to the examples catalog! Please refer to the [Contributing](../community/contributing.md) guide for more details.
- :material-robot:{ .lg .middle } __APO room selector__ --- Prompt-optimize a room-booking agent with the built-in APO algorithm, then contrast it with the write-your-own algorithm and debugging workflows in the tutorials. Pairs well with the [Train the First Agent how-to]({{ src("docs/how-to/train-first-agent.md") }}) and the [Write the First Algorithm guide]({{ src("docs/how-to/write-first-algorithm.md") }}). [:octicons-repo-24: Browse source]({{ src("examples/apo") }}) - :material-cloud-sync:{ .lg .middle } __Azure OpenAI SFT__ --- Run a supervised fine-tuning loop against Azure OpenAI: roll out the capital-lookup agent, turn traces into JSONL, launch fine-tunes, and redeploy the resulting checkpoints through Azure CLI. [:octicons-repo-24: Browse source]({{ src("examples/azure") }}) - :material-calculator:{ .lg .middle } __Calc-X VERL math__ --- VERL-based reinforcement learning setup for a math-reasoning agent that uses AutoGen plus an MCP calculator tool to solve Calc-X problems end to end. [:octicons-repo-24: Browse source]({{ src("examples/calc_x") }}) - :material-chart-box:{ .lg .middle } __ChartQA vision-language RL__ --- LangGraph-powered workflow for answering chart questions end to end: rollout the multi-modality agent with GPT or vLLM, and train with VERL/GRPO plus self-refinement loops. [:octicons-repo-24: Browse source]({{ src("examples/chartqa") }}) - :material-code-braces:{ .lg .middle } __Claude Code SWE-bench__ --- Instrumented driver that runs Anthropic's Claude Code workflow on SWE-bench instances while streaming traces through Agent-lightning—supports hosted vLLM, official Anthropic, or any OpenAI-compatible backend and emits datasets for downstream tuning. [:octicons-repo-24: Browse source]({{ src("examples/claude_code") }}) - :material-view-grid:{ .lg .middle } __Minimal building blocks__ --- Bite-sized scripts that isolate Agent-lightning primitives (e.g., LightningStore usage, LLM proxying, minimal vLLM host) so you can study each part before composing larger workflows. [:octicons-repo-24: Browse source]({{ src("examples/minimal") }}) - :material-book-open-page-variant:{ .lg .middle } __RAG (MuSiQue)__ --- Retrieval-Augmented Generation pipeline that preps a Wikipedia retriever via MCP and trains a MuSiQue QA agent with GRPO. Documented for historical reference (verified on Agent-lightning v0.1.x). [:octicons-repo-24: Browse source]({{ src("examples/rag") }}) - :material-database:{ .lg .middle } __Spider SQL agent__ --- LangGraph-powered text-to-SQL workflow for the Spider benchmark, combining LangChain tooling with Agent-lightning rollouts; follow along with the [how-to for training SQL agents]({{ src("docs/how-to/train-sql-agent.md") }}). [:octicons-repo-24: Browse source]({{ src("examples/spider") }}) - :material-thought-bubble:{ .lg .middle } __Tinker integration__ --- Adapter package ([`agl_tinker`]({{ src("examples/tinker/agl_tinker") }})) with Tinker plus sample CrewAI/OpenAI agents that feed Agent-lightning traces into Tinker’s reinforcement-learning backend for both toy and 20-Questions-style workflows. [:octicons-repo-24: Browse source]({{ src("examples/tinker") }}) - :material-fast-forward:{ .lg .middle } __Unsloth SFT__ --- Supervised fine-tuning loop that ranks math-agent rollouts, fine-tunes with Unsloth’s 4-bit LoRA stack, and mirrors the [Fine-tune with Unsloth recipe]({{ src("docs/how-to/unsloth-sft.md") }}). [:octicons-repo-24: Browse source]({{ src("examples/unsloth") }})
================================================ FILE: docs/how-to/train-first-agent.md ================================================ # Train the First Agent with Agent-lightning Welcome! This tutorial is your first step into making AI agents smarter using the **Agent-lightning** framework. We'll show you how to take a simple agent and automatically improve its performance through a process called [**Automatic Prompt Optimization (APO)**](../algorithm-zoo/apo.md). The main goal of Agent-lightning is to provide a structured way to **train your agents**. Just like you train a machine learning model on data, you can train an agent on a task dataset. This could involve using Reinforcement Learning (RL) to teach it new behaviors or, as we'll do today, optimizing its prompts to make it more accurate and reliable. !!! tip You can open the sample code [room_selector_apo.py]({{ src("examples/apo/room_selector_apo.py") }}) and [room_selector.py]({{ src("examples/apo/room_selector.py") }}) as you go through this tutorial. ## Our Example: The Room Selector Agent Today, we'll work with an agent whose job is to book a meeting room. It's a common but tricky task with multiple constraints. Here's how the agent works: - **Input:** It receives a task with specific requirements, like "`Find a room for 4 people at 10:00 AM with a whiteboard.`" - **Action:** The agent uses a Large Language Model (LLM) to understand the request. It can also use tools, which are pre-defined functions it can call, to get more information, such as checking room availability in an external database. - **Output:** Its final decision is the ID of the best room it found, like "`A103`". - **Reward:** After the agent makes its choice, a separate "grader" function scores its performance on a scale of 0 to 1. This score is called its **reward**. A perfect choice gets a 1.0, while a wrong one gets a 0.0. The agent's logic is sound, but its performance heavily depends on its initial prompt. A poorly worded prompt will confuse the LLM, leading to bad decisions. Our goal is to use Agent-lightning to find the best possible prompt automatically. !!! tip "A Closer Look at the Agent's Logic" Modern LLMs can do more than just generate text; they can decide to call functions you provide. This is often called tool use or function calling. Our agent uses this capability to make informed decisions. If you're new to this concept, you can read more about it in [OpenAI's documentation](https://platform.openai.com/docs/guides/function-calling). Here is a sketch of the agent's logic, adhering closely to the OpenAI API: ```python # Pseudo-code for the Room Selector agent import openai import json def room_selector_agent(task, prompt): client = openai.OpenAI() messages = [{"role": "user", "content": prompt.format(**task)}] tools = [ ... ] # Tool definition for the LLM # 1. First LLM call to decide if a tool is needed. response = client.chat.completions.create( model="gpt-5-mini", messages=messages, tools=tools, tool_choice="auto", ) response_message = response.choices[0].message tool_calls = response_message.tool_calls # 2. Check if the LLM wants to use a tool. if tool_calls: messages.append(response_message) # Append assistant's reply # 3. Execute the tool and get the real-world data. for tool_call in tool_calls: function_name = tool_call.function.name if function_name == "get_rooms_and_availability": function_args = json.loads(tool_call.function.arguments) # Query the local room database function_response = get_rooms_and_availability( date=function_args.get("date"), time_str=function_args.get("time"), duration_min=function_args.get("duration_min"), ) messages.append({ "tool_call_id": tool_call.id, "role": "tool", "name": function_name, "content": json.dumps(function_response), }) # 4. Second LLM call with the tool's output to get a final choice. second_response = client.chat.completions.create( model="gpt-5-mini", messages=messages, ) final_choice = second_response.choices[0].message.content else: final_choice = response_message.content # 5. Grade the final choice to get a reward. reward = grade_the_choice(final_choice, task["expected_choice"]) return reward ``` In Agent-lightning, you wrap this logic in a Python function marked with the [`@rollout`][agentlightning.rollout] decorator, so that the agent can be managed and tuned by Agent-lightning's runner and trainer. The `prompt_template` that the APO algorithm tunes is passed in as an argument: ```python import agentlightning as agl @agl.rollout def room_selector(task: RoomSelectionTask, prompt_template: agl.PromptTemplate) -> float: # ... agent logic using the prompt_template ... # The final reward is determined by a grader function reward = room_selection_grader(client, final_message, task["expected_choice"]) return reward ``` ## Core Concepts: Tasks, Rollouts, Spans, and Prompt Templates To understand how Agent-lightning works, you need to know these key terms. ### Task A task is a specific input or problem statement given to the agent. It defines what the agent needs to accomplish. !!! example "Analogy: Task" If the agent is a chef, a task is the recipe request: "Bake a chocolate cake." ### Rollout A rollout is a single, complete execution of an agent attempting to solve a given **task**. It's the entire story from receiving the task to producing a final result and receiving a reward. A rollout captures a full trace of the agent's execution. !!! example "Analogy: Rollout" A rollout is one full attempt by the chef to bake the chocolate cake, from gathering ingredients to the final taste test. ### Span A span represents a single unit of work or an operation within a **rollout**. Spans are the building blocks of a trace. They have a start and end time and contain details about the specific operation, like an LLM call, a tool execution, or a reward calculation. For a more precise definition, see the [OpenTelemetry documentation](https://opentelemetry.io/docs/concepts/signals/traces/). !!! example "Analogy: Span" If the rollout is "baking a cake," a span could be "preheating the oven," "mixing flour and sugar," or "adding frosting." Each is a distinct step or unit of work. The picture below from [ADK](https://google.github.io/adk-docs/observability/cloud-trace/) shows a typical rollout, where each rectangle in the waterfall visualizes a span. As can be seen in the visualization, spans can be sequential, parallel or nested among each other. In other frameworks, the terminology might be slightly different. Agent-lightning follows the terminologies used by OpenTelemetry to avoid confusion. ![AgentOps Waterfall Visualization](../assets/agentops-waterfall-visualization.jpg) ### Prompt Template A prompt template is a reusable instruction for the agent, often containing placeholders that can be filled in with specific details from a task. It is a key **"resource"** that the algorithm learns and improves over time. !!! example "Analogy: Resource (Prompt Template)" If the task is the recipe request, the prompt template is the master recipe card that the chef follows. The algorithm's job is to edit this recipe card to make the instructions clearer and the final dish better. ## The Training Loop: How the Magic Happens Training in Agent-lightning revolves around a clear, managed loop, orchestrated by the **Trainer**. The diagram below illustrates this core interaction: ![Loop of Tasks and Spans](../assets/tasks-spans-loop.svg){ .center } **The Loop Explained:** - **Algorithm to Agent (via Trainer):** The **Algorithm** (the "brain") creates an improved **Prompt Template** and selects **Tasks**. The Trainer then sends both to the Agent. - **Agent to Algorithm (via Trainer):** For each task it receives, the Agent uses the provided prompt template to perform a Rollout, executing its logic and potentially using tools. During this rollout, the runner that runs the agent captures Spans that detail every step. The agent also calculates a Reward for its performance on the task. These spans and rewards are then sent back to the Algorithm via the Trainer. - **Algorithm Learning:** The Algorithm then analyzes these spans and rewards to learn how to improve the agent's behavior, for example, by generating a better prompt. This improved prompt is then used in the next iteration of tasks. This cycle continues, allowing the agent to continuously learn and get better at solving tasks. !!! note In the next tutorial, we will see that the "via Trainer" here is not accurate. It's actually via the runner and store. ### The Algorithm The algorithm is the smart part of the system that drives the improvement. In this tutorial, we use [**APO**][agentlightning.algorithm.apo.APO] (Automatic Prompt Optimization). It works in a few steps: 1. **Evaluate:** The algorithm first asks for rollouts to be run using the current prompt template to see how well it performs. 2. **Critique:** It then looks at the detailed spans from those rollouts. Using a powerful LLM (`gpt-5-mini`), it generates a "textual gradient", which is a natural language critique of the prompt. For example: "The prompt is ambiguous about how to handle tie-breakers for equally good rooms." 3. **Rewrite:** Finally, it gives the critique and the original prompt to another LLM (`gpt-4.1-mini`) and asks it to apply the edits, generating a new, improved prompt template. This cycle repeats, with each round producing a slightly better prompt. To use it, you simply initialize the APO class with your desired hyperparameters. ```python # In the main training script: run_apo.py from openai import AsyncOpenAI openai = AsyncOpenAI() algo = agl.APO(openai) ``` !!! tip Make sure you have `OPENAI_API_KEY` set in your environment variables. ### The Trainer The Trainer is the central component you'll interact with. It connects everything and manages the entire workflow by running the loop described above. You configure the Trainer, providing the algorithm, the number of parallel runners, and the initial prompt. A single call to [`trainer.fit()`][agentlightning.Trainer.fit] kicks off the entire process! ```python # 1. Configure the Trainer with the algorithm and initial prompt trainer = agl.Trainer( algorithm=algo, n_runners=8, # Run 8 agents in parallel to try out the prompts initial_resources={ # The initial prompt template to be tuned "prompt_template": prompt_template_baseline() }, # This is used to convert the span data into a message format consumable by APO algorithm adapter=agl.TraceToMessages(), ) # 2. Load datasets: They can be list of task objects consumable by `room_selector`. dataset_train, dataset_val = ... # 3. Start the training process! trainer.fit( agent=room_selector, train_dataset=dataset_train, val_dataset=dataset_val ) ``` !!! tip [`TraceToMessages`][agentlightning.TraceToMessages] is a convenience adapter that converts spans into OpenAI chat messages. It requires `openai >= 1.100.0` to be installed. ## Training Results The APO algorithm successfully improved the agent's performance. We ran the example with the following hyper-parameters: - `val_batch_size` = 10 - `gradient_batch_size` = 4 - `beam_width` = 2 - `branch_factor` = 2 - `beam_rounds` = 2 The validation accuracy on the 29 samples of datasets steadily increase from 0.569 (baseline) to **0.721** (after round 2). The tuning takes around 10 minutes with 8 runners. We ran twice, and the results are shown in the chart below.
This demonstrates how Agent-lightning can efficiently and automatically enhance your agent's capabilities with just a few lines of code. ================================================ FILE: docs/how-to/train-sql-agent.md ================================================ # Train SQL Agent with Agent-lightning and VERL This walkthrough builds upon the **Agent-lightning SQL Agent** example and explains how the system components integrate: a **LangGraph-based SQL agent** wrapped as a [`LitAgent`][agentlightning.LitAgent], the **[`VERL`][agentlightning.algorithm.verl.VERL] reinforcement learning (RL) algorithm**, and the **[`Trainer`][agentlightning.Trainer]**, which coordinates both training and debugging. The command-line interface in [`examples/spider/train_sql_agent.py`]({{ src("examples/spider/train_sql_agent.py") }}) provides a complete runnable example. However, this document focuses on understanding the underlying architecture so you can effectively adapt the workflow to your own agents. ## SQL Agent Architecture Agent-lightning integrates seamlessly with various orchestration frameworks, including [Agent Framework](https://github.com/microsoft/agent-framework), [AutoGen](https://github.com/microsoft/autogen), [CrewAI](https://www.crewai.com/), [LangGraph](https://github.com/langchain-ai/langgraph), and the [OpenAI Agents SDK](https://github.com/openai/openai-agents-python). It can also interoperate with custom Python logic. In this example, **LangGraph** defines a cyclic workflow that mirrors an analyst’s iterative SQL development process. The following graph (rendered directly from [`sql_agent.py`]({{ src("examples/spider/sql_agent.py") }})) illustrates how the agent drafts, executes, critiques, and refines queries until a satisfactory result is achieved. ```mermaid --- config: flowchart: curve: linear --- graph LR; __start__([

__start__

]):::first write_query(write_query) execute_query(execute_query) check_query(check_query) rewrite_query(rewrite_query) __end__([

__end__

]):::last __start__ --> write_query; check_query -.-> __end__; check_query -.-> rewrite_query; execute_query --> check_query; rewrite_query --> execute_query; write_query --> execute_query; classDef default fill:#f2f2f2,line-height:1.2 classDef first fill-opacity:0 classDef last fill:#cccccc ``` !!! note The workflow proceeds through the following stages: 1. **write_query** – Generates an initial SQL query from the user’s question and the database schema. 2. **execute_query** – Executes the generated query against the target database. 3. **check_query** – Evaluates the query and its results (or errors) using a specialized prompt (`CHECK_QUERY_PROMPT`) to detect issues. 4. **rewrite_query** – If issues are identified, the agent rewrites the query using feedback from the previous step and re-enters the loop. 5. **END** – The cycle terminates when the query is validated or the maximum iteration count (`max_turns`) is reached. Each *turn* consists of one full loop through the `write_query`, `execute_query`, `check_query`, and (if applicable) `rewrite_query` stages. In this tutorial, **reinforcement learning (RL)** is used to optimize the `write_query` and `rewrite_query` stages. While the `check_query` step shares the same underlying LLM weights, its trace data is not used for learning. To keep the design modular and maintainable, it is recommended to define the LangGraph-based SQL Agent in a separate file and expose it via a builder function such as: ```python def build_langgraph_sql_agent( database_path: str, openai_base_url: str, model: str, sampling_parameters: Dict[str, Any], max_turns: int, truncate_length: int ): builder = StateGraph(State) builder.add_node(write_query) ... builder.add_edge(START, "write_query") ... return builder.compile().graph() ``` This approach isolates your LangGraph logic from Agent-lightning version changes, improving both readability and debuggability. ## Bridging LangGraph and Agent-lightning !!! tip Keep [`sql_agent.py`]({{ src("examples/spider/sql_agent.py") }}) open on the side while reading this section. This will help you understand how the code snippets shown here work in practice. The **`LitSQLAgent`** class defined in [`sql_agent.py`]({{ src("examples/spider/sql_agent.py") }}) acts as the bridge. It subclasses [`agl.LitAgent`][agentlightning.LitAgent], allowing the runner to provision shared resources (e.g., [LLMs][agentlightning.LLM]) for each rollout. Below is a simplified illustration of the key logic (note: this is conceptual pseudocode; the actual implementation includes dataset-specific details): ```python class LitSQLAgent(agl.LitAgent[Dict[str, Any]]): def __init__(self, max_turns: int, truncate_length: int): # Every turn here refers to a full cycle of write/exe/check/rewrite self.max_turns = max_turns self.truncate_length = truncate_length def rollout( self, task: Dict[str, Any], resources: agl.NamedResources, rollout: agl.Rollout ) -> float | None: llm: agl.LLM = resources["main_llm"] agent = build_langgraph_sql_agent( database_path="sqlite:///" + task["db_id"], max_turns=self.max_turns, truncate_length=self.truncate_length, openai_base_url=llm.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id), model=llm.model, sampling_parameters=llm.sampling_parameters, ) result = agent.invoke({"question": question}, { "callbacks": [self.tracer.get_langchain_handler()], "recursion_limit": 100, }) reward = evaluate_query(result["query"], ground_truth, db_path, raise_on_error=False) return reward ``` The `LitSQLAgent` serves as a lightweight wrapper around the LangGraph agent, providing the correct interface for the [`rollout`][agentlightning.LitAgent.rollout] method. It constructs the LangGraph agent, invokes it, and returns the evaluation result as a reward signal. The `"main_llm"` resource key is a convention between the agent and [VERL][agentlightning.algorithm.verl.VERL]. It is used to inject an OpenAI-compatible endpoint from the [VERL][agentlightning.algorithm.verl.VERL] algorithm during rollout. Two approaches are supported to use this [agentlightning.LLM][] resource: 1. **Direct access** – Use [`llm.endpoint`][agentlightning.LLM.endpoint] for a simple integration (identical to the v0.1 example). 2. **Context-aware access** – Use [`get_base_url`][agentlightning.ProxyLLM.get_base_url] with [`rollout.rollout_id`][agentlightning.Rollout.rollout_id] and [`rollout.attempt.attempt_id`][agentlightning.Attempt.attempt_id]. This approach enables per-caller trace attribution, improving trace collection per rollout or attempt when runner-side tracers are unavailable. For details, see [Working with Traces](../tutorials/traces.md). ## Reward Signal and Evaluation The `evaluate_query` function provides the reward mechanism for RL training. In agent training, obtaining a consistent and meaningful reward signal is often challenging. Fortunately, this is simplified when using the [**Spider dataset**](https://yale-lily.github.io/spider). The dataset includes ~8k samples containing natural-language questions, database schemas, and ground-truth SQL queries. Using the [**Spider evaluator**](https://github.com/taoyds/test-suite-sql-eval), the agent's generated query is executed and compared to the ground-truth query on the target database. The two queries are considered equivalent if they produce identical execution results. !!! attention The ground-truth queries must **never** be exposed to the agent during training to prevent data leakage. In this setup, the reward is returned directly from the [`rollout`][agentlightning.LitAgent.rollout] method, enabling the runner to forward it back to the RL algorithm. !!! warning Avoid using [`emit_reward`][agentlightning.emit_reward] in conjunction with returning a reward value. Doing both will cause the algorithm to receive duplicate reward signals, leading to inconsistent training behavior. ## Configuring VERL for Reinforcement Learning View [`examples/spider/train_sql_agent.py`]({{ src("examples/spider/train_sql_agent.py") }}) for a full reinforcement learning configuration, which is a plain Python dictionary. It mirrors (and actually *is*) the [shell arguments](https://verl.readthedocs.io/en/latest/index.html) used to launch training in the VERL framework but is easier to tweak programmatically: ```python verl_config: Dict[str, Any] = { "algorithm": {"adv_estimator": "grpo", "use_kl_in_reward": False}, "data": { # train_files and val_files are no longer needed here # because data are read in agl.Trainer ..., # Controls how many tasks are pooled per step # (multiplied by actor_rollout_ref.rollout.n) "train_batch_size": 32, # Prompt and responses larger than these lengths are truncated "max_prompt_length": 4096, "max_response_length": 2048, }, "actor_rollout_ref": { "rollout": { # Only vLLM is supported currently "name": "vllm", # Equals to group size of GRPO "n": 4, # Used to enable tool call parser in vLLM "multi_turn": {"format": "hermes"}, ... }, "actor": {"ppo_mini_batch_size": 32, "optim": {"lr": 1e-6}, ...}, "model": { # Config your preferred LLM here "path": "Qwen/Qwen2.5-Coder-1.5B-Instruct", ... }, }, "trainer": { "n_gpus_per_node": 1, # Validation once before training starts "val_before_train": True, # Validation every N training steps "test_freq": 32, # Save checkpoints every N training steps "save_freq": 64, # Go through the train dataset this many times "total_epochs": 2 }, } ``` This is equivalent to the following CLI invocation: ```bash python3 -m verl.trainer.main_ppo \ algorithm.adv_estimator=grpo \ algorithm.use_kl_in_reward=False \ data.train_batch_size=32 \ data.max_prompt_length=4096 \ data.max_response_length=2048 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.n=4 \ actor_rollout_ref.rollout.multi_turn.format=hermes \ actor_rollout_ref.actor.ppo_mini_batch_size=32 \ actor_rollout_ref.actor.optim.lr=1e-6 \ actor_rollout_ref.model.path=Qwen/Qwen2.5-Coder-1.5B-Instruct \ trainer.n_gpus_per_node=1 \ trainer.val_before_train=True \ trainer.test_freq=32 \ trainer.save_freq=64 \ trainer.total_epochs=2 ``` !!! warning We used to provide a CLI called `python -m agentlightning.verl` to launch training in v0.1. This is no longer the recommended approach. Instead, use [`agl.Trainer`][agentlightning.Trainer] to run VERL and agent runners together, or follow the [debugging tutorial](../tutorials/debug.md) if you want an isolated experience similar to v0.1. ## Orchestrating Training with [`Trainer`][agentlightning.Trainer] [`Trainer`][agentlightning.Trainer] is the high-level orchestrator that integrates the agent, algorithm, dataset, and distributed runners. The key benefits of using the [`Trainer`][agentlightning.Trainer] are: 1. It allows you to launch everything with a single line of code: `trainer.fit(...)`. 2. It exposes configuration options such as `n_runners` to control parallelism and `adapter` to define how algorithms interpret the trace data produced by the agent. An example usage is shown below: ```python import agentlightning as agl agent = LitSQLAgent() algorithm = agl.VERL(verl_config) trainer = agl.Trainer( n_runners=10, algorithm=algorithm, adapter={"agent_match": active_agent}, ) train_data = pd.read_parquet("data/train_spider.parquet").to_dict("records") val_data = pd.read_parquet("data/test_dev_500.parquet").to_dict("records") trainer.fit(agent, train_dataset=train_data, val_dataset=val_data) ``` First, `agl.VERL(verl_config)` launches the [`VERL`][agentlightning.algorithm.verl.VERL] algorithm and its OpenAI-compatible proxy. The `train_data` and `val_data` are passed into [`VERL`][agentlightning.algorithm.verl.VERL], which enqueues tasks to a centralized task queue managed by the [`LightningStore`][agentlightning.LightningStore], accessible to all runners. When [`Trainer.fit`][agentlightning.Trainer.fit] is called, it launches 10 concurrent runners (as specified by `n_runners=10`). Each runner pulls tasks from the centralized task queue, executes the agent’s [`rollout`][agentlightning.LitAgent.rollout] method, collects traces, and returns rewards to VERL for training. The [`Adapter`][agentlightning.Adapter], as discussed earlier, is used at the algorithm side, and receives the traces emitted by the agent and runners. The `agent_match` parameter ensures [`VERL`][agentlightning.algorithm.verl.VERL] only ingests spans from the specific agent you want to optimize. In the example above, there are at least three agents—`write_query`, `rewrite_query`, and `check_query`. By setting `agent_match` to a regex like `"write"`, both `write_query` and `rewrite_query` agents are optimized simultaneously. You can also set it to `"write|check"` or `None` to include all agents if desired. ## Dry-Run the Pipeline with [`Trainer.dev`][agentlightning.Trainer.dev] Before committing hours of GPU time, you can **dry-run** the agent with [`Trainer.dev()`][agentlightning.Trainer.dev]. This method swaps in the lightweight [`Baseline`][agentlightning.Baseline] algorithm, enqueues up to ten tasks, and prints every span emitted by the agent. Because it uses the same runner stack as full training, it’s ideal for verifying database connections and LangGraph control flow. To begin, the agent needs a valid OpenAI-compatible endpoint since VERL is not active in this mode. You can use OpenAI’s official API or your own local LLM endpoint. Wrap it as follows: ```python trainer = agl.Trainer( n_workers=1, initial_resources={ "main_llm": agl.LLM( endpoint=os.environ["OPENAI_API_BASE"], model="gpt-4.1-nano", sampling_parameters={"temperature": 0.7}, ) }, ) ``` Then, call [`trainer.dev(...)`][agentlightning.Trainer.dev] with a small number of tasks: ```python dev_data = pd.read_parquet("data/test_dev_500.parquet").to_dict("records")[:10] trainer.dev(agent, dev_dataset=dev_data) ``` Run this in a Python session or adapt your script to include a `--dev` flag. Once the spans appear healthy and the rewards are non-zero, switch back to [`trainer.fit(...)`][agentlightning.Trainer.fit] for full RL training. See the [debugging tutorial](../tutorials/debug.md) for more tips on how to debug the agent. ## Running the Sample Code The following tutorial explains how to run the complete example in [`examples/spider`]({{ src("examples/spider") }}). ### Dataset The trainer expects three Parquet files inside `examples/spider/data`: `train_spider.parquet`, `test_dev_500.parquet`, and `test_dev.parquet`. Download the curated dataset bundle provided with the repository: ```bash cd examples/spider pip install gdown # included in the 'experiment' optional dependency gdown --fuzzy https://drive.google.com/file/d/1oi9J1jZP9TyM35L85CL3qeGWl2jqlnL6/view unzip -q spider-data.zip -d data rm spider-data.zip ``` If you prefer to generate the files yourself, download [Spider 1.0](https://yale-lily.github.io/spider) and run: ```bash python spider_eval/convert_dataset.py ``` Set `VERL_SPIDER_DATA_DIR` if you store the dataset outside the default `data` directory. ### Dependencies Create a clean virtual environment, activate it, and install Agent-lightning with the VERL extras required by [this tutorial](../tutorials/installation.md). Install LangChain-related dependencies as needed. For full training profiles, plan to use a GPU with at least **40 GB** of memory. ### Launch Training From [`examples/spider`]({{ src("examples/spider") }}), run one of the helper scripts depending on your model preference: ```bash python train_sql_agent.py qwen # Default Qwen-2.5-Coder-1.5B run python train_sql_agent.py llama # LLaMA-3.2-1B with llama3_json tool parser ``` The script instantiates `LitSQLAgent` and launches [`trainer.fit`][agentlightning.Trainer.fit]. Provide `--active-agent my_agent_variant` if you only want to train one of the agents in the graph. For the LLaMA profile, export an `HF_TOKEN` before running so VERL can download the model weights. !!! tip "Troubleshooting" If you have got some Ray worker errors on either `WANDB_API_KEY` not set, or `HF_TOKEN` not set, or data not found, please try to restart the Ray cluster with the helper script: [scripts/restart_ray.sh]({{ src("scripts/restart_ray.sh") }}), which essentially stops the ray cluster if any, and starts a new one: ```bash env RAY_DEBUG=legacy HYDRA_FULL_ERROR=1 VLLM_USE_V1=1 ray start --head --dashboard-host=0.0.0.0 ``` !!! note "Launching Training with NPUs" The example also supports running with **Huawei Ascend NPUs**. This feature is contributed by [Teams from Huawei](https://github.com/microsoft/agent-lightning/pull/272). To use it, resort to the function `config_train_npu` in the script. **Hardware Supported:** Atlas 200T A2 Box16, Atlas 900 A2 PODc, Atlas 800T A3. At least **a single 40GB NPU** is required to run the **Qwen2.5-Coder-1.5B-Instruct** model. **Environment Setup:** Python 3.11.13, CANN 8.2.RC1, torch 2.7.1+cpu, torch_npu 2.7.1.dev20250724. For basic environment preparation, please refer to this [document](https://gitcode.com/Ascend/pytorch). Before installing dependencies, configure the following pip mirrors: ```bash pip config set global.index-url http://repo.huaweicloud.com/repository/pypi/simple pip config set global.extra-index-url "https://download.pytorch.org/whl/cpu/ https://mirrors.huaweicloud.com/ascend/repos/pypi" ``` Then install vLLM, vLLM-Ascend and VERL: ```bash pip install vllm==0.10.0 --trusted-host repo.huaweicloud.com pip install vllm-Ascend==0.10.0rc1 --trusted-host repo.huaweicloud.com pip install verl==0.5.0 ``` To ensure the VERL framework runs correctly on NPU, add the following lines to `verl/utils/vllm_utils.py`: ```python from vllm_ascend.patch import platform from vllm_ascend.patch import worker ``` See the following reference for more details: [https://github.com/vllm-project/vllm-ascend/issues/1776](https://github.com/vllm-project/vllm-ascend/issues/1776). After the above dependencies have been installed, from [`examples/spider`]({{ src("examples/spider") }}) run the following script command: ```bash python train_sql_agent.py npu ``` ### Debugging the Agent without VERL [`sql_agent.py`]({{ src("examples/spider/sql_agent.py") }}) also provides a `debug_sql_agent()` helper to run the LangGraph workflow directly against a local or hosted OpenAI-compatible endpoint before using VERL. Set the following environment variables, then execute the file: ```bash export OPENAI_API_BASE= export OPENAI_API_KEY= cd examples/spider python sql_agent.py ``` This allows you to verify that the workflow and prompts behave as expected before reinforcement learning is introduced. ### Evaluation The following results were obtained by running `python train_sql_agent.py qwen` on a single 80 GB GPU. Training completes in approximately **12 hours**. The training curves below are smoothed by aggregating every 16 steps for better visualization. Additional evaluation results were collected with a legacy version — Agent-lightning v0.1.1, `verl==0.5.0`, and `vllm==0.10.0`. You can find them in this write-up: [Training AI Agents to Write and Self-Correct SQL with Reinforcement Learning](https://medium.com/@yugez/training-ai-agents-to-write-and-self-correct-sql-with-reinforcement-learning-571ed31281ad)
================================================ FILE: docs/how-to/unsloth-sft.md ================================================ # Fine-tune with Unsloth SFT !!! note "Prerequisites" Please make sure you have read [Write the First Algorithm](./write-first-algorithm.md). Although that recipe is based on a simple prompt tuning algorithm, it introduces the core concepts of Agent-lightning and you should be familiar with them before proceeding. This recipe builds on [Write the First Algorithm](./write-first-algorithm.md). Instead of iterating on a prompt, we will fine-tune a large language model with [Unsloth](https://docs.unsloth.ai/)'s SFT Trainer and keep the whole loop inside Agent-lightning. The new pieces you will meet are the **LLM proxy**, the **trace-to-triplet adapter**, a [vLLM](https://github.com/vllm-project/vllm) inference endpoint, and an agent implemented with the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/). The full sample code is available in the [`examples/unsloth`]({{ src("examples/unsloth") }}) folder. !!! warning You need a GPU that can host the Unsloth base model and run vLLM. The sample defaults to `unsloth/Qwen3-4B-Instruct-2507`, which requires at least 16GB of GPU memory under 4-bit quantization. ## The Data and Serving Loop To tune a large language model in Supervised Fine-Tuning (SFT), we commonly need a dataset with input/output samples. For example, the [TRL SFT Trainer](https://huggingface.co/docs/trl/sft_trainer) expects a dataset with samples like the following: ```json {"messages": [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is blue."}]} ``` With supervised fine-tuning, the LLM learns to generate the "assistant" response as close as possible to the completion in the dataset. Typically, the dataset used in SFT should be a curated set of samples. The samples can be either hand-written by humans, or generated by a more powerful model, which is known as [data distillation](https://docs.nvidia.com/nemo-framework/user-guide/24.12/modelalignment/knowledge-distillation.html). However, in this recipe, we use a different setup that relies on samples generated by the model itself. We use the reward emitted by the agent to select the top-performing samples. Overall, the flow of the algorithm is an iteration of the following steps: 1. Serve the current checkpoint (with vLLM). 2. Publish the vLLM endpoint through the LLM proxy and let runners roll out some tasks with the current model. 3. Collect the traces from the rollouts and transform the highest-rewarded ones into a dataset that is acceptable for Unsloth SFT Trainer. 4. Launch Unsloth to fine-tune on the dataset and save a new checkpoint. You will find the full source code of this iteration in `sft_one_iter` in [sft_algorithm.py]({{ src("examples/unsloth/sft_algorithm.py") }}). We will elaborate on each part below. ### Serving the Model with vLLM and Proxy Most modern agents do not use the model directly; instead, they use an API like the OpenAI chat completions API to interact with the model. Therefore, we need a vLLM-based inference server launched before rollouts. The serving code looks like the following. See the `vllm_server` function in [sft_algorithm.py]({{ src("examples/unsloth/sft_algorithm.py") }}) if you want to see a more robust version. ```python from openai import OpenAI vllm_process = subprocess.Popen([ "vllm", "serve", model_path, "--port", str(port), "--enable-auto-tool-choice", "--tool-call-parser", "hermes" ]) # Wait for the server to be ready url = f"http://localhost:{port}/health" start = time.time() client = httpx.Client() while True: if client.get(url).status_code == 200: break server_address = f"http://localhost:{port}/v1" # Try using the vLLM server openai = OpenAI(base_url=server_address) ... ``` In this recipe, we do not expose the server address directly to the agent runners, because we want to install a "middleware" to collect the prompts and responses of all the requests. In general, it's up to you to decide whether to hide the vLLM server behind a proxy or not. The "middleware" here is [`LLMProxy`][agentlightning.LLMProxy], which is an independent [LiteLLM](https://docs.litellm.ai/) server that forwards the requests to the vLLM server. It also exposes an OpenAI-compatible API that the runners can target without caring about where the model lives. The benefits of using the proxy are: 1. **Traces:** The proxy automatically logs the prompts and responses of all the requests into the store. 2. **Token IDs:** The proxy augments the requests so that the vLLM server can return the prompt and response token IDs (see more details in [Serving LLM](../deep-dive/serving-llm.md)). The [`LLMProxy`][agentlightning.LLMProxy] accepts a list of model configurations, in the same syntax as LiteLLM's [`model_list`](https://docs.litellm.ai/docs/proxy/configs). Include a `hosted_vllm/` prefix to the models to activate LiteLLM's [vLLM integration](https://docs.litellm.ai/docs/providers/vllm). ```python import agentlightning as agl llm_proxy = agl.LLMProxy(port=port, store=store) model_list = [ { "model_name": "Qwen3-4B-Instruct", "litellm_params": {"model": f"hosted_vllm/{model_path}", "api_base": server_address}, } ] llm_proxy.update_model_list(model_list) # If the proxy is not running, it will start automatically. await llm_proxy.restart() # Add the proxy as a resource to the store so that the runners can access it via URL. resource_update = await store.add_resources({"main_llm": llm_proxy.as_resource()}) ``` ### Spawn Rollout and Collect Spans Once the proxy is registered as a resource, the algorithm schedules work for the rollout runners. Each problem from a training dataset becomes a rollout with the proxy baked into its resources: ```python rollouts: list[Rollout] = [] for sample in train_dataset: rollouts.append( await store.enqueue_rollout( input=sample, mode="train", resources_id=resources_update.resources_id, ) ) ``` `resources_id` ties every rollout to the `main_llm` proxy resource we just uploaded. The runners on the other side poll the store ([`LitAgentRunner.iter()`][agentlightning.LitAgentRunner.iter]) and execute the agent for each rollout. On the algorithm side we wait for completions with a non-blocking polling loop: ```python completed_rollouts: list[Rollout] = [] while True: completed_rollouts = await store.wait_for_rollouts( rollout_ids=[r.rollout_id for r in rollouts], timeout=0.0, ) if len(completed_rollouts) == len(rollouts): break await asyncio.sleep(5.0) ``` !!! note The `timeout=0.0` is needed here because this example uses a [`LightningStoreClient`][agentlightning.LightningStoreClient], and `wait_for_rollouts` establishes an HTTP connection to that store. Currently, only non-blocking wait requests are supported, which avoids holding the store connection open. Once the rollouts complete, we terminate the vLLM server to free up GPU memory. ```python vllm_process.terminate() vllm_process.join(timeout=10.0) ``` ### Adapt the Spans to HuggingFace Dataset [`LlmProxyTraceToTriplet`][agentlightning.LlmProxyTraceToTriplet] converts the proxy’s spans (which might be dozens to hundreds per rollout) into [`Triplet`][agentlightning.Triplet] objects that contain prompt/response token IDs plus an optional reward. The adapter may return multiple triplets per rollout (one per chat-completion call). To bias training toward successful reasoning chains the algorithm walks the triplets in reverse order, keeps the most recent reward, and turns each prompt/response pair into Hugging Face dataset rows: ```python all_triplets = [] data_adapter = agl.LlmProxyTraceToTriplet() for rollout in completed_rollouts: spans = await store.query_spans(rollout.rollout_id, "latest") triplets = data_adapter.adapt(spans) recent_reward = None for triplet in reversed(triplets): if triplet.reward is not None: recent_reward = triplet.reward if recent_reward is None: continue input_ids = triplet.prompt["token_ids"] + triplet.response["token_ids"] # We don't train on prompt tokens, so they are masked out by setting to -100. labels = [-100] * len(triplet.prompt["token_ids"]) + triplet.response["token_ids"] # This matches the dataset format required by the Unsloth SFT trainer. all_triplets.append( { "input_ids": input_ids, "attention_mask": [1] * len(input_ids), "labels": labels, "reward": recent_reward, } ) ``` !!! note You might notice that the dataset format used here differs from the format described in the **SFT Trainer** documentation. According to the documentation, dataset samples should be provided as plain text strings or message objects. As a matter of fact, this example leverages some [undocumented behavior](https://github.com/huggingface/trl/blob/e0eec055b412c48ad754149c475a87a8fca34fb4/trl/trainer/sft_trainer.py#L887) in the SFT Trainer implementation. When the dataset already includes a `"input_ids"` column, the Trainer automatically marks it as `is_processed` and skips the internal tokenization step. Since we already have spans with token IDs generated by the [`LLMProxy`][agentlightning.LLMProxy], providing them directly avoids unnecessary [**re-tokenization** and related complications](../deep-dive/serving-llm.md). This approach will both save processing time and increase consistency between training and inference. After aggregating every rollout we shuffle, sort by reward, and keep the top fraction (e.g., 50%) before shuffling again. The resulting list feeds directly into `datasets.Dataset.from_list`, which is the format Unsloth’s SFT trainer expects. ```python from datasets import Dataset as HuggingFaceDataset random.shuffle(all_triplets) all_triplets.sort(key=lambda x: x["reward"], reverse=True) sliced_triplets = all_triplets[: max(1, int(len(all_triplets) * triplet_fraction))] # Shuffle the sliced triplets again random.shuffle(sliced_triplets) sft_dataset = HuggingFaceDataset.from_list(sliced_triplets) ``` ### Launch Unsloth Training The heavy lifting happens in [`trl.SFTTrainer`](https://huggingface.co/docs/trl/sft_trainer) (see [unsloth_helper.py]({{ src("examples/unsloth/unsloth_helper.py") }}) on how it's used). We launch it in a fresh process created with `multiprocessing.get_context("spawn")` so CUDA memory is reliably reclaimed when training ends. Launching it in the same process will also work for the first iteration, but we found that the memory won't be freed properly for subsequent vLLM serving. ```python context = multiprocessing.get_context("spawn") unsloth_process = context.Process( target=unsloth_training, args=(model_path, sft_dataset, next_model_path), daemon=True, ) unsloth_process.start() unsloth_process.join(timeout=600.0) ``` Inside the `unsloth_training` subprocess, Unsloth loads the previous checkpoint in 4-bit, applies LoRA adapters, and forwards the Hugging Face dataset to [`trl.SFTTrainer`](https://huggingface.co/docs/trl/sft_trainer) with the configuration defined in [`SFTConfig`](https://huggingface.co/docs/trl/sft_trainer#trl.SFTConfig) (batch size, accumulation steps, learning rate, etc.). The merged 16-bit weights are saved under `models/version_` so the next iteration can immediately serve them with vLLM. ```python from unsloth import FastLanguageModel # TRL is patched by unsloth. from trl import SFTConfig, SFTTrainer model, tokenizer = FastLanguageModel.from_pretrained( model_name=model_path, load_in_4bit=True, # 4 bit quantization to reduce memory ) # Config the model to use LoRA model = FastLanguageModel.get_peft_model( model, r=32, ... ) trainer = SFTTrainer( model=model, tokenizer=tokenizer, train_dataset=sft_dataset, ... ) # This is the heaviest step. trainer_stats = trainer.train() # Save in 16-bit for vLLM inference later model.save_pretrained_merged(next_model_path, tokenizer, save_method="merged_16bit") ``` ## Math Agent: OpenAI Agents SDK with MCP We build an agent with the [OpenAI Agents SDK](https://openai.github.io/openai-agents-python/) to wire a calculator MCP tool and an OpenAI-compatible chat completion model together. The agent aims to solve a math problem and returns a reward indicating whether the answer is correct or not. The runner injects the `LLM` resource supplied by the algorithm side: ```python import os from typing import TypedDict import agentlightning as agl from agents import Agent, ModelSettings, OpenAIChatCompletionsModel, Runner as OpenAIRunner from agents.mcp import MCPServerStdio from openai import AsyncOpenAI class GsmProblem(TypedDict): input: str target: float def compute_reward(result: str, target: float) -> float: ... @agl.rollout async def math_agent(task: GsmProblem, llm: agl.LLM) -> float: async with MCPServerStdio( name="Calculator via uvx", params={"command": "uvx", "args": ["mcp-server-calculator"]}, ) as server: agent = Agent( name="Assistant", instructions=( "Use the calculator tool for every question. " "Return only the numeric answer wrapped like ### ###." ), mcp_servers=[server], model=OpenAIChatCompletionsModel( model=llm.model, openai_client=AsyncOpenAI( base_url=llm.endpoint, api_key=llm.api_key or "dummy", ), ), model_settings=ModelSettings( temperature=llm.sampling_parameters.get("temperature", 0.0), ), ) result = await OpenAIRunner.run(agent, task["input"]) return compute_reward(result.final_output, task["target"]) ``` !!! tip You can test the agent with a dry run: ```python import asyncio llm = agl.LLM( endpoint=os.environ["OPENAI_BASE_URL"], api_key=os.environ["OPENAI_API_KEY"], model="gpt-4.1-mini", ) asyncio.run(math_agent({"input": "What is 1 + 1?", "target": 2.0}, llm)) ``` ## Run this Recipe The full runnable script for this recipe resides in [`examples/unsloth`]({{ src("examples/unsloth") }}) folder. Before running this example, install `unsloth`, `vllm`, and the other libraries used in the examples (the project uses CUDA tooling, TRL, rich, datasets, etc.). We tested with `unsloth==2025.10.1`. `unsloth==2025.10.2` and `2025.10.3` are not working because of an [issue](https://github.com/unslothai/unsloth/issues/3451) we have been investigating with the unsloth team. It's recommended to download the base model before running the example, such that the first iteration and subsequent iterations can both load from local checkpoints. ```bash hf download unsloth/Qwen3-4B-Instruct-2507 --local-dir models/version_0 ``` The repository already contains `examples/unsloth/data_gsmhard.jsonl` (which is a very small subset of the [GSM-hard math dataset](https://huggingface.co/datasets/reasoning-machines/gsm-hard) for demonstration purposes). ### Run Manually Similar to the [Write the First Algorithm](./write-first-algorithm.md) recipe, you can open three terminals and start each component in parallel. ```bash agl store --port 4747 python examples/unsloth/sft_rollout_runners.py python examples/unsloth/sft_algorithm.py ``` In this case, [`sft_rollout_runners.py`]({{ src("examples/unsloth/sft_rollout_runners.py") }}) is a simple spawner implemented in Python that spawns 4 runners in parallel. The runners all connect to the same store server executing in another terminal. ```python import agentlightning as agl def run_rollout(store: agl.LightningStore, worker_id: int) -> None: # Since the server side has already used LiteLLM proxy to collect traces, # a simple OtelTracer to collect the rewards is enough. tracer = agl.OtelTracer() runner = agl.LitAgentRunner(tracer=tracer) with runner.run_context(agent=math_agent, store=store, worker_id=worker_id): asyncio.run(runner.iter()) def spawn_runners(store: agl.LightningStore, n_runners: int) -> None: runners = [ multiprocessing.Process(target=run_rollout, args=(store, worker_id)) for worker_id in range(n_runners) ] for runner in runners: runner.start() for runner in runners: runner.join() store = agl.LightningStoreClient("http://localhost:4747") spawn_runners(store=store, n_runners=4) ``` !!! tip Try to swap [`OtelTracer`][agentlightning.OtelTracer] in the runners with other tracers like [`AgentOpsTracer`][agentlightning.AgentOpsTracer]. Try to use a different adapter at the algorithm side such as [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] to see what happens. ### Run Everything with Trainer We also show how to wrap everything into a single script using [`Trainer`][agentlightning.Trainer]. [`sft_allinone.py`]({{ src("examples/unsloth/sft_allinone.py") }}) wires the same components together, replacing the manual management of runners above. ```python class UnslothSupervisedFinetuning(agl.Algorithm): async def run( self, train_dataset: Optional[Dataset[GsmProblem]] = None, val_dataset: Optional[Dataset[GsmProblem]] = None, ): # Use the store, llm_proxy, and adapter from the trainer store = self.get_store() llm_proxy = self.get_llm_proxy() data_adapter = self.get_adapter() for iteration in range(self.max_iterations): ... # Same logic as sft_algorithm.py algo = UnslothSupervisedFinetuning( max_iterations=2, vllm_port=12316, train_triplet_fraction=0.5, initial_model_path="models/version_0", ) # The LLM proxy can be created before Trainer trainer = Trainer( n_runners=4, algorithm=algo, llm_proxy=LLMProxy(port=12358), ) trainer.fit(math_agent, load_math_dataset()) ``` You might wonder where the initialization of [`Adapter`][agentlightning.Adapter] happens in this code. It turns out that [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] is the default adapter in [`Trainer`][agentlightning.Trainer], so we don't need to create one manually. Now you can run the example with: ```bash python examples/unsloth/sft_allinone.py ``` It starts an [`InMemoryLighningStore`][agentlightning.InMemoryLightningStore] for you, launches four worker processes, iterates the SFT loop, and prints the final checkpoint path when done. Adjust `max_iterations`, `train_triplet_fraction`, `n_runners`, or the proxy port to match your hardware or training goals. If you already run an external store or proxy you can also pass those objects into [`Trainer`][agentlightning.Trainer] instead of relying on the [Trainer-managed defaults][debug-with-external-store]. !!! info As a future plan, we might graduate this example into a more powerful SFT algorithm bundled into [Algorithm Zoo](../algorithm-zoo/index.md). Currently, this `UnslothSupervisedFinetuning` is still for demo purposes. ================================================ FILE: docs/how-to/write-first-algorithm.md ================================================ # Write the First Algorithm with Agent-lightning In the [first tutorial](./train-first-agent.md), "Train the First Agent," we introduced the [Trainer][agentlightning.Trainer] and showed how to use a pre-built algorithm like **Automatic Prompt Optimization (APO)** to improve an agent's performance. The [Trainer][agentlightning.Trainer] handled all the complex interactions, letting us focus on the agent's logic. Now, we'll go a step deeper. What if you have a unique training idea that doesn't fit a standard algorithm? This tutorial will show you how to write your own custom algorithm from scratch. We'll build a simple algorithm that systematically tests a list of prompt templates and identifies the one with the highest reward. By the end, you'll understand the core mechanics of how the **Algorithm**, **Runner**, and a new component, the **Store**, work together to create the powerful training loop at the heart of Agent-lightning. !!! tip This tutorial helps you build a basic understanding of how to interact with Agent-lightning's core components. It's recommended that all users customizing algorithms should read this tutorial, even for those who are not planning to do prompt optimization. ## Core Concepts for Training Before diving into the [LightningStore][agentlightning.LightningStore], let's define two key concepts that are central to any training process in Agent-lightning: **Resources** and the **Tracer**. ### Resources: The Tunable Assets [](){ #introduction-to-resources } **Resources** are the assets your algorithm is trying to improve. Think of them as the "recipe" an agent uses to perform its task. This recipe can be: * A **prompt template** that guides an LLM. * The **weights** of a machine learning model. * Any other configuration or data your agent needs. The algorithm's job is to run experiments and iteratively update these resources to find the best-performing version. ### Tracer: The Data Collector How does the algorithm know if a change was an improvement? It needs data. This is where the **Tracer** comes in. The Tracer automatically **instruments** (aka modifies / patches) the agent's code. This means it watches for important events, like an LLM call, a tool being used, or **reward signals**, and records a detailed log of what happened. Each of these logs is called a **Span** (which has already been introduced in the [last tutorial](./train-first-agent.md)). A collection of spans from a single task execution gives the algorithm a complete, step-by-step trace of the agent's behavior, which is essential for learning and making improvements. Our default tracer is built on the AgentOps SDK to support instrumenting code written in various Agent/non-agent frameworks. ## The Central Hub: The LightningStore Now, where do all these resources, tasks, and spans live? They are all managed by the **LightningStore**. The LightningStore acts as the central database and message queue for the entire system. It's the single source of truth that decouples the Algorithm from the Runners. !!! note In the [last tutorial](./train-first-agent.md) we simplified the training loop, saying the Algorithm and Agent communicate "via the Trainer." That's true at a high level, but the component that makes it all possible is actually the **LightningStore**. * The **Algorithm** connects to the Store to `enqueue_rollout` (tasks) and `update_resources` (like new prompt templates). It also queries the Store to retrieve the resulting spans and rewards from completed rollouts. * The **Runners** connect to the Store to `dequeue_rollout` (polling for available tasks). After executing a task, they use the `Tracer` to write the resulting spans and status updates back to the Store. This architecture is key to Agent-lightning's scalability. Since the Algorithm and Runners only talk to the Store, they can run in different processes or even on different machines. ![Store Architecture](../assets/store-api-visualized.svg){ .center } !!! tip "A Mental Model of What the Store Contains" The [LightningStore][agentlightning.LightningStore] isn't just a simple database; it's an organized system for managing the entire training lifecycle. Here's what it keeps track of: * **Task Queue**: A queue of pending **Rollouts** waiting for a Runner to pick them up, interactable via `enqueue_rollout` and `dequeue_rollout`. * **Rollouts**: The record of a single task. A rollout contains metadata about the task and tracks all **Attempts** to complete it, interactable via `query_rollouts` and `wait_for_rollouts`. * **Attempts**: A single execution of a rollout. If an attempt fails (e.g., due to a network error), the Store can automatically schedules a retry if it's configured. Each attempt is linked to its parent rollout and contains the status and timing information. The rollout status is [synced](../deep-dive/store.md) with its children's status. **For beginners, you can assume each rollout has only one attempt unless you have explicitly configure the retry.** * **Spans**: The detailed, structured logs generated by the `Tracer` during an attempt. Each span is linked to its parent attempt and rollout. * **Resources**: A versioned collection of the assets (like prompt templates) that the algorithm creates. Each rollout is linked to the specific version of the resources it should use. ## Building a Custom Algorithm Let's build an algorithm that finds the best system prompt from a predefined list. The logic is straightforward: 1. Start with a list of candidate prompt templates. 2. For each template, create a "resource" bundle in the Store. 3. Enqueue a rollout (a task), telling the Runner to use this specific resource. 4. Wait for a Runner to pick up the task and complete it. 5. Query the Store to get the final reward from the rollout's spans. 6. After testing all templates, compare the rewards and declare the best one. We can implement this as a simple Python function that interacts directly with the [LightningStore][agentlightning.LightningStore]. ```python async def find_best_prompt(store, prompts_to_test, task_input): """A simple algorithm to find the best prompt from a list.""" results = [] # Iterate through each prompt to test it for prompt in prompts_to_test: print(f"[Algo] Updating prompt template to: '{prompt}'") # 1. Update the resources in the store with the new prompt resources_update = await store.add_resources( resources={"prompt_template": prompt} ) # 2. Enqueue a rollout task for a runner to execute print("[Algo] Queuing task for clients...") rollout = await store.enqueue_rollout( input=task_input, resources_id=resources_update.resources_id, ) print(f"[Algo] Task '{rollout.rollout_id}' is now available for clients.") # 3. Wait for the rollout to be completed by a runner await store.wait_for_rollouts([rollout.rollout_id]) # 4. Query the completed rollout and its spans completed_rollout = await store.get_rollout_by_id(rollout.rollout_id) print(f"[Algo] Received Result: {completed_rollout.model_dump_json(indent=None)}") spans = await store.query_spans(rollout.rollout_id) # We expect at least two spans: one for the LLM call and one for the final reward print(f"[Algo] Queried Spans:\n - " + "\n - ".join(str(span) for span in spans)) # find_final_reward is a helper function to extract the reward span final_reward = find_final_reward(spans) print(f"[Algo] Final reward: {final_reward}\n") results.append((prompt, final_reward)) # 5. Find and print the best prompt based on the collected rewards print(f"[Algo] All prompts and their rewards: {results}") best_prompt, best_reward = max(results, key=lambda item: item[1]) print(f"[Algo] Best prompt found: '{best_prompt}' with reward {best_reward}") ``` !!! note "Asynchronous Operations" You'll notice the `async` and `await` keywords. Agent-lightning is built on asyncio to handle concurrent operations efficiently. All interactions with the store are asynchronous network calls, so they must be awaited. ## The Agent and Runner Our algorithm needs an **agent** to execute the tasks and a **runner** to manage the process. The runner is a long-lived worker process. Its job is simple: 1. Connect to the [LightningStore][agentlightning.LightningStore] via a [LightningStoreClient][agentlightning.LightningStoreClient]. 2. Enter a loop, constantly asking the [LightningStore][agentlightning.LightningStore] for new tasks (`dequeue_rollout`). 3. When it gets a task, it runs the `simple_agent` function. 4. Crucially, the runner wraps the agent execution with a **Tracer**. The tracer automatically captures all the important events (like the LLM call and the final reward) as spans and sends them back to the [LightningStore][agentlightning.LightningStore]. ```python # Connecting to Store store = agl.LightningStoreClient("http://localhost:4747") # or some other address runner = LitAgentRunner[str](tracer=AgentOpsTracer()) with runner.run_context(agent=simple_agent, store=store): # <-- where the wrapping and instrumentation happens await runner.iter() # polling for new tasks forever ``` For this example, the agent's job is to take the prompt from the resources, use it to ask an LLM a question, and return a score. ```python def simple_agent(task: str, prompt_template: PromptTemplate) -> float: """An agent that answers a question and gets judged by an LLM.""" client = OpenAI() # Generate a response using the provided prompt template prompt = prompt_template.format(any_question=task) response = client.chat.completions.create( model="gpt-4.1-nano", messages=[{"role": "user", "content": prompt}] ) llm_output = response.choices[0].message.content print(f"[Rollout] LLM returned: {llm_output}") # This llm_output and the final score are automatically logged as spans by the Tracer score = random.uniform(0, 1) # Replace with actual scoring logic if needed return score ``` ## Running the Example To see everything in action, you'll need three separate terminal windows. !!! tip If you want to follow along, you can find the complete code for this example in the [apo_custom_algorithm.py]({{ src("examples/apo/apo_custom_algorithm.py") }}) file. **1. Start the Store:** In the first terminal, start the LightningStore server. This component will wait for connections from the algorithm and the runner. The store will be listening on port `4747` ⚡ by default. ```bash agl store ``` **2. Start the Runner:** In the second terminal, start the runner process. It will connect to the store and wait for tasks. The code to start the runner looks like the following: ```bash export OPENAI_API_KEY=sk-... # Your OpenAI API key python apo_custom_algorithm.py runner ``` You will see output indicating the runner has started and is waiting for rollouts. ```text 2025-10-14 22:23:41,339 [INFO] ... [Worker 0] Setting up tracer... 2025-10-14 22:23:41,343 [INFO] ... [Worker 0] Instrumentation applied. 2025-10-14 22:23:41,494 [INFO] ... [Worker 0] AgentOps client initialized. 2025-10-14 22:23:41,494 [INFO] ... [Worker 0] Started async rollouts (max: unlimited). ``` **3. Start the Algorithm:** In the third terminal, run the algorithm. This will kick off the entire process. For example, we run the algorithm code shown above with the following parameters: ```python prompts_to_test = [ "You are a helpful assistant. {any_question}", "You are a knowledgeable AI. {any_question}", "You are a friendly chatbot. {any_question}", ] task_input = "Why is the sky blue?" store = agl.LightningStoreClient("http://localhost:4747") find_best_prompt(store, prompts_to_test, task_input) ``` Or you can simply use our pre-written script to try out: ```bash python apo_custom_algorithm.py algo ``` ### Understanding the Output As the algorithm runs, you'll see logs appear across all three terminals, showing the components interacting in real-time. **Algorithm Output:** The algorithm terminal shows the main control flow: updating prompts, queuing tasks, and receiving the final results. You can also see the raw span data it retrieves from the store. ```text [Algo] Updating prompt template to: 'You are a helpful assistant. {any_question}' [Algo] Queuing task for clients... [Algo] Task 'ro-1d18988581cd' is now available for clients. [Algo] Received Result: rollout_id='ro-1d18988581cd' ... status='succeeded' ... [Algo] Queried Spans: - Span(name='openai.chat.completion', attributes={'gen_ai.prompt.0.content': 'You are a helpful assistant...', 'gen_ai.completion.0.content': 'The sky appears blue...'}) - Span(name='reward', attributes={'value': 0.95}) [Algo] Final reward: 0.95 [Algo] Updating prompt template to: 'You are a knowledgeable AI. {any_question}' ... [Algo] Final reward: 0.95 [Algo] Updating prompt template to: 'You are a friendly chatbot. {any_question}' ... [Algo] Final reward: 1.0 [Algo] All prompts and their rewards: [('You are a helpful assistant. {any_question}', 0.95), ('You are a knowledgeable AI. {any_question}', 0.95), ('You are a friendly chatbot. {any_question}', 1.0)] [Algo] Best prompt found: 'You are a friendly chatbot. {any_question}' with reward 1.0 ``` **Runner Output:** The runner terminal shows it picking up each task, executing the agent logic, and reporting the completion. ```text [Rollout] LLM returned: The sky appears blue due to Rayleigh scattering... 2025-10-14 22:25:50,803 [INFO] ... [Worker 0 | Rollout ro-a9f54ac19af5] Completed in 4.24s. ... [Rollout] LLM returned: The sky looks blue because of a process called Rayleigh scattering... 2025-10-14 22:25:59,863 [INFO] ... [Worker 0 | Rollout ro-c67eaa9016b6] Completed in 4.06s. ... ``` **Store Server Output:** The store terminal shows a detailed log of every interaction, confirming its role as the central hub. You can see requests to enqueue and dequeue rollouts, add spans, and update statuses. ```text ... "POST /enqueue_rollout HTTP/1.1" 200 ... ... "GET /dequeue_rollout HTTP/1.1" 200 ... ... "POST /add_span HTTP/1.1" 200 ... ... "POST /update_attempt HTTP/1.1" 200 ... ... "POST /wait_for_rollouts HTTP/1.1" 200 ... ... "GET /query_spans/ro-c67eaa9016b6 HTTP/1.1" 200 ... ``` !!! info "So Where is Trainer?" You might be wondering why the [last tutorial](./train-first-agent.md) focused on the [Trainer][agentlightning.Trainer] class, but we haven't used it here. Think of the [Trainer][agentlightning.Trainer] as a convenient wrapper that manages the entire training process for you. It's perfect when you want to apply a pre-built algorithm to your agent without worrying about the underlying mechanics. The [Trainer][agentlightning.Trainer] handles starting the [LightningStore][agentlightning.LightningStore], coordinating the [Runners][agentlightning.Runner], managing their lifecycles, and handling errors. In this tutorial, however, our goal is to *build a new algorithm*. To do that, we need to interact directly with the core components: the [Store][agentlightning.LightningStore], the [Runner][agentlightning.Runner], and the algorithm logic itself. Running them separately gives you more control and clearer, isolated logs, which is ideal for development and debugging. Once your custom algorithm is mature, you can package it to comply with our standard interface ([@algo][agentlightning.algo] or [Algorithm][agentlightning.Algorithm]). This allows you to use it with the [Trainer][agentlightning.Trainer] again, getting all the benefits of automated lifecycle management while using your own custom logic. A sample code doing this is available in [apo_custom_algorithm_trainer.py]({{ src("examples/apo/apo_custom_algorithm_trainer.py") }}). ================================================ FILE: docs/index.md ================================================ # Agent Lightning Agent Lightning is the absolute trainer to light up AI agents. [Join our Discord community](https://discord.gg/RYk7CdvDR7) to connect with other users and contributors. ## Features - Turn your agent into an optimizable beast with **ZERO CODE CHANGE** (almost)! 💤 - Build with **ANY** agent framework (LangChain, OpenAI Agent SDK, AutoGen, CrewAI, Microsoft Agent Framework...); or even WITHOUT agent framework (Python OpenAI). You name it! 🤖 - **Selectively** optimize one or more agents in a multi-agent system. 🎯 - Embraces **Algorithms** like Reinforcement Learning, Automatic Prompt Optimization, Supervised Fine-tuning and more. 🤗 ## How to Read this Documentation This documentation is organized into the following parts: - [Installation](tutorials/installation.md) - Get started with Agent Lightning - How-to Recipes (e.g., [Train SQL Agent with RL](how-to/train-sql-agent.md)) - Practical examples of training agents and customizing algorithms. - Learning More (e.g., [Debugging](tutorials/debug.md)) - Guides on specific topics like debugging or parallelization. - Algorithm Zoo (e.g., [APO](algorithm-zoo/apo.md)) - References for built-in algorithms. - Deep Dive (e.g., [Bird's Eye View](deep-dive/birds-eye-view.md)) - For a deeper understanding of what Agent-lightning is doing under the hood. - API References (e.g., [Agent](reference/agent.md)) - References for the Agent-lightning Python API. ## Resources - 11/4/2025 [Tuning ANY AI agent with Tinker ✕ Agent-lightning](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-1-1d8c9a397f0e) Medium. See also [Part 2](https://medium.com/@yugez/tuning-any-ai-agent-with-tinker-agent-lightning-part-2-332c5437f0dc). - 10/22/2025 [No More Retokenization Drift: Returning Token IDs via the OpenAI Compatible API Matters in Agent RL](https://blog.vllm.ai/2025/10/22/agent-lightning.html) vLLM blog. See also [Zhihu writeup](https://zhuanlan.zhihu.com/p/1965067274642785725). - 8/11/2025 [Training AI Agents to Write and Self-correct SQL with Reinforcement Learning](https://medium.com/@yugez/training-ai-agents-to-write-and-self-correct-sql-with-reinforcement-learning-571ed31281ad) Medium. - 8/5/2025 [Agent Lightning: Train ANY AI Agents with Reinforcement Learning](https://arxiv.org/abs/2508.03680) arXiv paper. - 7/26/2025 [We discovered an approach to train any AI agent with RL, with (almost) zero code changes.](https://www.reddit.com/r/LocalLLaMA/comments/1m9m670/we_discovered_an_approach_to_train_any_ai_agent/) Reddit. - 6/6/2025 [Agent Lightning - Microsoft Research](https://www.microsoft.com/en-us/research/project/agent-lightning/) Project page. ## Community Projects - [DeepWerewolf](https://github.com/af-74413592/DeepWerewolf) — A case study of agent RL training for the Chinese Werewolf game built with AgentScope and Agent Lightning. - [AgentFlow](https://agentflow.stanford.edu/) — A modular multi-agent framework that combines planner, executor, verifier, and generator agents with the Flow-GRPO algorithm to tackle long-horizon, sparse-reward tasks. - [Youtu-Agent](https://github.com/TencentCloudADP/Youtu-agent) — Youtu-Agent lets you build and train your agent with ease. Built with [a modified branch](https://github.com/microsoft/agent-lightning/tree/contrib/youtu-agent-lightning) of Agent Lightning, Youtu-Agent has verified up to 128 GPUs RL training on maths/code and search capabilities with steady convergence. Also check [the recipe](https://github.com/TencentCloudADP/youtu-agent/tree/rl/agl) and their blog [*Stop Wrestling with Your Agent RL: How Youtu-Agent Achieved Stable, 128-GPU Scaling Without Breaking a Sweat*](https://spotted-coconut-df8.notion.site/Stop-Wrestling-with-Your-Agent-RL-How-Youtu-Agent-Achieved-Stable-128-GPU-Scaling-Without-Breaking-2ca5e8f089ba80539a98c582b65e0233). ## Citation If you find Agent Lightning useful in your research or projects, please cite our paper: ```bibtex @misc{luo2025agentlightningtrainai, title={Agent Lightning: Train ANY AI Agents with Reinforcement Learning}, author={Xufang Luo and Yuge Zhang and Zhiyuan He and Zilong Wang and Siyun Zhao and Dongsheng Li and Luna K. Qiu and Yuqing Yang}, year={2025}, eprint={2508.03680}, archivePrefix={arXiv}, primaryClass={cs.AI}, url={https://arxiv.org/abs/2508.03680}, } ``` ## License See the [LICENSE](https://github.com/microsoft/agent-lightning/blob/main/LICENSE) file for details. ================================================ FILE: docs/javascripts/charts.js ================================================ // Copyright (c) Microsoft. All rights reserved. // ---- CSS helpers --------------------------------------------------------- function matVar(name) { return getComputedStyle(document.body).getPropertyValue(name).trim(); } function toRGBA(color, a = 1) { if (!color) return `rgba(0,0,0,${a})`; const m = color.match(/^#?([\da-f]{3}|[\da-f]{6})$/i); if (m) { const hex = m[1].length === 3 ? m[1].split("").map((x) => x + x).join("") : m[1]; const r = parseInt(hex.slice(0, 2), 16); const g = parseInt(hex.slice(2, 4), 16); const b = parseInt(hex.slice(4, 6), 16); return `rgba(${r}, ${g}, ${b}, ${a})`; } const nums = color.match(/[\d.]+/g) || [0, 0, 0, 1]; const [r, g, b] = nums.map(Number); return `rgba(${r | 0}, ${g | 0}, ${b | 0}, ${a})`; } // ---- Theme defaults (pulled from MkDocs Material CSS vars) --------------- function applyThemeDefaults() { const font = matVar("--md-text-font").replace(/['"]/g, "") || "Roboto, sans-serif"; const text = matVar("--md-default-fg-color") || "#1f2937"; const border = "rgba(128, 128, 128, 0.1)" const bg = "#777777"; Chart.defaults.font.family = font; Chart.defaults.font.size = 16; Chart.defaults.color = text; Chart.defaults.borderColor = border; Chart.defaults.backgroundColor = bg; Chart.defaults.scale.grid.color = border; Chart.defaults.scale.ticks.color = text; Chart.defaults.scale.title.color = text; Chart.defaults.plugins.legend.labels.color = text; Chart.defaults.plugins.tooltip.titleColor = text; Chart.defaults.plugins.tooltip.bodyColor = text; Chart.defaults.plugins.tooltip.backgroundColor = toRGBA(bg, 0.5); Chart.defaults.plugins.tooltip.borderColor = border; Chart.defaults.plugins.tooltip.borderWidth = 1; Chart.defaults.responsive = true; Chart.defaults.maintainAspectRatio = false; if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) { Chart.defaults.animation = false; } } // ---- Dataset color defaults (Material primary/accent) -------------------- const colorScheme = ["#c45259", "#5276c4", "#f69047", "#7cc452", "#c2b00a"]; function applyDatasetDefaults(config) { if (!config.data || !Array.isArray(config.data.datasets)) return; config.data.datasets = config.data.datasets.map((ds, index) => { const color = colorScheme[index % colorScheme.length]; return { ...ds, borderColor: toRGBA(color, 0.8), backgroundColor: toRGBA(color, 0.3), pointBackgroundColor: color, pointBorderColor: color, }; }); } // ---- Deep merge (config JSON + our defaults) ---------------------------- function deepMerge(target, src) { if (!src || typeof src !== "object") return target; for (const k of Object.keys(src)) { const v = src[k]; if (v && typeof v === "object" && !Array.isArray(v)) { target[k] = deepMerge(target[k] || {}, v); } else { target[k] = v; } } return target; } // ---- Build final config for a canvas ------------------------------------ function buildConfig(baseCfg) { const globalDefaults = { options: { responsive: true, maintainAspectRatio: false, interaction: { mode: "index", intersect: false }, plugins: { legend: { position: "top" }, tooltip: { enabled: true }, }, layout: { padding: { top: 8, right: 8, bottom: 0, left: 0 } }, normalized: true, alignToPixels: true, animations: { y: { from: (ctx) => 300, duration: 1500, easing: "easeOutCubic", }, radius: { from: 0, to: 3, duration: 300, delay: (ctx) => ctx.dataIndex * 30, }, }, elements: { line: { tension: 0.3 } }, }, }; const merged = deepMerge({}, globalDefaults); applyDatasetDefaults(baseCfg); deepMerge(merged, baseCfg); // user config wins return merged; } (function () { // registry stores per-canvas state: { chart, cfg } const registry = new WeakMap(); // canvas -> { chart, cfg } // IntersectionObserver to (re)animate when visible const io = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (!entry.isIntersecting) return; const canvas = entry.target; const state = registry.get(canvas); if (!state || !state.cfg) return; // Respect reduced-motion: if disabled, just update without animation const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches; // Destroy & rebuild to guarantee a fresh animation if (state.chart) { try { state.chart.destroy(); } catch (_) {} } const ctx = canvas.getContext("2d"); const cfg = buildConfig(JSON.parse(JSON.stringify(state.cfg))); // If reduced motion, skip animations if (prefersReduced) { cfg.options = cfg.options || {}; cfg.options.animation = false; } state.chart = new Chart(ctx, cfg); registry.set(canvas, state); }); }, { threshold: 0.3 } // animate when ~30% visible ); // ---- Render all canvases with data-chart JSON --------------------------- function renderAll() { document.querySelectorAll("canvas[data-chart]").forEach((canvas) => { let parsedCfg; try { parsedCfg = JSON.parse(canvas.getAttribute("data-chart")); } catch (e) { console.error("Invalid data-chart JSON:", e, canvas); return; } // store config; chart will be created by IntersectionObserver when visible if (!registry.get(canvas)) { registry.set(canvas, { chart: null, cfg: parsedCfg }); io.observe(canvas); } }); } // ---- Retheme on scheme/primary/accent change ---------------------------- function retheme() { applyThemeDefaults(); // Update visible charts without forcing animation document.querySelectorAll("canvas[data-chart]").forEach((c) => { const state = registry.get(c); if (state?.chart) { // Fix the issue that scale options color are not updated when theme changes const scaleOptions = state.chart.options.scales; for (const key of Object.keys(scaleOptions)) { scaleOptions[key].ticks.color = Chart?.defaults?.scale?.ticks?.color; scaleOptions[key].title.color = Chart?.defaults?.scale?.title?.color; } state.chart.update("none"); } }); } // Initial theme + render (works on hard refresh) function boot() { applyThemeDefaults(); renderAll(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", boot); } else { boot(); } // Observe theme flips. Attributes might be on or . const attrs = ["data-md-color-scheme", "data-md-color-primary", "data-md-color-accent"]; const obs = new MutationObserver(retheme); obs.observe(document.documentElement, { attributes: true, attributeFilter: attrs, subtree: true, }); // Re-scan on SPA navigations (Material) if (typeof document$ !== "undefined" && document$.subscribe) { document$.subscribe(() => { renderAll(); // new canvases retheme(); // keep colors in sync }); } })(); ================================================ FILE: docs/javascripts/katex.js ================================================ // Copyright (c) Microsoft. All rights reserved. document$.subscribe(({ body }) => { renderMathInElement(body, { delimiters: [ { left: "$$", right: "$$", display: true }, { left: "$", right: "$", display: false }, { left: "\\(", right: "\\)", display: false }, { left: "\\[", right: "\\]", display: true }, ], }); }); ================================================ FILE: docs/javascripts/move-source-file.js ================================================ // Copyright (c) Microsoft. All rights reserved. document.addEventListener('DOMContentLoaded', function () { const container = document.querySelector('.md-content__inner'); if (!container) return; const firstH1 = container.querySelector('h1'); const meta = container.querySelector('.md-source-file'); // the block rendered by source-file.html if (firstH1 && meta && meta.previousElementSibling !== firstH1) { firstH1.insertAdjacentElement('afterend', meta); } }); ================================================ FILE: docs/macros/source_links.py ================================================ # Copyright (c) Microsoft. All rights reserved. from __future__ import annotations import html import os from typing import Any, Dict def define_env(env: Any): """Expose {{ src('path/to/file.py') }} to link to a file in the repo. Behavior: - Builds URL from repo_url + extra.source_commit in mkdocs.yml - Verifies that the file exists at build time - If file missing: logs a WARNING and returns a visible marker. With `mkdocs build --strict`, warnings become errors → build fails. Examples: ``` [`apo_debug.py`]({{ src('examples/apo/apo_debug.py') }}) ``` or ``` {{ src('examples/apo/apo_debug.py') }} ``` """ cfg: Dict[str, Any] = env.conf or {} repo_url = cfg.get("repo_url", "").rstrip("/") extra: Dict[str, Any] = cfg.get("extra", {}) or {} default_commit = extra.get("source_commit", "main") project_dir = env.project_dir if not repo_url: raise RuntimeError("repo_url must be set in mkdocs.yml for src() macro to work.") logger = getattr(env, "logger", None) def _warn(msg: str): if logger and hasattr(logger, "warning"): logger.warning(f"[macros:src] {msg}") else: print(f"[macros:src] WARNING: {msg}") def src(path: str, text: str | None = None, commit: str | None = None) -> str: commit = commit or default_commit abs_root = os.path.abspath(project_dir) abs_path = os.path.abspath(os.path.join(project_dir, path)) # Prevent escaping project root if not abs_path.startswith(abs_root + os.sep) and abs_path != abs_root: raise ValueError(f"Invalid path outside project: {path}") # Build the GitHub tree URL (folder or file both work for our use case) url = f"{repo_url}/tree/{commit}/{path}" if not os.path.exists(abs_path): _warn(f"Source path not found: {path}. Rendering a visible broken-link marker.") label = html.escape(text or path) return ( f'' f"{label} (missing)" f"" ) if text: return f"[{text}]({url})" return url env.macro(src) ================================================ FILE: docs/overrides/main.html ================================================ {% extends "base.html" %} {% block content %} {{ super() }} {% endblock %} {% block scripts %} {{ super() }} {% endblock %} ================================================ FILE: docs/overrides/partials/content.html ================================================ {% include "partials/tags.html" %} {% include "partials/actions.html" %} {% if "\u003ch1" not in page.content %}

{{ page.title | d(config.site_name, true)}}

{% endif %} {% include "partials/source-file.html" %} {{ page.content }} {% include "partials/feedback.html" %} {% include "partials/comments.html" %} ================================================ FILE: docs/reference/agent.md ================================================ # Agent Developer APIs ## Agent Decorators !!! tip These are convenient helpers for creating agents from functions. First-time users are recommended to use these decorators to create agents. ::: agentlightning.rollout !!! warning The following two decorators are implementations of [`agentlightning.rollout`][agentlightning.rollout]. They are not recommended for new users. ::: agentlightning.llm_rollout ::: agentlightning.prompt_rollout ## Class-based Agents ::: agentlightning.LitAgent ## Emitter ::: agentlightning.operation ::: agentlightning.emit_annotation ::: agentlightning.emit_reward ::: agentlightning.emit_message ::: agentlightning.emit_object ::: agentlightning.emit_exception ## Emitter Helpers ::: agentlightning.get_message_value ::: agentlightning.get_object_value ::: agentlightning.find_final_reward ::: agentlightning.find_reward_spans ::: agentlightning.get_reward_value ::: agentlightning.get_rewards_from_span ::: agentlightning.is_reward_span ================================================ FILE: docs/reference/algorithm.md ================================================ ## Algorithm-side References !!! note This reference covers APIs that are designed to be used at "Algorithm Side". For built-in algorithms, see [Algorithm Zoo](../algorithm-zoo/index.md). ## Base Class and Decorators ::: agentlightning.Algorithm ::: agentlightning.algo ## Fast Algorithms (for Debugging) ::: agentlightning.FastAlgorithm ::: agentlightning.Baseline ## Adapter ::: agentlightning.Adapter ::: agentlightning.TraceAdapter ::: agentlightning.OtelTraceAdapter ::: agentlightning.TraceToTripletBase ::: agentlightning.TracerTraceToTriplet ::: agentlightning.LlmProxyTraceToTriplet ::: agentlightning.TraceToMessages ## LLM Proxy ::: agentlightning.LLMProxy ================================================ FILE: docs/reference/cli.md ================================================ # Command Line Interface !!! warning This document is a work in progress and might not be updated with the latest changes. Try to use `agl -h` to get the latest help message. !!! tip Agent-lightning also provides utilities to help you build your own CLI for [LitAgent][agentlightning.LitAgent] and [Trainer][agentlightning.Trainer]. See [Trainer](./trainer.md) for references. ## agl ```text usage: agl [-h] {vllm,store,prometheus,agentops} Agent Lightning CLI entry point. Available subcommands: vllm Run the vLLM CLI with Agent Lightning instrumentation. store Run a LightningStore server. prometheus Serve Prometheus metrics from the multiprocess registry. agentops Start the AgentOps server manager. positional arguments: {vllm,store,prometheus,agentops} Subcommand to run. options: -h, --help show this help message and exit ``` ## agl vllm Agent-lightning's instrumented vLLM CLI. ```text usage: agl vllm [-h] [-v] {chat,complete,serve,bench,collect-env,run-batch} ... vLLM CLI positional arguments: {chat,complete,serve,bench,collect-env,run-batch} chat Generate chat completions via the running API server. complete Generate text completions based on the given prompt via the running API server. collect-env Start collecting environment information. run-batch Run batch prompts and write results to file. options: -h, --help show this help message and exit -v, --version show program's version number and exit For full list: vllm [subcommand] --help=all For a section: vllm [subcommand] --help=ModelConfig (case-insensitive) For a flag: vllm [subcommand] --help=max-model-len (_ or - accepted) Documentation: https://docs.vllm.ai ``` ## agl store Agent-lightning's LightningStore CLI. Use it to start an independent LightningStore server. Currently the store data are stored in memory and will be lost when the server is stopped. ```text usage: agl store [-h] [--host HOST] [--port PORT] [--cors-origin CORS_ORIGINS] [--log-level {DEBUG,INFO,WARNING,ERROR}] [--tracker {prometheus,console} [{prometheus,console} ...]] [--n-workers N_WORKERS] [--backend {memory,mongo}] [--mongo-uri MONGO_URI] Run a LightningStore server options: -h, --help show this help message and exit --host HOST Host to bind the server to --port PORT Port to run the server on --cors-origin CORS_ORIGINS Allowed CORS origin. Repeat for multiple origins. Use '*' to allow all origins. --log-level {DEBUG,INFO,WARNING,ERROR} Configure the logging level for the store. --tracker {prometheus,console} [{prometheus,console} ...] Enable metrics tracking. Repeat for multiple trackers. --n-workers N_WORKERS Number of workers to run in the server. When it's greater than 1, the server will be run using `mp` launch mode. Only applicable for zero-copy stores such as MongoDB backend. --backend {memory,mongo} Backend to use for the store. --mongo-uri MONGO_URI MongoDB URI to use for the store. Applicable only if --backend is 'mongo'. ``` !!! tip After launching the store via CLI, you can tell the [`Trainer`][agentlightning.Trainer] to use the store by passing the store address to the trainer. ```python store_client = agl.LightningStoreClient("http://localhost:4747") trainer = agl.Trainer(store=store_client, ...) ``` See [using external store][debug-with-external-store] for more details. ## agl prometheus Expose the Prometheus multiprocess registry on a dedicated FastAPI server. This is useful when the main LightningStore service is under heavy load; exporters can scrape this auxiliary endpoint instead. ```text usage: agl prometheus [-h] [--host HOST] [--port PORT] [--metrics-path METRICS_PATH] [--log-level {DEBUG,INFO,WARNING,ERROR}] [--access-log] Serve Prometheus metrics outside the LightningStore server. options: -h, --help show this help message and exit --host HOST Host to bind the metrics server to. --port PORT Port to expose the Prometheus metrics on. --metrics-path METRICS_PATH HTTP path used to expose metrics. Must start with '/' and not be the root path. --log-level {DEBUG,INFO,WARNING,ERROR} Configure the logging level for the metrics server. --access-log Enable uvicorn access logs. Disabled by default to reduce noise. ``` ================================================ FILE: docs/reference/instrumentation.md ================================================ # Instrumentation API ::: agentlightning.instrumentation.instrument_all ::: agentlightning.instrumentation.uninstrument_all ## AgentOps LangChain ::: agentlightning.instrumentation.agentops_langchain ## AgentOps ::: agentlightning.instrumentation.agentops ## LiteLLM ::: agentlightning.instrumentation.litellm ## vLLM ::: agentlightning.instrumentation.vllm ================================================ FILE: docs/reference/internal.md ================================================ # Internal API References !!! danger The following APIs should be used with extra caution because they are very likely to change in the future. ## Algorithms and Adapters ::: agentlightning.adapter.messages.OpenAIMessages ::: agentlightning.adapter.triplet.TraceTree ::: agentlightning.adapter.triplet.Transition ::: agentlightning.adapter.triplet.RewardMatchPolicy ::: agentlightning.algorithm.decorator.FunctionalAlgorithm ## LitAgent ::: agentlightning.litagent.decorator.FunctionalLitAgent ::: agentlightning.litagent.decorator.llm_rollout ::: agentlightning.litagent.decorator.prompt_rollout ::: agentlightning.emitter.annotation.OperationContext ## LLM Proxy ::: agentlightning.llm_proxy.ModelConfig ::: agentlightning.llm_proxy.LightningSpanExporter ::: agentlightning.llm_proxy.LightningOpenTelemetry ::: agentlightning.llm_proxy.AddReturnTokenIds ::: agentlightning.llm_proxy.StreamConversionMiddleware ::: agentlightning.llm_proxy.MessageInspectionMiddleware ::: agentlightning.llm_proxy.RolloutAttemptMiddleware ## Store ::: agentlightning.store.base.UNSET ::: agentlightning.store.utils.rollout_status_from_attempt ::: agentlightning.store.utils.scan_unhealthy_rollouts ## Tracing and OpenTelemetry ::: agentlightning.tracer.otel.LightningSpanProcessor ## Deprecated APIs ::: agentlightning.emitter.reward.reward ::: agentlightning.server.AgentLightningServer ::: agentlightning.server.ServerDataStore ::: agentlightning.client.AgentLightningClient ::: agentlightning.client.DevTaskLoader ::: agentlightning.Task ::: agentlightning.TaskInput ::: agentlightning.TaskIfAny ::: agentlightning.RolloutRawResultLegacy ::: agentlightning.RolloutLegacy ================================================ FILE: docs/reference/restful.md ================================================ # RESTful API References !!! note Shown in the following is the RESTful API for Lightning Store.
================================================ FILE: docs/reference/runner.md ================================================ # Runner-side References !!! note This reference covers APIs that are designed to be used at "Runner Side". ## Runners ::: agentlightning.LitAgentRunner ::: agentlightning.Runner ## Tracer ::: agentlightning.AgentOpsTracer ::: agentlightning.OtelTracer ::: agentlightning.Tracer ::: agentlightning.tracer.weave.WeaveTracer ::: agentlightning.DummyTracer ::: agentlightning.set_active_tracer ::: agentlightning.get_active_tracer ::: agentlightning.clear_active_tracer ::: agentlightning.tracer.weave.WeaveTracer ================================================ FILE: docs/reference/semconv.md ================================================ # Semantic Conventions ::: agentlightning.semconv ================================================ FILE: docs/reference/store.md ================================================ # Store References ::: agentlightning.LightningStore ::: agentlightning.LightningStoreCapabilities ## Store Implementations ::: agentlightning.InMemoryLightningStore ::: agentlightning.store.mongo.MongoLightningStore ::: agentlightning.CollectionBasedLightningStore ## Client-Server and Thread-safe Wrappers ::: agentlightning.LightningStoreServer ::: agentlightning.LightningStoreClient ::: agentlightning.LightningStoreThreaded ## Collections and Collection Implementations ::: agentlightning.store.collection.AtomicMode ::: agentlightning.store.collection.AtomicLabels ::: agentlightning.store.collection.Collection ::: agentlightning.store.collection.Queue ::: agentlightning.store.collection.KeyValue ::: agentlightning.store.collection.LightningCollections ::: agentlightning.store.collection.ListBasedCollection ::: agentlightning.store.collection.DequeBasedQueue ::: agentlightning.store.collection.DictBasedKeyValue ::: agentlightning.store.collection.InMemoryLightningCollections ::: agentlightning.store.collection.mongo.MongoBasedCollection ::: agentlightning.store.collection.mongo.MongoBasedQueue ::: agentlightning.store.collection.mongo.MongoBasedKeyValue ::: agentlightning.store.collection.mongo.MongoClientPool ::: agentlightning.store.collection.mongo.MongoLightningCollections ================================================ FILE: docs/reference/trainer.md ================================================ # Agent-lightning Trainer ::: agentlightning.Trainer ::: agentlightning.build_component ## Execution Strategy ::: agentlightning.ExecutionStrategy ::: agentlightning.ClientServerExecutionStrategy ::: agentlightning.SharedMemoryExecutionStrategy ## Events ::: agentlightning.ExecutionEvent ::: agentlightning.ThreadingEvent ::: agentlightning.MultiprocessingEvent ## CLI Builder ::: agentlightning.lightning_cli ## Logging ::: agentlightning.configure_logger ::: agentlightning.setup_module_logging ::: agentlightning.setup_logging ================================================ FILE: docs/reference/types.md ================================================ # Type References ## Core Types ::: agentlightning.Triplet ::: agentlightning.RolloutRawResult ::: agentlightning.RolloutMode ::: agentlightning.GenericResponse ::: agentlightning.ParallelWorkerBase ::: agentlightning.Dataset ::: agentlightning.AttemptStatus ::: agentlightning.RolloutStatus ::: agentlightning.RolloutConfig ::: agentlightning.Rollout ::: agentlightning.EnqueueRolloutRequest ::: agentlightning.Attempt ::: agentlightning.AttemptedRollout ::: agentlightning.Worker ::: agentlightning.WorkerStatus ::: agentlightning.Hook ::: agentlightning.PaginatedResult ::: agentlightning.FilterOptions ::: agentlightning.SortOptions ::: agentlightning.FilterField ## Resources ::: agentlightning.Resource ::: agentlightning.LLM ::: agentlightning.ProxyLLM ::: agentlightning.PromptTemplate ::: agentlightning.ResourceUnion ::: agentlightning.NamedResources ::: agentlightning.ResourcesUpdate ## Traces ::: agentlightning.AttributeValue ::: agentlightning.Attributes ::: agentlightning.TraceState ::: agentlightning.SpanContext ::: agentlightning.TraceStatus ::: agentlightning.Event ::: agentlightning.Link ::: agentlightning.Resource ::: agentlightning.Span ::: agentlightning.SpanAttributeNames ::: agentlightning.SpanLike ::: agentlightning.SpanCoreFields ::: agentlightning.SpanRecordingContext ## Environment Variables ::: agentlightning.LightningEnvVar ::: agentlightning.resolve_bool_env_var ::: agentlightning.resolve_int_env_var ::: agentlightning.resolve_str_env_var ================================================ FILE: docs/reference/utilities.md ================================================ # Utility References ## ID ::: agentlightning.utils.id.generate_id ## Metrics ::: agentlightning.utils.metrics.MetricsBackend ::: agentlightning.utils.metrics.ConsoleMetricsBackend ::: agentlightning.utils.metrics.PrometheusMetricsBackend ::: agentlightning.utils.metrics.MultiMetricsBackend ::: agentlightning.utils.metrics.setup_multiprocess_prometheus ::: agentlightning.utils.metrics.get_prometheus_registry ::: agentlightning.utils.metrics.shutdown_metrics ## Server Launcher ::: agentlightning.utils.server_launcher.PythonServerLauncher ::: agentlightning.utils.server_launcher.PythonServerLauncherArgs ::: agentlightning.utils.server_launcher.LaunchMode ## OpenTelemetry ::: agentlightning.utils.otel.full_qualified_name ::: agentlightning.utils.otel.get_tracer_provider ::: agentlightning.utils.otel.get_tracer ::: agentlightning.utils.otel.make_tag_attributes ::: agentlightning.utils.otel.extract_tags_from_attributes ::: agentlightning.utils.otel.make_link_attributes ::: agentlightning.utils.otel.query_linked_spans ::: agentlightning.utils.otel.extract_links_from_attributes ::: agentlightning.utils.otel.filter_attributes ::: agentlightning.utils.otel.filter_and_unflatten_attributes ::: agentlightning.utils.otel.flatten_attributes ::: agentlightning.utils.otel.unflatten_attributes ::: agentlightning.utils.otel.sanitize_attribute_value ::: agentlightning.utils.otel.sanitize_attributes ::: agentlightning.utils.otel.sanitize_list_attribute_sanity ::: agentlightning.utils.otel.check_attributes_sanity ::: agentlightning.utils.otel.format_exception_attributes ## OTLP ::: agentlightning.utils.otlp.handle_otlp_export ::: agentlightning.utils.otlp.spans_from_proto ## System Snapshot ::: agentlightning.utils.system_snapshot.system_snapshot ================================================ FILE: docs/stylesheets/extra.css ================================================ .md-grid { max-width: 88rem; } @media screen and (min-width: 100em) { html { font-size: 130%; } } @media screen and (min-width: 125em) { html { font-size: 135%; } } .md-typeset .admonition { font-size: 0.72rem; } .md-typeset h4 { font-size: 1.15em; } .md-typeset h5, .md-typeset h6 { font-size: 1em; } /* Increase spacing between API references */ .doc-class, .doc-function, .doc-attribute { padding-bottom: 2em; margin-bottom: 3em; border-bottom: 1px solid #77777777; } .doc-class .doc-function:not(:last-child), .doc-class .doc-attribute:not(:last-child) { padding-bottom: 0; margin-bottom: 2.5em; border-bottom: none; } .doc-class .doc-function:last-child, .doc-class .doc-attribute:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: none; } [data-md-color-primary="agl"] { --md-primary-fg-color: #c45259; --md-primary-fg-color--light: #e8b4b7; --md-primary-fg-color--dark: #9a3038; --md-hue: 356; } [data-md-color-accent="agl"] { --md-accent-fg-color: #f69047; --md-accent-fg-color--light: #fcc59e; --md-accent-fg-color--dark: #da6005; } [data-md-color-scheme="slate"][data-md-color-primary="agl"] { --md-default-fg-color: hsla(var(--md-hue), 15%, 90%, 0.88); --md-default-bg-color: hsla(var(--md-hue), 6%, 4%, 1); --md-code-bg-color: hsla(var(--md-hue), 5%, 20%, 0.5); } /* Documentation version warning banner */ .version-warning { background-color: #FFD15D18; padding: 1em; font-weight: 500; position: relative; z-index: 1000; border: 2px solid #FFD15D; border-radius: 0.25em; margin-bottom: 2em; } /* To center images */ .center { display: block; margin-left: auto; margin-right: auto; } /* Charts */ canvas[data-chart] { width: 100%; display: block; } /* Grid behavior */ .md-typeset .grid { grid-template-columns: repeat(auto-fit, minmax(24rem, 1fr)); } /* Make cards fill equal height and push footer link to bottom */ .md-typeset .grid.cards > ul > li { display: flex; flex-direction: column; gap: 0; } .md-typeset .grid.cards > ul > li > hr { margin: 0.5em 0; } .md-typeset .grid.cards > ul > li > :last-child { margin-top: auto; /* pushes the last element (Browse source) to bottom */ padding-top: 0.5em; } ================================================ FILE: docs/tutorials/debug.md ================================================ # Debugging and Troubleshooting When you train your own agent with Agent-lightning, most failures surface because the agent logic is brittle or simply incorrect. Debugging becomes easier when you peel back the stack: start by driving the rollout logic on its own, dry-run the trainer loop, and only then bring the full algorithm and runner topology online. The [`examples/apo/apo_debug.py`]({{ src("examples/apo/apo_debug.py") }}) script demonstrates these techniques; this guide expands on each approach and helps you decide when to reach for them. ## Debugging with Dashboard When you launch an experiment with [`Trainer.fit`][agentlightning.Trainer.fit] or start an isolated store via [`agl store`](../reference/cli.md), the terminal prints a message similar to: ```text INFO Agent-lightning dashboard will be available at http://192.168.0.107:4747 ``` Visit that URL, and you will see the Agent-lightning dashboard: ![Dashboard](../assets/dashboard-page-rollouts.png) The dashboard surfaces everything stored inside [the store](../deep-dive/store.md). Because the store mediates interactions between algorithms and runners, inspecting it often reveals which side is causing issues such as stale rollouts, unresponsive workers, or empty traces. For example, the VERL algorithm may receive no token IDs and emit `cannot reshape tensor of 0 elements into shape [1, 0, -1, 128] because the unspecified dimension size -1 can be any value and is ambiguous` ([Issue #50](https://github.com/microsoft/agent-lightning/issues/50), [Issue #76](https://github.com/microsoft/agent-lightning/issues/76)). Several scenarios can produce that error: the runner might not produce trace spans at all, it might produce spans without token IDs, or the IDs may be present but formatted incorrectly. Inspecting the dashboard traces helps you pinpoint which condition applies. ![Dashboard Traces Page](../assets/dashboard-page-traces.png) By checking whether the trace span is empty and whether token IDs appear in the span attributes, you can narrow the issue to either the runner (agent) side or the algorithm side. Then apply the techniques below to debug the faulty component. ## Debug-level Logging Starting from v0.3, detailed signals such as store server access logs, runner lifecycle logs, and span payloads only appear when the log level is `DEBUG` so the default output stays readable. Enable debug-level logging by adding the following snippet near the top of your script: ```python import agentlightning as agl agl.setup_logging("DEBUG") ``` Set the log level on every process if your setup involves multiple workers. For example, when [running stores in isolation][debug-with-external-store], configure the store process explicitly: ```bash agl store --port 4747 --log-level DEBUG ``` ## Using [`Runner`][agentlightning.Runner] in Isolation [`Runner`][agentlightning.Runner] is a long-lived worker that wraps your [`LitAgent`][agentlightning.LitAgent], coordinates tracing, and talks to the [`LightningStore`][agentlightning.LightningStore]. In typical training flows the trainer manages runners for you, but being able to spin one up manually is invaluable while debugging. If you define rollout logic with [`@rollout`][agentlightning.rollout] or implement a [`LitAgent`][agentlightning.LitAgent] directly, you will get a [`LitAgent`][agentlightning.LitAgent] instance and you should be able to execute it with [`LitAgentRunner`][agentlightning.LitAgentRunner], which is a subclass of [`Runner`][agentlightning.Runner]. The runner needs but does not instantiate a [`Tracer`][agentlightning.Tracer], so supply one yourself. See [Working with Traces](./traces.md) for a walkthrough of tracer options. [`Runner.run_context`][agentlightning.Runner.run_context] prepares the runner to execute a particular agent. Besides the agent and tracer you must provide a store that will collect spans and rollouts. [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] keeps everything in-process, which is perfect for debugging sessions. ```python import agentlightning as agl tracer = agl.OtelTracer() runner = agl.LitAgentRunner(tracer) store = agl.InMemoryLightningStore() with runner.run_context(agent=apo_rollout, store=store): ... ``` Inside the [`run_context`][agentlightning.Runner.run_context] block you can call [`runner.step(...)`][agentlightning.Runner.step] to execute a single rollout. The payload includes the task input and any [`NamedResources`][agentlightning.NamedResources] the agent expects. Read [introduction to Resources][introduction-to-resources] and [NamedResources][introduction-to-named-resources] for more details. For example, if your agent references a [`PromptTemplate`][agentlightning.PromptTemplate], pass it through the `resources` argument: ```python with runner.run_context(agent=apo_rollout, store=store): resource = agl.PromptTemplate(template="You are a helpful assistant. {any_question}", engine="f-string") rollout = await runner.step( "Explain why the sky appears blue using principles of light scattering in 100 words.", resources={"main_prompt": resource}, ) ``` You can do as many things as you want within the [`Runner.run_context`][agentlightning.Runner.run_context] block. After the rollout finishes you can query the store to inspect what happened: ```python print(await store.query_rollouts()) print(await store.query_spans(rollout.rollout_id)) ``` Example output (with a reward span captured): ```python [Rollout(rollout_id='ro-519769241af8', input='Explain why the sky appears blue using principles of light scattering in 100 words.', start_time=1760706315.6996238, ..., status='succeeded')] [Span(rollout_id='ro-519769241af8', attempt_id='at-a6b62caf', sequence_id=1, ..., name='agentlightning.annotation', attributes={'agentlightning.reward.0.value': 0.95}, ...)] ``` Swap in an [`AgentOpsTracer`][agentlightning.AgentOpsTracer] instead of [`OtelTracer`][agentlightning.OtelTracer] to see the underlying LLM spans alongside reward information: ```python [ Span(rollout_id='ro-519769241af8', attempt_id='at-a6b62caf', sequence_id=1, ..., name='openai.chat.completion', attributes={..., 'gen_ai.prompt.0.role': 'user', 'gen_ai.prompt.0.content': 'You are a helpful assistant. Explain why the sky appears blue using principles of light scattering in 100 words.', ...}), Span(rollout_id='ro-519769241af8', attempt_id='at-a6b62caf', sequence_id=2, ..., name='openai.chat.completion', attributes={..., 'gen_ai.prompt.0.role': 'user', 'gen_ai.prompt.0.content': 'Evaluate how well the output fulfills the task...', ...}), Span(rollout_id='ro-519769241af8', attempt_id='at-a6b62caf', sequence_id=3, ..., name='agentlightning.annotation', attributes={'agentlightning.reward.0.value': 0.95}, ...) ] ``` !!! tip Spans too difficult to read? Try using [`Adapter`][agentlightning.Adapter] to convert them into a [more readable format](./traces.md). [`Runner.step`][agentlightning.Runner.step] executes a full rollout even though it is named "step". The companion method [`Runner.iter`][agentlightning.Runner.iter] executes multiple "steps" by continuously pulling new rollout inputs from the store until a stop event is set. Use `iter` once you are confident the single-step path works and you have another worker [`enqueue_rollout`][agentlightning.LightningStore.enqueue_rollout] to the store. !!! tip You can also call [`Runner.step`][agentlightning.Runner.step] to inject ad-hoc rollouts into a running store being used by another algorithm, so that the rollouts can be consumed by the algorithms. This is very recently known as the paradigm of ["online RL"](https://cursor.com/blog/tab-rl). At the moment, no algorithm in the [algorithm zoo](../algorithm-zoo/index.md) consumes externally generated rollouts, but the data flow is available there if you need it. ## Debug with LLM Proxy If you are dealing with LLM optimization like Reinforcement Learning, we generally recommend using an online stable LLM service for your debugging purposes, like `openai/gpt-4.1-nano`. After the debugging is done, you can switch to a local training endpoint. However, if you want to use a local LLM features like [getting the token IDs](../deep-dive/serving-llm.md), you can also manually start a local vLLM server by: ```bash vllm serve Qwen/Qwen2.5-0.5B-Instruct --port 8080 ``` Then start the LLM proxy via the following script: ```python import asyncio import aiohttp import agentlightning as agl async def serve_llm_proxy(): store = agl.InMemoryLightningStore() store_server = agl.LightningStoreServer(store, "127.0.0.1", 8081) await store_server.start() llm_proxy = agl.LLMProxy( port=8082, model_list=[ { "model_name": "Qwen/Qwen2.5-0.5B-Instruct", "litellm_params": { "model": "hosted_vllm/Qwen/Qwen2.5-0.5B-Instruct", "api_base": "http://localhost:8080/v1", }, } ], store=store_server, ) await llm_proxy.start() await asyncio.sleep(1000000) ``` Test the served LLM proxy with a client like: ```python async def test_llm_proxy(): async with aiohttp.ClientSession() as session: async with session.post("http://localhost:8082/v1/chat/completions", json={ "model": "Qwen/Qwen2.5-0.5B-Instruct", "messages": [{"role": "user", "content": "Hello, world!"}], }) as response: print(await response.json()) ``` You can now use the LLM proxy by specifying environment variables: ```bash export OPENAI_API_BASE=http://localhost:8081/v1 export OPENAI_API_KEY=dummy ``` You might see warnings about `Missing or invalid rollout_id, attempt_id, or sequence_id` in the LLM proxy logs. This is fine because you don't have a rollout and attempt yet when you are debugging. When you started the training, the algorithm will create the rollouts for you and the warnings will go away. ## Hook into Runner's Lifecycle [`Runner.run_context`][agentlightning.Runner.run_context] accepts a `hooks` argument so you can observe or augment lifecycle events without editing your agent. Hooks subclass [`Hook`][agentlightning.Hook] and can respond to four asynchronous callbacks: [`on_trace_start`][agentlightning.Hook.on_trace_start], [`on_rollout_start`][agentlightning.Hook.on_rollout_start], [`on_rollout_end`][agentlightning.Hook.on_rollout_end], and [`on_trace_end`][agentlightning.Hook.on_trace_end]. This is useful for: - Capturing raw OpenTelemetry spans before they hit the store and before the [`LitAgentRunner`][agentlightning.LitAgentRunner] do postprocessing on the rollout - Inspecting the tracer instance after they are activated - Logging rollout inputs before they are processed by the agent The `hook` mode in [`examples/apo/apo_debug.py`]({{ src("examples/apo/apo_debug.py") }}) prints every span collected during a rollout: ```python import agentlightning as agl # ... Same as previous example class DebugHook(agl.Hook): async def on_trace_end(self, *, agent, runner, tracer, rollout): trace = tracer.get_last_trace() print("Trace spans collected during the rollout:") for span in trace: print(f"- {span.name} (status: {span.status}):\n {span.attributes}") with runner.run_context( agent=apo_rollout, store=store, hooks=[DebugHook()], ): await runner.step( "Explain why the sky appears blue using principles of light scattering in 100 words.", resources={"main_prompt": resource}, ) ``` Because hooks run inside the runner process you can also attach debuggers or breakpoints directly in the callback implementations. !!! note For a better understanding of where hooks are called, we show a pseudo code of Runner's working flow below: ```python resources = await store.get_latest_resources() rollout = ... try: # <-- on_rollout_start with tracer.trace_context(...): # <--- on_trace_start result = await agent.rollout(...) # <--- on_trace_end post_process_result(result) except Exception: # <-- on_rollout_end await store.update_attempt(status=...) ``` ## Dry-Run the Trainer Loop Once single rollouts behave, switch to the trainer’s dry-run mode. [`Trainer.dev`][agentlightning.Trainer.dev] spins up a lightweight fast algorithm — [`agentlightning.Baseline`][agentlightning.Baseline] by default — so you can exercise the same infrastructure as [`Trainer.fit`][agentlightning.Trainer.fit] without standing up complex stacks like RL or SFT. !!! warning When you enable multiple runners via `n_runners`, the trainer may execute them in separate worker processes. Attaching a debugger such as `pdb` is only practical when `n_runners=1`, and even then the runner might not live in the main process. ```python import agentlightning as agl dataset: agl.Dataset[str] = [ "Explain why the sky appears blue using principles of light scattering in 100 words.", "What's the capital of France?", ] resource = agl.PromptTemplate(template="You are a helpful assistant. {any_question}", engine="f-string") trainer = agl.Trainer( n_runners=1, initial_resources={"main_prompt": resource}, ) trainer.dev(apo_rollout, dataset) ``` Just like [`Runner.run_context`][agentlightning.Runner.run_context], [`Trainer.dev`][agentlightning.Trainer.dev] requires the [`NamedResources`][agentlightning.NamedResources] your agent expects. The key difference is that resources are attached to the trainer rather than the runner. [`Trainer.dev`][agentlightning.Trainer.dev] uses an almost switchable interface from [`Trainer.fit`][agentlightning.Trainer.fit]. It also needs a dataset to iterate over, similar to [`fit`][agentlightning.Trainer.fit]. Under the hood [`dev`][agentlightning.Trainer.dev] uses the same implementation as [`fit`][agentlightning.Trainer.fit], which means you can spin up multiple runners, observe scheduler behavior, and validate how algorithms adapt rollouts. The default [`Baseline`][agentlightning.Baseline] logs detailed traces so you can see each rollout as the algorithm perceives it: ```text 21:20:30 Initial resources set: {'main_prompt': PromptTemplate(resource_type='prompt_template', template='You are a helpful assistant. {any_question}', engine='f-string')} 21:20:30 Proceeding epoch 1/1. 21:20:30 Enqueued rollout ro-302fb202bd85 in train mode with sample: Explain why the sky appears blue using principles of light scattering in 100 words. 21:20:30 Enqueued rollout ro-e65a3ffaa540 in train mode with sample: What's the capital of France? 21:20:30 Waiting for 2 harvest tasks to complete... 21:20:30 [Rollout ro-302fb202bd85] Status is initialized to queuing. 21:20:30 [Rollout ro-e65a3ffaa540] Status is initialized to queuing. 21:20:35 [Rollout ro-302fb202bd85] Finished with status succeeded in 3.80 seconds. 21:20:35 [Rollout ro-302fb202bd85 | Attempt 1] ID: at-f84ad21c. Status: succeeded. Worker: Worker-0 21:20:35 [Rollout ro-302fb202bd85 | Attempt at-f84ad21c | Span 3a286a856af6bea8] #1 (openai.chat.completion) ... 1.95 seconds. Attribute keys: ['gen_ai.request.type', 'gen_ai.system', ...] 21:20:35 [Rollout ro-302fb202bd85 | Attempt at-f84ad21c | Span e2f44b775e058dd6] #2 (openai.chat.completion) ... 1.24 seconds. Attribute keys: ['gen_ai.request.type', 'gen_ai.system', ...] 21:20:35 [Rollout ro-302fb202bd85 | Attempt at-f84ad21c | Span 45ee3c94fa1070ec] #3 (agentlightning.annotation) ... 0.00 seconds. Attribute keys: ['agentlightning.reward.0.value'] 21:20:35 [Rollout ro-302fb202bd85] Adapted data: [Triplet(prompt={'token_ids': []}, response={'token_ids': []}, reward=None, metadata={'response_id': '...', 'agent_name': ''}), Triplet(prompt={'token_ids': []}, response={'token_ids': []}, reward=0.95, metadata={'response_id': '...', 'agent_name': ''})] 21:20:35 Finished 1 rollouts. 21:20:35 [Rollout ro-e65a3ffaa540] Status changed to preparing. 21:20:40 [Rollout ro-e65a3ffaa540] Finished with status succeeded in 6.39 seconds. 21:20:40 [Rollout ro-e65a3ffaa540 | Attempt 1] ID: at-eaefa5d4. Status: succeeded. Worker: Worker-0 21:20:40 [Rollout ro-e65a3ffaa540 | Attempt at-eaefa5d4 | Span 901dd6acc0f50147] #1 (openai.chat.completion) ... 1.30 seconds. Attribute keys: ['gen_ai.request.type', 'gen_ai.system', ...] 21:20:40 [Rollout ro-e65a3ffaa540 | Attempt at-eaefa5d4 | Span 52e0aa63e02be611] #2 (openai.chat.completion) ... 1.26 seconds. Attribute keys: ['gen_ai.request.type', 'gen_ai.system', ...] 21:20:40 [Rollout ro-e65a3ffaa540 | Attempt at-eaefa5d4 | Span 6c452de193fbffd3] #3 (agentlightning.annotation) ... 0.00 seconds. Attribute keys: ['agentlightning.reward.0.value'] 21:20:40 [Rollout ro-e65a3ffaa540] Adapted data: [Triplet(prompt={'token_ids': []}, response={'token_ids': []}, reward=None, metadata={'response_id': '...', 'agent_name': ''}), Triplet(prompt={'token_ids': []}, response={'token_ids': []}, reward=1.0, metadata={'response_id': '...', 'agent_name': ''})] 21:20:40 Finished 2 rollouts. ``` The only limitation is that resources remain static and components like [`LLMProxy`][agentlightning.LLMProxy] are not wired in. For richer dry runs you can subclass [`FastAlgorithm`][agentlightning.FastAlgorithm] and override the pieces you care about. ## Debug the Algorithm-Runner Boundary [](){ #debug-with-external-store } Debugging algorithms in Agent-Lightning is often more challenging than debugging agents. Algorithms are typically **stateful** and depend on several moving parts — runners, stores, and trainers — which makes it difficult to isolate and inspect their behavior. Even mocking an agent to cooperate with an algorithm can be costly and error-prone. To simplify this, Agent-Lightning provides a way to run algorithms in isolation so you can attach a debugger and inspect internal state without interference from other components. By default, [`Trainer.fit`][agentlightning.Trainer.fit] runs the algorithm in the main process and thread, but its logs are interleaved with those from the store and runners, making it hard to follow what’s happening inside the algorithm itself. In [*Write Your First Algorithm*](../how-to/write-first-algorithm.md), we covered how to stand up a store, algorithm, and runner in isolation for your own implementations. This section extends that approach to cover two common questions: 1. How can I run built-in or class-based algorithms (inheriting from [`Algorithm`][agentlightning.Algorithm]) in isolation? 2. How can I still use [`Trainer`][agentlightning.Trainer] features like `n_runners`, `adapter`, or `llm_proxy` while debugging? The solution is to keep using a [`Trainer`][agentlightning.Trainer] instance but **manage the store yourself**, running the algorithm and runner roles separately. This approach mirrors the internal process orchestration of [`Trainer.fit`][agentlightning.Trainer.fit], but with more visibility and control. Below, we show a step-by-step guide to achieve this with the [`calc_agent` example]({{ src("examples/calc_x/train_calc_agent.py") }}). **1. Launch the store manually.** In a separate terminal, start the store: ```bash agl store --port 4747 ``` Add `--log-level DEBUG` to the command to see the detailed logs. Then, in your training script, create a [`LightningStoreClient`][agentlightning.LightningStoreClient] and pass it to the trainer: ```python client = agl.LightningStoreClient("http://localhost:4747") trainer = agl.Trainer(store=client, ...) ``` Set the environment variable `AGL_MANAGED_STORE=0` so the trainer doesn't attempt to manage the store automatically. **2. Start the runner and algorithm processes separately.** Each process should run the same training script, but with different environment variables specifying the current role. This setup faithfully mirrors how [`Trainer.fit`][agentlightning.Trainer.fit] orchestrates these components behind the scenes. ```bash # Terminal 2 – Runner process AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=runner \ python train_calc_agent.py --external-store-address http://localhost:4747 --val-file data/test_mini.parquet # Terminal 3 – Algorithm process AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=algorithm \ python train_calc_agent.py --external-store-address http://localhost:4747 --val-file data/test_mini.parquet ``` **3. Reuse your existing trainer configuration.** You can continue using the same datasets, adapters, and proxies as usual. Because the store is now external, you can: * Attach debuggers to either the algorithm or runner process * Add fine-grained logging or tracing * Simulate partial failures or latency in individual components This setup provides a faithful reproduction of the algorithm–runner interaction while keeping the store visible for inspection. Once you’ve resolved the issue, simply set `AGL_MANAGED_STORE=1` (or omit it) to return to the standard managed training workflow. ================================================ FILE: docs/tutorials/emitter.md ================================================ # Using Emitters [](){ #using-emitter } While returning a single float for the final reward is sufficient for many algorithm-agent combinations, some advanced scenarios require richer feedback. For instance, an algorithm might learn more effectively if it receives intermediate rewards throughout a multi-step task, or if the agent needs to emit additional spans for debugging or analysis. Agent-lightning provides an **emitter** module for recording custom spans inside your agent logic. Just as [Tracer][agentlightning.Tracer] automatically instruments common operations (for example, LLM calls), each emitter helper sends a [Span][agentlightning.Span] that captures Agent-lightning-specific work so downstream algorithms can query it later. See [Working with Traces](./traces.md) for more details. For multi-step routines such as function calls, tools, or adapters, wrap code with [`operation`][agentlightning.operation] — either as a decorator or a context manager — to capture inputs, outputs, and metadata on a dedicated [`operation`][agentlightning.operation] span. This makes it easier to correlate downstream annotations (like rewards or messages) with the higher-level work that produced them. You can find the emitter functions in [`agentlightning.emitter`](../reference/agent.md). ## Emitting Rewards, Messages, and More Here are the primary emitter functions: * [`emit_reward(value: float)`][agentlightning.emit_reward]: Records an intermediate/final reward, which is a convenient wrapper of [`emit_annotation`][agentlightning.emit_annotation]. * [`emit_annotation(attributes: Dict[str, Any])`][agentlightning.emit_annotation]: Records arbitrary metadata as a span. * [`emit_message(message: str)`][agentlightning.emit_message]: Records a simple log message as a span. * [`emit_exception(exception: BaseException)`][agentlightning.emit_exception]: Records a Python exception, including its type, message, and stack trace. * [`emit_object(obj: Any)`][agentlightning.emit_object]: Records any JSON-serializable object, perfect for structured data. Let's first see an example of an agent using these emitters to provide detailed feedback. ```python import agentlightning as agl @agl.rollout def multi_step_agent(task: dict, prompt_template: PromptTemplate) -> float: try: # Step 1: Initial planning agl.emit_message("Starting planning phase.") plan = generate_plan(task, prompt_template) agl.emit_object({"plan_steps": len(plan), "first_step": plan[0]}) # Award a small reward for a valid plan plan_reward = grade_plan(plan) agl.emit_reward(plan_reward) # Step 2: Execute the plan agl.emit_message(f"Executing {len(plan)}-step plan.") execution_result = execute_plan(plan) # Step 3: Final evaluation final_reward = custom_grade_final_result(execution_result, task["expected_output"]) # The return value is treated as the final reward for the rollout return final_reward except ValueError as e: # Record the specific error and return a failure reward agl.emit_exception(e) return 0.0 ``` Each helper accepts nested `attributes` (or keyword arguments for [`operation`][agentlightning.operation]) and automatically flattens/sanitizes them into dotted OpenTelemetry keys. This means you can pass ordinary dictionaries/lists without pre-processing and still get consistent attribute names such as `meta.any_attribute` across all emitter operations. Agent-lightning does not restrict the attributes you supply, but it is best to consult [OpenTelemetry's semantic conventions](https://opentelemetry.io/docs/specs/semconv/) for recommended names. Agent-lightning also defines [specific semconv](../reference/semconv.md) for its own use cases. The pattern looks like this: ```python from opentelemetry.semconv.attributes import server_attributes from agentlightning import emit_object emit_object({ "name": "John Doe", "age": 30, "email": "john.doe@example.com", }, attributes={ server_attributes.SERVER_ADDRESS: "127.0.0.1", server_attributes.SERVER_PORT: 8080, }) ``` Running the above code sends the following span to the backend if you have a tracer active: ```text Span( name='agentlightning.object', attributes={ 'agentlightning.object.type': 'dict', 'agentlightning.object.json': '{"name": "John Doe", "age": 30, "email": "john.doe@example.com"}', 'server.address': '127.0.0.1', 'server.port': 8080 } ) ``` !!! tip If you don't have a tracer active, the above code will raise the following error: ```text RuntimeError: No active tracer found. Cannot emit object span. ``` By default, emitter helpers delegate to the active tracer to create and export spans (specifically via [`Tracer.create_span`][agentlightning.Tracer.create_span]). If you want to emit spans without an active tracer, set `propagate=False` to keep the span local — a useful option for offline tests. The default `True` streams spans through the active tracer/exporters. When working with [agentlightning.semconv](../reference/semconv.md), you typically use utilities such as [`make_tag_attributes`][agentlightning.utils.otel.make_tag_attributes] and [`make_link_attributes`][agentlightning.utils.otel.make_link_attributes] to build the attributes dictionary. For example: ```python from agentlightning.utils.otel import make_tag_attributes emit_annotation(make_tag_attributes(["tool", "calculator", "fast", "good"])) ``` The above code will send a span with the following attributes to the backend: ```json { "agentlightning.tag.0": "tool", "agentlightning.tag.1": "calculator", "agentlightning.tag.2": "fast", "agentlightning.tag.3": "good" } ``` A counterpart utility function [`extract_tags_from_attributes`][agentlightning.utils.otel.extract_tags_from_attributes] is also available to extract the tags from the attributes dictionary. ## Operations The [`operation`][agentlightning.operation] helper tracks logical units of work within your agent, capturing inputs, outputs, timing, and success/failure status. Unlike point-in-time emitters, operations create a span representing a time interval. Use operations for tool calls, multi-step workflows, debugging, and performance monitoring. [`operation`][agentlightning.operation] works as either a decorator or a context manager. The decorator automatically captures function arguments as inputs and the return value as output: ```python import agentlightning as agl @agl.operation def search_documents(query: str, max_results: int = 10) -> list[dict]: results = perform_search(query, max_results) return results @agl.operation(category="tool", priority="high") def execute_calculation(expression: str) -> float: return eval_safely(expression) ``` The example above emits a span with `{"category": "tool", "priority": "high"}` attributes. It also records the function input and output via [OPERATION_INPUT][agentlightning.semconv.LightningSpanAttributes.OPERATION_INPUT] and [OPERATION_OUTPUT][agentlightning.semconv.LightningSpanAttributes.OPERATION_OUTPUT]. It works with async functions too: ```python @agl.operation async def async_api_call(endpoint: str, payload: dict) -> dict: response = await http_client.post(endpoint, json=payload) return response.json() ``` Override the operation name if needed: ```python @agl.operation(name="custom-name") def any_weird_name_i_dont_want(): pass ``` For more control, [`operation`][agentlightning.operation] can also be used as a context manager to explicitly record inputs and outputs: ```python with agl.operation(tool_name="web_search") as op: op.set_input(query="latest AI research", filters={"date": "2024"}) results = search_web("latest AI research", {"date": "2024"}) op.set_output({"result_count": len(results), "top_result": results[0]}) ``` The `propagate=False` flag also applies to [`operation`][agentlightning.operation] when you want to keep operations local without requiring an active tracer: ```python @agl.operation(propagate=False) def local_test(): return "Not sent to backend" ``` ## Linking to Other Spans Sometimes a span should explicitly point back to another span that produced the input it is working on (for example, linking a reward annotation to the [`agentlightning.operation`][agentlightning.operation] span that generated a response). Agent-lightning encodes these relationships through flattened link attributes. The helper [`make_link_attributes`][agentlightning.utils.otel.make_link_attributes] converts a dictionary of keys such as `trace_id`, `span_id`, or any custom attribute into the `"agentlightning.link.*"` ([LightningSpanAttributes.LINK][agentlightning.semconv.LightningSpanAttributes.LINK]) fields expected by the backend. Later, [`query_linked_spans`][agentlightning.utils.otel.query_linked_spans] can recover the original span(s) from those link descriptors. ```python import opentelemetry.trace as trace_api from agentlightning import emit_annotation, operation from agentlightning.utils.otel import make_link_attributes, make_tag_attributes with operation(conversation_id="chat-42") as op: # ... perform the work ... link_attrs = make_link_attributes({ "conversation_id": "chat-42", }) emit_annotation( { **link_attrs, **make_tag_attributes(["reward", "good"]), } ) ``` When analyzing in adapters, pass the extracted link models to [`query_linked_spans`][agentlightning.utils.otel.query_linked_spans] to retrieve the matching span(s): ```python from agentlightning.utils.otel import extract_links_from_attributes, query_linked_spans annotation_span = ... # Span from your trace store operation_spans = [...] # list of spans you want to search link_models = extract_links_from_attributes(annotation_span.attributes) matches = query_linked_spans(operation_spans, link_models) assert matches # Contains the original operation span ``` !!! tip "Correlating Rewards with LLM Requests" [Tracer](./traces.md) instruments each request/response as its own span. You can link to the [`gen_ai.response.id`](https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/) attribute, which comes from the LLM response ID. ```python from agentlightning import emit_reward from agentlightning.utils.otel import make_link_attributes result = call_llm(prompt) reward_links = make_link_attributes({"gen_ai.response.id": result.id}) emit_reward(0.9, attributes=reward_links) ``` Later, use the same `gen_ai.response.id` key inside `query_linked_spans` to find the reward(s) that reference that specific LLM request span. ================================================ FILE: docs/tutorials/installation.md ================================================ # Installation Guide This guide explains how to install **Agent-Lightning**. You can install it from **PyPI** (the Python Package Index) for general use or directly from the **source code** if you plan to contribute or need fine-grained control over dependencies. !!! info "Platform and Hardware Requirements" Agent-Lightning is officially supported on **Linux distributions** (Ubuntu 22.04 or later is recommended). At the moment **macOS and Windows** (outside of WSL2) are not supported. The Python runtime must be **Python 3.10 or newer**. We recommend using the latest patch release of Python 3.10, 3.11, or 3.12 to pick up performance and security updates. A **GPU is optional**—you only need CUDA-capable hardware if you plan to fine-tune model weights or run GPU-accelerated workloads. CPU-only environments are fully supported for evaluation and inference. ## Installing from PyPI The easiest way to get started is by installing Agent-Lightning directly from PyPI. This ensures you get the latest **stable release** of the package, tested for compatibility and reliability. ### Install the Stable Release Run the following command in your terminal: ```bash pip install --upgrade agentlightning ``` This installs or upgrades Agent-Lightning to the newest stable version. !!! tip If you intend to use **Agent-Lightning** with [**VERL**](../algorithm-zoo/verl.md) or run any of its **example scripts**, you’ll need to install some additional dependencies. See the sections on [Algorithm-specific installation](#algorithm-specific-installation) and [Example-specific installation](#example-specific-installation) for details. ### Install the Nightly Build (Latest Features) Agent-Lightning also publishes **nightly builds**, which contain the latest experimental features and improvements from the main branch. These are available via **Test PyPI**. ```bash pip install --upgrade --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ --pre agentlightning ``` !!! warning The nightly builds are cutting-edge but may include unstable or untested changes. Use them **at your own risk**, especially in production environments. ## Algorithm-specific Installation Agent-Lightning supports multiple learning algorithms. Some of them like [APO](../algorithm-zoo/apo.md) or [VERL](../algorithm-zoo/verl.md) require extra dependencies. You can install them automatically using **optional extras** or manually if you prefer finer control. ### Installing APO [APO](../algorithm-zoo/apo.md) is an algorithm module that depends on libraries such as [POML](https://github.com/microsoft/POML). You can install Agent-Lightning with APO support by running: ```bash pip install agentlightning[apo] ``` !!! warning APO also depends on the [OpenAI Python SDK](https://github.com/openai/openai-python), version **2.0 or newer**. Ensure your SDK version is up to date to avoid compatibility issues. ### Installing VERL [VERL](../algorithm-zoo/verl.md) integrates with libraries like **PyTorch**, **vLLM**, and **VERL framework**. Although you *can* install all dependencies automatically, we recommend doing it manually to avoid version conflicts. ```bash pip install agentlightning[verl] ``` !!! tip "Recommended Manual Setup (More Stable)" Automated installation may cause issues if you don’t have a compatible **PyTorch** or **CUDA** version preinstalled. For a more stable setup, install dependencies step-by-step: ```bash pip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cu128 pip install flash-attn --no-build-isolation pip install vllm==0.10.2 pip install verl==0.5.0 ``` This approach ensures compatibility with CUDA 12.8 and minimizes dependency conflicts. ## Example-specific Installation Each example in the `examples/` directory may have its own additional dependencies. Please refer to the **README** file of each example for detailed setup instructions: [See Example READMEs]({{ src("examples") }}). ## Installing from Source (for Developers and Contributors) If you plan to contribute to Agent-Lightning or prefer to work with the latest development code, install it directly from the **source repository**. ### Why Install from Source? * You want to **modify or contribute** to the project. * You prefer an **isolated development environment**. * You want to test unreleased features or fix bugs locally. ### Using `uv` for Dependency Management Starting with version **0.2**, Agent-Lightning uses [`uv`](https://docs.astral.sh/uv/) as its **default dependency manager**. `uv` is a fast and safe alternative to `pip` that: * Installs packages **in seconds** (instead of minutes), * Prevents **dependency conflicts**, * Supports **grouped dependencies** for optional features. Before proceeding, make sure `uv` is installed. ### Minimal Developer Installation ```bash git clone https://github.com/microsoft/agent-lightning cd agent-lightning uv sync --group dev ``` This command sets up a clean development environment with only the essential dependencies. ### Installing All Extras (CPU or GPU) `uv sync` can also handle algorithm-specific and example-specific dependencies in one step. For a CPU-only machine: ```bash uv sync --frozen \ --extra apo \ --extra verl \ --group dev \ --group torch-cpu \ --group torch-stable \ --group trl \ --group agents \ --no-default-groups ``` For a GPU-equipped machine that is CUDA 12.8 compatible: ```bash uv sync --frozen \ --extra apo \ --extra verl \ --group dev \ --group torch-gpu-stable \ --group trl \ --group agents \ --no-default-groups ``` Read more about Agent-lightning managed dependency groups [here]({{ src("pyproject.toml") }}). ### Building the Dashboard The Agent-Lightning dashboard is built using [Vite](https://vite.dev/). To build the dashboard, run the following command: ```bash cd dashboard npm ci npm run build ``` Some HTML and JavaScript assets will be generated in the `agentlightning/dashboard` directory. ### Activating Your Environment After syncing dependencies, `uv` automatically creates a virtual environment inside the `.venv/` directory. You can use it in two ways: ```bash # Option 1: Prefix commands with uv run uv run python your_script.py # Option 2: Activate the virtual environment source .venv/bin/activate python your_script.py ``` !!! warning "Before Contributing" Agent-Lightning enforces code style and linting rules via **pre-commit hooks**. Installing them early prevents many avoidable formatting issues. ```bash uv run pre-commit install uv run pre-commit run --all-files --show-diff-on-failure --color=always ``` ================================================ FILE: docs/tutorials/parallelize.md ================================================ # Scaling out Agent-lightning Agent-lightning splits training into an **algorithm bundle** and a **runner bundle** that exchange work through the [`LightningStore`][agentlightning.LightningStore]. This tutorial shows how to increase rollout throughput, place bundles across processes or machines, and keep the algorithm side scalable with external frameworks. ## Parallelizing Rollouts with [`Trainer`][agentlightning.Trainer] Before we dive into the details of the bundles and execution strategies, let's first revisit how to parallelize rollouts with [`Trainer`][agentlightning.Trainer]. [`Trainer`][agentlightning.Trainer] is the quickest way to dial up parallelism. Even when `n_runners = 1`, calling [`Trainer.fit`][agentlightning.Trainer.fit] runs the algorithm and runners in parallel. The algorithm enqueues rollouts; runners dequeue them and execute your [`LitAgent`][agentlightning.LitAgent], and the algorithm collects spans via its [`Adapter`][agentlightning.Adapter] before scheduling the next batch. !!! note One of the most important features of [`Trainer`][agentlightning.Trainer] is the ability to abort things gracefully. For example, if you press `Ctrl+C` in the terminal, the algorithm will abort and the runners will stop executing. If the algorithm crashes, the runners will also stop executing. Increase throughput by setting `n_runners` when constructing the trainer. The following example comes from [train_calc_agent.py]({{ src("examples/calc_x/train_calc_agent.py") }}). Since backend LLMs usually use techniques like [continuous batching](https://docs.vllm.ai/en/latest/) to increase throughput, you do not have to worry about overwhelming the backend with too many requests. ```python import agentlightning as agl from datasets import Dataset as HFDataset from calc_agent import calc_agent train_dataset = HFDataset.from_parquet("data/train.parquet").to_list() val_dataset = HFDataset.from_parquet("data/test.parquet").to_list() algorithm = agl.VERL(verl_config) trainer = agl.Trainer( algorithm=algorithm, n_runners=8, # launch eight rollout workers tracer=agl.OtelTracer(), adapter=agl.LlmProxyTraceToTriplet(), ) trainer.fit(calc_agent, train_dataset=train_dataset, val_dataset=val_dataset) ``` In [`Trainer`][agentlightning.Trainer], there are multiple other initialization parameters that you can use to customize the training process. For example, you can use `max_rollouts` to keep smoke tests short. Pass a concrete [`LightningStore`][agentlightning.LightningStore] instance when you need persistence or want to share the queue across multiple scripts. !!! tip Before scaling out, run [`Trainer.dev()`][agentlightning.Trainer.dev] with `n_runners=1` to verify the rollout logic and spans without burning GPU hours. ## Bundles and Execution Strategies When [`Trainer`][agentlightning.Trainer] starts, it packages its configuration into two callable **bundles**: ![Illustration of bundles and execution strategies](../assets/execution-bundles.svg) The **algorithm bundle** wraps your [`Algorithm`][agentlightning.Algorithm], adapter, and any LLM proxy into a single callable that can be aborted via a signal event. ```python async def algorithm_bundle(store: LightningStore, event: ExecutionEvent) -> None: ... ``` The **runner bundle** wraps the [`Runner`][agentlightning.Runner], tracer, hooks, and agent into a single callable that can be aborted via a signal event. Unlike the algorithm bundle, the runner bundle is expected to be replicated. ```python async def runner_bundle(store: LightningStore, worker_id: int, event: ExecutionEvent) -> None: ... ``` An **execution strategy** then decides where those bundles are placed (threads vs processes vs multiple machines), how many runner replicas to launch, and how lifecycle events such as shutdown are coordinated. By default, the trainer builds an [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] if you do not provide one. Because that store has no locking or cross-process transport, the execution strategy is the component that wraps it in thread-safe or HTTP-safe facades ([`LightningStoreThreaded`][agentlightning.LightningStoreThreaded], [`LightningStoreServer`][agentlightning.LightningStoreServer]) before handing it to bundles. For a deeper look at these facades, see [Understanding the Store](../deep-dive/store.md) and [Birds' Eye View](../deep-dive/birds-eye-view.md). Agent-lightning provides two built-in execution strategies: [`SharedMemoryExecutionStrategy`][agentlightning.SharedMemoryExecutionStrategy] and [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy]. You can pass a string alias, a configuration dictionary, or a pre-built strategy instance: ```python import agentlightning as agl algorithm = agl.Baseline() # Short alias for the shared-memory strategy. # Because the runner lives on the main thread in this mode, # n_runners must be 1 unless you move the algorithm to the main thread. trainer = agl.Trainer(algorithm=algorithm, n_runners=1, strategy="shm") # Dict with overrides; keep the algorithm on the main thread so multiple runner threads can spawn. # Specifying `n_runners` inside strategy is equivalent to passing `n_runners` to the trainer. trainer = agl.Trainer( algorithm=algorithm, strategy={ "type": "shm", "n_runners": 8, "main_thread": "algorithm", }, ) # Pass an existing strategy instance – Trainer respects the strategy's own `n_runners`. strategy = agl.SharedMemoryExecutionStrategy(main_thread="algorithm", n_runners=4) trainer = agl.Trainer(algorithm=algorithm, strategy=strategy) ``` If you omit the strategy, the trainer defaults to `ClientServerExecutionStrategy(n_runners=trainer.n_runners)`. You can still re-specify the client-server strategy through aliases or configuration to tweak ports and other settings: ```python trainer = agl.Trainer( algorithm=algorithm, n_runners=8, strategy={"type": "cs", "server_port": 9999}, ) ``` Environment variables give you another layer of control. For example: ```python import os os.environ["AGL_SERVER_PORT"] = "10000" os.environ["AGL_CURRENT_ROLE"] = "algorithm" os.environ["AGL_MANAGED_STORE"] = "0" trainer = agl.Trainer(algorithm=algorithm, n_runners=8, strategy="cs") ``` The resulting [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy] picks up the port, role, and managed-store flag from the environment. !!! tip The same configuration patterns apply to other trainer components. For example, ```python trainer = agl.Trainer(algorithm=algorithm, tracer=agl.OtelTracer()) ``` wires in a custom tracer, while ```python trainer = agl.Trainer(algorithm=algorithm, adapter="agentlightning.adapter.TraceToMessages") ``` swaps in a different adapter. Passing a dict lets you tweak the init parameters of defaults without naming the class explicitly: ```python trainer = agl.Trainer( algorithm=algorithm, adapter={"agent_match": "plan_agent", "repair_hierarchy": False}, ) ``` The next sections walk through the two built-in strategies and how they affect placement and store access. ## Client-server Architecture The default [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy] starts a [`LightningStoreServer`][agentlightning.LightningStoreServer] alongside the algorithm and spawns runner processes that talk to it through [`LightningStoreClient`][agentlightning.LightningStoreClient]. All runners share the HTTP endpoint, so the queue and spans stay consistent across processes or machines. If you simply instantiate [`Trainer`][agentlightning.Trainer] (as above), it will send the algorithm bundle and runner bundle to [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy], which will then: 1. Launch \(N+1\) processes: \(N\) runner processes and 1 algorithm process (one of them could live in the main process). 2. The algorithm process will take the store received from [`Trainer`][agentlightning.Trainer], wrap it in a [`LightningStoreServer`][agentlightning.LightningStoreServer], and start serving it over HTTP. 3. The runner processes discard the store and create a new store, which is a client that connects to the algorithm process through [`LightningStoreClient`][agentlightning.LightningStoreClient], and start executing the runner bundle. 4. The strategy automatically escalates shutdown (cooperative stop → `SIGINT` → `terminate()` → `kill()`) so long-running runners do not linger. You can override server placement or ports, and whether to automatically wrap the store, through constructor arguments or environment variables: ```python trainer = agl.Trainer( algorithm=algorithm, n_runners=1, strategy={ "type": "cs", "server_host": "0.0.0.0", "server_port": 9999, "main_process": "runner", }, ) ``` Set `AGL_SERVER_HOST` and `AGL_SERVER_PORT` if you prefer environment-based configuration. You can also use `AGL_MANAGED_STORE` if you do not want the execution strategy to wrap the store for you. An example is shown in [Debugging with External Store][debug-with-external-store]. Algorithms sometimes require heterogeneous computation resources, such as GPU accelerators, while runners sometimes require a specific environment to run because many agent frameworks are fragile in their dependencies. A role-based launch pattern helps you place the algorithm on a dedicated machine with more GPU memory, while runners can live on another machine with more flexible dependencies. This is possible via `AGL_CURRENT_ROLE="algorithm"` or `AGL_CURRENT_ROLE="runner"` environment variables. When running on different machines, you also need to set `AGL_SERVER_HOST` and `AGL_SERVER_PORT` to the IP address and port of the algorithm machine. You might recognize that this convention is very similar to `MASTER_ADDR` and `MASTER_PORT` in [PyTorch distributed training](https://docs.pytorch.org/docs/stable/notes/ddp.html). ### Launching Algorithm and Runner Roles on Separate Machines When you want to stretch the algorithm onto a GPU-rich machine and keep rollout workers close to the data source (or on machines with a more permissive dependency stack), launch the same training script in different terminals with role-specific environment variables. The client–server strategy will route each process to the right side of the queue as long as they share the same `AGL_SERVER_HOST`/`AGL_SERVER_PORT` pair. **1. Pick an address and port for the store.** Decide which machine will host the algorithm. Choose a TCP port that can be reached by the runner machines (for example, open it in your firewall configuration). In this example we will use `10.0.0.4:4747`. **2. Start the algorithm process.** On the machine that should run the algorithm, expose the store by binding to all network interfaces and mark the role as `algorithm`. ```bash export AGL_SERVER_HOST=0.0.0.0 export AGL_SERVER_PORT=4747 export AGL_CURRENT_ROLE=algorithm python train_calc_agent.py ``` Leaving `AGL_MANAGED_STORE` unset (or setting it to `1`) lets the strategy create the [`LightningStoreServer`][agentlightning.LightningStoreServer] for you. Otherwise, you can use the method in the previous section to create a store on your own. **3. Start rollout workers on remote machines.** Every runner machine should point to the algorithm host and declare itself as the `runner` role. You can start multiple processes per machine or repeat the command on additional hosts. ```bash export AGL_SERVER_HOST=10.0.0.4 export AGL_SERVER_PORT=4747 export AGL_CURRENT_ROLE=runner python train_calc_agent.py --n-runners 4 ``` The runner process automatically connects via [`LightningStoreClient`][agentlightning.LightningStoreClient]. Adjust `--n-runners` to spawn the desired number of worker processes on that machine. **4. Scale out as needed.** Repeat step 3 on as many machines as you need. When you are done, stop the algorithm process. However, since the runners are on different machines, the strategy WILL NOT send a cooperative stop signal to the connected runners. So you need to kill the runners on your own. This role-based launch mirrors what [`Trainer.fit`][agentlightning.Trainer.fit] does inside a single machine while letting you spread work across a fleet. Because every process shares the same training script, you keep a single source of truth for dataset loading, adapters, and tracers, but you can tune compute resources independently for the algorithm and rollout workers. ### Shared-memory Strategy [`SharedMemoryExecutionStrategy`][agentlightning.SharedMemoryExecutionStrategy] keeps everything inside one process. The runner runs on the main thread (by default) while the algorithm lives on a Python thread guarded by [`LightningStoreThreaded`][agentlightning.LightningStoreThreaded]. Use it when you want easier debugging with shared breakpoints and no serialization overhead, or minimal startup time for unit tests. It's not a good choice for many algorithms that require heavy model training because [`LightningStoreThreaded`][agentlightning.LightningStoreThreaded] does not work for multiprocessing. Using it with multiprocessing algorithms will lead to undefined behavior. Sample configuration: ```python trainer = agl.Trainer( algorithm=algorithm, strategy="shm", ) ``` You can further customize the init parameters of [`SharedMemoryExecutionStrategy`][agentlightning.SharedMemoryExecutionStrategy]. With `main_thread="runner"`, the runner occupies the main thread and `n_runners` must be `1`. The strategy respects `AGL_MANAGED_STORE`; set it to `0` to opt out of the `LightningStoreThreaded` wrapper. ## Parallelizing Algorithms Runner parallelism scales rollout throughput, but the algorithm loop remains a single-process loop inside the execution strategy. We understand that many algorithms have parallelization built in, but that's outside the parallelization scope of Agent-lightning. Agent-lightning strives to make algorithms’ own parallelization work well under our execution strategies. The biggest challenge turns out to come from the store. For example, [`VERL`][agentlightning.algorithm.verl.VERL] uses [Ray](https://www.ray.io/) and launches [FSDP](https://docs.pytorch.org/tutorials/intermediate/FSDP_tutorial.html) and [vLLM](https://vllm.ai/) components internally. [`ClientServerExecutionStrategy`][agentlightning.ClientServerExecutionStrategy] has to make sure that the server is not simultaneously serving in multiple processes or Ray workers, and that there is only one single authoritative source of truth for all subprocesses to connect to. Subprocesses connect to the store via a small [`LightningStoreClient`][agentlightning.LightningStoreClient] bundled within [`LightningStoreServer`][agentlightning.LightningStoreServer]. !!! note The [birds' eye view][birds-eye-view-client-server-strategy] illustrates how adapters, proxies, and stores interact when the algorithm spawns additional workers. Use that diagram as a checklist when introducing new distributed components. ## Parallelizing [`LightningStore`][agentlightning.LightningStore] By default, Agent-lightning persists rollouts and spans in an in-memory store. [`Trainer.fit`][agentlightning.Trainer.fit] spins it up automatically, or you can launch it yourself via the [`agl store` command](../reference/cli.md). [`InMemoryLightningStore`][agentlightning.InMemoryLightningStore] keeps all state inside the current process, which makes local iteration fast but introduces two production constraints: 1. Spans are evicted once the process crosses its memory cap, so long runs risk data loss unless the host has abundant RAM. 2. Although the store is well optimized via asynchronous programming, the store lives in a single process and remains bound by the GIL, preventing it from saturating multi-core machines. !!! note "General note for all server-client stores" If your algorithm and runners communicate through HTTP protocol (which should be the default for 99% of the cases), you need to ensure the file limit is sufficiently large to avoid the "Too many open files" error. You can set the file limit by running the following command: ```bash ulimit -n 100000 ``` For resilient runs, switch to a persistent backend such as [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore], which writes data to MongoDB instead of local RAM. Agent-lightning relies on [pymongo](https://pymongo.readthedocs.io/en/stable/) to interact with MongoDB, which can be installed via: ```bash pip install agentlightning[mongo] ``` To use the MongoDB store, you need to pass the MongoDB URI to the store constructor. The URI should be in the format of `mongodb://:/?replicaSet=`. ```python from agentlightning.store.mongo import MongoLightningStore trainer = agl.Trainer( algorithm=algorithm, store=MongoLightningStore(mongo_uri="mongodb://localhost:27017/?replicaSet=rs0"), ) ``` !!! tip "Setting up MongoDB" MongoDB is a popular document-oriented database. Before running Agent-lightning with [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore], make sure that you've already had a MongoDB instance running. Setting up can be conveniently done via Docker Compose via [compose.mongo.yml]({{ src("docker/compose.mongo.yml") }}). Unless targeting serious production use, we recommend creating the data folders and setting them to `777` permission to avoid permission issues. ```bash mkdir -p data/mongo-host chmod 777 data/mongo-host docker compose -f compose.mongo.yml up -d ``` Alternatively, you can also install MongoDB manually following the [official documentation](https://www.mongodb.com/docs/manual/installation/). If you installed MongoDB manually, an important note is that you need to ensure that the MongoDB instance has enabled replica set feature, since Agent-lightning uses the transactional operations internally. The simplest approach is to use the following script (executed in the MongoDB shell) to initialize the replica set: ```javascript rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "localhost:27017" }], }); ``` To scale out further, launch the store server via [`agl store --backend mongo`](../reference/cli.md) (see [Debugging with External Store][debug-with-external-store]). The CLI accepts `--n-workers`, which starts the server under `gunicorn` with multiple worker processes so concurrent runners can push and pull at higher throughput. This option applies only to persistent backends; an in-memory store, on the other hand, cannot be sharded across workers because its state lives inside one process. !!! note The `--n-workers` here is the number of worker processes for the store server, NOT related to the number of rollout runners. ## Increasing Throughput of LLM Proxy Agent-lightning includes an optional [`LLMProxy`][agentlightning.LLMProxy] that wraps [LiteLLM](https://docs.litellm.ai/) to provide a unified OpenAI-compatible endpoint for your agents. When rollout throughput increases, the proxy can become a bottleneck. You can scale it out using the same pattern as the store server. To increase proxy throughput, pass `num_workers` when constructing the proxy: ```python import agentlightning as agl proxy = agl.LLMProxy( port=4000, launch_mode="mp", # multiprocessing mode num_workers=4, # four gunicorn workers handle concurrent requests ) ``` You can also configure the proxy through [`Trainer`][agentlightning.Trainer]: ```python trainer = agl.Trainer( algorithm=algorithm, n_runners=8, # The runners here is the rollout runners, not related to LLM proxy replicas llm_proxy={"port": 4000, "num_workers": 4}, # launch mode is actually mp by default ) ``` When `num_workers > 1`, the launcher starts gunicorn with the specified number of worker processes. Each worker runs its own event loop, allowing the proxy to handle many concurrent LLM requests without being blocked by Python's GIL. !!! tip When using `mp` launch mode, [`LLMProxy`][agentlightning.LLMProxy] will start the server in a separate process. To make sure the proxy is still accessing the same store as the main process, you need to set the store to be [zero-copy compatible][store-capabilities], which means, either the store is a native zero-copy store like [`MongoLightningStore`][agentlightning.store.mongo.MongoLightningStore] or the store is wrapped via [`LightningStoreServer`][agentlightning.LightningStoreServer] or [`LightningStoreClient`][agentlightning.LightningStoreClient]. !!! note "Shared Server Infrastructure" Both [`LightningStoreServer`][agentlightning.LightningStoreServer] and [`LLMProxy`][agentlightning.LLMProxy] rely on a common utility called [`PythonServerLauncherArgs`][agentlightning.utils.server_launcher.PythonServerLauncherArgs]. This dataclass captures the settings needed to launch a FastAPI application: ```python from agentlightning.utils import PythonServerLauncherArgs args = PythonServerLauncherArgs( port=8000, host="0.0.0.0", n_workers=4, # spawn 4 gunicorn workers launch_mode="thread", # or "mp" for multiprocessing, "asyncio" for in-loop ) ``` Under the hood, [`PythonServerLauncher`][agentlightning.utils.server_launcher.PythonServerLauncher] reads these arguments and chooses between uvicorn (single worker) and gunicorn (multiple workers) automatically. ================================================ FILE: docs/tutorials/traces.md ================================================ # Working with Traces Tracing is the secret capability that lets Agent-lightning train almost any agent without rewriting its core logic. The idea was born in observability tooling inside LLMOps workflows and, in Agent-lightning, evolved into a first-class primitive inside the learning loop. Beyond helping you understand what happened inside a rollout, traces provide reward spans and other learning signals that power reinforcement learning and fine-tuning algorithms. ![OpenTelemetry spans](../assets/opentelemetry-trace.jpg) Agent-lightning stores every recorded operation as a [`Span`][agentlightning.Span] inside a [`LightningStore`][agentlightning.LightningStore]. The naming comes from [OpenTelemetry spans](https://opentelemetry.io/docs/concepts/signals/traces/), shown in the screenshot above. A span can represent an LLM call, a tool invocation, a graph edge, an explicit reward emission, or an arbitrary Python code block. Spans form a tree where parent spans describe higher-level steps and children record the detailed work. The sections below walk through how spans are produced and how to interpret them once they reach the store. ## Writing Spans Most [`Runner`][agentlightning.Runner] implementations wire a [`Tracer`][agentlightning.Tracer] into the agent’s lifecycle. The tracer is responsible for installing instrumentation, buffering OpenTelemetry spans, and committing them to the [`LightningStore`][agentlightning.LightningStore]. When a runner executes a rollout, it allocates a store-backed tracing context: ```python async with tracer.trace_context( name="my-rollout", store=store, rollout_id=rollout.rollout_id, attempt_id=attempt.attempt_id, ): await run_agent_logic() ``` The context manager then requests sequence numbers from the store, converts OpenTelemetry spans into [`Span`][agentlightning.Span] objects, and persists them in the middle or at the end of the attempt, depending on the tracer implementation. Agent-lightning ships two tracers out of the box; both rely on [OpenTelemetry Traces](https://opentelemetry.io/docs/concepts/signals/traces/) and ignore metrics or logs. !!! tip "What's instrumentation?" In simple terms, *instrumentation* means adding "patches" or hooks inside your code so you can observe what it’s doing while it runs. Think of it like putting flight recorders in an airplane — instrumentation records key actions, inputs, outputs, and timings without changing how the code behaves. In Agent-lightning tracers, this instrumentation automatically creates spans (small, structured records of work) that show what each part of an agent did, how long it took, and how different steps connect together. ### AgentOps Tracer [`AgentOpsTracer`][agentlightning.AgentOpsTracer] will be the default tracer when [`Trainer`][agentlightning.Trainer] is used but no tracer is explicitly specified. It bootstraps the [AgentOps SDK](https://www.agentops.ai/) locally, installs the supplied instrumentation hooks (LangChain, LangGraph, LiteLLM, FastAPI, and others) provided by the [AgentOps Python SDK](https://github.com/AgentOps-AI/agentops), and forwards everything through a local OpenTelemetry [`TracerProvider`](https://opentelemetry.io/docs/specs/otel/trace/api/). [`AgentOpsTracer`][agentlightning.AgentOpsTracer] never calls the hosted AgentOps service; instead, it attaches a `LightningSpanProcessor` implemented by the Agent-lightning team so that spans are captured and shipped straight into the store. Because it shares the AgentOps instrumentation surface, any framework supported by AgentOps automatically gains tracing in Agent-lightning. We layer additional hooks on top of AgentOps to capture features that the SDK misses today: 1. Certain providers emit extra metadata — for example, [token IDs returned by vLLM](../deep-dive/serving-llm.md) — that are not recorded by the stock SDK. We augment those spans with the missing payloads. 2. AgentOps constructs parent-child relationships on a best-effort basis, but mixed instrumentation (for example, OpenAI Agent SDK alongside direct OpenAI Chat Completion calls) can leave segments disconnected. Our implementation (actually implemented in the [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] adapter) repairs those relationships when the hierarchy can be inferred from rollout context. 3. Some versions of downstream frameworks simply do not emit spans for critical events (LangGraph node entrances are a common example). The tracer installs lightweight shims so those spans appear consistently. If a vendor integration behaves unexpectedly, users are encouraged to combine the tracer with [Hooks](./debug.md) to inspect the raw spans or diagnostics, and/or implement a specialized tracer for the framework in question. ### OpenTelemetry Tracer [`OtelTracer`][agentlightning.OtelTracer] is a minimal implementation that initializes a vanilla [`TracerProvider`](https://opentelemetry.io/docs/specs/otel/trace/api/) and gives you direct control over span creation through the standard `opentelemetry.trace` API. Use it when you already have explicit instrumentation in your agent, when the AgentOps SDK does not support your framework, or when you want to emit custom spans from business logic. !!! note [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) is a typical example with built-in OpenTelemetry support. Once you set `OBSERVABILITY_SETTINGS.enable_otel = True`, the framework will automatically emit OpenTelemetry spans, and [`OtelTracer`][agentlightning.OtelTracer] will be able to capture them. No extra instrumentation is needed. Inside your agent you can call `opentelemetry.trace.get_trace_provider().get_tracer("my-agent")` and use that tracer to [create spans](https://opentelemetry.io/docs/languages/python/cookbook/) exactly as you would in any OpenTelemetry application. The Lightning span processor attached by [`OtelTracer`][agentlightning.OtelTracer] guarantees that every span is sequenced, converted, and written to the store. The same applies for emitted rewards ([`emit_reward`][agentlightning.emit_reward]) and other emitter signals, which are just a special case of manually-created spans. ### Weave Tracer (Experimental) [`WeaveTracer`][agentlightning.tracer.weave.WeaveTracer] is an experimental tracer that integrates with the [Weave Python SDK](https://docs.wandb.ai/weave). Use it as a substitute for [`AgentOpsTracer`][agentlightning.AgentOpsTracer] when the AgentOps SDK does not fit your environment. The Weave SDK instruments LLM calls and agent libraries directly. Unlike [`AgentOpsTracer`][agentlightning.AgentOpsTracer], Weave does not rely on OpenTelemetry to export spans; it routes everything through a dedicated Weave Trace Server. Agent-lightning implements a custom Weave Trace Server so every call captured by the Weave SDK can be persisted to the [`LightningStore`][agentlightning.LightningStore]. !!! warning [`WeaveTracer`][agentlightning.tracer.weave.WeaveTracer] remains experimental and has not been tested as thoroughly as [`AgentOpsTracer`][agentlightning.AgentOpsTracer]. It may conflict with libraries that ship OpenTelemetry instrumentation by default (for example, LiteLLM-based LLM proxies). Use the tracer with caution and report any issues to the Agent-lightning team. ### LLM Proxy Sometimes the runner can’t observe the agent directly — because it’s in another language or running remotely. [`LLMProxy`][agentlightning.LLMProxy] bridges that gap by instrumenting the server side of LLM calls. It wraps [LiteLLM](https://docs.litellm.ai/) and adds middleware that accepts prefixed routes like `/rollout/{rid}/attempt/{aid}/v1/chat/completions`. Before forwarding, the middleware rewrites the path to `/v1/chat/completions`, fetches a monotonic `sequence_id` from the `LightningStore`, injects `x-rollout-id`, `x-attempt-id`, and `x-sequence-id` into the request headers, and then forwards the request to the backend LLM endpoint. LiteLLM produces OpenTelemetry spans for the request/response. A custom `LightningSpanExporter` reads the rollout/attempt/sequence identifiers from the recorded request headers and persists each span to the store. Because the `sequence_id` is allocated at the start of the request, traces stay in strict order even across machines with skewed clocks or asynchronous responses. ```mermaid sequenceDiagram participant Agent participant Proxy as LLM Proxy participant Backend as LLM Backend participant Store as LightningStore Agent->>Proxy: POST /rollout/{rid}/attempt/{aid}/v1/chat/completions Proxy->>Store: get_next_span_sequence_id(rid, aid) Store-->>Proxy: sequence_id Proxy->>Backend: Forward /v1/chat/completions
(headers: rid, aid, sid) Backend-->>Proxy: Response (tokens, usage, token_ids) Proxy->>Store: Export OTEL spans (rid, aid, sequence_id) Proxy-->>Agent: OpenAI-compatible response ``` [`LLMProxy`][agentlightning.LLMProxy] actually provides more functionalities than just the middleware for tracing. Read [Serving LLM](../deep-dive/serving-llm.md) for more details. [](){ #distributed-tracing } !!! note "Distributed Tracing" Agent-lightning enforces deterministic span ordering by assigning a monotonic [`sequence_id`][agentlightning.Span.sequence_id] to every span within an attempt. Before calling [`LightningStore.add_span`][agentlightning.LightningStore.add_span] or [`LightningStore.add_otel_span`][agentlightning.LightningStore.add_otel_span], tracers are expected to call [`LightningStore.get_next_span_sequence_id`][agentlightning.LightningStore.get_next_span_sequence_id] to get the next sequence id. This removes clock skew and merges spans produced on different machines or threads. If you implement a custom tracer or exporter, make sure you do this (or respect the one provided in headers by components such as [`LLMProxy`][agentlightning.LLMProxy]); otherwise, adapters will struggle to properly reconstruct the execution tree. ### Custom Tracer If none of the built-in tracers fit your environment, the first option to consider is to [return the spans](./write-agents.md) directly from your agent implementation. If that's not possible, or you want to support multiple agents in a unified effort, you can implement your own tracer by subclassing [`Tracer`][agentlightning.Tracer]. Custom tracers must implement at least [`trace_context`][agentlightning.Tracer.trace_context]. The [`trace_context`][agentlightning.Tracer.trace_context] coroutine should install or activate whatever instrumentation you need, then yield a span processor that ultimately adds spans to the store. You can reuse the `LightningSpanProcessor` if you produce OpenTelemetry `ReadableSpan` objects, or call [`LightningStore.add_span`][agentlightning.LightningStore.add_span] directly if you generate [`Span`][agentlightning.Span] instances yourself. Advanced tracers often run auxiliary services (for example, starting a telemetry daemon or attaching to a container runtime) inside `init_worker` and tear them down in `teardown_worker`. The [`ParallelWorkerBase`][agentlightning.ParallelWorkerBase] lifecycle that `Tracer` inherits from ensures those hooks are executed in every runner subprocess. ## Reading Traces Generally, there are two approaches to reading traces. When you only need a quick look, [`Tracer.get_last_trace`][agentlightning.Tracer.get_last_trace] returns the raw OpenTelemetry spans captured most recently. For historical analysis, use the [`LightningStore.query_spans`][agentlightning.LightningStore.query_spans] API, which yields normalized [`Span`][agentlightning.Span] objects keyed by rollout ID and attempt ID. Combine those queries with [`LightningStore.query_rollouts`][agentlightning.LightningStore.query_rollouts] to align spans with rollout status, retries, and timing information. Spans arrive asynchronously, originate from different processes, and form hierarchies rather than simple lists. The attributes of each span are tedious and unfriendly to human readers. This combination makes raw traces time-consuming to inspect, especially when you only care about specific signals such as rewards, LLM prompts, responses, or tool outputs. Understanding how the store exposes traces and how adapters reshape them will save hours when debugging or training. !!! note "Why traces can be difficult to read?" The trace tree for a single rollout typically mixes multiple abstraction layers: a planner span may contain several LLM spans, each of which contains tool execution spans that can themselves trigger nested agent invocations. There are also instrumentations at different levels. For example, when a request delegates to another library (e.g., from LangChain to OpenAI), two libraries might emit spans for the same request. At the top level, there could be concurrently running agents that may flush spans slightly out of order. Sorting by `sequence_id` restores the chronological view, but interpreting the tree requires additional context about parent-child relationships and rollout metadata. ### Adapter [Adapters][agentlightning.Adapter] transform lists of spans into higher-level data structures that training algorithms can consume directly. Agent-lightning provides several adapters out of the box: * [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] converts spans into `(prompt, response, reward)` triplets, which power reinforcement-learning algorithms such as [VERL](../algorithm-zoo/verl.md) and connect trace data to gradient updates. * [`TraceToMessages`][agentlightning.TraceToMessages] rewrites spans into OpenAI chat message JSON suitable for supervised fine-tuning or evaluation harnesses. * [`LlmProxyTraceToTriplet`][agentlightning.LlmProxyTraceToTriplet] mirrors [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] but understands spans emitted by [LLMProxy][agentlightning.LLMProxy]. It is experimental and might be merged with [`TracerTraceToTriplet`][agentlightning.TracerTraceToTriplet] in the future. Adapters are regular Python callable instances, so you can plug them into [`Trainer`][agentlightning.Trainer] via the `adapter` argument, or call them manually during exploration. When used in [`Trainer`][agentlightning.Trainer], adapters are bundled into the [`Algorithm`][agentlightning.Algorithm] before the algorithm runs, through the [`Algorithm.set_adapter`][agentlightning.Algorithm.set_adapter] method. You can also customize an [`Adapter`][agentlightning.Adapter] by extending the implementations above or subclassing the base class. If you need a bespoke format, subclass [`TraceAdapter`][agentlightning.TraceAdapter] (for store spans) or [`OtelTraceAdapter`][agentlightning.OtelTraceAdapter] (for raw OpenTelemetry spans) and implement `adapt` (these two classes can usually share the same implementation). ### Reading Rewards Rewards are recorded as dedicated spans named [`agentlightning.annotation`][agentlightning.semconv.AGL_ANNOTATION]. Emitting a reward through [`emit_reward`][agentlightning.emit_reward] or [`emit_annotation`][agentlightning.emit_annotation] ensures the value is stored in the span’s `attributes`. To audit rewards, fetch spans from the store and use the helper utilities in [`agentlightning.emitter`](../reference/agent.md): ```python from agentlightning.emitter import find_final_reward spans = await store.query_spans(rollout_id) reward = find_final_reward(spans) print(f"Final reward: {reward}") ``` [`find_reward_spans`][agentlightning.find_reward_spans] returns every reward span so you can visualize intermediate shaping signals, while [`find_final_reward`][agentlightning.find_final_reward] extracts the last non-null reward per attempt. While these helpers are convenient, they may not help you fully understand the chronological or hierarchical relationships between reward spans and other spans. Using an [`Adapter`][agentlightning.Adapter] — especially the same one used in the algorithm you’re working with — remains the recommended way to inspect your generated spans. ================================================ FILE: docs/tutorials/write-agents.md ================================================ # Writing Agents This tutorial will focus on the heart of the system: the agent itself, guiding you through the different ways to define an agent's logic in Agent-lightning. The basic requirements for any agent are: 1. It must accept a single **task** as input. 2. It must accept a set of tunable **resources** (like a [PromptTemplate][agentlightning.PromptTemplate] or [LLM][agentlightning.LLM]). 3. It must **emit** trace span data so that algorithms can understand its behavior and learn from it. *The simplest way to do this is by returning a final reward.* In practice, please also bear in mind that tasks, resources, and spans have extra requirements, in order to make it *trainable* within Agent-lightning: 1. You will need a training dataset containing a set of tasks, of the same type that your agent expects as input. 2. The tunable resources are related to the algorithm. For example, the APO algorithm we've seen tunes a [PromptTemplate][agentlightning.PromptTemplate]. Other algorithms might tune model weights or other configurations. 3. The type of spans an algorithm can use varies. Almost all algorithms support a single, final reward span at the end of a rollout. However, not all algorithms support rewards emitted mid-rollout, let alone other kinds of spans like exceptions or log messages. This tutorial will show you how to write an agent that can handle various tasks and resources and emit all kinds of spans. However, you should understand that agents and algorithms are often co-designed. Supporting new types of resources or spans in an algorithm is often much more complex than just adding them to an agent. ## [`@rollout`][agentlightning.rollout] Decorator The simplest way to create an agent is by writing a standard Python function and marking it with the [@rollout][agentlightning.rollout] decorator. This approach is perfect for agents with straightforward logic that doesn't require complex state management. Agent-lightning automatically inspects your function's signature and injects the required resources. For example, if your function has a parameter named `prompt_template`, Agent-lightning will find the [PromptTemplate][agentlightning.PromptTemplate] resource for the current rollout and pass it in. Let's revisit the `room_selector` agent from the first tutorial: ```python from typing import TypedDict from agentlightning import PromptTemplate, rollout # Define a data structure for the task input class RoomSelectionTask(TypedDict): # ... fields for the task ... pass @rollout def room_selector(task: RoomSelectionTask, prompt_template: PromptTemplate) -> float: # 1. Use the injected prompt_template to format the input for the LLM prompt = prompt_template.format(**task) # 2. Execute the agent's logic (e.g., call an LLM, use tools) # ... # 3. Grade the final choice to get a reward reward = room_selection_grader(final_message, task["expected_choice"]) # 4. Return the final reward as a float return reward ``` When you train this agent, the dataset is expected to be a list of `RoomSelectionTask` objects: ```python from agentlightning import Dataset, Trainer dataset: Dataset[RoomSelectionTask] = [ RoomSelectionTask(date="2025-10-15", time="10:00", duration_min=60, attendees=10), RoomSelectionTask(date="2025-10-16", time="10:00", duration_min=60, attendees=10), ] Trainer().fit(agent=room_selector, train_dataset=dataset) ``` Behind the scenes, the [`@rollout`][agentlightning.rollout] decorator wraps your function in a `FunctionalLitAgent` object, which is a subclass of [LitAgent][agentlightning.LitAgent] introduced below, making it compatible with the [Trainer][agentlightning.Trainer] and [Runner][agentlightning.Runner]. It supports parameters like `task`, `prompt_template`, `llm`, and `rollout`, giving you flexible access to the execution context. Here is another example with more advanced usage with `llm` and `rollout` as parameters. The `llm` parameter gives you an OpenAI-compatible LLM endpoint to interact with, which can be tuned under the hood by algorithms. The `rollout` parameter gives you the full [Rollout][agentlightning.Rollout] object, which contains the rollout ID, rollout mode (training or validation), etc. ```python from openai import OpenAI from agentlightning import LLM, Rollout class FlightBookingTask(TypedDict): request: str expected_booking: dict @rollout def flight_assistant(task: FlightBookingTask, llm: LLM, rollout: Rollout) -> float: print(f"Rollout ID: {rollout.rollout_id}") print(f"Rollout Mode: {rollout.mode}") # Use the tuned LLM resource to create an OpenAI client client = OpenAI( # This endpoint could be a proxy to a proxy to a proxy ... # It could be different every time `flight_assistant` is called # But it should be OpenAI-API compatible base_url=llm.endpoint, # Use a dummy key if not provided # Usually this does not matter because the training LLM is often not guarded by an API key # But you can use `or os.environ["OPENAI_API_KEY"]` to make the function compatible with 3rd-party LLMs api_key=llm.api_key or "dummy-key", ) # Make an API call with the specified model response = client.chat.completions.create( model=llm.model, messages=[{"role": "user", "content": task["request"]}], ) # Whether the API supports features like streaming, tool calls, etc. depends on # the endpoint that algorithms are serving to you. final_message = response.choices[0].message.content # Grade the result and return a reward reward = grade_flight_booking(final_message, task["expected_booking"]) return reward ``` ## Return Values from Agents The value your agent function returns (i.e., the return value of the function decorated by [`@rollout`][agentlightning.rollout]) is crucial, as it's the primary way to report the outcome of a rollout. Agent-lightning supports several return types to accommodate different scenarios, from simple rewards to detailed, custom traces. * **`float`**: This is the simplest and most common return type. The `float` is treated as the **final reward** for the entire rollout. Agent-lightning automatically creates a final reward span based on this value. * **`None`**: Returning `None` tells the runner that trace collection is being handled entirely by the [Tracer][agentlightning.Tracer] through auto-instrumentation (e.g., via AgentOps). In this case, the runner will simply retrieve the spans that the tracer has already captured. !!! important "Emitting the Final Reward" When returning `None`, you must still ensure a final reward is logged. You can do this by using the [`emit_reward`][agentlightning.emit_reward] function (covered in the [Use Emitters](./emitter.md) documentation). Wrapping your reward calculation function with the `@reward` decorator is NOT the recommended approach any more. * **`list[ReadableSpan]`**, **`list[SpanCoreFields]`**, or **`list[Span]`**: For advanced use cases, you can manually construct and return a complete list of all spans for the rollout. This gives you full control over the trace data. You can return either a list of OpenTelemetry `ReadableSpan` objects or Agent-lightning's native `Span` objects. For most users, returning a **`float`** for simple agents or returning **`None`** and using the emitter for more complex ones are the recommended approaches. ## Class-based Agents For more complex agents that require state, helper methods, or distinct logic for training versus validation, you can create a class that inherits from [`LitAgent`][agentlightning.LitAgent]. This object-oriented approach provides more structure and control over the agent's lifecycle. To create a class-based agent, you subclass [agentlightning.LitAgent][] and implement its [`rollout`][agentlightning.LitAgent.rollout] method. [](){ #introduction-to-named-resources } Here's how the `room_selector` could be implemented as a class. The rollout method has a slightly different signature than the function-based agent, mainly in how it handles the resources. Putting it simply, algorithms do not just send a [PromptTemplate][agentlightning.PromptTemplate] to the agents, they instead send [NamedResources][agentlightning.NamedResources], which is a mapping from resource key to [Resource][agentlightning.Resource]. This design is to allow for more advanced features like multi-resource tuning. With [`@rollout`][agentlightning.rollout] decorator, the resource with correctly matched type will be automatically injected into the rollout method. However, when you use a class-based agent, you need to manually access the resource from the `resources` dictionary. Built-in algorithms listed their resource key naming conventions [here](../algorithm-zoo/index.md). ```python import agentlightning as agl class RoomSelectorAgent(agl.LitAgent[RoomSelectionTask]): def rollout(self, task: RoomSelectionTask, resources: agl.NamedResources, rollout: agl.Rollout) -> float: # 1. Access the prompt_template from the resources dictionary prompt_template = resources["prompt_template"] # 2. Execute the agent's logic prompt = prompt_template.format(**task) # ... # 3. Grade the final choice reward = room_selection_grader(final_message, task["expected_choice"]) # 4. Return the final reward return reward # To use it with the trainer: # agent = RoomSelectorAgent() # trainer.fit(agent=agent, ...) ``` The [`LitAgent`][agentlightning.LitAgent] class provides several methods you can override for more fine-grained control: * [`rollout()`][agentlightning.LitAgent.rollout]: The primary method for the agent's logic. It's called for both training and validation by default. * [`training_rollout()`][agentlightning.LitAgent.training_rollout] / [`validation_rollout()`][agentlightning.LitAgent.validation_rollout]: Implement these if you need different behavior during training (e.g., with exploration) and validation (e.g., with deterministic choices). * [`rollout_async()`][agentlightning.LitAgent.rollout_async] / [`training_rollout_async()`][agentlightning.LitAgent.training_rollout_async] / [`validation_rollout_async()`][agentlightning.LitAgent.validation_rollout_async]: Implement the asynchronous versions of these methods if your agent uses `asyncio`. !!! note Rollout is always executed in an asynchronous context no matter whether the agent is asynchronous or synchronous. If your synchronous agent contains some `asyncio.run()` calls, it might raise an error that there is already an event loop running. To avoid blocking the event loop, it's recommended to offload the inner async operations to a separate thread. Here is a sample code: ```python import asyncio import queue import threading def run_sync_ephemeral(coro) -> Any: """ Run an async coroutine from sync code. - If no loop in this thread: use asyncio.run() directly. - If already in an event loop: spawn a worker thread that calls asyncio.run() (which creates and closes a brand-new event loop per call). """ try: asyncio.get_running_loop() except RuntimeError: # No running loop in this thread; safe to use asyncio.run return asyncio.run(coro) # Already in a running loop -> execute in a worker thread q = queue.Queue[Any]() def worker(): try: result = asyncio.run(coro) # creates & closes its own loop q.put((True, result)) except BaseException as e: q.put((False, e)) t = threading.Thread(target=worker, daemon=True) t.start() ok, payload = q.get() t.join() if ok: return payload raise payload ``` ================================================ FILE: examples/.gitignore ================================================ data/ wandb/ outputs/ checkpoints/ calc-x-data.zip spider-data.zip claude_code/logs/ agentops.log unsloth/models/ unsloth/unsloth_compiled_cache/ unsloth/unsloth_training_checkpoints/ apo/pomltrace/ tinker/logs/ tinker/crewai_*.html rag/dataset_tiny.parquet rag/chunks_candidate_tiny.pkl rag/index_hnsw_faiss_n32e40_tiny.index ================================================ FILE: examples/README.md ================================================ # ⚡ Examples Catalog This catalog highlights the examples shipped with Agent-lightning. Community-contributed examples and recipes are available in the [contrib](../contrib) directory. | Example | Description | CI Maintenance | |---------|-------------|----------------| | [apo](./apo) | Automatic Prompt Optimization tutorials covering built-in, custom, and debugging workflows. | [![apo workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-apo.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-apo.yml) | | [azure](./azure) | Supervised fine-tuning with Azure OpenAI. | [![azure workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-azure.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-azure.yml) | | [calc_x](./calc_x) | VERL-powered math reasoning agent training that uses AutoGen with an MCP calculator tool. | [![calc_x workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-calc-x.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-calc-x.yml) | | [chartqa](./chartqa) | Vision-language ChartQA agent that reasons over charts with LangGraph and VERL plus multi-step self-refinement. | [![chartqa workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-chartqa.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-chartqa.yml) | | [claude_code](./claude_code) | Claude Code SWE-bench harness that records Agent-lightning traces across Anthropic, vLLM, and OpenAI-compatible backends. | [![claude_code workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-claude-code.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-claude-code.yml) | | [minimal](./minimal) | Bite-sized programs that demonstrate how individual Agent-lightning building blocks behave in isolation. | [![minimal workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unit.yml) | | [rag](./rag) | Retrieval-Augmented Generation pipeline targeting the MuSiQue dataset with Wikipedia retrieval. | [![rag workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-rag.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-rag.yml) | | [spider](./spider) | Text-to-SQL reinforcement learning training on the Spider dataset using LangGraph. | [![spider workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-spider.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-spider.yml) | | [tinker](./tinker) | Reinforcement learning with Tinker as the backend training service. | [![tinker workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-tinker.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-tinker.yml) | | [unsloth](./unsloth) | Supervised fine-tuning example powered by Unsloth with 4-bit quantization and LoRA. | [![unsloth workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-unsloth.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-unsloth.yml) | ## `examples-*` workflow status CI status above avoids taking any workflow running with latest dependencies into account. That's why we reference the corresponding `badge-*` workflows instead. The following table displays the raw `examples-*` workflow status whenever the project is maintained by CI. | Workflow | Status | |----------|--------| | `examples-apo.yml` | [![examples-apo workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-apo.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-apo.yml) | | `examples-azure.yml` | [![examples-azure workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-azure.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-azure.yml) | | `examples-calc-x.yml` | [![examples-calc-x workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-calc-x.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-calc-x.yml) | | `examples-chartqa.yml` | [![examples-chartqa workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-chartqa.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-chartqa.yml) | | `examples-claude-code.yml` | [![examples-claude-code workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-claude-code.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-claude-code.yml) | | `examples-compat.yml` | [![examples-compat workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-compat.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-compat.yml) | | `examples-rag.yml` | [![examples-rag workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-rag.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-rag.yml) | | `examples-spider.yml` | [![examples-spider workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-spider.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-spider.yml) | | `examples-tinker.yml` | [![examples-tinker workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-tinker.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-tinker.yml) | | `examples-unsloth.yml` | [![examples-unsloth workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-unsloth.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-unsloth.yml) | ================================================ FILE: examples/apo/README.md ================================================ # APO Example [![apo CI status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-apo.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-apo.yml) This example folder contains three complementary tutorials that demonstrate different aspects of Agent-Lightning. It's compatible with Agent-lightning v0.2 or later. ## Overview The folder showcases three distinct use cases: using the built-in APO algorithm to train a room selection agent, creating custom training algorithms from scratch, and debugging agents effectively. Each tutorial is self-contained and demonstrates a specific workflow. ## Requirements Follow the [installation guide](../../docs/tutorials/installation.md) to install Agent-Lightning and APO-extra dependencies. All examples also require an OpenAI-compatible API service. ## Included Files | File/Directory | Description | |----------------|-------------| | `room_selector.py` | Room booking agent implementation using function calling | | `room_selector_apo.py` | Training script using the built-in APO algorithm to optimize prompts | | `room_tasks.jsonl` | Dataset with room booking scenarios and expected selections | | `apo_custom_algorithm.py` | Tutorial on creating custom algorithms (runnable as algo or runner) | | `apo_custom_algorithm_trainer.py` | Shows how to integrate custom algorithms into the Trainer | | `apo_debug.py` | Tutorial demonstrating various agent debugging techniques | | `legacy_apo_client.py` | Deprecated APO client implementation compatible with Agent-lightning v0.1.x | | `legacy_apo_server.py` | Deprecated APO server implementation compatible with Agent-lightning v0.1.x | ## Sample 1: Using Built-in APO Algorithm The `room_selector_apo.py` script demonstrates how to use Agent-Lightning's built-in APO (Asynchronous Prompt Optimization) algorithm to train a room booking agent. The agent learns to select meeting rooms based on duration, attendee count, equipment needs, accessibility requirements, and availability. Run the training with: ```bash python room_selector_apo.py ``` This script initializes the APO algorithm with beam search parameters, loads the room booking dataset, and optimizes the agent's prompt template through iterative training. The algorithm automatically manages the training loop, gradient computation, and prompt updates. Read more about this example in [Train the First Agent with APO](../../docs/how-to/train-first-agent.md). ## Sample 2: Creating Custom Algorithms The `apo_custom_algorithm.py` and `apo_custom_algorithm_trainer.py` files teach you how to implement custom training algorithms from scratch. This is useful when the built-in algorithms don't fit your specific needs. See [Custom Algorithm tutorial](../../docs/how-to/write-first-algorithm.md) for more details. ### Option A: Run algorithm and runner separately Start the store, algorithm, and runner in three separate terminals: ```bash # Terminal 1: Start the store agl store # Terminal 2: Run the algorithm python apo_custom_algorithm.py algo # Terminal 3: Run the rollout runner python apo_custom_algorithm.py runner ``` ### Option B: Run integrated version Use the integrated trainer that handles all components: ```bash python apo_custom_algorithm_trainer.py ``` ## Sample 3: Debugging Agents The `apo_debug.py` script demonstrates multiple approaches to debugging agents in Agent-Lightning: ```bash python apo_debug.py ``` Read more about this example in [Debugging Agents](../../docs/tutorials/debug.md). ## Appendix: Dataset Format The `room_tasks.jsonl` file contains meeting scenarios with the following structure: ```json { "id": "s01", "task_input": { "date": "2025-10-13", "time": "16:30", "duration_min": 30, "attendees": 12, "needs": ["projector", "confphone"], "accessible_required": true }, "expected_choice": "Nova" } ``` ================================================ FILE: examples/apo/apo_custom_algorithm.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This sample code shows how to run a custom algorithm and rollout runner separately. You can run this in two modes: 1. Algorithm mode - runs the optimization algorithm: ```bash python apo_custom_algorithm.py algo ``` 2. Runner mode - runs the rollout runner: ```bash python apo_custom_algorithm.py runner ``` To use both together, you need to run them in parallel along with the store: ```bash agl store python apo_custom_algorithm.py algo python apo_custom_algorithm.py runner ``` Or use the integrated version in `apo_custom_algorithm_trainer.py`: ```bash python apo_custom_algorithm_trainer.py ``` """ import argparse import asyncio from typing import Optional, Sequence from openai import AsyncOpenAI from rich.console import Console import agentlightning as agl console = Console() async def apo_algorithm(*, store: agl.LightningStore): """ An example of how a prompt optimization works. """ prompt_candidates = [ "You are a helpful assistant. {any_question}", "You are a knowledgeable AI. {any_question}", "You are a friendly chatbot. {any_question}", ] prompt_and_rewards: list[tuple[str, float]] = [] algo_marker = "[bold red][Algo][/bold red]" for prompt in prompt_candidates: # 1. The optimization algorithm updates the prompt template console.print(f"\n{algo_marker} Updating prompt template to: '{prompt}'") resources: agl.NamedResources = { # The "main_prompt" can be replaced with any name you like # As long as the PromptTemplate type is used, the rollout function will recognize it "main_prompt": agl.PromptTemplate(template=prompt, engine="f-string") } # How the resource is used fully depends on the client implementation. await store.add_resources(resources) # 2. The algorithm queues up a task from a dataset console.print(f"{algo_marker} Queuing task for clients...") rollout = await store.enqueue_rollout( input="Explain why the sky appears blue using principles of light scattering in 100 words.", mode="train" ) console.print(f"{algo_marker} Task '{rollout.rollout_id}' is now available for clients.") # 3. The algorithm waits for clients to process the task for _ in range(30): # Wait for at most 30 seconds rollouts = await store.wait_for_rollouts(rollout_ids=[rollout.rollout_id], timeout=0.01) if rollouts: break await asyncio.sleep(1.0) else: raise RuntimeError("Expected a completed rollout from the client, but got none.") console.print(f"{algo_marker} Received Result: {rollouts[0]}") if rollouts[0].status != "succeeded": raise RuntimeError(f"Rollout {rollout.rollout_id} did not succeed. Status: {rollouts[0].status}") spans = await store.query_spans(rollout.rollout_id) # Logs LLM spans for debugging and inspection here await log_llm_span(spans) # 4. The algorithm records the final reward for sorting final_reward = agl.find_final_reward(spans) assert final_reward is not None, "Expected a final reward from the client." console.print(f"{algo_marker} Final reward: {final_reward}") prompt_and_rewards.append((prompt, final_reward)) console.print(f"\n[bold red][Algo][/bold red] All prompts and their rewards: {prompt_and_rewards}") best_prompt = max(prompt_and_rewards, key=lambda x: x[1]) console.print(f"[bold red][Algo][/bold red] Best prompt found: '{best_prompt[0]}' with reward {best_prompt[1]}") @agl.rollout async def apo_rollout(task: str, prompt_template: agl.PromptTemplate) -> float: # This relies on a public OpenAI service client = AsyncOpenAI() result = await client.chat.completions.create( model="gpt-4.1-nano", messages=[ {"role": "user", "content": prompt_template.format(any_question=task)}, ], ) text = result.choices[0].message.content console.print(f"[bold yellow][Rollout][/bold yellow] LLM returned: {text}") return await llm_judge(task, text) async def log_llm_span(spans: Sequence[agl.Span]) -> None: """Logs the LLM related spans that records prompts and responses.""" for span in spans: if "chat.completion" in span.name: console.print(f"[bold green][LLM][/bold green] Span {span.span_id} ({span.name}): {span.attributes}") async def llm_judge(task: str, output: Optional[str]) -> float: client = AsyncOpenAI() judge_prompt = f"""Evaluate how well the output fulfills the task. Task: {task} Output: {output} You must be very critical and strict in your evaluation. Return only a number between 0 and 1. No text, punctuation, or explanation.""" result = await client.chat.completions.create( model="gpt-4.1-nano", messages=[ {"role": "user", "content": judge_prompt}, ], temperature=0.0, ) try: content = result.choices[0].message.content if content is None: console.print(f"[bold blue][Judge][/bold blue] Judge returned no content: {result}") return 0.0 score = float(content) console.print(f"[bold blue][Judge][/bold blue] Judge returned score: {score}") return score except ValueError: console.print(f"[bold blue][Judge][/bold blue] Error evaluating output: {result}") return 0.0 async def apo_runner(*, store: agl.LightningStore): """ A runner that iteratively receives new rollout tasks from the store and executes them. """ runner = agl.LitAgentRunner[str](tracer=agl.AgentOpsTracer()) with runner.run_context(agent=apo_rollout, store=store): await runner.iter() async def main(): store = agl.LightningStoreClient("http://localhost:4747") parser = argparse.ArgumentParser(description="Run APO custom algorithm in different modes") parser.add_argument( "mode", choices=["algo", "runner"], help="Mode to run: 'algo' for algorithm or 'runner' for rollout runner" ) args = parser.parse_args() try: if args.mode == "algo": # Run the algorithm mode await apo_algorithm(store=store) elif args.mode == "runner": # Run the runner mode await apo_runner(store=store) finally: await store.close() if __name__ == "__main__": agl.setup_logging() asyncio.run(main()) ================================================ FILE: examples/apo/apo_custom_algorithm_trainer.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This sample code shows how to integrate a custom algorithm into trainer, so that you can run it with one command: ```bash python apo_custom_algorithm_trainer.py ``` This is equivalent to the following three commands in parallel: ```bash agl store python apo_custom_algorithm.py algo python apo_custom_algorithm.py runner ``` """ from apo_custom_algorithm import apo_algorithm, apo_rollout from rich.console import Console from agentlightning import Trainer, setup_logging from agentlightning.algorithm import algo from agentlightning.store import LightningStore console = Console() @algo async def apo_algorithm_usable_in_trainer(*, store: LightningStore): """ You need to wrap the apo_algorithm in an algo decorator to make it usable in trainer. This is equivalent to the following: apo_algorithm_usable_in_trainer = algo(apo_algorithm) """ return await apo_algorithm(store=store) if __name__ == "__main__": setup_logging() trainer = Trainer(n_workers=1, algorithm=apo_algorithm_usable_in_trainer) trainer.fit(apo_rollout) ================================================ FILE: examples/apo/apo_debug.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This example code illustrates several approaches to debugging an agent in agent-lightning.""" import argparse import asyncio from typing import cast from apo_custom_algorithm import apo_rollout from agentlightning import Trainer, setup_logging from agentlightning.litagent import LitAgent from agentlightning.runner import LitAgentRunner from agentlightning.store import InMemoryLightningStore from agentlightning.tracer import AgentOpsTracer, OtelTracer from agentlightning.types import Dataset, Hook, PromptTemplate, Rollout async def debug_with_runner(): """This approach requires no dataset, no trainer, and no algorithm. It only needs a runner and you can run get full control of the runner. However, you need to manually create other components like tracer and store, because trainer does not exist and it will not create for you. """ # You need to manually create a tracer here because the runner will not create for you currently. # Tracer is used to record the events (spans) in background during the agent's execution. # If you don't need any tracing functionality yet, you can use a dummy OtelTracer. tracer = OtelTracer() runner = LitAgentRunner[str](tracer) # You also need a store here to store the data collected. store = InMemoryLightningStore() # This is what needs to be tuned (i.e., prompt template) resource = PromptTemplate(template="You are a helpful assistant. {any_question}", engine="f-string") # The agent here must be the same agent that will be used in the real run. with runner.run_context(agent=apo_rollout, store=store): await runner.step( "Explain why the sky appears blue using principles of light scattering in 100 words.", resources={"main_prompt": resource}, ) async def debug_with_hooks(): """This approach also uses Runner, but allows you to hook into the runner's lifecycle events. We use an AgentOpsTracer here so that the tracing is non-empty. """ tracer = AgentOpsTracer() # The rest part are the same as debug_with_runner runner = LitAgentRunner[str](tracer) store = InMemoryLightningStore() resource = PromptTemplate(template="You are a helpful assistant. {any_question}", engine="f-string") class DebugHook(Hook): async def on_trace_end( # type: ignore self, *, agent: LitAgent[str], runner: LitAgentRunner[str], tracer: AgentOpsTracer, rollout: Rollout ) -> None: """We use `tracer.get_last_trace()` to get all raw OpenTelemetry spans from the Rollout. The last reward span is not available yet. """ trace = tracer.get_last_trace() print("Trace spans collected during the rollout:") for span in trace: print(f"- {span.name} (status: {span.status}):\n {span.attributes}") with runner.run_context( agent=apo_rollout, store=store, # Send the hooks into `run_context` hooks=[DebugHook()], ): await runner.step( "Explain why the sky appears blue using principles of light scattering in 100 words.", resources={"main_prompt": resource}, ) def debug_with_trainer(): """This approach integrates the trainer and is very similar to the real `fit()` loop. The trainer will create a mock algorithm which will communicates with the runner. Do this for end-to-end testing and debugging purposes. """ # To debug with trainer, we need a dataset dataset = cast( Dataset[str], [ "Explain why the sky appears blue using principles of light scattering in 100 words.", "What's the capital of France?", ], ) # We also need a resource that is to be tuned (i.e., prompt template) resource = PromptTemplate(template="You are a helpful assistant. {any_question}", engine="f-string") trainer = Trainer( n_workers=1, # This is very critical. It will be the only prompt template that will be passed to the agent. initial_resources={"main_prompt": resource}, ) trainer.dev(apo_rollout, dataset) if __name__ == "__main__": setup_logging() parser = argparse.ArgumentParser(description="Debug APO with runner or trainer approach.") parser.add_argument( "--mode", choices=["runner", "hook", "trainer"], default="runner", help="Choose which debugging approach to use: 'runner' (default), 'hook', or 'trainer'.", ) args = parser.parse_args() if args.mode == "runner": asyncio.run(debug_with_runner()) elif args.mode == "hook": asyncio.run(debug_with_hooks()) elif args.mode == "trainer": # Don't want two mode consecutively in one process, # unless you are sure the tracer won't conflict. debug_with_trainer() ================================================ FILE: examples/apo/legacy_apo_client.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This is the APO example written in the legacy client-server style (agent-lightning v0.1). New users should refer to the `examples/apo/apo.py` for the modern APO example. """ import os import random from typing import Any import dotenv from openai import OpenAI from agentlightning import setup_logging from agentlightning.litagent import LitAgent from agentlightning.trainer import Trainer class SimpleAgent(LitAgent[Any]): def training_rollout(self, task, rollout_id, resources): # type: ignore print("Resources:", resources) # type: ignore openai = OpenAI( api_key=os.environ["OPENAI_API_KEY"], base_url=os.environ["OPENAI_API_BASE"], ) result = openai.chat.completions.create( model="gpt-4.1-mini", messages=[ {"role": "system", "content": resources["system_prompt"].template}, # type: ignore {"role": "user", "content": task["prompt"]}, ], ) print("Result:", result) return random.uniform(0, 1) if __name__ == "__main__": setup_logging() dotenv.load_dotenv() agent = SimpleAgent() # Use 2 workers to simulate multiple clients # max_tasks is optional, limit to 2 tasks here for a quick demo. trainer = Trainer(n_workers=2, max_tasks=2) trainer.fit_v0(agent, "http://127.0.0.1:9997") ================================================ FILE: examples/apo/legacy_apo_server.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This is the APO example written in the legacy client-server style (agent-lightning v0.1). New users should refer to the `examples/apo/apo.py` for the modern APO example. """ import asyncio from typing import cast from agentlightning.server import AgentLightningServer from agentlightning.types import NamedResources, PromptTemplate async def example_apo(): """ An example of how a prompt optimization works. """ server = AgentLightningServer(host="127.0.0.1", port=9997) await server.start() prompt_candidates = [ "You are a helpful assistant.", "You are a knowledgeable AI.", "You are a friendly chatbot.", "You are an experienced expert.", ] prompt_and_rewards: list[tuple[str, float]] = [] for prompt in prompt_candidates: # 1. The optimization algorithm updates the prompt template print(f"\n[Algo] Updating prompt template to: '{prompt}'") resources: NamedResources = {"system_prompt": PromptTemplate(template=prompt, engine="f-string")} # How the resource is used fully depends on the client implementation. await server.update_resources(resources) # 2. The algorithm queues up a task from a dataset print("[Algo] Queuing task for clients...") task_id = await server.queue_task(sample={"prompt": "What is the capital of France?"}, mode="train") print(f"[Algo] Task '{task_id}' is now available for clients.") # 3. The algorithm waits for clients to process the task rollout = await server.poll_completed_rollout(task_id, timeout=60) assert rollout, "Expected a completed rollout from the client." print(f"[Algo] Received Result: {rollout}") reward = rollout.final_reward prompt_and_rewards.append((prompt, cast(float, reward))) print(f"\n[Algo] All prompts and their rewards: {prompt_and_rewards}") best_prompt = max(prompt_and_rewards, key=lambda x: x[1]) print(f"[Algo] Best prompt found: '{best_prompt[0]}' with reward {best_prompt[1]}") await server.stop() if __name__ == "__main__": asyncio.run(example_apo()) ================================================ FILE: examples/apo/room_selector.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import json import traceback from typing import List, Optional, Tuple, TypedDict, cast from openai import OpenAI from openai.types.chat import ( ChatCompletionAssistantMessageParam, ChatCompletionMessageFunctionToolCallParam, ChatCompletionMessageParam, ChatCompletionToolMessageParam, ChatCompletionToolParam, ) from pydantic import BaseModel, Field from rich.console import Console from agentlightning.adapter import TraceToMessages from agentlightning.litagent import rollout from agentlightning.reward import find_final_reward from agentlightning.runner import LitAgentRunner from agentlightning.store import InMemoryLightningStore from agentlightning.tracer.agentops import AgentOpsTracer from agentlightning.types import Dataset, PromptTemplate console = Console() class JudgeResponse(BaseModel): reason: str = Field(description="The reason for the score. No more than 100 characters.") score: float = Field(description="The score for the match on a 0-1 scale. Be critical.") class Room(TypedDict): id: str capacity: int equipment: List[str] accessible: bool distance_m: int booked: List[Tuple[str, str, int]] class RoomStatus(Room): free: bool class AvailableRooms(TypedDict): rooms: List[RoomStatus] class RoomRequirement(TypedDict): date: str time: str duration_min: int attendees: int needs: List[str] accessible_required: bool class RoomSelectionTask(TypedDict): id: str task_input: RoomRequirement expected_choice: str TOOL_DEFINITIONS: List[ChatCompletionToolParam] = [ { "type": "function", "function": { "name": "get_rooms_and_availability", "description": "Return meeting rooms with capacity, equipment, accessibility, distance, and booked time slots.", "parameters": { "type": "object", "properties": { "date": {"type": "string", "description": "YYYY-MM-DD"}, "time": {"type": "string", "description": "HH:MM 24h local"}, "duration_min": {"type": "integer", "description": "Meeting duration minutes"}, }, "required": ["date", "time", "duration_min"], }, }, }, ] def prompt_template_baseline() -> PromptTemplate: return PromptTemplate( template="Find a room on {date} at {time} for {duration_min} minutes, {attendees} attendees. Needs: {needs}. Accessible required: {accessible_required}", engine="f-string", ) def room_selection_grader(client: OpenAI, final_message: Optional[str], expected_choice: str) -> float: judge_prompt = ( f"You are a strict grader of exact room choice." f"Task output:\n{final_message}\n\n" f"Task expected answer:\n{expected_choice}\n\n" f"Score the match on a 0-1 scale. Be critical.\n" f"Bear in mind that the score can be partially correct (between 0 and 1)." ) judge = client.chat.completions.parse( model="gpt-4.1-mini", messages=[ {"role": "user", "content": judge_prompt}, ], response_format=JudgeResponse, temperature=0.0, ) judge_result = judge.choices[0].message.content console.print(f"[bold yellow]=== Judge ===[/bold yellow]") console.print(judge_result) judge_result_parsed = JudgeResponse.model_validate_json(judge_result) # type: ignore console.print(f"[bold yellow]=== Judge Score ===[/bold yellow]") console.print(judge_result_parsed.score) return judge_result_parsed.score @rollout def room_selector(task: RoomSelectionTask, prompt_template: PromptTemplate) -> float: """An agent to select a room based on the given requirements. Oracle System Prompt (works with 100% accuracy with gpt-5 mini low reasoning effort): You are a scheduling assistant. Hard constraints: free for slot, capacity >= attendees, includes all required equipment, accessible==True if requested. Tie-break scoring (lower is better): 1) capacity_slack = capacity - attendees (minimize) 2) extra_equipment = provided_equipment_count - required_equipment_count (minimize) 3) distance_m (minimize) 4) fewer total booked blocks that day (minimize) Return No Room if no room is found that satisfies the constraints. Return strictly: final_choice: reason: Oracle User Prompt Template: Find a room on {task_input['date']} at {task_input['time']} for {task_input['duration_min']} minutes, {task_input['attendees']} attendees. Needs: {', '.join(task_input['needs']) or 'none'}. Accessible required: {task_input['accessible_required']} The current implementation greatly simply the oracle prompt and prompt template is provided by a parameter. The prompt template should be tuned by Agent-lightning's APO algorithm. It also should work with a very small model like gpt-4.1-nano. """ client = OpenAI() model = "gpt-4.1-nano" user_message = prompt_template.format(**task["task_input"]) messages: List[ChatCompletionMessageParam] = [ {"role": "system", "content": "You are a scheduling assistant."}, { "role": "user", "content": user_message, }, ] console.print(f"[bold yellow]=== User Message ===[/bold yellow]") console.print(user_message) resp = client.chat.completions.create( model=model, messages=messages, tools=TOOL_DEFINITIONS, tool_choice="auto", # Minimize the randomness temperature=0.0, # Uncomment for gpt-5 # reasoning_effort="low", ) console.print(f"[bold yellow]=== Assistant Message ===[/bold yellow]") console.print(resp.choices[0].message) # Parse and process the tool calls tool_calls = resp.choices[0].message.tool_calls if tool_calls: tool_call_params: List[ChatCompletionMessageFunctionToolCallParam] = [] tool_results: List[ChatCompletionToolMessageParam] = [] for tc in tool_calls: if tc.type != "function": raise ValueError(f"Tool call is not a function: {tc}") if tc.function.name != "get_rooms_and_availability": raise ValueError(f"Tool call is not get_rooms_and_availability: {tc}") tool_call_params.append( ChatCompletionMessageFunctionToolCallParam( id=tc.id, type="function", function={"name": tc.function.name, "arguments": tc.function.arguments}, ) ) args = json.loads(tc.function.arguments) try: tool_output = get_rooms_and_availability(args["date"], args["time"], args["duration_min"]) except Exception as e: tool_output = { "error": str(e), "traceback": traceback.format_exc(), } console.print(f"[bold yellow]=== Tool Message ===[/bold yellow]") console.print(tool_output) tool_results.append( ChatCompletionToolMessageParam( role="tool", tool_call_id=tc.id, content=json.dumps(tool_output), ) ) # Update the messages for the next call messages.append( ChatCompletionAssistantMessageParam( role="assistant", content=resp.choices[0].message.content, tool_calls=tool_call_params, ) ) messages.extend(tool_results) next_resp = client.chat.completions.create( model=model, messages=messages, # Minimize the randomness temperature=0.0, ) console.print(f"[bold yellow]=== Final Assistant Message ===[/bold yellow]") console.print(next_resp.choices[0].message.content) final_message = next_resp.choices[0].message.content else: final_message = resp.choices[0].message.content return room_selection_grader(client, final_message, task["expected_choice"]) # Local tool database (there might be multiple plausible fits) ROOMS: List[Room] = [ { "id": "Orion", "capacity": 4, "equipment": ["tv", "whiteboard"], "accessible": True, "distance_m": 12, "booked": [("2025-10-13", "10:00", 60), ("2025-10-13", "15:00", 30)], }, { "id": "Lyra", "capacity": 10, "equipment": ["projector", "whiteboard", "confphone"], "accessible": True, "distance_m": 30, "booked": [("2025-10-13", "09:30", 30), ("2025-10-13", "11:00", 60)], }, { "id": "Vega", "capacity": 6, "equipment": ["tv"], "accessible": False, "distance_m": 22, "booked": [("2025-10-13", "14:00", 60)], }, { "id": "Nova", "capacity": 12, "equipment": ["ledwall", "whiteboard", "confphone"], "accessible": True, "distance_m": 45, "booked": [], }, { "id": "Quark", "capacity": 8, "equipment": ["projector", "whiteboard"], "accessible": False, "distance_m": 18, "booked": [("2025-10-13", "10:30", 30)], }, # Two extra to create harder ties { "id": "Atlas", "capacity": 6, "equipment": ["projector", "whiteboard"], "accessible": True, "distance_m": 10, "booked": [("2025-10-13", "09:00", 30), ("2025-10-13", "13:30", 30)], }, { "id": "Pulse", "capacity": 8, "equipment": ["tv", "whiteboard", "confphone"], "accessible": True, "distance_m": 8, "booked": [("2025-10-13", "16:30", 30)], }, ] def overlaps(start: str, dur: int, other_start: str, other_dur: int) -> bool: def tmin(t: str): return int(t[:2]) * 60 + int(t[3:]) a0, a1 = tmin(start), tmin(start) + dur b0, b1 = tmin(other_start), tmin(other_start) + other_dur return max(a0, b0) < min(a1, b1) def get_rooms_and_availability(date: str, time_str: str, duration_min: int) -> AvailableRooms: avail: List[RoomStatus] = [] for r in ROOMS: free = all( not (b_date == date and overlaps(time_str, duration_min, b_time, b_dur)) for (b_date, b_time, b_dur) in r["booked"] ) item: RoomStatus = { **r, "free": free, } avail.append(item) return {"rooms": avail} def load_room_tasks() -> Dataset[RoomSelectionTask]: tasks: List[RoomSelectionTask] = [] for line in open("room_tasks.jsonl"): task = json.loads(line) tasks.append(RoomSelectionTask(**task)) return cast(Dataset[RoomSelectionTask], tasks) async def debug_room_selector(limit: int = 1): # Prepare all the components to run the agent runner = LitAgentRunner[RoomSelectionTask](AgentOpsTracer()) store = InMemoryLightningStore() prompt_template = prompt_template_baseline() tasks = load_room_tasks() with runner.run_context(agent=room_selector, store=store): for task in tasks: console.print("[bold green]=== Task ===[/bold green]", task, sep="\n") # Run the agent rollout = await runner.step(task, resources={"main_prompt": prompt_template}) # Get the spans and convert them to messages # Useful for debugging and analysis spans = await store.query_spans(rollout.rollout_id) adapter = TraceToMessages() messages = adapter.adapt(spans) for message_idx, message in enumerate(messages): console.print(f"[bold purple]=== Postmortem Message #{message_idx} ===[/bold purple]") console.print(json.dumps(message)) reward = find_final_reward(spans) console.print("[bold purple]=== Postmortem Reward ===[/bold purple]", reward, sep="\n") if __name__ == "__main__": asyncio.run(debug_room_selector()) ================================================ FILE: examples/apo/room_selector_apo.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This sample code demonstrates how to use an existing APO algorithm to tune the prompts.""" import logging from typing import Tuple, cast from openai import AsyncOpenAI from room_selector import RoomSelectionTask, load_room_tasks, prompt_template_baseline, room_selector from agentlightning import Trainer, setup_logging from agentlightning.adapter import TraceToMessages from agentlightning.algorithm.apo import APO from agentlightning.types import Dataset def load_train_val_dataset() -> Tuple[Dataset[RoomSelectionTask], Dataset[RoomSelectionTask]]: dataset_full = load_room_tasks() train_split = len(dataset_full) // 2 dataset_train = [dataset_full[i] for i in range(train_split)] dataset_val = [dataset_full[i] for i in range(train_split, len(dataset_full))] return cast(Dataset[RoomSelectionTask], dataset_train), cast(Dataset[RoomSelectionTask], dataset_val) def setup_apo_logger(file_path: str = "apo.log") -> None: """Dump a copy of all the logs produced by APO algorithm to a file.""" file_handler = logging.FileHandler(file_path) file_handler.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s [%(levelname)s] (Process-%(process)d %(name)s) %(message)s") file_handler.setFormatter(formatter) logging.getLogger("agentlightning.algorithm.apo").addHandler(file_handler) def main() -> None: setup_logging() setup_apo_logger() openai_client = AsyncOpenAI() algo = APO[RoomSelectionTask]( openai_client, val_batch_size=10, gradient_batch_size=4, beam_width=2, branch_factor=2, beam_rounds=2, _poml_trace=True, ) trainer = Trainer( algorithm=algo, # Increase the number of runners to run more rollouts in parallel n_runners=8, # APO algorithm needs a baseline # Set it either here or in the algo initial_resources={ # The resource key can be arbitrary "prompt_template": prompt_template_baseline() }, # APO algorithm needs an adapter to process the traces produced by rollouts # Use this adapter to convert spans to messages adapter=TraceToMessages(), ) dataset_train, dataset_val = load_train_val_dataset() trainer.fit(agent=room_selector, train_dataset=dataset_train, val_dataset=dataset_val) if __name__ == "__main__": main() ================================================ FILE: examples/apo/room_tasks.jsonl ================================================ {"id": "s01", "task_input": {"date": "2025-10-13", "time": "16:30", "duration_min": 30, "attendees": 12, "needs": ["projector", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s02", "task_input": {"date": "2025-10-13", "time": "14:30", "duration_min": 30, "attendees": 12, "needs": ["whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "Nova"} {"id": "s03", "task_input": {"date": "2025-10-13", "time": "11:00", "duration_min": 60, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s04", "task_input": {"date": "2025-10-13", "time": "09:45", "duration_min": 30, "attendees": 8, "needs": ["projector"], "accessible_required": false}, "expected_choice": "Quark"} {"id": "s05", "task_input": {"date": "2025-10-13", "time": "12:15", "duration_min": 45, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s06", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 20, "attendees": 4, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s07", "task_input": {"date": "2025-10-13", "time": "16:30", "duration_min": 60, "attendees": 12, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Nova"} {"id": "s08", "task_input": {"date": "2025-10-13", "time": "12:00", "duration_min": 30, "attendees": 8, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s09", "task_input": {"date": "2025-10-13", "time": "13:30", "duration_min": 30, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s10", "task_input": {"date": "2025-10-13", "time": "12:30", "duration_min": 30, "attendees": 5, "needs": ["tv"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s11", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 30, "attendees": 10, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s12", "task_input": {"date": "2025-10-13", "time": "11:30", "duration_min": 45, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s13", "task_input": {"date": "2025-10-13", "time": "15:00", "duration_min": 30, "attendees": 3, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s14", "task_input": {"date": "2025-10-13", "time": "11:30", "duration_min": 30, "attendees": 4, "needs": ["whiteboard"], "accessible_required": false}, "expected_choice": "Orion"} {"id": "s15", "task_input": {"date": "2025-10-13", "time": "13:00", "duration_min": 30, "attendees": 3, "needs": [], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s16", "task_input": {"date": "2025-10-13", "time": "13:00", "duration_min": 30, "attendees": 8, "needs": ["projector"], "accessible_required": false}, "expected_choice": "Quark"} {"id": "s17", "task_input": {"date": "2025-10-13", "time": "13:45", "duration_min": 30, "attendees": 5, "needs": ["tv", "whiteboard"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s18", "task_input": {"date": "2025-10-13", "time": "12:45", "duration_min": 30, "attendees": 10, "needs": ["projector", "confphone"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s19", "task_input": {"date": "2025-10-13", "time": "16:30", "duration_min": 30, "attendees": 6, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s20", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 45, "attendees": 4, "needs": ["projector", "whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s21", "task_input": {"date": "2025-10-13", "time": "12:00", "duration_min": 30, "attendees": 3, "needs": ["tv"], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s22", "task_input": {"date": "2025-10-13", "time": "16:00", "duration_min": 45, "attendees": 8, "needs": ["projector", "whiteboard"], "accessible_required": false}, "expected_choice": "Quark"} {"id": "s23", "task_input": {"date": "2025-10-13", "time": "11:45", "duration_min": 30, "attendees": 6, "needs": [], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s24", "task_input": {"date": "2025-10-13", "time": "12:15", "duration_min": 30, "attendees": 10, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s25", "task_input": {"date": "2025-10-13", "time": "15:30", "duration_min": 30, "attendees": 10, "needs": ["projector", "confphone"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s26", "task_input": {"date": "2025-10-13", "time": "14:30", "duration_min": 60, "attendees": 12, "needs": ["projector", "whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s27", "task_input": {"date": "2025-10-13", "time": "13:45", "duration_min": 30, "attendees": 12, "needs": ["projector", "whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s28", "task_input": {"date": "2025-10-13", "time": "14:00", "duration_min": 60, "attendees": 4, "needs": ["tv", "whiteboard"], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s29", "task_input": {"date": "2025-10-13", "time": "14:30", "duration_min": 30, "attendees": 10, "needs": ["whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s30", "task_input": {"date": "2025-10-13", "time": "12:00", "duration_min": 60, "attendees": 4, "needs": ["tv"], "accessible_required": false}, "expected_choice": "Orion"} {"id": "s31", "task_input": {"date": "2025-10-13", "time": "15:00", "duration_min": 30, "attendees": 9, "needs": ["tv", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s32", "task_input": {"date": "2025-10-13", "time": "10:45", "duration_min": 30, "attendees": 8, "needs": ["projector"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s33", "task_input": {"date": "2025-10-13", "time": "10:00", "duration_min": 30, "attendees": 3, "needs": ["tv"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s34", "task_input": {"date": "2025-10-13", "time": "09:00", "duration_min": 30, "attendees": 12, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s35", "task_input": {"date": "2025-10-13", "time": "09:15", "duration_min": 30, "attendees": 6, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s36", "task_input": {"date": "2025-10-13", "time": "12:00", "duration_min": 30, "attendees": 9, "needs": ["tv"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s37", "task_input": {"date": "2025-10-13", "time": "13:45", "duration_min": 30, "attendees": 4, "needs": ["tv", "whiteboard"], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s38", "task_input": {"date": "2025-10-13", "time": "11:30", "duration_min": 30, "attendees": 6, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s39", "task_input": {"date": "2025-10-13", "time": "16:00", "duration_min": 30, "attendees": 8, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s40", "task_input": {"date": "2025-10-13", "time": "14:15", "duration_min": 30, "attendees": 6, "needs": ["tv"], "accessible_required": false}, "expected_choice": "Pulse"} {"id": "s41", "task_input": {"date": "2025-10-13", "time": "12:30", "duration_min": 60, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s42", "task_input": {"date": "2025-10-13", "time": "15:30", "duration_min": 30, "attendees": 4, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s43", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 30, "attendees": 12, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Nova"} {"id": "s44", "task_input": {"date": "2025-10-13", "time": "13:30", "duration_min": 30, "attendees": 12, "needs": ["projector"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s45", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 45, "attendees": 6, "needs": ["whiteboard", "projector"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s46", "task_input": {"date": "2025-10-13", "time": "09:30", "duration_min": 30, "attendees": 10, "needs": ["projector", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s47", "task_input": {"date": "2025-10-13", "time": "11:30", "duration_min": 30, "attendees": 10, "needs": ["projector", "whiteboard"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s48", "task_input": {"date": "2025-10-13", "time": "09:30", "duration_min": 60, "attendees": 10, "needs": ["projector", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s49", "task_input": {"date": "2025-10-13", "time": "12:00", "duration_min": 30, "attendees": 12, "needs": ["confphone", "whiteboard"], "accessible_required": true}, "expected_choice": "Nova"} {"id": "s50", "task_input": {"date": "2025-10-13", "time": "15:00", "duration_min": 30, "attendees": 3, "needs": ["whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "Pulse"} {"id": "s51", "task_input": {"date": "2025-10-13", "time": "14:30", "duration_min": 30, "attendees": 6, "needs": ["tv"], "accessible_required": false}, "expected_choice": "Pulse"} {"id": "s52", "task_input": {"date": "2025-10-13", "time": "11:00", "duration_min": 30, "attendees": 6, "needs": ["projector"], "accessible_required": true}, "expected_choice": "Atlas"} {"id": "s53", "task_input": {"date": "2025-10-13", "time": "13:30", "duration_min": 45, "attendees": 6, "needs": ["projector"], "accessible_required": true}, "expected_choice": "Lyra"} {"id": "s54", "task_input": {"date": "2025-10-13", "time": "10:00", "duration_min": 30, "attendees": 12, "needs": ["projector", "whiteboard", "confphone"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s55", "task_input": {"date": "2025-10-13", "time": "16:30", "duration_min": 30, "attendees": 8, "needs": ["tv"], "accessible_required": true}, "expected_choice": "No Room"} {"id": "s56", "task_input": {"date": "2025-10-13", "time": "09:00", "duration_min": 30, "attendees": 4, "needs": ["whiteboard"], "accessible_required": true}, "expected_choice": "Orion"} {"id": "s57", "task_input": {"date": "2025-10-13", "time": "10:30", "duration_min": 45, "attendees": 8, "needs": ["projector"], "accessible_required": true}, "expected_choice": "No Room"} ================================================ FILE: examples/azure/README.md ================================================ # Supervised Fine-tuning with Azure OpenAI [![azure CI status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-azure.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-azure.yml) This example walks through an end-to-end supervised fine-tuning loop on Azure OpenAI. The trainer runs a toy capital-lookup agent, collects traces with rewards, submits fine-tuning jobs using those traces, and deploys every successful checkpoint as a new Azure OpenAI deployment. **NOTE: The example is tested and compatible with Agent-lightning v0.2.x, but it's not yet maintained on CI due to the difficulty of maintaining a logged-in status in the testing environment.** ## Prerequisites You need an Azure subscription with an Azure OpenAI resource that supports fine-tuning in your region and a base deployment you can reuse (the defaults assume `gpt-4.1-mini` backed by `gpt-4.1-mini-2025-04-14`). Sign in with the Azure CLI (`az login`) and install the project dependencies, for example via `uv sync` from the repository root. ## Setup Copy the sample environment file `.env.example`, fill in your Azure values, and source it before running any scripts: ```bash cp examples/azure_finetune/.env.example examples/azure_finetune/.env # edit examples/azure_finetune/.env with your keys and identifiers source examples/azure_finetune/.env ``` Confirm that you have successfully logged into Azure with: ```bash az account show ``` ## Included Files | File | Description | | --- | --- | | `aoai_finetune.py` | Fine-tuning algorithm that batches rollouts, filters traces, launches jobs, deploys checkpoints, and evaluates them. | | `train_capital_agent.py` | Trainer entry point that loads `capital_samples.csv` and orchestrates three fine-tuning iterations. | | `capital_agent.py` | Tool-enabled agent that calls `country_capital_lookup`, producing reward `1.0` when the response contains the expected capital. | | `capital_samples.csv` | Prompt/answer pairs that the trainer splits 80/20 into training and validation sets. | | `tests/test_deployment.py` | Smoke tests for deployment helper methods when live Azure credentials are configured. | ## Workflow Overview - **Stage 1 – Collect traces.** `Trainer` points runners at your base deployment and gathers rollouts in batches of `finetune_every_n_rollouts`. - **Stage 2 – Filter and package data.** Rewards and telemetries from `capital_agent` are collected by Agent-lightning, which drives filtering via `data_filter_ratio`, and the remaining traces are serialized into Azure OpenAI JSONL format. - **Stage 3 – Fine-tune.** `AzureOpenAIFinetune.finetune` uploads the dataset, waits for the fine-tuning job to finish, and returns the new base model identifier. - **Stage 4 – Deploy and evaluate.** A versioned deployment such as `gpt-4.1-mini-ft_v01` is created, old deployments are pruned when `max_deployments` is exceeded, and validation rollouts confirm the reward. The process is shown in the following diagram:

Azure OpenAI Finetune

## Capital Agent `capital_agent.py` defines a tool-enabled agent that must call `country_capital_lookup` whenever a user asks for a capital city. The deterministic lookup table keeps the task simple, and the reward function checks that the final response contains the expected capital name. Run the script directly to validate credentials or debug tool call behavior: ```bash python capital_agent.py ``` The agent executes five sample tasks, prints each tool interaction, and records traces via the Agent Lightning tracer. ## Running the Example Start the full fine-tuning loop from the repository root: ```bash python train_capital_agent.py ``` `train_capital_agent.py` divides the dataset into training and validation subsets, then completes three fine-tune → deploy → evaluate iterations. Expect short rollout times paired with longer waits (up to 4 hours in our experiments) for Azure’s fine-tuning queue; deployments usually reach `Succeeded` within 2-3 minutes. The console output looks like this: ```log 10:13:02,624 Starting client-server execution with 2 runner(s) [role=both, main_process=algorithm] 10:13:02,639 Starting LightningStore server on localhost:4747 10:13:02,749 [AOAI FT 1/3] [Stage 1] Starting fine-tuning iteration with 24 tasks... 10:13:02,750 [AOAI FT 1/3] [Stage 2] Using model deployment: gpt-4.1-mini 10:13:03,428 [Worker 1] Started async rollouts (max: unlimited). 10:13:03,429 [Worker 0] Started async rollouts (max: unlimited). 10:13:05,279 [Worker 0 | Rollout ro-efab388d2f0e] Completed in 1.83s. Collected 4 span(s). Final reward: 1.0 10:13:05,454 [Worker 1 | Rollout ro-8ba08859ae85] Completed in 2.01s. Collected 4 span(s). Final reward: 1.0 [... 22 more rollouts omitted ...] 10:13:28,430 [AOAI FT 1/3] [Stage 3] Completed rollouts for 24 tasks. 10:13:28,431 [AOAI FT 1/3] Keeping 28 example(s) for fine-tuning after reward-based filtering. 10:13:28,431 [AOAI FT 1/3] [Stage 4] Prepared 28 training examples after filtering. 10:13:28,431 [AOAI FT 1/3] [Stage 5] Starting fine-tuning for model gpt-4.1-mini-2025-04-14... 10:13:29,854 [AOAI FT 1/3] Uploaded training file to Azure OpenAI (file_id=file-0fd6e72151094a0eb0306de7aae4883b). 10:13:41,216 [AOAI FT 1/3] Fine-tuning job ftjob-0ee45c42591b4f4a8bd4f49ef2301dcd created for base model gpt-4.1-mini-2025-04-14. 10:13:41,217 [AOAI FT 1/3] Waiting for fine-tuning job ftjob-0ee45c42591b4f4a8bd4f49ef2301dcd to complete. 12:29:11,444 [AOAI FT 1/3] Fine-tuning job ftjob-0ee45c42591b4f4a8bd4f49ef2301dcd succeeded with new model id gpt-4.1-mini-2025-04-14.ft-0ee45c42591b4f4a8bd4f49ef2301dcd-v01. 12:29:11,444 [AOAI FT 1/3] [Stage 6] Deploying fine-tuned model... 12:29:14,217 [AOAI FT 1/3] Waiting for deployment gpt-4.1-mini-ft_v01 to become ready. 12:29:15,458 [AOAI FT 1/3] Waiting for deployment to be ready. Current provisioning state of gpt-4.1-mini-ft_v01: Creating [... 7 repetitive deployment status checks omitted ...] 12:32:53,773 [AOAI FT 1/3] Waiting for deployment to be ready. Current provisioning state of gpt-4.1-mini-ft_v01: Succeeded 12:32:53,773 [AOAI FT 1/3] Deployment gpt-4.1-mini-ft_v01 is ready with version 1. 12:32:53,774 [AOAI FT 1/3] [Stage 7] Evaluating on validation dataset... [... 8 validation rollouts omitted ...] 12:33:03,979 [AOAI FT 1/3] [Stage 7] Evaluation completed. Average reward: 1.0000 12:33:03,979 [AOAI FT 2/3] [Stage 1] Starting fine-tuning iteration with 24 tasks... 12:33:03,979 [AOAI FT 2/3] [Stage 2] Using model deployment: gpt-4.1-mini-ft_v01 [... 24 rollouts omitted ...] 12:33:34,619 [AOAI FT 2/3] [Stage 3] Completed rollouts for 24 tasks. 12:33:34,620 [AOAI FT 2/3] [Stage 4] Prepared 27 training examples after filtering. 12:33:34,620 [AOAI FT 2/3] [Stage 5] Starting fine-tuning for model gpt-4.1-mini-2025-04-14.ft-0ee45c42591b4f4a8bd4f49ef2301dcd-v01... 12:35:12,694 [AOAI FT 2/3] Waiting for fine-tuning job ftjob-06366e441ee24a0ea242014fea8fbc3a to complete. 13:16:43,810 [AOAI FT 2/3] Fine-tuning job ftjob-06366e441ee24a0ea242014fea8fbc3a succeeded with new model id gpt-4.1-mini-2025-04-14.ft-06366e441ee24a0ea242014fea8fbc3a-v02. 13:16:43,810 [AOAI FT 2/3] [Stage 6] Deploying fine-tuned model... 13:16:46,263 [AOAI FT 2/3] Waiting for deployment gpt-4.1-mini-ft_v02 to become ready. [... 5 repetitive deployment status checks omitted ...] 13:19:23,856 [AOAI FT 2/3] Waiting for deployment to be ready. Current provisioning state of gpt-4.1-mini-ft_v02: Succeeded 13:19:23,857 [AOAI FT 2/3] [Stage 7] Evaluating on validation dataset... [... 8 validation rollouts omitted ...] 13:19:39,072 [AOAI FT 2/3] [Stage 7] Evaluation completed. Average reward: 1.0000 13:19:39,072 [AOAI FT 3/3] [Stage 1] Starting fine-tuning iteration with 24 tasks... 13:19:39,073 [AOAI FT 3/3] [Stage 2] Using model deployment: gpt-4.1-mini-ft_v02 [... 24 rollouts omitted ...] 13:20:04,721 [AOAI FT 3/3] [Stage 3] Completed rollouts for 24 tasks. 13:20:04,722 [AOAI FT 3/3] [Stage 4] Prepared 27 training examples after filtering. 13:20:04,722 [AOAI FT 3/3] [Stage 5] Starting fine-tuning for model gpt-4.1-mini-2025-04-14.ft-06366e441ee24a0ea242014fea8fbc3a-v02... 13:20:17,013 [AOAI FT 3/3] Waiting for fine-tuning job ftjob-2651d3183a4b40679d4c3fc886940c0c to complete. 14:02:47,241 [AOAI FT 3/3] Fine-tuning job ftjob-2651d3183a4b40679d4c3fc886940c0c succeeded with new model id gpt-4.1-mini-2025-04-14.ft-2651d3183a4b40679d4c3fc886940c0c-v03. 14:02:47,242 [AOAI FT 3/3] [Stage 6] Deploying fine-tuned model... 14:02:47,242 [AOAI FT 3/3] Maximum number of deployments reached (2). Cleaning up old deployments. 14:02:47,242 [AOAI FT 3/3] Deleting old deployment gpt-4.1-mini-ft_v01. 14:02:48,925 [AOAI FT 3/3] Deployment gpt-4.1-mini-ft_v01 deleted successfully. 14:02:51,168 [AOAI FT 3/3] Waiting for deployment gpt-4.1-mini-ft_v03 to become ready. [... 7 repetitive deployment status checks omitted ...] 14:06:30,300 [AOAI FT 3/3] Waiting for deployment to be ready. Current provisioning state of gpt-4.1-mini-ft_v03: Succeeded 14:06:30,301 [AOAI FT 3/3] [Stage 7] Evaluating on validation dataset... [... 8 validation rollouts omitted ...] 14:06:45,506 [AOAI FT 3/3] [Stage 7] Evaluation completed. Average reward: 1.0000 14:06:45,506 Stopping server... 14:06:45,657 Server stopped. ``` ## Tips and Cleanup Tweak `finetune_every_n_rollouts`, `max_deployments`, and `data_filter_ratio` in `train_capital_agent.py` to align with your quotas. While jobs run, visit the Azure OpenAI portal to confirm status. When you are done, delete unused deployments there. ================================================ FILE: examples/azure/aoai_finetune.py ================================================ # Copyright (c) Microsoft. All rights reserved. """The Azure OpenAI fine-tuning algorithm implementation.""" import asyncio import copy import json import logging import os import random import subprocess import tempfile import time from typing import Any, Dict, List, Optional, Sequence, Tuple import requests from openai import OpenAI from agentlightning.adapter.messages import OpenAIMessages, TraceToMessages from agentlightning.algorithm import Algorithm from agentlightning.algorithm.utils import batch_iter_over_dataset from agentlightning.reward import find_final_reward from agentlightning.types import LLM, RolloutMode, TaskInput logger = logging.getLogger("agentlightning.aoai") ROLLOUT_IDLE_SLEEP_SECONDS = 5.0 FILE_STATUS_POLL_INTERVAL = 10 FINETUNE_JOB_POLL_INTERVAL = 60 class AzureOpenAIFinetune(Algorithm): """Coordinate iterative fine-tuning runs for an Azure OpenAI deployment. The algorithm batches rollouts, extracts the recorded traces, converts them into JSONL records that comply with Azure OpenAI fine-tuning, and optionally redeploys the resulting checkpoint so subsequent rollouts evaluate the newest model revision. """ def __init__( self, base_deployment_name: str, finetuned_deployment_name: str, base_model_name: str, *, finetune_every_n_rollouts: int = 32, azure_openai_endpoint: Optional[str] = None, azure_openai_api_key: Optional[str] = None, azure_openai_api_version: Optional[str] = None, subscription_id: Optional[str] = None, resource_group: Optional[str] = None, resource_name: Optional[str] = None, seed: int = 42, n_iterations: int = 3, finetune_epochs: int = 1, finetune_batch_size: int = 2, finetune_learning_rate: float = 1.0, max_deployments: int = 2, data_filter_ratio: float = 0.5, ) -> None: """Create a fine-tuning workflow tied to an Azure OpenAI endpoint. Args: base_deployment_name: Deployment used as the base model for the first fine-tuning job. deployment_name: Deployment that should serve the fine-tuned weights after each round. Currently, this name is only used as a prefix for the actual deployment created after each fine-tuning job, because multiple versions cannot be assigned to the same deployment. base_model_name: On Azure, deployments are instantiated from base models (e.g., "gpt-4.1-mini" deployment is created from "gpt-4.1-mini-2025-04-14"). This name is used to identify the latter name when launching fine-tuning jobs. finetune_every_n_rollouts: Number of rollouts grouped together before launching a job. We don't recommend setting this value too low as fine-tuning jobs have a minimum rows requirement. azure_openai_endpoint: Azure OpenAI endpoint (e.g. `https://{resource}.openai.azure.com`). azure_openai_api_key: API key with access to the Azure OpenAI resource. azure_openai_api_version: API version to use when talking to Azure OpenAI. subscription_id: Azure subscription that owns the OpenAI resource (used for deployment). resource_group: Resource group of the target Azure OpenAI resource. resource_name: Azure OpenAI resource name, usually the Azure OpenAI resource name. seed: Random seed forwarded to the fine-tuning job for reproducibility. n_iterations: Number of algorithm iterations (fine-tune → deploy → evaluate). finetune_epochs: Number of epochs per fine-tuning job (not the number of epochs to go through `train_dataset`). finetune_batch_size: Batch size to use for the fine-tuning job. finetune_learning_rate: Learning rate to use for the fine-tuning job. max_deployments: Maximum number of deployments to keep active; older ones are deleted. Use this to avoid hitting the capacity limit on Azure service. data_filter_ratio: Fraction of high-reward examples to keep when preparing JSONL data. """ super().__init__() self.azure_openai_endpoint = azure_openai_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT", "") if not self.azure_openai_endpoint: raise ValueError("Azure OpenAI endpoint must be provided via parameter or AZURE_OPENAI_ENDPOINT env var") self.azure_openai_api_key = azure_openai_api_key or os.getenv("AZURE_OPENAI_API_KEY", "") if not self.azure_openai_api_key: raise ValueError("Azure OpenAI API key must be provided via parameter or AZURE_OPENAI_API_KEY env var") self.azure_openai_api_version = azure_openai_api_version or os.getenv("AZURE_OPENAI_API_VERSION", "") if not self.azure_openai_api_version: raise ValueError( "Azure OpenAI API version must be provided via parameter or AZURE_OPENAI_API_VERSION env var" ) self.subscription_id = subscription_id or os.getenv("AZURE_SUBSCRIPTION_ID", "") if not self.subscription_id: raise ValueError("Azure subscription ID must be provided via parameter or AZURE_SUBSCRIPTION_ID env var") self.resource_group = resource_group or os.getenv("AZURE_RESOURCE_GROUP", "") if not self.resource_group: raise ValueError("Azure resource group must be provided via parameter or AZURE_RESOURCE_GROUP env var") self.resource_name = resource_name or os.getenv("AZURE_RESOURCE_NAME", "") if not self.resource_name: raise ValueError("Azure resource name must be provided via parameter or AZURE_RESOURCE_NAME env var") self.base_deployment_name = base_deployment_name self.finetuned_deployment_name = finetuned_deployment_name self.base_model_name = base_model_name self.finetune_every_n_rollouts = finetune_every_n_rollouts self.seed = seed self.n_iterations = n_iterations self.finetune_epochs = finetune_epochs self.finetune_batch_size = finetune_batch_size self.finetune_learning_rate = finetune_learning_rate self.max_deployments = max_deployments self.data_filter_ratio = data_filter_ratio self.openai_client = OpenAI( api_key=self.azure_openai_api_key, base_url=self.azure_openai_endpoint, ) # Tracks the deployments created. They can be deleted later if needed. self._created_deployments: List[str] = [] self._log_prefix: str = "" async def run( # type: ignore self, train_dataset: Optional[List[TaskInput]] = None, val_dataset: Optional[List[TaskInput]] = None, ) -> None: """ Run the training loop. Args: train_dataset: Optional training dataset val_dataset: Optional validation dataset """ if train_dataset is None or val_dataset is None: raise ValueError("Both train_dataset and val_dataset must be provided") resources: LLM = LLM(endpoint=self.azure_openai_endpoint, model=self.base_deployment_name) store = self.get_store() # This tracks the model name used in training # It's different from the deployment name which used for inference training_model_name: str = self.base_model_name data_iterator = batch_iter_over_dataset(train_dataset, self.finetune_every_n_rollouts) for i_iteration in range(self.n_iterations): self._log_prefix = f"[AOAI FT {i_iteration + 1}/{self.n_iterations}] " # (1) Fetch the next batch of tasks to process tasks = next(data_iterator) self._log_info(f"[Stage 1] Starting fine-tuning iteration with {len(tasks)} tasks...") # (2) Update the current active LLM deployment address await store.add_resources({"main_llm": resources}) self._log_info(f"[Stage 2] Using model deployment: {resources.model}") # (3) Spawn and wait for the rollouts to complete messages_group, reward_group = await self.batch_rollout_and_collect_data(tasks, "train") self._log_info(f"[Stage 3] Completed rollouts for {len(tasks)} tasks.") # (4) Filter the data based on rewards training_data = await self.prepare_data_for_training(messages_group, reward_group, "train") self._log_info(f"[Stage 4] Prepared {len(training_data)} training examples after filtering.") # (5) Perform fine-tuning self._log_info(f"[Stage 5] Starting fine-tuning for model {training_model_name}...") training_model_name = self.finetune(training_data, training_model_name, i_iteration) self._log_info(f"[Stage 5] Fine-tuning completed. Updated training model base name: {training_model_name}") # (6) Deploy the fine-tuned model self._log_info(f"[Stage 6] Deploying fine-tuned model...") resources = self.deploy_finetuned_model(training_model_name, i_iteration + 1) self._log_info(f"[Stage 6] Deployment completed. Updated resources to: {resources}") # (7) Evaluate on validation dataset self._log_info(f"[Stage 7] Evaluating on validation dataset...") _, val_reward_group = await self.batch_rollout_and_collect_data(val_dataset, "val") self._log_info( f"[Stage 7] Evaluation completed. Average reward: {sum(val_reward_group) / len(val_reward_group):.4f}" ) async def batch_rollout_and_collect_data( self, tasks: Sequence[TaskInput], rollout_mode: RolloutMode = "train", ) -> Tuple[List[OpenAIMessages], List[float]]: """Launch rollouts for a batch of tasks and aggregate their traces. Each task is executed concurrently and the resulting spans are converted into OpenAI-style chat messages. Rewards from the traces are preserved so downstream filtering can prefer the highest quality examples. Args: tasks: Rollout payloads collected from the dataset. rollout_mode: Semantic label that differentiates training from validation passes. Returns: Tuple containing the flattened list of OpenAI messages and the aligned list of rewards. """ if not tasks: return [], [] results = await asyncio.gather(*(self.rollout_and_collect_data(task, mode=rollout_mode) for task in tasks)) messages_group: List[OpenAIMessages] = [] reward_group: List[float] = [] for messages_list, reward in results: if not messages_list: continue messages_group.extend(messages_list) # Duplicate the reward for each message set produced by the rollout reward_group.extend([reward] * len(messages_list)) return messages_group, reward_group async def rollout_and_collect_data(self, task: TaskInput, mode: RolloutMode) -> Tuple[List[OpenAIMessages], float]: """Execute a single rollout, returning OpenAI messages together with the final reward. The method waits for the rollout to enter a terminal state, retrieves the recorded spans, converts them into OpenAI chat messages using the configured trace adapter, and extracts the reward emitted by the runner. Args: task: Rollout payload to enqueue in the store. mode: Execution mode to annotate the rollout (`"train"`, `"val"` or `"test"`). Returns: A tuple containing the list of OpenAI messages reconstructed from the trace and the numeric reward associated with the rollout. Rewards default to `0.0` when not found. """ store = self.get_store() rollout = await store.enqueue_rollout(input=task, mode=mode) rollout_id = rollout.rollout_id self._log_debug("Waiting for rollout %s to finish in mode=%s", rollout_id, mode) while True: completed = await store.wait_for_rollouts(rollout_ids=[rollout_id], timeout=0.0) if completed: finished = completed[0] if finished.status != "succeeded": self._log_error(f"Rollout {rollout_id} finished with status {finished.status}. Skipping.") break await asyncio.sleep(ROLLOUT_IDLE_SLEEP_SECONDS) spans = await store.query_spans(rollout_id=rollout_id, attempt_id="latest") try: adapter = self.get_adapter() except ValueError: adapter = TraceToMessages() self.set_adapter(adapter) if not isinstance(adapter, TraceToMessages): raise RuntimeError( "The adapter is configured but not a TraceToMessages adapter. " "AzureOpenAIFinetune requires a TraceToMessages adapter. Please set that in Trainer." ) messages_list = adapter.adapt(spans) if not messages_list: self._log_error(f"Rollout {rollout_id} produced no OpenAI messages for training.") # NOTE: Patch the messages list for AOAI requirements # This should ideally be merged into message adapter for messages in messages_list: for message in messages["messages"]: if "content" in message and message["content"] is None: message.pop("content") reward = find_final_reward(spans) if reward is None: self._log_error(f"Rollout {rollout_id} produced no reward; defaulting to 0.0.") reward = 0.0 self._log_info("Rollout %s produced %d message set(s) with reward %.3f", rollout_id, len(messages_list), reward) return messages_list, reward async def prepare_data_for_training( self, messages_group: List[OpenAIMessages], reward_group: List[float], split: RolloutMode, ) -> List[Dict[str, Any]]: """Combine rollouts and rewards into JSONL training payloads. Args: messages_group: Flattened list of OpenAI message dictionaries. reward_group: Rewards aligned with `messages_group` entries. split: Dataset split that produced the examples (e.g., `"train"` or `"val"`). Returns: JSON-serializable dictionaries ready to be written into a fine-tuning file. """ if len(messages_group) != len(reward_group): raise ValueError("Mismatch between number of message entries and reward entries.") tagged_examples: List[Dict[str, Any]] = [] for idx, (messages, reward) in enumerate(zip(messages_group, reward_group)): example: Dict[str, Any] = { "messages": messages["messages"], "metadata": {"split": split, "rollout_index": idx}, "reward": reward, "reward_jitter": random.uniform(0, 1), } if messages.get("tools"): example["tools"] = messages["tools"] tagged_examples.append(example) self._log_info( "Collected %d candidate example(s) for split=%s before filtering (ratio=%.2f).", len(tagged_examples), split, self.data_filter_ratio, ) filtered_examples = self._filter_training_data(tagged_examples) self._log_info("Keeping %d example(s) for fine-tuning after reward-based filtering.", len(filtered_examples)) return filtered_examples def finetune(self, training_data: List[Dict[str, Any]], base_model: str, iteration_idx: int) -> str: """Launch a fine-tuning job on Azure OpenAI using the supplied dataset. Args: training_data: JSONL-ready records that describe the conversation transcripts. iteration_idx: Current iteration index. Returns: Identifier of the fine-tuned model produced by Azure OpenAI. """ if not training_data: raise ValueError("Training data must not be empty before launching fine-tuning.") if not self.openai_client: raise RuntimeError("Azure OpenAI client is not initialized; cannot fine-tune.") next_iteration = iteration_idx + 1 train_file_path: Optional[str] = None try: with tempfile.NamedTemporaryFile( mode="w", prefix=f"{base_model}_{iteration_idx:02d}_", suffix=".jsonl", delete=False ) as handle: for record in training_data: handle.write(json.dumps(record) + "\n") train_file_path = handle.name self._log_info( "Prepared temporary training file %s with %d example(s).", train_file_path, len(training_data) ) with open(train_file_path, "rb") as file_handle: training_response = self.openai_client.files.create(file=file_handle, purpose="fine-tune") train_file_id = training_response.id self._log_info("Uploaded training file to Azure OpenAI (file_id=%s).", train_file_id) self._wait_for_file_processed(train_file_id) job = self.openai_client.fine_tuning.jobs.create( training_file=train_file_id, model=base_model, seed=self.seed, method={ "type": "supervised", "supervised": { "hyperparameters": { "batch_size": self.finetune_batch_size, "learning_rate_multiplier": self.finetune_learning_rate, "n_epochs": self.finetune_epochs, } }, }, # TODO: continuously adding suffix will make model names very long after a few iterations # investigate if we can just specify the fine-tuned model name directly suffix=f"v{next_iteration:02d}", # NOTE: https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/fine-tuning # Other options are "GlobalStandard" and "Standard" extra_body={"trainingType": "GlobalStandard"}, ) job_id = job.id self._log_info("Fine-tuning job %s created for base model %s.", job_id, base_model) fine_tuned_model = self._wait_for_finetuning(job_id) if not fine_tuned_model: raise RuntimeError(f"Fine-tuning job {job_id} finished without producing a model id.") self._log_info("Fine-tuning job %s succeeded with new model id %s.", job_id, fine_tuned_model) return fine_tuned_model finally: if train_file_path and os.path.exists(train_file_path): try: os.unlink(train_file_path) except OSError: self._log_warning("Failed to remove temporary training file %s.", train_file_path) def deploy_finetuned_model(self, finetuned_model_id: str, iteration_idx: int) -> LLM: """Deploy the fine-tuned checkpoint and return an `LLM` resource descriptor. Args: finetuned_model_id: Identifier returned by the fine-tuning job. iteration_idx: Current iteration index. Returns: `LLM` resource pointing to either the Azure deployment or the direct model id. """ if not finetuned_model_id: raise ValueError("finetuned_model_id must be a non-empty string.") while len(self._created_deployments) >= self.max_deployments: self._log_warning( "Maximum number of deployments reached (%d). Cleaning up old deployments.", self.max_deployments ) oldest_deployment = self._created_deployments.pop(0) self._log_info("Deleting old deployment %s.", oldest_deployment) self._delete_deployment(oldest_deployment) if self.subscription_id and self.resource_group and self.resource_name: # version should be like this: str(iteration_idx) # Because of this issue: {"code":"ModelUpgradeNotSupported","message":"Model updates are not supported for finetuned model deployments."} # We need to concatenate the version to the model name # and version is always "1" deployment_name = f"{self.finetuned_deployment_name}_v{iteration_idx:02d}" self._deploy_model(finetuned_model_id, deployment_name, "1") self._wait_for_deployment_ready(deployment_name, "1") self._created_deployments.append(deployment_name) self._log_info( "Deployed fine-tuned model %s to deployment %s. We now have %d active deployments.", finetuned_model_id, deployment_name, len(self._created_deployments), ) else: raise RuntimeError("Azure deployment parameters missing; using fine-tuned model id directly.") return LLM(endpoint=self.azure_openai_endpoint, model=deployment_name, api_key=self.azure_openai_api_key) def cleanup_deployments(self) -> None: """Delete all deployments created by this algorithm instance.""" for deployment_name in self._created_deployments: self._log_info("Cleaning up deployment %s.", deployment_name) self._delete_deployment(deployment_name) self._created_deployments = [] def _filter_training_data(self, data: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """Select the top-performing examples and strip reward metadata. Args: data: Candidate training examples carrying a temporary `reward` key. Returns: List of examples suitable for JSONL serialization (without the `reward` field). """ if not data: return [] if self.data_filter_ratio >= 1.0: selected = data else: sorted_data = sorted(data, key=lambda x: (x.get("reward", 0.0), x.get("reward_jitter", 0.0)), reverse=True) keep_count = max(1, int(len(sorted_data) * self.data_filter_ratio)) selected = sorted_data[:keep_count] self._log_debug("Filtering kept %d/%d example(s).", len(selected), len(data)) filtered: List[Dict[str, Any]] = [] for entry in selected: entry_copy = copy.deepcopy(entry) entry_copy.pop("reward", None) entry_copy.pop("reward_jitter", None) entry_copy.pop("metadata", None) filtered.append(entry_copy) return filtered def _wait_for_file_processed(self, file_id: str, interval: int = FILE_STATUS_POLL_INTERVAL) -> None: """Poll the uploaded training file until Azure marks it as processed. Args: file_id: Identifier returned by `files.create`. interval: Number of seconds to wait between polling attempts. """ self._log_info("Waiting for training file %s to reach the processed state.", file_id) while True: file_info = self.openai_client.files.retrieve(file_id) status = getattr(file_info, "status", None) self._log_debug("Training file %s status: %s", file_id, status) if status == "processed": return if status == "failed": raise RuntimeError(f"Azure OpenAI reported a failure while processing file {file_id}.") time.sleep(interval) def _wait_for_finetuning(self, job_id: str, interval: int = FINETUNE_JOB_POLL_INTERVAL) -> str: """Poll the fine-tuning job until a terminal status is reached. Args: job_id: Identifier of the fine-tuning job to monitor. interval: Number of seconds between polling attempts. Returns: The identifier of the fine-tuned model when successful. Otherwise, raise an exception. """ self._log_info("Waiting for fine-tuning job %s to complete.", job_id) while True: job = self.openai_client.fine_tuning.jobs.retrieve(job_id) self._log_debug("Fine-tuning job %s status: %s", job_id, job.status) if job.status == "succeeded": if job.fine_tuned_model: return job.fine_tuned_model else: raise RuntimeError(f"Fine-tuning job {job_id} succeeded but no model id was returned: {job}") if job.status in {"failed", "cancelled"}: raise RuntimeError(f"Fine-tuning job {job_id} ended with status {job.status}.") time.sleep(interval) def _deploy_model(self, model_name: str, deployment_name: str, version: str) -> None: """Deploy the fine-tuned model using Azure's control plane REST API. Args: model_name: Fine-tuned (training) model identifier returned by Azure OpenAI. deployment_name: Name of the deployment to update. version: Version string to stamp on the deployment update. """ token = self._get_azure_token() request_url = ( f"https://management.azure.com/subscriptions/{self.subscription_id}" f"/resourceGroups/{self.resource_group}" f"/providers/Microsoft.CognitiveServices/accounts/{self.resource_name}" f"/deployments/{deployment_name}" ) headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", } # Follows the setup in https://github.com/azure-ai-foundry/fine-tuning/blob/047fd230a77e327e75d4bc41403ee8e7bff4de9e/Demos/DistillingSarcasm/sarcasm.ipynb deploy_data = { "sku": {"name": "DeveloperTier", "capacity": 250}, "properties": { "model": { "format": "OpenAI", "name": model_name, "version": version, } }, } self._log_info("Deploying model %s (version %s) to deployment %s.", model_name, version, deployment_name) response = requests.put( request_url, params={"api-version": "2025-06-01"}, headers=headers, data=json.dumps(deploy_data), timeout=180, ) if response.status_code < 400: self._log_info("Deployment %s updated successfully.", deployment_name) else: self._log_error("Deployment failed: %s %s", response.status_code, response.text) def _wait_for_deployment_ready(self, deployment_name: str, version: str, interval: int = 30) -> None: """Poll the deployment status until it is marked as ready. Args: deployment_name: Name of the deployment to monitor. interval: Number of seconds between polling attempts. """ self._log_info("Waiting for deployment %s to become ready.", deployment_name) while True: request_url = ( f"https://management.azure.com/subscriptions/{self.subscription_id}" f"/resourceGroups/{self.resource_group}" f"/providers/Microsoft.CognitiveServices/accounts/{self.resource_name}" f"/deployments/{deployment_name}" ) token = self._get_azure_token() headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", } response = requests.get( request_url, params={"api-version": "2025-06-01"}, headers=headers, timeout=60, ) if response.status_code >= 400: self._log_error( "Failed to query deployment status. Retry later: %s, %s", response.status_code, response.text ) else: deployment_info = response.json() properties = deployment_info.get("properties", {}) model_info = properties.get("model", {}) provisioning_state = properties.get("provisioningState") self._log_info( "Waiting for deployment to be ready. Current provisioning state of %s: %s", deployment_name, provisioning_state, ) if provisioning_state == "Succeeded": version_found = model_info.get("version") if version_found == version: self._log_info("Deployment %s is ready with version %s.", deployment_name, version) return else: self._log_warning( "Deployment succeeded, but version mismatch: expected %s, got %s. Try again later.", version, version_found, ) elif provisioning_state == "Cancelled" or provisioning_state == "Failed": raise RuntimeError(f"Deployment {deployment_name} failed with state {provisioning_state}.") else: # Just wait and poll again self._log_debug( "Deployment %s not ready yet. Current state: %s", deployment_name, provisioning_state ) time.sleep(interval) def _delete_deployment(self, deployment_name: str) -> None: """Delete a specific deployment in Azure OpenAI. Args: deployment_name: Name of the deployment to delete. """ token = self._get_azure_token() request_url = ( f"https://management.azure.com/subscriptions/{self.subscription_id}" f"/resourceGroups/{self.resource_group}" f"/providers/Microsoft.CognitiveServices/accounts/{self.resource_name}" f"/deployments/{deployment_name}" ) headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", } self._log_info("Deleting deployment %s...", deployment_name) response = requests.delete( request_url, params={"api-version": "2025-06-01"}, headers=headers, timeout=60, ) if response.status_code in (200, 202, 204): self._log_info("Deployment %s deleted successfully.", deployment_name) else: self._log_error( "Failed to delete deployment %s: %s %s", deployment_name, response.status_code, response.text, ) def _get_azure_token(self) -> str: """Request an Azure management token via the Azure CLI. Returns: Bearer token that authorizes calls to the Azure management plane. """ cmd = [ "az", "account", "get-access-token", "--resource", "https://management.azure.com", "--query", "accessToken", "-o", "tsv", ] try: token = subprocess.check_output(cmd, text=True).strip() except subprocess.CalledProcessError as exc: raise ValueError("Azure CLI command failed. Could not fetch token from Azure CLI.") from exc if token: return token else: raise ValueError("Could not fetch token from Azure CLI.") # Logging helpers def _log_info(self, message: str, *args: Any, **kwargs: Any) -> None: logger.info(f"{self._log_prefix}{message}", *args, **kwargs) def _log_debug(self, message: str, *args: Any, **kwargs: Any) -> None: logger.debug(f"{self._log_prefix}{message}", *args, **kwargs) def _log_warning(self, message: str, *args: Any, **kwargs: Any) -> None: logger.warning(f"{self._log_prefix}{message}", *args, **kwargs) def _log_error(self, message: str, *args: Any, **kwargs: Any) -> None: logger.error(f"{self._log_prefix}{message}", *args, **kwargs) ================================================ FILE: examples/azure/capital_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """An example of agent using Azure OpenAI with tool calls to look up capital cities. Running this script directly will run a few sample tasks using the `capital_agent`, which will test the healthiness of your Azure OpenAI setup. Remember to have the following environment variables set: - `AZURE_OPENAI_API_KEY`: Your Azure OpenAI API key. - `AZURE_OPENAI_ENDPOINT`: Your Azure OpenAI endpoint URL. """ import asyncio import json import os from typing import List, TypedDict, cast import openai import pandas as pd from openai.types.chat import ( ChatCompletionMessageFunctionToolCallParam, ChatCompletionMessageParam, ChatCompletionToolMessageParam, ChatCompletionToolParam, ) from rich.console import Console from agentlightning import LLM, AgentOpsTracer, InMemoryLightningStore, LitAgentRunner, rollout CAPITALS = { "japan": "Tokyo", "france": "Paris", "canada": "Ottawa", "australia": "Canberra", "brazil": "Brasília", "egypt": "Cairo", "kenya": "Nairobi", "spain": "Madrid", "italy": "Rome", "germany": "Berlin", "south korea": "Seoul", "india": "New Delhi", } console = Console() def country_capital_lookup(country: str) -> str: return CAPITALS.get(country.strip().lower(), "Unknown") class CapitalTask(TypedDict): input: str output: str TOOLS: List[ChatCompletionToolParam] = [ { "type": "function", "function": { "name": "country_capital_lookup", "description": "Get the capital city of a given country.", "parameters": {"type": "object", "properties": {"country": {"type": "string"}}, "required": ["country"]}, }, } ] SYSTEM = ( "You are a concise assistant. " "If the user asks for a country's capital, ALWAYS call the tool 'country_capital_lookup'. " "Otherwise, answer briefly." ) @rollout def capital_agent(task: CapitalTask, llm: LLM) -> float: """Run one evaluation task with capital agent. Returns 1.0 if output contains expected substring, else 0.0. """ console.print("[bold blue]======== Runner Start ========[/bold blue]") console.print("[bold blue]Runner[/bold blue] [Step 1] Running task with input:", task) prompt = task["input"] expected = task["output"] openai_client = openai.OpenAI(base_url=llm.endpoint, api_key=os.getenv("AZURE_OPENAI_API_KEY", "")) messages: List[ChatCompletionMessageParam] = [ {"role": "system", "content": SYSTEM}, {"role": "user", "content": prompt}, ] # --- Call #1 --- first = openai_client.chat.completions.create( model=llm.model, messages=messages, tools=TOOLS, tool_choice="auto", temperature=1.0, ) msg = first.choices[0].message console.print("[bold blue]Runner[/bold blue] [Step 2] First call response:", msg) if msg.tool_calls: assistant_tool_calls: List[ChatCompletionMessageFunctionToolCallParam] = [] tool_results: List[ChatCompletionToolMessageParam] = [] for tc in msg.tool_calls: if tc.type == "function" and tc.function.name == "country_capital_lookup": args = json.loads(tc.function.arguments or "{}") result = country_capital_lookup(args.get("country", "")) assistant_tool_calls.append( { "id": tc.id, "type": "function", "function": { "name": tc.function.name, "arguments": tc.function.arguments, }, } ) tool_results.append( { "role": "tool", "tool_call_id": tc.id, "content": result, } ) messages.append( { "role": "assistant", "content": msg.content or "", "tool_calls": assistant_tool_calls, } ) messages.extend(tool_results) console.print("[bold blue]Runner[/bold blue] [Step 3] Messages after tool call:", messages) # --- Call #2 --- second = openai_client.chat.completions.create( model=llm.model, messages=messages, temperature=1.0, ) final_text = second.choices[0].message.content or "" console.print("[bold blue]Runner[/bold blue] [Step 4] Second call response:", final_text) else: console.print("[bold blue]Runner[/bold blue] [Step 3] No tool calls made.") final_text = msg.content or "" final_text = final_text.strip() reward = 1.0 if expected.lower() in final_text.lower() else 0.0 console.print(f"[bold blue]Runner[/bold blue] [Step Final] Final output: {final_text} | Reward: {reward}") return reward async def main(): # We don't put API key in LLM object for security reasons. llm = LLM( endpoint=os.getenv("AZURE_OPENAI_ENDPOINT", ""), model="gpt-4.1-mini", ) data = pd.read_csv("capital_samples.csv") # type: ignore tracer = AgentOpsTracer() runner = LitAgentRunner[CapitalTask](tracer=tracer) store = InMemoryLightningStore() with runner.run_context(agent=capital_agent, store=store): for index in range(5): sample = cast(CapitalTask, data.iloc[index].to_dict()) # type: ignore await runner.step(sample, resources={"main_llm": llm}) if __name__ == "__main__": asyncio.run(main()) ================================================ FILE: examples/azure/capital_samples.csv ================================================ input,output Japan's capital please,Tokyo capital city of JAPAN,Tokyo What is the capital of Japan 🇯🇵?,Tokyo The capital of France is...?,Paris Name France's capital city.,Paris france capital pls,Paris Capital for Canada?,Ottawa canada — what's the capital?,Ottawa Tell me Canada's capital city,Ottawa Australia capital?,Canberra capital of australia pls,Canberra Which is Australia’s capital city?,Canberra capital of brazil (quick),Brasília What's Brazil's capital city?,Brasília brazil: name the capital,Brasília egypt capital now?,Cairo Capital city of Egypt please.,Cairo Which city is Egypt’s capital?,Cairo kenya’s capital city is what?,Nairobi Give me Kenya's capital.,Nairobi capital of KENYA?,Nairobi "For Spain, name the capital.",Madrid spain capital please!,Madrid Which is Spain’s capital city?,Madrid italy — capital city?,Rome Remind me Italy’s capital.,Rome capital of ITALY??,Rome What's Germany’s capital?,Berlin Name the capital city of Germany.,Berlin germany: capital city pls,Berlin "For South Korea, give capital.",Seoul south korea capital please,Seoul Capital city of South Korea?,Seoul What's the capital of India?,New Delhi india capital now?,New Delhi Name India’s capital city.,New Delhi Just say hello.,Hello Greet me in one sentence.,Hello Say “hello” once.,Hello ================================================ FILE: examples/azure/tests/test_deployment.py ================================================ # Copyright (c) Microsoft. All rights reserved. from aoai_finetune import AzureOpenAIFinetune from agentlightning import setup_logging finetune_algo = AzureOpenAIFinetune( base_deployment_name="gpt-4.1-mini", finetuned_deployment_name="gpt-4.1-mini-ft", base_model_name="gpt-4.1-mini-2025-04-14", finetune_every_n_rollouts=24, data_filter_ratio=0.6, ) setup_logging() def test_deployment(): finetune_algo._deploy_model( # pyright: ignore[reportPrivateUsage] model_name="gpt-4.1-mini-2025-04-14.ft-071a9d9c59ec4d088d1a3e56707d7361-aoai_ft_1", deployment_name="gpt-4.1-mini-ft", version="1", ) def test_wait_for_deployment_ready(): finetune_algo._wait_for_deployment_ready("gpt-4.1-mini-ft", "1") # pyright: ignore[reportPrivateUsage] def test_delete_deployment(): finetune_algo._delete_deployment("gpt-4.1-mini-ft_v01") # pyright: ignore[reportPrivateUsage] ================================================ FILE: examples/azure/train_capital_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. import argparse import pandas as pd from aoai_finetune import AzureOpenAIFinetune from capital_agent import capital_agent from rich.console import Console from agentlightning import TraceToMessages, Trainer, setup_logging console = Console() def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Train Capital Agent with Azure OpenAI Finetuning") parser.add_argument("--n-iterations", type=int, default=3, help="Number of finetuning iterations") parser.add_argument("--cleanup", action="store_true", help="Cleanup finetuned deployments after training") return parser.parse_args() def main(): setup_logging() args = parse_args() finetune_algo = AzureOpenAIFinetune( base_deployment_name="gpt-4.1-mini", finetuned_deployment_name="gpt-4.1-mini-ft", base_model_name="gpt-4.1-mini-2025-04-14", finetune_every_n_rollouts=24, data_filter_ratio=0.6, n_iterations=args.n_iterations, ) trainer = Trainer(n_runners=2, algorithm=finetune_algo, adapter=TraceToMessages()) dataset = pd.read_csv("capital_samples.csv") # type: ignore train_dataset = dataset.sample(frac=0.8, random_state=42) # 80% for training # type: ignore val_dataset = dataset.drop(train_dataset.index) # Remaining 20% for validation # type: ignore console.print(f"Training on {len(train_dataset)} samples, validating on {len(val_dataset)} samples.") # type: ignore try: trainer.fit( capital_agent, train_dataset=train_dataset.to_dict(orient="records"), # type: ignore val_dataset=val_dataset.to_dict(orient="records"), # type: ignore ) finally: if args.cleanup: finetune_algo.cleanup_deployments() if __name__ == "__main__": main() ================================================ FILE: examples/calc_x/README.md ================================================ # Calc-X Example [![calc_x CI status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-calc-x.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-calc-x.yml) This example demonstrates training a mathematical reasoning agent using Agent-Lightning with the VERL algorithm and AutoGen framework. The agent solves math problems using a calculator tool through the Model Context Protocol (MCP). It's compatible with Agent-lightning v0.2 or later. ## Requirements This example requires a single node with at least one 40GB GPU. Follow the [installation guide](../../docs/tutorials/installation.md) to install Agent-Lightning and VERL-related dependencies. Additionally, ensure `uv` and the MCP calculator server are properly installed. The agent relies on the MCP protocol to access calculator functionality during problem-solving. ```bash pip install "autogen-agentchat" "autogen-ext[openai]" "mcp>=1.10.0" ``` ## Dataset Download the Calc-X dataset in parquet format from [here](https://drive.google.com/file/d/1FQMyKLLd6hP9dw9rfZn1EZOWNvKaDsqw/view?usp=sharing) and extract it to the `data` folder: ```bash unzip calc-x-data.zip -d data ``` The dataset contains mathematical problems with ground truth solutions for training and evaluation. ## Included Files | File/Directory | Description | |----------------|-------------| | `calc_agent.py` | Math problem-solving agent using AutoGen and MCP calculator tool | | `train_calc_agent.py` | Training script using VERL algorithm with configurable hyperparameters | | `eval_utils.py` | Evaluation utilities for assessing agent accuracy on math problems | | `data/` | Directory containing training and test datasets in parquet format | | `tests/` | Test files including MCP calculator verification script | | `legacy_calc_agent.py` | Legacy agent implementation compatible with Agent-lightning v0.1.x (deprecated) | | `legacy_calc_agent_debug.py` | Legacy debugging script compatible with Agent-lightning v0.1.x (deprecated) | | `legacy_train.sh` | Legacy training script compatible with Agent-lightning v0.1.x (deprecated) | ## Running Examples ### Training The training process uses distributed Ray workers to run agent rollouts in parallel while the training server optimizes the model. Start Ray before launching the training: ```bash bash ../../scripts/restart_ray.sh ``` If you want to track experiments with Weights & Biases, set the `WANDB_API_KEY` environment variable **before starting Ray**. Then run the training script: ```bash python train_calc_agent.py --train-file data/train.parquet --val-file data/test.parquet ``` The script automatically launches agent workers and the training server. The agent workers execute math problem rollouts using the MCP calculator, while the training server applies the VERL algorithm to improve the model based on rewards. ### Debugging To test the agent interactively without training: ```bash python calc_agent.py ``` This runs the agent on sample problems to verify that the MCP calculator integration and AutoGen setup work correctly. This test relies on an OpenAI service available. Set `OPENAI_API_KEY` environment variable to the API key of the OpenAI service; and `OPENAI_API_BASE` environment variable to the base URL of the OpenAI service. A very common issue is that the agent may hang indefinitely if the environment is not properly configured. Verify that `uv` and the MCP calculator server are correctly installed by running: ```bash python tests/test_mcp_calculator.py ``` ================================================ FILE: examples/calc_x/calc_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This sample code demonstrates how to define a Calc-X agent trainable with Agent-lightning with latest Agent-lightning API (v0.2+).""" import asyncio import os import re from typing import TypedDict, cast from autogen_agentchat.agents import AssistantAgent from autogen_core.models import ModelFamily from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.tools.mcp import McpWorkbench, StdioServerParams from eval_utils import evaluate import agentlightning as agl class MathProblem(TypedDict): """This TypedDict defines the structure of each training sample. Your task structure should contain all the information needed for: - The agent to process the task (e.g., 'question') - Evaluation (e.g., 'result' for ground truth) This type is optional. Not necessary to make the example work. """ # The fields come from the dataset id: str question: str # The math problem for the agent to solve chain: str # Step-by-step solution (not used in training) result: str # Ground truth answer for evaluation source: str def autogen_assistant_agent( model: str, openai_base_url: str, temperature: float, workbench: McpWorkbench ) -> AssistantAgent: model_client = OpenAIChatCompletionClient( model=model, base_url=openai_base_url, api_key=os.environ.get("OPENAI_API_KEY", "token-abc123"), model_info={ "vision": False, "function_calling": True, "json_output": False, "family": ModelFamily.UNKNOWN, "structured_output": False, }, temperature=temperature, ) calc_agent = AssistantAgent( name="calc", model_client=model_client, workbench=workbench, reflect_on_tool_use=True, ) return calc_agent @agl.rollout async def calc_agent(task: MathProblem, llm: agl.LLM) -> None: """Calc-X agent rollout function. It would accept a math problem and a LLM endpoint resource. It's expected to return None, and emit reward via `agl.emit_reward`. It can also return the reward directly without `agl.emit_reward`. You can choose either way, but not both. """ calculator_mcp_server = StdioServerParams(command="uvx", args=["mcp-server-calculator"]) async with McpWorkbench(calculator_mcp_server) as workbench: calc_agent = autogen_assistant_agent( llm.model, llm.endpoint, llm.sampling_parameters.get("temperature", 0.7), workbench, ) try: output_format = "Output the answer when you are ready. The answer should be surrounded by three sharps (`###`), in the form of ### ANSWER: ###." prompt = task["question"] + " " + output_format # Sometimes MCP tools can timeout. In that case, the whole agent will block. # We thus set a timeout of 5 minutes so that the agent will not block indefinitely. result = await asyncio.wait_for(calc_agent.run(task=prompt), timeout=300.0) # evaluate last_message = cast(str, result.messages[-1].content) # type: ignore answer = re.search(r"###\s*ANSWER:\s*(.+?)(\s*###|$)", last_message) if answer: answer = answer.group(1) else: answer = last_message except asyncio.TimeoutError as e: print("Timeout occurred. Error:", str(e)) answer = "None" except Exception as e: print("Failure:", str(e)) answer = "None" reward = await evaluate(answer, str(task["result"])) agl.emit_reward(reward) # Emit reward for tracing print("answer: {} ground_truth: {} reward: {}".format(answer, task["result"], reward)) async def debug(): """Here we show a more manual way for debugging, without Trainer. We get the data samples on our own, and run the agent with LitAgentRunner. You will need an `OPENAI_API_KEY` and `OPENAI_BASE_URL` environment variable set to run this function. """ # Manually create a tracer as Runner will need it. # Use a dummy OtelTracer if you don't need to trace anything other than reward. tracer = agl.OtelTracer() # The runner processes MathProblem, which matches the agent's task type. runner = agl.LitAgentRunner[MathProblem](tracer) # A store is required here to store the data collected. store = agl.InMemoryLightningStore() # This is what needs to be tuned (i.e., LLM) resource = agl.LLM( endpoint=os.environ["OPENAI_BASE_URL"], model="gpt-4.1-nano", sampling_parameters={"temperature": 1.0} ) made_up_task: MathProblem = { "id": "debug-1", "question": "What is 12 multiplied by 15?", "chain": "", "result": "180", "source": "debug", } another_made_up_task: MathProblem = { "id": "debug-2", "question": "What is the square root of 256?", "chain": "", "result": "16", "source": "debug", } # The agent here must be the same agent that will be used in the real run. with runner.run_context(agent=calc_agent, store=store): await runner.step( made_up_task, resources={ # The key "main_llm" here can be arbitrary "main_llm": resource }, ) # Run another task await runner.step( another_made_up_task, resources={"main_llm": resource}, ) if __name__ == "__main__": asyncio.run(debug()) ================================================ FILE: examples/calc_x/eval_utils.py ================================================ # Copyright (c) Microsoft. All rights reserved. # Copied and adapted from https://github.com/prompteus/calc-x/blob/master/gadgets/metrics.py import math import re import string import sympy from agentlightning.reward import reward def normalize_option(option: str) -> str: """ >>> normalize_option(" (A) \n") 'A' """ return re.sub(r"(\s+|\(|\))", "", option) def is_option_result(result: str) -> bool: """ >>> is_option_result(" A) \n") True >>> is_option_result(" 23/7 ") False """ return normalize_option(result) in list(string.ascii_letters) def float_eval(input_str: str) -> float: if " = around " in input_str: input_str = input_str.split(" = around ")[0] expr = sympy.parse_expr(input_str, evaluate=True) return float(expr.evalf()) def scalar_are_results_same(pred_result: str, true_result: str, rel_tol: float) -> bool: pred_result = str(pred_result) if pred_result is not None else "" # type: ignore true_result = str(true_result) if true_result is not None else "" # type: ignore if pred_result.strip() == true_result.strip(): return True if is_option_result(true_result): # The task is to select correct option true_result = normalize_option(true_result) pred_result = normalize_option(pred_result) return pred_result == true_result # The task is to calculate the result as a number try: pred_float = float_eval(pred_result) true_float = float_eval(true_result) return math.isclose(pred_float, true_float, rel_tol=rel_tol) except Exception: pass return False async def evaluate(prediction: str, ground_truth: str) -> float: return float(scalar_are_results_same(prediction, ground_truth, 1e-2)) @reward async def evaluate_v0_1(prediction: str, ground_truth: str) -> float: return float(scalar_are_results_same(prediction, ground_truth, 1e-2)) ================================================ FILE: examples/calc_x/legacy_calc_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This is a Calc-X agent training script implemented with the legacy Agent-lightning API (v0.1). It requires a shell script to run in the background to start the training server: ```bash bash legacy_train.sh ``` """ import os import re from typing import Any, cast from autogen_agentchat.agents import AssistantAgent from autogen_core.models import ModelFamily from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.tools.mcp import McpWorkbench, StdioServerParams from eval_utils import evaluate_v0_1 from agentlightning import LLM, LitAgent, NamedResources, Trainer, setup_logging setup_logging() calculator_mcp_server = StdioServerParams(command="uvx", args=["mcp-server-calculator"]) def autogen_assistant_agent( model: str, openai_base_url: str, temperature: float, workbench: McpWorkbench ) -> AssistantAgent: model_client = OpenAIChatCompletionClient( model=model, base_url=openai_base_url, api_key=os.environ.get("OPENAI_API_KEY", "token-abc123"), model_info={ "vision": False, "function_calling": True, "json_output": False, "family": ModelFamily.UNKNOWN, "structured_output": False, }, temperature=temperature, ) calc_agent = AssistantAgent( name="calc", model_client=model_client, workbench=workbench, reflect_on_tool_use=True, ) return calc_agent class LegacyCalcAgent(LitAgent[Any]): """This is a Calc-X agent implemented with the legacy Agent-lightning API (v0.1).""" async def training_rollout_async(self, task: Any, rollout_id: str, resources: NamedResources) -> Any: # type: ignore llm: LLM = cast(LLM, resources.get("main_llm")) async with McpWorkbench(calculator_mcp_server) as workbench: calc_agent = autogen_assistant_agent( llm.model, llm.endpoint, llm.sampling_parameters.get("temperature", 0.7), workbench, ) try: output_format = "Output the answer when you are ready. The answer should be surrounded by three sharps (`###`), in the form of ### ANSWER: ###." prompt = task["question"] + " " + output_format result = await calc_agent.run(task=prompt) # evaluate answer = re.search(r"###\s*ANSWER:\s*(.+?)(\s*###|$)", result.messages[-1].content) # type: ignore if answer: answer = answer.group(1) else: answer = result.messages[-1].content # type: ignore except Exception as e: print("Failure:", str(e)) answer = "None" reward = await evaluate_v0_1( answer, str(task["result"]) # type: ignore ) # reward is tracked with the decorator print("answer: {} ground_truth: {} reward: {}".format(answer, task["result"], reward)) # type: ignore async def validation_rollout_async(self, task: Any, rollout_id: str, resources: NamedResources) -> Any: # type: ignore llm: LLM = cast(LLM, resources.get("main_llm")) resources = { "main_llm": LLM( endpoint=llm.endpoint, model=llm.model, sampling_parameters={"temperature": 0}, ) } return await self.training_rollout_async(task, rollout_id, resources) if __name__ == "__main__": Trainer(n_workers=10).fit_v0(LegacyCalcAgent(), "http://localhost:9999/") ================================================ FILE: examples/calc_x/legacy_calc_agent_debug.py ================================================ # Copyright (c) Microsoft. All rights reserved. """This script is the debugging script for the legacy Calc-X agent (v0.1).""" import os from legacy_calc_agent import LegacyCalcAgent from agentlightning import LLM, DevTaskLoader, Trainer def dev_task_loader() -> DevTaskLoader: return DevTaskLoader( tasks=[ { "question": "What is 2 + 2?", "result": "4", }, { "question": "What is 3 * 5?", "result": "15", }, { "question": "What is the square root of 16?", "result": "4", }, ], resources={ "main_llm": LLM( endpoint=os.environ["OPENAI_BASE_URL"], model="gpt-4.1-nano", sampling_parameters={"temperature": 0.7} ), }, ) if __name__ == "__main__": Trainer(n_workers=1, dev=True, max_tasks=2).fit_v0( LegacyCalcAgent(), "http://localhost:9999/", dev_data=dev_task_loader() ) ================================================ FILE: examples/calc_x/legacy_train.sh ================================================ #!/bin/bash # This script is only maintained on the CI for backward compatibility testing. # You will need to run the following Python script as a companion: # python legacy_calc_agent.py set -ex export N_GPUS=1 export BASE_MODEL=Qwen/Qwen2.5-1.5B-Instruct export DATA_DIR=data export ROLLOUT_TP_SIZE=1 export EXPERIMENT_NAME="calc_x_$(date +%Y%m%d%H%M%S)" export PROJECT_NAME=AgentLightningCI echo "project_name=${PROJECT_NAME}" >> $GITHUB_OUTPUT echo "run_name=${EXPERIMENT_NAME}" >> $GITHUB_OUTPUT PYTHONUNBUFFERED=1 python -m agentlightning.verl \ algorithm.adv_estimator=grpo \ data.train_files=${DATA_DIR}/train.parquet \ data.val_files=${DATA_DIR}/test_mini.parquet \ actor_rollout_ref.rollout.tensor_model_parallel_size=$ROLLOUT_TP_SIZE \ trainer.n_gpus_per_node=${N_GPUS} \ data.train_batch_size=32 \ actor_rollout_ref.rollout.n=4 \ actor_rollout_ref.actor.ppo_mini_batch_size=32 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=4 \ actor_rollout_ref.rollout.multi_turn.format=hermes \ actor_rollout_ref.model.path=${BASE_MODEL} \ data.max_prompt_length=4096 \ data.max_response_length=2048 \ data.truncation='error' \ trainer.val_before_train=True \ actor_rollout_ref.actor.optim.lr=1e-6 \ actor_rollout_ref.model.use_remove_padding=True \ actor_rollout_ref.actor.use_kl_loss=False \ actor_rollout_ref.actor.kl_loss_coef=0.000 \ actor_rollout_ref.actor.entropy_coeff=0 \ actor_rollout_ref.actor.clip_ratio_low=0.2 \ actor_rollout_ref.actor.clip_ratio_high=0.3 \ actor_rollout_ref.model.enable_gradient_checkpointing=True \ actor_rollout_ref.actor.fsdp_config.param_offload=True \ actor_rollout_ref.actor.fsdp_config.optimizer_offload=True \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.gpu_memory_utilization=0.8 \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=8 \ actor_rollout_ref.ref.fsdp_config.param_offload=True \ algorithm.use_kl_in_reward=False \ trainer.critic_warmup=0 \ trainer.logger=['console','wandb'] \ trainer.project_name=${PROJECT_NAME} \ trainer.experiment_name=${EXPERIMENT_NAME} \ trainer.nnodes=1 \ trainer.test_freq=6 \ trainer.total_epochs=1 \ trainer.total_training_steps=6 $@ ================================================ FILE: examples/calc_x/tests/test_agentops.py ================================================ # Copyright (c) Microsoft. All rights reserved. import agentops from agentops.sdk.decorators import operation from agentlightning.reward import reward @reward def process_data(data: str) -> float: # Your function logic here processed_result = data.upper() # type: ignore # agentops.record(Events("Processed Data", result=processed_result)) # Optional: record specific events return 1.0 @operation def process_data2(data: str) -> str: # Your function logic here processed_result = data.upper() # type: ignore # agentops.record(Events("Processed Data", result=processed_result)) # Optional: record specific events return processed_result agentops.init() # type: ignore process_data("hello") process_data2("hello2") ================================================ FILE: examples/calc_x/tests/test_mcp_calculator.py ================================================ # Copyright (c) Microsoft. All rights reserved. import asyncio import json import os import openai from mcp import ClientSession from mcp.client.stdio import StdioServerParameters, stdio_client async def main(): # 1. Initialize OpenAI client client = openai.OpenAI( base_url=os.environ["OPENAI_API_BASE"], api_key=os.environ["OPENAI_API_KEY"], ) # 2. Prepare MCP stdio connection to the calculator server server_params = StdioServerParameters( command="uvx", args=["mcp-server-calculator"], ) # 3. Ask the LLM to calculate an expression via a function call chat_resp = client.chat.completions.create( model="gpt-4.1-nano", messages=[{"role": "user", "content": "What is 31415926 * 11415789?"}], tools=[ { "type": "function", "function": { "name": "calculate", "description": "Evaluate a mathematical expression", "parameters": { "type": "object", "properties": {"expression": {"type": "string", "description": "The expression to calculate"}}, "required": ["expression"], }, }, } ], ) print(chat_resp) # 4. Extract the expression argument func_call = chat_resp.choices[0].message.tool_calls[0] # type: ignore expr = json.loads(func_call.function.arguments)["expression"] # type: ignore # 5. Connect to the MCP server and invoke the 'calculate' tool async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() print("Session initialized.") result = await session.call_tool("calculate", arguments={"expression": expr}) # The structured result is under `.structuredContent` value = result.structuredContent["result"] # type: ignore # 6. Print out the result print(f"{expr} = {value}") if __name__ == "__main__": asyncio.run(main()) ================================================ FILE: examples/calc_x/train_calc_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """The training helper script for Calc-X agent with VERL algorithm. Example usage: ```bash python train_calc_agent.py --train-file data/train.parquet --val-file data/test.parquet --llm-proxy ``` To use an external store, run a store server first: ```bash agl store --port 9999 ``` Then run the training script with the external store address: ```bash AGL_MANAGED_STORE=0 python train_calc_agent.py --external-store-address http://localhost:9999 ``` Alternatively, you can also run algorithms and runners separately if needed: ```bash AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=algorithm python train_calc_agent.py --external-store-address http://localhost:9999 AGL_MANAGED_STORE=0 AGL_CURRENT_ROLE=runner python train_calc_agent.py --external-store-address http://localhost:9999 ``` """ import argparse import os import uuid from datetime import datetime from typing import Any, Dict, Optional, cast from calc_agent import MathProblem, calc_agent from datasets import Dataset as HuggingFaceDataset import agentlightning as agl from agentlightning.env_var import LightningEnvVar, resolve_bool_env_var, resolve_str_env_var def verl_default_config() -> Dict[str, Any]: config = { "algorithm": { "adv_estimator": "grpo", "use_kl_in_reward": False, }, "data": { "train_batch_size": 32, "max_prompt_length": 4096, "max_response_length": 2048, }, "actor_rollout_ref": { "rollout": { "tensor_model_parallel_size": 1, "n": 4, "log_prob_micro_batch_size_per_gpu": 4, "multi_turn": {"format": "hermes"}, "name": "vllm", "gpu_memory_utilization": 0.6, "engine_kwargs": { "vllm": { "enable_auto_tool_choice": True, "tool_call_parser": "hermes", } }, }, "actor": { "ppo_mini_batch_size": 32, "ppo_micro_batch_size_per_gpu": 4, "optim": {"lr": 1e-6}, "use_kl_loss": False, "kl_loss_coef": 0.0, "entropy_coeff": 0, "clip_ratio_low": 0.2, "clip_ratio_high": 0.3, "fsdp_config": { "param_offload": True, "optimizer_offload": True, }, }, "ref": { "log_prob_micro_batch_size_per_gpu": 8, "fsdp_config": {"param_offload": True}, }, "model": { "path": "Qwen/Qwen2.5-1.5B-Instruct", "use_remove_padding": True, "enable_gradient_checkpointing": True, }, }, "trainer": { "n_gpus_per_node": 1, "val_before_train": True, "critic_warmup": 0, "logger": ["console", "wandb"], "project_name": "AgentLightning", "experiment_name": "calc_x", "nnodes": 1, "save_freq": 64, "test_freq": 32, "total_epochs": 2, }, } return config def train( *, train_file: str, val_file: str, model: Optional[str], llm_proxy: bool, ci: bool, ci_fast: bool, n_runners: int, external_store_address: str, lora: bool, lora_rank: int, lora_adapter_path: Optional[str], trajectory_level: bool = False, weave: bool, mongo_uri: Optional[str], ): """The training entrypoint function for Calc-X agent with VERL algorithm. Args: train_file: The path to the training parquet file. val_file: The path to the validation parquet file. model: The HF model id or path to override the default model. llm_proxy: Whether to enable LLM Proxy tracing/adapter. ci: Whether to run a minimal CI-style training loop. n_runners: The number of runners for the Trainer. ci_fast: Whether to cap the training loop at a single step (implies CI toggles). external_store_address: Connects to an external store instead of creating a new one in memory. lora: Whether to enable LoRA training. lora_rank: LoRA rank to use when LoRA is enabled. lora_adapter_path: Optional path to a pre-trained LoRA adapter to load. trajectory_level: Whether to enable trajectory level in trace aggregator. weave: Whether to enable Weave tracing. mongo_uri: MongoDB URI to use for the store. """ # Load datasets (respect CLI file paths) train_dataset = cast(agl.Dataset[MathProblem], HuggingFaceDataset.from_parquet(train_file).to_list()) # type: ignore val_dataset = cast(agl.Dataset[MathProblem], HuggingFaceDataset.from_parquet(val_file).to_list()) # type: ignore print("First 5 rows of train dataset:") print(train_dataset[:5]) # type: ignore print("First 5 rows of val dataset:") print(val_dataset[:5]) # type: ignore config = verl_default_config() if model: config["actor_rollout_ref"]["model"]["path"] = model # Enable LoRA configuration if requested if lora: config["actor_rollout_ref"]["model"]["lora_rank"] = lora_rank print(f"LoRA enabled: lora_rank={lora_rank}") if lora_adapter_path: config["actor_rollout_ref"]["model"]["lora_adapter_path"] = lora_adapter_path print(f"Loading LoRA adapter from: {lora_adapter_path}") print("LoRA configuration will trigger verl to set ref_in_actor=True (LoRA mode)") if trajectory_level: config["agentlightning"] = { "trace_aggregator": { "level": "trajectory", "trajectory_max_prompt_length": 2048, "trajectory_max_response_length": 8192, } } print("Trajectory level enabled in trace aggregator.") # CI toggle keeps everything else the same but you can tweak the lightweight bits here if desired if ci or ci_fast: # Config the experiment name and project name so that they are available to CI timestamp = datetime.now().strftime("%Y%m%d%H%M%S") random_suffix = uuid.uuid4().hex[:8] EXPERIMENT_NAME = f"calc_x_{timestamp}_{random_suffix}" PROJECT_NAME = "AgentLightningCI" # Skip this step if AGL_CURRENT_ROLE is runner agl_current_role = resolve_str_env_var(LightningEnvVar.AGL_CURRENT_ROLE) if agl_current_role != "runner": # Simulate writing to $GITHUB_OUTPUT if it’s set github_output = os.getenv("GITHUB_OUTPUT") if github_output: with open(github_output, "a") as f: f.write(f"project_name={PROJECT_NAME}\n") f.write(f"run_name={EXPERIMENT_NAME}\n") print("Set environment variables:") print(f"PROJECT_NAME={PROJECT_NAME}") print(f"EXPERIMENT_NAME={EXPERIMENT_NAME}") # Keep it tiny/light without adding new knobs config["actor_rollout_ref"]["rollout"]["gpu_memory_utilization"] = 0.8 config["trainer"]["total_epochs"] = 1 config["trainer"]["total_training_steps"] = 20 config["trainer"]["test_freq"] = 20 config["trainer"]["experiment_name"] = EXPERIMENT_NAME config["trainer"]["project_name"] = PROJECT_NAME config["trainer"].pop("save_freq", None) if ci_fast: # Extra fast CI toggle for testing purposes. config["actor_rollout_ref"]["rollout"]["gpu_memory_utilization"] = 0.6 config["trainer"]["total_training_steps"] = 1 config["trainer"]["test_freq"] = 1 algorithm = agl.VERL(config) if external_store_address: store: Optional[agl.LightningStore] = agl.LightningStoreClient(external_store_address) elif mongo_uri: from agentlightning.store.mongo import MongoLightningStore store = MongoLightningStore(mongo_uri=mongo_uri) else: store = None if llm_proxy: tracer = agl.OtelTracer() # dummy tracer for LLM Proxy adapter = agl.LlmProxyTraceToTriplet() trainer = agl.Trainer(algorithm=algorithm, n_runners=n_runners, store=store, tracer=tracer, adapter=adapter) elif weave: # NOTE: Don't import WeaveTracer at the module level or in __init__.py files. # Always import it lazily/conditionally (behind a feature flag) to avoid interfering # with other libraries like LiteLLM/OpenTelemetry when weave is not explicitly enabled. from agentlightning.tracer.weave import WeaveTracer tracer = WeaveTracer() trainer = agl.Trainer(algorithm=algorithm, n_runners=n_runners, store=store, tracer=tracer) else: trainer = agl.Trainer(algorithm=algorithm, n_runners=n_runners, store=store) trainer.fit(calc_agent, train_dataset, val_dataset=val_dataset) def main(): parser = argparse.ArgumentParser(description="Train a math calc agent with Agent-lightning + VERL.") parser.add_argument("--train-file", type=str, default="data/train.parquet", help="Path to train parquet file") parser.add_argument("--val-file", type=str, default="data/test.parquet", help="Path to val parquet file") parser.add_argument("--model", type=str, default=None, help="HF model id or path (optional)") parser.add_argument("--llm-proxy", action="store_true", help="Enable LLM Proxy tracing/adapter") parser.add_argument("--weave", action="store_true", help="Enable Weave tracing") parser.add_argument("--ci", action="store_true", help="Run a minimal CI-style training loop") parser.add_argument( "--ci-fast", action="store_true", help="Limit the training loop to a single step (implies --ci)" ) parser.add_argument("--n-runners", type=int, default=10, help="Number of runners for Trainer") parser.add_argument( "--external-store-address", type=str, default="", help="Connect to an external store instead of creating a new one in memory", ) parser.add_argument("--debug", action="store_true", help="Enable debug logging") parser.add_argument( "--lora", action="store_true", help="Enable LoRA training. When enabled, the reference policy is computed by the actor rollout worker.", ) parser.add_argument( "--lora-rank", type=int, default=32, help="LoRA rank to use when --lora is enabled (default: 32)", ) parser.add_argument( "--lora-adapter-path", type=str, default=None, help="Optional path to a pre-trained LoRA adapter to load when --lora is enabled", ) parser.add_argument( "--trajectory-level", action="store_true", help="Enable trajectory level in trace aggregator.", ) parser.add_argument( "--mongo-uri", type=str, default=None, help="MongoDB URI to use for the store.", ) args = parser.parse_args() if args.external_store_address: print(f"Connecting to external store at: {args.external_store_address}") if resolve_bool_env_var(LightningEnvVar.AGL_MANAGED_STORE, fallback=True): raise ValueError( "When using an external store, please set the environment variable AGL_MANAGED_STORE=0. " "Otherwise the trainer will still try to manage the store lifecycle for you!" ) if args.ci_fast: args.ci = True agl.setup_logging("DEBUG" if args.debug else "INFO") train( train_file=args.train_file, val_file=args.val_file, model=args.model, llm_proxy=args.llm_proxy, ci=args.ci, ci_fast=args.ci_fast, n_runners=args.n_runners, external_store_address=args.external_store_address, lora=args.lora, lora_rank=args.lora_rank, lora_adapter_path=args.lora_adapter_path, trajectory_level=args.trajectory_level, weave=args.weave, mongo_uri=args.mongo_uri, ) if __name__ == "__main__": main() ================================================ FILE: examples/chartqa/README.md ================================================ # ChartQA Example [![chartqa workflow status](https://github.com/microsoft/agent-lightning/actions/workflows/badge-chartqa.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-chartqa.yml) This example demonstrates training a visual reasoning agent on the ChartQA dataset using Agent-Lightning with the VERL algorithm and LangGraph framework. The agent answers questions about charts through a multi-step workflow with self-refinement. ## Requirements This example requires a single node with at least one 40GB GPU. Install dependencies with: ```bash uv sync --frozen \ --group dev \ --group experiment \ --group image \ --group langchain \ --group vllm-0-10-2 \ --group torch-gpu-stable ``` **Currently vLLM 0.10.2 is the only tested version. You might see issues like `cu_seqlens_q must be on CUDA` or flash-attn installation failures if you use other versions.** (See https://github.com/vllm-project/vllm/issues/27340) ## Dataset Download the ChartQA dataset and prepare it for training: ```bash cd examples/chartqa python prepare_data.py ``` This downloads the ChartQA dataset from HuggingFace (`HuggingFaceM4/ChartQA`), saves images locally, and creates parquet files for training/testing. No HuggingFace token is required (public dataset). **Dataset Statistics:** - Training: ~18,000 chart question-answer pairs - Test: ~2,500 pairs - Chart types: Bar, line, pie, scatter, etc. ## Included Files | File/Directory | Description | |----------------|-------------| | `chartqa_agent.py` | Chart reasoning agent using LangGraph with multi-step workflow (observe → extract → calculate → check → refine) | | `train_chartqa_agent.py` | Training script using VERL algorithm with configurable hyperparameters (debug, qwen) | | `debug_chartqa_agent.py` | Debugging script to test the agent with cloud APIs or a local vLLM proxy | | `prepare_data.py` | Script to download ChartQA dataset from HuggingFace and prepare parquet files | | `prompts.py` | Prompt templates for the agent workflow | | `multimodal_utils.py` | Utility functions for encoding images to base64 | | `env_var.py` | Environment variables and configurations | | `data/` | Directory containing images and parquet files after download | ## Running Examples ### Debugging with Cloud API (Default) For quick testing with OpenAI or other cloud APIs (no local GPU required): ```bash export OPENAI_API_KEY= python debug_chartqa_agent.py ``` For other providers (Azure, etc.), set `OPENAI_API_BASE`: ```bash export OPENAI_API_BASE=https://your-resource.openai.azure.com/v1 export OPENAI_MODEL=gpt-4o python debug_chartqa_agent.py ``` ### Debugging with Local Model (LLMProxy) To test the agent with a local vLLM server and LLMProxy: ```bash # Start a vLLM server (specify image path for VLM) export CHARTQA_DATA_DIR= vllm serve Qwen/Qwen2-VL-2B-Instruct \ --gpu-memory-utilization 0.6 \ --max-model-len 4096 \ --allowed-local-media-path $CHARTQA_DATA_DIR \ --enable-prefix-caching \ --port 8088 # Run the agent with LLMProxy USE_LLM_PROXY=1 \ OPENAI_API_BASE=http://localhost:8088/v1 \ OPENAI_MODEL=Qwen/Qwen2-VL-2B-Instruct \ python debug_chartqa_agent.py ``` ### Training with Local Model ```bash python train_chartqa_agent.py debug --n-runners 2 ``` You can also use an external store server (recommended for distributed setups), first start the store: ```bash agl store --port 4747 ``` Then run the training script with the external store address: ```bash AGL_MANAGED_STORE=0 python train_chartqa_agent.py qwen --external-store-address http://localhost:4747 ``` If you want to track experiments with Weights & Biases, set the `WANDB_API_KEY` environment variable before training. The script automatically launches agent workers and the training server. The agent workers execute chart reasoning rollouts using the vision-language model, while the training server applies the VERL algorithm (GRPO) to improve the model based on answer accuracy rewards. ================================================ FILE: examples/chartqa/chartqa_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ChartQA agent demonstrating LangGraph-based visual reasoning with refinement. This module defines `ChartQAAgent` plus the supporting prompt utilities used by `debug_chartqa_agent.py` and `train_chartqa_agent.py`. 1. `analyze_chart` observes and summarizes the chart. 2. `extract_data` calls a text-only LLM to extract the requested values. 3. `calculate_answer` runs calculations grounded in prior steps. 4. `check_answer` verifies reasoning quality. 5. `refine_answer` conditionally patches mistakes before responding. Example usage can be found in `debug_chartqa_agent.py` and `train_chartqa_agent.py`. """ from __future__ import annotations import logging import os import re from typing import Any, Dict, Literal, cast import env_var as chartqa_env_var import termcolor from langchain.chat_models import BaseChatModel, init_chat_model from langchain_core.messages import AnyMessage, BaseMessage, HumanMessage from langgraph.graph import END, START, MessagesState, StateGraph from langgraph.graph.state import CompiledStateGraph from multimodal_utils import encode_image_to_base64 from prompts import ( ANALYZE_CHART_PROMPT, CALCULATE_ANSWER_PROMPT, CHECK_ANSWER_PROMPT, EXTRACT_DATA_PROMPT, REFINE_ANSWER_PROMPT, ) import agentlightning as agl logger = logging.getLogger("chartqa_agent") class ChartState(MessagesState): question: str image_path: str observation: str extracted_data: str calculation: str answer: str feedback: str num_turns: int messages: list[AnyMessage] class ChartQAAgent(agl.LitAgent[Dict[str, Any]]): """LangGraph-powered ChartQA agent with multi-step reasoning and refinement. The implementation shares the same [`agl.LitAgent`][agentlightning.LitAgent] interface as the Calc-X sample agent but augments it with image handling and LangGraph state tracking. """ def __init__( self, model_name: str | None = None, max_turns: int = 3, debug: bool = False, endpoint: str | None = None, temperature: float = 0.0, use_base64_images: bool = False, ): self.debug = debug self.max_turns = max_turns self.use_base64_images = use_base64_images self.model_name = model_name self.endpoint = endpoint self.temperature = temperature self._llm: BaseChatModel | None = None self._graph: CompiledStateGraph[ChartState] | None = None def _create_llm(self) -> BaseChatModel: if self.model_name is None: raise ValueError("model_name is required for creating LLM") return init_chat_model( self.model_name, model_provider="openai", openai_api_base=self.endpoint, openai_api_key=chartqa_env_var.OPENAI_API_KEY, temperature=self.temperature, max_retries=2, max_tokens=1024, timeout=300, ) def update_llm_config(self, model_name: str, endpoint: str | None, temperature: float | None) -> None: """Update the LLM configuration. Re-create the LLM if the configuration is changed.""" updated: bool = False if model_name != self.model_name: self.model_name = model_name updated = True if endpoint != self.endpoint: self.endpoint = endpoint updated = True if temperature != self.temperature: self.temperature = temperature updated = True if updated: self._llm = self._create_llm() def _ensure_llm(self) -> BaseChatModel: """Ensure the LLM is created and cached.""" if self._llm is None: self._llm = self._create_llm() return self._llm def invoke_prompt(self, prompt: Any) -> AnyMessage: """Invoke LLM with prompt.""" if self.debug: for message in prompt.messages: termcolor.cprint(message.pretty_repr(), "blue") try: result = self._ensure_llm().invoke(prompt) except Exception as e: logger.error(f"Failed to invoke prompt: {e}") result = self._ensure_llm().invoke([HumanMessage(content="Please provide a reasonable answer.")]) if self.debug: termcolor.cprint(result.pretty_repr(), "green") return result # type: ignore def invoke_prompt_with_image(self, prompt_text: str, image_path: str) -> str: """Invoke vision-language model with image. Handles both local vLLM (file:// URLs) and cloud APIs (base64 encoding). Cloud APIs (OpenAI, Anthropic, Google, Azure, etc.) require base64 encoding. """ # Determine image URL format based on endpoint if self.use_base64_images: # Cloud APIs require base64 encoding for local files image_url = encode_image_to_base64(image_path) else: # Local vLLM supports file:// URLs if not image_path.startswith("file://"): image_path = f"file://{os.path.realpath(image_path)}" image_url = image_path messages = [ { "role": "user", "content": [ {"type": "text", "text": prompt_text}, {"type": "image_url", "image_url": {"url": image_url}}, ], } ] if self.debug: termcolor.cprint(f"[VLM Call] {prompt_text[:100]}...", "blue") try: result = self._ensure_llm().invoke(messages) response = result.content if hasattr(result, "content") else str(result) # type: ignore except Exception as e: logger.error(f"Failed to invoke VLM: {e}") response = "Unable to analyze chart" if self.debug: termcolor.cprint(f"[VLM Response] {response[:200]}...", "green") return response # type: ignore def extract_content(self, text: str, tag: str) -> str: """Extract content between XML-style tags.""" match = re.search(rf"<{tag}>(.*?)", text, re.DOTALL) return match.group(1).strip() if match else "" def analyze_chart(self, state: ChartState) -> ChartState: """Step 1: Observe and describe the chart.""" prompt: Any = ANALYZE_CHART_PROMPT.invoke({"question": state["question"]}) # type: ignore prompt_text = prompt.messages[1].content result_text = self.invoke_prompt_with_image(prompt_text, state["image_path"]) observation = self.extract_content(result_text, "observe") if not observation: observation = result_text return { # type: ignore **state, "observation": observation, "num_turns": 1, "messages": [HumanMessage(content=result_text)], } def extract_data(self, state: ChartState) -> ChartState: """Step 2: Extract specific data values.""" prompt: Any = EXTRACT_DATA_PROMPT.invoke( # type: ignore { "observation": state["observation"], "question": state["question"], } ) result = self.invoke_prompt(prompt) extracted_data = self.extract_content(result.content, "extract") # type: ignore if not extracted_data: extracted_data = result.content # type: ignore return { # type: ignore **state, "extracted_data": extracted_data, # type: ignore "messages": [*state.get("messages", []), result], } def calculate_answer(self, state: ChartState) -> ChartState: """Step 3: Calculate and provide answer.""" prompt: Any = CALCULATE_ANSWER_PROMPT.invoke( # type: ignore { "extracted_data": state["extracted_data"], "question": state["question"], } ) result = self.invoke_prompt(prompt) calculation = self.extract_content(result.content, "calculate") # type: ignore answer = self.extract_content(result.content, "answer") # type: ignore if not answer: answer = cast(str, result.content) # type: ignore return { # type: ignore **state, "calculation": calculation, "answer": answer, "messages": [*state.get("messages", []), result], } def check_answer(self, state: ChartState) -> ChartState: """Step 4: Verify answer quality.""" prompt: Any = CHECK_ANSWER_PROMPT.invoke( # type: ignore { "observation": state["observation"], "extracted_data": state["extracted_data"], "question": state["question"], "answer": state["answer"], "calculation": state.get("calculation", "No calculation shown"), } ) result = self.invoke_prompt(prompt) if self.debug: termcolor.cprint(f"[Check] {result.content}", "yellow") # type: ignore return { # type: ignore **state, "feedback": result.content, # type: ignore "messages": [*state.get("messages", []), *prompt.messages, result], } def refine_answer(self, state: ChartState) -> ChartState: """Step 5: Refine answer based on feedback.""" prompt: Any = REFINE_ANSWER_PROMPT.invoke( # type: ignore { "observation": state["observation"], "extracted_data": state["extracted_data"], "question": state["question"], "answer": state["answer"], "calculation": state.get("calculation", ""), "feedback": state["feedback"], } ) result = self.invoke_prompt(prompt) content: str = result.content # type: ignore new_extracted = self.extract_content(content, "extract") extracted_data = new_extracted if new_extracted else state["extracted_data"] new_calculation = self.extract_content(content, "calculate") new_answer = self.extract_content(content, "answer") if not new_answer: new_answer = content return { # type: ignore **state, "extracted_data": extracted_data, "calculation": new_calculation, "answer": new_answer, "num_turns": state.get("num_turns", 0) + 1, "messages": [*prompt.messages, result], } def should_continue(self, state: ChartState) -> Literal[END, "refine_answer"]: # type: ignore """Determine if refinement is needed.""" if state["messages"] and isinstance( state["messages"][-1], BaseMessage ): # pyright: ignore[reportUnnecessaryIsInstance] last_message = state["messages"][-1] if "THE ANSWER IS CORRECT" in last_message.content: # type: ignore if "THE ANSWER IS INCORRECT" in last_message.content: # type: ignore correct_index = last_message.content.rfind("THE ANSWER IS CORRECT") # type: ignore incorrect_index = last_message.content.rfind("THE ANSWER IS INCORRECT") # type: ignore if correct_index > incorrect_index: return END else: return END if state.get("num_turns", 0) >= self.max_turns: return END return "refine_answer" def graph(self) -> CompiledStateGraph[ChartState]: """Build the workflow graph with refinement loop.""" # Check if the graph is already built if self._graph is not None: return self._graph builder = StateGraph(ChartState) builder.add_node(self.analyze_chart) # type: ignore builder.add_node(self.extract_data) # type: ignore builder.add_node(self.calculate_answer) # type: ignore builder.add_node(self.check_answer) # type: ignore builder.add_node(self.refine_answer) # type: ignore builder.add_edge(START, "analyze_chart") builder.add_edge("analyze_chart", "extract_data") builder.add_edge("extract_data", "calculate_answer") builder.add_edge("calculate_answer", "check_answer") builder.add_conditional_edges( "check_answer", self.should_continue, # type: ignore ) builder.add_edge("refine_answer", "extract_data") self._graph = builder.compile() # type: ignore return self._graph def rollout(self, task: Dict[str, Any], resources: agl.NamedResources, rollout: agl.Rollout) -> float | None: """AgentLightning wrapper for ChartQA agent.""" question = task["question"] rollout = cast(agl.AttemptedRollout, rollout) llm = cast(agl.LLM, resources["main_llm"]) image_path = os.path.join(chartqa_env_var.CHARTQA_DATA_DIR, task["image_path"]) ground_truth = task["answer"] if not os.path.exists(image_path): logger.error(f"Image {image_path} does not exist. Skipping.") return None # The new rollout could have a different endpoint or temperature. # Update the LLM if necessary. self.update_llm_config( model_name=llm.model, endpoint=llm.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id), temperature=llm.sampling_parameters.get("temperature", 0.0), ) try: handler = self.tracer.get_langchain_handler() result = self.graph().invoke( # type: ignore {"question": question, "image_path": image_path}, # type: ignore {"callbacks": [handler] if handler else [], "recursion_limit": 100}, ) except Exception as e: error_msg = f"[Rollout {rollout.rollout_id}] Error during agent invocation: {e}" logger.error(error_msg, exc_info=True) # Return 0.0 as reward to indicate failure return 0.0 predicted_answer = result["answer"] reward = evaluate_answer(predicted_answer, ground_truth, raise_on_error=False) return reward def evaluate_answer(predicted: str, ground_truth: str, raise_on_error: bool = False) -> float: """Evaluate answer accuracy.""" try: pred = predicted.lower().strip() gt = ground_truth.lower().strip() # Exact match if pred == gt: return 1.0 # Try numeric comparison try: pred_num = float(pred.replace(",", "")) gt_num = float(gt.replace(",", "")) if abs(pred_num - gt_num) / max(abs(gt_num), 1e-9) < 0.02: return 1.0 except (ValueError, AttributeError): pass # Partial credit for substring match if pred in gt or gt in pred: return 0.5 return 0.0 except Exception as e: if raise_on_error: raise logger.exception(f"Error evaluating answer: {e}") return 0.0 ================================================ FILE: examples/chartqa/debug_chartqa_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Debugging helpers for the ChartQA agent. Example usage for OpenAI API: ```bash python debug_chartqa_agent.py ``` Example usage for self-hosted model. ``` vllm serve Qwen/Qwen2-VL-2B-Instruct \ --gpu-memory-utilization 0.6 \ --max-model-len 4096 \ --allowed-local-media-path $CHARTQA_DATA_DIR \ --enable-prefix-caching \ --port 8088 USE_LLM_PROXY=1 OPENAI_API_BASE=http://localhost:8088/v1 OPENAI_MODEL=Qwen/Qwen2-VL-2B-Instruct python debug_chartqa_agent.py ``` Ensure `CHARTQA_DATA_DIR` points to a directory with the prepared parquet file by running `python prepare_data.py` beforehand. """ from __future__ import annotations import logging import os from typing import Any, Dict, List, cast import env_var as chartqa_env_var import pandas as pd from chartqa_agent import ChartQAAgent import agentlightning as agl logger = logging.getLogger("chartqa_agent") def create_llm_proxy_for_chartqa(vllm_endpoint: str, port: int = 8081) -> agl.LLMProxy: """Create an LLMProxy configured for ChartQA with token ID capture. Args: vllm_endpoint: Base URL for the hosted vLLM server. port: Local port where the proxy should listen. Returns: An [`LLMProxy`][agentlightning.LLMProxy] instance launched in a thread. """ store = agl.LightningStoreThreaded(agl.InMemoryLightningStore()) llm_proxy = agl.LLMProxy( port=port, store=store, model_list=[ { "model_name": "Qwen/Qwen2-VL-2B-Instruct", "litellm_params": { "model": "hosted_vllm/Qwen/Qwen2-VL-2B-Instruct", "api_base": vllm_endpoint, }, } ], callbacks=["return_token_ids"], launch_mode="thread", ) return llm_proxy def debug_chartqa_agent(use_llm_proxy: bool = False) -> None: """Debug the ChartQA agent against cloud APIs or a local vLLM proxy. Args: use_llm_proxy: When `True`, spin up an LLMProxy that points to a local vLLM endpoint. Raises: FileNotFoundError: If the prepared ChartQA parquet file is missing. """ test_data_path = os.path.join(chartqa_env_var.CHARTQA_DATA_DIR, "test_chartqa.parquet") if not os.path.exists(test_data_path): raise FileNotFoundError(f"Test data file {test_data_path} does not exist. Please run prepare_data.py first.") df = pd.read_parquet(test_data_path).head(10) # type: ignore test_data = cast(List[Dict[str, Any]], df.to_dict(orient="records")) # type: ignore model = chartqa_env_var.OPENAI_MODEL endpoint = chartqa_env_var.OPENAI_API_BASE logger.info( "Debug data: %s samples, model: %s, endpoint: %s, llm_proxy=%s", len(test_data), model, endpoint, use_llm_proxy, ) llm_endpoint = endpoint trainer_kwargs: Dict[str, Any] = {} if use_llm_proxy: proxy_port = 8089 llm_proxy = create_llm_proxy_for_chartqa(endpoint, port=proxy_port) trainer_kwargs["llm_proxy"] = llm_proxy trainer_kwargs["n_workers"] = 2 llm_endpoint = f"http://localhost:{proxy_port}/v1" agent = ChartQAAgent() else: trainer_kwargs["n_workers"] = 1 agent = ChartQAAgent(use_base64_images=True) trainer = agl.Trainer( initial_resources={ "main_llm": agl.LLM( endpoint=llm_endpoint, model=model, sampling_parameters={"temperature": 0.0}, ) }, **trainer_kwargs, ) trainer.dev(agent, test_data) if __name__ == "__main__": agl.setup_logging(apply_to=["chartqa_agent"]) debug_chartqa_agent(use_llm_proxy=chartqa_env_var.USE_LLM_PROXY) ================================================ FILE: examples/chartqa/env_var.py ================================================ # Copyright (c) Microsoft. All rights reserved. import os __all__ = [ "CHARTQA_ROOT_DIR", "CHARTQA_DATA_DIR", "CHARTQA_IMAGES_DIR", "USE_BASE64_IMAGES", "USE_LLM_PROXY", "OPENAI_API_BASE", "OPENAI_API_KEY", "OPENAI_MODEL", ] CHARTQA_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) CHARTQA_DATA_DIR = os.getenv("CHARTQA_DATA_DIR", os.path.realpath(os.path.join(CHARTQA_ROOT_DIR, "data"))) CHARTQA_IMAGES_DIR = os.getenv("CHARTQA_IMAGES_DIR", os.path.realpath(os.path.join(CHARTQA_ROOT_DIR, "data", "images"))) USE_BASE64_IMAGES = os.getenv("USE_BASE64_IMAGES", "false").lower() in ("1", "true", "yes") USE_LLM_PROXY = os.getenv("USE_LLM_PROXY", "false").lower() in ("1", "true", "yes") OPENAI_API_BASE = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "token-abc123") OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4.1-mini") ================================================ FILE: examples/chartqa/multimodal_utils.py ================================================ # Copyright (c) Microsoft. All rights reserved. """ Multimodal support utilities for Agent Lightning. This module provides helper functions for working with multimodal agents, particularly for vision-language tasks. """ from __future__ import annotations import base64 from io import BytesIO from pathlib import Path from typing import Any, Union import requests from PIL import Image from PIL.Image import Image as PILImage __all__ = [ "encode_image_to_base64", "create_image_message", ] def encode_image_to_base64(image: Union[str, Path, PILImage], max_size: int = 2048) -> str: """ Encode an image to base64 string for multimodal LLM APIs. Args: image: Image source (file path, URL, or PIL Image object) max_size: Maximum dimension for resizing Returns: Base64 encoded image string with data URI prefix Raises: ImportError: If PIL (Pillow) is not installed TypeError: If image type is not supported Examples: >>> encoded = encode_image_to_base64("photo.jpg") >>> encoded[:30] 'data:image/jpeg;base64,/9j/4A...' >>> from PIL import Image >>> img = Image.open("photo.jpg") >>> encoded = encode_image_to_base64(img) """ # Load image if isinstance(image, (str, Path)): image_str = str(image) if image_str.startswith(("http://", "https://")): response = requests.get(image_str, timeout=30) response.raise_for_status() img = Image.open(BytesIO(response.content)) else: img = Image.open(image_str) elif hasattr(image, "mode"): # PIL Image object img = image else: raise TypeError(f"Unsupported image type: {type(image)}") # Convert to RGB if img.mode == "RGBA": background = Image.new("RGB", img.size, (255, 255, 255)) background.paste(img, mask=img.split()[3]) img = background elif img.mode != "RGB": img = img.convert("RGB") # Resize if needed if max(img.size) > max_size: img.thumbnail((max_size, max_size), Image.Resampling.LANCZOS) # Encode buffered = BytesIO() img.save(buffered, format="JPEG", quality=85) img_str = base64.b64encode(buffered.getvalue()).decode() return f"data:image/jpeg;base64,{img_str}" def create_image_message(text: str, image: Union[str, Path, PILImage], use_base64: bool = True) -> dict[str, Any]: """ Create an OpenAI-compatible multimodal message. Args: text: The text prompt/question image: Image source (path, URL, or PIL Image) use_base64: If True, encode as base64; if False, use URL directly Returns: Message dict with role="user" and multimodal content Examples: >>> msg = create_image_message("What's in the image?", "photo.jpg") >>> msg["role"] 'user' >>> len(msg["content"]) 2 """ content: list[dict[str, Any]] = [{"type": "text", "text": text}] if isinstance(image, str) and image.startswith(("http://", "https://")) and not use_base64: content.append({"type": "image_url", "image_url": {"url": image}}) else: encoded = encode_image_to_base64(image) content.append({"type": "image_url", "image_url": {"url": encoded}}) return {"role": "user", "content": content} ================================================ FILE: examples/chartqa/prepare_data.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Prepare ChartQA dataset from HuggingFace for training.""" from pathlib import Path from typing import Any, Dict, List import pandas as pd from datasets import load_dataset # pyright: ignore[reportUnknownVariableType] def prepare_chartqa(): """Download ChartQA and convert to parquet format.""" data_dir = Path("data") images_dir = data_dir / "images" images_dir.mkdir(parents=True, exist_ok=True) dataset = load_dataset("HuggingFaceM4/ChartQA") for split in ["train", "test"]: tasks: List[Dict[str, Any]] = [] dataset_length = len(dataset[split]) # type: ignore for idx, item in enumerate(dataset[split]): # pyright: ignore[reportUnknownArgumentType] if idx % 1000 == 0: print(f"Processing {split} item {idx} (out of {dataset_length})") image_filename = f"{split}_{idx:06d}.png" image_path = images_dir / image_filename if not image_path.exists(): item["image"].save(image_path) tasks.append( { "id": f"{split}_{idx}", "image_path": f"images/{image_filename}", "question": item["query"], "answer": str(item["label"]), } ) pd.DataFrame(tasks).to_parquet(data_dir / f"{split}_chartqa.parquet", index=False) # type: ignore if __name__ == "__main__": prepare_chartqa() ================================================ FILE: examples/chartqa/prompts.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Prompts for ChartQA agent workflow.""" from langchain_core.prompts import ChatPromptTemplate ANALYZE_CHART_PROMPT = ChatPromptTemplate( [ ( "system", """ You are a visual reasoning expert analyzing charts and graphs. Given a chart image and a question, first carefully observe and describe the chart. Instructions: - Identify the chart type (bar chart, line chart, pie chart, scatter plot, etc.) - Note the axes labels and units (if applicable) - Describe the data series or categories shown - Observe key patterns, trends, or noteworthy values - Pay attention to legends, titles, and annotations ## Output Format ## Provide your observation inside and tags. Example: Bar chart showing GDP of 5 countries. X-axis shows country names, Y-axis shows GDP in trillions of USD. Data values: USA appears highest at around 25, China second at around 20, followed by India, UK, and France. """.strip(), ), ("user", "Question: {question}"), ] ) EXTRACT_DATA_PROMPT = ChatPromptTemplate( [ ( "system", """ Based on your observation of the chart, extract the specific data values needed to answer the question. Instructions: - Extract only the data relevant to the question - Be precise with values (read carefully from the chart) - Include labels/categories with each value - Use appropriate units ## Output Format ## Provide extracted data inside and tags. Format: Label1: Value1, Label2: Value2, ... Example: USA: 25, China: 20, India: 15, UK: 10, France: 8 """.strip(), ), ( "user", """Observation: {observation} Question: {question} Please extract the relevant data values.""", ), ] ) CALCULATE_ANSWER_PROMPT = ChatPromptTemplate( [ ( "system", """ Using the extracted data, perform any necessary calculations to answer the question. Instructions: - Show your calculation steps clearly - Use correct mathematical operations - Pay attention to the question (average, sum, difference, maximum, etc.) - Provide a precise numerical answer if applicable - Keep the answer concise (typically 1-10 words) ## Output Format ## Show calculation inside and tags (if needed). Provide final answer inside and tags. Example: Average = (25 + 20 + 15 + 10 + 8) / 5 = 78 / 5 = 15.6 15.6 """.strip(), ), ( "user", """Extracted Data: {extracted_data} Question: {question} Please calculate and provide the answer.""", ), ] ) CHECK_ANSWER_PROMPT = ChatPromptTemplate( [ ( "system", """ You are a chart analysis expert with strong attention to detail. Review the answer for potential mistakes. Common mistakes to check: - Incorrect data extraction from chart (misread values) - Arithmetic errors in calculations - Misunderstanding the question type (average vs. sum vs. difference) - Wrong number of data points counted - Incorrect units or scale interpretation - Off-by-one errors ## Chart Information ## Observation: {observation} Extracted Data: {extracted_data} ## Output Format ## If any mistakes are found, list each error clearly. After listing mistakes (if any), conclude with **ONE** of the following exact phrases in all caps: - If mistakes are found: `THE ANSWER IS INCORRECT.` - If no mistakes are found: `THE ANSWER IS CORRECT.` DO NOT write the corrected answer in this response. You only need to report mistakes. """.strip(), ), ( "user", """Question: {question} Current Answer: {answer} Calculation shown: {calculation} Please review this answer for correctness.""", ), ] ) REFINE_ANSWER_PROMPT = ChatPromptTemplate( [ ( "system", """ You are a chart analysis agent. The previous answer had errors. Based on the feedback, provide a corrected answer. Instructions: - Re-examine the chart observation carefully - Correct any data extraction errors by re-extracting if needed - Fix calculation mistakes - Address all points mentioned in the feedback ## Chart Observation ## {observation} ## Output Format ## If you need to re-extract data, provide it inside and tags. Show corrected calculation inside and tags. Provide corrected answer inside and tags. """.strip(), ), ( "user", """Question: {question} ## Previous Attempt ## Extracted Data: {extracted_data} Calculation: {calculation} Answer: {answer} ## Feedback ## {feedback} Please provide the corrected answer.""", ), ] ) ================================================ FILE: examples/chartqa/train_chartqa_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Training helper for ChartQA modeled VERL workflow. Example usage: ```bash python train_chartqa_agent.py debug --n-runners 2 ``` or: ```bash AGL_MANAGED_STORE=0 python train_chartqa_agent.py qwen --external-store-address http://localhost:9999 ``` Make sure to run `python prepare_data.py` so the parquet files referenced here exist. """ from __future__ import annotations import argparse import os import uuid from copy import deepcopy from datetime import datetime from typing import Any, Dict, Optional, cast import env_var as chartqa_env_var import pandas as pd from chartqa_agent import ChartQAAgent import agentlightning as agl from agentlightning.env_var import LightningEnvVar, resolve_bool_env_var RL_CONFIG: Dict[str, Any] = { "algorithm": {"adv_estimator": "grpo", "use_kl_in_reward": False}, "data": { "image_base_dir": chartqa_env_var.CHARTQA_IMAGES_DIR, "train_batch_size": 32, "max_prompt_length": 4096, "max_response_length": 1024, "truncation": "error", }, "actor_rollout_ref": { "rollout": { "tensor_model_parallel_size": 1, "n": 4, "log_prob_micro_batch_size_per_gpu": 1, "name": "vllm", "gpu_memory_utilization": 0.8, "enable_prefix_caching": True, "engine_kwargs": {"vllm": {"allowed_local_media_path": chartqa_env_var.CHARTQA_IMAGES_DIR}}, }, "actor": { "ppo_mini_batch_size": 32, "ppo_micro_batch_size_per_gpu": 4, "optim": {"lr": 1e-6}, "use_kl_loss": False, "kl_loss_coef": 0.0, "entropy_coeff": 0, "clip_ratio_low": 0.2, "clip_ratio_high": 0.3, "fsdp_config": {"param_offload": True, "optimizer_offload": True}, }, "ref": {"log_prob_micro_batch_size_per_gpu": 1, "fsdp_config": {"param_offload": True}}, "model": { "path": "Qwen/Qwen2-VL-2B-Instruct", "use_remove_padding": True, "enable_gradient_checkpointing": True, }, }, "trainer": { "n_gpus_per_node": 1, "val_before_train": False, "critic_warmup": 0, "logger": ["console", "wandb"], "project_name": "AgentLightning", "experiment_name": "chartqa", "nnodes": 1, }, } def config_ci() -> Dict[str, Any]: """Return a CI-friendly RL config for ChartQA.""" # For CI testing, we need to set the experiment name and project name so that # they are available to subsequent steps. timestamp = datetime.now().strftime("%Y%m%d%H%M%S") random_suffix = uuid.uuid4().hex[:8] EXPERIMENT_NAME = f"chartqa_ci_{timestamp}_{random_suffix}" PROJECT_NAME = "AgentLightningCI" github_output = os.getenv("GITHUB_OUTPUT") if github_output: with open(github_output, "a") as f: f.write(f"project_name={PROJECT_NAME}\n") f.write(f"run_name={EXPERIMENT_NAME}\n") config = deepcopy(RL_CONFIG) config["data"]["train_batch_size"] = 16 config["trainer"]["n_gpus_per_node"] = 1 config["trainer"]["total_training_steps"] = 4 config["trainer"]["val_before_train"] = True config["trainer"]["test_freq"] = 2 config["trainer"]["experiment_name"] = EXPERIMENT_NAME config["trainer"]["project_name"] = PROJECT_NAME return config def config_debug() -> Dict[str, Any]: """Return a short debugging config for smoke testing ChartQA training.""" config = deepcopy(RL_CONFIG) config["actor_rollout_ref"]["rollout"]["gpu_memory_utilization"] = 0.5 config["trainer"]["total_training_steps"] = 10 config["trainer"]["test_freq"] = 2 return config def config_qwen() -> Dict[str, Any]: """Return a Qwen-focused config with validation before each epoch.""" config = deepcopy(RL_CONFIG) config["trainer"]["val_before_train"] = True config["trainer"]["n_gpus_per_node"] = 2 config["trainer"]["total_epochs"] = 2 config["trainer"]["test_freq"] = 32 return config def train( config: Dict[str, Any], train_data: agl.Dataset[Any], val_data: agl.Dataset[Any], external_store_address: str, n_runners: int, debug: bool, ) -> None: """Run VERL training for ChartQA. Args: config: VERL configuration produced by one of the helpers above. train_data: Training dataset of ChartQA samples. val_data: Validation dataset for periodic evaluation. external_store_address: Optional address of an existing LightningStore to reuse. n_runners: Number of runners passed to [`Trainer.fit`][agentlightning.Trainer.fit]. debug: Enables verbose logging tied to `--debug`. """ agl.setup_logging(level="DEBUG" if debug else "INFO", apply_to=["agentlightning", __name__]) agent = ChartQAAgent() algorithm = agl.VERL(config) if external_store_address: store: Optional[agl.LightningStore] = agl.LightningStoreClient(external_store_address) else: store = None trainer = agl.Trainer( n_runners=n_runners, algorithm=algorithm, store=store, ) trainer.fit(agent, train_dataset=train_data, val_dataset=val_data) # type: ignore def main(): """Parse CLI arguments and kick off ChartQA training.""" agl.setup_logging(apply_to=["chartqa_agent"]) parser = argparse.ArgumentParser(description="Train ChartQA agent") parser.add_argument("config", choices=["debug", "qwen", "ci"], help="Training configuration") parser.add_argument("--n-runners", type=int, default=10, help="Number of runners for Trainer") parser.add_argument( "--external-store-address", type=str, default=None, help="Connect to an external store instead of creating a new one in memory (e.g., http://localhost:4747)", ) parser.add_argument("--debug", action="store_true", help="Enable debug logging") args = parser.parse_args() if args.external_store_address: print(f"Connecting to external store at: {args.external_store_address}") if resolve_bool_env_var(LightningEnvVar.AGL_MANAGED_STORE, fallback=True): raise ValueError( "When using an external store, please set the environment variable AGL_MANAGED_STORE=0. " "Otherwise the trainer will still try to manage the store lifecycle for you!" ) CONFIGS = { "debug": config_debug, "qwen": config_qwen, "ci": config_ci, } train_data_path = os.path.join(chartqa_env_var.CHARTQA_DATA_DIR, "train_chartqa.parquet") val_data_path = os.path.join(chartqa_env_var.CHARTQA_DATA_DIR, "test_chartqa.parquet") train_data = pd.read_parquet(train_data_path).to_dict(orient="records") # type: ignore if args.config in ["debug", "ci"]: val_data = pd.read_parquet(val_data_path).sample(n=100, random_state=42).to_dict(orient="records") # type: ignore else: val_data = pd.read_parquet(val_data_path).to_dict(orient="records") # type: ignore train( config=CONFIGS[args.config](), train_data=cast(agl.Dataset[Any], train_data), val_data=cast(agl.Dataset[Any], val_data), external_store_address=args.external_store_address, n_runners=args.n_runners, debug=args.debug, ) if __name__ == "__main__": main() ================================================ FILE: examples/claude_code/README.md ================================================ # Training Claude Code with Agent-lightning [![claude-code CI status](https://github.com/microsoft/agent-lightning/actions/workflows/examples-claude-code.yml/badge.svg)](https://github.com/microsoft/agent-lightning/actions/workflows/examples-claude-code.yml) This example shows how to wrap Anthropic's Claude Code experience with Agent-lightning instrumentation to solve SWE-bench tasks, collect spans/logs, and optionally convert those traces into HuggingFace datasets. **NOTE:** This example only shows how to integrate Claude Code as an agent in Agent-lightning. The training part is still under development and welcoming contributions! ## Overview `claude_code_agent.py` spins up a Lightning Store, an LLM proxy, and the Claude Code controller. Each SWE-bench instance is executed inside the official container image so you can either prompt-tune against Anthropic's hosted models or point Claude Code at a self-hosted OpenAI-compatible backend such as vLLM. When a backend surfaces token IDs/logprobs (e.g., vLLM), the traces are turned into triplets that downstream fine-tuning pipelines can consume. ## Requirements First, install Agent-lightning following the [installation guide](https://microsoft.github.io/agent-lightning/stable/tutorials/installation/). Then install the SWE-bench harness plus utilities used by this example: ```bash (uv) pip install swebench transformers datasets python-dotenv ``` Docker must be available because each SWE-bench instance is executed in a container via `swebench_utils`. Finally, set API credentials depending on backend: - `ANTHROPIC_API_KEY` for the official Claude Code path. - `OPENAI_API_KEY` (or another OpenAI-compatible key) for the `openai` backend. - A running OpenAI-compatible server (e.g., vLLM) when using the `vllm` backend. ## Dataset `swebench_samples.jsonl` contains a handful of SWE-bench issues for smoke testing. For full-scale benchmarks load `princeton-nlp/SWE-bench` via `load_swebench_dataset` or point `--dataset-path` to your own JSONL file. ## Included Files | File/Directory | Description | |----------------|-------------| | `claude_code_agent.py` | CLI entry point that launches the Lightning store, LLM proxy, and Claude Code agent | | `claude_code_controller.py` | Manages the SWE-bench Docker runtime and translates model outputs into git patches | | `extended_adapter.py` | Adapter that converts LLM proxy spans into triplets with token IDs, logprobs, and chat history | | `swebench_samples.jsonl` | Mini SWE-bench subset for quick validation | | `swebench_utils/` | Utilities for running/evaluating SWE-bench instances inside containers | | `templates/handle_hook.template.sh` | Helper script injected into containers for hook handling | | `templates/settings.template.json` | Base configuration consumed by Claude Code CLI | ## Running the Example All commands are issued from `examples/claude_code`. Inspect the module-level docstring in `claude_code_agent.py` for the full CLI reference. ### Hosted vLLM (open-source models) First, launch your model behind an OpenAI-compatible endpoint, for example: ```bash vllm serve Qwen/Qwen3-Coder-30B-A3B-Instruct \ --max-model-len 131072 \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder ``` Run the Agent-lightning harness and point it at the server: ```bash python claude_code_agent.py vllm \ --backend-model-high Qwen/Qwen3-Coder-30B-A3B-Instruct \ --backend-model-low Qwen/Qwen3-Coder-30B-A3B-Instruct \ --frontend-model-high claude-sonnet-4-5-20250929 \ --frontend-model-low claude-haiku-4-5-20251001 \ --base-url http://localhost:8000/v1 \ --dataset-path swebench_samples.jsonl \ --output-dir data_debug \ --max-turns 5 \ --limit 2 ``` The backend model names must match what the server exposes. Because this mode surfaces token IDs/logprobs, the script saves both raw span logs and HuggingFace datasets per instance. ### Official Claude Code (Anthropic API) ```bash export ANTHROPIC_API_KEY=sk-... python claude_code_agent.py anthropic \ --dataset-path swebench_samples.jsonl \ --output-dir data_anthropic \ --frontend-model-high claude-sonnet-4-5-20250929 \ --frontend-model-low claude-haiku-4-5-20251001 ``` Backend model flags are optional here because the Anthropic API strings match the frontend names. This path is ideal for validating prompts against the hosted experience (trace outputs do not contain token IDs or logprobs). ### OpenAI-Compatible Providers ```bash export OPENAI_API_KEY=sk-... python claude_code_agent.py openai \ --backend-model-high gpt-4.1 \ --backend-model-low gpt-4o-mini \ --dataset-path swebench_samples.jsonl \ --output-dir data_openai ``` Use this mode whenever Claude Code should talk to Azure OpenAI, OpenAI, or another compatible provider. `--base-url` is optional—pass it if your endpoint differs from the public OpenAI URL. Adjust `--max-turns`, `--cooldown-seconds`, and `--limit` to control runtime and rate limits regardless of backend. ## Outputs and Trace Collection - `output_dir/stream_.json` contains the complete span stream captured from the Lightning Store for each rollout. - When running with `backend_type=vllm`, `output_dir/dataset-/` stores a HuggingFace dataset with token IDs, logprobs, prompts, and metadata produced by `ExtendedLlmProxyTraceToTriplet`. - `logs//` is created by the SWE-bench runtime and mirrors the console output from the container. - Return values from the agent are also evaluated via `swebench_utils.evaluation.evaluate`, so `data_debug` (or your chosen folder) will contain evaluation reports alongside traces. Use these artifacts to fine-tune models, debug Claude Code behavior, or replay rollouts in downstream Agent-lightning workflows. ================================================ FILE: examples/claude_code/claude_code_agent.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Instrumented driver for running Claude Code on SWE-bench with Agent-lightning. This script wires together the Lightning Store, LLM proxy, and Claude Code controller so that every SWE-bench instance is executed inside the official Claude container while capturing full Agent-lightning traces. It supports three backend modes: - `vllm`: wrap an OpenAI-compatible endpoint (e.g., vLLM) for hosted OSS models while collecting prompt/response token ids and logprobs. - `anthropic`: call the official Claude Code API via `ANTHROPIC_API_KEY` for prompt tuning. Backend model defaults to the provided frontend names. - `openai`: route through any OpenAI-compatible provider using `OPENAI_API_KEY`. Typical usage: hosted vLLM (requires model paths and --base-url) ```bash # Run vLLM in background vllm serve Qwen/Qwen3-Coder-30B-A3B-Instruct \ --max-model-len 131072 \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --port 45993 & python claude_code_agent.py vllm \ --backend-model-high Qwen/Qwen3-Coder-30B-A3B-Instruct \ --backend-model-low Qwen/Qwen3-Coder-30B-A3B-Instruct \ --base-url http://localhost:45993/v1 \ --dataset-path swebench_samples.jsonl \ ``` Official Claude Code via Anthropic: ```bash export ANTHROPIC_API_KEY=sk-... python claude_code_agent.py anthropic \ --dataset-path swebench_samples.jsonl \ --output-dir data_anthropic ``` Any OpenAI-compatible backend: ```bash export OPENAI_API_KEY=sk-... python claude_code_agent.py openai \ --backend-model-high gpt-5.1-codex-mini \ --backend-model-low gpt-4.1-mini \ --dataset-path swebench_samples.jsonl ``` Use `--debug` to enable debug loggings. """ import asyncio import json import logging import os import resource from argparse import ArgumentParser from typing import Any, Dict, List, Literal, Optional, Sequence, cast from claude_code_controller import ClaudeController from datasets import Dataset from extended_adapter import ExtendedLlmProxyTraceToTriplet from swebench.harness.constants import SWEbenchInstance from swebench.harness.utils import load_swebench_dataset # pyright: ignore[reportUnknownVariableType] from swebench_utils.evaluation import evaluate from swebench_utils.logging import log_for_evaluation from transformers import AutoTokenizer, PreTrainedTokenizerBase from agentlightning import ( InMemoryLightningStore, LightningStoreServer, LitAgentRunner, OtelTracer, setup_logging, setup_module_logging, ) from agentlightning.litagent import LitAgent from agentlightning.llm_proxy import LLMProxy, ModelConfig from agentlightning.store import LightningStore from agentlightning.types import AttemptedRollout, NamedResources, ProxyLLM, Rollout, RolloutRawResult, Span logger = logging.getLogger("claude_code_agent") def _load_dataset(path: str, epoch: int = 0, limit: Optional[int] = None) -> List[SWEbenchInstance]: instances: List[SWEbenchInstance] = [] with open(path) as f: for line in f: instance = json.loads(line) instance["epoch"] = epoch instances.append(instance) if limit is not None: instances = instances[:limit] return instances def _flatten_messages(messages: List[Any]) -> List[Dict[str, str]]: flattened: List[Dict[str, str]] = [] for msg in messages: if msg["role"] in ["system", "user"] and isinstance(msg["content"], list): msg_content: List[str] = [] for content in msg["content"]: msg_content.append(content["text"]) msg["content"] = "".join(msg_content) elif msg["role"] == "assistant" and "tool_calls" in msg: # NOTE: # Tool calls are list of dict, though in most case only one tool call is made per call # We serialize it as json string here to avoid nested structure msg["tool_calls"] = json.dumps(msg["tool_calls"]) for k in msg: assert isinstance(msg[k], str), f"\n>>> {msg}" flattened.append(msg) return flattened class ClaudeCodeAgent(LitAgent[SWEbenchInstance]): """Claude Code Agent implementation. This agent is a wrapper of the Claude Code controller, and it should be used to run the Claude Code agent on SWE-bench datasets. """ def __init__( self, namespace: Literal["swebench", "starryzhang"] = "swebench", max_turns: int = 5, run_method: Literal["python", "cli"] = "cli", open_file_limit: int = 4096, cache_level: str = "env", # ["none", "base", "env", "instance"] clean: bool = False, force_rebuild: bool = False, timeout: int = 1_800, # in sec instance_image_tag: str = "latest", rewrite_reports: bool = False, swebench_full_dataset: Optional[List[SWEbenchInstance]] = None, ) -> None: super().__init__() self.namespace = namespace self.max_turns = max_turns self.run_method = run_method self.cache_level = cache_level self.clean = clean self.force_rebuild = force_rebuild self.timeout = timeout self.instance_image_tag = instance_image_tag self.rewrite_reports = rewrite_reports self.swebench_full_dataset = ( {each["instance_id"]: each for each in swebench_full_dataset} if swebench_full_dataset is not None else {} ) # Set the maximum number of open files to the specified limit. resource.setrlimit(resource.RLIMIT_NOFILE, (open_file_limit, open_file_limit)) async def rollout_async( self, task: SWEbenchInstance, resources: NamedResources, rollout: Rollout ) -> RolloutRawResult: if not isinstance(rollout, AttemptedRollout): # Technically, rollout should be an AttemptedRollout here. # but the API is not stabilized yet. raise ValueError("Rollout is not an AttemptedRollout.") run_id = f"epoch_{task.get('epoch', 0)}" image = f"{self.namespace}/sweb.eval.x86_64.{task['instance_id'].lower()}".replace("__", "_1776_") llm = cast(ProxyLLM, resources["llm"]) try: # 1. init container controller = ClaudeController( image, task, run_id, llm.get_base_url(rollout.rollout_id, rollout.attempt.attempt_id), llm.api_key or os.environ.get("ANTHROPIC_AUTH_TOKEN", "dummy"), ) # 2. execute task prediction = controller.run_instance( task, max_turns=self.max_turns, run_method=cast(Literal["python", "cli"], self.run_method) ) del controller except Exception as e: log_for_evaluation(run_id, task["instance_id"], f"Exception during rollout: {e}") return 0.0 # 3. obtain rewards (evaluation result) reward = 0.0 # empty patch if prediction["model_patch"] in ["", None]: return reward instance_id = prediction["instance_id"] result = evaluate( cast(Any, prediction), self.swebench_full_dataset[instance_id], self.cache_level, self.clean, self.force_rebuild, run_id, self.timeout, namespace=self.namespace, instance_image_tag=self.instance_image_tag, rewrite_reports=self.rewrite_reports, ) # error patch if result is None: return reward report = result[1] # resolved/unresolved patch if report[instance_id]["resolved"]: reward = 1.0 return reward def sanity_check_spans(spans: Sequence[Span]) -> None: assert len(spans) > 1, f"At least two spans are expected for a valid rollout. Found {len(spans)} spans." assert any(span.name == "raw_gen_ai_request" for span in spans), "raw_gen_ai_request span not found" assert any(span.name == "agentlightning.annotation" for span in spans), "agentlightning.annotation span not found" async def run_instance_async( instance: SWEbenchInstance, agent: ClaudeCodeAgent, runner: LitAgentRunner[SWEbenchInstance], store: LightningStore, output_dir: Optional[str], adapter: Optional[ExtendedLlmProxyTraceToTriplet], tokenizer: Optional[PreTrainedTokenizerBase], ) -> None: """Runs the agent on a specific SWE-bench instance. Running on specific SWE-bench instance and queries the traced spans. It then extracts the triplets and saves the dataset. """ instance_id = instance["instance_id"] logger.info(f"Starting to run instance: {instance_id}") # Run the agent and query the traced spans. with runner.run_context(agent=agent, store=store): rollout = await runner.step(instance) logger.info(f"Finished running instance: {instance_id}") spans = await store.query_spans(rollout.rollout_id) if output_dir is None: logger.info(f"Generated {len(spans)} spans for {instance_id}") return # 1. Dump raw spans (Common for both types) raw_path = os.path.join(output_dir, f"stream_{instance_id}.json") with open(raw_path, "w") as f: for span in spans: f.write(json.dumps(span.model_dump()) + "\n") logger.info(f"Dumped {len(spans)} spans to {raw_path}") # 2. Extract Triplets and Save Dataset (vLLM specific) if adapter is not None and tokenizer is not None: try: triplets = adapter.adapt(cast(List[Span], spans)) logger.info(f"Extracted {len(triplets)} triplets for {instance_id}") all_triplets: List[Dict[str, Any]] = [] recent_reward: Optional[float] = None # Process in reverse to propagate rewards if necessary/logic dictates for triplet in reversed(triplets): if triplet.reward is not None: recent_reward = triplet.reward prompt_text = tokenizer.decode(triplet.prompt["token_ids"]) # type: ignore all_triplets.append( { "repo": instance.get("repo", ""), "instance_id": instance_id, "turn": triplet.metadata["sequence_id"], "prompt_ids": triplet.prompt["token_ids"], "gold_completion_ids": triplet.response["token_ids"], "logprobs": triplet.response["logprobs"], "reward": recent_reward, "prompt": prompt_text, "messages": _flatten_messages(triplet.metadata["messages"]), } ) if all_triplets: ds = Dataset.from_list(all_triplets) # type: ignore save_path = os.path.join(output_dir, f"dataset-{instance_id}") ds.save_to_disk(save_path) # type: ignore logger.info(f"Saved HuggingFace dataset to {save_path}") except Exception as e: logger.error(f"Failed to extract triplets for {instance_id}: {e}") logger.info(f"Finished extracting spans and traces for instance: {instance_id}") # Quickly sanity check the spans sanity_check_spans(spans) logger.info(f"Sanity check passed for instance: {instance_id}") async def dry_run_claude_code( *, dataset_path: str, haiku_frontend_name: str, haiku_backend_name: str, sonnet_frontend_name: str, sonnet_backend_name: str, backend_type: Literal["vllm", "anthropic", "openai"], api_base_url: Optional[str], output_dir: Optional[str], max_turns: int, limit: Optional[int], cooldown_seconds: float, ) -> None: """Executes a dry run of the Claude Code agent on a dataset. This function handles both 'official' runs (interacting with Anthropic APIs) and 'hosted' runs (interacting with vLLM or compatible servers). It manages initialization of the Lightning Store, LLM Proxy, and the execution loop. If running in 'vllm' mode, it will also attempt to extract triplets using the provided backend name as the tokenizer path and save a HuggingFace Dataset. Args: dataset_path: Path to the JSONL dataset file. haiku_frontend_name: The model name used in the code to request the 'fast' model. haiku_backend_name: The actual model name/path on the backend. sonnet_frontend_name: The model name used in the code to request the 'strong' model. sonnet_backend_name: The actual model name/path on the backend. backend_type: The type of backend to configure ("vllm", "anthropic" or "openai"). api_base_url: Base URL for the API. Required for "vllm" or "openai". output_dir: Directory to save logs, spans, and datasets. max_turns: Maximum number of steps the agent can take per instance. limit: Optional limit on the number of instances to process. """ dataset = _load_dataset(dataset_path, limit=limit) # Initialize Infrastructure tracer = OtelTracer() runner = LitAgentRunner[SWEbenchInstance](tracer) store = LightningStoreServer(InMemoryLightningStore(), host="0.0.0.0", port=7654) await store.start() # Enable callbacks for training data extraction if using vLLM callbacks = ["return_token_ids", "opentelemetry", "logprobs"] if backend_type == "vllm" else ["opentelemetry"] llm_proxy = LLMProxy(port=12358, store=store, callbacks=callbacks) # Configure Models based on backend type model_configs: List[ModelConfig] = [] model_params: Dict[str, Any] = {} if backend_type == "vllm": model_namespace = "hosted_vllm" if api_base_url: model_params["api_base"] = api_base_url else: raise ValueError("api_base_url is required for vllm backend") elif backend_type == "anthropic": model_namespace = "anthropic" model_params["api_key"] = "os.environ/ANTHROPIC_API_KEY" if api_base_url: model_params["api_base"] = api_base_url elif backend_type == "openai": model_namespace = "openai" model_params["api_key"] = "os.environ/OPENAI_API_KEY" if api_base_url: # Users can still override this via environment variables, # even if they don't pass it in as an argument. model_params["api_base"] = api_base_url model_configs.extend( [ ModelConfig( model_name=sonnet_frontend_name, litellm_params={ "model": f"{model_namespace}/{sonnet_backend_name}", **model_params, }, ), ModelConfig( model_name=haiku_frontend_name, litellm_params={ "model": f"{model_namespace}/{haiku_backend_name}", **model_params, }, ), ] ) logger.info(f"Updating model list: {model_configs}") llm_proxy.update_model_list(model_configs) await llm_proxy.start() try: # Add the LLM proxy as a resource to the store await store.add_resources({"llm": llm_proxy.as_resource(model="local")}) # Prepare for triplet extraction if vllm adapter = ExtendedLlmProxyTraceToTriplet() if backend_type == "vllm" else None tokenizer = None if backend_type == "vllm": try: tokenizer = AutoTokenizer.from_pretrained(sonnet_backend_name) # type: ignore except Exception as e: logger.warning(f"Could not load tokenizer for {sonnet_backend_name}: {e}") # Load full swebench dataset. Mainly for evaluation purposes. swebench_full_dataset = load_swebench_dataset("princeton-nlp/SWE-bench", split="test") # Initialize Claude Code Agent claude_code_agent = ClaudeCodeAgent(swebench_full_dataset=swebench_full_dataset, max_turns=max_turns) # Execution Loop for instance in dataset: await run_instance_async( instance, claude_code_agent, runner, store, output_dir, adapter, cast(PreTrainedTokenizerBase, tokenizer), ) # Basic sleep to allow resource cleanup or rate limit cooling await asyncio.sleep(cooldown_seconds) finally: await llm_proxy.stop() await store.stop() if __name__ == "__main__": parser = ArgumentParser(description="Run Claude Code Agent experiments.") # Backend Selection parser.add_argument( "backend_type", type=str, choices=["vllm", "anthropic", "openai"], help="Backend type: 'vllm' for hosted models, 'anthropic' for official API, 'openai' for OpenAI API.", ) # Model Configuration parser.add_argument( "--backend-model-high", type=str, default=None, help="Backend model path/name for expensive model usages (used as vLLM model name / OpenAI model name).", ) parser.add_argument( "--backend-model-low", type=str, default=None, help="Backend model path/name for low-price model usages (used as vLLM model name / OpenAI model name).", ) parser.add_argument( "--base-url", type=str, default="http://localhost:8000/v1", help="LLM server address (required for vllm)." ) # Frontend/Agent Configuration parser.add_argument( "--frontend-model-high", type=str, default="claude-sonnet-4-5-20250929", help="The frontend high-price model name provided to Claude Code.", ) parser.add_argument( "--frontend-model-low", type=str, default="claude-haiku-4-5-20251001", help="The frontend low-price model name provided to Claude Code.", ) # Execution Configuration parser.add_argument("--dataset-path", type=str, default="swebench_samples.jsonl", help="Path to the dataset.") parser.add_argument("--max-turns", type=int, default=5, help="Maximum turns per instance.") parser.add_argument("--output-dir", type=str, default="data", help="Directory to save output logs.") parser.add_argument("--limit", type=int, default=None, help="Limit the number of instances to run (for debugging).") parser.add_argument("--cooldown-seconds", type=float, default=2.0, help="Cooldown seconds between instances.") parser.add_argument("--debug", action="store_true", help="Enable debug loggings.") args = parser.parse_args() if args.output_dir is not None: os.makedirs(args.output_dir, exist_ok=True) if args.debug: setup_logging() setup_module_logging("DEBUG", name="claude_code_agent") else: setup_logging(apply_to=[logger.name]) # Map backend_type to the appropriate args backend_mode = cast(Literal["vllm", "anthropic", "openai"], args.backend_type) # If using anthropic, the backend name usually matches the frontend or is specific API string. # Otherwise, the backend name is the model name/path (e.g., Qwen/...) and must be provided. if args.backend_model_high is None: if args.backend_type == "anthropic": backend_model_high = args.frontend_model_high else: raise ValueError("--backend-model-high is required for non-anthropic backends") else: backend_model_high = args.backend_model_high if args.backend_model_low is None: if args.backend_type == "anthropic": backend_model_low = args.frontend_model_low else: raise ValueError("--backend-model-low is required for non-anthropic backends") else: backend_model_low = args.backend_model_low asyncio.run( dry_run_claude_code( dataset_path=args.dataset_path, haiku_frontend_name=args.frontend_model_low, haiku_backend_name=backend_model_low, sonnet_frontend_name=args.frontend_model_high, sonnet_backend_name=backend_model_high, backend_type=backend_mode, api_base_url=args.base_url if backend_mode == "vllm" else None, output_dir=args.output_dir, max_turns=args.max_turns, limit=args.limit, cooldown_seconds=args.cooldown_seconds, ) ) ================================================ FILE: examples/claude_code/claude_code_controller.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Controller module for managing Claude Code executions in containerized environments. This module provides the ClaudeController class that manages the execution of Claude Code within Docker containers. It handles container initialization, command execution, and patch application for SWE-bench evaluation tasks. """ import logging from functools import partial from typing import Literal, TypedDict import dotenv from swebench.harness.constants import SWEbenchInstance from swebench_utils.docker_runtime import Runtime from swebench_utils.logging import log_for_evaluation SWEBENCH_EXTRA_SYSTEM_PROMPT = """ You are an expert software engineer solving swebench bug fixing tasks. """ SWEBENCH_USER_PROMPT = """ You are given a code repository in the current directory (/testbed). The bug description is: {description} ================================================= You task is to fix the bug with the following steps: (1) write test cases to reproduce the bug. (2) explore the source codes to locate the bug. (3) edit the source codes to fix the bug. (4) rerun your written test cases to validate that the bug is fixed. If not, go back to explore the source codes and fix the codes again. (5) remember to delete the test cases you write at last. Please do not commit your edits. We will do it later. """ logger = logging.getLogger("claude_code_agent") class RunInstanceResult(TypedDict): instance_id: str model_patch: str model_name_or_path: str class ClaudeController: """Manages the execution of Claude Code within a Docker runtime. This controller handles the lifecycle of a SWE-bench task execution, including environment setup, tool installation, agent execution (via CLI or Python SDK), and result extraction. Attributes: container: The active Docker runtime session. """ def __init__(self, image: str, instance: SWEbenchInstance, run_id: str, endpoint: str, api_key: str) -> None: """Initialize the ClaudeController. Args: image: The Docker image tag. instance: The dataset instance containing the problem statement and ID. run_id: The identifier for the evaluation run. endpoint: The API endpoint URL. api_key: The API authentication key. """ self.image = image self.instance = instance self.run_id = run_id self.endpoint = endpoint self.api_key = api_key self.container: Runtime = self.init_container(self.image, self.instance) def init_container(self, image: str, instance: SWEbenchInstance) -> Runtime: """Initializes the Docker container and sets up the Claude Code environment. This method starts the container session, installs the Claude CLI, configures environment variables for authentication and sandbox mode. Args: image: The Docker image tag to start. instance: The dataset instance to load into the environment. Returns: An initialized and configured Docker runtime object. """ container = Runtime.start_session( image, instance, log_function=partial(log_for_evaluation, run_id=self.run_id, instance_id=instance["instance_id"]), ) # Install Claude CLI container.send_command("curl -fsSL https://claude.ai/install.sh | bash") container.send_command('alias claude="$HOME/.local/bin/claude"') # Configure Environment dotenv.load_dotenv() container.send_command(f"export ANTHROPIC_BASE_URL={self.endpoint}") container.send_command(f"export ANTHROPIC_AUTH_TOKEN={self.api_key}") container.send_command("export IS_SANDBOX=1") return container def _run_cli(self, instance: SWEbenchInstance, max_turns: int, time_limit: int) -> None: """Executes Claude Code using the Command Line Interface. Constructs a safe heredoc for the prompt to avoid shell interpolation issues and executes the `claude` binary directly. Args: instance: The problem instance containing the problem statement. max_turns: The maximum number of interaction turns allowed. time_limit: The execution time limit in minutes. """ # Prepare prompt safely: write it to a file inside the container using a single-quoted heredoc # directly applying prompt for heredoc may raise error for windows line ending \r\n prompt_text = SWEBENCH_USER_PROMPT.format(description=instance["problem_statement"].replace('"""', "'''")) # Choose a simple filename and a heredoc delimiter unlikely to collide heredoc_cmd = "cat > /tmp/cc_prompt.txt <<'CC_PROMPT'\n" + prompt_text + "\nCC_PROMPT\n" self.container.send_command(heredoc_cmd) # Run claude reading the prompt from the file claude_cmd = ( f'claude -p "$(cat /tmp/cc_prompt.txt)" ' f'--append-system-prompt "{SWEBENCH_EXTRA_SYSTEM_PROMPT}" ' f"--max-turns {max_turns} " f"--dangerously-skip-permissions " f"--output-format json --verbose" ) logger.info(f"Running Claude Code CLI command: {claude_cmd}") self.container.send_command(claude_cmd, time_limit * 60) logger.info(f"Claude Code CLI command completed") def _run_python_sdk(self, instance: SWEbenchInstance, max_turns: int, time_limit: int) -> None: """Executes Claude Code using the Python SDK wrapper. Installs the Python SDK if necessary, hydrates a template script with the problem prompt, and executes the generated Python script. Note: This path is still under development and not yet stable. Args: instance: The problem instance containing the problem statement. max_turns: The maximum number of interaction turns allowed. time_limit: The execution time limit in minutes. """ # Ensure Python 3.12 is available self.container.send_command( f""" if ! command -v python3 &> /dev/null; then echo "Python is not installed. Installing Python 3.12..." sudo apt-get update -qq && sudo apt-get install -y -qq python3.12 else echo "Python is already installed." fi """ ) self.container.send_command("python3 -m pip install claude-code-sdk") # Load and fill the execution template with open("src/agent/cc/claude_code_main.py.template") as f: entrance_template = f.read() script_content = ( entrance_template.replace("SYS_PROMPT", SWEBENCH_EXTRA_SYSTEM_PROMPT) .replace( "PROMPT", SWEBENCH_USER_PROMPT.format(description=instance["problem_statement"].replace('"""', "'''")) ) .replace("MAX_STEP", str(max_turns)) ) # Write the script to the container and execute self.container.send_command(f"cat > /tmp/claude_code_main.py <<'CC_MAIN'\n{script_content}\nCC_MAIN\n") self.container.send_command("python3 /tmp/claude_code_main.py", time_limit * 60) return def run_instance( self, instance: SWEbenchInstance, max_turns: int = 40, time_limit: int = 30, run_method: Literal["python", "cli"] = "python", ) -> RunInstanceResult: """Runs the agent on a specific SWE-bench instance. This method orchestrates the agent execution via the specified method (CLI or Python), and extracts the generated git diff (patch) upon completion. Args: instance: The dataset instance dictionary. max_turns: Maximum conversation turns allowed for the agent. Defaults to 40. time_limit: Time limit for the execution in minutes. Defaults to 30. run_method: The execution method, either "python" (SDK) or "cli". Defaults to "python". Returns: A dictionary containing the result: - instance_id: The ID of the processed instance. - model_patch: The git diff generated by the agent. - model_name_or_path: Hardcoded to "cc" (Claude Code). Raises: ValueError: If `run_method` is not "python" or "cli". """ if run_method == "python": logger.warning("Running Claude Code using Python SDK is still under development and not yet stable.") self._run_python_sdk(instance, max_turns, time_limit) elif run_method == "cli": self._run_cli(instance, max_turns, time_limit) else: raise ValueError(f"Wrong run_method '{run_method}', run_method should be in ['python', 'cli']") result = self.container.send_command("git --no-pager diff HEAD") git_diff = result.output.replace("git --no-pager diff HEAD\n", "") return { "instance_id": instance["instance_id"], "model_patch": git_diff, "model_name_or_path": "cc", } def __del__(self) -> None: """Destructor to ensure container resources are cleaned up.""" if hasattr(self, "container"): self.container.cleanup() ================================================ FILE: examples/claude_code/extended_adapter.py ================================================ # Copyright (c) Microsoft. All rights reserved. """Custom adapter module for converting LLM proxy traces to augmented trajectories. This module provides an augmented LlmProxyTraceToTriplet adapter that converts LLM proxy spans into augmented trajectories for analysis and evaluation. It extends the base LlmProxyTraceToTriplet to include additional metadata like chat messages, log probabilities, and sequence IDs. """ import logging from typing import Any, Dict, List, Optional, Tuple, cast from agentlightning.adapter.triplet import LlmProxyTraceToTriplet from agentlightning.types import Span, Triplet logger = logging.getLogger(__name__) class ExtendedLlmProxyTraceToTriplet(LlmProxyTraceToTriplet): """Convert LLM Proxy spans into trajectories with logprobs and customized metadata. Augmented fields include: - chat messages history from [`llm.hosted_vllm.messages`], saved to `Triplet.metadata['messages']` - logprobs from [`llm.hosted_vllm.choices`], saved to `Triplet.response['logprobs']` - sequence_id from [`Span.sequence_id`] to locate the order of the span (conversation turn), saved to `Triplet.metadata['sequence_id']` """ def _extract_tokens_from_raw(self, attrs: Dict[str, Any]) -> Tuple[List[int], List[int], List[float]]: # type: ignore """Extract token ids from raw_gen_ai_request attributes. - llm.hosted_vllm.prompt_token_ids: string -> List[int] - llm.hosted_vllm.choices: string -> [{'token_ids': [...]}] -> take first """ prompt_ids: List[int] = [] resp_ids: List[int] = [] logprobs: List[float] = [] # prompt p = attrs.get("llm.hosted_vllm.prompt_token_ids") p = self._literal_eval_maybe(p) if isinstance(p, list) and all(isinstance(x, int) for x in p): # type: ignore prompt_ids = cast(List[int], p) choices = attrs.get("llm.hosted_vllm.choices") choices = self._literal_eval_maybe(choices) if isinstance(choices, list) and choices: cand = cast(Any, choices[0]) if isinstance(cand, dict): tids = cast(Dict[str, Any], cand).get("token_ids") if isinstance(tids, list) and all(isinstance(x, int) for x in tids): # type: ignore resp_ids = cast(List[int], tids) if "logprobs" in cand: logprobs_dict = cast(Dict[str, Any], cand).get("logprobs") if isinstance(logprobs_dict, dict) and "content" in logprobs_dict: content = cast(List[Dict[str, Any]], logprobs_dict["content"]) logprobs = [float(item["logprob"]) for item in content if "logprob" in item] return prompt_ids, resp_ids, logprobs def adapt(self, source: List[Span], /) -> List[Triplet]: # type: ignore """Convert LLM Proxy spans into [`Triplet`][agentlightning.Triplet] trajectories. Args: source: Spans emitted by the LLM Proxy containing prompt, response, and reward data. Returns: Ordered trajectory transitions matched purely by `sequence_id`. """ # 1) Sort deterministically by (sequence_id, start_time). spans = sorted( source, key=lambda s: (s.sequence_id, s.start_time), ) # 2) Collect LLM calls llm_items: List[Dict[str, Any]] = [] seen_request_ids: set[str] = set() for s in spans: attrs = s.attributes or {} prompt_ids: List[int] = [] resp_ids: List[int] = [] logprobs: List[float] = [] if s.name == "raw_gen_ai_request": prompt_ids, resp_ids, logprobs = self._extract_tokens_from_raw(attrs) if len(prompt_ids) == 0 or len(resp_ids) == 0: logger.warning( f"Span {s.span_id} is missing prompt (len={len(prompt_ids)}) or response (len={len(resp_ids)}) token ids. Ignoring this span." ) continue elif len(logprobs) == 0: logger.warning(f"Span {s.span_id} is missing logprobs. Ignoring logprobs for this span.") continue elif len(resp_ids) != len(logprobs): logger.warning( f"Span {s.span_id} has mismatched response ids and logprobs lengths: " f"{len(resp_ids)} vs {len(logprobs)}. Ignoring this span." ) continue if prompt_ids and resp_ids and logprobs: rid = self._request_id_from_attrs(attrs) if rid: # Duplicated request ID. This request is already handled. if rid in seen_request_ids: continue seen_request_ids.add(rid) llm_items.append( dict( span=s, seq=s.sequence_id, response_ids=resp_ids, prompt_ids=prompt_ids, request_id=rid, logprobs=logprobs, ) ) # Order LLM items by sequence only. llm_items.sort(key=lambda x: x["seq"]) # Collect rewards by sequence only. rewards: List[Tuple[int, Optional[float]]] = [] for s in spans: val = self._maybe_reward_value(s) if val is not None: rewards.append((s.sequence_id, val)) # First-occurrence matching by sequence_id only: # For reward at sequence R, assign to the most recent unmatched LLM with seq < R. assigned: Dict[str, Optional[float]] = {} for r_seq, r_val in sorted(rewards, key=lambda x: x[0]): for item in reversed(llm_items): sid = item["span"].span_id if sid in assigned: continue if item["seq"] < r_seq: assigned[sid] = r_val break # Build triplets in LLM sequence order. triplets: List[Triplet] = [] for item in llm_items: s = item["span"] triplets.append( Triplet( prompt={"token_ids": item["prompt_ids"]}, response={"token_ids": item["response_ids"], "logprobs": item["logprobs"]}, reward=assigned.get(s.span_id, None), metadata=dict( # This is called response_id to align with the other adapters. response_id=item["request_id"], sequence_id=item["seq"], messages=self._literal_eval_maybe(s.attributes.get("llm.hosted_vllm.messages")), ), ) ) return triplets ================================================ FILE: examples/claude_code/swebench_samples.jsonl ================================================ {"repo": "astropy/astropy", "instance_id": "astropy__astropy-12907", "base_commit": "d16bfe05a744909de4b27f5875fe0d4ed41ce607", "patch": "diff --git a/astropy/modeling/separable.py b/astropy/modeling/separable.py\n--- a/astropy/modeling/separable.py\n+++ b/astropy/modeling/separable.py\n@@ -242,7 +242,7 @@ def _cstack(left, right):\n cright = _coord_matrix(right, 'right', noutp)\n else:\n cright = np.zeros((noutp, right.shape[1]))\n- cright[-right.shape[0]:, -right.shape[1]:] = 1\n+ cright[-right.shape[0]:, -right.shape[1]:] = right\n \n return np.hstack([cleft, cright])\n \n", "test_patch": "diff --git a/astropy/modeling/tests/test_separable.py b/astropy/modeling/tests/test_separable.py\n--- a/astropy/modeling/tests/test_separable.py\n+++ b/astropy/modeling/tests/test_separable.py\n@@ -28,6 +28,13 @@\n p1 = models.Polynomial1D(1, name='p1')\n \n \n+cm_4d_expected = (np.array([False, False, True, True]),\n+ np.array([[True, True, False, False],\n+ [True, True, False, False],\n+ [False, False, True, False],\n+ [False, False, False, True]]))\n+\n+\n compound_models = {\n 'cm1': (map3 & sh1 | rot & sh1 | sh1 & sh2 & sh1,\n (np.array([False, False, True]),\n@@ -52,7 +59,17 @@\n 'cm7': (map2 | p2 & sh1,\n (np.array([False, True]),\n np.array([[True, False], [False, True]]))\n- )\n+ ),\n+ 'cm8': (rot & (sh1 & sh2), cm_4d_expected),\n+ 'cm9': (rot & sh1 & sh2, cm_4d_expected),\n+ 'cm10': ((rot & sh1) & sh2, cm_4d_expected),\n+ 'cm11': (rot & sh1 & (scl1 & scl2),\n+ (np.array([False, False, True, True, True]),\n+ np.array([[True, True, False, False, False],\n+ [True, True, False, False, False],\n+ [False, False, True, False, False],\n+ [False, False, False, True, False],\n+ [False, False, False, False, True]]))),\n }\n \n \n", "problem_statement": "Modeling's `separability_matrix` does not compute separability correctly for nested CompoundModels\nConsider the following model:\r\n\r\n```python\r\nfrom astropy.modeling import models as m\r\nfrom astropy.modeling.separable import separability_matrix\r\n\r\ncm = m.Linear1D(10) & m.Linear1D(5)\r\n```\r\n\r\nIt's separability matrix as you might expect is a diagonal:\r\n\r\n```python\r\n>>> separability_matrix(cm)\r\narray([[ True, False],\r\n [False, True]])\r\n```\r\n\r\nIf I make the model more complex:\r\n```python\r\n>>> separability_matrix(m.Pix2Sky_TAN() & m.Linear1D(10) & m.Linear1D(5))\r\narray([[ True, True, False, False],\r\n [ True, True, False, False],\r\n [False, False, True, False],\r\n [False, False, False, True]])\r\n```\r\n\r\nThe output matrix is again, as expected, the outputs and inputs to the linear models are separable and independent of each other.\r\n\r\nIf however, I nest these compound models:\r\n```python\r\n>>> separability_matrix(m.Pix2Sky_TAN() & cm)\r\narray([[ True, True, False, False],\r\n [ True, True, False, False],\r\n [False, False, True, True],\r\n [False, False, True, True]])\r\n```\r\nSuddenly the inputs and outputs are no longer separable?\r\n\r\nThis feels like a bug to me, but I might be missing something?\n", "hints_text": "", "created_at": "2022-03-03T15:14:54Z", "version": "4.3", "FAIL_TO_PASS": "[\"astropy/modeling/tests/test_separable.py::test_separable[compound_model6-result6]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model9-result9]\"]", "PASS_TO_PASS": "[\"astropy/modeling/tests/test_separable.py::test_coord_matrix\", \"astropy/modeling/tests/test_separable.py::test_cdot\", \"astropy/modeling/tests/test_separable.py::test_cstack\", \"astropy/modeling/tests/test_separable.py::test_arith_oper\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model0-result0]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model1-result1]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model2-result2]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model3-result3]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model4-result4]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model5-result5]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model7-result7]\", \"astropy/modeling/tests/test_separable.py::test_separable[compound_model8-result8]\", \"astropy/modeling/tests/test_separable.py::test_custom_model_separable\"]", "environment_setup_commit": "298ccb478e6bf092953bca67a3d29dc6c35f6752", "difficulty": "15 min - 1 hour"} {"repo": "astropy/astropy", "instance_id": "astropy__astropy-13033", "base_commit": "298ccb478e6bf092953bca67a3d29dc6c35f6752", "patch": "diff --git a/astropy/timeseries/core.py b/astropy/timeseries/core.py\n--- a/astropy/timeseries/core.py\n+++ b/astropy/timeseries/core.py\n@@ -55,6 +55,13 @@ class BaseTimeSeries(QTable):\n _required_columns_relax = False\n \n def _check_required_columns(self):\n+ def as_scalar_or_list_str(obj):\n+ if not hasattr(obj, \"__len__\"):\n+ return f\"'{obj}'\"\n+ elif len(obj) == 1:\n+ return f\"'{obj[0]}'\"\n+ else:\n+ return str(obj)\n \n if not self._required_columns_enabled:\n return\n@@ -76,9 +83,10 @@ def _check_required_columns(self):\n \n elif self.colnames[:len(required_columns)] != required_columns:\n \n- raise ValueError(\"{} object is invalid - expected '{}' \"\n- \"as the first column{} but found '{}'\"\n- .format(self.__class__.__name__, required_columns[0], plural, self.colnames[0]))\n+ raise ValueError(\"{} object is invalid - expected {} \"\n+ \"as the first column{} but found {}\"\n+ .format(self.__class__.__name__, as_scalar_or_list_str(required_columns),\n+ plural, as_scalar_or_list_str(self.colnames[:len(required_columns)])))\n \n if (self._required_columns_relax\n and self._required_columns == self.colnames[:len(self._required_columns)]):\n", "test_patch": "diff --git a/astropy/timeseries/tests/test_sampled.py b/astropy/timeseries/tests/test_sampled.py\n--- a/astropy/timeseries/tests/test_sampled.py\n+++ b/astropy/timeseries/tests/test_sampled.py\n@@ -395,6 +395,14 @@ def test_required_columns():\n assert exc.value.args[0] == (\"TimeSeries object is invalid - expected \"\n \"'time' as the first column but found 'banana'\")\n \n+ # https://github.com/astropy/astropy/issues/13009\n+ ts_2cols_required = ts.copy()\n+ ts_2cols_required._required_columns = ['time', 'a']\n+ with pytest.raises(ValueError) as exc:\n+ ts_2cols_required.remove_column('a')\n+ assert exc.value.args[0] == (\"TimeSeries object is invalid - expected \"\n+ \"['time', 'a'] as the first columns but found ['time', 'b']\")\n+\n \n @pytest.mark.parametrize('cls', [BoxLeastSquares, LombScargle])\n def test_periodogram(cls):\n", "problem_statement": "TimeSeries: misleading exception when required column check fails.\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n### Description\r\n\r\n\r\nFor a `TimeSeries` object that has additional required columns (in addition to `time`), when codes mistakenly try to remove a required column, the exception it produces is misleading.\r\n\r\n### Expected behavior\r\n\r\nAn exception that informs the users required columns are missing.\r\n\r\n### Actual behavior\r\nThe actual exception message is confusing:\r\n`ValueError: TimeSeries object is invalid - expected 'time' as the first columns but found 'time'`\r\n\r\n### Steps to Reproduce\r\n\r\n\r\n\r\n\r\n```python\r\nfrom astropy.time import Time\r\nfrom astropy.timeseries import TimeSeries\r\n\r\ntime=Time(np.arange(100000, 100003), format='jd')\r\nts = TimeSeries(time=time, data = {\"flux\": [99.9, 99.8, 99.7]})\r\nts._required_columns = [\"time\", \"flux\"] \r\nts.remove_column(\"flux\")\r\n\r\n```\r\n\r\n### System Details\r\n\r\n```\r\nWindows-10-10.0.22000-SP0\r\nPython 3.9.10 | packaged by conda-forge | (main, Feb 1 2022, 21:21:54) [MSC v.1929 64 bit (AMD64)]\r\nNumpy 1.22.3\r\npyerfa 2.0.0.1\r\nastropy 5.0.3\r\nScipy 1.8.0\r\nMatplotlib 3.5.1\r\n```\n", "hints_text": "The relevant code that produces the misleading exception.\r\n\r\nhttps://github.com/astropy/astropy/blob/00ccfe76113dca48d19396986872203dc2e978d7/astropy/timeseries/core.py#L77-L82\r\n\r\nIt works under the assumption that `time` is the only required column. So when a `TimeSeries` object has additional required columns, the message no longer makes sense.\r\n\nProposal: change the message to the form of: \r\n\r\n```\r\nValueError: TimeSeries object is invalid - required ['time', 'flux'] as the first columns but found ['time']\r\n```\nYour proposed message is definitely less confusing. Wanna PR? \ud83d\ude38 \nI cannot run tests anymore after updating my local env to Astropy 5. Any idea?\r\n\r\nI used [`pytest` variant](https://docs.astropy.org/en/latest/development/testguide.html#pytest) for running tests.\r\n\r\n```\r\n> pytest astropy/timeseries/tests/test_common.py\r\n\r\nC:\\pkg\\_winNonPortables\\Anaconda3\\envs\\astropy5_dev\\lib\\site-packages\\pluggy\\_manager.py:91: in register\r\n raise ValueError(\r\nE ValueError: Plugin already registered: c:\\dev\\astropy\\astropy\\conftest.py=\r\nE {'2885294349760': <_pytest.config.PytestPluginManager object at 0x0000029FC8F1DDC0>, 'pytestconfig': <_pytest.config.Config object at 0x0000029FCB43EAC0>, 'mark': , 'main': , 'xdist.looponfail': , 'capturemanager': > err=> in_=> _state='suspended' _in_suspended=False> _capture_fixture=None>, 'C:\\\\dev\\\\astropy\\\\conftest.py': , 'c:\\\\dev\\\\astropy\\\\astropy\\\\conftest.py': , 'session': testsfailed=0 testscollected=0>, 'lfplugin': <_pytest.cacheprovider.LFPlugin object at 0x0000029FCD0385B0>, 'nfplugin': <_pytest.cacheprovider.NFPlugin object at 0x0000029FCD038790>, '2885391664992': , 'doctestplus': , 'legacypath-tmpdir': , 'terminalreporter': <_pytest.terminal.TerminalReporter object at 0x0000029FCEBECE50>, 'logging-plugin': <_pytest.logging.LoggingPlugin object at 0x0000029FCEBECFD0>, 'funcmanage': <_pytest.fixtures.FixtureManager object at 0x0000029FCEBF6B80>}\r\n```\r\n\nHuh, never seen that one before. Did you try installing dev astropy on a fresh env, @orionlee ?\nI use a brand new conda env (upgrading my old python 3.7, astropy 4 based env is not worth trouble).\r\n\r\n- I just found [`astropy.test()`](https://docs.astropy.org/en/latest/development/testguide.html#astropy-test) method works for me. So for this small fix it probably suffices.\r\n\r\n```python\r\n> astropy.test(test_path=\"astropy/timeseries/tests/test_common.py\")\r\n```\r\n\r\n- I read some posts online on `Plugin already registered` error in other projects, they seem to indicate some symlink issues making pytest reading `contest.py` twice, but I can't seem to find such problems in my environment (my astropy is an editable install, so the path to the source is directly used).\r\n\r\n", "created_at": "2022-03-31T23:28:27Z", "version": "4.3", "FAIL_TO_PASS": "[\"astropy/timeseries/tests/test_sampled.py::test_required_columns\"]", "PASS_TO_PASS": "[\"astropy/timeseries/tests/test_sampled.py::test_empty_initialization\", \"astropy/timeseries/tests/test_sampled.py::test_empty_initialization_invalid\", \"astropy/timeseries/tests/test_sampled.py::test_initialize_only_time\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_with_data\", \"astropy/timeseries/tests/test_sampled.py::test_initialize_only_data\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_with_table\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_missing_time_delta\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_invalid_time_and_time_start\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_invalid_time_delta\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_with_time_in_data\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_n_samples\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_length_mismatch\", \"astropy/timeseries/tests/test_sampled.py::test_initialization_invalid_both_time_and_time_delta\", \"astropy/timeseries/tests/test_sampled.py::test_fold\", \"astropy/timeseries/tests/test_sampled.py::test_fold_invalid_options\", \"astropy/timeseries/tests/test_sampled.py::test_read_time_missing\", \"astropy/timeseries/tests/test_sampled.py::test_read_time_wrong\", \"astropy/timeseries/tests/test_sampled.py::test_read\", \"astropy/timeseries/tests/test_sampled.py::test_periodogram[BoxLeastSquares]\", \"astropy/timeseries/tests/test_sampled.py::test_periodogram[LombScargle]\"]", "environment_setup_commit": "298ccb478e6bf092953bca67a3d29dc6c35f6752", "difficulty": "15 min - 1 hour"} {"repo": "astropy/astropy", "instance_id": "astropy__astropy-13236", "base_commit": "6ed769d58d89380ebaa1ef52b300691eefda8928", "patch": "diff --git a/astropy/table/table.py b/astropy/table/table.py\n--- a/astropy/table/table.py\n+++ b/astropy/table/table.py\n@@ -1239,13 +1239,6 @@ def _convert_data_to_col(self, data, copy=True, default_name=None, dtype=None, n\n f'{fully_qualified_name} '\n 'did not return a valid mixin column')\n \n- # Structured ndarray gets viewed as a mixin unless already a valid\n- # mixin class\n- if (not isinstance(data, Column) and not data_is_mixin\n- and isinstance(data, np.ndarray) and len(data.dtype) > 1):\n- data = data.view(NdarrayMixin)\n- data_is_mixin = True\n-\n # Get the final column name using precedence. Some objects may not\n # have an info attribute. Also avoid creating info as a side effect.\n if not name:\n", "test_patch": "diff --git a/astropy/table/tests/test_mixin.py b/astropy/table/tests/test_mixin.py\n--- a/astropy/table/tests/test_mixin.py\n+++ b/astropy/table/tests/test_mixin.py\n@@ -697,11 +697,13 @@ def test_skycoord_representation():\n '1.0,90.0,0.0']\n \n \n-def test_ndarray_mixin():\n+@pytest.mark.parametrize('as_ndarray_mixin', [True, False])\n+def test_ndarray_mixin(as_ndarray_mixin):\n \"\"\"\n- Test directly adding a plain structured array into a table instead of the\n- view as an NdarrayMixin. Once added as an NdarrayMixin then all the previous\n- tests apply.\n+ Test directly adding various forms of structured ndarray columns to a table.\n+ Adding as NdarrayMixin is expected to be somewhat unusual after #12644\n+ (which provides full support for structured array Column's). This test shows\n+ that the end behavior is the same in both cases.\n \"\"\"\n a = np.array([(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')],\n dtype='