Source: https://ailoot.ai/models/pt-pt/gemini-3-8-flash/
Canonical: https://ailoot.ai/models/pt-pt/gemini-3-8-flash/
Language: pt-pt

# Google: Gemini 3.8 Flash

[Markdown](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/index.md) · [JSON](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/facts.json)

## [Google: Gemini 3.8 Flash](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/)

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

- [**Ailoot · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-0)
- [**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent` `gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-1)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-2)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-3)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-4)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-5)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-6)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/gemini-3-8-flash/#method-7)

Sobre o modelo

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.

Gemini 3.8 Flash é o modelo da Google com saída textual para engenharia de software continuada, agentes de várias etapas e fluxos complexos de trabalho com conhecimento. Baseia-se no Gemini 3.7 Flash, com melhorias na engenharia de software e no trabalho de conhecimento com agentes. Aceita texto, imagens, áudio, vídeo e PDF, pelo que uma tarefa pode combinar um objetivo escrito com o material efetivamente necessário para o resolver. O resultado útil é uma alteração de código, uma análise explicada, uma resposta escrita ou um registo estruturado.

Para uma tarefa de programação, forneça o requisito, os ficheiros relevantes, o comportamento observado e as restrições a preservar. Uma captura de ecrã pode estabelecer a interface pretendida, enquanto os registos ou um exemplo que reproduza o problema mostram a falha. Para depuração, peça ao modelo que investigue uma discrepância entre o estado visível de um formulário e o seu valor guardado, identifique o percurso de código responsável e proponha uma correção focada. Mantenha claro o artefacto final pretendido, para que uma sequência mais longa de investigação e utilização de ferramentas continue a ter uma condição de conclusão específica.

Para trabalho mais prolongado, utilize passos de raciocínio menores, chamadas iterativas de ferramentas e verificações dos resultados intermédios. Os níveis de pensamento low, medium e high controlam a quantidade de raciocínio; medium é a predefinição documentada. Low adequa-se a um rascunho rápido ou a uma análise delimitada, enquanto high se destina a matemática difícil, programação ou tarefas de várias etapas. O Gemini 3.8 Flash não suporta o nível de pensamento minimal. Uma tarefa de depuração continuada e uma extração simples de campos exigem, por isso, escolhas de raciocínio diferentes, em vez da mesma definição para todos os pedidos.

As ferramentas documentadas incluem chamadas de funções, execução de código, pesquisa em ficheiros, fundamentação por pesquisa, fundamentação com Google Maps e contexto de URL, sendo Computer Use apresentado como capacidade em pré-visualização. As saídas estruturadas definem um resultado legível por máquina. As funções devem ter uma finalidade clara e uma definição dos parâmetros: o modelo pode pedir uma função, enquanto a aplicação ligada executa a operação e devolve o resultado. Preserve as identidades das funções e o material efetivamente devolvido entre turnos. Uma resposta final útil explica que provas sustentam a correção proposta ou o valor extraído.

O guia de migração para 3.8 utiliza controlos de nível de pensamento em vez da configuração antiga de orçamento de raciocínio e aconselha remover parâmetros de amostragem obsoletos e turnos de modelo pré-preenchidos. Exige também preservar as assinaturas de pensamento no fluxo de trabalho sem estado relevante e fazer corresponder as respostas de funções às respetivas chamadas por identidade e nome. Estes pormenores importam ao continuar uma tarefa de várias etapas: o turno seguinte precisa do contexto anterior real, e não de um relato reescrito que perca o resultado da ferramenta ou a assinatura. Mantenha explícitos a pergunta e o resultado pedido no novo turno do utilizador.

Para trabalho de conhecimento multimodal, identifique as páginas de documento, o gráfico, o intervalo de áudio ou o acontecimento no vídeo relevantes e indique como devem contribuir para a resposta. Uma comparação documental pode pedir uma tabela de diferenças com passagens das fontes; uma pergunta sobre um gráfico pode pedir os valores visíveis e a conclusão que sustentam. Uma análise de vídeo pode pedir uma descrição dos acontecimentos que justificam uma conclusão. O modelo devolve texto a partir destas entradas. Imagens geradas, voz e interação áudio Live pertencem a perfis de modelos distintos.

Os seus limites da Gemini API são 1 048 576 tokens de entrada e 65 536 tokens de saída, correspondendo ao contexto de até 1M e à saída textual de 64K do modelo nativo. As instruções, o histórico de conversação e os suportes multimédia fornecidos consomem o contexto de entrada, e o raciocínio ou um artefacto final longo têm de caber no limite de saída documentado. A Google apresenta também cache, processamento em lote, Flex e processamento Priority para este perfil do produtor. Para itens independentes, mantenha um identificador de item estável e um formato de saída explícito, para que cada resultado continue ligado à sua fonte.

As limitações possíveis incluem alucinações, episódios ocasionais de lentidão ou de falha por exceder o tempo limite e maior utilização de tokens com esforço mais elevado. A sua data-limite de conhecimento é março de 2026, mantendo-se alguns domínios limitados a janeiro de 2025. Forneça provas atuais ou utilize as ferramentas de fundamentação documentadas quando a tarefa depender de informação posterior. Reveja as citações de fontes, os cálculos e o código proposto face às entradas e aos resultados de execução reais. O artefacto final útil deve distinguir uma conclusão sustentada de uma questão por resolver, sem pressupor que uma resposta fluente estabelece o resultado pedido.

Tarefa prática

### Tarefa prática

Exemplo técnico em inglês

```
Diagnose an unsaved form value

Review this form flow: the input displays draft.name; typing updates draft.name; Save sends original.name; after reload the old name reappears. Explain the mismatch and propose a minimal correction in framework-neutral pseudocode. Include a regression scenario that types a new name, saves, reloads, and checks the stored value. Do not claim any browser action occurred.
```

#### Resultado esperado

```
A cause explanation, corrected Save pseudocode and an end-to-end regression scenario.
```

#### Verificar o resultado

```
The submitted value comes from the edited draft, and the reload check verifies persistence rather than just the visible input.
```

**Ailoot · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)

Google /`gemini-3.8-flash`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto · Imagens

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Anthropic Messages** `POST /v1/messages`

Entrada

`text`, `image`

Saída

`text`

Contexto

1 048 576 tokens

Saída máxima

65 536 tokens

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites gemini-3.8-flash | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_block[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`system` | Tipo`string\|content_block[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites Mínimo: 1 O limite aplica-se a: Limite exato do modelo ou da ficha selecionados | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`stop_sequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools` | Tipo`tool[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools[].name` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Ferramenta fornecida | Predefinição— |
| Campo`tools[].description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].input_schema` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`thinking.type` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`thinking.budget_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`output_config.effort` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`metadata` | Tipo`object` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`cache_control` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content ou bloco type=text`

**Texto + imagem**

`{type:image,source:{type:base64,media_type,data}} ou origem type=url`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext, image |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,00075 US$ */ 1K*

Saída

0,00375 US$ */ 1K*

Leitura da cache

0,000075 US$ */ 1K*

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

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.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Anthropic Messages

Exemplo de textoEntrada, imagemPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.8-flash", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.8-flash", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="gemini-3.8-flash",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "gemini-3.8-flash",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='gemini-3.8-flash',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot · Anthropic Messages

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini)

Google /`gemini-3.8-flash`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto · Imagens

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent`

Entrada

`text`, `image`

Saída

`text`

Formato de saída

json ou streaming suportado

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`path.model` | Tipo`string` | RequisitoObrigatório | Valores e limites gemini-3.8-flash | Predefinição— |
| Campo`contents` | Tipo`content[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`contents[].role` | Tipo`string` | RequisitoOpcional | Valores e limites user, model | Predefinição— |
| Campo`contents[].parts` | Tipo`part[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`systemInstruction` | Tipo`content` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`generationConfig.maxOutputTokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Model-specific | Predefinição— |
| Campo`generationConfig.temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`generationConfig.topP` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`generationConfig.topK` | Tipo`integer` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`generationConfig.stopSequences` | Tipo`string[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`generationConfig.thinkingConfig.includeThoughts` | Tipo`boolean` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`generationConfig.thinkingConfig.thinkingBudget` | Tipo`integer` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools[].functionDeclarations` | Tipo`function_declaration[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`toolConfig.functionCallingConfig.mode` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`safetySettings` | Tipo`object[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`sessionId` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`contents[].parts[].text`

**Texto + imagem**

`parts[].inlineData={mimeType,data}`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`material_types` | Contratotext, image |
| Parâmetro`required` | Contratocontents |
| Parâmetro`optional_controls` | Contratonull |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`text_file_material` | ContratoConteúdo UTF-8 real inserido como texto; ID de ficheiros/URLs precisam de suporte separado e exato |

Ciclo de vida: `exact retained published method`

As estruturas dos métodos e os ID são exatos; a capacidade do fornecedor é distinta da admissão dos pedidos.

### Tarifários

#### Tarifas dos métodos Ailoot

Entrada

0,00075 US$ */ 1K*

Saída

0,00375 US$ */ 1K*

Leitura da cache

0,000075 US$ */ 1K*

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

#### Detalhes da tarifa de referência

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.

Tabelas de referência do modelo

#### Preços por configuração

Associe cada custo às condições apresentadas. Use uma única tarifa para cada conjunto de configurações alternativas.

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoOpenAI Chat · Tarifas de base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |
| ConfiguraçãoAnthropic Messages · Tarifas de base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

### Exemplos de pedidos

#### Ailoot · Gemini generateContent

Exemplo de textoEntrada, imagemPython SDKNode.js SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["contents"]=[{"role":"user","parts":[{"text":"Summarize this material and quote supporting source passages.\n\n"+text}]}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": [{"role": "user", "parts": [{"text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["contents"][0]["parts"].append({"inlineData":{"mimeType":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from google import genai
from google.genai import types
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = genai.Client(
    api_key=os.environ["AILOOT_API_KEY"],
    http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),
)
resp = client.models.generate_content(model="gemini-3.8-flash", contents="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_json_dict())
```

```js
import { GoogleGenAI } from "@google/genai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const ai = new GoogleGenAI({ apiKey: process.env.AILOOT_API_KEY, httpOptions: { baseUrl: "https://api.ailoot.ai" } });
const resp = await ai.models.generateContent({ model: "gemini-3.8-flash", contents: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from google import genai
from google.genai import types
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=genai.Client(api_key=os.environ["AILOOT_API_KEY"],http_options=types.HttpOptions(base_url="https://api.ailoot.ai"))
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

count=0
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
    for chunk in client.models.generate_content_stream(model='gemini-3.8-flash',contents="Explain observations and hypotheses in three sentences."):
        payload=chunk.to_json_dict()
        log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
        save_result(payload,"stream-chunk-"+str(count))
        count+=1
```

### Receber e guardar os resultados

#### Ailoot · Gemini generateContent

json ou streaming suportado

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os candidatos e partes, incluindo chamadas de funções, assinaturas de raciocínio e dados de utilização; junte os fragmentos do fluxo pela ordem.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`responseId` | Tipostring |
| Campo`modelVersion` | Tipostring |
| Campo`candidates[].content.parts[]` | Tipotext\|inlineData\|functionCall\|other part |
| Campo`candidates[].finishReason` | Tipostring |
| Campo`usageMetadata` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

Google /`gemini-3.8-flash`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites gemini-3.8-flash | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Model-specific | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Conversação textual | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | ContratoLista de mensagens com estrutura role/content |
| Parâmetro`file_material` | ContratoDocumento UTF-8 real inserido como texto literal; nenhum ID de ficheiro inferido |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`control_scope` | ContratoConversação textual; stream é um booleano e tem false como predefinição. |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Aliases do método: `/chat/completions`

Ciclo de vida: `synchronous_or_streamed`

Envie o ID exato do modelo com messages.

O comprimento do contexto não é um limite de saída.

Um ficheiro de texto pode fornecer texto literal; as entradas de imagem/áudio/objeto de ficheiro exigem uma associação exata.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model":"gemini-3.8-flash","messages":[{"role":"user","content":"hello"}],"stream":false}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model="gemini-3.8-flash", messages=[{"role":"user","content":"hello"}], stream=False)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

Google /`gemini-3.8-flash`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites gemini-3.8-flash | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF-8

`Cadeia de caracteres messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoLeia o documento UTF-8 real e coloque o texto na entrada indicada ou na cadeia de conteúdo da mensagem. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "gemini-3.8-flash",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3.8-flash`

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat)

Google /`google/gemini-3.8-flash`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites google/gemini-3.8-flash | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: Estes papéis são representados explicitamente pelos tipos de compatibilidade do código-fonte; o conjunto exato de papéis continua específico do modelo. Model-specific | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use o ID realmente devolvido | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Reintroduza o raciocínio realmente devolvido quando este modelo o utiliza | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Model-specific | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Model-specific | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites function Model-specific | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: Função fornecida como ferramenta | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`modalities` | Tipo`string[]` | RequisitoOpcional | Valores e limites text | Predefinição— |
| Campo`provider` | Tipo`object` | RequisitoOpcional | Valores e limites Condições: provider.options é rejeitado nesta rota textual Ultra | Predefinição— |
| Campo`cache_control.ttl` | Tipo`string` | RequisitoOpcional | Valores e limites Condições: 1h é rejeitado nos locais efetivos da cache de prompts | Predefinição— |

Combinações de materiais de entrada

**Texto** · Texto UTF8

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | ContratoLista de mensagens com estrutura role/content |
| Parâmetro`file_material` | ContratoDocumento UTF-8 real inserido como texto literal; nenhum ID de ficheiro inferido |
| Parâmetro`optional_controls` | Contratostream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parâmetro`control_scope` | ContratoEspecífico do modelo; as ferramentas de funções do utilizador diferem das ferramentas alojadas |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Ciclo de vida: `synchronous_or_streamed`

Envie o ID exato do modelo com messages.

O comprimento do contexto não é um limite de saída.

Um ficheiro de texto pode fornecer texto literal; as entradas de imagem/áudio/objeto de ficheiro exigem uma associação exata.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "google/gemini-3.8-flash", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='google/gemini-3.8-flash',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='google/gemini-3.8-flash',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve cada opção com o conteúdo, as chamadas de ferramentas e o raciocínio. Em SSE, junte os deltas por índice de opção e ferramenta e mantenha o motivo final de conclusão e os dados de utilização.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3.8-flash`

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages)

Google /`google/gemini-3.8-flash`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON ou SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites google/gemini-3.8-flash | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · Texto UTF-8

`Cadeia de caracteres messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoLeia o documento UTF-8 real e coloque o texto na entrada indicada ou na cadeia de conteúdo da mensagem. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base dos tokens | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "google/gemini-3.8-flash",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON ou SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Conserve todos os blocos de conteúdo, as assinaturas de raciocínio e os ID reais de utilização de ferramentas. Junte todos os deltas de blocos SSE; o primeiro bloco de texto não é a saída completa.

##### Se for necessário verificar a resposta original

Conserve os ID e cabeçalhos de pedido/resposta. Não é fornecido um URL genérico para obter uma tarefa textual.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoCampos obrigatórios, representação do material ou valor do parâmetro inválidos | Passo seguinteCorrija os campos indicados antes de um novo pedido de criação. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~google/gemini-flash-latest`

[`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

Google /`~google/gemini-flash-latest`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

Texto

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Entrada

`text`

Saída

`text`

Formato de saída

json or SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites ~google/gemini-flash-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites Número mínimo de elementos: 1 | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites Exemplos: system, user, assistant, tool, function Condições: These roles are explicitly represented by Source compatibility types; the exact model role set remains model-specific. Model-specific | Predefinição— |
| Campo`messages[].content` | Tipo`string\|content_part[]\|null` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_calls` | Tipo`tool_call[]` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].tool_call_id` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: role=tool; use actual returned ID | Predefinição— |
| Campo`messages[].name` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`messages[].reasoning_content` | Tipo`string` | RequisitoOpcional | Valores e limites Aplica-se quando: Round-trip actual returned reasoning where this model uses it | Predefinição— |
| Campo`messages[].reasoning_details` | Tipo`object\|array` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Model-specific | Predefinição— |
| Campo`max_completion_tokens` | Tipo`integer` | RequisitoOpcional | Valores e limites Mínimo: 1 Model-specific | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |
| Campo`stream_options.include_usage` | Tipo`boolean` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`temperature` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`top_p` | Tipo`number` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`stop` | Tipo`string\|string[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools` | Tipo`function_tool[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`tools[].type` | Tipo`string` | RequisitoOpcional | Valores e limites function Model-specific | Predefinição— |
| Campo`tools[].function.name` | Tipo`string` | RequisitoObrigatório | Valores e limites Aplica-se quando: function tool supplied | Predefinição— |
| Campo`tools[].function.description` | Tipo`string` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tools[].function.parameters` | Tipo`JSON_schema` | RequisitoOpcional | Valores e limites | Predefinição— |
| Campo`tool_choice` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`parallel_tool_calls` | Tipo`boolean` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`response_format` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`reasoning_effort` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`reasoning` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`service_tier` | Tipo`string` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`instructions` | Tipo`string` | RequisitoOpcional | Valores e limites Campo de compatibilidade | Predefinição— |
| Campo`functions` | Tipo`function[]` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`function_call` | Tipo`string\|object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`prompt_cache_options` | Tipo`object` | RequisitoOpcional | Valores e limites Model-specific | Predefinição— |
| Campo`modalities` | Tipo`string[]` | RequisitoOpcional | Valores e limites text | Predefinição— |
| Campo`provider` | Tipo`object` | RequisitoOpcional | Valores e limites Condições: provider.options is rejected on this Ultra text route | Predefinição— |
| Campo`cache_control.ttl` | Tipo`string` | RequisitoOpcional | Valores e limites Condições: 1h is rejected in actual prompt-cache locations | Predefinição— |

Combinações de materiais de entrada

**Texto** · UTF8 text

`messages[].content`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`messages` | Contratomessage array with role/content shape |
| Parâmetro`file_material` | Contratoactual UTF-8 document inserted as literal text; no file ID inferred |
| Parâmetro`optional_controls` | Contratostream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parâmetro`control_scope` | Contratomodel-specific; user function tools differ from hosted tools |
| Parâmetro`output_modalities` | Contratotext |
| Parâmetro`hosted_operations` | Contratofalse |
| Parâmetro`multimodal_input_binding` | Contratonull |

Ciclo de vida: `synchronous_or_streamed`

Send exact model ID with messages.

Context length is not an output cap.

A text file may supply literal text; image/audio/file-object inputs need exact binding.

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · OpenAI Chat

curlPython SDKStreaming em Python

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "~google/gemini-flash-latest", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='~google/gemini-flash-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='~google/gemini-flash-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Receber e guardar os resultados

#### Ailoot Ultra · OpenAI Chat

json or SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Keep every choice and its content/tool calls/reasoning. In SSE assemble deltas by choice/tool index, retain the final finish reason and usage.

##### Se for necessário verificar a resposta original

Keep request/response IDs and headers. No generic text job retrieval URL is supplied.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`choices[].index` | Tipointeger |
| Campo`choices[].message.content` | Tipostring\|null |
| Campo`choices[].message.tool_calls` | Tipotool\_call\[\] |
| Campo`choices[].message.reasoning_content` | Tipostring |
| Campo`choices[].message.reasoning_details` | Tipoobject\|array |
| Campo`choices[].finish_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoInvalid required fields, material representation or parameter value | Passo seguinteCorrect the indicated fields before a new creation request. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~google/gemini-flash-latest`

[`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

Google /`~google/gemini-flash-latest`

ID do modelo

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Introdução

Gemini 3.8 Flash é o modelo multimodal polivalente da Google para engenharia de software continuada, agentes e tarefas complexas de conhecimento. Aceita texto, imagens, áudio, vídeo e PDF, devolve texto e oferece raciocínio baixo, médio ou elevado, com ferramentas e saída estruturada. Os seus limites de entrada/saída documentados são 1 048 576/65 536 tokens.

Entradas aceites

Texto

Resultados

json · sse

### Disponível no Ailoot · entradas e métodos

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Entrada

`text`

Saída

`json`, `sse`

Formato de saída

JSON or SSE

| Campo | Tipo | Requisito | Valores e limites | Predefinição |
| --- | --- | --- | --- | --- |
| Campo`model` | Tipo`string` | RequisitoObrigatório | Valores e limites ~google/gemini-flash-latest | Predefinição— |
| Campo`messages` | Tipo`message[]` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`messages[].role` | Tipo`string` | RequisitoObrigatório | Valores e limites user, assistant | Predefinição— |
| Campo`messages[].content` | Tipo`string` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`max_tokens` | Tipo`integer` | RequisitoObrigatório | Valores e limites | Predefinição— |
| Campo`stream` | Tipo`boolean` | RequisitoOpcional | Valores e limites | Predefiniçãofalse |

Combinações de materiais de entrada

**Texto** · UTF-8 text

`messages[].content string`

Parâmetros e ciclo de vida do método

| Parâmetro | Contrato |
| --- | --- |
| Parâmetro`content_type` | Contratoapplication/json |
| Parâmetro`required` | Contratomodel, messages, max\_tokens |
| Parâmetro`optional_controls` | Contratostream |
| Parâmetro`material_types` | Contratotext |
| Parâmetro`text_file_material` | ContratoRead the actual UTF-8 document and put its text in the indicated input or message content string. |

Ciclo de vida: `synchronous_or_streamed`

### Tarifários

As referências tarifárias não acrescentam opções ao pedido. Os parâmetros suportados constam do método selecionado.

Modo rápido

Não especificado Quando o modo rápido está selecionado

Modo flex

Não especificado Quando o modo flex está selecionado

Esforço máximo de raciocínio

Não especificado Quando o esforço máximo de raciocínio usa o ajuste predefinido (default)

Preços da cache explícita

Não ativado Quando é pedida cache explícita

#### Tarifas Ailoot

#### Preços por configuração

| Configuração | Tabela de tarifas | Custo |
| --- | --- | --- |
| ConfiguraçãoTarifas base por token | Tabela de tarifasTarifa base | Custo Entrada · Tokens de entrada **$0.003** / 1K tokens Saída · Tokens de saída **$0.015** / 1K tokens Entrada · Leitura da cache **$0.0003** / 1K tokens Entrada · Escrita na cache **—** / 1K tokens Entrada · Escrita na cache, 1 hora **—** / 1K tokens |

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. [Como funcionam a reserva e a liquidação →](https://ailoot.ai/docs/pt-pt/billing/reserve/)

### Exemplos de pedidos

#### Ailoot Ultra · Anthropic Messages

Corpo JSON mínimo completocurl · use o seu documento UTF-8Python · guarde o resultado completo

```json
{
  "model": "~google/gemini-flash-latest",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~google/gemini-flash-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~google/gemini-flash-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Receber e guardar os resultados

#### Ailoot Ultra · Anthropic Messages

JSON or SSE

##### Guardar todos os resultados concluídos

Guarde cada resposta, ficheiro e parte de conteúdo devolvidos na íntegra.

Keep all content blocks, thinking signatures and actual tool-use IDs. Assemble all SSE block deltas; a first text block is not the complete output.

##### Se for necessário verificar a resposta original

Keep request/response IDs and headers. No generic text job retrieval URL is supplied.

Campos da resposta

| Campo | Tipo |
| --- | --- |
| Campo`id` | Tipostring |
| Campo`model` | Tipostring |
| Campo`content[]` | Tipotext\|thinking\|tool\_use\|other content block |
| Campo`stop_reason` | Tipostring\|null |
| Campo`usage` | Tipoobject |

Erros e passos seguintes

| Resposta | Condição | Passo seguinte |
| --- | --- | --- |
| Resposta400 · `invalid_request_error` | CondiçãoInvalid required fields, material representation or parameter value | Passo seguinteCorrect the indicated fields before a new creation request. |

### Aliases

#### Aliases do modelo

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliases dos caminhos dos métodos

`/chat/completions`

#### IDs de chamada relacionados

[`google/gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/pt-pt/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

FAQ · Google: Gemini 3.8 Flash

Que entradas e resultados estão disponíveis?

`POST /v1/messages` · `gemini-3.8-flash`: `text`, `image` → `text` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `text`, `image` → `text` `POST /v1/chat/completions` · `gemini-3.8-flash`: `text` → `text` `POST /v1/messages` · `gemini-3.8-flash`: `text` → `json`, `sse` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `text` → `text` `POST /v1/messages` · `google/gemini-3.8-flash`: `text` → `json`, `sse` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `text` → `text` `POST /v1/messages` · `~google/gemini-flash-latest`: `text` → `json`, `sse`

Que campos utiliza o pedido?

`POST /v1/messages` · `gemini-3.8-flash`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `contents`, `systemInstruction`, `sessionId` `POST /v1/chat/completions` · `gemini-3.8-flash`: `model`, `messages`, `stream` `POST /v1/messages` · `gemini-3.8-flash`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `google/gemini-3.8-flash`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `~google/gemini-flash-latest`: `model`, `messages`, `max_tokens`, `stream`

Que limites se aplicam?

`POST /v1/messages` · `gemini-3.8-flash`: `ctx`: `1048576`; `max_out`: `65536`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `contents.min_items`: `1` `POST /v1/chat/completions` · `gemini-3.8-flash`: `messages.min_items`: `1` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `messages.min_items`: `1` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `messages.min_items`: `1`

Ligue o Ailoot ao Claude Code, OpenCode, Hermes ou à sua aplicação.

## A empresa e a sua carteira de projetos

A empresa e a sua carteira de projetos: milhões de clientes; vendas mensais na ordem dos milhares de milhões.

## Compre tokens com desconto.

Desconto por subscrição para trabalho regular. Códigos promocionais — até 50% na compra de tokens.

Subscrição

Escolha um plano com desconto para os pedidos regulares.

Código promocional até 50%

Introduza o código na compra. O preço é recalculado conforme a campanha em vigor.

Custos no histórico

O modelo, os tokens e o montante são guardados para cada pedido.

[Escolher subscrição](https://ailoot.ai/docs/pt-pt/billing/subscriptions/) · [Ver preços dos modelos](https://ailoot.ai/models/pt-pt/)

## Ligue a API ao produto que vende.

SaaS, aplicações e bots — ao abrigo da oferta e do contrato de licença Ailoot. Para revenda, peça uma licença de revendedor.

Aplicação comercial

Integre geração de texto, imagens, vídeo e som nas funcionalidades pagas do seu serviço.

Licença de revendedor

Envie uma descrição do projeto e do modelo de acesso. Peça condições escritas de utilização e revenda.

Documentos no site

A oferta, o contrato de licença e a política de tratamento de dados estão disponíveis antes da ligação.

[Pedir licença de revendedor](mailto:support@ailoot.ai) · [Oferta e contrato de licença](https://ailoot.ai/legal/offer?lang=pt-pt)

## Ailoot · A empresa e a sua carteira de projetos





A Ailoot assenta numa experiência operacional consolidada, numa ampla base de clientes, num serviço estável e no acompanhamento contínuo dos KPI.





A empresa e a sua carteira de projetos: milhões de clientes; vendas mensais na ordem dos milhares de milhões.





A Ailoot aplica essa experiência operacional ao acesso por API a funcionalidades de IA nos produtos dos clientes, agentes, aplicações e automatizações.
