202 lines
6.9 KiB
JSON
202 lines
6.9 KiB
JSON
{
|
|
"info": {
|
|
"name": "Bifrost V1 - VK Governance Routing",
|
|
"description": "VK provider_configs routing tests. Creates VK with provider restriction, validates routing via extra_fields.provider.",
|
|
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
},
|
|
"variable": [
|
|
{"key": "base_url", "value": "http://localhost:8080", "type": "string"},
|
|
{"key": "provider", "value": "openai", "type": "string"},
|
|
{"key": "chat_model", "value": "gpt-4o", "type": "string"},
|
|
{"key": "vk_value", "value": "", "type": "string"},
|
|
{"key": "vk_id", "value": "", "type": "string"}
|
|
],
|
|
"item": [
|
|
{
|
|
"name": "Setup - Create VK with provider config",
|
|
"event": [
|
|
{
|
|
"listen": "prerequest",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var ts = Date.now();",
|
|
"var body = {",
|
|
" name: 'Routing Test VK ' + ts,",
|
|
" provider_configs: [{",
|
|
" provider: pm.collectionVariables.get('provider') || 'openai',",
|
|
" weight: 1.0,",
|
|
" allowed_models: ['*'],",
|
|
" key_ids: ['*']",
|
|
" }]",
|
|
"};",
|
|
"pm.request.body.raw = JSON.stringify(body);"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var code = pm.response.code;",
|
|
"pm.test('Create VK returns 2xx', function() { pm.expect(code).to.be.within(200, 299); });",
|
|
"if (code >= 200 && code <= 299) {",
|
|
" var json = pm.response.json();",
|
|
" var vk = json.virtual_key || json;",
|
|
" if (vk.id) pm.collectionVariables.set('vk_id', vk.id);",
|
|
" if (vk.value) pm.collectionVariables.set('vk_value', vk.value);",
|
|
"}"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [{"key": "Content-Type", "value": "application/json"}],
|
|
"body": {"mode": "raw", "raw": "{}"},
|
|
"url": {
|
|
"raw": "{{base_url}}/api/governance/virtual-keys",
|
|
"host": ["{{base_url}}"],
|
|
"path": ["api", "governance", "virtual-keys"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "Chat Completion - model without provider prefix",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var code = pm.response.code;",
|
|
"pm.test('Status is 2xx', function() { pm.expect(code).to.be.within(200, 299); });",
|
|
"if (code >= 200 && code <= 299) {",
|
|
" var json = pm.response.json();",
|
|
" var extra = json.extra_fields || {};",
|
|
" var providerUsed = extra.provider;",
|
|
" var expected = (pm.collectionVariables.get('provider') || 'openai').toLowerCase();",
|
|
" pm.test('Provider matches VK config', function() {",
|
|
" pm.expect(String(providerUsed).toLowerCase()).to.equal(expected);",
|
|
" });",
|
|
"}"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{"key": "Content-Type", "value": "application/json"},
|
|
{"key": "x-bf-vk", "value": "{{vk_value}}"}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"model\": \"{{chat_model}}\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}],\n \"max_completion_tokens\": 10,\n \"stream\": false\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/chat/completions",
|
|
"host": ["{{base_url}}"],
|
|
"path": ["v1", "chat", "completions"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "Chat Completion - explicit provider prefix",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var code = pm.response.code;",
|
|
"pm.test('Status is 2xx', function() { pm.expect(code).to.be.within(200, 299); });",
|
|
"if (code >= 200 && code <= 299) {",
|
|
" var json = pm.response.json();",
|
|
" var extra = json.extra_fields || {};",
|
|
" var providerUsed = extra.provider;",
|
|
" var expected = (pm.collectionVariables.get('provider') || 'openai').toLowerCase();",
|
|
" pm.test('Provider matches VK config (explicit prefix)', function() {",
|
|
" pm.expect(String(providerUsed).toLowerCase()).to.equal(expected);",
|
|
" });",
|
|
"}"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{"key": "Content-Type", "value": "application/json"},
|
|
{"key": "x-bf-vk", "value": "{{vk_value}}"}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"model\": \"{{provider}}/{{chat_model}}\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}],\n \"max_completion_tokens\": 10,\n \"stream\": false\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/chat/completions",
|
|
"host": ["{{base_url}}"],
|
|
"path": ["v1", "chat", "completions"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "Chat Completion - blocked model (expect 403)",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var code = pm.response.code;",
|
|
"pm.test('Model blocked - expect 4xx', function() { pm.expect(code).to.be.oneOf([400, 403]); });"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{"key": "Content-Type", "value": "application/json"},
|
|
{"key": "x-bf-vk", "value": "{{vk_value}}"}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"model\": \"nonexistent-model\",\n \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}],\n \"max_completion_tokens\": 10,\n \"stream\": false\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/chat/completions",
|
|
"host": ["{{base_url}}"],
|
|
"path": ["v1", "chat", "completions"]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"name": "Teardown - Delete VK",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"var code = pm.response.code;",
|
|
"pm.test('Delete VK returns 2xx', function() { pm.expect(code).to.be.within(200, 299); });"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "DELETE",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/governance/virtual-keys/{{vk_id}}",
|
|
"host": ["{{base_url}}"],
|
|
"path": ["api", "governance", "virtual-keys", "{{vk_id}}"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|