@zuplo/lint-win32-x64 7.9.16 → 7.9.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -517,6 +517,131 @@
517
517
  }
518
518
  }
519
519
  },
520
+ {
521
+ "if": {
522
+ "properties": {
523
+ "policyType": {
524
+ "enum": [
525
+ "ai-gateway-load-balancing",
526
+ "ai-gateway-load-balancing-inbound"
527
+ ]
528
+ }
529
+ },
530
+ "required": ["policyType"]
531
+ },
532
+ "then": {
533
+ "properties": {
534
+ "handler": {
535
+ "properties": {
536
+ "options": {
537
+ "type": "object",
538
+ "additionalProperties": false,
539
+ "required": ["models"],
540
+ "properties": {
541
+ "strategy": {
542
+ "type": "string",
543
+ "title": "Strategy",
544
+ "description": "How the policy picks a model for each request. `round-robin` cycles through the list in order. `sticky` sends every request with the same key to the same model.",
545
+ "enum": ["round-robin", "sticky"],
546
+ "default": "round-robin"
547
+ },
548
+ "stickyBy": {
549
+ "type": "string",
550
+ "title": "Sticky By",
551
+ "description": "The key that `sticky` uses. `user` uses the authenticated caller, `request.user.sub`. `conversation` uses the conversation's system prompt and its first user message with text. `expression` uses the value that `expression` selects. Required when `strategy` is `sticky`, and not allowed with `round-robin`.",
552
+ "enum": ["user", "conversation", "expression"]
553
+ },
554
+ "expression": {
555
+ "type": "string",
556
+ "title": "Expression",
557
+ "description": "The value to key on, written like a {@link https://zuplo.com/docs/policies/ai-gateway-metering-inbound#budget-expressions|Metering budget expression}, such as `request.headers.get(\"x-end-user-id\")`. Required when `stickyBy` is `expression`, and not allowed otherwise.",
558
+ "minLength": 1
559
+ },
560
+ "models": {
561
+ "type": "object",
562
+ "title": "Models",
563
+ "description": "The models to spread requests across, by request type. Set at least one list.",
564
+ "additionalProperties": false,
565
+ "minProperties": 1,
566
+ "properties": {
567
+ "completions": {
568
+ "type": "array",
569
+ "title": "Completions Models",
570
+ "description": "Models for chat completions, Responses, Messages, and System One requests, as `providerName/model`. From 1 through 32 models, each listed once. Provider names aren't case-sensitive, so `openai/gpt-5` and `OpenAI/gpt-5` are the same model. Write each model ID exactly as your provider spells it.",
571
+ "minItems": 1,
572
+ "maxItems": 32,
573
+ "uniqueItems": true,
574
+ "items": {
575
+ "$ref": "#/$defs/ai-gateway-load-balancing/modelRef"
576
+ }
577
+ },
578
+ "embeddings": {
579
+ "type": "array",
580
+ "title": "Embeddings Models",
581
+ "description": "Models for embeddings requests, as `providerName/model`. From 1 through 32 models, each listed once. Provider names aren't case-sensitive. Write each model ID exactly as your provider spells it. Every entry must be the same embedding model, such as one model on several accounts.",
582
+ "minItems": 1,
583
+ "maxItems": 32,
584
+ "uniqueItems": true,
585
+ "items": {
586
+ "$ref": "#/$defs/ai-gateway-load-balancing/modelRef"
587
+ }
588
+ }
589
+ }
590
+ },
591
+ "fallbackTimeoutSeconds": {
592
+ "type": "integer",
593
+ "title": "Fallback Timeout Seconds",
594
+ "description": "How long to wait for a model to start responding before retrying the request on another model. Applies to chat completions and embeddings. The timeout ends when the response starts, so it doesn't cut off a long streaming response. A response that doesn't stream starts only when it's complete, so the timeout covers the whole response. From 1 through 300.",
595
+ "minimum": 1,
596
+ "maximum": 300,
597
+ "default": 60
598
+ }
599
+ },
600
+ "if": {
601
+ "required": ["strategy"],
602
+ "properties": {
603
+ "strategy": {
604
+ "const": "sticky"
605
+ }
606
+ }
607
+ },
608
+ "then": {
609
+ "required": ["stickyBy"],
610
+ "if": {
611
+ "required": ["stickyBy"],
612
+ "properties": {
613
+ "stickyBy": {
614
+ "const": "expression"
615
+ }
616
+ }
617
+ },
618
+ "then": {
619
+ "required": ["expression"]
620
+ },
621
+ "else": {
622
+ "not": {
623
+ "required": ["expression"]
624
+ }
625
+ }
626
+ },
627
+ "else": {
628
+ "not": {
629
+ "anyOf": [
630
+ {
631
+ "required": ["stickyBy"]
632
+ },
633
+ {
634
+ "required": ["expression"]
635
+ }
636
+ ]
637
+ }
638
+ }
639
+ }
640
+ }
641
+ }
642
+ }
643
+ }
644
+ },
520
645
  {
521
646
  "if": {
522
647
  "properties": {
@@ -1142,13 +1267,13 @@
1142
1267
  "adapter": {
1143
1268
  "type": "string",
1144
1269
  "enum": [
1145
- "chatCompletions",
1270
+ "chat-completions",
1146
1271
  "messages",
1147
- "systemOne"
1272
+ "system-one"
1148
1273
  ],
1149
- "default": "chatCompletions",
1274
+ "default": "chat-completions",
1150
1275
  "title": "Classifier App Adapter",
1151
- "description": "API contract exposed by the classifier app. chatCompletions calls /v1/chat/completions; messages calls /v1/messages for Claude models that support structured outputs (`output_config.format`), such as `claude-haiku-4-5`, on a provider whose Messages endpoint accepts them (not Amazon Bedrock Mantle); systemOne calls /v1/systemone for models such as Jev. The app owns provider credentials, pricing, metering and analytics."
1276
+ "description": "API contract exposed by the classifier app. `chat-completions` calls /v1/chat/completions; `messages` calls /v1/messages for Claude models that support structured outputs (`output_config.format`), such as `claude-haiku-4-5`, on a provider whose Messages endpoint accepts them (not Amazon Bedrock Mantle); `system-one` calls /v1/systemone for models such as Jev. The app owns provider credentials, pricing, metering and analytics."
1152
1277
  }
1153
1278
  }
1154
1279
  },
@@ -1185,7 +1310,7 @@
1185
1310
  "jev": {
1186
1311
  "type": "object",
1187
1312
  "title": "Jev (TypeSafe)",
1188
- "description": "Deprecated: use `classifier.app` with `adapter` `systemOne` instead. Classify with Jev, TypeSafe's classification model, by calling a System One API directly: TypeSafe's by default, or another host such as OpenRouter through `baseUrl`. Jev answers typed questions instead of generating text, so it takes no `classifierPrompt`.",
1313
+ "description": "Deprecated: use `classifier.app` with `adapter` `system-one` instead. Classify with Jev, TypeSafe's classification model, by calling a System One API directly: TypeSafe's by default, or another host such as OpenRouter through `baseUrl`. Jev answers typed questions instead of generating text, so it takes no `classifierPrompt`.",
1189
1314
  "additionalProperties": false,
1190
1315
  "required": ["apiKey"],
1191
1316
  "properties": {
@@ -1283,7 +1408,7 @@
1283
1408
  },
1284
1409
  "classifierPrompt": {
1285
1410
  "title": "Classifier Prompt",
1286
- "description": "Prompt for classifier.app (its default chatCompletions adapter or the messages adapter, where it is sent as the system prompt) and classifier.chatCompletions. Omit to use the built-in prompt. classifier.app.adapter systemOne and classifier.jev take no prompt; combining them with classifierPrompt is a configuration error.",
1411
+ "description": "Prompt for classifier.app (its default `chat-completions` adapter or the `messages` adapter, where it is sent as the system prompt) and classifier.chatCompletions. Omit to use the built-in prompt. classifier.app.adapter `system-one` and classifier.jev take no prompt; combining them with classifierPrompt is a configuration error.",
1287
1412
  "oneOf": [
1288
1413
  {
1289
1414
  "type": "string",
@@ -1364,7 +1489,7 @@
1364
1489
  "required": ["adapter"],
1365
1490
  "properties": {
1366
1491
  "adapter": {
1367
- "const": "systemOne"
1492
+ "const": "system-one"
1368
1493
  }
1369
1494
  }
1370
1495
  }
@@ -9417,6 +9542,14 @@
9417
9542
  }
9418
9543
  }
9419
9544
  },
9545
+ "ai-gateway-load-balancing": {
9546
+ "modelRef": {
9547
+ "type": "string",
9548
+ "title": "Provider and Model",
9549
+ "description": "A model reference in providerName/model form, split on the first slash.",
9550
+ "pattern": "^[^/\\s]+/.+$"
9551
+ }
9552
+ },
9420
9553
  "ai-gateway-metering": {
9421
9554
  "meteringBudgetRule": {
9422
9555
  "type": "object",
package/bin/version.txt CHANGED
@@ -1 +1 @@
1
- 7.9.16
1
+ 7.9.18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/lint-win32-x64",
3
- "version": "7.9.16",
3
+ "version": "7.9.18",
4
4
  "description": "The win32-x64 binary for zuplo-lint, the Zuplo API linter.",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",