@hebo-ai/gateway 0.6.2 → 0.8.0-rc0
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/README.md +134 -7
- package/package.json +46 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.js +0 -81
- package/dist/endpoints/chat-completions/converters.d.ts +0 -43
- package/dist/endpoints/chat-completions/converters.js +0 -625
- package/dist/endpoints/chat-completions/handler.d.ts +0 -2
- package/dist/endpoints/chat-completions/handler.js +0 -149
- package/dist/endpoints/chat-completions/index.d.ts +0 -4
- package/dist/endpoints/chat-completions/index.js +0 -4
- package/dist/endpoints/chat-completions/otel.d.ts +0 -5
- package/dist/endpoints/chat-completions/otel.js +0 -171
- package/dist/endpoints/chat-completions/schema.d.ts +0 -1188
- package/dist/endpoints/chat-completions/schema.js +0 -298
- package/dist/endpoints/embeddings/converters.d.ts +0 -10
- package/dist/endpoints/embeddings/converters.js +0 -31
- package/dist/endpoints/embeddings/handler.d.ts +0 -2
- package/dist/endpoints/embeddings/handler.js +0 -104
- package/dist/endpoints/embeddings/index.d.ts +0 -4
- package/dist/endpoints/embeddings/index.js +0 -4
- package/dist/endpoints/embeddings/otel.d.ts +0 -5
- package/dist/endpoints/embeddings/otel.js +0 -29
- package/dist/endpoints/embeddings/schema.d.ts +0 -44
- package/dist/endpoints/embeddings/schema.js +0 -29
- package/dist/endpoints/models/converters.d.ts +0 -6
- package/dist/endpoints/models/converters.js +0 -42
- package/dist/endpoints/models/handler.d.ts +0 -2
- package/dist/endpoints/models/handler.js +0 -29
- package/dist/endpoints/models/index.d.ts +0 -3
- package/dist/endpoints/models/index.js +0 -3
- package/dist/endpoints/models/schema.d.ts +0 -42
- package/dist/endpoints/models/schema.js +0 -31
- package/dist/errors/ai-sdk.d.ts +0 -2
- package/dist/errors/ai-sdk.js +0 -52
- package/dist/errors/gateway.d.ts +0 -5
- package/dist/errors/gateway.js +0 -13
- package/dist/errors/openai.d.ts +0 -20
- package/dist/errors/openai.js +0 -40
- package/dist/errors/utils.d.ts +0 -22
- package/dist/errors/utils.js +0 -44
- package/dist/gateway.d.ts +0 -9
- package/dist/gateway.js +0 -40
- package/dist/index.d.ts +0 -14
- package/dist/index.js +0 -13
- package/dist/lifecycle.d.ts +0 -2
- package/dist/lifecycle.js +0 -98
- package/dist/logger/default.d.ts +0 -4
- package/dist/logger/default.js +0 -81
- package/dist/logger/index.d.ts +0 -11
- package/dist/logger/index.js +0 -25
- package/dist/middleware/common.d.ts +0 -12
- package/dist/middleware/common.js +0 -146
- package/dist/middleware/debug.d.ts +0 -3
- package/dist/middleware/debug.js +0 -27
- package/dist/middleware/matcher.d.ts +0 -28
- package/dist/middleware/matcher.js +0 -118
- package/dist/middleware/utils.d.ts +0 -2
- package/dist/middleware/utils.js +0 -24
- package/dist/models/amazon/index.d.ts +0 -2
- package/dist/models/amazon/index.js +0 -2
- package/dist/models/amazon/middleware.d.ts +0 -3
- package/dist/models/amazon/middleware.js +0 -68
- package/dist/models/amazon/presets.d.ts +0 -345
- package/dist/models/amazon/presets.js +0 -80
- package/dist/models/anthropic/index.d.ts +0 -2
- package/dist/models/anthropic/index.js +0 -2
- package/dist/models/anthropic/middleware.d.ts +0 -5
- package/dist/models/anthropic/middleware.js +0 -127
- package/dist/models/anthropic/presets.d.ts +0 -711
- package/dist/models/anthropic/presets.js +0 -135
- package/dist/models/catalog.d.ts +0 -4
- package/dist/models/catalog.js +0 -8
- package/dist/models/cohere/index.d.ts +0 -2
- package/dist/models/cohere/index.js +0 -2
- package/dist/models/cohere/middleware.d.ts +0 -3
- package/dist/models/cohere/middleware.js +0 -62
- package/dist/models/cohere/presets.d.ts +0 -411
- package/dist/models/cohere/presets.js +0 -134
- package/dist/models/google/index.d.ts +0 -2
- package/dist/models/google/index.js +0 -2
- package/dist/models/google/middleware.d.ts +0 -8
- package/dist/models/google/middleware.js +0 -111
- package/dist/models/google/presets.d.ts +0 -375
- package/dist/models/google/presets.js +0 -82
- package/dist/models/meta/index.d.ts +0 -1
- package/dist/models/meta/index.js +0 -1
- package/dist/models/meta/presets.d.ts +0 -483
- package/dist/models/meta/presets.js +0 -95
- package/dist/models/openai/index.d.ts +0 -2
- package/dist/models/openai/index.js +0 -2
- package/dist/models/openai/middleware.d.ts +0 -4
- package/dist/models/openai/middleware.js +0 -88
- package/dist/models/openai/presets.d.ts +0 -959
- package/dist/models/openai/presets.js +0 -213
- package/dist/models/types.d.ts +0 -20
- package/dist/models/types.js +0 -84
- package/dist/models/voyage/index.d.ts +0 -2
- package/dist/models/voyage/index.js +0 -2
- package/dist/models/voyage/middleware.d.ts +0 -2
- package/dist/models/voyage/middleware.js +0 -19
- package/dist/models/voyage/presets.d.ts +0 -436
- package/dist/models/voyage/presets.js +0 -85
- package/dist/providers/anthropic/canonical.d.ts +0 -3
- package/dist/providers/anthropic/canonical.js +0 -9
- package/dist/providers/anthropic/index.d.ts +0 -1
- package/dist/providers/anthropic/index.js +0 -1
- package/dist/providers/bedrock/canonical.d.ts +0 -17
- package/dist/providers/bedrock/canonical.js +0 -61
- package/dist/providers/bedrock/index.d.ts +0 -2
- package/dist/providers/bedrock/index.js +0 -2
- package/dist/providers/bedrock/middleware.d.ts +0 -4
- package/dist/providers/bedrock/middleware.js +0 -104
- package/dist/providers/cohere/canonical.d.ts +0 -3
- package/dist/providers/cohere/canonical.js +0 -17
- package/dist/providers/cohere/index.d.ts +0 -1
- package/dist/providers/cohere/index.js +0 -1
- package/dist/providers/groq/canonical.d.ts +0 -3
- package/dist/providers/groq/canonical.js +0 -12
- package/dist/providers/groq/index.d.ts +0 -1
- package/dist/providers/groq/index.js +0 -1
- package/dist/providers/openai/canonical.d.ts +0 -3
- package/dist/providers/openai/canonical.js +0 -8
- package/dist/providers/openai/index.d.ts +0 -1
- package/dist/providers/openai/index.js +0 -1
- package/dist/providers/registry.d.ts +0 -24
- package/dist/providers/registry.js +0 -103
- package/dist/providers/types.d.ts +0 -7
- package/dist/providers/types.js +0 -11
- package/dist/providers/vertex/canonical.d.ts +0 -3
- package/dist/providers/vertex/canonical.js +0 -8
- package/dist/providers/vertex/index.d.ts +0 -1
- package/dist/providers/vertex/index.js +0 -1
- package/dist/providers/voyage/canonical.d.ts +0 -3
- package/dist/providers/voyage/canonical.js +0 -7
- package/dist/providers/voyage/index.d.ts +0 -1
- package/dist/providers/voyage/index.js +0 -1
- package/dist/telemetry/ai-sdk.d.ts +0 -2
- package/dist/telemetry/ai-sdk.js +0 -31
- package/dist/telemetry/baggage.d.ts +0 -1
- package/dist/telemetry/baggage.js +0 -24
- package/dist/telemetry/fetch.d.ts +0 -2
- package/dist/telemetry/fetch.js +0 -49
- package/dist/telemetry/gen-ai.d.ts +0 -6
- package/dist/telemetry/gen-ai.js +0 -78
- package/dist/telemetry/http.d.ts +0 -3
- package/dist/telemetry/http.js +0 -54
- package/dist/telemetry/index.d.ts +0 -1
- package/dist/telemetry/index.js +0 -1
- package/dist/telemetry/memory.d.ts +0 -2
- package/dist/telemetry/memory.js +0 -43
- package/dist/telemetry/span.d.ts +0 -13
- package/dist/telemetry/span.js +0 -60
- package/dist/telemetry/stream.d.ts +0 -3
- package/dist/telemetry/stream.js +0 -58
- package/dist/types.d.ts +0 -176
- package/dist/types.js +0 -1
- package/dist/utils/env.d.ts +0 -2
- package/dist/utils/env.js +0 -7
- package/dist/utils/headers.d.ts +0 -4
- package/dist/utils/headers.js +0 -22
- package/dist/utils/preset.d.ts +0 -10
- package/dist/utils/preset.js +0 -42
- package/dist/utils/request.d.ts +0 -2
- package/dist/utils/request.js +0 -43
- package/dist/utils/response.d.ts +0 -3
- package/dist/utils/response.js +0 -70
- package/dist/utils/url.d.ts +0 -4
- package/dist/utils/url.js +0 -21
package/README.md
CHANGED
|
@@ -13,6 +13,7 @@ Learn more in our blog post: [Yet Another AI Gateway?](https://hebo.ai/blog/2601
|
|
|
13
13
|
## 🍌 Features
|
|
14
14
|
|
|
15
15
|
- 🌐 OpenAI-compatible /chat/completions, /embeddings & /models endpoints.
|
|
16
|
+
- 💬 /conversations endpoint built on top of the Responses API.
|
|
16
17
|
- 🔌 Integrate into your existing Hono, Elysia, Next.js & TanStack apps.
|
|
17
18
|
- 🧩 Provider registry compatible with Vercel AI SDK providers.
|
|
18
19
|
- 🧭 Canonical model IDs and parameter naming across providers.
|
|
@@ -32,13 +33,13 @@ bun install @hebo-ai/gateway
|
|
|
32
33
|
- Quickstart
|
|
33
34
|
- [Setup A Gateway Instance](#setup-a-gateway-instance) | [Mount Route Handlers](#mount-route-handlers) | [Call the Gateway](#call-the-gateway)
|
|
34
35
|
- Configuration Reference
|
|
35
|
-
- [Providers](#providers) | [Models](#models) | [Hooks](#hooks) | [Logger](#logger-settings) | [Observability](#observability)
|
|
36
|
+
- [Providers](#providers) | [Models](#models) | [Hooks](#hooks) | [Storage](#storage) | [Logger](#logger-settings) | [Observability](#observability) | [Timeouts](#timeout-settings)
|
|
36
37
|
- Framework Support
|
|
37
38
|
- [ElysiaJS](#elysiajs) | [Hono](#hono) | [Next.js](#nextjs) | [TanStack Start](#tanstack-start)
|
|
38
39
|
- Runtime Support
|
|
39
40
|
- [Vercel Edge](#vercel-edge) | [Cloudflare Workers](#cloudflare-workers) | [Deno Deploy](#deno-deploy) | [AWS Lambda](#aws-lambda)
|
|
40
41
|
- OpenAI Extensions
|
|
41
|
-
- [Reasoning](#reasoning) | [Prompt Caching](#prompt-caching)
|
|
42
|
+
- [Reasoning](#reasoning) | [Service Tier](#service-tier) | [Prompt Caching](#prompt-caching)
|
|
42
43
|
- Advanced Usage
|
|
43
44
|
- [Passing Framework State to Hooks](#passing-framework-state-to-hooks) | [Selective Route Mounting](#selective-route-mounting) | [Low-level Schemas & Converters](#low-level-schemas--converters)
|
|
44
45
|
|
|
@@ -342,10 +343,8 @@ const gw = gateway({
|
|
|
342
343
|
* @returns Modified result, or undefined to keep original.
|
|
343
344
|
*/
|
|
344
345
|
after: async (ctx: {
|
|
345
|
-
result: ChatCompletions |
|
|
346
|
-
}): Promise<
|
|
347
|
-
ChatCompletions | ReadableStream<ChatCompletionsChunk | Error> | Embeddings | void
|
|
348
|
-
> => {
|
|
346
|
+
result: ChatCompletions | ChatCompletionsStream | Embeddings;
|
|
347
|
+
}): Promise<ChatCompletions | ChatCompletionsStream | Embeddings | void> => {
|
|
349
348
|
// Example Use Cases:
|
|
350
349
|
// - Transform result
|
|
351
350
|
// - Result logging
|
|
@@ -371,6 +370,52 @@ The `ctx` object is **readonly for core fields**. Use return values to override
|
|
|
371
370
|
> [!TIP]
|
|
372
371
|
> To pass data between hooks, use `ctx.state`. It’s a per-request mutable bag in which you can stash things like auth info, routing decisions, timers, or trace IDs and read them later again in any of the other hooks.
|
|
373
372
|
|
|
373
|
+
### Storage
|
|
374
|
+
|
|
375
|
+
The `/conversations` endpoint stores conversation history and associated items. By default, the gateway uses an in-memory storage, which is suitable for development but not for production as data is lost when the server restarts.
|
|
376
|
+
|
|
377
|
+
#### In-Memory Storage
|
|
378
|
+
|
|
379
|
+
You can configure the size of the in-memory storage (default is 256MB).
|
|
380
|
+
|
|
381
|
+
```ts
|
|
382
|
+
import { gateway } from "@hebo-ai/gateway";
|
|
383
|
+
import { InMemoryStorage } from "@hebo-ai/gateway/storage/memory";
|
|
384
|
+
|
|
385
|
+
const gw = gateway({
|
|
386
|
+
// ...
|
|
387
|
+
storage: new InMemoryStorage({
|
|
388
|
+
maxSize: 512 * 1024 * 1024, // 512MB
|
|
389
|
+
}),
|
|
390
|
+
});
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
#### SQL Storage
|
|
394
|
+
|
|
395
|
+
Hebo Gateway provides high-performance SQL adapters for **PostgreSQL**, **SQLite**, **MySQL**, and **GrepTimeDB**. It supports common drivers like `pg`, `postgres.js`, `mysql2`, `better-sqlite3`, `@libsql/client`, and `Bun.SQL`.
|
|
396
|
+
|
|
397
|
+
```ts
|
|
398
|
+
import { gateway } from "@hebo-ai/gateway";
|
|
399
|
+
import { SqlStorage, PostgresDialect } from "@hebo-ai/gateway/storage/sql";
|
|
400
|
+
import { Pool } from "pg";
|
|
401
|
+
|
|
402
|
+
// 1. Setup dialect-specific client (e.g. pg, mysql2, sqlite, bun)
|
|
403
|
+
const client = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
404
|
+
|
|
405
|
+
// 2. Setup storage with matching dialect (PostgresDialect, SqliteDialect, MysqlDialect, ...)
|
|
406
|
+
const storage = new SqlStorage({
|
|
407
|
+
dialect: new PostgresDialect({ client }),
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// 3. Run migrations
|
|
411
|
+
await storage.migrate();
|
|
412
|
+
|
|
413
|
+
const gw = gateway({ storage });
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
> [!TIP]
|
|
417
|
+
> The `PostgresDialect` includes optimized `JSONB` storage and high-performance `BRIN` indexing for time-ordered data by default.
|
|
418
|
+
|
|
374
419
|
## 🧩 Framework Support
|
|
375
420
|
|
|
376
421
|
Hebo Gateway exposes **WinterCG-compatible** handlers that integrate with almost any existing framework.
|
|
@@ -561,6 +606,57 @@ Advanced models (like Anthropic Claude 3.7 or Gemini 3) surface structured reaso
|
|
|
561
606
|
|
|
562
607
|
For **Gemini 3** models, returning the thought signature via `extra_content` is mandatory to resume the chain-of-thought; failing to do so may result in errors or degraded performance.
|
|
563
608
|
|
|
609
|
+
### Service Tier
|
|
610
|
+
|
|
611
|
+
The chat completions endpoint accepts a provider-agnostic `service_tier` extension:
|
|
612
|
+
|
|
613
|
+
- `auto`, `default`, `flex`, `priority`, `scale`
|
|
614
|
+
|
|
615
|
+
Provider-specific mapping:
|
|
616
|
+
|
|
617
|
+
- **OpenAI**: forwards as OpenAI `serviceTier` (no middleware remap).
|
|
618
|
+
- **Groq**: maps to Groq `serviceTier` (`default` -> `on_demand`, `scale`/`priority` -> `performance`).
|
|
619
|
+
- **Google Vertex**: maps to request headers via middleware:
|
|
620
|
+
- `default` -> `x-vertex-ai-llm-request-type: shared`
|
|
621
|
+
- `flex` -> `x-vertex-ai-llm-request-type: shared` + `x-vertex-ai-llm-shared-request-type: flex`
|
|
622
|
+
- `priority` -> `x-vertex-ai-llm-request-type: shared` + `x-vertex-ai-llm-shared-request-type: priority`
|
|
623
|
+
- `scale` -> `x-vertex-ai-llm-request-type: dedicated`
|
|
624
|
+
- **Amazon Bedrock**: maps to Bedrock `serviceTier.type` (`default`, `flex`, `priority`, `reserved`; `scale` -> `reserved`, `auto` -> omitted/default).
|
|
625
|
+
|
|
626
|
+
When available, the resolved value is echoed back on response as `service_tier`.
|
|
627
|
+
|
|
628
|
+
### Conversations
|
|
629
|
+
|
|
630
|
+
Hebo Gateway provides a dedicated `/conversations` endpoint for managing persistent conversation state. It is designed as an extension of the [OpenAI Conversations API](https://developers.openai.com/api/reference/typescript/resources/conversations) and supports standard CRUD operations alongside advanced listing with metadata filtering.
|
|
631
|
+
|
|
632
|
+
#### List & Filter Conversations
|
|
633
|
+
|
|
634
|
+
You can list conversations with standard cursor-based pagination and filter by any metadata key using the `metadata.KEY=VALUE` pattern.
|
|
635
|
+
|
|
636
|
+
```bash
|
|
637
|
+
# List conversations for a specific user
|
|
638
|
+
curl "https://api.gateway.com/conversations?limit=10&metadata.user_id=123"
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
The response follows the standard OpenAI list object:
|
|
642
|
+
|
|
643
|
+
```json
|
|
644
|
+
{
|
|
645
|
+
"object": "list",
|
|
646
|
+
"data": [
|
|
647
|
+
{
|
|
648
|
+
"id": "conv_abc123",
|
|
649
|
+
"object": "conversation",
|
|
650
|
+
"created_at": 1678531200,
|
|
651
|
+
"metadata": { "user_id": "123" }
|
|
652
|
+
}
|
|
653
|
+
],
|
|
654
|
+
"first_id": "conv_abc123",
|
|
655
|
+
"last_id": "conv_abc123",
|
|
656
|
+
"has_more": false
|
|
657
|
+
}
|
|
658
|
+
```
|
|
659
|
+
|
|
564
660
|
### Prompt Caching
|
|
565
661
|
|
|
566
662
|
The chat completions endpoint supports both implicit (provider-managed) and explicit prompt caching across OpenAI-compatible providers.
|
|
@@ -737,6 +833,37 @@ const gw = gateway({
|
|
|
737
833
|
|
|
738
834
|
Langfuse credentials are read from environment variables by the Langfuse OTel SDK (`LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_BASE_URL`).
|
|
739
835
|
|
|
836
|
+
### Timeout Settings
|
|
837
|
+
|
|
838
|
+
You can configure request timeouts via the `timeouts` field:
|
|
839
|
+
|
|
840
|
+
```ts
|
|
841
|
+
import { gateway } from "@hebo-ai/gateway";
|
|
842
|
+
|
|
843
|
+
const gw = gateway({
|
|
844
|
+
// ...
|
|
845
|
+
// default timeout is 300_000 (5 minutes).
|
|
846
|
+
// You can set one timeout for all tiers...
|
|
847
|
+
timeouts: 60_000,
|
|
848
|
+
// ...disable timeouts completely:
|
|
849
|
+
// timeouts: null,
|
|
850
|
+
// ...or split by service tier:
|
|
851
|
+
// - normal: all non-flex tiers (set null to disable)
|
|
852
|
+
// - flex: defaults to 3x normal when omitted (set null to disable)
|
|
853
|
+
// timeouts: { normal: 30_000, flex: null },
|
|
854
|
+
});
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
> [!NOTE]
|
|
858
|
+
> **Runtime/engine timeout limits**
|
|
859
|
+
> Runtime-level `fetch()` clients may enforce their own timeouts. Configure those runtime/platform limits in addition to gateway `timeouts`.
|
|
860
|
+
>
|
|
861
|
+
> - Node.js runtimes use Undici: https://github.com/nodejs/undici/issues/1373 (Node.js, Vercel Serverless Functions, AWS Lambda)
|
|
862
|
+
> - Bun context: https://github.com/oven-sh/bun/issues/16682
|
|
863
|
+
>
|
|
864
|
+
> **Provider/service timeout limits**
|
|
865
|
+
> Serverless platforms (e.g. Cloudflare Workers, Vercel Edge/Serverless, AWS Lambda) also enforce platform time limits (roughly ~25-100s on edge paths, ~300s for streaming, and up to ~900s configurable for some).
|
|
866
|
+
|
|
740
867
|
### Passing Framework State to Hooks
|
|
741
868
|
|
|
742
869
|
You can pass per-request info from your framework into the gateway via the second `state` argument on the handler, then read it in hooks through `ctx.state`.
|
|
@@ -838,7 +965,7 @@ export async function handler(req: Request): Promise<Response> {
|
|
|
838
965
|
}
|
|
839
966
|
```
|
|
840
967
|
|
|
841
|
-
Non-streaming versions are available via `
|
|
968
|
+
Non-streaming versions are available via `toChatCompletionsResponse`. Equivalent schemas and helpers are available in the `conversations`, `embeddings` and `models` endpoints.
|
|
842
969
|
|
|
843
970
|
> [!TIP]
|
|
844
971
|
> 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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hebo-ai/gateway",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0-rc0",
|
|
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",
|
|
@@ -53,6 +53,11 @@
|
|
|
53
53
|
"types": "./dist/endpoints/chat-completions/index.d.ts",
|
|
54
54
|
"import": "./dist/endpoints/chat-completions/index.js"
|
|
55
55
|
},
|
|
56
|
+
"./endpoints/conversations": {
|
|
57
|
+
"types": "./dist/endpoints/conversations/index.d.ts",
|
|
58
|
+
"import": "./dist/endpoints/conversations/index.js",
|
|
59
|
+
"dev-source": "./src/endpoints/conversations/index.ts"
|
|
60
|
+
},
|
|
56
61
|
"./endpoints/embeddings": {
|
|
57
62
|
"types": "./dist/endpoints/embeddings/index.d.ts",
|
|
58
63
|
"import": "./dist/endpoints/embeddings/index.js"
|
|
@@ -61,6 +66,16 @@
|
|
|
61
66
|
"types": "./dist/endpoints/models/index.d.ts",
|
|
62
67
|
"import": "./dist/endpoints/models/index.js"
|
|
63
68
|
},
|
|
69
|
+
"./storage/memory": {
|
|
70
|
+
"types": "./dist/endpoints/conversations/storage/memory.d.ts",
|
|
71
|
+
"import": "./dist/endpoints/conversations/storage/memory.js",
|
|
72
|
+
"dev-source": "./src/endpoints/conversations/storage/memory.ts"
|
|
73
|
+
},
|
|
74
|
+
"./storage/sql": {
|
|
75
|
+
"types": "./dist/endpoints/conversations/storage/sql.d.ts",
|
|
76
|
+
"import": "./dist/endpoints/conversations/storage/sql.js",
|
|
77
|
+
"dev-source": "./src/endpoints/conversations/storage/sql.ts"
|
|
78
|
+
},
|
|
64
79
|
"./errors/openai": {
|
|
65
80
|
"types": "./dist/errors/openai.d.ts",
|
|
66
81
|
"import": "./dist/errors/openai.js"
|
|
@@ -142,6 +157,8 @@
|
|
|
142
157
|
"dependencies": {
|
|
143
158
|
"@ai-sdk/provider": "^3.0.8",
|
|
144
159
|
"ai": "^6.0.116",
|
|
160
|
+
"lru-cache": "^11.2.6",
|
|
161
|
+
"uuid": "^13.0.0",
|
|
145
162
|
"zod": "^4.3.6"
|
|
146
163
|
},
|
|
147
164
|
"devDependencies": {
|
|
@@ -153,23 +170,31 @@
|
|
|
153
170
|
"@ai-sdk/openai": "^3.0.41",
|
|
154
171
|
"@aws-sdk/credential-providers": "^3.1004.0",
|
|
155
172
|
"@langfuse/otel": "^4.6.1",
|
|
173
|
+
"@libsql/client": "^0.17.0",
|
|
156
174
|
"@mjackson/node-fetch-server": "^0.7.0",
|
|
157
175
|
"@opentelemetry/api": "^1.9.0",
|
|
158
176
|
"@opentelemetry/context-async-hooks": "^2.6.0",
|
|
159
177
|
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
160
178
|
"@tanstack/react-router": "^1.166.3",
|
|
161
179
|
"@tanstack/react-start": "^1.166.3",
|
|
180
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
162
181
|
"@types/bun": "latest",
|
|
182
|
+
"@types/pg": "^8.18.0",
|
|
163
183
|
"@types/react": "^19.2.14",
|
|
164
184
|
"@types/react-dom": "^19.2.3",
|
|
185
|
+
"@types/uuid": "^11.0.0",
|
|
186
|
+
"better-sqlite3": "^12.6.2",
|
|
165
187
|
"elysia": "^1.4.27",
|
|
166
188
|
"hono": "^4.12.5",
|
|
167
189
|
"lefthook": "^2.1.3",
|
|
190
|
+
"mysql2": "^3.18.2",
|
|
168
191
|
"next": "^16.1.6",
|
|
169
192
|
"oxfmt": "^0.24.0",
|
|
170
193
|
"oxlint": "^1.51.0",
|
|
171
194
|
"oxlint-tsgolint": "^0.16.0",
|
|
195
|
+
"pg": "^8.19.0",
|
|
172
196
|
"pino": "^10.3.1",
|
|
197
|
+
"postgres": "^3.4.8",
|
|
173
198
|
"typescript": "^5.9.3",
|
|
174
199
|
"vite": "^7.3.1",
|
|
175
200
|
"vite-tsconfig-paths": "^6.1.1",
|
|
@@ -183,7 +208,12 @@
|
|
|
183
208
|
"@ai-sdk/google-vertex": "^4.0.80",
|
|
184
209
|
"@ai-sdk/groq": "^3.0.29",
|
|
185
210
|
"@ai-sdk/openai": "^3.0.41",
|
|
211
|
+
"@libsql/client": "^0.14.0",
|
|
186
212
|
"@opentelemetry/api": "^1.9.0",
|
|
213
|
+
"better-sqlite3": "^11.0.0",
|
|
214
|
+
"mysql2": "^3.11.0",
|
|
215
|
+
"pg": "^8.13.0",
|
|
216
|
+
"postgres": "^3.4.0",
|
|
187
217
|
"typescript": "^5.9.3",
|
|
188
218
|
"voyage-ai-provider": "^3.0.0"
|
|
189
219
|
},
|
|
@@ -211,6 +241,21 @@
|
|
|
211
241
|
},
|
|
212
242
|
"voyage-ai-provider": {
|
|
213
243
|
"optional": true
|
|
244
|
+
},
|
|
245
|
+
"pg": {
|
|
246
|
+
"optional": true
|
|
247
|
+
},
|
|
248
|
+
"postgres": {
|
|
249
|
+
"optional": true
|
|
250
|
+
},
|
|
251
|
+
"mysql2": {
|
|
252
|
+
"optional": true
|
|
253
|
+
},
|
|
254
|
+
"better-sqlite3": {
|
|
255
|
+
"optional": true
|
|
256
|
+
},
|
|
257
|
+
"@libsql/client": {
|
|
258
|
+
"optional": true
|
|
214
259
|
}
|
|
215
260
|
}
|
|
216
261
|
}
|
package/dist/config.d.ts
DELETED
package/dist/config.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { isLogger, logger, setLoggerInstance } from "./logger";
|
|
2
|
-
import { createDefaultLogger } from "./logger/default";
|
|
3
|
-
import { installAiSdkWarningLogger } from "./telemetry/ai-sdk";
|
|
4
|
-
import { kParsed, } from "./types";
|
|
5
|
-
export const parseConfig = (config) => {
|
|
6
|
-
// If it has been parsed before, just return.
|
|
7
|
-
if (kParsed in config)
|
|
8
|
-
return config;
|
|
9
|
-
const providers = config.providers ?? {};
|
|
10
|
-
const parsedProviders = {};
|
|
11
|
-
const models = config.models ?? {};
|
|
12
|
-
// Set the global logger instance.
|
|
13
|
-
if (config.logger === undefined) {
|
|
14
|
-
setLoggerInstance(createDefaultLogger({}));
|
|
15
|
-
}
|
|
16
|
-
else if (config.logger !== null) {
|
|
17
|
-
setLoggerInstance(isLogger(config.logger) ? config.logger : createDefaultLogger(config.logger));
|
|
18
|
-
logger.info(isLogger(config.logger)
|
|
19
|
-
? `[logger] custom logger configured`
|
|
20
|
-
: `[logger] logger configured: level=${config.logger.level}`);
|
|
21
|
-
}
|
|
22
|
-
// Strip providers that are not configured.
|
|
23
|
-
for (const id in providers) {
|
|
24
|
-
const provider = providers[id];
|
|
25
|
-
if (provider === undefined) {
|
|
26
|
-
logger.warn(`[config] ${id} provider removed (undefined)`);
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
parsedProviders[id] = provider;
|
|
30
|
-
}
|
|
31
|
-
if (Object.keys(parsedProviders).length === 0) {
|
|
32
|
-
throw new Error("No providers configured (config.providers is empty)");
|
|
33
|
-
}
|
|
34
|
-
// Strip providers that are not configured from models.
|
|
35
|
-
const parsedModels = {};
|
|
36
|
-
const warnings = new Set();
|
|
37
|
-
for (const id in models) {
|
|
38
|
-
const model = models[id];
|
|
39
|
-
const kept = [];
|
|
40
|
-
for (const p of model.providers) {
|
|
41
|
-
if (p in parsedProviders)
|
|
42
|
-
kept.push(p);
|
|
43
|
-
else
|
|
44
|
-
warnings.add(p);
|
|
45
|
-
}
|
|
46
|
-
if (kept.length > 0)
|
|
47
|
-
parsedModels[id] = { ...model, providers: kept };
|
|
48
|
-
}
|
|
49
|
-
for (const warning of warnings) {
|
|
50
|
-
logger.warn(`[config] ${warning} provider removed (not configured)`);
|
|
51
|
-
}
|
|
52
|
-
if (Object.keys(parsedModels).length === 0) {
|
|
53
|
-
throw new Error("No models configured (config.models is empty)");
|
|
54
|
-
}
|
|
55
|
-
// Default for the telemetry settings.
|
|
56
|
-
const telemetryEnabled = config.telemetry?.enabled ?? false;
|
|
57
|
-
const telemetrySignals = telemetryEnabled
|
|
58
|
-
? {
|
|
59
|
-
http: config.telemetry?.signals?.http ?? "recommended",
|
|
60
|
-
gen_ai: config.telemetry?.signals?.gen_ai ?? "full",
|
|
61
|
-
hebo: config.telemetry?.signals?.hebo ?? "off",
|
|
62
|
-
}
|
|
63
|
-
: {
|
|
64
|
-
http: "off",
|
|
65
|
-
gen_ai: "off",
|
|
66
|
-
hebo: "off",
|
|
67
|
-
};
|
|
68
|
-
installAiSdkWarningLogger(telemetrySignals.gen_ai);
|
|
69
|
-
// Return parsed config.
|
|
70
|
-
return {
|
|
71
|
-
...config,
|
|
72
|
-
telemetry: {
|
|
73
|
-
...config.telemetry,
|
|
74
|
-
enabled: telemetryEnabled,
|
|
75
|
-
signals: telemetrySignals,
|
|
76
|
-
},
|
|
77
|
-
providers: parsedProviders,
|
|
78
|
-
models: parsedModels,
|
|
79
|
-
[kParsed]: true,
|
|
80
|
-
};
|
|
81
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { SharedV3ProviderOptions, SharedV3ProviderMetadata } from "@ai-sdk/provider";
|
|
2
|
-
import type { GenerateTextResult, StreamTextResult, FinishReason, ToolChoice, ToolSet, ModelMessage, UserContent, LanguageModelUsage, TextStreamPart, ReasoningOutput, AssistantModelMessage, ToolModelMessage, UserModelMessage } from "ai";
|
|
3
|
-
import { Output } from "ai";
|
|
4
|
-
import type { ChatCompletionsToolCall, ChatCompletionsTool, ChatCompletionsToolChoice, ChatCompletionsContentPart, ChatCompletionsMessage, ChatCompletionsUserMessage, ChatCompletionsAssistantMessage, ChatCompletionsToolMessage, ChatCompletionsFinishReason, ChatCompletionsUsage, ChatCompletionsInputs, ChatCompletions, ChatCompletionsChunk, ChatCompletionsReasoningDetail } from "./schema";
|
|
5
|
-
import { OpenAIError } from "../../errors/openai";
|
|
6
|
-
export type TextCallOptions = {
|
|
7
|
-
messages: ModelMessage[];
|
|
8
|
-
tools?: ToolSet;
|
|
9
|
-
toolChoice?: ToolChoice<ToolSet>;
|
|
10
|
-
activeTools?: Array<keyof ToolSet>;
|
|
11
|
-
output?: Output.Output;
|
|
12
|
-
temperature?: number;
|
|
13
|
-
maxOutputTokens?: number;
|
|
14
|
-
frequencyPenalty?: number;
|
|
15
|
-
presencePenalty?: number;
|
|
16
|
-
seed?: number;
|
|
17
|
-
stopSequences?: string[];
|
|
18
|
-
topP?: number;
|
|
19
|
-
providerOptions: SharedV3ProviderOptions;
|
|
20
|
-
};
|
|
21
|
-
export declare function convertToTextCallOptions(params: ChatCompletionsInputs): TextCallOptions;
|
|
22
|
-
export declare function convertToModelMessages(messages: ChatCompletionsMessage[]): ModelMessage[];
|
|
23
|
-
export declare function fromChatCompletionsUserMessage(message: ChatCompletionsUserMessage): UserModelMessage;
|
|
24
|
-
export declare function fromChatCompletionsAssistantMessage(message: ChatCompletionsAssistantMessage): AssistantModelMessage;
|
|
25
|
-
export declare function fromChatCompletionsToolResultMessage(message: ChatCompletionsAssistantMessage, toolById: Map<string, ChatCompletionsToolMessage>): ToolModelMessage | undefined;
|
|
26
|
-
export declare function fromChatCompletionsContent(content: ChatCompletionsContentPart[]): UserContent;
|
|
27
|
-
export declare const convertToToolSet: (tools: ChatCompletionsTool[] | undefined) => ToolSet | undefined;
|
|
28
|
-
export declare const convertToToolChoiceOptions: (toolChoice: ChatCompletionsToolChoice | undefined) => {
|
|
29
|
-
toolChoice?: ToolChoice<ToolSet>;
|
|
30
|
-
activeTools?: Array<keyof ToolSet>;
|
|
31
|
-
};
|
|
32
|
-
export declare function toChatCompletions(result: GenerateTextResult<ToolSet, Output.Output>, model: string): ChatCompletions;
|
|
33
|
-
export declare function toChatCompletionsResponse(result: GenerateTextResult<ToolSet, Output.Output>, model: string, responseInit?: ResponseInit): Response;
|
|
34
|
-
export declare function toChatCompletionsStream<E extends boolean = false>(result: StreamTextResult<ToolSet, Output.Output>, model: string, wrapErrors?: E): ReadableStream<ChatCompletionsChunk | (E extends true ? OpenAIError : Error)>;
|
|
35
|
-
export declare function toChatCompletionsStreamResponse(result: StreamTextResult<ToolSet, Output.Output>, model: string, responseInit?: ResponseInit): Response;
|
|
36
|
-
export declare class ChatCompletionsStream<E extends boolean = false> extends TransformStream<TextStreamPart<ToolSet>, ChatCompletionsChunk | (E extends true ? OpenAIError : Error)> {
|
|
37
|
-
constructor(model: string, wrapErrors?: E);
|
|
38
|
-
}
|
|
39
|
-
export declare const toChatCompletionsAssistantMessage: (result: GenerateTextResult<ToolSet, Output.Output>) => ChatCompletionsAssistantMessage;
|
|
40
|
-
export declare function toReasoningDetail(reasoning: ReasoningOutput, id: string, index: number): ChatCompletionsReasoningDetail;
|
|
41
|
-
export declare function toChatCompletionsUsage(usage: LanguageModelUsage): ChatCompletionsUsage;
|
|
42
|
-
export declare function toChatCompletionsToolCall(id: string, name: string, args: unknown, providerMetadata?: SharedV3ProviderMetadata): ChatCompletionsToolCall;
|
|
43
|
-
export declare const toChatCompletionsFinishReason: (finishReason: FinishReason) => ChatCompletionsFinishReason;
|