模型与 Comfy Router(2/3)

<ParamField type="number"> The temperature is used for sampling during response generation, which occurs when topP and topK are applied. Temperature controls the degree of randomness in token selection. Lower temperatures are good for prompts that require a less open-ended or creative response, while higher temperatures can lead to more diverse or creative results. A temperature of 0 means that the highest probability tokens are always selected. In this case, responses for a given prompt are mostly deterministic, but a small amount of variation is still possible. If the model returns a response that's too generic, too short, or the model gives a fallback response, try increasing the temperature

Range: 0 to 2

Format: float </ParamField>

<ParamField type="object"> Optional. Configuration for thinking features. Thinking is a process where the model breaks down a complex task into smaller steps to generate a higher-quality response. </ParamField>

<ParamField type="boolean"> Optional. If true, the model will include its thoughts in the response. </ParamField>

<ParamField type="integer"> Optional. The token budget for the model's thinking process. The model will make a best effort to stay within this budget. </ParamField>

<ParamField type="string"> Optional. The thinking level for the model.

Possible values: THINKING_LEVEL_UNSPECIFIED, LOW, MEDIUM, HIGH, MINIMAL </ParamField>

<ParamField type="integer"> Top-K changes how the model selects tokens for output. A top-K of 1 means the next selected token is the most probable among all tokens in the model's vocabulary. A top-K of 3 means that the next token is selected from among the 3 most probable tokens by using temperature.

Range: 1 to … </ParamField>

<ParamField type="number"> If specified, nucleus sampling is used. Top-P changes how the model selects tokens for output. Tokens are selected from the most (see top-K) to least probable until the sum of their probabilities equals the top-P value. For example, if tokens A, B, and C have a probability of 0.3, 0.2, and 0.1 and the top-P value is 0.5, then the model will select either A or B as the next token by using temperature and excludes C as a candidate. Specify a lower value for less random responses and a higher value for more random responses.

Range: 0 to 1

Format: float </ParamField>

<ParamField type="object[]"> Per request settings for blocking unsafe content. Enforced on GenerateContentResponse.candidates. </ParamField>

<ParamField type="string"> Possible values: HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_DANGEROUS_CONTENT </ParamField>

<ParamField type="string"> Possible values: OFF, BLOCK_NONE, BLOCK_LOW_AND_ABOVE, BLOCK_MEDIUM_AND_ABOVE, BLOCK_ONLY_HIGH </ParamField>

<ParamField type="object"> Instructions for the model to steer it toward better performance. For example, "Answer as concisely as possible" or "Don't use technical terms in your response". The text strings count toward the token limit. The role field of systemInstruction is ignored and doesn't affect the performance of the model. Note: Only text should be used in parts and content in each part should be in a separate paragraph. </ParamField>

<ParamField type="object[]"> A list of ordered parts that make up a single message. Different parts may have different IANA MIME types. For limits on the inputs, such as the maximum number of tokens or the number of images, see the model specifications on the Google models page. </ParamField>

<ParamField type="string"> A text prompt or code snippet. </ParamField>

<ParamField type="string"> The identity of the entity that creates the message. The following values are supported: user: This indicates that the message is sent by a real person, typically a user-generated message. model: This indicates that the message is generated by the model. The model value is used to insert messages from the model into the conversation during multi-turn conversations. For non-multi-turn conversations, this field can be left blank or unset.

Possible values: user, model </ParamField>

<ParamField type="object[]"> A piece of code that enables the system to interact with external systems to perform an action, or set of actions, outside of knowledge and scope of the model. See Function calling. </ParamField>

<ParamField type="object[]" />

<ParamField type="string" />

<ParamField type="string" />

<ParamField type="object"> JSON schema for the function parameters </ParamField>

<ParamField type="boolean"> If true, generated images will be uploaded to cloud storage and returned as signed URLs instead of inline base64 data. The URLs expire after 24 hours. </ParamField>

<ParamField type="object"> For video input, the start and end offset of the video in Duration format. For example, to specify a 10 second clip starting at 1:00, set "startOffset": { "seconds": 60 } and "endOffset": { "seconds": 70 }. The metadata should only be specified while the video data is presented in inlineData or fileData. </ParamField>

<ParamField type="object"> Represents a duration offset for video timeline positions. </ParamField>

<ParamField type="integer"> Signed fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values.

Range: 0 to 999999999 </ParamField>

<ParamField type="integer"> Signed seconds of the span of time. Must be from -315,576,000,000 to +315,576,000,000 inclusive.

Range: -315576000000 to 315576000000 </ParamField>

<ParamField type="object"> Represents a duration offset for video timeline positions. </ParamField>

<ParamField type="integer"> Signed fractions of a second at nanosecond resolution. Negative second values with fractions must still have non-negative nanos values.

Range: 0 to 999999999 </ParamField>

<ParamField type="integer"> Signed seconds of the span of time. Must be from -315,576,000,000 to +315,576,000,000 inclusive.

Range: -315576000000 to 315576000000 </ParamField>

Generated from the schema Router serves at GET /v2/models/vertexai/gemini-3.1-pro-preview/openapi.json, the same document it validates a call against before the request reaches the provider.

Output

<ResponseField name="candidates" type="object[]" />

<ResponseField name="candidates[].citationMetadata" type="object" />

<ResponseField name="candidates[].citationMetadata.citations" type="object[]" />

<ResponseField name="candidates[].citationMetadata.citations[].authors" type="string[]" />

<ResponseField name="candidates[].citationMetadata.citations[].endIndex" type="integer" />

<ResponseField name="candidates[].citationMetadata.citations[].license" type="string" />

<ResponseField name="candidates[].citationMetadata.citations[].publicationDate" type="string (date)"> Format: date </ResponseField>

<ResponseField name="candidates[].citationMetadata.citations[].startIndex" type="integer" />

<ResponseField name="candidates[].citationMetadata.citations[].title" type="string" />

<ResponseField name="candidates[].citationMetadata.citations[].uri" type="string" />

<ResponseField name="candidates[].content" type="object"> The content of the current conversation with the model. For single-turn queries, this is a single instance. For multi-turn queries, this is a repeated field that contains conversation history and the latest request. </ResponseField>

<ResponseField name="candidates[].content.parts" type="object[]" />

<ResponseField name="candidates[].content.parts[].fileData" type="object"> URI based data. </ResponseField>

<ResponseField name="candidates[].content.parts[].fileData.fileUri" type="string"> URI </ResponseField>

<ResponseField name="candidates[].content.parts[].fileData.mimeType" type="string"> The media type of the file specified in the data or fileUri fields. Acceptable values include the following. For gemini-2.0-flash-lite and gemini-2.0-flash, the maximum length of an audio file is 8.4 hours and the maximum length of a video file (without audio) is one hour. For more information, see Gemini audio and video requirements. Text files must be UTF-8 encoded. The contents of the text file count toward the token limit. There is no limit on image resolution.

Possible values: application/pdf, audio/mpeg, audio/mp3, audio/wav, image/png, image/jpeg, image/webp, text/plain, video/mov, video/mpeg, video/mp4, video/mpg, video/avi, video/wmv, video/mpegps, video/flv, image/heic, image/heif, audio/flac, video/webm </ResponseField>

<ResponseField name="candidates[].content.parts[].inlineData" type="object"> Inline data in raw bytes. For gemini-2.0-flash-lite and gemini-2.0-flash, you can specify up to 3000 images by using inlineData. </ResponseField>

<ResponseField name="candidates[].content.parts[].inlineData.data" type="string (byte)"> The base64 encoding of the image, PDF, or video to include inline in the prompt. When including media inline, you must also specify the media type (mimeType) of the data. Size limit: 20MB

Format: byte </ResponseField>

<ResponseField name="candidates[].content.parts[].inlineData.mimeType" type="string"> The media type of the file specified in the data or fileUri fields. Acceptable values include the following. For gemini-2.0-flash-lite and gemini-2.0-flash, the maximum length of an audio file is 8.4 hours and the maximum length of a video file (without audio) is one hour. For more information, see Gemini audio and video requirements. Text files must be UTF-8 encoded. The contents of the text file count toward the token limit. There is no limit on image resolution.

Possible values: application/pdf, audio/mpeg, audio/mp3, audio/wav, image/png, image/jpeg, image/webp, text/plain, video/mov, video/mpeg, video/mp4, video/mpg, video/avi, video/wmv, video/mpegps, video/flv, image/heic, image/heif, audio/flac, video/webm </ResponseField>

<ResponseField name="candidates[].content.parts[].mediaProcessing" type="string"> How the model reads this part's video. Set "AGENTIC" to let the model decide which segments to inspect, instead of fixed-rate frame sampling. Omit for the default fixed-rate sampling. Supported on gemini-3.7-flash and newer Flash models. </ResponseField>

<ResponseField name="candidates[].content.parts[].text" type="string"> A text prompt or code snippet. </ResponseField>

<ResponseField name="candidates[].content.parts[].thought" type="boolean"> Indicates this part is a thinking/reasoning step from the model. </ResponseField>

<ResponseField name="candidates[].content.role" type="string"> Possible values: user, model </ResponseField>

<ResponseField name="candidates[].finishReason" type="string" />

<ResponseField name="candidates[].safetyRatings" type="object[]" />

<ResponseField name="candidates[].safetyRatings[].category" type="string"> Possible values: HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_DANGEROUS_CONTENT </ResponseField>

<ResponseField name="candidates[].safetyRatings[].probability" type="string"> The probability that the content violates the specified safety category

Possible values: NEGLIGIBLE, LOW, MEDIUM, HIGH, UNKNOWN </ResponseField>

<ResponseField name="createTime" type="string"> Timestamp when the response was created. </ResponseField>

<ResponseField name="modelVersion" type="string"> The model version used to generate the response. </ResponseField>

<ResponseField name="promptFeedback" type="object" />

<ResponseField name="promptFeedback.blockReason" type="string" />

<ResponseField name="promptFeedback.blockReasonMessage" type="string" />

<ResponseField name="promptFeedback.safetyRatings" type="object[]" />

<ResponseField name="promptFeedback.safetyRatings[].category" type="string"> Possible values: HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_DANGEROUS_CONTENT </ResponseField>

<ResponseField name="promptFeedback.safetyRatings[].probability" type="string"> The probability that the content violates the specified safety category

Possible values: NEGLIGIBLE, LOW, MEDIUM, HIGH, UNKNOWN </ResponseField>

<ResponseField name="responseId" type="string"> Unique identifier for the response. </ResponseField>

<ResponseField name="usageMetadata" type="object" />

<ResponseField name="usageMetadata.cachedContentTokenCount" type="integer"> Output only. Number of tokens in the cached part in the input (the cached content). </ResponseField>

<ResponseField name="usageMetadata.candidatesTokenCount" type="integer"> Number of tokens in the response(s). </ResponseField>

<ResponseField name="usageMetadata.candidatesTokensDetails" type="object[]"> Breakdown of candidate tokens by modality. </ResponseField>

<ResponseField name="usageMetadata.candidatesTokensDetails[].modality" type="string"> Type of input or output content modality.

Possible values: MODALITY_UNSPECIFIED, TEXT, IMAGE, VIDEO, AUDIO, DOCUMENT </ResponseField>

<ResponseField name="usageMetadata.candidatesTokensDetails[].tokenCount" type="integer"> Number of tokens for the given modality. </ResponseField>

<ResponseField name="usageMetadata.promptTokenCount" type="integer"> Number of tokens in the request. When cachedContent is set, this is still the total effective prompt size meaning this includes the number of tokens in the cached content. </ResponseField>

<ResponseField name="usageMetadata.promptTokensDetails" type="object[]"> Breakdown of prompt tokens by modality. </ResponseField>

<ResponseField name="usageMetadata.promptTokensDetails[].modality" type="string"> Type of input or output content modality.

Possible values: MODALITY_UNSPECIFIED, TEXT, IMAGE, VIDEO, AUDIO, DOCUMENT </ResponseField>

<ResponseField name="usageMetadata.promptTokensDetails[].tokenCount" type="integer"> Number of tokens for the given modality. </ResponseField>

<ResponseField name="usageMetadata.thoughtsTokenCount" type="integer"> Number of tokens present in thoughts output. </ResponseField>

<ResponseField name="usageMetadata.toolUsePromptTokenCount" type="integer"> Number of tokens present in tool-use prompt(s). </ResponseField>

<ResponseField name="usageMetadata.toolUsePromptTokensDetails" type="object[]"> Breakdown of tool-use prompt tokens by modality. </ResponseField>

<ResponseField name="usageMetadata.toolUsePromptTokensDetails[].modality" type="string"> Type of input or output content modality.

Possible values: MODALITY_UNSPECIFIED, TEXT, IMAGE, VIDEO, AUDIO, DOCUMENT </ResponseField>

<ResponseField name="usageMetadata.toolUsePromptTokensDetails[].tokenCount" type="integer"> Number of tokens for the given modality. </ResponseField>

<ResponseField name="usageMetadata.totalTokenCount" type="integer"> Total number of tokens (prompt + candidates). </ResponseField>

<ResponseField name="usageMetadata.trafficType" type="string"> Traffic type used for the request (e.g., PROVISIONED_THROUGHPUT). </ResponseField>

Examples

Input

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Describe a single red maple leaf on a white background in one sentence."
        }
      ]
    }
  ],
  "generationConfig": {
    "temperature": 0.7,
    "maxOutputTokens": 256
  }
}

Output

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "A single red maple leaf rests on a plain white background, its edges sharp and its color deep."
          }
        ]
      },
      "finishReason": "STOP"
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 18,
    "candidatesTokenCount": 24
  }
}

Before you ship

The SDKs create an Idempotency-Key and reuse it for automatic retries. For manual retries, reuse the original key. Router can hold the connection for up to 10 minutes.

When a request fails, Router sends an X-Comfy-Error-Type response header explaining why. A 422 means Router rejected the input before calling the provider, and a 413 means the request body was larger than Router accepts. Download generated assets promptly because result URLs can expire.

Any size limit named in a field description above is the provider's own bound on that field, quoted from the provider's specification. Router applies a separate cap to the whole request body, which base64-encoded media counts against: see request body size.

This page documents one partner model called through Comfy Router. The same comfy-sdk / @comfyorg/sdk package also ships a second client, for running a whole ComfyUI workflow graph on Comfy Cloud: Comfy(api_key=...) / new Comfy({ apiKey }), with client.workflows, client.assets and client.jobs. See Comfy SDKs.

Authentication, idempotency, request IDs, error buckets, retry pacing, spend limits.



Model discovery, validation errors, retries, and billing.



What Router does not do today, and what to use instead.