{
  "id": 581069,
  "title": "26th Place Solution: SDXL Flash + Optimized img2svg + TIFA QA Generation",
  "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F12376195%2Fb2db60069ff4dbdb76090bdb1f2a8fca%2FScreenshot%202025-05-28%20at%201.57.31PM.png?generation=1748419083311977&amp;alt=media\" alt=\"Sample output\"><br>\nI’d like to extend my sincere thanks to the organizers for their hard work and dedication in making this competition both engaging and meaningful. I also appreciate everyone who shared helpful ideas throughout—this community support made a big difference. My custom image-to-SVG pipeline was inspired by the work of <a href=\"https://www.kaggle.com/richolson\" target=\"_blank\">@richolson</a> , and I’m especially grateful for his contributions.</p>\n<p>I'm a beginner in this field with limited experience and knowledge, so feedback and suggestions are always welcome!</p>\n<h1>TL;DR</h1>\n<ul>\n<li>Fine-tuned <strong>SmolLM2-1.7B-Instruct</strong> to generate four TIFA-style questions per description.</li>\n<li>Used <strong>SDXL Flash</strong> for fast and high-quality image generation.</li>\n<li>Converted images to SVG using two approaches: a custom polygon/path pipeline and VTracer with binary search for size optimization.</li>\n<li>Injected a small <strong>\"L\" watermark</strong> in each SVG to mitigate OCR hallucination.</li>\n<li>Used <strong>PaliGemma-3B</strong> (about 3x faster than the 10B version) to evaluate and select the best SVG based on competition score using my generated TIFA questions.</li>\n<li>Implemented a <strong>dynamic time management</strong> strategy to maximize usage of the per-prompt time budget.</li>\n<li>Here is the <strong><a href=\"https://www.kaggle.com/code/kawchar85/sdxl-flash-img-svg\" target=\"_blank\">inference notebook</a></strong></li>\n</ul>\n<h1>TIFA Question Generation</h1>\n<p>To generate high-quality evaluation questions, I created a dataset of approximately 10,000 structured examples using Gemini and Claude. Each set follows a strict 4-question TIFA format:</p>\n<ul>\n<li>Q1: Yes/No question that contradicts the description (answer: “no”)</li>\n<li>Q2: Multiple-choice question using an exact word from the description</li>\n<li>Q3: Another multiple-choice question using a different exact word</li>\n<li>Q4: Yes/No question affirming something present in the description (answer: “yes”)</li>\n</ul>\n<p>I fine-tuned SmolLM2-1.7B-Instruct on this dataset. The model performs well and significantly improved my competition score. In around 2% of cases, Q2 and Q3 were duplicates—likely due to minor inconsistencies in my training data or the limited capacity of the small model. To handle such edge cases, I added fallback logic to inject dummy questions when fewer than four unique ones are generated.</p>\n<p>Inference is extremely fast, averaging about <strong>3 seconds per prompt</strong>.</p>\n<h1>Image Generation</h1>\n<p>I used SDXL Flash due to its speed-quality tradeoff. Prompts were constructed using a consistent template:</p>\n<blockquote>\n  <p>flat vector illustration of {description}, minimalist design, solid colors, flat color blocks</p>\n</blockquote>\n<p>Each prompt gets 4 attempts by default, extended dynamically using leftover time from previous predictions.</p>\n<h1>Image-to-SVG Conversion</h1>\n<p>Each generated image is first resized from 768×768 to 384×384 to reduce SVG complexity. The image is then quantized to 16 colors using MiniBatchKMeans in LAB color space. After quantization, I apply a <strong>Disjoint Set Union (DSU)</strong> algorithm to merge adjacent regions with similar colors. The processed image is then passed to two SVG conversion pipelines:</p>\n<h3>Custom Polygon/Path Simplification</h3>\n<p>This method allocates a total point budget (e.g., 2000 points) and distributes it across contours based on an importance metric combining area, shape complexity, and proximity to the image center. For each contour, I perform a <strong>binary search</strong> to find an optimal epsilon value that simplifies the contour to the target number of points using cv2.approxPolyDP.</p>\n<p>Each simplified shape is then encoded as either a polygon or a path, depending on which representation is shorter in bytes. This yields visually accurate SVGs while keeping file size under control.</p>\n<h3>VTracer + Binary Search Compression</h3>\n<p>As an alternative, I also use VTracer to convert the image into layered SVG paths. After tracing, a <strong>binary search</strong> simplification pass is applied to the path elements using cv2.approxPolyDP to further reduce the file size and ensure the final SVG remains under the 10KB limit.</p>\n<p>For each generated image, I produce two SVGs—one using the custom polygon/path pipeline and the other using VTracer with binary search.</p>\n<h1>OCR Hallucination Defense</h1>\n<p>The competition's scoring model often hallucinates the presence of text in SVGs, negatively impacting the OCR score and overall performance. To counter this, I inject a small \"L\" shaped watermark into a fixed position within each SVG.</p>\n<p>The color of this watermark is chosen dynamically—either black or white—based on the local brightness of the region to ensure it blends naturally with the image while still being detectable. This simple yet effective trick significantly reduces false positives in OCR evaluation.</p>\n<h1>Best SVG Selection</h1>\n<p>To select the best SVG, I use <strong>PaliGemma-3B</strong>, which is approximately <strong>3× faster</strong> than the 10B version, with minimal loss in accuracy.</p>\n<h1>Time Management Strategy</h1>\n<p>Each description is allocated a fixed time budget of 64 seconds. If a sample finishes early, the unused time is accumulated and carried forward.</p>\n<p>This saved time is then reused to allow additional image generation attempts for future descriptions, calculated as:<br>\n<code>attempts = int(base_num_attempts + saved_time / per_attempt_time)</code></p>\n<h1>Submission Selection</h1>\n<p>To guide submission selecting, I created a validation dataset of 100 descriptions covering <strong>11 diverse categories</strong> (Nature, Abstract, Fashion, Animal, Household, Food, Urban, Technology, Transport, Sports/Recreation, Medical/Healthcare), all generated using Gemini.</p>\n<p>You can find the dataset <a href=\"https://www.kaggle.com/datasets/kawchar85/t2s-validation-dataset\" target=\"_blank\">here</a>.</p>\n<p>I ran multiple inference notebooks and tracked both CV and leaderboard performance:</p>\n<table>\n<thead>\n<tr>\n<th>Notebook</th>\n<th>Public LB</th>\n<th>CV Score</th>\n<th>Private LB</th>\n<th>Final Submission</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>0.699</td>\n<td>0.724</td>\n<td>0.690</td>\n<td>No</td>\n</tr>\n<tr>\n<td>2</td>\n<td>0.696</td>\n<td>0.730</td>\n<td>0.699</td>\n<td>No</td>\n</tr>\n<tr>\n<td>3</td>\n<td>0.690</td>\n<td>0.752</td>\n<td>0.686</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td>4</td>\n<td>0.689</td>\n<td>0.763</td>\n<td>0.693</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n<p>Notebook 3 and Notebook 4 were selected for final submission based on strong cross-validation performance. Unfortunately, I missed selecting Notebook 2—which actually had a slightly higher private leaderboard score.</p>\n<h1>Other Approaches I Tried</h1>\n<ul>\n<li>Combined Qwen2.5-14B-Instruct-AWQ with SDXL Hyper, but this setup led to lower scores overall.</li>\n<li>Experimented with LoRA fine-tuning on SD, SDXL, and SDXL Flash models, but this consistently reduced performance.</li>\n<li>Fine-tuned SmolLM2-1.7B-Instruct for prompt enhancement in an SVG-friendly style. This didn't improve the public leaderboard score (actually reduced it to 0.682), but interestingly achieved a slightly better private score of 0.694 (compared to 0.693 in my selected submission).</li>\n<li>Tried various diffusion models and found that SDXL Flash, Flux Schnell, Hyper SDXL, Juggernaut XL V9, and Playground 1K Aesthetic tended to perform better.</li>\n<li>Attempted to dynamically calculate the total point budget for SVG simplification based on image complexity, rather than using a fixed 2000-point budget. However, this added overhead without significantly improving results.</li>\n</ul>\n<h1>Mistakes I Made</h1>\n<p>Looking back, there are a few key areas where I could have improved:</p>\n<ul>\n<li><strong>I didn't make any focused attempts to optimize the aesthetic score</strong>, which could have boosted my overall competition metric.</li>\n<li>I relied too heavily on a single dataset for cross-validation and final submission decisions, which likely led me to overlook better-performing solutions (e.g., Notebook 2).</li>\n<li>I avoided exploring more unconventional or \"hacky\" techniques like those used by the top-ranking teams.</li>\n</ul>",
  "comments": [],
  "comment_count": 0,
  "messages": [
    {
      "id": 3211226,
      "postDate": "2025-05-28T07:59:07.917Z",
      "content": "<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F12376195%2Fb2db60069ff4dbdb76090bdb1f2a8fca%2FScreenshot%202025-05-28%20at%201.57.31PM.png?generation=1748419083311977&amp;alt=media\" alt=\"Sample output\"><br>\nI’d like to extend my sincere thanks to the organizers for their hard work and dedication in making this competition both engaging and meaningful. I also appreciate everyone who shared helpful ideas throughout—this community support made a big difference. My custom image-to-SVG pipeline was inspired by the work of <a href=\"https://www.kaggle.com/richolson\" target=\"_blank\">@richolson</a> , and I’m especially grateful for his contributions.</p>\n<p>I'm a beginner in this field with limited experience and knowledge, so feedback and suggestions are always welcome!</p>\n<h1>TL;DR</h1>\n<ul>\n<li>Fine-tuned <strong>SmolLM2-1.7B-Instruct</strong> to generate four TIFA-style questions per description.</li>\n<li>Used <strong>SDXL Flash</strong> for fast and high-quality image generation.</li>\n<li>Converted images to SVG using two approaches: a custom polygon/path pipeline and VTracer with binary search for size optimization.</li>\n<li>Injected a small <strong>\"L\" watermark</strong> in each SVG to mitigate OCR hallucination.</li>\n<li>Used <strong>PaliGemma-3B</strong> (about 3x faster than the 10B version) to evaluate and select the best SVG based on competition score using my generated TIFA questions.</li>\n<li>Implemented a <strong>dynamic time management</strong> strategy to maximize usage of the per-prompt time budget.</li>\n<li>Here is the <strong><a href=\"https://www.kaggle.com/code/kawchar85/sdxl-flash-img-svg\" target=\"_blank\">inference notebook</a></strong></li>\n</ul>\n<h1>TIFA Question Generation</h1>\n<p>To generate high-quality evaluation questions, I created a dataset of approximately 10,000 structured examples using Gemini and Claude. Each set follows a strict 4-question TIFA format:</p>\n<ul>\n<li>Q1: Yes/No question that contradicts the description (answer: “no”)</li>\n<li>Q2: Multiple-choice question using an exact word from the description</li>\n<li>Q3: Another multiple-choice question using a different exact word</li>\n<li>Q4: Yes/No question affirming something present in the description (answer: “yes”)</li>\n</ul>\n<p>I fine-tuned SmolLM2-1.7B-Instruct on this dataset. The model performs well and significantly improved my competition score. In around 2% of cases, Q2 and Q3 were duplicates—likely due to minor inconsistencies in my training data or the limited capacity of the small model. To handle such edge cases, I added fallback logic to inject dummy questions when fewer than four unique ones are generated.</p>\n<p>Inference is extremely fast, averaging about <strong>3 seconds per prompt</strong>.</p>\n<h1>Image Generation</h1>\n<p>I used SDXL Flash due to its speed-quality tradeoff. Prompts were constructed using a consistent template:</p>\n<blockquote>\n  <p>flat vector illustration of {description}, minimalist design, solid colors, flat color blocks</p>\n</blockquote>\n<p>Each prompt gets 4 attempts by default, extended dynamically using leftover time from previous predictions.</p>\n<h1>Image-to-SVG Conversion</h1>\n<p>Each generated image is first resized from 768×768 to 384×384 to reduce SVG complexity. The image is then quantized to 16 colors using MiniBatchKMeans in LAB color space. After quantization, I apply a <strong>Disjoint Set Union (DSU)</strong> algorithm to merge adjacent regions with similar colors. The processed image is then passed to two SVG conversion pipelines:</p>\n<h3>Custom Polygon/Path Simplification</h3>\n<p>This method allocates a total point budget (e.g., 2000 points) and distributes it across contours based on an importance metric combining area, shape complexity, and proximity to the image center. For each contour, I perform a <strong>binary search</strong> to find an optimal epsilon value that simplifies the contour to the target number of points using cv2.approxPolyDP.</p>\n<p>Each simplified shape is then encoded as either a polygon or a path, depending on which representation is shorter in bytes. This yields visually accurate SVGs while keeping file size under control.</p>\n<h3>VTracer + Binary Search Compression</h3>\n<p>As an alternative, I also use VTracer to convert the image into layered SVG paths. After tracing, a <strong>binary search</strong> simplification pass is applied to the path elements using cv2.approxPolyDP to further reduce the file size and ensure the final SVG remains under the 10KB limit.</p>\n<p>For each generated image, I produce two SVGs—one using the custom polygon/path pipeline and the other using VTracer with binary search.</p>\n<h1>OCR Hallucination Defense</h1>\n<p>The competition's scoring model often hallucinates the presence of text in SVGs, negatively impacting the OCR score and overall performance. To counter this, I inject a small \"L\" shaped watermark into a fixed position within each SVG.</p>\n<p>The color of this watermark is chosen dynamically—either black or white—based on the local brightness of the region to ensure it blends naturally with the image while still being detectable. This simple yet effective trick significantly reduces false positives in OCR evaluation.</p>\n<h1>Best SVG Selection</h1>\n<p>To select the best SVG, I use <strong>PaliGemma-3B</strong>, which is approximately <strong>3× faster</strong> than the 10B version, with minimal loss in accuracy.</p>\n<h1>Time Management Strategy</h1>\n<p>Each description is allocated a fixed time budget of 64 seconds. If a sample finishes early, the unused time is accumulated and carried forward.</p>\n<p>This saved time is then reused to allow additional image generation attempts for future descriptions, calculated as:<br>\n<code>attempts = int(base_num_attempts + saved_time / per_attempt_time)</code></p>\n<h1>Submission Selection</h1>\n<p>To guide submission selecting, I created a validation dataset of 100 descriptions covering <strong>11 diverse categories</strong> (Nature, Abstract, Fashion, Animal, Household, Food, Urban, Technology, Transport, Sports/Recreation, Medical/Healthcare), all generated using Gemini.</p>\n<p>You can find the dataset <a href=\"https://www.kaggle.com/datasets/kawchar85/t2s-validation-dataset\" target=\"_blank\">here</a>.</p>\n<p>I ran multiple inference notebooks and tracked both CV and leaderboard performance:</p>\n<table>\n<thead>\n<tr>\n<th>Notebook</th>\n<th>Public LB</th>\n<th>CV Score</th>\n<th>Private LB</th>\n<th>Final Submission</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>0.699</td>\n<td>0.724</td>\n<td>0.690</td>\n<td>No</td>\n</tr>\n<tr>\n<td>2</td>\n<td>0.696</td>\n<td>0.730</td>\n<td>0.699</td>\n<td>No</td>\n</tr>\n<tr>\n<td>3</td>\n<td>0.690</td>\n<td>0.752</td>\n<td>0.686</td>\n<td>Yes</td>\n</tr>\n<tr>\n<td>4</td>\n<td>0.689</td>\n<td>0.763</td>\n<td>0.693</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n<p>Notebook 3 and Notebook 4 were selected for final submission based on strong cross-validation performance. Unfortunately, I missed selecting Notebook 2—which actually had a slightly higher private leaderboard score.</p>\n<h1>Other Approaches I Tried</h1>\n<ul>\n<li>Combined Qwen2.5-14B-Instruct-AWQ with SDXL Hyper, but this setup led to lower scores overall.</li>\n<li>Experimented with LoRA fine-tuning on SD, SDXL, and SDXL Flash models, but this consistently reduced performance.</li>\n<li>Fine-tuned SmolLM2-1.7B-Instruct for prompt enhancement in an SVG-friendly style. This didn't improve the public leaderboard score (actually reduced it to 0.682), but interestingly achieved a slightly better private score of 0.694 (compared to 0.693 in my selected submission).</li>\n<li>Tried various diffusion models and found that SDXL Flash, Flux Schnell, Hyper SDXL, Juggernaut XL V9, and Playground 1K Aesthetic tended to perform better.</li>\n<li>Attempted to dynamically calculate the total point budget for SVG simplification based on image complexity, rather than using a fixed 2000-point budget. However, this added overhead without significantly improving results.</li>\n</ul>\n<h1>Mistakes I Made</h1>\n<p>Looking back, there are a few key areas where I could have improved:</p>\n<ul>\n<li><strong>I didn't make any focused attempts to optimize the aesthetic score</strong>, which could have boosted my overall competition metric.</li>\n<li>I relied too heavily on a single dataset for cross-validation and final submission decisions, which likely led me to overlook better-performing solutions (e.g., Notebook 2).</li>\n<li>I avoided exploring more unconventional or \"hacky\" techniques like those used by the top-ranking teams.</li>\n</ul>",
      "rawMarkdown": "![Sample output](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F12376195%2Fb2db60069ff4dbdb76090bdb1f2a8fca%2FScreenshot%202025-05-28%20at%201.57.31PM.png?generation=1748419083311977&alt=media)\nI’d like to extend my sincere thanks to the organizers for their hard work and dedication in making this competition both engaging and meaningful. I also appreciate everyone who shared helpful ideas throughout—this community support made a big difference. My custom image-to-SVG pipeline was inspired by the work of @richolson , and I’m especially grateful for his contributions.\n\nI'm a beginner in this field with limited experience and knowledge, so feedback and suggestions are always welcome!\n\n# TL;DR\n- Fine-tuned **SmolLM2-1.7B-Instruct** to generate four TIFA-style questions per description.\n- Used **SDXL Flash** for fast and high-quality image generation.\n- Converted images to SVG using two approaches: a custom polygon/path pipeline and VTracer with binary search for size optimization.\n- Injected a small **\"L\" watermark** in each SVG to mitigate OCR hallucination.\n- Used **PaliGemma-3B** (about 3x faster than the 10B version) to evaluate and select the best SVG based on competition score using my generated TIFA questions.\n- Implemented a **dynamic time management** strategy to maximize usage of the per-prompt time budget.\n- Here is the **[inference notebook](https://www.kaggle.com/code/kawchar85/sdxl-flash-img-svg)**\n\n# TIFA Question Generation\nTo generate high-quality evaluation questions, I created a dataset of approximately 10,000 structured examples using Gemini and Claude. Each set follows a strict 4-question TIFA format:\n\n- Q1: Yes/No question that contradicts the description (answer: “no”)\n- Q2: Multiple-choice question using an exact word from the description\n- Q3: Another multiple-choice question using a different exact word\n- Q4: Yes/No question affirming something present in the description (answer: “yes”)\n\nI fine-tuned SmolLM2-1.7B-Instruct on this dataset. The model performs well and significantly improved my competition score. In around 2% of cases, Q2 and Q3 were duplicates—likely due to minor inconsistencies in my training data or the limited capacity of the small model. To handle such edge cases, I added fallback logic to inject dummy questions when fewer than four unique ones are generated.\n\nInference is extremely fast, averaging about **3 seconds per prompt**.\n\n# Image Generation\nI used SDXL Flash due to its speed-quality tradeoff. Prompts were constructed using a consistent template:\n>flat vector illustration of {description}, minimalist design, solid colors, flat color blocks\n\nEach prompt gets 4 attempts by default, extended dynamically using leftover time from previous predictions.\n\n# Image-to-SVG Conversion\nEach generated image is first resized from 768×768 to 384×384 to reduce SVG complexity. The image is then quantized to 16 colors using MiniBatchKMeans in LAB color space. After quantization, I apply a **Disjoint Set Union (DSU)** algorithm to merge adjacent regions with similar colors. The processed image is then passed to two SVG conversion pipelines:\n\n### Custom Polygon/Path Simplification\nThis method allocates a total point budget (e.g., 2000 points) and distributes it across contours based on an importance metric combining area, shape complexity, and proximity to the image center. For each contour, I perform a **binary search** to find an optimal epsilon value that simplifies the contour to the target number of points using cv2.approxPolyDP.\n\nEach simplified shape is then encoded as either a polygon or a path, depending on which representation is shorter in bytes. This yields visually accurate SVGs while keeping file size under control.\n\n### VTracer + Binary Search Compression\nAs an alternative, I also use VTracer to convert the image into layered SVG paths. After tracing, a **binary search** simplification pass is applied to the path elements using cv2.approxPolyDP to further reduce the file size and ensure the final SVG remains under the 10KB limit.\n\n\nFor each generated image, I produce two SVGs—one using the custom polygon/path pipeline and the other using VTracer with binary search.\n\n# OCR Hallucination Defense\nThe competition's scoring model often hallucinates the presence of text in SVGs, negatively impacting the OCR score and overall performance. To counter this, I inject a small \"L\" shaped watermark into a fixed position within each SVG.\n\nThe color of this watermark is chosen dynamically—either black or white—based on the local brightness of the region to ensure it blends naturally with the image while still being detectable. This simple yet effective trick significantly reduces false positives in OCR evaluation.\n\n# Best SVG Selection\nTo select the best SVG, I use **PaliGemma-3B**, which is approximately **3× faster** than the 10B version, with minimal loss in accuracy.\n\n# Time Management Strategy\nEach description is allocated a fixed time budget of 64 seconds. If a sample finishes early, the unused time is accumulated and carried forward.\n\nThis saved time is then reused to allow additional image generation attempts for future descriptions, calculated as:\n`attempts = int(base_num_attempts + saved_time / per_attempt_time)`\n\n# Submission Selection\nTo guide submission selecting, I created a validation dataset of 100 descriptions covering **11 diverse categories** (Nature, Abstract, Fashion, Animal, Household, Food, Urban, Technology, Transport, Sports/Recreation, Medical/Healthcare), all generated using Gemini.\n\nYou can find the dataset [here](https://www.kaggle.com/datasets/kawchar85/t2s-validation-dataset).\n\nI ran multiple inference notebooks and tracked both CV and leaderboard performance:\n| Notebook | Public LB | CV Score | Private LB | Final Submission |\n|----------|-----------|----------|------------|------------------|\n| 1        | 0.699     | 0.724    | 0.690      | No               |\n| 2        | 0.696     | 0.730    | 0.699      | No               |\n| 3        | 0.690     | 0.752    | 0.686      | Yes              |\n| 4        | 0.689     | 0.763    | 0.693      | Yes              |\n\n\n\nNotebook 3 and Notebook 4 were selected for final submission based on strong cross-validation performance. Unfortunately, I missed selecting Notebook 2—which actually had a slightly higher private leaderboard score.\n\n# Other Approaches I Tried\n- Combined Qwen2.5-14B-Instruct-AWQ with SDXL Hyper, but this setup led to lower scores overall.\n- Experimented with LoRA fine-tuning on SD, SDXL, and SDXL Flash models, but this consistently reduced performance.\n- Fine-tuned SmolLM2-1.7B-Instruct for prompt enhancement in an SVG-friendly style. This didn't improve the public leaderboard score (actually reduced it to 0.682), but interestingly achieved a slightly better private score of 0.694 (compared to 0.693 in my selected submission).\n- Tried various diffusion models and found that SDXL Flash, Flux Schnell, Hyper SDXL, Juggernaut XL V9, and Playground 1K Aesthetic tended to perform better.\n- Attempted to dynamically calculate the total point budget for SVG simplification based on image complexity, rather than using a fixed 2000-point budget. However, this added overhead without significantly improving results.\n\n# Mistakes I Made\nLooking back, there are a few key areas where I could have improved:\n- **I didn't make any focused attempts to optimize the aesthetic score**, which could have boosted my overall competition metric.\n- I relied too heavily on a single dataset for cross-validation and final submission decisions, which likely led me to overlook better-performing solutions (e.g., Notebook 2).\n- I avoided exploring more unconventional or \"hacky\" techniques like those used by the top-ranking teams.\n\n\n\n\n\n\n",
      "votes": 15
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T09:09:40Z",
  "competition_id": 89659,
  "competition_slug": "drawing-with-llms",
  "team_id": 13403300,
  "solution_url": "/competitions/drawing-with-llms/writeups/kawsar-hossain-26th-place-solution-sdxl-flash-opti"
}