# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

openapi: 3.0.1
info:
  title: LLM Routing
  description: Spec for the LLM Routing Sample API

  termsOfService: https://example.com/
  contact:
    email: someteam@example.com
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  version: 1.0.0
externalDocs:
  description: Find out more about this sample
  url: https://github.com/GoogleCloudPlatform/apigee-samples/tree/main?tab=readme-ov-file#llm-samples
servers:
  - url: https://HOST/v1/samples/llm-routing
tags:
  - name: chat
    description: Chat
paths:
  /chat/completions:
    post:
      tags:
        - chat
      summary: Generate Content using a prompt
      description: |
         Creates a model response for the given chat conversation
      operationId: chat
      parameters:
        - name: x-llm-provider
          in: header
          description: LLM Provider
          required: true
          schema:
            type: string
            enum: [google, mistral, huggingface]
            example: "google"
        - name: x-logpayload
          in: header
          description: Log payload to Cloud Logging
          example: true
          required: false
          schema:
            type: boolean
      requestBody:
        description: |
         Submit a prompt to generate text
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatRequest'
            examples:
              google:
                value:
                  {
                    "model": "google/gemini-2.0-flash",
                    "messages": [
                      {
                        "role": "user",
                        "content": [
                          {
                            "type": "image_url",
                            "image_url": {
                              "url": "gs://generativeai-downloads/images/character.jpg"
                            }
                          },
                          {
                            "type": "text",
                            "text": "Describe this image in one sentence."
                          }
                        ]
                      }
                    ],
                    "max_tokens": 250,
                    "stream": false,
                    "top_p": 0.5,
                    "safe_prompt": false,
                    "temperature": 0.7,
                    "n": 1
                  }
              mistral:
                value:
                  {
                    "model": "open-mistral-nemo",
                    "messages": [
                      {
                        "role": "user",
                        "content": [
                          {
                            "type": "text",
                            "text": "Suggest few names for a flower shop"
                          }
                        ]
                      }
                    ],
                    "max_tokens": 250,
                    "stream": false,
                    "top_p": 0.5,
                    "safe_prompt": false,
                    "temperature": 0.7,
                    "n": 1
                  }
              huggingface:
                value:
                  {
                    "model": "Meta-Llama-3.1-8B-Instruct",
                    "messages": [
                      {
                        "role": "user",
                        "content": [
                          {
                            "type": "text",
                            "text": "Suggest few names for a flower shop"
                          }
                        ]
                      }
                    ],
                    "max_tokens": 250,
                    "stream": false,
                    "top_p": 0.5,
                    "safe_prompt": false,
                    "temperature": 0.7,
                    "n": 1
                  }
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatResponse'
        '400':
          description: Invalid request supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Uanuthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - api_key: []
components:
  schemas:
    ChatRequest:
      type: object
      properties:
        model:
          type: string
          example: "google/gemini-2.0-flash"
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageObj'
        max_tokens:
          type: integer
          example: 250
        stream:
          type: boolean
          example: false
        top_p:
          type: number
          format: float
        safe_prompt:
          type: boolean
        temperature:
          type: number
          format: float
        n:
          type: number
      required:
        - model
        - messages
    MessageObj:
      type: object
      properties:
        role:
          type: string
          example: "user"
        content:
          type: array
          items:
            $ref: '#/components/schemas/ContentObj'
    ContentObj:
      type: object
      properties:
        type:
          type: string
          example: "text"
        text:
          type: string
          example: "Suggest me something"
        image_url:
          type: object
          properties:
            url:
              type: string
    ErrorResponse:
      type: object
    ChatResponse:
      type: object
      properties:
        id:
          type: string
        model:
          type: string
        object:
          type: string
        system_fingerprint:
          type: string
        created:
          type: integer
          format: int32
        choices:
          type: array
          items:
            $ref: '#/components/schemas/ChoiceObj'
        usage:
          $ref: '#/components/schemas/UsageObj'
    ChoiceObj:
      type: object
      properties:
        finish_reason:
          type: string
        index:
          type: integer
        logprobs:
          type: integer
        message:
          type: object
          properties:
            content:
              type: string
            role:
              type: string
    UsageObj:
      type: object
      properties:
        completion_tokens:
          type: integer
        prompt_tokens:
          type: integer
        total_tokens:
          type: integer
  securitySchemes:
    api_key:
      type: apiKey
      name: x-apikey
      in: header
