import { CodeGroup } from '../code.tsx'
import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'

# Completion App API

The text generation application offers non-session support and is ideal for translation, article writing, summarization AI, and more.

<div>
  ### Base URL
  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url} />

  ### Authentication

  The Service API uses `API-Key` authentication.
  <i>**Strongly recommend storing your API Key on the server-side, not shared or stored on the client-side, to avoid possible API-Key leakage that can lead to serious consequences.**</i>

  For all API requests, include your API Key in the `Authorization` HTTP Header, as shown below:

  <CodeGroup title="Code" targetCode='Authorization: Bearer {API_KEY}' />
</div>

---

<Heading
  url='/completion-messages'
  method='POST'
  title='Create Completion Message'
  name='#Create-Completion-Message'
/>
<Row>
  <Col>
    Send a request to the text generation application.

    ### Request Body

    <Properties>

      <Property name='inputs' type='object' key='inputs'>
          Allows the entry of various variable values defined by the App.
          The `inputs` parameter contains multiple key/value pairs, with each key corresponding to a specific variable and each value being the specific value for that variable.
          The text generation application requires at least one key/value pair to be inputted.
          - `query` (string) Required
            The input text, the content to be processed.
      </Property>
      <Property name='response_mode' type='string' key='response_mode'>
        The mode of response return, supporting:
        - `streaming` Streaming mode (recommended), implements a typewriter-like output through SSE ([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)).
        - `blocking` Blocking mode, returns result after execution is complete. (Requests may be interrupted if the process is long)
        <i>Due to Cloudflare restrictions, the request will be interrupted without a return after 100 seconds.</i>
      </Property>
      <Property name='user' type='string' key='user'>
          User identifier, used to define the identity of the end-user, convenient for retrieval and statistics.
          The rules are defined by the developer and need to ensure that the user identifier is unique within the application. The Service API does not share conversations created by the WebApp.
      </Property>
      <Property name='files' type='array[object]' key='files'>
          File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision/Video capability.
          - `type` (string) Supported type:
            - `document` Supported types include: 'TXT', 'MD', 'MARKDOWN', 'MDX', 'PDF', 'HTML', 'XLSX', 'XLS', 'VTT', 'PROPERTIES', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
            - `image` Supported types include: 'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
            - `audio` Supported types include: 'MP3', 'M4A', 'WAV', 'WEBM', 'MPGA'
            - `video` Supported types include: 'MP4', 'MOV', 'MPEG', 'WEBM'
            - `custom` Supported types include: other file types
          - `transfer_method` (string) Transfer method:
            - `remote_url`: File URL.
            - `local_file`: Upload file.
          - `url` File URL. (Only when transfer method is `remote_url`).
          - `upload_file_id` Upload file ID. (Only when transfer method is `local_file`).
      </Property>
      <Property name='trace_session_id' type='string' key='trace_session_id'>
        (Optional) Trace session ID for observability grouping. Tracing providers that support session grouping can use this value as the exported session identifier. It does not change conversation_id, workflow_run_id, trace_id, or span relationships. Supports the following three ways to pass, in order of priority:<br/>
        - Header: via HTTP Header <code>X-Trace-Session-Id</code>, highest priority.<br/>
        - Query parameter: via URL query parameter <code>trace_session_id</code>.<br/>
        - Request Body: via request body field <code>trace_session_id</code> (i.e., this field).<br/>
      </Property>
    </Properties>

    ### Response
    When `response_mode` is `blocking`, return a CompletionResponse object.
    When `response_mode` is `streaming`, return a ChunkCompletionResponse stream.

    ### ChatCompletionResponse
    Returns the complete App result, `Content-Type` is `application/json`.
    - `message_id` (string) Unique message ID
    - `mode` (string) App mode, fixed as `chat`
    - `answer` (string) Complete response content
    - `metadata` (object) Metadata
      - `usage` (Usage) Model usage information
      - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
    - `created_at` (int) Message creation timestamp, e.g., 1705395332

    ### ChunkChatCompletionResponse
    Returns the stream chunks outputted by the App, `Content-Type` is `text/event-stream`.
    Each streaming chunk starts with `data:`, separated by two newline characters `\n\n`, as shown below:
    <CodeGroup>
    ```streaming {{ title: 'Response' }}
    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
    ```
    </CodeGroup>
    The structure of the streaming chunks varies depending on the `event`:
    - `event: message` LLM returns text chunk event, i.e., the complete text is output in a chunked fashion.
      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
      - `message_id` (string) Unique message ID
      - `answer` (string) LLM returned text chunk content
      - `created_at` (int) Creation timestamp, e.g., 1705395332
    - `event: message_end` Message end event, receiving this event means streaming has ended.
      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
      - `message_id` (string) Unique message ID
      - `metadata` (object) Metadata
        - `usage` (Usage) Model usage information
        - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
    - `event: tts_message` TTS audio stream event, that is, speech synthesis output. The content is an audio block in Mp3 format, encoded as a base64 string. When playing, simply decode the base64 and feed it into the player. (This message is available only when auto-play is enabled)
      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
      - `message_id` (string) Unique message ID
      - `audio` (string) The audio after speech synthesis, encoded in base64 text content, when playing, simply decode the base64 and feed it into the player
      - `created_at` (int) Creation timestamp, e.g.: 1705395332
    - `event: tts_message_end` TTS audio stream end event, receiving this event indicates the end of the audio stream.
      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
      - `message_id` (string) Unique message ID
      - `audio` (string) The end event has no audio, so this is an empty string
      - `created_at` (int) Creation timestamp, e.g.: 1705395332
    - `event: message_replace` Message content replacement event.
      When output content moderation is enabled, if the content is flagged, then the message content will be replaced with a preset reply through this event.
      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
      - `message_id` (string) Unique message ID
      - `answer` (string) Replacement content (directly replaces all LLM reply text)
      - `created_at` (int) Creation timestamp, e.g., 1705395332
    - `event: error`
      Exceptions that occur during the streaming process will be output in the form of stream events, and reception of an error event will end the stream.
      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
      - `message_id` (string) Unique message ID
      - `status` (int) HTTP status code
      - `code` (string) Error code
      - `message` (string) Error message
    - `event: ping` Ping event every 10 seconds to keep the connection alive.

    ### Errors
    - 404, Conversation does not exists
    - 400, `invalid_param`, abnormal parameter input
    - 400, `app_unavailable`, App configuration unavailable
    - 400, `provider_not_initialize`, no available model credential configuration
    - 400, `provider_quota_exceeded`, model invocation quota insufficient
    - 400, `model_currently_not_support`, current model unavailable
    - 400, `completion_request_error`, text generation failed
    - 500, internal server error

  </Col>
  <Col sticky>

    <CodeGroup
      title="Request"
      tag="POST"
      label="/completion-messages"
      targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages' \\
--header 'Authorization: Bearer {api_key}' \\
--header 'Content-Type: application/json' \\
--data-raw '{
    "inputs": {"query": "Hello, world!"},
    "response_mode": "streaming",
    "user": "abc-123"
}'`}
    />
    ### Blocking Mode
    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "event": "message",
      "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
      "mode": "completion",
      "answer": "Hello World!...",
      "metadata": {
          "usage": {
              "prompt_tokens": 1033,
              "prompt_unit_price": "0.001",
              "prompt_price_unit": "0.001",
              "prompt_price": "0.0010330",
              "completion_tokens": 128,
              "completion_unit_price": "0.002",
              "completion_price_unit": "0.001",
              "completion_price": "0.0002560",
              "total_tokens": 1161,
              "total_price": "0.0012890",
              "currency": "USD",
              "latency": 0.7682376249867957
          }
      },
      "created_at": 1705407629
  }
    ```
    </CodeGroup>
    ### Streaming Mode
    <CodeGroup title="Response">
    ```streaming {{ title: 'Response' }}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " I", "created_at": 1679586595}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": "'m", "created_at": 1679586595}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " glad", "created_at": 1679586595}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " to", "created_at": 1679586595}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " meet", "created_at": 1679586595}
      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " you", "created_at": 1679586595}
      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}}}
      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
    ```
    </CodeGroup>
  </Col>
</Row>

---
<Heading
  url='/files/upload'
  method='POST'
  title='File Upload'
  name='#file-upload'
/>
<Row>
  <Col>
  Upload a file (currently only images are supported) for use when sending messages, enabling multimodal understanding of images and text.
  Supports png, jpg, jpeg, webp, gif formats.
  <i>Uploaded files are for use by the current end-user only.</i>

  ### Request Body
  This interface requires a `multipart/form-data` request.
  - `file` (File) Required
    The file to be uploaded.
  - `user` (string) Required
    User identifier, defined by the developer's rules, must be unique within the application. The Service API does not share conversations created by the WebApp.

  ### Response
  After a successful upload, the server will return the file's ID and related information.
  - `id` (uuid) ID
  - `name` (string) File name
  - `size` (int) File size (bytes)
  - `extension` (string) File extension
  - `mime_type` (string) File mime-type
  - `created_by` (uuid) End-user ID
  - `created_at` (timestamp) Creation timestamp, e.g., 1705395332

  ### Errors
  - 400, `no_file_uploaded`, a file must be provided
  - 400, `too_many_files`, currently only one file is accepted
  - 400, `unsupported_preview`, the file does not support preview
  - 400, `unsupported_estimate`, the file does not support estimation
  - 413, `file_too_large`, the file is too large
  - 415, `unsupported_file_type`, unsupported extension, currently only document files are accepted
  - 503, `s3_connection_failed`, unable to connect to S3 service
  - 503, `s3_permission_denied`, no permission to upload files to S3
  - 503, `s3_file_too_large`, file exceeds S3 size limit
  - 500, internal server error


  </Col>
  <Col sticky>
  ### Request Example
    <CodeGroup
      title="Request"
      tag="POST"
      label="/files/upload"
      targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\
--header 'Authorization: Bearer {api_key}' \\
--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif]' \\
--form 'user=abc-123'`}
    />


  ### Response Example
  <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
      "name": "example.png",
      "size": 1024,
      "extension": "png",
      "mime_type": "image/png",
      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
      "created_at": 1577836800,
    }
  ```
  </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/end-users/:end_user_id'
  method='GET'
  title='Get End User'
  name='#end-user'
/>
<Row>
  <Col>
    Retrieve an end user by ID.

    This is useful when other APIs return an end-user ID (e.g. `created_by` from File Upload).

    ### Path Parameters
    - `end_user_id` (uuid) Required
      End user ID.

    ### Response
    Returns an EndUser object.
    - `id` (uuid) ID
    - `tenant_id` (uuid) Tenant ID
    - `app_id` (uuid) App ID
    - `type` (string) End user type
    - `external_user_id` (string) External user ID
    - `name` (string) Name
    - `is_anonymous` (boolean) Whether anonymous
    - `session_id` (string) Session ID
    - `created_at` (string) ISO 8601 datetime
    - `updated_at` (string) ISO 8601 datetime

    ### Errors
    - 404, `end_user_not_found`, end user not found
    - 500, internal server error

  </Col>
  <Col sticky>
    ### Request Example
    <CodeGroup
      title="Request"
      tag="GET"
      label="/end-users/:end_user_id"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/end-users/6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13' \\
--header 'Authorization: Bearer {api_key}'`}
    />

    ### Response Example
    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "id": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
      "tenant_id": "8c0f3f3a-66b0-4b55-a0bf-8b8e0d6aee7d",
      "app_id": "6c8c3f41-2c6f-4e1b-8f4f-7f11c8f2ad2a",
      "type": "service_api",
      "external_user_id": "abc-123",
      "name": "Alice",
      "is_anonymous": false,
      "session_id": "abc-123",
      "created_at": "2024-01-01T00:00:00Z",
      "updated_at": "2024-01-01T00:00:00Z"
    }
    ```
    </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/files/:file_id/preview'
  method='GET'
  title='File Preview'
  name='#file-preview'
/>
<Row>
  <Col>
    Preview or download uploaded files. This endpoint allows you to access files that have been previously uploaded via the File Upload API.

    <i>Files can only be accessed if they belong to messages within the requesting application.</i>

    ### Path Parameters
    - `file_id` (string) Required
      The unique identifier of the file to preview, obtained from the File Upload API response.

    ### Query Parameters
    - `as_attachment` (boolean) Optional
      Whether to force download the file as an attachment. Default is `false` (preview in browser).

    ### Response
    Returns the file content with appropriate headers for browser display or download.
    - `Content-Type` Set based on file mime type
    - `Content-Length` File size in bytes (if available)
    - `Content-Disposition` Set to "attachment" if `as_attachment=true`
    - `Cache-Control` Caching headers for performance
    - `Accept-Ranges` Set to "bytes" for audio/video files

    ### Errors
    - 400, `invalid_param`, abnormal parameter input
    - 403, `file_access_denied`, file access denied or file does not belong to current application
    - 404, `file_not_found`, file not found or has been deleted
    - 500, internal server error

  </Col>
  <Col sticky>
    ### Request Example
    <CodeGroup
      title="Request"
      tag="GET"
      label="/files/:file_id/preview"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/files/72fa9618-8f89-4a37-9b33-7e1178a24a67/preview' \\
--header 'Authorization: Bearer {api_key}'`}
    />

    ### Download as Attachment
    <CodeGroup
      title="Download
      Request"
      tag="GET"
      label="/files/:file_id/preview?as_attachment=true"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/files/72fa9618-8f89-4a37-9b33-7e1178a24a67/preview?as_attachment=true' \\
--header 'Authorization: Bearer {api_key}' \\
--output downloaded_file.png`}
    />

    ### Response Headers Example
    <CodeGroup title="Response Headers">
    ```http {{ title: 'Headers - Image Preview' }}
    Content-Type: image/png
    Content-Length: 1024
    Cache-Control: public, max-age=3600
    ```
    </CodeGroup>

    ### Download Response Headers
    <CodeGroup title="Download Response Headers">
    ```http {{ title: 'Headers - File Download' }}
    Content-Type: image/png
    Content-Length: 1024
    Content-Disposition: attachment; filename*=UTF-8''example.png
    Cache-Control: public, max-age=3600
    ```
    </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/completion-messages/:task_id/stop'
  method='POST'
  title='Stop Generate'
  name='#stop-generatebacks'
/>
<Row>
  <Col>
  Only supported in streaming mode.
  ### Path
  - `task_id` (string) Task ID, can be obtained from the streaming chunk return
  Request Body
  - `user` (string) Required
    User identifier, used to define the identity of the end-user, must be consistent with the user passed in the send message interface. The Service API does not share conversations created by the WebApp.
  ### Response
  - `result` (string) Always returns "success"
  </Col>
  <Col sticky>
    ### Request Example
    <CodeGroup
      title="Request"
      tag="POST"
      label="/completion-messages/:task_id/stop"
      targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \\
-H 'Authorization: Bearer {api_key}' \\
-H 'Content-Type: application/json' \\
--data-raw '{ "user": "abc-123"}'`}
    />

    ### Response Example
    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "result": "success"
    }
    ```
    </CodeGroup>
  </Col>
</Row>

---

<Heading
  url='/messages/:message_id/feedbacks'
  method='POST'
  title='Message Feedback'
  name='#feedbacks'
/>
<Row>
  <Col>
    End-users can provide feedback messages, facilitating application developers to optimize expected outputs.

    ### Path
    <Properties>
      <Property name='message_id' type='string' key='message_id'>
       Message ID
      </Property>
    </Properties>

    ### Request Body

    <Properties>
      <Property name='rating' type='string' key='rating'>
        Upvote as `like`, downvote as `dislike`, revoke upvote as `null`
      </Property>
      <Property name='user' type='string' key='user'>
        User identifier, defined by the developer's rules, must be unique within the application.
      </Property>
      <Property name='content' type='string' key='content'>
        The specific content of message feedback.
      </Property>
    </Properties>

    ### Response
    - `result` (string) Always returns "success"
  </Col>
  <Col sticky>

    <CodeGroup
      title="Request"
      tag="POST"
      label="/messages/:message_id/feedbacks"
      targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\
--header 'Authorization: Bearer {api_key}' \\
--header 'Content-Type: application/json' \\
--data-raw '{
    "rating": "like",
    "user": "abc-123",
    "content": "message feedback information"
}'`}
    />

    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "result": "success"
    }
    ```
    </CodeGroup>
  </Col>
</Row>

---

<Heading
  url='/app/feedbacks'
  method='GET'
  title='Get feedbacks of application'
  name='#app-feedbacks'
/>
<Row>
  <Col>
    Get application's feedbacks.

    ### Query
    <Properties>
      <Property name='page' type='string' key='page'>
       （optional）pagination，default：1
      </Property>
    </Properties>

    <Properties>
      <Property name='limit' type='string' key='limit'>
       （optional） records per page default：20
      </Property>
    </Properties>

    ### Response
    - `data` (List) return apps feedback list.
  </Col>
  <Col sticky>

    <CodeGroup
      title="Request"
      tag="GET"
      label="/app/feedbacks"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}
    />

    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
      {
          "data": [
              {
                  "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
                  "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
                  "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
                  "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
                  "rating": "like",
                  "content": "message feedback information-3",
                  "from_source": "user",
                  "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
                  "from_account_id": null,
                  "created_at": "2025-04-24T09:24:38",
                  "updated_at": "2025-04-24T09:24:38"
              }
          ]
      }
    ```
    </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/text-to-audio'
  method='POST'
  title='Text to Audio'
  name='#audio'
/>
<Row>
  <Col>
    Text to speech.

    ### Request Body

    <Properties>
      <Property name='message_id' type='str' key='message_id'>
        For text messages generated by Dify, simply pass the generated message-id directly. The backend will use the message-id to look up the corresponding content and synthesize the voice information directly. If both message_id and text are provided simultaneously, the message_id is given priority.
      </Property>
      <Property name='text' type='str' key='text'>
        Speech generated content.
      </Property>
      <Property name='user' type='string' key='user'>
        The user identifier, defined by the developer, must ensure uniqueness within the app.
      </Property>
    </Properties>
  </Col>
  <Col sticky>

    <CodeGroup
      title="Request"
      tag="POST"
      label="/text-to-audio"
      targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\
--header 'Authorization: Bearer {api_key}' \\
--header 'Content-Type: application/json' \\
--data-raw '{
    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
    "text": "Hello Dify",
    "user": "abc-123"
}'`}
    />

    <CodeGroup title="headers">
    ```json {{ title: 'headers' }}
    {
      "Content-Type": "audio/wav"
    }
    ```
    </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/info'
  method='GET'
  title='Get Application Basic Information'
  name='#info'
/>
<Row>
  <Col>
  Used to get basic information about this application

  ### Response
  - `name` (string) application name
  - `description` (string) application description
  - `tags` (array[string]) application tags
  - `mode` (string) application mode
  - `author_name` (string) author name
  </Col>
  <Col>
    <CodeGroup
      title="Request"
      tag="GET"
      label="/info"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\
-H 'Authorization: Bearer {api_key}'`}
    />
    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "name": "My App",
      "description": "This is my app.",
      "tags": [
        "tag1",
        "tag2"
      ],
      "mode": "chat",
      "author_name": "Dify"
    }
    ```
    </CodeGroup>
  </Col>
</Row>

---

<Heading
  url='/parameters'
  method='GET'
  title='Get Application Parameters Information'
  name='#parameters'
/>
<Row>
  <Col>
    Used at the start of entering the page to obtain information such as features, input parameter names, types, and default values.

    ### Response
    - `opening_statement` (string) Opening statement
    - `suggested_questions` (array[string]) List of suggested questions for the opening
    - `suggested_questions_after_answer` (object) Suggest questions after enabling the answer.
      - `enabled` (bool) Whether it is enabled
    - `speech_to_text` (object) Speech to text
      - `enabled` (bool) Whether it is enabled
    - `retriever_resource` (object) Citation and Attribution
      - `enabled` (bool) Whether it is enabled
    - `annotation_reply` (object) Annotation reply
      - `enabled` (bool) Whether it is enabled
    - `user_input_form` (array[object]) User input form configuration
      - `text-input` (object) Text input control
        - `label` (string) Variable display label name
        - `variable` (string) Variable ID
        - `required` (bool) Whether it is required
        - `default` (string) Default value
      - `paragraph` (object) Paragraph text input control
        - `label` (string) Variable display label name
        - `variable` (string) Variable ID
        - `required` (bool) Whether it is required
        - `default` (string) Default value
      - `select` (object) Dropdown control
        - `label` (string) Variable display label name
        - `variable` (string) Variable ID
        - `required` (bool) Whether it is required
        - `default` (string) Default value
        - `options` (array[string]) Option values
    - `file_upload` (object) File upload configuration
      - `document` (object) Document settings
        Currently only supports document types: `txt`, `md`, `markdown`, `pdf`, `html`, `xlsx`, `xls`, `docx`, `csv`, `eml`, `msg`, `pptx`, `ppt`, `xml`, `epub`.
        - `enabled` (bool) Whether it is enabled
        - `number_limits` (int) Document number limit, default is 3
        - `transfer_methods` (array[string]) List of transfer methods: `remote_url`, `local_file`. Must choose one.
      - `image` (object) Image settings
        Currently only supports image types: `png`, `jpg`, `jpeg`, `webp`, `gif`.
        - `enabled` (bool) Whether it is enabled
        - `number_limits` (int) Image number limit, default is 3
        - `transfer_methods` (array[string]) List of transfer methods: `remote_url`, `local_file`. Must choose one.
      - `audio` (object) Audio settings
        Currently only supports audio types: `mp3`, `m4a`, `wav`, `webm`, `amr`.
        - `enabled` (bool) Whether it is enabled
        - `number_limits` (int) Audio number limit, default is 3
        - `transfer_methods` (array[string]) List of transfer methods: `remote_url`, `local_file`. Must choose one.
      - `video` (object) Video settings
        Currently only supports video types: `mp4`, `mov`, `mpeg`, `mpga`.
        - `enabled` (bool) Whether it is enabled
        - `number_limits` (int) Video number limit, default is 3
        - `transfer_methods` (array[string]) List of transfer methods: `remote_url`, `local_file`. Must choose one.
      - `custom` (object) Custom settings
        - `enabled` (bool) Whether it is enabled
        - `number_limits` (int) Custom number limit, default is 3
        - `transfer_methods` (array[string]) List of transfer methods: `remote_url`, `local_file`. Must choose one.
    - `system_parameters` (object) System parameters
      - `file_size_limit` (int) Document upload size limit (MB)
      - `image_file_size_limit` (int) Image file upload size limit (MB)
      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
      - `video_file_size_limit` (int) Video file upload size limit (MB)

  </Col>
  <Col sticky>

    <CodeGroup
      title="Request"
      tag="GET"
      label="/parameters"
      targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}
    />

    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "opening_statement": "Hello!",
      "suggested_questions_after_answer": {
          "enabled": true
      },
      "speech_to_text": {
          "enabled": true
      },
      "retriever_resource": {
          "enabled": true
      },
      "annotation_reply": {
          "enabled": true
      },
      "user_input_form": [
          {
              "paragraph": {
                  "label": "Query",
                  "variable": "query",
                  "required": true,
                  "default": ""
              }
          }
      ],
      "file_upload": {
          "image": {
              "enabled": false,
              "number_limits": 3,
              "detail": "high",
              "transfer_methods": [
                  "remote_url",
                  "local_file"
              ]
          }
      },
      "system_parameters": {
          "file_size_limit": 15,
          "image_file_size_limit": 10,
          "audio_file_size_limit": 50,
          "video_file_size_limit": 100
      }
    }
    ```
    </CodeGroup>
  </Col>
</Row>
---

<Heading
  url='/site'
  method='GET'
  title='Get Application WebApp Settings'
  name='#site'
/>
<Row>
  <Col>
  Used to get the WebApp settings of the application.
  ### Response
  - `title` (string) WebApp name
  - `chat_color_theme` (string) Chat color theme, in hex format
  - `chat_color_theme_inverted` (bool) Whether the chat color theme is inverted
  - `icon_type` (string) Icon type, `emoji` - emoji, `image` - picture
  - `icon` (string) Icon. If it's `emoji` type, it's an emoji symbol; if it's `image` type, it's an image URL.
  - `icon_background` (string) Background color in hex format
  - `icon_url` (string) Icon URL
  - `description` (string) Description
  - `copyright` (string) Copyright information
  - `privacy_policy` (string) Privacy policy link
  - `custom_disclaimer` (string) Custom disclaimer
  - `default_language` (string) Default language
  - `show_workflow_steps` (bool) Whether to show workflow details
  - `use_icon_as_answer_icon` (bool) Whether to replace 🤖 in chat with the WebApp icon
  </Col>
  <Col>
    <CodeGroup
      title="Request"
      tag="GET"
      label="/site"
      targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\
-H 'Authorization: Bearer {api_key}'`}
    />

    <CodeGroup title="Response">
    ```json {{ title: 'Response' }}
    {
      "title": "My App",
      "chat_color_theme": "#ff4a4a",
      "chat_color_theme_inverted": false,
      "icon_type": "emoji",
      "icon": "😄",
      "icon_background": "#FFEAD5",
      "icon_url": null,
      "description": "This is my app.",
      "copyright": "all rights reserved",
      "privacy_policy": "",
      "custom_disclaimer": "All generated by AI",
      "default_language": "en-US",
      "show_workflow_steps": false,
      "use_icon_as_answer_icon": false,
    }
    ```
    </CodeGroup>
  </Col>
</Row>
___
