{
  "info": {
    "_postman_id": "c7f1b40e-2a63-4d95-8e17-b53f9c2a6d81",
    "name": "Mira LLM",
    "description": "Our language model, on its own — one route, called three ways. If you are building agents on this platform the model is already underneath them and you do not need any of this; this collection is for teams who have their own stack and want the brain out of it.\n\n**Set up once.** Download the environment from the same page in your console, import it alongside this collection, select it, and fill in two of its values:\n\n* `base_url` — keep the address supplied by the console (live and trial workspaces can use different addresses)\n* `api_key` — mint one on the console's Developers page. It is shown once; only its hash is stored, so a lost key is rotated, never recovered.\n\n(`test_number` in that file belongs to the calling API and is unused here.)\n\nAuth is set at the collection level (`Authorization: Bearer {{api_key}}`), so no request carries a key of its own.\n\n**One route.** `POST /v1/chat/completions` — OpenAI's path and body, so a client that already speaks it changes its base URL and its model id and nothing else. `model` is `mira-llm`, and that is the only value the route accepts: there is no picker, and a request naming anything else is refused rather than quietly mapped onto whatever we happen to be running.\n\n**What it is for.** It was built for voice agents in India, and that sets both of its priorities. Time to first token is 89 ms measured at the gateway, because the pause a caller sits through is the product. Tool calling is native OpenAI rather than a text convention, because a function call parsed out of prose eventually gets spoken aloud. It is at its best in Hinglish — code-mixed Hindi and English, either script, one sentence.\n\nSix fields are forwarded upstream and no others: `messages`, `tools`, `tool_choice`, `temperature`, `max_tokens`, `stream`. Anything else in the body is dropped rather than passed on — including, especially, anything naming a model or a host. A body copied from another provider will run; it will just have fewer settings in effect than it thinks.\n\n**Free while in beta.** No billing, no wallet check, no per-token price — nothing in this collection costs anything to send. There is a per-workspace rate limit instead, and it answers 429 with `Retry-After` when you cross it.\n\nErrors are always `{\"error\": {\"code\", \"message\"}}`, so you can branch on `error.code` without parsing prose: `invalid_request` (400), `unauthorized` (401), `rate_limited` (429), `upstream_error` (502, which carries a `correlation_id` worth quoting at us), `unavailable` (503).\n\nThe playground these examples were taken from is the LLM tab in the console.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://sandbox.voice.miraiminds.co",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "sk_live_REPLACE_ME",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Chat completion",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/v1/chat/completions",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "v1",
            "chat",
            "completions"
          ]
        },
        "description": "A plain completion. The whole reply arrives as one JSON object once the model has finished, which is what you want for work nobody is waiting on — classification, extraction, the analysis pass after a call. For anything a person is listening to, use the streaming request instead.\n\n`model` must be `mira-llm`. `temperature` and `max_tokens` are the only generation controls forwarded upstream; `top_p`, the penalties and the rest are dropped on the floor, so a body written for another provider runs but quietly ignores half of what you set.\n\nThe exchange below is the case this model was built for: an English system prompt, a customer writing half in Devanagari and half in Latin, and a reply that stays in the register the customer used. Most models answer Hinglish in formal Hindi, and on a phone call that is instantly audible as a machine.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a customer support agent for Kirana Kart, an Indian online grocery brand. Reply in the same mix of Hindi and English the customer uses. Keep it to three sentences. Never state an order status you have not been given.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"भाई मेरा order अभी तक नहीं आया, कल delivery date था. अब कहाँ tak pahuncha hai?\"\n    }\n  ],\n  \"temperature\": 0.3,\n  \"max_tokens\": 200\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [
        {
          "name": "200 — the reply, in the register it was asked in",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "A plain completion. The whole reply arrives as one JSON object once the model has finished, which is what you want for work nobody is waiting on — classification, extraction, the analysis pass after a call. For anything a person is listening to, use the streaming request instead.\n\n`model` must be `mira-llm`. `temperature` and `max_tokens` are the only generation controls forwarded upstream; `top_p`, the penalties and the rest are dropped on the floor, so a body written for another provider runs but quietly ignores half of what you set.\n\nThe exchange below is the case this model was built for: an English system prompt, a customer writing half in Devanagari and half in Latin, and a reply that stays in the register the customer used. Most models answer Hinglish in formal Hindi, and on a phone call that is instantly audible as a machine.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a customer support agent for Kirana Kart, an Indian online grocery brand. Reply in the same mix of Hindi and English the customer uses. Keep it to three sentences. Never state an order status you have not been given.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"भाई मेरा order अभी तक नहीं आया, कल delivery date था. अब कहाँ tak pahuncha hai?\"\n    }\n  ],\n  \"temperature\": 0.3,\n  \"max_tokens\": 200\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            },
            {
              "key": "Cache-Control",
              "value": "no-store"
            }
          ],
          "cookie": [],
          "body": "{\n  \"id\": \"chatcmpl-01K3A7QF2M8N4P6R9T1V3W5X7Y\",\n  \"object\": \"chat.completion\",\n  \"created\": 1755849600,\n  \"model\": \"mira-llm\",\n  \"choices\": [\n    {\n      \"index\": 0,\n      \"message\": {\n        \"role\": \"assistant\",\n        \"content\": \"Sorry sir, delay के लिए माफ़ी. मैं अभी check कर लेता हूँ — आप order number बता दीजिए. उसके बाद exact status और नई delivery date दोनों बता दूंगा.\"\n      },\n      \"finish_reason\": \"stop\"\n    }\n  ],\n  \"usage\": {\n    \"prompt_tokens\": 98,\n    \"completion_tokens\": 52,\n    \"total_tokens\": 150\n  }\n}"
        },
        {
          "name": "400 — a model this route does not serve",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "A plain completion. The whole reply arrives as one JSON object once the model has finished, which is what you want for work nobody is waiting on — classification, extraction, the analysis pass after a call. For anything a person is listening to, use the streaming request instead.\n\n`model` must be `mira-llm`. `temperature` and `max_tokens` are the only generation controls forwarded upstream; `top_p`, the penalties and the rest are dropped on the floor, so a body written for another provider runs but quietly ignores half of what you set.\n\nThe exchange below is the case this model was built for: an English system prompt, a customer writing half in Devanagari and half in Latin, and a reply that stays in the register the customer used. Most models answer Hinglish in formal Hindi, and on a phone call that is instantly audible as a machine.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"gpt-4o-mini\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"मेरा order कहाँ है?\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "Bad Request",
          "code": 400,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"error\": {\n    \"code\": \"invalid_request\",\n    \"message\": \"model 'gpt-4o-mini' is not available. The only accepted model is 'mira-llm'.\"\n  }\n}"
        },
        {
          "name": "401 — no key, or a revoked one",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "A plain completion. The whole reply arrives as one JSON object once the model has finished, which is what you want for work nobody is waiting on — classification, extraction, the analysis pass after a call. For anything a person is listening to, use the streaming request instead.\n\n`model` must be `mira-llm`. `temperature` and `max_tokens` are the only generation controls forwarded upstream; `top_p`, the penalties and the rest are dropped on the floor, so a body written for another provider runs but quietly ignores half of what you set.\n\nThe exchange below is the case this model was built for: an English system prompt, a customer writing half in Devanagari and half in Latin, and a reply that stays in the register the customer used. Most models answer Hinglish in formal Hindi, and on a phone call that is instantly audible as a machine.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a customer support agent for Kirana Kart, an Indian online grocery brand. Reply in the same mix of Hindi and English the customer uses. Keep it to three sentences. Never state an order status you have not been given.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"भाई मेरा order अभी तक नहीं आया, कल delivery date था. अब कहाँ tak pahuncha hai?\"\n    }\n  ],\n  \"temperature\": 0.3,\n  \"max_tokens\": 200\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "Unauthorized",
          "code": 401,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            }
          ],
          "cookie": [],
          "body": "{\n  \"error\": {\n    \"code\": \"unauthorized\",\n    \"message\": \"Unknown or invalid key.\"\n  }\n}"
        }
      ]
    },
    {
      "name": "Chat completion with tools",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/v1/chat/completions",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "v1",
            "chat",
            "completions"
          ]
        },
        "description": "The reason this model exists in a voice product. Tool calling is native OpenAI: you send a `tools` array of function schemas, and when the model decides one applies it answers with `tool_calls` instead of prose and stops with `finish_reason: \"tool_calls\"`.\n\nWhat matters is what that does to unstructured speech. The user turn below is what a caller actually says — a day named in words, a time named loosely, two languages in one sentence, no field labels anywhere — and what comes back is `book_slot` carrying an ISO date and a normalised window. The extraction is the work; the function call is only where the answer is put.\n\n**`function.arguments` is a JSON-encoded string, not an object.** This is OpenAI's shape and it catches people out in every language: you have to `json.loads` or `JSON.parse` it before you can read a field. It is a string on purpose — a model can emit malformed JSON, and a string lets you catch that yourself instead of having the parse blow up somewhere inside your HTTP client, on a turn a caller is waiting through.\n\n`tool_choice: \"auto\"` leaves the model free to answer in prose when no tool fits, which is what you want on a live call: forcing a call on a turn that was just \"हाँ ठीक है\" produces an invented argument. Reach for `\"required\"` only when the turn genuinely cannot end any other way.\n\nThe second example is the other half of the round trip. You run the function yourself, append the assistant message back verbatim — `tool_calls` and all — then a `tool` message carrying the matching `tool_call_id` and your result as a string, and post the whole list again. The model reads the result and says it out loud.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a service booking agent for Kirana Kart. Today is Friday, 2026-08-22. Use a tool whenever the customer asks for something one of them covers, and resolve relative days against today's date. Confirm nothing you have not been told.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"कल शाम को koi slot mil jaayega kya? Mujhe चार बजे के बाद hi convenient hai, naam Rakesh Sharma.\"\n    }\n  ],\n  \"tools\": [\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"check_order_status\",\n        \"description\": \"Look up the current status and expected delivery date of an order.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"order_id\": {\n              \"type\": \"string\",\n              \"description\": \"The order number the customer gives, e.g. KK-88213.\"\n            }\n          },\n          \"required\": [\n            \"order_id\"\n          ]\n        }\n      }\n    },\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"book_slot\",\n        \"description\": \"Book a service visit. Resolve relative days the customer says (\\\"kal\\\", \\\"parson\\\") against today's date before calling.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"date\": {\n              \"type\": \"string\",\n              \"description\": \"The visit date as YYYY-MM-DD.\"\n            },\n            \"time_window\": {\n              \"type\": \"string\",\n              \"description\": \"A four-hour window as HH:MM-HH:MM, 24-hour clock, e.g. 16:00-20:00.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The customer's name, if they have said it.\"\n            }\n          },\n          \"required\": [\n            \"date\",\n            \"time_window\"\n          ]\n        }\n      }\n    }\n  ],\n  \"tool_choice\": \"auto\",\n  \"temperature\": 0.2,\n  \"max_tokens\": 300\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [
        {
          "name": "200 — a booking extracted out of spoken Hinglish",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "The reason this model exists in a voice product. Tool calling is native OpenAI: you send a `tools` array of function schemas, and when the model decides one applies it answers with `tool_calls` instead of prose and stops with `finish_reason: \"tool_calls\"`.\n\nWhat matters is what that does to unstructured speech. The user turn below is what a caller actually says — a day named in words, a time named loosely, two languages in one sentence, no field labels anywhere — and what comes back is `book_slot` carrying an ISO date and a normalised window. The extraction is the work; the function call is only where the answer is put.\n\n**`function.arguments` is a JSON-encoded string, not an object.** This is OpenAI's shape and it catches people out in every language: you have to `json.loads` or `JSON.parse` it before you can read a field. It is a string on purpose — a model can emit malformed JSON, and a string lets you catch that yourself instead of having the parse blow up somewhere inside your HTTP client, on a turn a caller is waiting through.\n\n`tool_choice: \"auto\"` leaves the model free to answer in prose when no tool fits, which is what you want on a live call: forcing a call on a turn that was just \"हाँ ठीक है\" produces an invented argument. Reach for `\"required\"` only when the turn genuinely cannot end any other way.\n\nThe second example is the other half of the round trip. You run the function yourself, append the assistant message back verbatim — `tool_calls` and all — then a `tool` message carrying the matching `tool_call_id` and your result as a string, and post the whole list again. The model reads the result and says it out loud.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a service booking agent for Kirana Kart. Today is Friday, 2026-08-22. Use a tool whenever the customer asks for something one of them covers, and resolve relative days against today's date. Confirm nothing you have not been told.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"कल शाम को koi slot mil jaayega kya? Mujhe चार बजे के बाद hi convenient hai, naam Rakesh Sharma.\"\n    }\n  ],\n  \"tools\": [\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"check_order_status\",\n        \"description\": \"Look up the current status and expected delivery date of an order.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"order_id\": {\n              \"type\": \"string\",\n              \"description\": \"The order number the customer gives, e.g. KK-88213.\"\n            }\n          },\n          \"required\": [\n            \"order_id\"\n          ]\n        }\n      }\n    },\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"book_slot\",\n        \"description\": \"Book a service visit. Resolve relative days the customer says (\\\"kal\\\", \\\"parson\\\") against today's date before calling.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"date\": {\n              \"type\": \"string\",\n              \"description\": \"The visit date as YYYY-MM-DD.\"\n            },\n            \"time_window\": {\n              \"type\": \"string\",\n              \"description\": \"A four-hour window as HH:MM-HH:MM, 24-hour clock, e.g. 16:00-20:00.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The customer's name, if they have said it.\"\n            }\n          },\n          \"required\": [\n            \"date\",\n            \"time_window\"\n          ]\n        }\n      }\n    }\n  ],\n  \"tool_choice\": \"auto\",\n  \"temperature\": 0.2,\n  \"max_tokens\": 300\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            },
            {
              "key": "Cache-Control",
              "value": "no-store"
            }
          ],
          "cookie": [],
          "body": "{\n  \"id\": \"chatcmpl-01K3A7RD5N9P2Q4S6T8V0W2X4Z\",\n  \"object\": \"chat.completion\",\n  \"created\": 1755849712,\n  \"model\": \"mira-llm\",\n  \"choices\": [\n    {\n      \"index\": 0,\n      \"message\": {\n        \"role\": \"assistant\",\n        \"content\": null,\n        \"tool_calls\": [\n          {\n            \"id\": \"call_01K3A7RDBQ7YHN4F2K6M8P0R\",\n            \"type\": \"function\",\n            \"function\": {\n              \"name\": \"book_slot\",\n              \"arguments\": \"{\\\"date\\\": \\\"2026-08-23\\\", \\\"time_window\\\": \\\"16:00-20:00\\\", \\\"name\\\": \\\"Rakesh Sharma\\\"}\"\n            }\n          }\n        ]\n      },\n      \"finish_reason\": \"tool_calls\"\n    }\n  ],\n  \"usage\": {\n    \"prompt_tokens\": 231,\n    \"completion_tokens\": 38,\n    \"total_tokens\": 269\n  }\n}"
        },
        {
          "name": "200 — the follow-up turn, once you have run the function",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "The reason this model exists in a voice product. Tool calling is native OpenAI: you send a `tools` array of function schemas, and when the model decides one applies it answers with `tool_calls` instead of prose and stops with `finish_reason: \"tool_calls\"`.\n\nWhat matters is what that does to unstructured speech. The user turn below is what a caller actually says — a day named in words, a time named loosely, two languages in one sentence, no field labels anywhere — and what comes back is `book_slot` carrying an ISO date and a normalised window. The extraction is the work; the function call is only where the answer is put.\n\n**`function.arguments` is a JSON-encoded string, not an object.** This is OpenAI's shape and it catches people out in every language: you have to `json.loads` or `JSON.parse` it before you can read a field. It is a string on purpose — a model can emit malformed JSON, and a string lets you catch that yourself instead of having the parse blow up somewhere inside your HTTP client, on a turn a caller is waiting through.\n\n`tool_choice: \"auto\"` leaves the model free to answer in prose when no tool fits, which is what you want on a live call: forcing a call on a turn that was just \"हाँ ठीक है\" produces an invented argument. Reach for `\"required\"` only when the turn genuinely cannot end any other way.\n\nThe second example is the other half of the round trip. You run the function yourself, append the assistant message back verbatim — `tool_calls` and all — then a `tool` message carrying the matching `tool_call_id` and your result as a string, and post the whole list again. The model reads the result and says it out loud.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a service booking agent for Kirana Kart. Today is Friday, 2026-08-22. Use a tool whenever the customer asks for something one of them covers, and resolve relative days against today's date. Confirm nothing you have not been told.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"कल शाम को koi slot mil jaayega kya? Mujhe चार बजे के बाद hi convenient hai, naam Rakesh Sharma.\"\n    },\n    {\n      \"role\": \"assistant\",\n      \"content\": null,\n      \"tool_calls\": [\n        {\n          \"id\": \"call_01K3A7RDBQ7YHN4F2K6M8P0R\",\n          \"type\": \"function\",\n          \"function\": {\n            \"name\": \"book_slot\",\n            \"arguments\": \"{\\\"date\\\": \\\"2026-08-23\\\", \\\"time_window\\\": \\\"16:00-20:00\\\", \\\"name\\\": \\\"Rakesh Sharma\\\"}\"\n          }\n        }\n      ]\n    },\n    {\n      \"role\": \"tool\",\n      \"tool_call_id\": \"call_01K3A7RDBQ7YHN4F2K6M8P0R\",\n      \"name\": \"book_slot\",\n      \"content\": \"{\\\"booked\\\": true, \\\"slot_id\\\": \\\"slt_8813\\\", \\\"date\\\": \\\"2026-08-23\\\", \\\"time_window\\\": \\\"16:00-20:00\\\", \\\"engineer\\\": \\\"Imran\\\"}\"\n    }\n  ],\n  \"tools\": [\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"check_order_status\",\n        \"description\": \"Look up the current status and expected delivery date of an order.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"order_id\": {\n              \"type\": \"string\",\n              \"description\": \"The order number the customer gives, e.g. KK-88213.\"\n            }\n          },\n          \"required\": [\n            \"order_id\"\n          ]\n        }\n      }\n    },\n    {\n      \"type\": \"function\",\n      \"function\": {\n        \"name\": \"book_slot\",\n        \"description\": \"Book a service visit. Resolve relative days the customer says (\\\"kal\\\", \\\"parson\\\") against today's date before calling.\",\n        \"parameters\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"date\": {\n              \"type\": \"string\",\n              \"description\": \"The visit date as YYYY-MM-DD.\"\n            },\n            \"time_window\": {\n              \"type\": \"string\",\n              \"description\": \"A four-hour window as HH:MM-HH:MM, 24-hour clock, e.g. 16:00-20:00.\"\n            },\n            \"name\": {\n              \"type\": \"string\",\n              \"description\": \"The customer's name, if they have said it.\"\n            }\n          },\n          \"required\": [\n            \"date\",\n            \"time_window\"\n          ]\n        }\n      }\n    }\n  ],\n  \"tool_choice\": \"auto\",\n  \"temperature\": 0.2,\n  \"max_tokens\": 300\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "json",
          "header": [
            {
              "key": "Content-Type",
              "value": "application/json"
            },
            {
              "key": "Cache-Control",
              "value": "no-store"
            }
          ],
          "cookie": [],
          "body": "{\n  \"id\": \"chatcmpl-01K3A7RJ7P1Q3S5T7V9W1X3Y5A\",\n  \"object\": \"chat.completion\",\n  \"created\": 1755849729,\n  \"model\": \"mira-llm\",\n  \"choices\": [\n    {\n      \"index\": 0,\n      \"message\": {\n        \"role\": \"assistant\",\n        \"content\": \"हो गया Rakesh जी — कल यानी 23 August, शाम 4 से 8 के बीच का slot book है. Engineer Imran आएंगे, आने से पहले call कर लेंगे.\"\n      },\n      \"finish_reason\": \"stop\"\n    }\n  ],\n  \"usage\": {\n    \"prompt_tokens\": 312,\n    \"completion_tokens\": 47,\n    \"total_tokens\": 359\n  }\n}"
        }
      ]
    },
    {
      "name": "Chat completion (streaming)",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{base_url}}/v1/chat/completions",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "v1",
            "chat",
            "completions"
          ]
        },
        "description": "The same route with `\"stream\": true`, and the one to use whenever a person is waiting. First token leaves the gateway in 89 ms, which only buys you anything if you start speaking on the first chunk rather than the last.\n\nThe reply is Server-Sent Events, `Content-Type: text/event-stream`. Every event is a line beginning `data: ` carrying one `chat.completion.chunk` object — same `id` throughout, same shape as the non-streaming reply except that the text arrives in `choices[0].delta` rather than `choices[0].message`. The first chunk usually carries only `role` and no content, the middle chunks carry `delta.content` fragments you concatenate in order, and the last carries an empty delta and the `finish_reason`.\n\nThe stream then ends with the literal line `data: [DONE]`. That sentinel is not JSON — handle it before you hand the line to a parser, or the last line of every successful stream throws.\n\nTool calls stream as well, as `delta.tool_calls` fragments carrying an `index`. The `arguments` string arrives in pieces and has to be joined per index before it can be parsed, which is a second reason it is a string.\n\nIf you are feeding a synthesiser, buffer the deltas to a sentence boundary before you send them on. A TTS request per token spends more time in HTTP than in speech, and the audio arrives later than if you had waited.\n\nPostman renders this as one finished blob rather than as it arrives. To watch the actual timing, send it with `curl --no-buffer`.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a customer support agent for Kirana Kart. Reply in the same mix of Hindi and English the customer uses. Keep it short — this is going to be spoken aloud.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Mera refund kab tak aayega? Order return किए हुए चार दिन हो गए.\"\n    }\n  ],\n  \"stream\": true,\n  \"temperature\": 0.3,\n  \"max_tokens\": 200\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [
        {
          "name": "200 — text/event-stream, chunk by chunk to [DONE]",
          "originalRequest": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/chat/completions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "The same route with `\"stream\": true`, and the one to use whenever a person is waiting. First token leaves the gateway in 89 ms, which only buys you anything if you start speaking on the first chunk rather than the last.\n\nThe reply is Server-Sent Events, `Content-Type: text/event-stream`. Every event is a line beginning `data: ` carrying one `chat.completion.chunk` object — same `id` throughout, same shape as the non-streaming reply except that the text arrives in `choices[0].delta` rather than `choices[0].message`. The first chunk usually carries only `role` and no content, the middle chunks carry `delta.content` fragments you concatenate in order, and the last carries an empty delta and the `finish_reason`.\n\nThe stream then ends with the literal line `data: [DONE]`. That sentinel is not JSON — handle it before you hand the line to a parser, or the last line of every successful stream throws.\n\nTool calls stream as well, as `delta.tool_calls` fragments carrying an `index`. The `arguments` string arrives in pieces and has to be joined per index before it can be parsed, which is a second reason it is a string.\n\nIf you are feeding a synthesiser, buffer the deltas to a sentence boundary before you send them on. A TTS request per token spends more time in HTTP than in speech, and the audio arrives later than if you had waited.\n\nPostman renders this as one finished blob rather than as it arrives. To watch the actual timing, send it with `curl --no-buffer`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"model\": \"mira-llm\",\n  \"messages\": [\n    {\n      \"role\": \"system\",\n      \"content\": \"You are a customer support agent for Kirana Kart. Reply in the same mix of Hindi and English the customer uses. Keep it short — this is going to be spoken aloud.\"\n    },\n    {\n      \"role\": \"user\",\n      \"content\": \"Mera refund kab tak aayega? Order return किए हुए चार दिन हो गए.\"\n    }\n  ],\n  \"stream\": true,\n  \"temperature\": 0.3,\n  \"max_tokens\": 200\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "status": "OK",
          "code": 200,
          "_postman_previewlanguage": "text",
          "header": [
            {
              "key": "Content-Type",
              "value": "text/event-stream"
            },
            {
              "key": "Cache-Control",
              "value": "no-store"
            },
            {
              "key": "Connection",
              "value": "keep-alive"
            },
            {
              "key": "X-Accel-Buffering",
              "value": "no"
            }
          ],
          "cookie": [],
          "body": "data: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":\"\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"Refund\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" process\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" में\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" है\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" sir\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" — return\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" pickup\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" के\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" 5-7\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" working\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" days\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" में\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" account\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" में\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" आ\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\" जाएगा\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\".\"},\"finish_reason\":null}]}\n\ndata: {\"id\":\"chatcmpl-01K3A7SZ4M6N8P0Q2R4S6T8V0W\",\"object\":\"chat.completion.chunk\",\"created\":1755849810,\"model\":\"mira-llm\",\"choices\":[{\"index\":0,\"delta\":{},\"finish_reason\":\"stop\"}]}\n\ndata: [DONE]\n\n"
        }
      ]
    }
  ]
}
