{
  "aboutHtml": "<p>O Recraft V4 é o modelo raster padrão da geração V4 da Recraft. O fabricante destaca o critério de design: composição equilibrada, relações de cor coerentes e pormenores que apoiam a intenção visual. Pode trabalhar com ilustração estilizada, cenas fotográficas e conceitos de design gráfico. Utilize-o quando o briefing pede uma imagem que combine escolhas estéticas com fidelidade à instrução, tanto para explorar um ambiente a partir de uma orientação curta como para especificar detalhadamente uma composição intencional.</p><p>O código exato do modelo é recraftv4. A referência do fabricante indica saída raster 1K em WebP sem perdas ou PNG. Uma imagem quadrada tem 1024 × 1024 píxeis, 16:9 corresponde a 1344 × 768 e 2:3 a 832 × 1280; outras proporções suportadas utilizam as respetivas dimensões. O V4 Pro é a edição raster 2K separada, enquanto o V4 Vector e o Pro Vector devolvem SVG editável. Selecione a variante V4 exata para a entrega pretendida, em vez de combinar estas diferentes propriedades de saída.</p><p>O guia do fabricante distingue instruções breves e interpretativas de uma direção criativa estruturada. Uma frase curta pode deixar espaço para explorar a forma, o ambiente e o enquadramento. Um briefing estruturado pode identificar o tema, o cenário, a pose, o material, os elementos secundários, a iluminação e a hierarquia visual. Para uma ilustração narrativa, descreva um ciclista a atravessar uma pequena ponte, formas simplificadas marcantes, cores quentes e suaves e um movimento claro da esquerda para a direita. Estas decisões de conteúdo e composição são mais concretas do que uma longa lista de adjetivos de estilo sem relação entre si.</p><p>A variedade do V4 inclui ilustração, imagens com volume e imagens fotorrealistas. O guia recomenda descrever a lógica do desenho para a ilustração e os materiais, a luz, a câmara e a profundidade para uma imagem de aparência 3D. Esta continua a ser uma imagem raster, e não uma malha editável. Para um conceito de cartaz ou embalagem, indique quais as palavras principais, onde ficam e como a imagem e a tipografia interagem. O fabricante destaca texto curto e de extensão média legível; examine o texto e a disposição reais na imagem devolvida antes de a utilizar.</p><p>A geração suporta instruções com até 10 000 caracteres, uma semente aleatória, uma a seis imagens de saída, cores preferidas e uma cor de fundo desejada. Estilos personalizados compatíveis e imagens de referência opcionais podem orientar o tratamento visual através de correspondência flexível ou precisa. Escolha uma referência limpa ou um conjunto pertencente ao mesmo universo visual e deixe que a instrução descreva o novo tema e a cena. A correspondência das cores entre referência e resultado não é garantida, por isso mantenha explícita a paleta exigida e compare o resultado com ela. Para geração com estilo de referência, utilize uma a dez imagens PNG, JPG ou WebP, até 64 MB no total e menos de 20 MB por imagem. Cada referência deve ter um lado mais curto de pelo menos 256 píxeis, um lado mais longo de no máximo 4096 píxeis e uma resolução de no máximo 16 megapíxeis. Utilize estas referências ou um estilo guardado compatível, em vez de ambos.</p><p>A operação documentada de imagem para imagem combina uma imagem existente e uma instrução, com intensidade entre 0 e 1 a determinar quanto a nova saída se afasta da origem. Não aceita controlos de estilo V4 nessa operação. A referência atual de geração também exclui nomes de estilos predefinidos, negative_prompt, text_layout, artistic_level e no_text. Prepare uma descrição positiva do resultado desejado e avalie a peça na composição de destino. O V4 padrão oferece uma interpretação raster de design focada, com edição, formato e tamanho de saída específicos. Para imagem para imagem, forneça PNG, JPG, WebP ou SVG com menos de 20 MB, no máximo 16 megapíxeis e ambos os lados entre 256 e 4096 píxeis.</p>",
  "aboutText": "O Recraft V4 é o modelo raster padrão da geração V4 da Recraft. O fabricante destaca o critério de design: composição equilibrada, relações de cor coerentes e pormenores que apoiam a intenção visual. Pode trabalhar com ilustração estilizada, cenas fotográficas e conceitos de design gráfico. Utilize-o quando o briefing pede uma imagem que combine escolhas estéticas com fidelidade à instrução, tanto para explorar um ambiente a partir de uma orientação curta como para especificar detalhadamente uma composição intencional.\n\nO código exato do modelo é recraftv4. A referência do fabricante indica saída raster 1K em WebP sem perdas ou PNG. Uma imagem quadrada tem 1024 × 1024 píxeis, 16:9 corresponde a 1344 × 768 e 2:3 a 832 × 1280; outras proporções suportadas utilizam as respetivas dimensões. O V4 Pro é a edição raster 2K separada, enquanto o V4 Vector e o Pro Vector devolvem SVG editável. Selecione a variante V4 exata para a entrega pretendida, em vez de combinar estas diferentes propriedades de saída.\n\nO guia do fabricante distingue instruções breves e interpretativas de uma direção criativa estruturada. Uma frase curta pode deixar espaço para explorar a forma, o ambiente e o enquadramento. Um briefing estruturado pode identificar o tema, o cenário, a pose, o material, os elementos secundários, a iluminação e a hierarquia visual. Para uma ilustração narrativa, descreva um ciclista a atravessar uma pequena ponte, formas simplificadas marcantes, cores quentes e suaves e um movimento claro da esquerda para a direita. Estas decisões de conteúdo e composição são mais concretas do que uma longa lista de adjetivos de estilo sem relação entre si.\n\nA variedade do V4 inclui ilustração, imagens com volume e imagens fotorrealistas. O guia recomenda descrever a lógica do desenho para a ilustração e os materiais, a luz, a câmara e a profundidade para uma imagem de aparência 3D. Esta continua a ser uma imagem raster, e não uma malha editável. Para um conceito de cartaz ou embalagem, indique quais as palavras principais, onde ficam e como a imagem e a tipografia interagem. O fabricante destaca texto curto e de extensão média legível; examine o texto e a disposição reais na imagem devolvida antes de a utilizar.\n\nA geração suporta instruções com até 10 000 caracteres, uma semente aleatória, uma a seis imagens de saída, cores preferidas e uma cor de fundo desejada. Estilos personalizados compatíveis e imagens de referência opcionais podem orientar o tratamento visual através de correspondência flexível ou precisa. Escolha uma referência limpa ou um conjunto pertencente ao mesmo universo visual e deixe que a instrução descreva o novo tema e a cena. A correspondência das cores entre referência e resultado não é garantida, por isso mantenha explícita a paleta exigida e compare o resultado com ela. Para geração com estilo de referência, utilize uma a dez imagens PNG, JPG ou WebP, até 64 MB no total e menos de 20 MB por imagem. Cada referência deve ter um lado mais curto de pelo menos 256 píxeis, um lado mais longo de no máximo 4096 píxeis e uma resolução de no máximo 16 megapíxeis. Utilize estas referências ou um estilo guardado compatível, em vez de ambos.\n\nA operação documentada de imagem para imagem combina uma imagem existente e uma instrução, com intensidade entre 0 e 1 a determinar quanto a nova saída se afasta da origem. Não aceita controlos de estilo V4 nessa operação. A referência atual de geração também exclui nomes de estilos predefinidos, negative_prompt, text_layout, artistic_level e no_text. Prepare uma descrição positiva do resultado desejado e avalie a peça na composição de destino. O V4 padrão oferece uma interpretação raster de design focada, com edição, formato e tamanho de saída específicos. Para imagem para imagem, forneça PNG, JPG, WebP ou SVG com menos de 20 MB, no máximo 16 megapíxeis e ambos os lados entre 256 e 4096 píxeis.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "ee116bf160c29ac8b6171673f97444db039f14b29082d7a580e2e88f10011a12",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "pt-pt",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Recraft: Recraft V4</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Fechar\">×</button></div><div class=\"idline\"><span>Recraft /</span><code>recraft/recraft-v4</code><button type=\"button\" id=\"copy-id\">Copiar ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Secções do cartão do modelo\"><button type=\"button\" data-card-jump=\"overview\">Introdução</button><button type=\"button\" data-card-jump=\"methods\">Entradas e métodos</button><button type=\"button\" data-card-jump=\"pricing\">Tarifários</button><button type=\"button\" data-card-jump=\"examples\">Exemplos</button><button type=\"button\" data-card-jump=\"results\">Resultados</button><button type=\"button\" data-card-jump=\"aliases\">Aliases</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Métodos da API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|images|/v1/images/generations|recraft%2Frecraft-v4\">Imagens</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Introdução</h3><p class=\"mdesc-full\">O Recraft V4 gera imagens raster 1K com foco na composição, nas relações de cor e na direção criativa detalhada. Abrange ilustração, cenas fotorrealistas e conceitos de design gráfico, com entradas de estilo opcionais e um fluxo separado de imagem para imagem.</p><dl class=\"card-io\" data-card-io><div><dt>Entradas aceites</dt><dd>Texto · Imagens</dd></div><div><dt>Resultados</dt><dd>Imagens</dd></div></dl><details class=\"card-about\"><summary>Sobre o modelo</summary><p class=\"note-s\" data-model-method-boundary>Esta descrição apresenta as capacidades do modelo. As entradas, saídas e opções disponíveis no Ailoot para o método selecionado estão indicadas abaixo.</p><div class=\"mabout\" id=\"m-about\"><p>O Recraft V4 é o modelo raster padrão da geração V4 da Recraft. O fabricante destaca o critério de design: composição equilibrada, relações de cor coerentes e pormenores que apoiam a intenção visual. Pode trabalhar com ilustração estilizada, cenas fotográficas e conceitos de design gráfico. Utilize-o quando o briefing pede uma imagem que combine escolhas estéticas com fidelidade à instrução, tanto para explorar um ambiente a partir de uma orientação curta como para especificar detalhadamente uma composição intencional.</p><p>O código exato do modelo é recraftv4. A referência do fabricante indica saída raster 1K em WebP sem perdas ou PNG. Uma imagem quadrada tem 1024 × 1024 píxeis, 16:9 corresponde a 1344 × 768 e 2:3 a 832 × 1280; outras proporções suportadas utilizam as respetivas dimensões. O V4 Pro é a edição raster 2K separada, enquanto o V4 Vector e o Pro Vector devolvem SVG editável. Selecione a variante V4 exata para a entrega pretendida, em vez de combinar estas diferentes propriedades de saída.</p><p>O guia do fabricante distingue instruções breves e interpretativas de uma direção criativa estruturada. Uma frase curta pode deixar espaço para explorar a forma, o ambiente e o enquadramento. Um briefing estruturado pode identificar o tema, o cenário, a pose, o material, os elementos secundários, a iluminação e a hierarquia visual. Para uma ilustração narrativa, descreva um ciclista a atravessar uma pequena ponte, formas simplificadas marcantes, cores quentes e suaves e um movimento claro da esquerda para a direita. Estas decisões de conteúdo e composição são mais concretas do que uma longa lista de adjetivos de estilo sem relação entre si.</p><p>A variedade do V4 inclui ilustração, imagens com volume e imagens fotorrealistas. O guia recomenda descrever a lógica do desenho para a ilustração e os materiais, a luz, a câmara e a profundidade para uma imagem de aparência 3D. Esta continua a ser uma imagem raster, e não uma malha editável. Para um conceito de cartaz ou embalagem, indique quais as palavras principais, onde ficam e como a imagem e a tipografia interagem. O fabricante destaca texto curto e de extensão média legível; examine o texto e a disposição reais na imagem devolvida antes de a utilizar.</p><p>A geração suporta instruções com até 10 000 caracteres, uma semente aleatória, uma a seis imagens de saída, cores preferidas e uma cor de fundo desejada. Estilos personalizados compatíveis e imagens de referência opcionais podem orientar o tratamento visual através de correspondência flexível ou precisa. Escolha uma referência limpa ou um conjunto pertencente ao mesmo universo visual e deixe que a instrução descreva o novo tema e a cena. A correspondência das cores entre referência e resultado não é garantida, por isso mantenha explícita a paleta exigida e compare o resultado com ela. Para geração com estilo de referência, utilize uma a dez imagens PNG, JPG ou WebP, até 64 MB no total e menos de 20 MB por imagem. Cada referência deve ter um lado mais curto de pelo menos 256 píxeis, um lado mais longo de no máximo 4096 píxeis e uma resolução de no máximo 16 megapíxeis. Utilize estas referências ou um estilo guardado compatível, em vez de ambos.</p><p>A operação documentada de imagem para imagem combina uma imagem existente e uma instrução, com intensidade entre 0 e 1 a determinar quanto a nova saída se afasta da origem. Não aceita controlos de estilo V4 nessa operação. A referência atual de geração também exclui nomes de estilos predefinidos, negative_prompt, text_layout, artistic_level e no_text. Prepare uma descrição positiva do resultado desejado e avalie a peça na composição de destino. O V4 padrão oferece uma interpretação raster de design focada, com edição, formato e tamanho de saída específicos. Para imagem para imagem, forneça PNG, JPG, WebP ou SVG com menos de 20 MB, no máximo 16 megapíxeis e ambos os lados entre 256 e 4096 píxeis.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Disponível no Ailoot · entradas e métodos</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Imagens</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Entrada</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Saída</dt><dd><code>image</code></dd></div><div><dt>Formato de saída</dt><dd>Ficheiro de imagem</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Campo</th><th>Tipo</th><th>Requisito</th><th>Valores e limites</th><th>Predefinição</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obrigatório</td><td data-cell-label=\"Valores e limites\"><span class=\"card-cell-label\">Valores e limites</span><div>recraft/recraft-v4</div></td><td data-cell-label=\"Predefinição\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predefinição</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Obrigatório</td><td data-cell-label=\"Valores e limites\"><span class=\"card-cell-label\">Valores e limites</span><div>Comprimento mínimo: 1</div></td><td data-cell-label=\"Predefinição\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predefinição</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>integer</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Opcional</td><td data-cell-label=\"Valores e limites\"><span class=\"card-cell-label\">Valores e limites</span><div>Mínimo: 1</div><div>Máximo: 6</div></td><td data-cell-label=\"Predefinição\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predefinição</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>string</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Opcional</td><td data-cell-label=\"Valores e limites\"><span class=\"card-cell-label\">Valores e limites</span><div>1:1, 4:3, 3:4, 16:9, 9:16, auto</div></td><td data-cell-label=\"Predefinição\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predefinição</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">input_references</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span><code>array</code></td><td data-cell-label=\"Requisito\"><span class=\"card-cell-label\">Requisito</span>Opcional</td><td data-cell-label=\"Valores e limites\"><span class=\"card-cell-label\">Valores e limites</span><div>Número mínimo de elementos: 0</div><div>Número máximo de elementos: 1</div></td><td data-cell-label=\"Predefinição\" data-default=\"unspecified\"><span class=\"card-cell-label\">Predefinição</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Combinações de materiais de entrada</summary><p class=\"note-s\"><b>Texto para imagem</b> · Obrigatório: prompt</p><p class=\"note-s\"><b>reference_guided_image</b> · Obrigatório: prompt, actual image reference</p></details><details class=\"note-s\" data-method-contract><summary>Parâmetros e ciclo de vida do método</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parâmetro</th><th>Contrato</th></tr></thead><tbody><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>content_type</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>application/json</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>required</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>model, prompt</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>material_types</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>text, image</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>optional_controls</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>n, aspect_ratio, input_references</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>n</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>{&quot;minimum&quot;:1,&quot;maximum&quot;:6}</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>reference_images</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>{&quot;minimum&quot;:0,&quot;maximum&quot;:1,&quot;source&quot;:&quot;material real fornecido pelo cliente&quot;}</td></tr><tr><th data-cell-label=\"Parâmetro\" scope=\"row\"><span class=\"card-cell-label\">Parâmetro</span><code>provider_specific_options</code></th><td data-cell-label=\"Contrato\"><span class=\"card-cell-label\">Contrato</span>Apenas style/controls/text_layout da lista exata guardada de valores permitidos do endpoint; sem estruturas adivinhadas.</td></tr></tbody></table></div><p>Aliases do método: <code>/v1/images</code></p><p>Ciclo de vida: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · task_id efetivamente devolvido ou registo na biblioteca de multimédia</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">O exemplo apenas com instrução conserva a estrutura oficial ImageGenerationRequest.</p><p class=\"note-s\">Conserve todas as imagens devolvidas e a resposta completa; a quantidade final de saídas é a real, e não o n solicitado.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Tarifários</h3><div class=\"card-result-process\" data-billing-basis><h5>Cálculo do custo final</h5><p class=\"note-s\">As tarifas apresentadas permitem estimar o custo antes da geração. O montante final cobrado é calculado a partir do custo registado para a geração original. A duração medida do resultado e as quantidades previstas não correspondem à quantidade final faturável.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.</p><dl data-price-conditions><dt>Modo rápido</dt><dd>Não especificado <span class=\"note-s\">Quando o modo rápido está selecionado</span></dd><dt>Modo flex</dt><dd>Não especificado <span class=\"note-s\">Quando o modo flex está selecionado</span></dd><dt>Esforço máximo de raciocínio</dt><dd>Não especificado <span class=\"note-s\">Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)</span></dd></dl></div><div data-declared-tariff-pricing><h4>Tarifas estimadas para comparação</h4><h4>Preços por configuração</h4><p class=\"note-s\">Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuração</th><th>Tabela de tarifas</th><th>Quantidade prevista</th><th>Unidade de faturação</th><th>Custo</th></tr></thead><tbody><tr><th data-cell-label=\"Configuração\" scope=\"row\"><span class=\"card-cell-label\">Configuração</span>Tarifas base por token</th><td data-cell-label=\"Tabela de tarifas\"><span class=\"card-cell-label\">Tabela de tarifas</span>Tarifa base</td><td data-cell-label=\"Quantidade prevista\"><span class=\"card-cell-label\">Quantidade prevista</span>—</td><td data-cell-label=\"Unidade de faturação\"><span class=\"card-cell-label\">Unidade de faturação</span>—</td><td data-cell-label=\"Custo\"><span class=\"card-cell-label\">Custo</span><div><span>Entrada · Tokens de entrada · Estimativa apenas para comparação</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Saída · Tokens de saída · Estimativa apenas para comparação</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Leitura da cache · Estimativa apenas para comparação</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Escrita na cache · Estimativa apenas para comparação</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div><div><span>Entrada · Escrita na cache, 1 hora · Estimativa apenas para comparação</span> <b>—</b> <span class=\"price-unit\">/ 1K tokens</span></div></td></tr><tr><th data-cell-label=\"Configuração\" scope=\"row\"><span class=\"card-cell-label\">Configuração</span>Ultra</th><td data-cell-label=\"Tabela de tarifas\"><span class=\"card-cell-label\">Tabela de tarifas</span>—</td><td data-cell-label=\"Quantidade prevista\"><span class=\"card-cell-label\">Quantidade prevista</span>—</td><td data-cell-label=\"Unidade de faturação\"><span class=\"card-cell-label\">Unidade de faturação</span>por imagem de saída</td><td data-cell-label=\"Custo\"><span class=\"card-cell-label\">Custo</span><div><span>Saída · imagem de saída · Estimativa apenas para comparação</span> <b>$0.08</b> <span class=\"price-unit\">por imagem de saída</span></div></td></tr><tr><th data-cell-label=\"Configuração\" scope=\"row\"><span class=\"card-cell-label\">Configuração</span>Custo estimado de geração</th><td data-cell-label=\"Tabela de tarifas\"><span class=\"card-cell-label\">Tabela de tarifas</span>—</td><td data-cell-label=\"Quantidade prevista\"><span class=\"card-cell-label\">Quantidade prevista</span>estimativa para uma geração</td><td data-cell-label=\"Unidade de faturação\"><span class=\"card-cell-label\">Unidade de faturação</span>—</td><td data-cell-label=\"Custo\"><span class=\"card-cell-label\">Custo</span><div><span>Saída · Custo estimado de geração · Estimativa apenas para comparação</span> <b>$0.08</b> <span class=\"price-unit\">estimativa antes da geração</span></div><p class=\"note-s\">Esta estimativa não é um encargo adicional nem uma tarifa fixa para a geração concluída.</p></td></tr></tbody></table></div></div><p class=\"note-s\">O Ailoot reserva um montante estimado antes de um pedido. Após o resultado, liquida o custo final com base na utilização medida. No streaming, a liquidação usa o registo final de utilização. <a href=\"/docs/pt-pt/billing/reserve/\">Como funcionam a reserva e a liquidação →</a></p><div data-declared-reference-pricing><h4>Detalhes da tarifa de referência</h4><p class=\"note-s\">As tabelas de referência do modelo não alteram a seleção do método, as cotações ou os custos. Os custos ativos usam as tarifas do método Ailoot selecionado.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Configurações de preços de imagens</summary><h4>Preços por configuração</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Configuração</th><th>Condições de faturação</th><th>Custo</th></tr></thead><tbody><tr><th data-cell-label=\"Configuração\" scope=\"row\"><span class=\"card-cell-label\">Configuração</span>Imagem de saída</th><td data-cell-label=\"Condições de faturação\"><span class=\"card-cell-label\">Condições de faturação</span>Não está declarada qualquer variante de preços.</td><td data-cell-label=\"Custo\"><span class=\"card-cell-label\">Custo</span><div><span>Saída · Imagem de saída</span> <b>$0.08</b> <span class=\"price-unit\">por imagem</span></div><p class=\"note-s\">As entradas equivalentes descrevem a mesma cobrança; não acrescentam uma segunda taxa.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Exemplos de pedidos</h3><h4>Ailoot Ultra · Imagens</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Variantes de código\"><button class=\"cg-tab\" id=\"model-code-2535-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-2535-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-2535-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Node.js SDK</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Copiar código\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-2535-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np={&#39;model&#39;: &#39;recraft/recraft-v4&#39;, &#39;prompt&#39;: &#39;a red panda astronaut floating in space, studio lighting&#39;}\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2535-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\n\nrequest={&#39;model&#39;: &#39;recraft/recraft-v4&#39;, &#39;prompt&#39;: &#39;a red panda astronaut floating in space, studio lighting&#39;}\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.images.generate(**request)\nPath(&quot;sdk-result.txt&quot;).write_text(str(result),encoding=&quot;utf-8&quot;)\nsave_images([{&quot;b64_json&quot;:getattr(item,&quot;b64_json&quot;,None),&quot;url&quot;:getattr(item,&quot;url&quot;,None)} for item in result.data])\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2535-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-tab-2\" hidden><pre data-lang=\"js\"><code>import OpenAI from &quot;openai&quot;;\nimport { readFileSync, writeFileSync } from &quot;node:fs&quot;;\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(&quot;Set your actual Ailoot API key&quot;);\nconst client=new OpenAI({baseURL:&quot;https://api.ailoot.ai/v1&quot;,apiKey:key,maxRetries:0});\nconst request={&quot;model&quot;: &quot;recraft/recraft-v4&quot;, &quot;prompt&quot;: &quot;a red panda astronaut floating in space, studio lighting&quot;};\nconst result=await client.images.generate(request);\nwriteFileSync(&quot;sdk-result.json&quot;,JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(&quot;No completed images&quot;);\nfor(let index=0;index&lt;result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||&quot;&quot;,raw;\n  if(!encoded &amp;&amp; uri.startsWith(&quot;data:image/&quot;)) {\n    const comma=uri.indexOf(&quot;,&quot;);if(comma&lt;0 || !uri.slice(0,comma).includes(&quot;;base64&quot;)) throw new Error(&quot;Unsupported image data URI&quot;);\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(&quot;Invalid Base64&quot;);\n    raw=Buffer.from(encoded,&quot;base64&quot;);\n  } else if(uri) {\n    const u=new URL(uri,&quot;https://api.ailoot.ai&quot;);\n    if(u.protocol!==&quot;https:&quot; || u.username || u.password) throw new Error(&quot;Invalid returned URL&quot;);\n    const owned=u.origin===&quot;https://api.ailoot.ai&quot; &amp;&amp; u.pathname.startsWith(&quot;/v1/media/assets/&quot;) &amp;&amp; u.pathname.endsWith(&quot;/content&quot;);\n    const response=await fetch(u,{headers:owned?{Authorization:&quot;Bearer &quot;+key}:{},redirect:&quot;manual&quot;});\n    if(!response.ok) throw new Error(&quot;Image content download failed: &quot;+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(&quot;Image has neither bytes nor URL&quot;);\n  if(!raw.length) throw new Error(&quot;Empty image result&quot;);\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?&quot;png&quot;:raw[0]===255&amp;&amp;raw[1]===216?&quot;jpg&quot;:raw.toString(&quot;ascii&quot;,0,4)===&quot;RIFF&quot;&amp;&amp;raw.toString(&quot;ascii&quot;,8,12)===&quot;WEBP&quot;?&quot;webp&quot;:raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;svg&quot;)||raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;?xml&quot;)?&quot;svg&quot;:&quot;bin&quot;;\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(&quot;Every returned image saved; sdk-result.json retains complete metadata&quot;);\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Receber e guardar os resultados</h3><h4>Ailoot Ultra · Imagens</h4><p class=\"note-s\">Descarregue cada imagem devolvida ou guarde o respetivo conteúdo Base64</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Guardar todos os resultados concluídos</h5><p class=\"note-s\">Guarde cada imagem concluída; obtenha cada URL devolvido ou descodifique o respetivo conteúdo Base64.</p><p class=\"note-s\">Conserve todos os elementos de dados e a utilização completa; assegure a propriedade e guarde todas as imagens efetivamente devolvidas. Sem URLs ou IDs inventados.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Se for necessário verificar a resposta original</h5><p class=\"note-s\">Se o resultado de uma geração ou edição de imagem requerer verificação, guarde o operation_id/X-Client-Request-ID original e as informações do resultado devolvidas. Recupere os resultados existentes que lhe pertencem através da biblioteca de multimédia, usando valores task_id ou asset_id reais. Não volte a enviar o pedido de geração/edição nem construa um URL de consulta periódica a partir de operation_id.</p></div><details class=\"card-about\" data-output-fields><summary>Campos da resposta</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Campo</th><th>Tipo</th></tr></thead><tbody><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>integer</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>string</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>base64 string</td></tr><tr><th data-cell-label=\"Campo\" scope=\"row\"><span class=\"card-cell-label\">Campo</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Tipo\" data-field-type><span class=\"card-cell-label\">Tipo</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Erros e passos seguintes</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Resposta</th><th>Condição</th><th>Passo seguinte</th></tr></thead><tbody><tr><th data-cell-label=\"Resposta\" scope=\"row\"><span class=\"card-cell-label\">Resposta</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Condição\"><span class=\"card-cell-label\">Condição</span>Campos obrigatórios, representação do material ou valor do parâmetro inválidos</td><td data-cell-label=\"Passo seguinte\"><span class=\"card-cell-label\">Passo seguinte</span>Corrija os campos indicados antes de um novo pedido de criação.</td></tr><tr><th data-cell-label=\"Resposta\" scope=\"row\"><span class=\"card-cell-label\">Resposta</span><code>server_error</code></th><td data-cell-label=\"Condição\"><span class=\"card-cell-label\">Condição</span>A resposta devolvida indica que a operação ou o resultado requer verificação</td><td data-cell-label=\"Passo seguinte\"><span class=\"card-cell-label\">Passo seguinte</span>Guarde o ID original da operação/tarefa devolvido, os cabeçalhos do pedido e a resposta; continue a consultar essa operação original através das consultas suportadas. Não volte a enviar o pedido de criação.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliases</h3><h4>Aliases do modelo</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=recraft%2Frecraft-v4&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4&amp;fmt=images\"><code>recraft/recraft-v4</code></a></span></p><h4>Aliases dos caminhos dos métodos</h4><p class=\"note-s\"><code>/v1/images</code></p><h4>IDs de chamada relacionados</h4><p class=\"note-s\"><a href=\"#m=recraft%2Frecraft-v4&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4&amp;fmt=images\"><code>recraft/recraft-v4</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "recraft/recraft-v4",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|images|/v1/images/generations|recraft%2Frecraft-v4",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "As tarifas apresentadas permitem estimar o custo antes da geração. O montante final cobrado é calculado a partir do custo registado para a geração original. A duração medida do resultado e as quantidades previstas não correspondem à quantidade final faturável.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain every data item and complete usage; own and save all actual returned images. No invented URLs or IDs.",
            "errors": [
              {
                "code": null,
                "condition": "Campos obrigatórios, representação do material ou valor do parâmetro inválidos",
                "http_status": 400,
                "recovery": "Corrija os campos indicados antes de um novo pedido de criação.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "A resposta devolvida indica que a operação ou o resultado requer verificação",
                "http_status": null,
                "recovery": "Guarde o ID original da operação/tarefa devolvido, os cabeçalhos do pedido e a resposta; continue a consultar essa operação original através das consultas suportadas. Não volte a enviar o pedido de criação.",
                "type": "server_error"
              }
            ],
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Se o resultado de uma geração ou edição de imagem requerer verificação, guarde o operation_id/X-Client-Request-ID original e as informações do resultado devolvidas. Recupere os resultados existentes que lhe pertencem através da biblioteca de multimédia, usando valores task_id ou asset_id reais. Não volte a enviar o pedido de geração/edição nem construa um URL de consulta periódica a partir de operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              },
              {
                "content_type": "application/json",
                "maximum_references": 1,
                "mode": "reference_guided_image",
                "required": [
                  "prompt",
                  "actual image reference"
                ]
              }
            ],
            "outputs": {
              "all_results": "Conserve todos os elementos de dados e a utilização completa; assegure a propriedade e guarde todas as imagens efetivamente devolvidas. Sem URLs ou IDs inventados.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "enum": [
                  "recraft/recraft-v4"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "maximum": 6,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "enum": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "items": {
                  "image_url": {
                    "url": "actual HTTP(S) image URL or base64 data URI"
                  },
                  "type": "image_url"
                },
                "maximum_items": 1,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "4:3",
                    "3:4",
                    "16:9",
                    "9:16",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "body": {
                "model": "recraft/recraft-v4",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json",
              "parameter_source": "parameters + request_schema; no fabricated reference URL"
            }
          },
          "hints": [
            "O exemplo apenas com instrução conserva a estrutura oficial ImageGenerationRequest.",
            "Conserve todas as imagens devolvidas e a resposta completa; a quantidade final de saídas é a real, e não o n solicitado."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "n": {
              "maximum": 6,
              "minimum": 1
            },
            "optional_controls": [
              "n",
              "aspect_ratio",
              "input_references"
            ],
            "provider_specific_options": "Apenas style/controls/text_layout da lista exata guardada de valores permitidos do endpoint; sem estruturas adivinhadas.",
            "reference_images": {
              "maximum": 1,
              "minimum": 0,
              "source": "material real fornecido pelo cliente"
            },
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id efetivamente devolvido ou registo na biblioteca de multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "method_aliases": [
            "/v1/images"
          ],
          "operation_modes": [
            "text_to_image",
            "reference_guided_image"
          ],
          "output": {
            "all_results": true,
            "family": "image",
            "format": "actual validated raster MIME",
            "result": "every actual owned URL or b64_json"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "Esta estimativa não é um encargo adicional nem uma tarifa fixa para a geração concluída.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Custo estimado de geração",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'recraft/recraft-v4', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nrequest={'model': 'recraft/recraft-v4', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · exact payload/save all outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"recraft/recraft-v4\", \"prompt\": \"a red panda astronaut floating in space, studio lighting\"};\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?\"png\":raw[0]===255&&raw[1]===216?\"jpg\":raw.toString(\"ascii\",0,4)===\"RIFF\"&&raw.toString(\"ascii\",8,12)===\"WEBP\"?\"webp\":raw.toString(\"utf8\").trimStart().startsWith(\"<svg\")||raw.toString(\"utf8\").trimStart().startsWith(\"<?xml\")?\"svg\":\"bin\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · exact payload/save all outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Prompt-only example preserves the official ImageGenerationRequest structure.",
          "Keep every returned image and the full response; output quantity is actual, not requested n."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Картинки",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.08",
            "amount_unit": "usd_per_output_image",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "output image",
            "native_amount_usd_per_unit": "0.08",
            "native_quantity": 1,
            "public_unit_label": "per image output",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "image_output"
          },
          {
            "amount": "0.08",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.08",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "recraft/recraft-v4",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "8ae46b52d83205eee8e1f07ea43e6c36a1b4ab6caa08c7b3c9372bbcefdb5bac",
    "input_html_sha256": "c556c9c3c32c73522c2ebaf7f7d95bde665f04eb769135d74ded5881dc608836",
    "private_audit_sha256": "a6ad265a7bc264ad10a8e227655c149b99b2689984f673ae2ea5c82867e4a28a",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/pt-pt/recraft-recraft-v4/",
    "description": "O Recraft V4 gera imagens raster 1K com foco na composição, nas relações de cor e na direção criativa detalhada. Abrange ilustração, cenas fotorrealistas e conceitos de design gráfico, com entradas de estilo opcionais e um fluxo separado de imagem para imagem.",
    "locale": "pt-pt",
    "md_url": "https://ailoot.ai/models/pt-pt/recraft-recraft-v4/index.md",
    "title": "Recraft: Recraft V4 — Ailoot",
    "url": "https://ailoot.ai/models/pt-pt/recraft-recraft-v4/"
  },
  "rawModel": {
    "about": "O Recraft V4 é o modelo raster padrão da geração V4 da Recraft. O fabricante destaca o critério de design: composição equilibrada, relações de cor coerentes e pormenores que apoiam a intenção visual. Pode trabalhar com ilustração estilizada, cenas fotográficas e conceitos de design gráfico. Utilize-o quando o briefing pede uma imagem que combine escolhas estéticas com fidelidade à instrução, tanto para explorar um ambiente a partir de uma orientação curta como para especificar detalhadamente uma composição intencional.\n\nO código exato do modelo é recraftv4. A referência do fabricante indica saída raster 1K em WebP sem perdas ou PNG. Uma imagem quadrada tem 1024 × 1024 píxeis, 16:9 corresponde a 1344 × 768 e 2:3 a 832 × 1280; outras proporções suportadas utilizam as respetivas dimensões. O V4 Pro é a edição raster 2K separada, enquanto o V4 Vector e o Pro Vector devolvem SVG editável. Selecione a variante V4 exata para a entrega pretendida, em vez de combinar estas diferentes propriedades de saída.\n\nO guia do fabricante distingue instruções breves e interpretativas de uma direção criativa estruturada. Uma frase curta pode deixar espaço para explorar a forma, o ambiente e o enquadramento. Um briefing estruturado pode identificar o tema, o cenário, a pose, o material, os elementos secundários, a iluminação e a hierarquia visual. Para uma ilustração narrativa, descreva um ciclista a atravessar uma pequena ponte, formas simplificadas marcantes, cores quentes e suaves e um movimento claro da esquerda para a direita. Estas decisões de conteúdo e composição são mais concretas do que uma longa lista de adjetivos de estilo sem relação entre si.\n\nA variedade do V4 inclui ilustração, imagens com volume e imagens fotorrealistas. O guia recomenda descrever a lógica do desenho para a ilustração e os materiais, a luz, a câmara e a profundidade para uma imagem de aparência 3D. Esta continua a ser uma imagem raster, e não uma malha editável. Para um conceito de cartaz ou embalagem, indique quais as palavras principais, onde ficam e como a imagem e a tipografia interagem. O fabricante destaca texto curto e de extensão média legível; examine o texto e a disposição reais na imagem devolvida antes de a utilizar.\n\nA geração suporta instruções com até 10 000 caracteres, uma semente aleatória, uma a seis imagens de saída, cores preferidas e uma cor de fundo desejada. Estilos personalizados compatíveis e imagens de referência opcionais podem orientar o tratamento visual através de correspondência flexível ou precisa. Escolha uma referência limpa ou um conjunto pertencente ao mesmo universo visual e deixe que a instrução descreva o novo tema e a cena. A correspondência das cores entre referência e resultado não é garantida, por isso mantenha explícita a paleta exigida e compare o resultado com ela. Para geração com estilo de referência, utilize uma a dez imagens PNG, JPG ou WebP, até 64 MB no total e menos de 20 MB por imagem. Cada referência deve ter um lado mais curto de pelo menos 256 píxeis, um lado mais longo de no máximo 4096 píxeis e uma resolução de no máximo 16 megapíxeis. Utilize estas referências ou um estilo guardado compatível, em vez de ambos.\n\nA operação documentada de imagem para imagem combina uma imagem existente e uma instrução, com intensidade entre 0 e 1 a determinar quanto a nova saída se afasta da origem. Não aceita controlos de estilo V4 nessa operação. A referência atual de geração também exclui nomes de estilos predefinidos, negative_prompt, text_layout, artistic_level e no_text. Prepare uma descrição positiva do resultado desejado e avalie a peça na composição de destino. O V4 padrão oferece uma interpretação raster de design focada, com edição, formato e tamanho de saída específicos. Para imagem para imagem, forneça PNG, JPG, WebP ou SVG com menos de 20 MB, no máximo 16 megapíxeis e ambos os lados entre 256 e 4096 píxeis.",
    "alias_of": null,
    "aliases": [],
    "author": "Recraft",
    "available": null,
    "canonical_model": "recraft/recraft-v4",
    "capabilities": {
      "context_length": 65536,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "image"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.08",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.08",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Todas as tarifas da configuração constam dos detalhes."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "1ebd62ad63574ce77fb794fa",
        "label": "Configurações de preços de imagens",
        "profiles": [
          {
            "basis": "As entradas equivalentes descrevem a mesma cobrança; não acrescentam uma segunda taxa.",
            "dimensions": {
              "conditions": "Não está declarada qualquer variante de preços."
            },
            "label": "Imagem de saída",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_image",
                "billing_input": false,
                "key": "output_image",
                "label": "Output image",
                "public_unit_label": "per image",
                "quantity": 1,
                "rate_role": "typed_image_reference",
                "side": "out",
                "unit": "image"
              }
            ]
          }
        ]
      }
    ],
    "entity_type": "model",
    "formats": [
      "images"
    ],
    "id": "recraft/recraft-v4",
    "input": [
      "text",
      "image"
    ],
    "kind": "image",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "As tarifas apresentadas permitem estimar o custo antes da geração. O montante final cobrado é calculado a partir do custo registado para a geração original. A duração medida do resultado e as quantidades previstas não correspondem à quantidade final faturável.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain every data item and complete usage; own and save all actual returned images. No invented URLs or IDs.",
            "errors": [
              {
                "code": null,
                "condition": "Campos obrigatórios, representação do material ou valor do parâmetro inválidos",
                "http_status": 400,
                "recovery": "Corrija os campos indicados antes de um novo pedido de criação.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "A resposta devolvida indica que a operação ou o resultado requer verificação",
                "http_status": null,
                "recovery": "Guarde o ID original da operação/tarefa devolvido, os cabeçalhos do pedido e a resposta; continue a consultar essa operação original através das consultas suportadas. Não volte a enviar o pedido de criação.",
                "type": "server_error"
              }
            ],
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Se o resultado de uma geração ou edição de imagem requerer verificação, guarde o operation_id/X-Client-Request-ID original e as informações do resultado devolvidas. Recupere os resultados existentes que lhe pertencem através da biblioteca de multimédia, usando valores task_id ou asset_id reais. Não volte a enviar o pedido de geração/edição nem construa um URL de consulta periódica a partir de operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              },
              {
                "content_type": "application/json",
                "maximum_references": 1,
                "mode": "reference_guided_image",
                "required": [
                  "prompt",
                  "actual image reference"
                ]
              }
            ],
            "outputs": {
              "all_results": "Conserve todos os elementos de dados e a utilização completa; assegure a propriedade e guarde todas as imagens efetivamente devolvidas. Sem URLs ou IDs inventados.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "enum": [
                  "recraft/recraft-v4"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "maximum": 6,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "enum": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "items": {
                  "image_url": {
                    "url": "actual HTTP(S) image URL or base64 data URI"
                  },
                  "type": "image_url"
                },
                "maximum_items": 1,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "4:3",
                    "3:4",
                    "16:9",
                    "9:16",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 1,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "body": {
                "model": "recraft/recraft-v4",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json",
              "parameter_source": "parameters + request_schema; no fabricated reference URL"
            }
          },
          "hints": [
            "O exemplo apenas com instrução conserva a estrutura oficial ImageGenerationRequest.",
            "Conserve todas as imagens devolvidas e a resposta completa; a quantidade final de saídas é a real, e não o n solicitado."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "n": {
              "maximum": 6,
              "minimum": 1
            },
            "optional_controls": [
              "n",
              "aspect_ratio",
              "input_references"
            ],
            "provider_specific_options": "Apenas style/controls/text_layout da lista exata guardada de valores permitidos do endpoint; sem estruturas adivinhadas.",
            "reference_images": {
              "maximum": 1,
              "minimum": 0,
              "source": "material real fornecido pelo cliente"
            },
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "task_id efetivamente devolvido ou registo na biblioteca de multimédia",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "method_aliases": [
            "/v1/images"
          ],
          "operation_modes": [
            "text_to_image",
            "reference_guided_image"
          ],
          "output": {
            "all_results": true,
            "family": "image",
            "format": "actual validated raster MIME",
            "result": "every actual owned URL or b64_json"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "Esta estimativa não é um encargo adicional nem uma tarifa fixa para a geração concluída.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Custo estimado de geração",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'recraft/recraft-v4', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nrequest={'model': 'recraft/recraft-v4', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · exact payload/save all outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"recraft/recraft-v4\", \"prompt\": \"a red panda astronaut floating in space, studio lighting\"};\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?\"png\":raw[0]===255&&raw[1]===216?\"jpg\":raw.toString(\"ascii\",0,4)===\"RIFF\"&&raw.toString(\"ascii\",8,12)===\"WEBP\"?\"webp\":raw.toString(\"utf8\").trimStart().startsWith(\"<svg\")||raw.toString(\"utf8\").trimStart().startsWith(\"<?xml\")?\"svg\":\"bin\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · exact payload/save all outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Prompt-only example preserves the official ImageGenerationRequest structure.",
          "Keep every returned image and the full response; output quantity is actual, not requested n."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Картинки",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.08",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.08",
            "amount_unit": "usd_per_output_image",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "output image",
            "native_amount_usd_per_unit": "0.08",
            "native_quantity": 1,
            "public_unit_label": "per image output",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "image_output"
          },
          {
            "amount": "0.08",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.08",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "recraft/recraft-v4",
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra"
      }
    ],
    "name": "Recraft: Recraft V4",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.08,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.08,
      "varies": false
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "output_family": "raster",
          "per_actual_generated_image": true,
          "quality": "standard",
          "units_per_usd": 1000
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.08",
            "amount_unit": "usd_per_output_image",
            "conditions": {
              "output_family": "raster",
              "per_actual_generated_image": true,
              "quality": "standard",
              "units_per_usd": 1000
            },
            "key": "base",
            "label": "base",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "output_image"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "adds_to_per_image_base": true,
          "applies_only_where_exact_maker_method_accepts_style_references": true,
          "once_per_request_not_per_output": true,
          "only_when_generating_with_style_reference_creates_style": true
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.010",
            "amount_unit": "usd_per_request",
            "conditions": {
              "adds_to_per_image_base": true,
              "applies_only_where_exact_maker_method_accepts_style_references": true,
              "once_per_request_not_per_output": true,
              "only_when_generating_with_style_reference_creates_style": true
            },
            "key": "style_creation_surcharge",
            "label": "style creation surcharge",
            "profile_index": 1,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "request"
          }
        ]
      }
    ],
    "public_id": "recraft/recraft-v4",
    "short": "O Recraft V4 gera imagens raster 1K com foco na composição, nas relações de cor e na direção criativa detalhada. Abrange ilustração, cenas fotorrealistas e conceitos de design gráfico, com entradas de estilo opcionais e um fluxo separado de imagem para imagem."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "O Recraft V4 gera imagens raster 1K com foco na composição, nas relações de cor e na direção criativa detalhada. Abrange ilustração, cenas fotorrealistas e conceitos de design gráfico, com entradas de estilo opcionais e um fluxo separado de imagem para imagem.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "8a0ee64791e3f9d513834ab6088b470cbfa1dc052b8ca406da3bcf3a009d977c",
    "renderer_sha256": "8caea4544177cc2b7d2cb3356b5f07bfd3660386d75f2714a6f603fa5e2a6cd2"
  },
  "sourceRevision": "3adca5540e0dadea769cccf87232783305fb9372378f0049477bbef2bb29a061"
}
