{
  "info": {
    "_postman_id": "d6b9d630-cf2b-4fb0-aadb-97f0ab49f21b",
    "name": "TokenTool — минимальный публичный API",
    "description": "Подтверждённые маршруты: публичный каталог моделей и непотоковый текстовый запрос. Коллекция не содержит реальных ключей.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.tokentool.ru/api/v1",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "sk-tt-REPLACE_ME",
      "type": "string"
    },
    {
      "key": "model_id",
      "value": "provider/model-id",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Models — актуальный каталог",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200 и JSON', function () {",
              "  pm.response.to.have.status(200);",
              "  pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');",
              "});",
              "pm.test('Каталог имеет ожидаемую структуру', function () {",
              "  const body = pm.response.json();",
              "  pm.expect(body.data).to.be.an('array');",
              "  pm.expect(body.cached).to.be.a('boolean');",
              "  pm.expect(body.fetched_at).to.be.a('string');",
              "  if (body.data.length > 0) {",
              "    pm.expect(body.data[0].id).to.be.a('string');",
              "    pm.expect(body.data[0].name).to.be.a('string');",
              "    pm.expect(body.data[0].pricing_rub).to.be.an('object');",
              "  }",
              "});"
            ]
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [],
        "auth": {
          "type": "noauth"
        },
        "url": {
          "raw": "{{base_url}}/models",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "models"
          ]
        },
        "description": "Публичный каталог. Состав, цены и время снимка меняются; не закрепляйте количество моделей."
      },
      "response": []
    },
    {
      "name": "Chat Completions — непотоковый ответ",
      "event": [
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "const apiKey = pm.variables.get('api_key');",
              "const modelId = pm.variables.get('model_id');",
              "if (!apiKey || apiKey === 'sk-tt-REPLACE_ME') {",
              "  throw new Error('Задайте локальную переменную api_key перед запросом.');",
              "}",
              "if (!apiKey.startsWith('sk-tt-')) {",
              "  throw new Error('api_key должен быть ключом TokenTool.');",
              "}",
              "if (!modelId || modelId === 'provider/model-id') {",
              "  throw new Error('Задайте актуальную локальную переменную model_id.');",
              "}"
            ]
          }
        },
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', function () {",
              "  pm.response.to.have.status(200);",
              "});",
              "pm.test('JSON с текстовым ответом', function () {",
              "  const body = pm.response.json();",
              "  pm.expect(body).to.have.property('choices').that.is.an('array').and.is.not.empty;",
              "  pm.expect(body.choices[0]).to.have.nested.property('message.content').that.is.a('string');",
              "});"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json",
            "type": "text"
          }
        ],
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{api_key}}",
              "type": "string"
            }
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"model\": \"{{model_id}}\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Ответьте одним предложением: что такое API?\"\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        },
        "url": {
          "raw": "{{base_url}}/chat/completions",
          "host": [
            "{{base_url}}"
          ],
          "path": [
            "chat",
            "completions"
          ]
        },
        "description": "Минимальный непотоковый текстовый запрос TokenTool."
      },
      "response": []
    }
  ]
}
