@llmops/core 0.1.5 → 0.1.6-beta.1

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.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_db = require('./db-eEfIe5dO.cjs');
1
+ const require_db = require('./db-C_u1BuaR.cjs');
2
2
  let __llmops_gateway = require("@llmops/gateway");
3
3
  __llmops_gateway = require_db.__toESM(__llmops_gateway);
4
4
  let kysely = require("kysely");
@@ -1286,7 +1286,8 @@ const createConfigVariantDataLayer = (db) => {
1286
1286
  return {
1287
1287
  ...versionData,
1288
1288
  configId: resolvedConfigId,
1289
- variantId: configVariant.variantId
1289
+ variantId: configVariant.variantId,
1290
+ environmentId
1290
1291
  };
1291
1292
  }
1292
1293
  };
@@ -1456,6 +1457,7 @@ const insertLLMRequestSchema = require_db.zod_default.object({
1456
1457
  requestId: require_db.zod_default.string().uuid(),
1457
1458
  configId: require_db.zod_default.string().uuid().nullable().optional(),
1458
1459
  variantId: require_db.zod_default.string().uuid().nullable().optional(),
1460
+ environmentId: require_db.zod_default.string().uuid().nullable().optional(),
1459
1461
  provider: require_db.zod_default.string(),
1460
1462
  model: require_db.zod_default.string(),
1461
1463
  promptTokens: require_db.zod_default.number().int().default(0),
@@ -1479,17 +1481,24 @@ const listRequestsSchema = require_db.zod_default.object({
1479
1481
  limit: require_db.zod_default.number().int().positive().max(1e3).default(100),
1480
1482
  offset: require_db.zod_default.number().int().nonnegative().default(0),
1481
1483
  configId: require_db.zod_default.string().uuid().optional(),
1484
+ variantId: require_db.zod_default.string().uuid().optional(),
1485
+ environmentId: require_db.zod_default.string().uuid().optional(),
1482
1486
  provider: require_db.zod_default.string().optional(),
1483
1487
  model: require_db.zod_default.string().optional(),
1484
1488
  startDate: require_db.zod_default.date().optional(),
1485
- endDate: require_db.zod_default.date().optional()
1489
+ endDate: require_db.zod_default.date().optional(),
1490
+ tags: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.array(require_db.zod_default.string())).optional()
1486
1491
  });
1487
1492
  /**
1488
- * Schema for date range queries
1493
+ * Schema for date range queries with optional filters
1489
1494
  */
1490
1495
  const dateRangeSchema = require_db.zod_default.object({
1491
1496
  startDate: require_db.zod_default.date(),
1492
- endDate: require_db.zod_default.date()
1497
+ endDate: require_db.zod_default.date(),
1498
+ configId: require_db.zod_default.string().uuid().optional(),
1499
+ variantId: require_db.zod_default.string().uuid().optional(),
1500
+ environmentId: require_db.zod_default.string().uuid().optional(),
1501
+ tags: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.array(require_db.zod_default.string())).optional()
1493
1502
  });
1494
1503
  /**
1495
1504
  * Schema for cost summary with grouping
@@ -1497,6 +1506,10 @@ const dateRangeSchema = require_db.zod_default.object({
1497
1506
  const costSummarySchema = require_db.zod_default.object({
1498
1507
  startDate: require_db.zod_default.date(),
1499
1508
  endDate: require_db.zod_default.date(),
1509
+ configId: require_db.zod_default.string().uuid().optional(),
1510
+ variantId: require_db.zod_default.string().uuid().optional(),
1511
+ environmentId: require_db.zod_default.string().uuid().optional(),
1512
+ tags: require_db.zod_default.record(require_db.zod_default.string(), require_db.zod_default.array(require_db.zod_default.string())).optional(),
1500
1513
  groupBy: require_db.zod_default.enum([
1501
1514
  "day",
1502
1515
  "hour",
@@ -1526,6 +1539,7 @@ const createLLMRequestsDataLayer = (db) => {
1526
1539
  requestId: req.requestId,
1527
1540
  configId: req.configId ?? null,
1528
1541
  variantId: req.variantId ?? null,
1542
+ environmentId: req.environmentId ?? null,
1529
1543
  provider: req.provider,
1530
1544
  model: req.model,
1531
1545
  promptTokens: req.promptTokens,
@@ -1557,6 +1571,7 @@ const createLLMRequestsDataLayer = (db) => {
1557
1571
  requestId: req.requestId,
1558
1572
  configId: req.configId ?? null,
1559
1573
  variantId: req.variantId ?? null,
1574
+ environmentId: req.environmentId ?? null,
1560
1575
  provider: req.provider,
1561
1576
  model: req.model,
1562
1577
  promptTokens: req.promptTokens,
@@ -1579,14 +1594,43 @@ const createLLMRequestsDataLayer = (db) => {
1579
1594
  listRequests: async (params) => {
1580
1595
  const result = await listRequestsSchema.safeParseAsync(params || {});
1581
1596
  if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
1582
- const { limit, offset, configId, provider, model, startDate, endDate } = result.data;
1597
+ const { limit, offset, configId, variantId, environmentId, provider, model, startDate, endDate, tags } = result.data;
1598
+ console.log("[listRequests] Parsed filters:", {
1599
+ configId,
1600
+ variantId,
1601
+ environmentId,
1602
+ provider,
1603
+ model
1604
+ });
1583
1605
  let baseQuery = db.selectFrom("llm_requests");
1584
- if (configId) baseQuery = baseQuery.where("configId", "=", configId);
1606
+ if (configId) {
1607
+ console.log("[listRequests] Adding configId filter:", configId);
1608
+ baseQuery = baseQuery.where("configId", "=", configId);
1609
+ }
1610
+ if (variantId) {
1611
+ console.log("[listRequests] Adding variantId filter:", variantId);
1612
+ baseQuery = baseQuery.where("variantId", "=", variantId);
1613
+ }
1614
+ if (environmentId) {
1615
+ console.log("[listRequests] Adding environmentId filter:", environmentId);
1616
+ baseQuery = baseQuery.where("environmentId", "=", environmentId);
1617
+ }
1585
1618
  if (provider) baseQuery = baseQuery.where("provider", "=", provider);
1586
1619
  if (model) baseQuery = baseQuery.where("model", "=", model);
1587
1620
  if (startDate) baseQuery = baseQuery.where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`);
1588
1621
  if (endDate) baseQuery = baseQuery.where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`);
1589
- const countResult = await baseQuery.select(kysely.sql`COUNT(*)`.as("total")).executeTakeFirst();
1622
+ if (tags && Object.keys(tags).length > 0) for (const [key, values] of Object.entries(tags)) {
1623
+ if (values.length === 0) continue;
1624
+ if (values.length === 1) baseQuery = baseQuery.where(kysely.sql`${col("tags")}->>${key} = ${values[0]}`);
1625
+ else {
1626
+ const valueList = kysely.sql.join(values.map((v) => kysely.sql`${v}`));
1627
+ baseQuery = baseQuery.where(kysely.sql`${col("tags")}->>${key} IN (${valueList})`);
1628
+ }
1629
+ }
1630
+ const countQuery = baseQuery.select(kysely.sql`COUNT(*)`.as("total"));
1631
+ console.log("[listRequests] Count SQL:", countQuery.compile().sql);
1632
+ console.log("[listRequests] Count params:", countQuery.compile().parameters);
1633
+ const countResult = await countQuery.executeTakeFirst();
1590
1634
  const total = Number(countResult?.total ?? 0);
1591
1635
  return {
1592
1636
  data: await baseQuery.selectAll().orderBy("createdAt", "desc").limit(limit).offset(offset).execute(),
@@ -1601,8 +1645,8 @@ const createLLMRequestsDataLayer = (db) => {
1601
1645
  getTotalCost: async (params) => {
1602
1646
  const result = await dateRangeSchema.safeParseAsync(params);
1603
1647
  if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
1604
- const { startDate, endDate } = result.data;
1605
- return await db.selectFrom("llm_requests").select([
1648
+ const { startDate, endDate, configId, variantId, environmentId, tags } = result.data;
1649
+ let query = db.selectFrom("llm_requests").select([
1606
1650
  kysely.sql`COALESCE(SUM(${col("cost")}), 0)`.as("totalCost"),
1607
1651
  kysely.sql`COALESCE(SUM(${col("inputCost")}), 0)`.as("totalInputCost"),
1608
1652
  kysely.sql`COALESCE(SUM(${col("outputCost")}), 0)`.as("totalOutputCost"),
@@ -1610,7 +1654,19 @@ const createLLMRequestsDataLayer = (db) => {
1610
1654
  kysely.sql`COALESCE(SUM(${col("completionTokens")}), 0)`.as("totalCompletionTokens"),
1611
1655
  kysely.sql`COALESCE(SUM(${col("totalTokens")}), 0)`.as("totalTokens"),
1612
1656
  kysely.sql`COUNT(*)`.as("requestCount")
1613
- ]).where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`).executeTakeFirst();
1657
+ ]).where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`);
1658
+ if (configId) query = query.where("configId", "=", configId);
1659
+ if (variantId) query = query.where("variantId", "=", variantId);
1660
+ if (environmentId) query = query.where("environmentId", "=", environmentId);
1661
+ if (tags && Object.keys(tags).length > 0) for (const [key, values] of Object.entries(tags)) {
1662
+ if (values.length === 0) continue;
1663
+ if (values.length === 1) query = query.where(kysely.sql`${col("tags")}->>${key} = ${values[0]}`);
1664
+ else {
1665
+ const valueList = kysely.sql.join(values.map((v) => kysely.sql`${v}`));
1666
+ query = query.where(kysely.sql`${col("tags")}->>${key} IN (${valueList})`);
1667
+ }
1668
+ }
1669
+ return await query.executeTakeFirst();
1614
1670
  },
1615
1671
  getCostByModel: async (params) => {
1616
1672
  const result = await dateRangeSchema.safeParseAsync(params);
@@ -1676,18 +1732,31 @@ const createLLMRequestsDataLayer = (db) => {
1676
1732
  getCostSummary: async (params) => {
1677
1733
  const result = await costSummarySchema.safeParseAsync(params);
1678
1734
  if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
1679
- const { startDate, endDate, groupBy } = result.data;
1680
- const baseQuery = db.selectFrom("llm_requests").where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`);
1735
+ const { startDate, endDate, groupBy, configId, variantId, environmentId, tags } = result.data;
1736
+ let baseQuery = db.selectFrom("llm_requests").where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`);
1737
+ if (configId) baseQuery = baseQuery.where("configId", "=", configId);
1738
+ if (variantId) baseQuery = baseQuery.where("variantId", "=", variantId);
1739
+ if (environmentId) baseQuery = baseQuery.where("environmentId", "=", environmentId);
1740
+ if (tags && Object.keys(tags).length > 0) for (const [key, values] of Object.entries(tags)) {
1741
+ if (values.length === 0) continue;
1742
+ if (values.length === 1) baseQuery = baseQuery.where(kysely.sql`${col("tags")}->>${key} = ${values[0]}`);
1743
+ else {
1744
+ const valueList = kysely.sql.join(values.map((v) => kysely.sql`${v}`));
1745
+ baseQuery = baseQuery.where(kysely.sql`${col("tags")}->>${key} IN (${valueList})`);
1746
+ }
1747
+ }
1681
1748
  switch (groupBy) {
1682
1749
  case "day": return baseQuery.select([
1683
1750
  kysely.sql`DATE(${col("createdAt")})`.as("groupKey"),
1684
1751
  kysely.sql`COALESCE(SUM(${col("cost")}), 0)`.as("totalCost"),
1685
- kysely.sql`COUNT(*)`.as("requestCount")
1752
+ kysely.sql`COUNT(*)`.as("requestCount"),
1753
+ kysely.sql`COALESCE(SUM(${col("totalTokens")}), 0)`.as("totalTokens")
1686
1754
  ]).groupBy(kysely.sql`DATE(${col("createdAt")})`).orderBy(kysely.sql`DATE(${col("createdAt")})`, "asc").execute();
1687
1755
  case "hour": return baseQuery.select([
1688
1756
  kysely.sql`DATE_TRUNC('hour', ${col("createdAt")})`.as("groupKey"),
1689
1757
  kysely.sql`COALESCE(SUM(${col("cost")}), 0)`.as("totalCost"),
1690
- kysely.sql`COUNT(*)`.as("requestCount")
1758
+ kysely.sql`COUNT(*)`.as("requestCount"),
1759
+ kysely.sql`COALESCE(SUM(${col("totalTokens")}), 0)`.as("totalTokens")
1691
1760
  ]).groupBy(kysely.sql`DATE_TRUNC('hour', ${col("createdAt")})`).orderBy(kysely.sql`DATE_TRUNC('hour', ${col("createdAt")})`, "asc").execute();
1692
1761
  case "model": return baseQuery.select([
1693
1762
  kysely.sql`${col("provider")} || '/' || ${col("model")}`.as("groupKey"),
@@ -1714,8 +1783,8 @@ const createLLMRequestsDataLayer = (db) => {
1714
1783
  getRequestStats: async (params) => {
1715
1784
  const result = await dateRangeSchema.safeParseAsync(params);
1716
1785
  if (!result.success) throw new LLMOpsError(`Invalid parameters: ${result.error.message}`);
1717
- const { startDate, endDate } = result.data;
1718
- return await db.selectFrom("llm_requests").select([
1786
+ const { startDate, endDate, configId, variantId, environmentId, tags } = result.data;
1787
+ let query = db.selectFrom("llm_requests").select([
1719
1788
  kysely.sql`COUNT(*)`.as("totalRequests"),
1720
1789
  kysely.sql`COUNT(CASE WHEN ${col("statusCode")} >= 200 AND ${col("statusCode")} < 300 THEN 1 END)`.as("successfulRequests"),
1721
1790
  kysely.sql`COUNT(CASE WHEN ${col("statusCode")} >= 400 THEN 1 END)`.as("failedRequests"),
@@ -1723,7 +1792,27 @@ const createLLMRequestsDataLayer = (db) => {
1723
1792
  kysely.sql`AVG(${col("latencyMs")})`.as("avgLatencyMs"),
1724
1793
  kysely.sql`MAX(${col("latencyMs")})`.as("maxLatencyMs"),
1725
1794
  kysely.sql`MIN(${col("latencyMs")})`.as("minLatencyMs")
1726
- ]).where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`).executeTakeFirst();
1795
+ ]).where(kysely.sql`${col("createdAt")} >= ${startDate.toISOString()}`).where(kysely.sql`${col("createdAt")} <= ${endDate.toISOString()}`);
1796
+ if (configId) query = query.where("configId", "=", configId);
1797
+ if (variantId) query = query.where("variantId", "=", variantId);
1798
+ if (environmentId) query = query.where("environmentId", "=", environmentId);
1799
+ if (tags && Object.keys(tags).length > 0) for (const [key, values] of Object.entries(tags)) {
1800
+ if (values.length === 0) continue;
1801
+ if (values.length === 1) query = query.where(kysely.sql`${col("tags")}->>${key} = ${values[0]}`);
1802
+ else {
1803
+ const valueList = kysely.sql.join(values.map((v) => kysely.sql`${v}`));
1804
+ query = query.where(kysely.sql`${col("tags")}->>${key} IN (${valueList})`);
1805
+ }
1806
+ }
1807
+ return await query.executeTakeFirst();
1808
+ },
1809
+ getDistinctTags: async () => {
1810
+ return (await kysely.sql`
1811
+ SELECT DISTINCT key, value
1812
+ FROM llm_requests, jsonb_each_text(tags) AS t(key, value)
1813
+ WHERE tags != '{}'::jsonb
1814
+ ORDER BY key, value
1815
+ `.execute(db)).rows;
1727
1816
  }
1728
1817
  };
1729
1818
  };
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as TableName, B as configVariantsSchema, C as EnvironmentSecretsTable, D as LLMRequestsTable, E as LLMRequest, F as VariantVersion, G as schemas, H as environmentSecretsSchema, I as VariantVersionsTable, J as variantsSchema, K as targetingRulesSchema, L as VariantsTable, M as TargetingRulesTable, N as Updateable, O as SCHEMA_METADATA, P as Variant, R as WorkspaceSettings, S as EnvironmentSecret, T as Insertable, U as environmentsSchema, V as configsSchema, W as llmRequestsSchema, Y as workspaceSettingsSchema, _ as ConfigVariant, a as createDatabaseFromConnection, b as Database, c as MigrationResult, d as runAutoMigrations, f as parsePartialTableData, g as Config, h as validateTableData, i as createDatabase, j as TargetingRule, k as Selectable, l as getMigrations, m as validatePartialTableData, n as DatabaseOptions, o as detectDatabaseType, p as parseTableData, q as variantVersionsSchema, r as DatabaseType, s as MigrationOptions, t as DatabaseConnection, u as matchType, v as ConfigVariantsTable, w as EnvironmentsTable, x as Environment, y as ConfigsTable, z as WorkspaceSettingsTable } from "./index-BO7DYWFs.cjs";
1
+ import { A as TableName, B as configVariantsSchema, C as EnvironmentSecretsTable, D as LLMRequestsTable, E as LLMRequest, F as VariantVersion, G as schemas, H as environmentSecretsSchema, I as VariantVersionsTable, J as variantsSchema, K as targetingRulesSchema, L as VariantsTable, M as TargetingRulesTable, N as Updateable, O as SCHEMA_METADATA, P as Variant, R as WorkspaceSettings, S as EnvironmentSecret, T as Insertable, U as environmentsSchema, V as configsSchema, W as llmRequestsSchema, Y as workspaceSettingsSchema, _ as ConfigVariant, a as createDatabaseFromConnection, b as Database, c as MigrationResult, d as runAutoMigrations, f as parsePartialTableData, g as Config, h as validateTableData, i as createDatabase, j as TargetingRule, k as Selectable, l as getMigrations, m as validatePartialTableData, n as DatabaseOptions, o as detectDatabaseType, p as parseTableData, q as variantVersionsSchema, r as DatabaseType, s as MigrationOptions, t as DatabaseConnection, u as matchType, v as ConfigVariantsTable, w as EnvironmentsTable, x as Environment, y as ConfigsTable, z as WorkspaceSettingsTable } from "./index-CCfvTBvD.cjs";
2
2
  import { Kysely } from "kysely";
3
3
  import * as zod0 from "zod";
4
4
  import z$1, { z } from "zod";
@@ -1519,6 +1519,7 @@ declare const insertLLMRequestSchema: z$1.ZodObject<{
1519
1519
  requestId: z$1.ZodString;
1520
1520
  configId: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
1521
1521
  variantId: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
1522
+ environmentId: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
1522
1523
  provider: z$1.ZodString;
1523
1524
  model: z$1.ZodString;
1524
1525
  promptTokens: z$1.ZodDefault<z$1.ZodNumber>;
@@ -1543,17 +1544,24 @@ declare const listRequestsSchema: z$1.ZodObject<{
1543
1544
  limit: z$1.ZodDefault<z$1.ZodNumber>;
1544
1545
  offset: z$1.ZodDefault<z$1.ZodNumber>;
1545
1546
  configId: z$1.ZodOptional<z$1.ZodString>;
1547
+ variantId: z$1.ZodOptional<z$1.ZodString>;
1548
+ environmentId: z$1.ZodOptional<z$1.ZodString>;
1546
1549
  provider: z$1.ZodOptional<z$1.ZodString>;
1547
1550
  model: z$1.ZodOptional<z$1.ZodString>;
1548
1551
  startDate: z$1.ZodOptional<z$1.ZodDate>;
1549
1552
  endDate: z$1.ZodOptional<z$1.ZodDate>;
1553
+ tags: z$1.ZodOptional<z$1.ZodRecord<z$1.ZodString, z$1.ZodArray<z$1.ZodString>>>;
1550
1554
  }, z$1.core.$strip>;
1551
1555
  /**
1552
- * Schema for date range queries
1556
+ * Schema for date range queries with optional filters
1553
1557
  */
1554
1558
  declare const dateRangeSchema: z$1.ZodObject<{
1555
1559
  startDate: z$1.ZodDate;
1556
1560
  endDate: z$1.ZodDate;
1561
+ configId: z$1.ZodOptional<z$1.ZodString>;
1562
+ variantId: z$1.ZodOptional<z$1.ZodString>;
1563
+ environmentId: z$1.ZodOptional<z$1.ZodString>;
1564
+ tags: z$1.ZodOptional<z$1.ZodRecord<z$1.ZodString, z$1.ZodArray<z$1.ZodString>>>;
1557
1565
  }, z$1.core.$strip>;
1558
1566
  /**
1559
1567
  * Schema for cost summary with grouping
@@ -1561,6 +1569,10 @@ declare const dateRangeSchema: z$1.ZodObject<{
1561
1569
  declare const costSummarySchema: z$1.ZodObject<{
1562
1570
  startDate: z$1.ZodDate;
1563
1571
  endDate: z$1.ZodDate;
1572
+ configId: z$1.ZodOptional<z$1.ZodString>;
1573
+ variantId: z$1.ZodOptional<z$1.ZodString>;
1574
+ environmentId: z$1.ZodOptional<z$1.ZodString>;
1575
+ tags: z$1.ZodOptional<z$1.ZodRecord<z$1.ZodString, z$1.ZodArray<z$1.ZodString>>>;
1564
1576
  groupBy: z$1.ZodOptional<z$1.ZodEnum<{
1565
1577
  provider: "provider";
1566
1578
  model: "model";
@@ -1585,6 +1597,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1585
1597
  variantId: string | null;
1586
1598
  id: string;
1587
1599
  provider: string;
1600
+ environmentId: string | null;
1588
1601
  requestId: string;
1589
1602
  model: string;
1590
1603
  promptTokens: number;
@@ -1613,6 +1626,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1613
1626
  variantId: string | null;
1614
1627
  id: string;
1615
1628
  provider: string;
1629
+ environmentId: string | null;
1616
1630
  requestId: string;
1617
1631
  model: string;
1618
1632
  promptTokens: number;
@@ -1643,6 +1657,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1643
1657
  variantId: string | null;
1644
1658
  id: string;
1645
1659
  provider: string;
1660
+ environmentId: string | null;
1646
1661
  requestId: string;
1647
1662
  model: string;
1648
1663
  promptTokens: number;
@@ -1662,7 +1677,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1662
1677
  updatedAt: Date;
1663
1678
  } | undefined>;
1664
1679
  /**
1665
- * Get total cost for a date range
1680
+ * Get total cost for a date range with optional filters
1666
1681
  */
1667
1682
  getTotalCost: (params: z$1.infer<typeof dateRangeSchema>) => Promise<{
1668
1683
  totalCost: number;
@@ -1723,7 +1738,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1723
1738
  date: string;
1724
1739
  }[]>;
1725
1740
  /**
1726
- * Get cost summary with flexible grouping
1741
+ * Get cost summary with flexible grouping and optional filters
1727
1742
  */
1728
1743
  getCostSummary: (params: z$1.infer<typeof costSummarySchema>) => Promise<{
1729
1744
  totalCost: number;
@@ -1731,7 +1746,7 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1731
1746
  groupKey: string;
1732
1747
  }[]>;
1733
1748
  /**
1734
- * Get request count and stats for a time range
1749
+ * Get request count and stats for a time range with optional filters
1735
1750
  */
1736
1751
  getRequestStats: (params: z$1.infer<typeof dateRangeSchema>) => Promise<{
1737
1752
  avgLatencyMs: number;
@@ -1742,6 +1757,14 @@ declare const createLLMRequestsDataLayer: (db: Kysely<Database>) => {
1742
1757
  maxLatencyMs: number;
1743
1758
  minLatencyMs: number;
1744
1759
  } | undefined>;
1760
+ /**
1761
+ * Get all distinct tag key-value pairs from llm_requests
1762
+ * Used for populating tag filter dropdowns in the UI
1763
+ */
1764
+ getDistinctTags: () => Promise<{
1765
+ key: string;
1766
+ value: string;
1767
+ }[]>;
1745
1768
  };
1746
1769
  //#endregion
1747
1770
  //#region src/datalayer/index.d.ts
@@ -2176,6 +2199,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2176
2199
  variantId: string | null;
2177
2200
  id: string;
2178
2201
  provider: string;
2202
+ environmentId: string | null;
2179
2203
  requestId: string;
2180
2204
  model: string;
2181
2205
  promptTokens: number;
@@ -2198,16 +2222,20 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2198
2222
  limit: zod0.ZodDefault<zod0.ZodNumber>;
2199
2223
  offset: zod0.ZodDefault<zod0.ZodNumber>;
2200
2224
  configId: zod0.ZodOptional<zod0.ZodString>;
2225
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2226
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2201
2227
  provider: zod0.ZodOptional<zod0.ZodString>;
2202
2228
  model: zod0.ZodOptional<zod0.ZodString>;
2203
2229
  startDate: zod0.ZodOptional<zod0.ZodDate>;
2204
2230
  endDate: zod0.ZodOptional<zod0.ZodDate>;
2231
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2205
2232
  }, zod_v4_core0.$strip>>) => Promise<{
2206
2233
  data: {
2207
2234
  configId: string | null;
2208
2235
  variantId: string | null;
2209
2236
  id: string;
2210
2237
  provider: string;
2238
+ environmentId: string | null;
2211
2239
  requestId: string;
2212
2240
  model: string;
2213
2241
  promptTokens: number;
@@ -2235,6 +2263,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2235
2263
  variantId: string | null;
2236
2264
  id: string;
2237
2265
  provider: string;
2266
+ environmentId: string | null;
2238
2267
  requestId: string;
2239
2268
  model: string;
2240
2269
  promptTokens: number;
@@ -2256,6 +2285,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2256
2285
  getTotalCost: (params: zod0.infer<zod0.ZodObject<{
2257
2286
  startDate: zod0.ZodDate;
2258
2287
  endDate: zod0.ZodDate;
2288
+ configId: zod0.ZodOptional<zod0.ZodString>;
2289
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2290
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2291
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2259
2292
  }, zod_v4_core0.$strip>>) => Promise<{
2260
2293
  totalCost: number;
2261
2294
  totalInputCost: number;
@@ -2268,6 +2301,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2268
2301
  getCostByModel: (params: zod0.infer<zod0.ZodObject<{
2269
2302
  startDate: zod0.ZodDate;
2270
2303
  endDate: zod0.ZodDate;
2304
+ configId: zod0.ZodOptional<zod0.ZodString>;
2305
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2306
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2307
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2271
2308
  }, zod_v4_core0.$strip>>) => Promise<{
2272
2309
  provider: string;
2273
2310
  model: string;
@@ -2281,6 +2318,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2281
2318
  getCostByProvider: (params: zod0.infer<zod0.ZodObject<{
2282
2319
  startDate: zod0.ZodDate;
2283
2320
  endDate: zod0.ZodDate;
2321
+ configId: zod0.ZodOptional<zod0.ZodString>;
2322
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2323
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2324
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2284
2325
  }, zod_v4_core0.$strip>>) => Promise<{
2285
2326
  provider: string;
2286
2327
  totalCost: number;
@@ -2293,6 +2334,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2293
2334
  getCostByConfig: (params: zod0.infer<zod0.ZodObject<{
2294
2335
  startDate: zod0.ZodDate;
2295
2336
  endDate: zod0.ZodDate;
2337
+ configId: zod0.ZodOptional<zod0.ZodString>;
2338
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2339
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2340
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2296
2341
  }, zod_v4_core0.$strip>>) => Promise<{
2297
2342
  configId: string | null;
2298
2343
  totalCost: number;
@@ -2306,6 +2351,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2306
2351
  getDailyCosts: (params: zod0.infer<zod0.ZodObject<{
2307
2352
  startDate: zod0.ZodDate;
2308
2353
  endDate: zod0.ZodDate;
2354
+ configId: zod0.ZodOptional<zod0.ZodString>;
2355
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2356
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2357
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2309
2358
  }, zod_v4_core0.$strip>>) => Promise<{
2310
2359
  totalCost: number;
2311
2360
  totalInputCost: number;
@@ -2317,6 +2366,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2317
2366
  getCostSummary: (params: zod0.infer<zod0.ZodObject<{
2318
2367
  startDate: zod0.ZodDate;
2319
2368
  endDate: zod0.ZodDate;
2369
+ configId: zod0.ZodOptional<zod0.ZodString>;
2370
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2371
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2372
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2320
2373
  groupBy: zod0.ZodOptional<zod0.ZodEnum<{
2321
2374
  provider: "provider";
2322
2375
  model: "model";
@@ -2332,6 +2385,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2332
2385
  getRequestStats: (params: zod0.infer<zod0.ZodObject<{
2333
2386
  startDate: zod0.ZodDate;
2334
2387
  endDate: zod0.ZodDate;
2388
+ configId: zod0.ZodOptional<zod0.ZodString>;
2389
+ variantId: zod0.ZodOptional<zod0.ZodString>;
2390
+ environmentId: zod0.ZodOptional<zod0.ZodString>;
2391
+ tags: zod0.ZodOptional<zod0.ZodRecord<zod0.ZodString, zod0.ZodArray<zod0.ZodString>>>;
2335
2392
  }, zod_v4_core0.$strip>>) => Promise<{
2336
2393
  avgLatencyMs: number;
2337
2394
  totalRequests: number;
@@ -2341,6 +2398,10 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2341
2398
  maxLatencyMs: number;
2342
2399
  minLatencyMs: number;
2343
2400
  } | undefined>;
2401
+ getDistinctTags: () => Promise<{
2402
+ key: string;
2403
+ value: string;
2404
+ }[]>;
2344
2405
  createEnvironmentSecret: (params: zod0.infer<zod0.ZodObject<{
2345
2406
  environmentId: zod0.ZodUUID;
2346
2407
  keyName: zod0.ZodString;
@@ -2636,6 +2697,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
2636
2697
  }, zod_v4_core0.$strip>>) => Promise<{
2637
2698
  configId: string;
2638
2699
  variantId: string;
2700
+ environmentId: string;
2639
2701
  version: number;
2640
2702
  provider: string;
2641
2703
  modelName: string;