@kaana.ai/contracts 8.4.0 → 8.5.0

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.
package/dist/index.d.ts CHANGED
@@ -24,6 +24,7 @@ export * from './public/images.js';
24
24
  export * from './public/messages.js';
25
25
  export * from './public/money.js';
26
26
  export * from './public/policy.js';
27
+ export * from './public/providerPreferences.js';
27
28
  export * from './public/realtime.js';
28
29
  export * from './public/responses.js';
29
30
  export * from './public/streamEvents.js';
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ export * from './public/images.js';
24
24
  export * from './public/messages.js';
25
25
  export * from './public/money.js';
26
26
  export * from './public/policy.js';
27
+ export * from './public/providerPreferences.js';
27
28
  export * from './public/realtime.js';
28
29
  export * from './public/responses.js';
29
30
  export * from './public/streamEvents.js';
@@ -314,10 +314,10 @@ export declare const routingProfileSchema: z.ZodObject<{
314
314
  displayName: z.ZodString;
315
315
  description: z.ZodOptional<z.ZodString>;
316
316
  optimiseFor: z.ZodEnum<{
317
- quality: "quality";
318
- price: "price";
319
317
  latency: "latency";
320
318
  throughput: "throughput";
319
+ quality: "quality";
320
+ price: "price";
321
321
  balanced: "balanced";
322
322
  }>;
323
323
  candidates: z.ZodArray<z.ZodObject<{
@@ -2,9 +2,10 @@
2
2
  * `POST /v1/chat/completions` — the OpenAI-compatible surface.
3
3
  *
4
4
  * It speaks the flat OpenAI request and response shapes so an unmodified OpenAI
5
- * SDK works against `baseURL: 'https://kaana.ai/v1'` with an `oxy_sk_…` key, and
6
- * it gains NO Kaana-specific request field: a capability with no OpenAI
7
- * representation lives on `/v1/responses`. `.strict()` everywhere: a stock SDK
5
+ * SDK works against `baseURL: 'https://kaana.ai/v1'` with an `oxy_sk_…` key. Its
6
+ * one extension is `provider`, the OpenRouter-style routing preference (ADR
7
+ * 0008); every other capability with no OpenAI representation lives on
8
+ * `/v1/responses`. `.strict()` everywhere: a stock SDK
8
9
  * sending a parameter Kaana does not implement is told so rather than having it
9
10
  * silently dropped.
10
11
  *
@@ -214,6 +215,34 @@ export declare const chatCompletionsRequestSchema: z.ZodObject<{
214
215
  }>;
215
216
  }, z.core.$strict>>;
216
217
  user: z.ZodOptional<z.ZodString>;
218
+ provider: z.ZodOptional<z.ZodObject<{
219
+ order: z.ZodOptional<z.ZodArray<z.ZodString>>;
220
+ only: z.ZodOptional<z.ZodArray<z.ZodString>>;
221
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString>>;
222
+ allow_fallbacks: z.ZodOptional<z.ZodBoolean>;
223
+ require_parameters: z.ZodOptional<z.ZodBoolean>;
224
+ quantizations: z.ZodOptional<z.ZodArray<z.ZodEnum<{
225
+ unknown: "unknown";
226
+ int4: "int4";
227
+ int8: "int8";
228
+ fp4: "fp4";
229
+ mxfp4: "mxfp4";
230
+ nvfp4: "nvfp4";
231
+ fp6: "fp6";
232
+ fp8: "fp8";
233
+ mxfp8: "mxfp8";
234
+ fp16: "fp16";
235
+ bf16: "bf16";
236
+ fp32: "fp32";
237
+ }>>>;
238
+ sort: z.ZodOptional<z.ZodEnum<{
239
+ latency: "latency";
240
+ throughput: "throughput";
241
+ }>>;
242
+ preferred_max_latency: z.ZodOptional<z.ZodNumber>;
243
+ preferred_min_throughput: z.ZodOptional<z.ZodNumber>;
244
+ }, z.core.$strict>>;
245
+ prompt_cache_key: z.ZodOptional<z.ZodString>;
217
246
  }, z.core.$strict>;
218
247
  /** OpenAI's usage block, with the audio members only when audio tokens were metered. */
219
248
  export declare const chatCompletionUsageSchema: z.ZodObject<{
@@ -2,9 +2,10 @@
2
2
  * `POST /v1/chat/completions` — the OpenAI-compatible surface.
3
3
  *
4
4
  * It speaks the flat OpenAI request and response shapes so an unmodified OpenAI
5
- * SDK works against `baseURL: 'https://kaana.ai/v1'` with an `oxy_sk_…` key, and
6
- * it gains NO Kaana-specific request field: a capability with no OpenAI
7
- * representation lives on `/v1/responses`. `.strict()` everywhere: a stock SDK
5
+ * SDK works against `baseURL: 'https://kaana.ai/v1'` with an `oxy_sk_…` key. Its
6
+ * one extension is `provider`, the OpenRouter-style routing preference (ADR
7
+ * 0008); every other capability with no OpenAI representation lives on
8
+ * `/v1/responses`. `.strict()` everywhere: a stock SDK
8
9
  * sending a parameter Kaana does not implement is told so rather than having it
9
10
  * silently dropped.
10
11
  *
@@ -18,6 +19,7 @@ import { maxUtf16Length, minUtf16Length } from '../stringBounds.js';
18
19
  import { reasoningEffortSchema } from './catalogue.js';
19
20
  import { publicErrorCodeSchema } from './errors.js';
20
21
  import { inferenceContentPartSchema } from './messages.js';
22
+ import { promptCacheKeySchema, providerPreferencesSchema } from './providerPreferences.js';
21
23
  import { modelTargetSchema } from './responses.js';
22
24
  /** `stop` in the OpenAI dialect: one sequence or a list of them. */
23
25
  const openAiStopSchema = z.union([
@@ -139,6 +141,10 @@ export const chatCompletionsRequestSchema = z
139
141
  * only. `X-Oxy-User-Id` wins when both are present.
140
142
  */
141
143
  user: z.string().check(minUtf16Length(1)).check(maxUtf16Length(64)).optional(),
144
+ /** Routing preferences that can only narrow what the grant admits (ADR 0008). */
145
+ provider: providerPreferencesSchema.optional(),
146
+ /** OpenAI's field: keeps requests sharing a prompt prefix on one deployment. */
147
+ prompt_cache_key: promptCacheKeySchema.optional(),
142
148
  })
143
149
  .strict()
144
150
  .superRefine((request, ctx) => {
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The `provider` object a caller may send on `POST /v1/chat/completions` and
3
+ * `POST /v1/responses` (Kaana ADR 0008, decision 6).
4
+ *
5
+ * It is a preference that can only NARROW. Oxy signs what a request may use and
6
+ * Kaana resolves the grant into routes; this object filters or reorders what
7
+ * the grant already admitted. It cannot add a provider, region, funding tier or
8
+ * price the grant did not, and a request it leaves with no route is refused
9
+ * rather than widened.
10
+ *
11
+ * The names are OpenRouter's, so a client written for OpenRouter's `provider`
12
+ * object works, and only the controls Kaana can honour are accepted:
13
+ * `sort: "price"`, `max_price`, `zdr`, `data_collection`, `preferred_*` with a
14
+ * percentile object, and `enforce_distillable_text` are refused by `.strict()`
15
+ * rather than silently ignored. `max_price` and the data policy stay Oxy's:
16
+ * Kaana never prices, and Oxy applies data policy when it computes the grant.
17
+ *
18
+ * Provider names here are Kaana provider slugs as a caller sees them in the
19
+ * catalogue. A response never names one.
20
+ */
21
+ import { z } from 'zod';
22
+ /** Quantization levels a route can be published at (the OpenRouter vocabulary). */
23
+ export declare const providerQuantizationSchema: z.ZodEnum<{
24
+ unknown: "unknown";
25
+ int4: "int4";
26
+ int8: "int8";
27
+ fp4: "fp4";
28
+ mxfp4: "mxfp4";
29
+ nvfp4: "nvfp4";
30
+ fp6: "fp6";
31
+ fp8: "fp8";
32
+ mxfp8: "mxfp8";
33
+ fp16: "fp16";
34
+ bf16: "bf16";
35
+ fp32: "fp32";
36
+ }>;
37
+ export declare const providerPreferencesSchema: z.ZodObject<{
38
+ order: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ only: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ allow_fallbacks: z.ZodOptional<z.ZodBoolean>;
42
+ require_parameters: z.ZodOptional<z.ZodBoolean>;
43
+ quantizations: z.ZodOptional<z.ZodArray<z.ZodEnum<{
44
+ unknown: "unknown";
45
+ int4: "int4";
46
+ int8: "int8";
47
+ fp4: "fp4";
48
+ mxfp4: "mxfp4";
49
+ nvfp4: "nvfp4";
50
+ fp6: "fp6";
51
+ fp8: "fp8";
52
+ mxfp8: "mxfp8";
53
+ fp16: "fp16";
54
+ bf16: "bf16";
55
+ fp32: "fp32";
56
+ }>>>;
57
+ sort: z.ZodOptional<z.ZodEnum<{
58
+ latency: "latency";
59
+ throughput: "throughput";
60
+ }>>;
61
+ preferred_max_latency: z.ZodOptional<z.ZodNumber>;
62
+ preferred_min_throughput: z.ZodOptional<z.ZodNumber>;
63
+ }, z.core.$strict>;
64
+ export type ProviderPreferences = z.infer<typeof providerPreferencesSchema>;
65
+ /**
66
+ * An opaque caller-chosen string that groups requests sharing a prompt prefix.
67
+ * Kaana keeps such requests on the deployment that last served them while it is
68
+ * still admitted, so the provider's prompt cache stays warm. It is never stored
69
+ * with a prompt and never leaves Kaana.
70
+ */
71
+ export declare const promptCacheKeySchema: z.ZodString;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * The `provider` object a caller may send on `POST /v1/chat/completions` and
3
+ * `POST /v1/responses` (Kaana ADR 0008, decision 6).
4
+ *
5
+ * It is a preference that can only NARROW. Oxy signs what a request may use and
6
+ * Kaana resolves the grant into routes; this object filters or reorders what
7
+ * the grant already admitted. It cannot add a provider, region, funding tier or
8
+ * price the grant did not, and a request it leaves with no route is refused
9
+ * rather than widened.
10
+ *
11
+ * The names are OpenRouter's, so a client written for OpenRouter's `provider`
12
+ * object works, and only the controls Kaana can honour are accepted:
13
+ * `sort: "price"`, `max_price`, `zdr`, `data_collection`, `preferred_*` with a
14
+ * percentile object, and `enforce_distillable_text` are refused by `.strict()`
15
+ * rather than silently ignored. `max_price` and the data policy stay Oxy's:
16
+ * Kaana never prices, and Oxy applies data policy when it computes the grant.
17
+ *
18
+ * Provider names here are Kaana provider slugs as a caller sees them in the
19
+ * catalogue. A response never names one.
20
+ */
21
+ import { z } from 'zod';
22
+ import { maxUtf16Length, minUtf16Length } from '../stringBounds.js';
23
+ const providerSlugSchema = z
24
+ .string()
25
+ .check(minUtf16Length(1))
26
+ .check(maxUtf16Length(64))
27
+ .regex(/^[a-z0-9][a-z0-9._-]*$/);
28
+ const providerListSchema = z.array(providerSlugSchema).min(1).max(16);
29
+ /** Quantization levels a route can be published at (the OpenRouter vocabulary). */
30
+ export const providerQuantizationSchema = z.enum([
31
+ 'int4',
32
+ 'int8',
33
+ 'fp4',
34
+ 'mxfp4',
35
+ 'nvfp4',
36
+ 'fp6',
37
+ 'fp8',
38
+ 'mxfp8',
39
+ 'fp16',
40
+ 'bf16',
41
+ 'fp32',
42
+ 'unknown',
43
+ ]);
44
+ export const providerPreferencesSchema = z
45
+ .object({
46
+ /** Providers to try first, in this order. Others still follow unless `allow_fallbacks` is false. */
47
+ order: providerListSchema.optional(),
48
+ /** Allow-list: only these providers may serve the request. */
49
+ only: providerListSchema.optional(),
50
+ /** Skip-list: these providers never serve the request. */
51
+ ignore: providerListSchema.optional(),
52
+ /**
53
+ * False keeps a single provider: the first of `order` that is admitted, or
54
+ * the best-ranked one. The request is never moved to another.
55
+ */
56
+ allow_fallbacks: z.boolean().optional(),
57
+ /** True keeps only routes that accept every parameter the request carries. */
58
+ require_parameters: z.boolean().optional(),
59
+ /** Keep only routes published at one of these quantizations; `unknown` admits unstated ones. */
60
+ quantizations: z.array(providerQuantizationSchema).min(1).max(12).optional(),
61
+ /** Prefer the route with the lowest recent latency or the highest recent throughput. */
62
+ sort: z.enum(['latency', 'throughput']).optional(),
63
+ /** Seconds. A route slower than this recently is tried later, never excluded (p50). */
64
+ preferred_max_latency: z.number().positive().max(600).optional(),
65
+ /** Output tokens per second. A route slower than this recently is tried later, never excluded (p50). */
66
+ preferred_min_throughput: z.number().positive().max(100_000).optional(),
67
+ })
68
+ .strict();
69
+ /**
70
+ * An opaque caller-chosen string that groups requests sharing a prompt prefix.
71
+ * Kaana keeps such requests on the deployment that last served them while it is
72
+ * still admitted, so the provider's prompt cache stays warm. It is never stored
73
+ * with a prompt and never leaves Kaana.
74
+ */
75
+ export const promptCacheKeySchema = z.string().check(minUtf16Length(1)).check(maxUtf16Length(256));
@@ -144,6 +144,34 @@ export declare const responsesRequestSchema: z.ZodObject<{
144
144
  }, z.core.$strict>>;
145
145
  labels: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
146
146
  clientRequestId: z.ZodOptional<z.ZodString>;
147
+ provider: z.ZodOptional<z.ZodObject<{
148
+ order: z.ZodOptional<z.ZodArray<z.ZodString>>;
149
+ only: z.ZodOptional<z.ZodArray<z.ZodString>>;
150
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString>>;
151
+ allow_fallbacks: z.ZodOptional<z.ZodBoolean>;
152
+ require_parameters: z.ZodOptional<z.ZodBoolean>;
153
+ quantizations: z.ZodOptional<z.ZodArray<z.ZodEnum<{
154
+ unknown: "unknown";
155
+ int4: "int4";
156
+ int8: "int8";
157
+ fp4: "fp4";
158
+ mxfp4: "mxfp4";
159
+ nvfp4: "nvfp4";
160
+ fp6: "fp6";
161
+ fp8: "fp8";
162
+ mxfp8: "mxfp8";
163
+ fp16: "fp16";
164
+ bf16: "bf16";
165
+ fp32: "fp32";
166
+ }>>>;
167
+ sort: z.ZodOptional<z.ZodEnum<{
168
+ latency: "latency";
169
+ throughput: "throughput";
170
+ }>>;
171
+ preferred_max_latency: z.ZodOptional<z.ZodNumber>;
172
+ preferred_min_throughput: z.ZodOptional<z.ZodNumber>;
173
+ }, z.core.$strict>>;
174
+ promptCacheKey: z.ZodOptional<z.ZodString>;
147
175
  }, z.core.$strict>;
148
176
  /**
149
177
  * The non-streaming body. A streamed request answers with
@@ -14,6 +14,7 @@ import { generationIdSchema, modelReferenceSchema, requestIdSchema } from './ide
14
14
  import { inferenceMessageSchema, inferenceReasoningSchema, requestLabelsSchema, responseFormatSchema, toolChoiceSchema, toolDefinitionSchema, } from './messages.js';
15
15
  import { usageQuantitySchema } from './money.js';
16
16
  import { routingPolicyReferenceSchema } from './policy.js';
17
+ import { promptCacheKeySchema, providerPreferencesSchema } from './providerPreferences.js';
17
18
  import { inferenceFinishReasonSchema } from './streamEvents.js';
18
19
  /**
19
20
  * What a `model` field may name: a concrete model reference
@@ -60,6 +61,10 @@ export const responsesRequestSchema = z
60
61
  labels: requestLabelsSchema.optional(),
61
62
  /** The caller's own correlation id, echoed on the response. */
62
63
  clientRequestId: z.string().check(minUtf16Length(1)).check(maxUtf16Length(128)).optional(),
64
+ /** Routing preferences that can only narrow what the grant admits (ADR 0008). */
65
+ provider: providerPreferencesSchema.optional(),
66
+ /** Keeps requests sharing a prompt prefix on one deployment while its cache is warm. */
67
+ promptCacheKey: promptCacheKeySchema.optional(),
63
68
  })
64
69
  .strict()
65
70
  .superRefine((request, ctx) => {
@@ -100,7 +100,7 @@
100
100
  * change to, say, the catalogue reject every in-flight inference request; the
101
101
  * per-shape `schemaVersion` is what a message is validated against.
102
102
  */
103
- export declare const INFERENCE_CONTRACT_VERSION = "8.4.0";
103
+ export declare const INFERENCE_CONTRACT_VERSION = "8.5.0";
104
104
  /**
105
105
  * Contract set 4.0.0 (Kaana ADR 0002) is the first published as
106
106
  * `@kaana.ai/contracts`. MAJOR because the set changed hands and split in two:
@@ -208,6 +208,12 @@ export declare const INFERENCE_CONTRACT_VERSION = "8.4.0";
208
208
  * capabilities whose `false` is not evidence). Nothing in 8.3.0 changes and
209
209
  * nothing emits either yet: a consumer on 8.3.0 refuses a usage report carrying
210
210
  * the unit and a catalogue carrying the field, so Oxy reads them first.
211
+ *
212
+ * Contract set 8.5.0 is additive: the optional `provider` routing preference
213
+ * (`providerPreferencesSchema`) and the prompt-cache key (`prompt_cache_key`,
214
+ * `promptCacheKey`) on `POST /v1/chat/completions` and `POST /v1/responses`
215
+ * (Kaana ADR 0008). The preference only narrows what the grant admits. Nothing
216
+ * in 8.4.0 changes and the signed grant and envelope are untouched.
211
217
  */
212
218
  /** The public API's one origin and version. */
213
219
  export declare const KAANA_API_BASE_URL = "https://kaana.ai/v1";
@@ -100,7 +100,7 @@
100
100
  * change to, say, the catalogue reject every in-flight inference request; the
101
101
  * per-shape `schemaVersion` is what a message is validated against.
102
102
  */
103
- export const INFERENCE_CONTRACT_VERSION = '8.4.0';
103
+ export const INFERENCE_CONTRACT_VERSION = '8.5.0';
104
104
  /**
105
105
  * Contract set 4.0.0 (Kaana ADR 0002) is the first published as
106
106
  * `@kaana.ai/contracts`. MAJOR because the set changed hands and split in two:
@@ -208,6 +208,12 @@ export const INFERENCE_CONTRACT_VERSION = '8.4.0';
208
208
  * capabilities whose `false` is not evidence). Nothing in 8.3.0 changes and
209
209
  * nothing emits either yet: a consumer on 8.3.0 refuses a usage report carrying
210
210
  * the unit and a catalogue carrying the field, so Oxy reads them first.
211
+ *
212
+ * Contract set 8.5.0 is additive: the optional `provider` routing preference
213
+ * (`providerPreferencesSchema`) and the prompt-cache key (`prompt_cache_key`,
214
+ * `promptCacheKey`) on `POST /v1/chat/completions` and `POST /v1/responses`
215
+ * (Kaana ADR 0008). The preference only narrows what the grant admits. Nothing
216
+ * in 8.4.0 changes and the signed grant and envelope are untouched.
211
217
  */
212
218
  /** The public API's one origin and version. */
213
219
  export const KAANA_API_BASE_URL = 'https://kaana.ai/v1';
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Kaana API",
5
- "version": "8.4.0",
5
+ "version": "8.5.0",
6
6
  "description": "Kaana inference API. Generated from @kaana.ai/contracts; the Zod source is the authority. Accounts, applications, oxy_sk_ keys, limits and billing are managed in Oxy Console: https://console.oxy.so"
7
7
  },
8
8
  "servers": [
@@ -3118,6 +3118,12 @@
3118
3118
  "type": "string",
3119
3119
  "minLength": 1,
3120
3120
  "maxLength": 64
3121
+ },
3122
+ "provider": {
3123
+ "$ref": "#/components/schemas/ProviderPreferences"
3124
+ },
3125
+ "prompt_cache_key": {
3126
+ "$ref": "#/components/schemas/PromptCacheKey"
3121
3127
  }
3122
3128
  },
3123
3129
  "required": [
@@ -5114,6 +5120,98 @@
5114
5120
  ],
5115
5121
  "additionalProperties": false
5116
5122
  },
5123
+ "PromptCacheKey": {
5124
+ "type": "string",
5125
+ "minLength": 1,
5126
+ "maxLength": 256
5127
+ },
5128
+ "ProviderPreferences": {
5129
+ "type": "object",
5130
+ "properties": {
5131
+ "order": {
5132
+ "minItems": 1,
5133
+ "maxItems": 16,
5134
+ "type": "array",
5135
+ "items": {
5136
+ "type": "string",
5137
+ "minLength": 1,
5138
+ "maxLength": 64,
5139
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
5140
+ }
5141
+ },
5142
+ "only": {
5143
+ "minItems": 1,
5144
+ "maxItems": 16,
5145
+ "type": "array",
5146
+ "items": {
5147
+ "type": "string",
5148
+ "minLength": 1,
5149
+ "maxLength": 64,
5150
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
5151
+ }
5152
+ },
5153
+ "ignore": {
5154
+ "minItems": 1,
5155
+ "maxItems": 16,
5156
+ "type": "array",
5157
+ "items": {
5158
+ "type": "string",
5159
+ "minLength": 1,
5160
+ "maxLength": 64,
5161
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
5162
+ }
5163
+ },
5164
+ "allow_fallbacks": {
5165
+ "type": "boolean"
5166
+ },
5167
+ "require_parameters": {
5168
+ "type": "boolean"
5169
+ },
5170
+ "quantizations": {
5171
+ "minItems": 1,
5172
+ "maxItems": 12,
5173
+ "type": "array",
5174
+ "items": {
5175
+ "$ref": "#/components/schemas/ProviderQuantization"
5176
+ }
5177
+ },
5178
+ "sort": {
5179
+ "type": "string",
5180
+ "enum": [
5181
+ "latency",
5182
+ "throughput"
5183
+ ]
5184
+ },
5185
+ "preferred_max_latency": {
5186
+ "type": "number",
5187
+ "exclusiveMinimum": 0,
5188
+ "maximum": 600
5189
+ },
5190
+ "preferred_min_throughput": {
5191
+ "type": "number",
5192
+ "exclusiveMinimum": 0,
5193
+ "maximum": 100000
5194
+ }
5195
+ },
5196
+ "additionalProperties": false
5197
+ },
5198
+ "ProviderQuantization": {
5199
+ "type": "string",
5200
+ "enum": [
5201
+ "int4",
5202
+ "int8",
5203
+ "fp4",
5204
+ "mxfp4",
5205
+ "nvfp4",
5206
+ "fp6",
5207
+ "fp8",
5208
+ "mxfp8",
5209
+ "fp16",
5210
+ "bf16",
5211
+ "fp32",
5212
+ "unknown"
5213
+ ]
5214
+ },
5117
5215
  "PublicErrorCode": {
5118
5216
  "type": "string",
5119
5217
  "enum": [
@@ -7612,6 +7710,12 @@
7612
7710
  "type": "string",
7613
7711
  "minLength": 1,
7614
7712
  "maxLength": 128
7713
+ },
7714
+ "provider": {
7715
+ "$ref": "#/components/schemas/ProviderPreferences"
7716
+ },
7717
+ "promptCacheKey": {
7718
+ "$ref": "#/components/schemas/PromptCacheKey"
7615
7719
  }
7616
7720
  },
7617
7721
  "required": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaana.ai/contracts",
3
- "version": "8.4.0",
3
+ "version": "8.5.0",
4
4
  "description": "Kaana inference contract: the Zod schemas of the public API at https://kaana.ai/v1 and, under /internal, of the Oxy-Kaana grant, settlement and signed lane.",
5
5
  "type": "module",
6
6
  "sideEffects": false,