@hebo-ai/gateway 0.9.0 → 0.9.2

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.
Files changed (212) hide show
  1. package/README.md +82 -4
  2. package/package.json +34 -34
  3. package/dist/config.d.ts +0 -2
  4. package/dist/config.js +0 -111
  5. package/dist/endpoints/chat-completions/converters.d.ts +0 -26
  6. package/dist/endpoints/chat-completions/converters.js +0 -524
  7. package/dist/endpoints/chat-completions/handler.d.ts +0 -2
  8. package/dist/endpoints/chat-completions/handler.js +0 -149
  9. package/dist/endpoints/chat-completions/index.d.ts +0 -4
  10. package/dist/endpoints/chat-completions/index.js +0 -4
  11. package/dist/endpoints/chat-completions/otel.d.ts +0 -5
  12. package/dist/endpoints/chat-completions/otel.js +0 -175
  13. package/dist/endpoints/chat-completions/schema.d.ts +0 -1170
  14. package/dist/endpoints/chat-completions/schema.js +0 -252
  15. package/dist/endpoints/conversations/converters.d.ts +0 -8
  16. package/dist/endpoints/conversations/converters.js +0 -29
  17. package/dist/endpoints/conversations/handler.d.ts +0 -2
  18. package/dist/endpoints/conversations/handler.js +0 -276
  19. package/dist/endpoints/conversations/index.d.ts +0 -3
  20. package/dist/endpoints/conversations/index.js +0 -3
  21. package/dist/endpoints/conversations/schema.d.ts +0 -1511
  22. package/dist/endpoints/conversations/schema.js +0 -74
  23. package/dist/endpoints/conversations/storage/dialects/greptime.d.ts +0 -10
  24. package/dist/endpoints/conversations/storage/dialects/greptime.js +0 -75
  25. package/dist/endpoints/conversations/storage/dialects/mysql.d.ts +0 -12
  26. package/dist/endpoints/conversations/storage/dialects/mysql.js +0 -118
  27. package/dist/endpoints/conversations/storage/dialects/postgres.d.ts +0 -16
  28. package/dist/endpoints/conversations/storage/dialects/postgres.js +0 -185
  29. package/dist/endpoints/conversations/storage/dialects/sqlite.d.ts +0 -11
  30. package/dist/endpoints/conversations/storage/dialects/sqlite.js +0 -176
  31. package/dist/endpoints/conversations/storage/dialects/types.d.ts +0 -42
  32. package/dist/endpoints/conversations/storage/dialects/types.js +0 -0
  33. package/dist/endpoints/conversations/storage/dialects/utils.d.ts +0 -25
  34. package/dist/endpoints/conversations/storage/dialects/utils.js +0 -80
  35. package/dist/endpoints/conversations/storage/memory.d.ts +0 -25
  36. package/dist/endpoints/conversations/storage/memory.js +0 -200
  37. package/dist/endpoints/conversations/storage/sql.d.ts +0 -33
  38. package/dist/endpoints/conversations/storage/sql.js +0 -278
  39. package/dist/endpoints/conversations/storage/types.d.ts +0 -39
  40. package/dist/endpoints/conversations/storage/types.js +0 -0
  41. package/dist/endpoints/embeddings/converters.d.ts +0 -10
  42. package/dist/endpoints/embeddings/converters.js +0 -31
  43. package/dist/endpoints/embeddings/handler.d.ts +0 -2
  44. package/dist/endpoints/embeddings/handler.js +0 -104
  45. package/dist/endpoints/embeddings/index.d.ts +0 -4
  46. package/dist/endpoints/embeddings/index.js +0 -4
  47. package/dist/endpoints/embeddings/otel.d.ts +0 -5
  48. package/dist/endpoints/embeddings/otel.js +0 -29
  49. package/dist/endpoints/embeddings/schema.d.ts +0 -44
  50. package/dist/endpoints/embeddings/schema.js +0 -29
  51. package/dist/endpoints/models/converters.d.ts +0 -6
  52. package/dist/endpoints/models/converters.js +0 -42
  53. package/dist/endpoints/models/handler.d.ts +0 -2
  54. package/dist/endpoints/models/handler.js +0 -29
  55. package/dist/endpoints/models/index.d.ts +0 -3
  56. package/dist/endpoints/models/index.js +0 -3
  57. package/dist/endpoints/models/schema.d.ts +0 -42
  58. package/dist/endpoints/models/schema.js +0 -31
  59. package/dist/endpoints/responses/converters.d.ts +0 -17
  60. package/dist/endpoints/responses/converters.js +0 -1034
  61. package/dist/endpoints/responses/handler.d.ts +0 -2
  62. package/dist/endpoints/responses/handler.js +0 -137
  63. package/dist/endpoints/responses/index.d.ts +0 -4
  64. package/dist/endpoints/responses/index.js +0 -4
  65. package/dist/endpoints/responses/otel.d.ts +0 -6
  66. package/dist/endpoints/responses/otel.js +0 -221
  67. package/dist/endpoints/responses/schema.d.ts +0 -2109
  68. package/dist/endpoints/responses/schema.js +0 -314
  69. package/dist/endpoints/shared/converters.d.ts +0 -55
  70. package/dist/endpoints/shared/converters.js +0 -179
  71. package/dist/endpoints/shared/schema.d.ts +0 -70
  72. package/dist/endpoints/shared/schema.js +0 -46
  73. package/dist/errors/ai-sdk.d.ts +0 -2
  74. package/dist/errors/ai-sdk.js +0 -52
  75. package/dist/errors/gateway.d.ts +0 -5
  76. package/dist/errors/gateway.js +0 -13
  77. package/dist/errors/openai.d.ts +0 -15
  78. package/dist/errors/openai.js +0 -40
  79. package/dist/errors/utils.d.ts +0 -22
  80. package/dist/errors/utils.js +0 -44
  81. package/dist/gateway.d.ts +0 -11
  82. package/dist/gateway.js +0 -44
  83. package/dist/index.d.ts +0 -11
  84. package/dist/index.js +0 -10
  85. package/dist/lifecycle.d.ts +0 -3
  86. package/dist/lifecycle.js +0 -113
  87. package/dist/logger/default.d.ts +0 -4
  88. package/dist/logger/default.js +0 -81
  89. package/dist/logger/index.d.ts +0 -11
  90. package/dist/logger/index.js +0 -25
  91. package/dist/middleware/common.d.ts +0 -12
  92. package/dist/middleware/common.js +0 -146
  93. package/dist/middleware/debug.d.ts +0 -3
  94. package/dist/middleware/debug.js +0 -27
  95. package/dist/middleware/matcher.d.ts +0 -28
  96. package/dist/middleware/matcher.js +0 -118
  97. package/dist/middleware/utils.d.ts +0 -2
  98. package/dist/middleware/utils.js +0 -24
  99. package/dist/models/amazon/index.d.ts +0 -2
  100. package/dist/models/amazon/index.js +0 -2
  101. package/dist/models/amazon/middleware.d.ts +0 -3
  102. package/dist/models/amazon/middleware.js +0 -68
  103. package/dist/models/amazon/presets.d.ts +0 -345
  104. package/dist/models/amazon/presets.js +0 -80
  105. package/dist/models/anthropic/index.d.ts +0 -2
  106. package/dist/models/anthropic/index.js +0 -2
  107. package/dist/models/anthropic/middleware.d.ts +0 -5
  108. package/dist/models/anthropic/middleware.js +0 -127
  109. package/dist/models/anthropic/presets.d.ts +0 -711
  110. package/dist/models/anthropic/presets.js +0 -135
  111. package/dist/models/catalog.d.ts +0 -4
  112. package/dist/models/catalog.js +0 -8
  113. package/dist/models/cohere/index.d.ts +0 -2
  114. package/dist/models/cohere/index.js +0 -2
  115. package/dist/models/cohere/middleware.d.ts +0 -3
  116. package/dist/models/cohere/middleware.js +0 -62
  117. package/dist/models/cohere/presets.d.ts +0 -411
  118. package/dist/models/cohere/presets.js +0 -134
  119. package/dist/models/google/index.d.ts +0 -2
  120. package/dist/models/google/index.js +0 -2
  121. package/dist/models/google/middleware.d.ts +0 -8
  122. package/dist/models/google/middleware.js +0 -111
  123. package/dist/models/google/presets.d.ts +0 -403
  124. package/dist/models/google/presets.js +0 -88
  125. package/dist/models/meta/index.d.ts +0 -1
  126. package/dist/models/meta/index.js +0 -1
  127. package/dist/models/meta/presets.d.ts +0 -483
  128. package/dist/models/meta/presets.js +0 -95
  129. package/dist/models/openai/index.d.ts +0 -2
  130. package/dist/models/openai/index.js +0 -2
  131. package/dist/models/openai/middleware.d.ts +0 -4
  132. package/dist/models/openai/middleware.js +0 -88
  133. package/dist/models/openai/presets.d.ts +0 -1319
  134. package/dist/models/openai/presets.js +0 -277
  135. package/dist/models/types.d.ts +0 -20
  136. package/dist/models/types.js +0 -92
  137. package/dist/models/voyage/index.d.ts +0 -2
  138. package/dist/models/voyage/index.js +0 -2
  139. package/dist/models/voyage/middleware.d.ts +0 -2
  140. package/dist/models/voyage/middleware.js +0 -19
  141. package/dist/models/voyage/presets.d.ts +0 -436
  142. package/dist/models/voyage/presets.js +0 -85
  143. package/dist/providers/anthropic/canonical.d.ts +0 -3
  144. package/dist/providers/anthropic/canonical.js +0 -9
  145. package/dist/providers/anthropic/index.d.ts +0 -1
  146. package/dist/providers/anthropic/index.js +0 -1
  147. package/dist/providers/bedrock/canonical.d.ts +0 -17
  148. package/dist/providers/bedrock/canonical.js +0 -61
  149. package/dist/providers/bedrock/index.d.ts +0 -2
  150. package/dist/providers/bedrock/index.js +0 -2
  151. package/dist/providers/bedrock/middleware.d.ts +0 -5
  152. package/dist/providers/bedrock/middleware.js +0 -137
  153. package/dist/providers/cohere/canonical.d.ts +0 -3
  154. package/dist/providers/cohere/canonical.js +0 -17
  155. package/dist/providers/cohere/index.d.ts +0 -1
  156. package/dist/providers/cohere/index.js +0 -1
  157. package/dist/providers/groq/canonical.d.ts +0 -3
  158. package/dist/providers/groq/canonical.js +0 -12
  159. package/dist/providers/groq/index.d.ts +0 -2
  160. package/dist/providers/groq/index.js +0 -2
  161. package/dist/providers/groq/middleware.d.ts +0 -2
  162. package/dist/providers/groq/middleware.js +0 -31
  163. package/dist/providers/openai/canonical.d.ts +0 -3
  164. package/dist/providers/openai/canonical.js +0 -8
  165. package/dist/providers/openai/index.d.ts +0 -1
  166. package/dist/providers/openai/index.js +0 -1
  167. package/dist/providers/registry.d.ts +0 -24
  168. package/dist/providers/registry.js +0 -103
  169. package/dist/providers/types.d.ts +0 -7
  170. package/dist/providers/types.js +0 -11
  171. package/dist/providers/vertex/canonical.d.ts +0 -3
  172. package/dist/providers/vertex/canonical.js +0 -8
  173. package/dist/providers/vertex/index.d.ts +0 -2
  174. package/dist/providers/vertex/index.js +0 -2
  175. package/dist/providers/vertex/middleware.d.ts +0 -2
  176. package/dist/providers/vertex/middleware.js +0 -47
  177. package/dist/providers/voyage/canonical.d.ts +0 -3
  178. package/dist/providers/voyage/canonical.js +0 -7
  179. package/dist/providers/voyage/index.d.ts +0 -1
  180. package/dist/providers/voyage/index.js +0 -1
  181. package/dist/telemetry/ai-sdk.d.ts +0 -2
  182. package/dist/telemetry/ai-sdk.js +0 -31
  183. package/dist/telemetry/baggage.d.ts +0 -1
  184. package/dist/telemetry/baggage.js +0 -24
  185. package/dist/telemetry/fetch.d.ts +0 -2
  186. package/dist/telemetry/fetch.js +0 -49
  187. package/dist/telemetry/gen-ai.d.ts +0 -6
  188. package/dist/telemetry/gen-ai.js +0 -78
  189. package/dist/telemetry/http.d.ts +0 -3
  190. package/dist/telemetry/http.js +0 -54
  191. package/dist/telemetry/index.d.ts +0 -1
  192. package/dist/telemetry/index.js +0 -1
  193. package/dist/telemetry/memory.d.ts +0 -2
  194. package/dist/telemetry/memory.js +0 -43
  195. package/dist/telemetry/span.d.ts +0 -13
  196. package/dist/telemetry/span.js +0 -60
  197. package/dist/types.d.ts +0 -216
  198. package/dist/types.js +0 -2
  199. package/dist/utils/env.d.ts +0 -2
  200. package/dist/utils/env.js +0 -7
  201. package/dist/utils/headers.d.ts +0 -4
  202. package/dist/utils/headers.js +0 -22
  203. package/dist/utils/preset.d.ts +0 -10
  204. package/dist/utils/preset.js +0 -41
  205. package/dist/utils/request.d.ts +0 -2
  206. package/dist/utils/request.js +0 -43
  207. package/dist/utils/response.d.ts +0 -6
  208. package/dist/utils/response.js +0 -55
  209. package/dist/utils/stream.d.ts +0 -9
  210. package/dist/utils/stream.js +0 -100
  211. package/dist/utils/url.d.ts +0 -4
  212. package/dist/utils/url.js +0 -21
package/README.md CHANGED
@@ -42,7 +42,7 @@ bun install @hebo-ai/gateway
42
42
  - Endpoints
43
43
  - [/chat/completions](#chatcompletions) | [/embeddings](#embeddings) | [/models](#models) | [/responses](#responses) | [/conversations](#conversations)
44
44
  - OpenAI Extensions
45
- - [Reasoning](#reasoning) | [Service Tier](#service-tier) | [Prompt Caching](#prompt-caching)
45
+ - [Reasoning](#reasoning) | [Service Tier](#service-tier) | [Prompt Caching](#prompt-caching) | [Compressed Requests](#compressed-requests)
46
46
  - Advanced Usage
47
47
  - [Passing Framework State to Hooks](#passing-framework-state-to-hooks) | [Selective Route Mounting](#selective-route-mounting) | [Low-level Schemas & Converters](#low-level-schemas--converters)
48
48
 
@@ -792,6 +792,36 @@ Provider behavior:
792
792
  - **Google Gemini**: maps `cached_content` to Gemini `cachedContent`.
793
793
  - **Amazon Nova (Bedrock)**: maps `cache_control` to Bedrock `cachePoints` and inserts an automatic cache point on a stable prefix when none is provided.
794
794
 
795
+
796
+ ### Compressed Requests
797
+
798
+ The gateway supports gzip and deflate compressed request bodies via the Web Compression Streams API. The `maxBodySize` option controls the maximum *decompressed* body size for these compressed requests, protecting against gzip bombs and oversized payloads.
799
+
800
+ ```ts
801
+ import { gateway } from "@hebo-ai/gateway";
802
+
803
+ const gw = gateway({
804
+ // ...
805
+ // Maximum decompressed body size in bytes (default: 10 MB).
806
+ // Set to 0 to disable the decompressed size limit.
807
+ maxBodySize: 10 * 1024 * 1024,
808
+ });
809
+ ```
810
+
811
+ Compressed requests that exceed this limit after decompression receive an HTTP `413 Payload Too Large` response. Unsupported `Content-Encoding` values return HTTP `415 Unsupported Media Type`.
812
+
813
+ > [!IMPORTANT]
814
+ > **Plain (uncompressed) request body size limits** are *not* enforced by the gateway — they should be configured at the framework or server level. The gateway only enforces `maxBodySize` on decompressed output, since the framework cannot know the decompressed size ahead of time.
815
+ >
816
+ > Framework-level configuration examples:
817
+ >
818
+ > - **Bun** — [`Bun.serve({ maxRequestBodySize: 10_485_760 })`](https://bun.sh/docs/api/http#bun-serve)
819
+ > - **Elysia** — inherits from Bun's `maxRequestBodySize`
820
+ > - **Hono** — [`bodyLimit` middleware](https://hono.dev/docs/middleware/builtin/body-limit): `app.use(bodyLimit({ maxSize: 10 * 1024 * 1024 }))`
821
+ > - **Express** — [`express.json({ limit: '10mb' })`](https://expressjs.com/en/api.html#express.json)
822
+ > - **Fastify** — [`fastify({ bodyLimit: 10485760 })`](https://fastify.dev/docs/latest/Reference/Server/#bodylimit)
823
+ > - **Node.js `http`** — [`server.maxRequestSize`](https://nodejs.org/api/http.html) (v22.6+), or use a reverse proxy like nginx (`client_max_body_size 10m`)
824
+
795
825
  ## 🧪 Advanced Usage
796
826
 
797
827
  ### Logger Settings
@@ -863,19 +893,37 @@ Attribute names and span & metrics semantics follow OpenTelemetry GenAI semantic
863
893
  https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/
864
894
  https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/
865
895
 
896
+ For observability integration that is not otel compliant, you can disable built-in telemetry and manually instrument requests during `before` / `after` hooks.
897
+
898
+ #### Custom Telemetry Attributes
899
+
900
+ Use `ctx.otel` in any hook to attach attributes to both spans and metrics:
901
+
902
+ ```ts
903
+ hooks: {
904
+ onRequest: (ctx) => {
905
+ ctx.otel["app.tenant.id"] = tenantId;
906
+ ctx.otel["app.user.id"] = userId;
907
+ },
908
+ }
909
+ ```
910
+
911
+ These attributes appear on the active span and on all metric instruments (request duration, token usage, TPOT, TTFT).
912
+
866
913
  > [!TIP]
867
914
  > To populate custom span attributes, the inbound W3C `baggage` header is supported. Keys in the `hebo.` namespace are mapped to span attributes, with the namespace stripped. For example: `baggage: hebo.user_id=u-123` becomes span attribute `user_id=u-123`.
868
915
  > For `/chat/completions` and `/embeddings`, request `metadata` (`Record<string, string>`, key 1-64 chars, value up to 512 chars) is also forwarded to spans as `gen_ai.request.metadata.<key>`.
869
916
 
870
- For observability integration that is not otel compliant, you can disable built-in telemetry and manually instrument requests during `before` / `after` hooks.
871
-
872
917
  #### Metrics
873
918
 
874
919
  The Gateway also emits `gen_ai` metrics:
875
920
 
876
921
  - `gen_ai.server.request.duration` (histogram, seconds)
877
922
  - `gen_ai.server.time_per_output_token` (histogram, seconds)
878
- - `gen_ai.client.token.usage` (histogram, tokens; tagged with `gen_ai.token.type=input|output`)
923
+ - `gen_ai.server.time_to_first_token` (histogram, seconds)
924
+ - `gen_ai.client.token.usage` (histogram, tokens; tagged with `gen_ai.token.type=input|output|cached|reasoning`)
925
+
926
+ Metric names and attributes follow OpenTelemetry GenAI semantic conventions. Histogram bucket boundaries are tuned for practical dashboards and alerting rather than copied verbatim from upstream recommendations.
879
927
 
880
928
  To capture them, configure a global `MeterProvider` before creating the gateway:
881
929
 
@@ -1073,3 +1121,33 @@ Non-streaming versions are available via `toChatCompletionsResponse`. Equivalent
1073
1121
 
1074
1122
  > [!TIP]
1075
1123
  > Since Zod v4.3 you can generate a JSON Schema from any zod object by calling `z.toJSONSchema(...)`. This is useful for producing OpenAPI documentation from the same source of truth.
1124
+
1125
+
1126
+ ### Request Body Size
1127
+
1128
+ The gateway supports gzip and deflate compressed request bodies via the Web Compression Streams API. The `maxBodySize` option controls the maximum *decompressed* body size for these compressed requests, protecting against gzip bombs and oversized payloads.
1129
+
1130
+ ```ts
1131
+ import { gateway } from "@hebo-ai/gateway";
1132
+
1133
+ const gw = gateway({
1134
+ // ...
1135
+ // Maximum decompressed body size in bytes (default: 10 MB).
1136
+ // Set to 0 to disable the decompressed size limit.
1137
+ maxBodySize: 10 * 1024 * 1024,
1138
+ });
1139
+ ```
1140
+
1141
+ Compressed requests that exceed this limit after decompression receive an HTTP `413 Payload Too Large` response. Unsupported `Content-Encoding` values return HTTP `415 Unsupported Media Type`.
1142
+
1143
+ > [!IMPORTANT]
1144
+ > **Plain (uncompressed) request body size limits** are *not* enforced by the gateway — they should be configured at the framework or server level. The gateway only enforces `maxBodySize` on decompressed output, since the framework cannot know the decompressed size ahead of time.
1145
+ >
1146
+ > Framework-level configuration examples:
1147
+ >
1148
+ > - **Bun** — [`Bun.serve({ maxRequestBodySize: 10_485_760 })`](https://bun.sh/docs/api/http#bun-serve)
1149
+ > - **Elysia** — inherits from Bun's `maxRequestBodySize`
1150
+ > - **Hono** — [`bodyLimit` middleware](https://hono.dev/docs/middleware/builtin/body-limit): `app.use(bodyLimit({ maxSize: 10 * 1024 * 1024 }))`
1151
+ > - **Express** — [`express.json({ limit: '10mb' })`](https://expressjs.com/en/api.html#express.json)
1152
+ > - **Fastify** — [`fastify({ bodyLimit: 10485760 })`](https://fastify.dev/docs/latest/Reference/Server/#bodylimit)
1153
+ > - **Node.js `http`** — [`server.maxRequestSize`](https://nodejs.org/api/http.html) (v22.6+), or use a reverse proxy like nginx (`client_max_body_size 10m`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hebo-ai/gateway",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "AI gateway as a framework. For full control over models, routing & lifecycle. OpenAI-compatible /chat/completions, /embeddings & /models.",
5
5
  "keywords": [
6
6
  "ai",
@@ -160,51 +160,51 @@
160
160
  "typecheck": "oxlint --type-check",
161
161
  "test": "bun test",
162
162
  "check": "bun lint && bun typecheck",
163
- "fix": "bun lint:staged && bun fmt:staged"
163
+ "fix": "bun lint:staged && bun format:staged"
164
164
  },
165
165
  "dependencies": {
166
166
  "@ai-sdk/provider": "^3.0.8",
167
- "ai": "^6.0.116",
168
- "lru-cache": "^11.2.6",
167
+ "ai": "^6.0.154",
168
+ "lru-cache": "^11.3.3",
169
169
  "uuid": "^13.0.0",
170
170
  "zod": "^4.3.6"
171
171
  },
172
172
  "devDependencies": {
173
- "@ai-sdk/amazon-bedrock": "^4.0.77",
174
- "@ai-sdk/anthropic": "^3.0.58",
175
- "@ai-sdk/cohere": "^3.0.25",
176
- "@ai-sdk/google-vertex": "^4.0.80",
177
- "@ai-sdk/groq": "^3.0.29",
178
- "@ai-sdk/openai": "^3.0.41",
179
- "@aws-sdk/credential-providers": "^3.1004.0",
180
- "@langfuse/otel": "^4.6.1",
181
- "@libsql/client": "^0.17.0",
173
+ "@ai-sdk/amazon-bedrock": "^4.0.92",
174
+ "@ai-sdk/anthropic": "^3.0.68",
175
+ "@ai-sdk/cohere": "^3.0.30",
176
+ "@ai-sdk/google-vertex": "^4.0.105",
177
+ "@ai-sdk/groq": "^3.0.35",
178
+ "@ai-sdk/openai": "^3.0.52",
179
+ "@aws-sdk/credential-providers": "^3.1027.0",
180
+ "@langfuse/otel": "^5.0.2",
181
+ "@libsql/client": "^0.17.2",
182
182
  "@mjackson/node-fetch-server": "^0.7.0",
183
- "@opentelemetry/api": "^1.9.0",
184
- "@opentelemetry/context-async-hooks": "^2.6.0",
185
- "@opentelemetry/sdk-trace-base": "^2.6.0",
186
- "@tanstack/react-router": "^1.166.3",
187
- "@tanstack/react-start": "^1.166.3",
183
+ "@opentelemetry/api": "^1.9.1",
184
+ "@opentelemetry/context-async-hooks": "^2.6.1",
185
+ "@opentelemetry/sdk-trace-base": "^2.6.1",
186
+ "@tanstack/react-router": "^1.168.10",
187
+ "@tanstack/react-start": "^1.167.16",
188
188
  "@types/better-sqlite3": "^7.6.13",
189
- "@types/bun": "latest",
190
- "@types/pg": "^8.18.0",
189
+ "@types/bun": "1.3.11",
190
+ "@types/pg": "^8.20.0",
191
191
  "@types/react": "^19.2.14",
192
192
  "@types/react-dom": "^19.2.3",
193
193
  "@types/uuid": "^11.0.0",
194
- "better-sqlite3": "^12.6.2",
195
- "elysia": "^1.4.27",
196
- "hono": "^4.12.5",
197
- "lefthook": "^2.1.3",
198
- "mysql2": "^3.18.2",
199
- "next": "^16.1.6",
200
- "oxfmt": "^0.24.0",
201
- "oxlint": "^1.51.0",
202
- "oxlint-tsgolint": "^0.16.0",
194
+ "better-sqlite3": "^12.8.0",
195
+ "elysia": "^1.4.28",
196
+ "hono": "^4.12.12",
197
+ "lefthook": "^2.1.5",
198
+ "mysql2": "^3.21.0",
199
+ "next": "^16.2.3",
200
+ "oxfmt": "^0.44.0",
201
+ "oxlint": "^1.59.0",
202
+ "oxlint-tsgolint": "^0.20.0",
203
203
  "pg": "^8.19.0",
204
204
  "pino": "^10.3.1",
205
- "postgres": "^3.4.8",
206
- "typescript": "^5.9.3",
207
- "vite": "^7.3.1",
205
+ "postgres": "^3.4.9",
206
+ "typescript": "^6.0.2",
207
+ "vite": "^7.3.2",
208
208
  "vite-tsconfig-paths": "^6.1.1",
209
209
  "voyage-ai-provider": "^3.0.0"
210
210
  },
@@ -217,12 +217,12 @@
217
217
  "@ai-sdk/groq": "^3.0.29",
218
218
  "@ai-sdk/openai": "^3.0.41",
219
219
  "@libsql/client": "^0.14.0",
220
- "@opentelemetry/api": "^1.9.0",
220
+ "@opentelemetry/api": "^1.9.1",
221
221
  "better-sqlite3": "^11.0.0",
222
222
  "mysql2": "^3.11.0",
223
223
  "pg": "^8.13.0",
224
224
  "postgres": "^3.4.0",
225
- "typescript": "^5.9.3",
225
+ "typescript": ">=5.9.3",
226
226
  "voyage-ai-provider": "^3.0.0"
227
227
  },
228
228
  "peerDependenciesMeta": {
package/dist/config.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import { type GatewayConfig, type GatewayConfigParsed } from "./types";
2
- export declare const parseConfig: (config: GatewayConfig) => GatewayConfigParsed;
package/dist/config.js DELETED
@@ -1,111 +0,0 @@
1
- import { InMemoryStorage } from "./endpoints/conversations/storage/memory";
2
- import { isLogger, logger, setLoggerInstance } from "./logger";
3
- import { createDefaultLogger } from "./logger/default";
4
- import { installAiSdkWarningLogger } from "./telemetry/ai-sdk";
5
- import { DEFAULT_CHAT_TIMEOUT_MS, kParsed, } from "./types";
6
- export const parseConfig = (config) => {
7
- // If it has been parsed before, just return.
8
- if (kParsed in config)
9
- return config;
10
- const providers = config.providers ?? {};
11
- const parsedProviders = {};
12
- const models = config.models ?? {};
13
- const storage = config.storage ?? new InMemoryStorage();
14
- // Set the global logger instance.
15
- if (config.logger === undefined) {
16
- setLoggerInstance(createDefaultLogger({}));
17
- }
18
- else if (config.logger !== null) {
19
- setLoggerInstance(isLogger(config.logger) ? config.logger : createDefaultLogger(config.logger));
20
- logger.info(isLogger(config.logger)
21
- ? `[logger] custom logger configured`
22
- : `[logger] logger configured: level=${config.logger.level}`);
23
- }
24
- // Strip providers that are not configured.
25
- for (const id in providers) {
26
- const provider = providers[id];
27
- if (provider === undefined) {
28
- logger.warn(`[config] ${id} provider removed (undefined)`);
29
- continue;
30
- }
31
- parsedProviders[id] = provider;
32
- }
33
- if (Object.keys(parsedProviders).length === 0) {
34
- throw new Error("No providers configured (config.providers is empty)");
35
- }
36
- // Strip providers that are not configured from models.
37
- const parsedModels = {};
38
- const warnings = new Set();
39
- for (const id in models) {
40
- const model = models[id];
41
- const kept = [];
42
- for (const p of model.providers) {
43
- if (p in parsedProviders)
44
- kept.push(p);
45
- else
46
- warnings.add(p);
47
- }
48
- if (kept.length > 0)
49
- parsedModels[id] = { ...model, providers: kept };
50
- }
51
- for (const warning of warnings) {
52
- logger.warn(`[config] ${warning} provider removed (not configured)`);
53
- }
54
- if (Object.keys(parsedModels).length === 0) {
55
- throw new Error("No models configured (config.models is empty)");
56
- }
57
- // Default for the telemetry settings.
58
- const telemetryEnabled = config.telemetry?.enabled ?? false;
59
- const telemetrySignals = telemetryEnabled
60
- ? {
61
- http: config.telemetry?.signals?.http ?? "recommended",
62
- gen_ai: config.telemetry?.signals?.gen_ai ?? "full",
63
- hebo: config.telemetry?.signals?.hebo ?? "off",
64
- }
65
- : {
66
- http: "off",
67
- gen_ai: "off",
68
- hebo: "off",
69
- };
70
- installAiSdkWarningLogger(telemetrySignals.gen_ai);
71
- // Default timeouts
72
- let normal;
73
- let flex;
74
- const t = config.timeouts;
75
- if (t === null) {
76
- normal = flex = undefined;
77
- }
78
- else if (typeof t === "number") {
79
- normal = t;
80
- flex = t * 3;
81
- }
82
- else {
83
- if (t?.normal === null)
84
- normal = undefined;
85
- else if (t?.normal === undefined)
86
- normal = DEFAULT_CHAT_TIMEOUT_MS;
87
- else
88
- normal = t.normal;
89
- if (t?.flex === null)
90
- flex = undefined;
91
- else if (t?.flex === undefined)
92
- flex = normal === undefined ? undefined : normal * 3;
93
- else
94
- flex = t.flex;
95
- }
96
- const parsedTimeouts = { normal, flex };
97
- // Return parsed config.
98
- return {
99
- ...config,
100
- timeouts: parsedTimeouts,
101
- telemetry: {
102
- ...config.telemetry,
103
- enabled: telemetryEnabled,
104
- signals: telemetrySignals,
105
- },
106
- providers: parsedProviders,
107
- models: parsedModels,
108
- storage,
109
- [kParsed]: true,
110
- };
111
- };
@@ -1,26 +0,0 @@
1
- import type { SharedV3ProviderMetadata } from "@ai-sdk/provider";
2
- import type { GenerateTextResult, StreamTextResult, FinishReason, ToolSet, ModelMessage, UserContent, LanguageModelUsage, TextStreamPart, ReasoningOutput, AssistantModelMessage, ToolModelMessage, UserModelMessage } from "ai";
3
- import { Output } from "ai";
4
- import type { ChatCompletionsToolCall, ChatCompletionsTool, ChatCompletionsToolChoice, ChatCompletionsStream, ChatCompletionsContentPart, ChatCompletionsMessage, ChatCompletionsUserMessage, ChatCompletionsAssistantMessage, ChatCompletionsToolMessage, ChatCompletionsFinishReason, ChatCompletionsUsage, ChatCompletionsInputs, ChatCompletions, ChatCompletionsChunk, ChatCompletionsReasoningDetail } from "./schema";
5
- import type { SseErrorFrame, SseFrame } from "../../utils/stream";
6
- import { type TextCallOptions, type ToolChoiceOptions } from "../shared/converters";
7
- export declare function convertToTextCallOptions(params: ChatCompletionsInputs): TextCallOptions;
8
- export declare function convertToModelMessages(messages: ChatCompletionsMessage[]): ModelMessage[];
9
- export declare function fromChatCompletionsUserMessage(message: ChatCompletionsUserMessage): UserModelMessage;
10
- export declare function fromChatCompletionsAssistantMessage(message: ChatCompletionsAssistantMessage): AssistantModelMessage;
11
- export declare function fromChatCompletionsToolResultMessage(message: ChatCompletionsAssistantMessage, toolById: Map<string, ChatCompletionsToolMessage>): ToolModelMessage | undefined;
12
- export declare function fromChatCompletionsContent(content: ChatCompletionsContentPart[]): UserContent;
13
- export declare const convertToToolSet: (tools: ChatCompletionsTool[] | undefined) => ToolSet | undefined;
14
- export declare const convertToToolChoiceOptions: (toolChoice: ChatCompletionsToolChoice | undefined) => ToolChoiceOptions;
15
- export declare function toChatCompletions(result: GenerateTextResult<ToolSet, Output.Output>, model: string): ChatCompletions;
16
- export declare function toChatCompletionsResponse(result: GenerateTextResult<ToolSet, Output.Output>, model: string, responseInit?: ResponseInit): Response;
17
- export declare function toChatCompletionsStream(result: StreamTextResult<ToolSet, Output.Output>, model: string): ChatCompletionsStream;
18
- export declare function toChatCompletionsStreamResponse(result: StreamTextResult<ToolSet, Output.Output>, model: string, responseInit?: ResponseInit): Response;
19
- export declare class ChatCompletionsTransformStream extends TransformStream<TextStreamPart<ToolSet>, SseFrame<ChatCompletionsChunk> | SseErrorFrame> {
20
- constructor(model: string);
21
- }
22
- export declare const toChatCompletionsAssistantMessage: (result: GenerateTextResult<ToolSet, Output.Output>) => ChatCompletionsAssistantMessage;
23
- export declare function toReasoningDetail(reasoning: ReasoningOutput, id: string, index: number): ChatCompletionsReasoningDetail;
24
- export declare function toChatCompletionsUsage(usage: LanguageModelUsage): ChatCompletionsUsage;
25
- export declare function toChatCompletionsToolCall(id: string, name: string, args: unknown, providerMetadata?: SharedV3ProviderMetadata): ChatCompletionsToolCall;
26
- export declare const toChatCompletionsFinishReason: (finishReason: FinishReason) => ChatCompletionsFinishReason;