@openmeter/sdk 1.0.0-alpha.4 → 1.0.0-beta.13

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 (87) hide show
  1. package/README.md +114 -46
  2. package/dist/clients/client.d.ts +40 -0
  3. package/dist/clients/client.js +104 -0
  4. package/dist/clients/event.d.ts +79 -0
  5. package/dist/clients/event.js +53 -0
  6. package/dist/clients/meter.d.ts +96 -0
  7. package/dist/clients/meter.js +64 -0
  8. package/dist/index.d.ts +11 -22
  9. package/dist/index.js +8 -25
  10. package/dist/next.d.ts +15 -0
  11. package/dist/next.js +46 -0
  12. package/dist/schemas/openapi.d.ts +406 -0
  13. package/dist/schemas/openapi.js +5 -0
  14. package/dist/test/agent.d.ts +2 -0
  15. package/dist/test/agent.js +184 -0
  16. package/dist/test/mocks.d.ts +12 -0
  17. package/dist/test/mocks.js +32 -0
  18. package/dist/tsconfig.tsbuildinfo +1 -1
  19. package/index.ts +14 -48
  20. package/next.ts +76 -0
  21. package/package.json +56 -55
  22. package/dist/generated/HttpService.d.ts +0 -14
  23. package/dist/generated/HttpService.js +0 -27
  24. package/dist/generated/core/ApiError.d.ts +0 -10
  25. package/dist/generated/core/ApiError.js +0 -17
  26. package/dist/generated/core/ApiRequestOptions.d.ts +0 -13
  27. package/dist/generated/core/ApiRequestOptions.js +0 -2
  28. package/dist/generated/core/ApiResult.d.ts +0 -7
  29. package/dist/generated/core/ApiResult.js +0 -2
  30. package/dist/generated/core/BaseHttpRequest.d.ts +0 -8
  31. package/dist/generated/core/BaseHttpRequest.js +0 -7
  32. package/dist/generated/core/CancelablePromise.d.ts +0 -20
  33. package/dist/generated/core/CancelablePromise.js +0 -93
  34. package/dist/generated/core/NodeHttpRequest.d.ts +0 -14
  35. package/dist/generated/core/NodeHttpRequest.js +0 -17
  36. package/dist/generated/core/OpenAPI.d.ts +0 -16
  37. package/dist/generated/core/OpenAPI.js +0 -12
  38. package/dist/generated/core/request.d.ts +0 -34
  39. package/dist/generated/core/request.js +0 -268
  40. package/dist/generated/index.d.ts +0 -29
  41. package/dist/generated/index.js +0 -22
  42. package/dist/generated/models/Event.d.ts +0 -49
  43. package/dist/generated/models/Event.js +0 -11
  44. package/dist/generated/models/IdOrSlug.d.ts +0 -1
  45. package/dist/generated/models/IdOrSlug.js +0 -2
  46. package/dist/generated/models/Meter.d.ts +0 -30
  47. package/dist/generated/models/Meter.js +0 -2
  48. package/dist/generated/models/MeterAggregation.d.ts +0 -10
  49. package/dist/generated/models/MeterAggregation.js +0 -12
  50. package/dist/generated/models/MeterValue.d.ts +0 -10
  51. package/dist/generated/models/MeterValue.js +0 -2
  52. package/dist/generated/models/Namespace.d.ts +0 -6
  53. package/dist/generated/models/Namespace.js +0 -2
  54. package/dist/generated/models/Problem.d.ts +0 -4
  55. package/dist/generated/models/Problem.js +0 -2
  56. package/dist/generated/models/WindowSize.d.ts +0 -5
  57. package/dist/generated/models/WindowSize.js +0 -7
  58. package/dist/generated/models/meterIdOrSlug.d.ts +0 -5
  59. package/dist/generated/models/meterIdOrSlug.js +0 -2
  60. package/dist/generated/models/namespaceParam.d.ts +0 -4
  61. package/dist/generated/models/namespaceParam.js +0 -2
  62. package/dist/generated/schemas/$Event.d.ts +0 -59
  63. package/dist/generated/schemas/$Event.js +0 -60
  64. package/dist/generated/schemas/$IdOrSlug.d.ts +0 -13
  65. package/dist/generated/schemas/$IdOrSlug.js +0 -14
  66. package/dist/generated/schemas/$Meter.d.ts +0 -44
  67. package/dist/generated/schemas/$Meter.js +0 -45
  68. package/dist/generated/schemas/$MeterAggregation.d.ts +0 -3
  69. package/dist/generated/schemas/$MeterAggregation.js +0 -4
  70. package/dist/generated/schemas/$MeterValue.d.ts +0 -26
  71. package/dist/generated/schemas/$MeterValue.js +0 -27
  72. package/dist/generated/schemas/$Namespace.d.ts +0 -9
  73. package/dist/generated/schemas/$Namespace.js +0 -10
  74. package/dist/generated/schemas/$Problem.d.ts +0 -6
  75. package/dist/generated/schemas/$Problem.js +0 -7
  76. package/dist/generated/schemas/$WindowSize.d.ts +0 -3
  77. package/dist/generated/schemas/$WindowSize.js +0 -4
  78. package/dist/generated/schemas/$meterIdOrSlug.d.ts +0 -4
  79. package/dist/generated/schemas/$meterIdOrSlug.js +0 -5
  80. package/dist/generated/schemas/$namespaceParam.d.ts +0 -5
  81. package/dist/generated/schemas/$namespaceParam.js +0 -6
  82. package/dist/generated/services/DefaultService.d.ts +0 -16
  83. package/dist/generated/services/DefaultService.js +0 -22
  84. package/dist/generated/services/EventsService.d.ts +0 -17
  85. package/dist/generated/services/EventsService.js +0 -29
  86. package/dist/generated/services/MetersService.d.ts +0 -75
  87. package/dist/generated/services/MetersService.js +0 -140
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ## Install
4
4
 
5
5
  ```sh
6
- npm install --save @openmeter/sdk@alpha
6
+ npm install --save @openmeter/sdk
7
7
  ```
8
8
 
9
9
  ## Example
@@ -15,78 +15,146 @@ const openmeter = new OpenMeter({ baseUrl: 'http://localhost:8888' })
15
15
 
16
16
  // Ingesting an event
17
17
  const event: Event = {
18
- specversion: '1.0',
19
- id: 'id-1',
20
- source: 'my-app',
21
- type: 'my-type',
22
- subject: 'my-awesome-user-id',
23
- time: new Date().toISOString(),
24
- data: {
25
- api_calls: 1,
26
- },
18
+ specversion: '1.0',
19
+ id: 'id-1',
20
+ source: 'my-app',
21
+ type: 'my-type',
22
+ subject: 'my-awesome-user-id',
23
+ time: new Date(),
24
+ data: {
25
+ api_calls: 1,
26
+ },
27
27
  }
28
- await openmeter.events.ingestEvents(event)
28
+ await openmeter.events.ingest(event)
29
29
 
30
30
  // Fetching a meter
31
- const meter = await openmeter.meters.getMeter('m1')
31
+ const meter = await openmeter.meters.get('m1')
32
32
  ```
33
33
 
34
34
  ## API
35
35
 
36
- The OpenMeter SDK uses [openapi-typescript-codegen](https://www.npmjs.com/package/openapi-typescript-codegen) under the hood to generate the HTTP client.
37
-
38
36
  ### Events
39
37
 
40
- #### ingestEvents
38
+ #### ingest
41
39
 
42
40
  ```ts
43
41
  import { type Event } from '@openmeter/sdk'
44
42
 
45
43
  const event: Event = {
46
- specversion: '1.0',
47
- id: 'id-1',
48
- source: 'my-app',
49
- type: 'my-type',
50
- subject: 'my-awesome-user-id',
51
- time: new Date().toISOString(),
52
- data: {
53
- api_calls: 1,
54
- },
44
+ specversion: '1.0',
45
+ id: 'id-1',
46
+ source: 'my-app',
47
+ type: 'my-type',
48
+ subject: 'my-awesome-user-id',
49
+ time: new Date(),
50
+ data: {
51
+ api_calls: 1,
52
+ },
55
53
  }
56
- await openmeter.events.ingestEvents(event)
54
+ await openmeter.events.ingest(event)
55
+ ```
56
+
57
+ #### list
58
+
59
+ Retrieve latest raw events. Useful for debugging.
60
+
61
+ ```ts
62
+ const events = await openmeter.events.list()
57
63
  ```
58
64
 
59
65
  ### Meters
60
66
 
61
- #### listMeters
67
+ #### list
68
+
69
+ List meters.
62
70
 
63
71
  ```ts
64
- const meters = await openmeter.meters.listMeters()
72
+ const meters = await openmeter.meters.list()
65
73
  ```
66
74
 
67
- #### getMeter
75
+ #### get
76
+
77
+ Get one meter by slug.
68
78
 
69
79
  ```ts
70
- const meter = await openmeter.meters.getMeter('m1')
80
+ const meter = await openmeter.meters.get('m1')
71
81
  ```
72
82
 
73
- #### getMeterValues
83
+ #### query
84
+
85
+ Query meter values.
74
86
 
75
87
  ```ts
76
- import { type WindowSize } from '@openmeter/sdk'
77
-
78
- const meterSlug = 'm2'
79
- const namespace = undefined
80
- const subject = 'user-1'
81
- const from = new Date('2021-01-01').toISOString()
82
- const to = new Date('2021-01-02').toISOString()
83
- const windowSize = WindowSize.HOUR
84
- const values = await openmeter.meters.getMeterValues(
85
- meterSlug,
86
- namespace,
87
- subject,
88
- from,
89
- to,
90
- windowSize
91
- )
88
+ import { WindowSize } from '@openmeter/sdk'
89
+
90
+ const values = await openmeter.meters.query('my-meter-slug', {
91
+ subject: ['user-1'],
92
+ groupBy: ['method', 'path'],
93
+ from: new Date('2021-01-01'),
94
+ to: new Date('2021-01-02'),
95
+ windowSize: WindowSize.HOUR,
96
+ })
97
+ ```
98
+
99
+ #### subjects
100
+
101
+ List meter subjects.
102
+
103
+ ```ts
104
+ const subjects = await openmeter.meters.subjects('my-meter-slug')
105
+ ```
106
+
107
+ ## Helpers
108
+
109
+ ### Vercel AI SDK / Next.js
110
+
111
+ The OpenAI streaming API used by the Vercel AI SDK doesn't return token usage metadata by default.
112
+ The OpenMeter `createOpenAIStreamCallback` helper function decorates the callback with a `onUsage`
113
+ callback which you can use to report usage to OpenMeter.
114
+
115
+ ```ts
116
+ import OpenAI from 'openai'
117
+ import { OpenAIStream, StreamingTextResponse } from 'ai'
118
+ import { createOpenAIStreamCallback } from '@openmeter/sdk'
119
+
120
+ export async function POST(req: Request) {
121
+ const { messages } = await req.json()
122
+ const model = 'gpt-3.5-turbo'
123
+
124
+ const response = await openai.chat.completions.create({
125
+ model,
126
+ messages,
127
+ stream: true,
128
+ })
129
+
130
+ const streamCallbacks = await createOpenAIStreamCallback(
131
+ {
132
+ model,
133
+ prompts: messages.map(({ content }) => content),
134
+ },
135
+ {
136
+ // onToken() => {...}
137
+ // onFinal() => {...}
138
+ async onUsage(usage) {
139
+ try {
140
+ await openmeter.events.ingest({
141
+ source: 'my-app',
142
+ type: 'my-event-type',
143
+ subject: 'my-customer-id',
144
+ data: {
145
+ // Usage is { total_tokens, prompt_tokens, completion_tokens }
146
+ ...usage,
147
+ model,
148
+ },
149
+ })
150
+ } catch (err) {
151
+ console.error('failed to ingest usage', err)
152
+ }
153
+ },
154
+ }
155
+ )
156
+
157
+ const stream = OpenAIStream(response, streamCallbacks)
158
+ return new StreamingTextResponse(stream)
159
+ }
92
160
  ```
@@ -0,0 +1,40 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ import { IncomingHttpHeaders } from 'http';
5
+ import { Dispatcher } from 'undici';
6
+ import { components } from '../schemas/openapi.js';
7
+ export type OpenMeterConfig = {
8
+ baseUrl: string;
9
+ token?: string;
10
+ username?: string;
11
+ password?: string;
12
+ headers?: IncomingHttpHeaders;
13
+ };
14
+ export type RequestOptions = {
15
+ headers?: IncomingHttpHeaders;
16
+ };
17
+ export type Problem = components['schemas']['Problem'];
18
+ export declare class BaseClient {
19
+ protected config: OpenMeterConfig;
20
+ constructor(config: OpenMeterConfig);
21
+ protected request<T>({ path, method, searchParams, headers, body, options, }: {
22
+ path: string;
23
+ method: Dispatcher.HttpMethod;
24
+ searchParams?: URLSearchParams;
25
+ headers?: IncomingHttpHeaders;
26
+ body?: string | Buffer | Uint8Array;
27
+ options?: RequestOptions;
28
+ }): Promise<T>;
29
+ protected getUrl(path: string, searchParams?: URLSearchParams): import("url").URL;
30
+ protected getAuthHeaders(): IncomingHttpHeaders;
31
+ protected static toURLSearchParams(params: Record<string, string | number | Date | string[] | undefined>): URLSearchParams;
32
+ }
33
+ export declare class HttpError extends Error {
34
+ statusCode: number;
35
+ problem?: Problem;
36
+ constructor({ statusCode, problem, }: {
37
+ statusCode: number;
38
+ problem?: Problem;
39
+ });
40
+ }
@@ -0,0 +1,104 @@
1
+ import { request } from 'undici';
2
+ export class BaseClient {
3
+ config;
4
+ constructor(config) {
5
+ this.config = config;
6
+ }
7
+ async request({ path, method, searchParams, headers, body, options, }) {
8
+ // Building URL
9
+ const url = this.getUrl(path, searchParams);
10
+ // Request options
11
+ const reqHeaders = {
12
+ Accept: 'application/json',
13
+ ...headers,
14
+ ...this.getAuthHeaders(),
15
+ ...this.config.headers,
16
+ ...options?.headers,
17
+ };
18
+ const reqOpts = {
19
+ method,
20
+ headers: reqHeaders,
21
+ };
22
+ // Optional body
23
+ if (body) {
24
+ if (!reqHeaders['Content-Type'] && !reqHeaders['content-type']) {
25
+ throw new Error('Content Type is required with body');
26
+ }
27
+ reqOpts.body = body;
28
+ }
29
+ const resp = await request(url, reqOpts);
30
+ // Error handling
31
+ if (resp.statusCode > 399) {
32
+ if (resp.headers['content-type'] === 'application/problem+json') {
33
+ const problem = (await resp.body.json());
34
+ throw new HttpError({
35
+ statusCode: resp.statusCode,
36
+ problem,
37
+ });
38
+ }
39
+ // Requests can fail before API, in this case we only have a status code
40
+ throw new HttpError({
41
+ statusCode: resp.statusCode,
42
+ });
43
+ }
44
+ // Response parsing
45
+ if (resp.statusCode === 204 || resp.headers['content-length'] === '0') {
46
+ return undefined;
47
+ }
48
+ if (resp.headers['content-type'] === 'application/json') {
49
+ return (await resp.body.json());
50
+ }
51
+ if (!resp.headers['content-type']) {
52
+ throw new Error('Missing content type');
53
+ }
54
+ throw new Error(`Unknown content type: ${resp.headers['content-type']}`);
55
+ }
56
+ getUrl(path, searchParams) {
57
+ let qs = searchParams ? searchParams.toString() : '';
58
+ qs = qs.length > 0 ? `?${qs}` : '';
59
+ const url = new URL(`${path}${qs}`, this.config.baseUrl);
60
+ return url;
61
+ }
62
+ getAuthHeaders() {
63
+ if (this.config.token) {
64
+ return {
65
+ authorization: `Bearer ${this.config.token}`,
66
+ };
67
+ }
68
+ if (this.config.username && this.config.password) {
69
+ const encoded = Buffer.from(`${this.config.username}:${this.config.password}`).toString('base64');
70
+ return {
71
+ authorization: `Basic ${encoded}`,
72
+ };
73
+ }
74
+ return {};
75
+ }
76
+ static toURLSearchParams(params) {
77
+ const searchParams = new URLSearchParams();
78
+ for (const [key, value] of Object.entries(params)) {
79
+ if (value === undefined) {
80
+ continue;
81
+ }
82
+ if (Array.isArray(value)) {
83
+ searchParams.append(key, value.join(','));
84
+ }
85
+ else if (value instanceof Date) {
86
+ searchParams.append(key, value.toISOString());
87
+ }
88
+ else {
89
+ searchParams.append(key, value.toString());
90
+ }
91
+ }
92
+ return searchParams;
93
+ }
94
+ }
95
+ export class HttpError extends Error {
96
+ statusCode;
97
+ problem;
98
+ constructor({ statusCode, problem, }) {
99
+ super(problem?.type || 'unexpected status code');
100
+ this.name = 'HttpError';
101
+ this.statusCode = statusCode;
102
+ this.problem = problem;
103
+ }
104
+ }
@@ -0,0 +1,79 @@
1
+ import { components } from '../schemas/openapi.js';
2
+ import { RequestOptions, BaseClient, OpenMeterConfig } from './client.js';
3
+ type CloudEvents = components['schemas']['Event'];
4
+ export type EventsQueryParams = {
5
+ /**
6
+ * @description Limit number of results. Max: 100
7
+ * @example 25
8
+ */
9
+ limit?: number;
10
+ };
11
+ /**
12
+ * Usage Event
13
+ */
14
+ export type Event = {
15
+ /**
16
+ * @description The version of the CloudEvents specification which the event uses.
17
+ * @example 1.0
18
+ */
19
+ specversion?: string;
20
+ /**
21
+ * @description Unique identifier for the event, defaults to uuid v4.
22
+ * @example "5c10fade-1c9e-4d6c-8275-c52c36731d3c"
23
+ */
24
+ id?: string;
25
+ /**
26
+ * Format: uri-reference
27
+ * @description Identifies the context in which an event happened, defaults to: @openmeter/sdk
28
+ * @example services/service-0
29
+ */
30
+ source?: string;
31
+ /**
32
+ * @description Describes the type of event related to the originating occurrence.
33
+ * @example "api_request"
34
+ */
35
+ type: string;
36
+ /**
37
+ * @description Describes the subject of the event in the context of the event producer (identified by source).
38
+ * @example "customer_id"
39
+ */
40
+ subject: string;
41
+ /**
42
+ * Format: date-time
43
+ * @description Date of when the occurrence happened.
44
+ * @example new Date('2023-01-01T01:01:01.001Z')
45
+ */
46
+ time?: Date;
47
+ /**
48
+ * Format: uri
49
+ * @description Identifies the schema that data adheres to.
50
+ */
51
+ dataschema?: string;
52
+ /**
53
+ * @description Content type of the data value. Must adhere to RFC 2046 format.
54
+ * @example application/json
55
+ * @enum {string|null}
56
+ */
57
+ datacontenttype?: 'application/json';
58
+ /**
59
+ * @description The event payload.
60
+ * @example {
61
+ * "duration_ms": "12",
62
+ * "path": "/hello"
63
+ * }
64
+ */
65
+ data: Record<string, string | number | Record<string, string | number>>;
66
+ };
67
+ export declare class EventsClient extends BaseClient {
68
+ constructor(config: OpenMeterConfig);
69
+ /**
70
+ * Ingest usage event in a CloudEvents format
71
+ * @see https://cloudevents.io
72
+ */
73
+ ingest(usageEvent: Event, options?: RequestOptions): Promise<void>;
74
+ /**
75
+ * List raw events
76
+ */
77
+ list(params?: EventsQueryParams, options?: RequestOptions): Promise<CloudEvents[]>;
78
+ }
79
+ export {};
@@ -0,0 +1,53 @@
1
+ import crypto from 'crypto';
2
+ import { BaseClient } from './client.js';
3
+ export class EventsClient extends BaseClient {
4
+ constructor(config) {
5
+ super(config);
6
+ }
7
+ /**
8
+ * Ingest usage event in a CloudEvents format
9
+ * @see https://cloudevents.io
10
+ */
11
+ async ingest(usageEvent, options) {
12
+ if (usageEvent.datacontenttype &&
13
+ usageEvent.datacontenttype !== 'application/json') {
14
+ throw new TypeError(`Unsupported datacontenttype: ${usageEvent.datacontenttype}`);
15
+ }
16
+ // We default where we can to lower the barrier to use CloudEvents
17
+ const body = {
18
+ specversion: usageEvent.specversion ?? '1.0',
19
+ id: usageEvent.id ?? crypto.randomUUID(),
20
+ source: usageEvent.source ?? '@openmeter/sdk',
21
+ type: usageEvent.type,
22
+ subject: usageEvent.subject,
23
+ time: usageEvent.time?.toISOString(),
24
+ datacontenttype: usageEvent.datacontenttype,
25
+ dataschema: usageEvent.dataschema,
26
+ data: usageEvent.data,
27
+ };
28
+ // Making Request
29
+ return await this.request({
30
+ path: '/api/v1/events',
31
+ method: 'POST',
32
+ body: JSON.stringify(body),
33
+ headers: {
34
+ 'Content-Type': 'application/cloudevents+json',
35
+ },
36
+ options,
37
+ });
38
+ }
39
+ /**
40
+ * List raw events
41
+ */
42
+ async list(params, options) {
43
+ const searchParams = params
44
+ ? BaseClient.toURLSearchParams(params)
45
+ : undefined;
46
+ return this.request({
47
+ method: 'GET',
48
+ path: `/api/v1/events`,
49
+ searchParams,
50
+ options,
51
+ });
52
+ }
53
+ }
@@ -0,0 +1,96 @@
1
+ import { paths, components } from '../schemas/openapi.js';
2
+ import { BaseClient, OpenMeterConfig, RequestOptions } from './client.js';
3
+ export declare enum WindowSize {
4
+ MINUTE = "MINUTE",
5
+ HOUR = "HOUR",
6
+ DAY = "DAY"
7
+ }
8
+ export declare enum MeterAggregation {
9
+ SUM = "SUM",
10
+ COUNT = "COUNT",
11
+ AVG = "AVG",
12
+ MIN = "MIN",
13
+ MAX = "MAX"
14
+ }
15
+ export type MeterValuesParams = {
16
+ /**
17
+ * @description Subject(s) to filter by.
18
+ * @example ["customer-1", "customer-2"]
19
+ */
20
+ subject?: string;
21
+ /**
22
+ * @description Start date.
23
+ * Must be aligned with the window size.
24
+ * Inclusive.
25
+ */
26
+ from?: Date;
27
+ /**
28
+ * @description End date.
29
+ * Must be aligned with the window size.
30
+ * Inclusive.
31
+ */
32
+ to?: Date;
33
+ /**
34
+ * @description Window Size
35
+ * If not specified, a single usage aggregate will be returned for the entirety of
36
+ * the specified period for each subject and group.
37
+ */
38
+ windowSize?: WindowSizeType;
39
+ /**
40
+ * @description Group By
41
+ * If not specified a single aggregate will be returned for each subject and time window.
42
+ */
43
+ groupBy?: string[];
44
+ };
45
+ export type MeterQueryParams = {
46
+ /**
47
+ * @description Subject(s) to filter by.
48
+ * @example ["customer-1", "customer-2"]
49
+ */
50
+ subject?: string[];
51
+ /**
52
+ * @description Start date.
53
+ * Must be aligned with the window size.
54
+ * Inclusive.
55
+ */
56
+ from?: Date;
57
+ /**
58
+ * @description End date.
59
+ * Must be aligned with the window size.
60
+ * Inclusive.
61
+ */
62
+ to?: Date;
63
+ /**
64
+ * @description Window Size
65
+ * If not specified, a single usage aggregate will be returned for the entirety of
66
+ * the specified period for each subject and group.
67
+ */
68
+ windowSize?: WindowSizeType;
69
+ /**
70
+ * @description Group By
71
+ * If not specified a single aggregate will be returned for each subject and time window.
72
+ */
73
+ groupBy?: string[];
74
+ };
75
+ export type MeterQueryResponse = paths['/api/v1/meters/{meterIdOrSlug}/query']['get']['responses']['200']['content']['application/json'];
76
+ export type Meter = components['schemas']['Meter'];
77
+ export type WindowSizeType = components['schemas']['WindowSize'];
78
+ export declare class MetersClient extends BaseClient {
79
+ constructor(config: OpenMeterConfig);
80
+ /**
81
+ * Get one meter by slug
82
+ */
83
+ get(slug: string, options?: RequestOptions): Promise<Meter>;
84
+ /**
85
+ * List meters
86
+ */
87
+ list(options?: RequestOptions): Promise<Meter[]>;
88
+ /**
89
+ * Query a meter
90
+ */
91
+ query(slug: string, params?: MeterQueryParams, options?: RequestOptions): Promise<MeterQueryResponse>;
92
+ /**
93
+ * List subjects of a meter
94
+ */
95
+ subjects(slug: string, options?: RequestOptions): Promise<string[]>;
96
+ }
@@ -0,0 +1,64 @@
1
+ import { BaseClient } from './client.js';
2
+ export var WindowSize;
3
+ (function (WindowSize) {
4
+ WindowSize["MINUTE"] = "MINUTE";
5
+ WindowSize["HOUR"] = "HOUR";
6
+ WindowSize["DAY"] = "DAY";
7
+ })(WindowSize || (WindowSize = {}));
8
+ export var MeterAggregation;
9
+ (function (MeterAggregation) {
10
+ MeterAggregation["SUM"] = "SUM";
11
+ MeterAggregation["COUNT"] = "COUNT";
12
+ MeterAggregation["AVG"] = "AVG";
13
+ MeterAggregation["MIN"] = "MIN";
14
+ MeterAggregation["MAX"] = "MAX";
15
+ })(MeterAggregation || (MeterAggregation = {}));
16
+ export class MetersClient extends BaseClient {
17
+ constructor(config) {
18
+ super(config);
19
+ }
20
+ /**
21
+ * Get one meter by slug
22
+ */
23
+ async get(slug, options) {
24
+ return this.request({
25
+ method: 'GET',
26
+ path: `/api/v1/meters/${slug}`,
27
+ options,
28
+ });
29
+ }
30
+ /**
31
+ * List meters
32
+ */
33
+ async list(options) {
34
+ return this.request({
35
+ method: 'GET',
36
+ path: `/api/v1/meters`,
37
+ options,
38
+ });
39
+ }
40
+ /**
41
+ * Query a meter
42
+ */
43
+ async query(slug, params, options) {
44
+ const searchParams = params
45
+ ? BaseClient.toURLSearchParams(params)
46
+ : undefined;
47
+ return this.request({
48
+ method: 'GET',
49
+ path: `/api/v1/meters/${slug}/query`,
50
+ searchParams,
51
+ options,
52
+ });
53
+ }
54
+ /**
55
+ * List subjects of a meter
56
+ */
57
+ async subjects(slug, options) {
58
+ return this.request({
59
+ method: 'GET',
60
+ path: `/api/v1/meters/${slug}/subjects`,
61
+ options,
62
+ });
63
+ }
64
+ }
package/dist/index.d.ts CHANGED
@@ -1,23 +1,12 @@
1
- export { NodeHttpRequest } from './generated/core/NodeHttpRequest.js';
2
- import { type OpenAPIConfig } from './generated/core/OpenAPI.js';
3
- import { HttpService } from './generated/HttpService.js';
4
- import { DefaultService, EventsService, MetersService } from './generated/index.js';
5
- import type { BaseHttpRequest } from './generated/core/BaseHttpRequest.js';
6
- export * from './generated/index.js';
7
- export type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest;
8
- export type ClientConfig = {
9
- baseUrl: string;
10
- credentials?: OpenAPIConfig['CREDENTIALS'];
11
- withCredentials?: OpenAPIConfig['WITH_CREDENTIALS'];
12
- token?: OpenAPIConfig['TOKEN'];
13
- username?: OpenAPIConfig['USERNAME'];
14
- password?: OpenAPIConfig['PASSWORD'];
15
- headers?: OpenAPIConfig['HEADERS'];
16
- };
17
- export declare class OpenMeter extends HttpService {
18
- readonly request: BaseHttpRequest;
19
- readonly default: DefaultService;
20
- readonly events: EventsService;
21
- readonly meters: MetersService;
22
- constructor(config: ClientConfig, HttpRequest?: HttpRequestConstructor);
1
+ import { OpenMeterConfig } from './clients/client.js';
2
+ import { EventsClient } from './clients/event.js';
3
+ import { MetersClient } from './clients/meter.js';
4
+ export { OpenMeterConfig, RequestOptions } from './clients/client.js';
5
+ export { Event } from './clients/event.js';
6
+ export { Meter, MeterAggregation, WindowSize } from './clients/meter.js';
7
+ export { createOpenAIStreamCallback } from './next.js';
8
+ export declare class OpenMeter {
9
+ events: EventsClient;
10
+ meters: MetersClient;
11
+ constructor(config: OpenMeterConfig);
23
12
  }