@sudobility/shapeshyft_service 1.0.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/CLAUDE.md +35 -0
- package/README.md +17 -0
- package/dist/context.d.ts +62 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +55 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts.d.ts +110 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +7 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-key.d.ts +22 -0
- package/dist/lib/api-key.d.ts.map +1 -0
- package/dist/lib/api-key.js +87 -0
- package/dist/lib/api-key.js.map +1 -0
- package/dist/lib/encryption.d.ts +22 -0
- package/dist/lib/encryption.d.ts.map +1 -0
- package/dist/lib/encryption.js +41 -0
- package/dist/lib/encryption.js.map +1 -0
- package/dist/lib/entity-api-key.d.ts +21 -0
- package/dist/lib/entity-api-key.d.ts.map +1 -0
- package/dist/lib/entity-api-key.js +54 -0
- package/dist/lib/entity-api-key.js.map +1 -0
- package/dist/lib/entity-helpers.d.ts +90 -0
- package/dist/lib/entity-helpers.d.ts.map +1 -0
- package/dist/lib/entity-helpers.js +136 -0
- package/dist/lib/entity-helpers.js.map +1 -0
- package/dist/lib/money.d.ts +7 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +9 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/public-project.d.ts +14 -0
- package/dist/lib/public-project.d.ts.map +1 -0
- package/dist/lib/public-project.js +17 -0
- package/dist/lib/public-project.js.map +1 -0
- package/dist/lib/user-api-key-cache.d.ts +35 -0
- package/dist/lib/user-api-key-cache.d.ts.map +1 -0
- package/dist/lib/user-api-key-cache.js +99 -0
- package/dist/lib/user-api-key-cache.js.map +1 -0
- package/dist/lib/user-api-key.d.ts +46 -0
- package/dist/lib/user-api-key.d.ts.map +1 -0
- package/dist/lib/user-api-key.js +102 -0
- package/dist/lib/user-api-key.js.map +1 -0
- package/dist/middleware/firebaseAuth.d.ts +34 -0
- package/dist/middleware/firebaseAuth.d.ts.map +1 -0
- package/dist/middleware/firebaseAuth.js +133 -0
- package/dist/middleware/firebaseAuth.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +29 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/rateLimit.js +85 -0
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware/subscription.d.ts +8 -0
- package/dist/middleware/subscription.d.ts.map +1 -0
- package/dist/middleware/subscription.js +19 -0
- package/dist/middleware/subscription.js.map +1 -0
- package/dist/routes/ai.d.ts +10 -0
- package/dist/routes/ai.d.ts.map +1 -0
- package/dist/routes/ai.js +698 -0
- package/dist/routes/ai.js.map +1 -0
- package/dist/routes/analytics.d.ts +9 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +192 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/endpoints.d.ts +10 -0
- package/dist/routes/endpoints.d.ts.map +1 -0
- package/dist/routes/endpoints.js +255 -0
- package/dist/routes/endpoints.js.map +1 -0
- package/dist/routes/entities.d.ts +15 -0
- package/dist/routes/entities.d.ts.map +1 -0
- package/dist/routes/entities.js +332 -0
- package/dist/routes/entities.js.map +1 -0
- package/dist/routes/entity-api-keys.d.ts +17 -0
- package/dist/routes/entity-api-keys.d.ts.map +1 -0
- package/dist/routes/entity-api-keys.js +142 -0
- package/dist/routes/entity-api-keys.js.map +1 -0
- package/dist/routes/invitations.d.ts +15 -0
- package/dist/routes/invitations.d.ts.map +1 -0
- package/dist/routes/invitations.js +58 -0
- package/dist/routes/invitations.js.map +1 -0
- package/dist/routes/projects.d.ts +9 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +241 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/providers.d.ts +9 -0
- package/dist/routes/providers.d.ts.map +1 -0
- package/dist/routes/providers.js +89 -0
- package/dist/routes/providers.js.map +1 -0
- package/dist/routes/ratelimits.d.ts +9 -0
- package/dist/routes/ratelimits.d.ts.map +1 -0
- package/dist/routes/ratelimits.js +171 -0
- package/dist/routes/ratelimits.js.map +1 -0
- package/dist/routes/settings.d.ts +9 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +138 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/storage.d.ts +9 -0
- package/dist/routes/storage.d.ts.map +1 -0
- package/dist/routes/storage.js +180 -0
- package/dist/routes/storage.js.map +1 -0
- package/dist/routes/user-api-keys.d.ts +14 -0
- package/dist/routes/user-api-keys.d.ts.map +1 -0
- package/dist/routes/user-api-keys.js +237 -0
- package/dist/routes/user-api-keys.js.map +1 -0
- package/dist/routes/users.d.ts +7 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +102 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/schema/init.d.ts +12 -0
- package/dist/schema/init.d.ts.map +1 -0
- package/dist/schema/init.js +404 -0
- package/dist/schema/init.js.map +1 -0
- package/dist/schema/tables.d.ts +2110 -0
- package/dist/schema/tables.d.ts.map +1 -0
- package/dist/schema/tables.js +251 -0
- package/dist/schema/tables.js.map +1 -0
- package/dist/schemas/index.d.ts +671 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +299 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/service.d.ts +41 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +70 -0
- package/dist/service.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/schema/tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,QAAQ,EAWd,MAAM,qBAAqB,CAAC;AAS7B,eAAO,MAAM,mBAAmB,uHAWtB,CAAC;AAEX,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoR9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Drizzle table factories for the shared schema
|
|
3
|
+
* @description Everything in shapeshyft_api's schema except `llm_api_keys`,
|
|
4
|
+
* built against a caller-supplied pgSchema so each product keeps its own
|
|
5
|
+
* PostgreSQL schema (`shapeshyft`, `shaperouter`).
|
|
6
|
+
*/
|
|
7
|
+
import { pgEnum, uuid, varchar, text, boolean, timestamp, integer, jsonb, real, uniqueIndex, index, } from "drizzle-orm/pg-core";
|
|
8
|
+
import { createRateLimitCountersTable } from "@sudobility/ratelimit_service";
|
|
9
|
+
import { createEntitiesTable, createEntityMembersTable, createEntityInvitationsTable, createEntityApiKeysTable, } from "@sudobility/entity_service";
|
|
10
|
+
export const LLM_PROVIDER_VALUES = [
|
|
11
|
+
"openai",
|
|
12
|
+
"anthropic",
|
|
13
|
+
"gemini",
|
|
14
|
+
"mistral",
|
|
15
|
+
"cohere",
|
|
16
|
+
"groq",
|
|
17
|
+
"xai",
|
|
18
|
+
"deepseek",
|
|
19
|
+
"perplexity",
|
|
20
|
+
"lm_studio",
|
|
21
|
+
];
|
|
22
|
+
export function createServiceTables(schema, opts) {
|
|
23
|
+
const p = opts.indexPrefix;
|
|
24
|
+
const llmProviderEnum = pgEnum("llm_provider", LLM_PROVIDER_VALUES);
|
|
25
|
+
const httpMethodEnum = pgEnum("http_method", ["GET", "POST"]);
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Users Table
|
|
28
|
+
// firebase_uid is the primary key - no internal UUID needed
|
|
29
|
+
// =============================================================================
|
|
30
|
+
const users = schema.table("users", {
|
|
31
|
+
firebase_uid: varchar("firebase_uid", { length: 128 }).primaryKey(),
|
|
32
|
+
email: varchar("email", { length: 255 }),
|
|
33
|
+
display_name: varchar("display_name", { length: 255 }),
|
|
34
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
35
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
36
|
+
});
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// User Settings Table
|
|
39
|
+
// =============================================================================
|
|
40
|
+
const userSettings = schema.table("user_settings", {
|
|
41
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
42
|
+
firebase_uid: varchar("firebase_uid", { length: 128 })
|
|
43
|
+
.notNull()
|
|
44
|
+
.references(() => users.firebase_uid, { onDelete: "cascade" })
|
|
45
|
+
.unique(),
|
|
46
|
+
organization_name: varchar("organization_name", { length: 255 }),
|
|
47
|
+
organization_path: varchar("organization_path", { length: 255 })
|
|
48
|
+
.notNull()
|
|
49
|
+
.unique(),
|
|
50
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
51
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
52
|
+
});
|
|
53
|
+
// =============================================================================
|
|
54
|
+
// Entity Tables (from @sudobility/entity_service)
|
|
55
|
+
// Must be defined before tables that reference them
|
|
56
|
+
// =============================================================================
|
|
57
|
+
const entities = createEntitiesTable(schema, p);
|
|
58
|
+
const entityMembers = createEntityMembersTable(schema, p);
|
|
59
|
+
const entityInvitations = createEntityInvitationsTable(schema, p);
|
|
60
|
+
/**
|
|
61
|
+
* Entity-scoped API keys ("<entity prefix>_..."). Authenticate a caller as the entity
|
|
62
|
+
* itself -- CI jobs, scripts, and MCP clients that outlive any one member.
|
|
63
|
+
* Hash-only storage, so a key is revealed once at creation.
|
|
64
|
+
*/
|
|
65
|
+
const entityApiKeys = createEntityApiKeysTable(schema, p);
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// Entity Storage Configs Table
|
|
68
|
+
// User-provided cloud storage configuration for generated media
|
|
69
|
+
// =============================================================================
|
|
70
|
+
const entityStorageConfigs = schema.table("entity_storage_configs", {
|
|
71
|
+
uuid: uuid("uuid").primaryKey().defaultRandom(),
|
|
72
|
+
entity_id: uuid("entity_id")
|
|
73
|
+
.notNull()
|
|
74
|
+
.references(() => entities.id, { onDelete: "cascade" })
|
|
75
|
+
.unique(), // One storage config per entity
|
|
76
|
+
provider: varchar("provider", { length: 20 }).notNull(), // "gcs" | "s3"
|
|
77
|
+
bucket: varchar("bucket", { length: 255 }).notNull(),
|
|
78
|
+
path_prefix: varchar("path_prefix", { length: 500 }), // e.g., "generated/"
|
|
79
|
+
// Encrypted credentials (AES-256-CBC, see lib/encryption)
|
|
80
|
+
encrypted_credentials: text("encrypted_credentials").notNull(),
|
|
81
|
+
encryption_iv: varchar("encryption_iv", { length: 32 }).notNull(),
|
|
82
|
+
// Audit fields
|
|
83
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
84
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
85
|
+
created_by: varchar("created_by", { length: 128 }).notNull(), // Firebase UID
|
|
86
|
+
}, table => ({
|
|
87
|
+
entityIdx: index(`${p}_entity_storage_configs_entity_idx`).on(table.entity_id),
|
|
88
|
+
}));
|
|
89
|
+
// =============================================================================
|
|
90
|
+
// User API Keys Table
|
|
91
|
+
// Personal API keys ("<user prefix>...") that authenticate a user against the admin
|
|
92
|
+
// routes exactly as a Firebase ID token does. A user may hold several.
|
|
93
|
+
// Looked up by SHA-256 hash; the encrypted copy exists so the owner can reveal
|
|
94
|
+
// the key again from the dashboard.
|
|
95
|
+
// =============================================================================
|
|
96
|
+
const userApiKeys = schema.table("user_api_keys", {
|
|
97
|
+
uuid: uuid("uuid").primaryKey().defaultRandom(),
|
|
98
|
+
firebase_uid: varchar("firebase_uid", { length: 128 })
|
|
99
|
+
.notNull()
|
|
100
|
+
.references(() => users.firebase_uid, { onDelete: "cascade" }),
|
|
101
|
+
key_name: varchar("key_name", { length: 255 }).notNull(),
|
|
102
|
+
/** SHA-256 hex digest of the key — the authentication lookup index */
|
|
103
|
+
key_hash: varchar("key_hash", { length: 64 }).notNull().unique(),
|
|
104
|
+
/** First characters of the key, for display in listings */
|
|
105
|
+
key_prefix: varchar("key_prefix", { length: 20 }).notNull(),
|
|
106
|
+
/** AES-256-CBC ciphertext so the owner can copy the key again */
|
|
107
|
+
encrypted_key: text("encrypted_key").notNull(),
|
|
108
|
+
encryption_iv: varchar("encryption_iv", { length: 32 }).notNull(),
|
|
109
|
+
is_active: boolean("is_active").default(true).notNull(),
|
|
110
|
+
last_used_at: timestamp("last_used_at"),
|
|
111
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
112
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
113
|
+
}, table => ({
|
|
114
|
+
userIdx: index(`${p}_user_api_keys_user_idx`).on(table.firebase_uid),
|
|
115
|
+
hashIdx: uniqueIndex(`${p}_user_api_keys_hash_idx`).on(table.key_hash),
|
|
116
|
+
}));
|
|
117
|
+
// =============================================================================
|
|
118
|
+
// Projects Table
|
|
119
|
+
// =============================================================================
|
|
120
|
+
const projects = schema.table("projects", {
|
|
121
|
+
uuid: uuid("uuid").primaryKey().defaultRandom(),
|
|
122
|
+
entity_id: uuid("entity_id")
|
|
123
|
+
.notNull()
|
|
124
|
+
.references(() => entities.id, { onDelete: "cascade" }),
|
|
125
|
+
project_name: varchar("project_name", { length: 255 }).notNull(),
|
|
126
|
+
display_name: varchar("display_name", { length: 255 }).notNull(),
|
|
127
|
+
description: text("description"),
|
|
128
|
+
is_active: boolean("is_active").default(true),
|
|
129
|
+
// API Key fields
|
|
130
|
+
encrypted_api_key: text("encrypted_api_key"),
|
|
131
|
+
api_key_iv: varchar("api_key_iv", { length: 32 }),
|
|
132
|
+
api_key_prefix: varchar("api_key_prefix", { length: 20 }),
|
|
133
|
+
api_key_created_at: timestamp("api_key_created_at"),
|
|
134
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
135
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
136
|
+
}, table => ({
|
|
137
|
+
uniqueProjectPerEntity: uniqueIndex("unique_project_per_entity").on(table.entity_id, table.project_name),
|
|
138
|
+
entityIdx: index(`${p}_projects_entity_idx`).on(table.entity_id),
|
|
139
|
+
}));
|
|
140
|
+
// =============================================================================
|
|
141
|
+
// Endpoints Table
|
|
142
|
+
// =============================================================================
|
|
143
|
+
const endpoints = schema.table("endpoints", {
|
|
144
|
+
uuid: uuid("uuid").primaryKey().defaultRandom(),
|
|
145
|
+
project_id: uuid("project_id")
|
|
146
|
+
.notNull()
|
|
147
|
+
.references(() => projects.uuid, { onDelete: "cascade" }),
|
|
148
|
+
endpoint_name: varchar("endpoint_name", { length: 255 }).notNull(),
|
|
149
|
+
display_name: varchar("display_name", { length: 255 }).notNull(),
|
|
150
|
+
http_method: httpMethodEnum("http_method").notNull().default("POST"),
|
|
151
|
+
/**
|
|
152
|
+
* The product's credential binding. ShapeShyft stores an llm_api_keys UUID
|
|
153
|
+
* and adds its own foreign key; products with site-owned provider keys
|
|
154
|
+
* leave it null. No reference here: the service has no key table.
|
|
155
|
+
*/
|
|
156
|
+
llm_key_id: uuid("llm_key_id"),
|
|
157
|
+
/**
|
|
158
|
+
* Provider this endpoint calls, written by bindEndpoint on create/update.
|
|
159
|
+
* Nullable so a rolling deploy cannot break inserts from an older server;
|
|
160
|
+
* the invoke path uses the resolver's provider, never this column alone.
|
|
161
|
+
*/
|
|
162
|
+
provider: llmProviderEnum("provider"),
|
|
163
|
+
model: varchar("model", { length: 255 }),
|
|
164
|
+
input_schema: jsonb("input_schema"),
|
|
165
|
+
output_schema: jsonb("output_schema"),
|
|
166
|
+
instructions: text("instructions"),
|
|
167
|
+
context: text("context"),
|
|
168
|
+
is_active: boolean("is_active").default(true),
|
|
169
|
+
// IP Allowlist - JSON array of IPv4 addresses, null = allow all
|
|
170
|
+
ip_allowlist: jsonb("ip_allowlist"),
|
|
171
|
+
// Media output configuration - what media types this endpoint expects to generate
|
|
172
|
+
expects_media_output: jsonb("expects_media_output"),
|
|
173
|
+
// How to return generated media ("base64" for inline, "url" for cloud storage)
|
|
174
|
+
output_media_format: varchar("output_media_format", { length: 20 }),
|
|
175
|
+
// Enable web search for supported providers (OpenAI Responses API)
|
|
176
|
+
web_search: boolean("web_search").default(false),
|
|
177
|
+
/**
|
|
178
|
+
* Sampling temperature for this endpoint's model, or NULL to say nothing.
|
|
179
|
+
*
|
|
180
|
+
* NULL rather than a default of 0, and the distinction is load-bearing:
|
|
181
|
+
* the adapters disagree about what "unset" means. OpenAI, Gemini, Groq and
|
|
182
|
+
* the custom provider default it to 0; Anthropic omits the field entirely,
|
|
183
|
+
* because Opus 4.7+ and Sonnet 5 reject `temperature` with a 400. A column
|
|
184
|
+
* defaulting to 0 would start sending a value to the models that refuse
|
|
185
|
+
* one, so every endpoint that predates this keeps its NULL and its
|
|
186
|
+
* behaviour.
|
|
187
|
+
*/
|
|
188
|
+
temperature: real("temperature"),
|
|
189
|
+
/**
|
|
190
|
+
* Ceiling on tokens the model may generate per invocation.
|
|
191
|
+
*
|
|
192
|
+
* Deliberately has NO database default: a NULL means "no protection", and
|
|
193
|
+
* every endpoint that predates this column keeps that NULL. New endpoints
|
|
194
|
+
* get DEFAULT_MAX_OUTPUT_TOKENS applied at the API layer instead, so the
|
|
195
|
+
* default reaches new rows without silently re-capping existing ones.
|
|
196
|
+
*/
|
|
197
|
+
max_output_tokens: integer("max_output_tokens"),
|
|
198
|
+
// For Whisper endpoints: model to use for structured extraction from transcription
|
|
199
|
+
transcription_extraction_model: varchar("transcription_extraction_model", {
|
|
200
|
+
length: 255,
|
|
201
|
+
}),
|
|
202
|
+
/**
|
|
203
|
+
* Lifetime invocation count, incremented on every call -- successful or
|
|
204
|
+
* failed -- alongside the usage_analytics row for that call.
|
|
205
|
+
*/
|
|
206
|
+
call_count: integer("call_count").notNull().default(0),
|
|
207
|
+
created_at: timestamp("created_at").defaultNow(),
|
|
208
|
+
updated_at: timestamp("updated_at").defaultNow(),
|
|
209
|
+
}, table => ({
|
|
210
|
+
uniqueEndpointPerProject: uniqueIndex("unique_endpoint_per_project").on(table.project_id, table.endpoint_name),
|
|
211
|
+
projectIdx: index(`${p}_endpoints_project_idx`).on(table.project_id),
|
|
212
|
+
}));
|
|
213
|
+
// =============================================================================
|
|
214
|
+
// Usage Analytics Table
|
|
215
|
+
// =============================================================================
|
|
216
|
+
const usageAnalytics = schema.table("usage_analytics", {
|
|
217
|
+
uuid: uuid("uuid").primaryKey().defaultRandom(),
|
|
218
|
+
endpoint_id: uuid("endpoint_id")
|
|
219
|
+
.notNull()
|
|
220
|
+
.references(() => endpoints.uuid, { onDelete: "cascade" }),
|
|
221
|
+
timestamp: timestamp("timestamp").notNull().defaultNow(),
|
|
222
|
+
success: boolean("success").notNull(),
|
|
223
|
+
error_message: text("error_message"),
|
|
224
|
+
tokens_input: integer("tokens_input"),
|
|
225
|
+
tokens_output: integer("tokens_output"),
|
|
226
|
+
latency_ms: integer("latency_ms"),
|
|
227
|
+
estimated_cost_cents: integer("estimated_cost_cents"),
|
|
228
|
+
request_metadata: jsonb("request_metadata"),
|
|
229
|
+
});
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// Rate Limit Counters Table (from @sudobility/subscription_service)
|
|
232
|
+
// =============================================================================
|
|
233
|
+
const rateLimitCounters = createRateLimitCountersTable(schema, p);
|
|
234
|
+
return {
|
|
235
|
+
llmProviderEnum,
|
|
236
|
+
httpMethodEnum,
|
|
237
|
+
users,
|
|
238
|
+
userSettings,
|
|
239
|
+
entities,
|
|
240
|
+
entityMembers,
|
|
241
|
+
entityInvitations,
|
|
242
|
+
entityApiKeys,
|
|
243
|
+
entityStorageConfigs,
|
|
244
|
+
userApiKeys,
|
|
245
|
+
projects,
|
|
246
|
+
endpoints,
|
|
247
|
+
usageAnalytics,
|
|
248
|
+
rateLimitCounters,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/schema/tables.ts"],"names":[],"mappings":"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"}
|