From adc658084808a27aa47a9c1a3c798f3eb7897ae2 Mon Sep 17 00:00:00 2001 From: Marcio Bevervanso Date: Tue, 16 Jun 2026 13:08:04 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20priorizar=20imagem=20=C3=BAnica=20+=20In?= =?UTF-8?q?stagram=20sobre=20as=203=20imagens=20(1772103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A cascata anterior, ao falhar a customização por posicionamento, podia derrubar o Instagram e deixar criativo sem IG num ad set que mira IG — gerando 1772103. Agora: se a customização (asset_feed_spec) falhar, cai para imagem única MANTENDO o Instagram (caminho comprovado). O IG só é removido se o próprio criativo de imagem única falhar com erro de IG. Co-Authored-By: Claude Opus 4.8 --- src/lib/mcp/tools.ts | 53 ++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/src/lib/mcp/tools.ts b/src/lib/mcp/tools.ts index e7e8c5e..27a5392 100644 --- a/src/lib/mcp/tools.ts +++ b/src/lib/mcp/tools.ts @@ -698,38 +698,33 @@ export async function addAdToAdSet(client: Client, params: AddAdToAdSetParams) { let instagramDropped = false; let placementsDropped = false; - try { - creative = await buildCreative(params.instagram_actor_id, wantPlacements); - } catch (err) { - if (params.instagram_actor_id && isInstagramError(err)) { - // Problema no Instagram: refaz sem IG (mantendo a customização se houver). - instagramDropped = true; - try { - creative = await buildCreative(undefined, wantPlacements); - } catch (err2) { - if (wantPlacements) { - placementsDropped = true; - creative = await buildCreative(undefined, false); - } else { - throw err2; - } + // Imagem única + IG é o caminho comprovado. Só largamos o Instagram se o + // próprio criativo de imagem única falhar com erro específico de IG (id + // inválido / sem acesso). Prioridade: NUNCA trocar IG por "3 imagens". + const buildSingleWithIgFallback = async () => { + try { + return await buildCreative(params.instagram_actor_id, false); + } catch (err) { + if (params.instagram_actor_id && isInstagramError(err)) { + instagramDropped = true; + return await buildCreative(undefined, false); } - } else if (wantPlacements) { - // Erro provável da customização por posicionamento → cai pra imagem única. - placementsDropped = true; - try { - creative = await buildCreative(params.instagram_actor_id, false); - } catch (err2) { - if (params.instagram_actor_id && isInstagramError(err2)) { - instagramDropped = true; - creative = await buildCreative(undefined, false); - } else { - throw err2; - } - } - } else { throw err; } + }; + + if (wantPlacements) { + try { + // 1) Melhor caso: imagem específica por posicionamento, com IG. + creative = await buildCreative(params.instagram_actor_id, true); + } catch { + // 2) Customização por posicionamento falhou (ex: conflito com a + // identidade de IG) → cai pra imagem única mantendo o Instagram. + placementsDropped = true; + creative = await buildSingleWithIgFallback(); + } + } else { + creative = await buildSingleWithIgFallback(); } const creativeId = (creative as any)?.id;