@revenium/openai 1.0.12 → 1.0.14

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 (236) hide show
  1. package/.env.example +10 -15
  2. package/CHANGELOG.md +59 -0
  3. package/CODE_OF_CONDUCT.md +57 -0
  4. package/CONTRIBUTING.md +38 -0
  5. package/README.md +109 -515
  6. package/SECURITY.md +34 -0
  7. package/dist/cjs/core/client/index.js +14 -0
  8. package/dist/cjs/core/client/index.js.map +1 -0
  9. package/dist/cjs/core/client/manager.js +109 -0
  10. package/dist/cjs/core/client/manager.js.map +1 -0
  11. package/dist/cjs/core/config/azure-config.js +5 -17
  12. package/dist/cjs/core/config/azure-config.js.map +1 -1
  13. package/dist/cjs/core/config/index.js +2 -2
  14. package/dist/cjs/core/config/index.js.map +1 -1
  15. package/dist/cjs/core/config/loader.js +34 -14
  16. package/dist/cjs/core/config/loader.js.map +1 -1
  17. package/dist/cjs/core/config/manager.js +12 -5
  18. package/dist/cjs/core/config/manager.js.map +1 -1
  19. package/dist/cjs/core/config/validator.js +3 -45
  20. package/dist/cjs/core/config/validator.js.map +1 -1
  21. package/dist/cjs/core/middleware/index.js +17 -0
  22. package/dist/cjs/core/middleware/index.js.map +1 -0
  23. package/dist/cjs/core/middleware/interfaces.js +361 -0
  24. package/dist/cjs/core/middleware/interfaces.js.map +1 -0
  25. package/dist/cjs/core/middleware/revenium-client.js +142 -0
  26. package/dist/cjs/core/middleware/revenium-client.js.map +1 -0
  27. package/dist/cjs/core/providers/detector.js +45 -23
  28. package/dist/cjs/core/providers/detector.js.map +1 -1
  29. package/dist/cjs/core/providers/index.js +2 -1
  30. package/dist/cjs/core/providers/index.js.map +1 -1
  31. package/dist/cjs/core/tracking/api-client.js +14 -13
  32. package/dist/cjs/core/tracking/api-client.js.map +1 -1
  33. package/dist/cjs/core/tracking/payload-builder.js +30 -35
  34. package/dist/cjs/core/tracking/payload-builder.js.map +1 -1
  35. package/dist/cjs/core/tracking/usage-tracker.js +22 -18
  36. package/dist/cjs/core/tracking/usage-tracker.js.map +1 -1
  37. package/dist/cjs/index.js +26 -174
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/cjs/types/index.js +0 -8
  40. package/dist/cjs/types/index.js.map +1 -1
  41. package/dist/cjs/types/openai-augmentation.js +0 -49
  42. package/dist/cjs/types/openai-augmentation.js.map +1 -1
  43. package/dist/cjs/utils/constants.js +17 -20
  44. package/dist/cjs/utils/constants.js.map +1 -1
  45. package/dist/cjs/utils/error-handler.js +18 -14
  46. package/dist/cjs/utils/error-handler.js.map +1 -1
  47. package/dist/cjs/utils/metadata-builder.js +27 -19
  48. package/dist/cjs/utils/metadata-builder.js.map +1 -1
  49. package/dist/cjs/utils/provider-detection.js +25 -28
  50. package/dist/cjs/utils/provider-detection.js.map +1 -1
  51. package/dist/cjs/utils/stop-reason-mapper.js +4 -0
  52. package/dist/cjs/utils/stop-reason-mapper.js.map +1 -1
  53. package/dist/cjs/utils/url-builder.js +3 -3
  54. package/dist/esm/core/client/index.js +6 -0
  55. package/dist/esm/core/client/index.js.map +1 -0
  56. package/dist/esm/core/client/manager.js +102 -0
  57. package/dist/esm/core/client/manager.js.map +1 -0
  58. package/dist/esm/core/config/azure-config.js +6 -18
  59. package/dist/esm/core/config/azure-config.js.map +1 -1
  60. package/dist/esm/core/config/index.js +5 -4
  61. package/dist/esm/core/config/index.js.map +1 -1
  62. package/dist/esm/core/config/loader.js +33 -13
  63. package/dist/esm/core/config/loader.js.map +1 -1
  64. package/dist/esm/core/config/manager.js +14 -7
  65. package/dist/esm/core/config/manager.js.map +1 -1
  66. package/dist/esm/core/config/validator.js +3 -44
  67. package/dist/esm/core/config/validator.js.map +1 -1
  68. package/dist/esm/core/middleware/index.js +8 -0
  69. package/dist/esm/core/middleware/index.js.map +1 -0
  70. package/dist/esm/core/middleware/interfaces.js +353 -0
  71. package/dist/esm/core/middleware/interfaces.js.map +1 -0
  72. package/dist/esm/core/middleware/revenium-client.js +105 -0
  73. package/dist/esm/core/middleware/revenium-client.js.map +1 -0
  74. package/dist/esm/core/providers/detector.js +43 -22
  75. package/dist/esm/core/providers/detector.js.map +1 -1
  76. package/dist/esm/core/providers/index.js +2 -2
  77. package/dist/esm/core/providers/index.js.map +1 -1
  78. package/dist/esm/core/tracking/api-client.js +13 -12
  79. package/dist/esm/core/tracking/api-client.js.map +1 -1
  80. package/dist/esm/core/tracking/payload-builder.js +31 -36
  81. package/dist/esm/core/tracking/payload-builder.js.map +1 -1
  82. package/dist/esm/core/tracking/usage-tracker.js +24 -20
  83. package/dist/esm/core/tracking/usage-tracker.js.map +1 -1
  84. package/dist/esm/index.js +9 -157
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/types/index.js +2 -10
  87. package/dist/esm/types/index.js.map +1 -1
  88. package/dist/esm/types/openai-augmentation.js +0 -49
  89. package/dist/esm/types/openai-augmentation.js.map +1 -1
  90. package/dist/esm/utils/constants.js +16 -19
  91. package/dist/esm/utils/constants.js.map +1 -1
  92. package/dist/esm/utils/error-handler.js +19 -15
  93. package/dist/esm/utils/error-handler.js.map +1 -1
  94. package/dist/esm/utils/metadata-builder.js +27 -19
  95. package/dist/esm/utils/metadata-builder.js.map +1 -1
  96. package/dist/esm/utils/provider-detection.js +26 -29
  97. package/dist/esm/utils/provider-detection.js.map +1 -1
  98. package/dist/esm/utils/stop-reason-mapper.js +4 -0
  99. package/dist/esm/utils/stop-reason-mapper.js.map +1 -1
  100. package/dist/esm/utils/url-builder.js +3 -3
  101. package/dist/types/core/client/index.d.ts +6 -0
  102. package/dist/types/core/client/index.d.ts.map +1 -0
  103. package/dist/types/core/client/manager.d.ts +32 -0
  104. package/dist/types/core/client/manager.d.ts.map +1 -0
  105. package/dist/types/core/config/azure-config.d.ts +2 -2
  106. package/dist/types/core/config/azure-config.d.ts.map +1 -1
  107. package/dist/types/core/config/index.d.ts +4 -4
  108. package/dist/types/core/config/index.d.ts.map +1 -1
  109. package/dist/types/core/config/loader.d.ts +3 -1
  110. package/dist/types/core/config/loader.d.ts.map +1 -1
  111. package/dist/types/core/config/manager.d.ts +1 -1
  112. package/dist/types/core/config/manager.d.ts.map +1 -1
  113. package/dist/types/core/config/validator.d.ts +1 -12
  114. package/dist/types/core/config/validator.d.ts.map +1 -1
  115. package/dist/types/core/middleware/index.d.ts +8 -0
  116. package/dist/types/core/middleware/index.d.ts.map +1 -0
  117. package/dist/types/core/middleware/interfaces.d.ts +74 -0
  118. package/dist/types/core/middleware/interfaces.d.ts.map +1 -0
  119. package/dist/types/core/middleware/revenium-client.d.ts +58 -0
  120. package/dist/types/core/middleware/revenium-client.d.ts.map +1 -0
  121. package/dist/types/core/providers/detector.d.ts +9 -2
  122. package/dist/types/core/providers/detector.d.ts.map +1 -1
  123. package/dist/types/core/providers/index.d.ts +2 -2
  124. package/dist/types/core/providers/index.d.ts.map +1 -1
  125. package/dist/types/core/tracking/api-client.d.ts +1 -1
  126. package/dist/types/core/tracking/api-client.d.ts.map +1 -1
  127. package/dist/types/core/tracking/payload-builder.d.ts +3 -3
  128. package/dist/types/core/tracking/payload-builder.d.ts.map +1 -1
  129. package/dist/types/core/tracking/usage-tracker.d.ts +2 -2
  130. package/dist/types/core/tracking/usage-tracker.d.ts.map +1 -1
  131. package/dist/types/index.d.ts +11 -114
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/dist/types/types/function-parameters.d.ts +2 -23
  134. package/dist/types/types/function-parameters.d.ts.map +1 -1
  135. package/dist/types/types/index.d.ts +17 -115
  136. package/dist/types/types/index.d.ts.map +1 -1
  137. package/dist/types/types/openai-augmentation.d.ts +4 -139
  138. package/dist/types/types/openai-augmentation.d.ts.map +1 -1
  139. package/dist/types/utils/constants.d.ts +7 -1
  140. package/dist/types/utils/constants.d.ts.map +1 -1
  141. package/dist/types/utils/error-handler.d.ts +2 -2
  142. package/dist/types/utils/error-handler.d.ts.map +1 -1
  143. package/dist/types/utils/metadata-builder.d.ts +4 -3
  144. package/dist/types/utils/metadata-builder.d.ts.map +1 -1
  145. package/dist/types/utils/provider-detection.d.ts +3 -3
  146. package/dist/types/utils/provider-detection.d.ts.map +1 -1
  147. package/dist/types/utils/stop-reason-mapper.d.ts.map +1 -1
  148. package/dist/types/utils/url-builder.d.ts +3 -3
  149. package/examples/README.md +270 -224
  150. package/examples/azure/basic.ts +62 -0
  151. package/examples/azure/responses-basic.ts +45 -0
  152. package/examples/azure/responses-stream.ts +61 -0
  153. package/examples/azure/stream.ts +56 -0
  154. package/examples/getting_started.ts +31 -43
  155. package/examples/openai/basic.ts +45 -0
  156. package/examples/openai/metadata.ts +67 -0
  157. package/examples/openai/responses-basic.ts +44 -0
  158. package/examples/openai/responses-embed.ts +34 -0
  159. package/examples/openai/responses-streaming.ts +63 -0
  160. package/examples/openai/streaming.ts +59 -0
  161. package/package.json +20 -13
  162. package/dist/cjs/core/wrapper/index.js +0 -15
  163. package/dist/cjs/core/wrapper/index.js.map +0 -1
  164. package/dist/cjs/core/wrapper/instance-patcher.js +0 -202
  165. package/dist/cjs/core/wrapper/instance-patcher.js.map +0 -1
  166. package/dist/cjs/core/wrapper/request-handler.js +0 -317
  167. package/dist/cjs/core/wrapper/request-handler.js.map +0 -1
  168. package/dist/cjs/core/wrapper/stream-wrapper.js +0 -82
  169. package/dist/cjs/core/wrapper/stream-wrapper.js.map +0 -1
  170. package/dist/cjs/utils/azure-model-resolver.js +0 -211
  171. package/dist/cjs/utils/azure-model-resolver.js.map +0 -1
  172. package/dist/cjs/utils/request-handler-factory.js +0 -185
  173. package/dist/cjs/utils/request-handler-factory.js.map +0 -1
  174. package/dist/esm/core/wrapper/index.js +0 -9
  175. package/dist/esm/core/wrapper/index.js.map +0 -1
  176. package/dist/esm/core/wrapper/instance-patcher.js +0 -199
  177. package/dist/esm/core/wrapper/instance-patcher.js.map +0 -1
  178. package/dist/esm/core/wrapper/request-handler.js +0 -310
  179. package/dist/esm/core/wrapper/request-handler.js.map +0 -1
  180. package/dist/esm/core/wrapper/stream-wrapper.js +0 -79
  181. package/dist/esm/core/wrapper/stream-wrapper.js.map +0 -1
  182. package/dist/esm/utils/azure-model-resolver.js +0 -204
  183. package/dist/esm/utils/azure-model-resolver.js.map +0 -1
  184. package/dist/esm/utils/request-handler-factory.js +0 -146
  185. package/dist/esm/utils/request-handler-factory.js.map +0 -1
  186. package/dist/types/core/wrapper/index.d.ts +0 -8
  187. package/dist/types/core/wrapper/index.d.ts.map +0 -1
  188. package/dist/types/core/wrapper/instance-patcher.d.ts +0 -33
  189. package/dist/types/core/wrapper/instance-patcher.d.ts.map +0 -1
  190. package/dist/types/core/wrapper/request-handler.d.ts +0 -29
  191. package/dist/types/core/wrapper/request-handler.d.ts.map +0 -1
  192. package/dist/types/core/wrapper/stream-wrapper.d.ts +0 -13
  193. package/dist/types/core/wrapper/stream-wrapper.d.ts.map +0 -1
  194. package/dist/types/utils/azure-model-resolver.d.ts +0 -41
  195. package/dist/types/utils/azure-model-resolver.d.ts.map +0 -1
  196. package/dist/types/utils/request-handler-factory.d.ts +0 -81
  197. package/dist/types/utils/request-handler-factory.d.ts.map +0 -1
  198. package/examples/azure-basic.ts +0 -206
  199. package/examples/azure-responses-basic.ts +0 -233
  200. package/examples/azure-responses-streaming.ts +0 -255
  201. package/examples/azure-streaming.ts +0 -209
  202. package/examples/openai-basic.ts +0 -147
  203. package/examples/openai-function-calling.ts +0 -259
  204. package/examples/openai-responses-basic.ts +0 -212
  205. package/examples/openai-responses-streaming.ts +0 -232
  206. package/examples/openai-streaming.ts +0 -172
  207. package/examples/openai-vision.ts +0 -289
  208. package/src/core/config/azure-config.ts +0 -72
  209. package/src/core/config/index.ts +0 -23
  210. package/src/core/config/loader.ts +0 -66
  211. package/src/core/config/manager.ts +0 -94
  212. package/src/core/config/validator.ts +0 -89
  213. package/src/core/providers/detector.ts +0 -159
  214. package/src/core/providers/index.ts +0 -16
  215. package/src/core/tracking/api-client.ts +0 -78
  216. package/src/core/tracking/index.ts +0 -21
  217. package/src/core/tracking/payload-builder.ts +0 -132
  218. package/src/core/tracking/usage-tracker.ts +0 -189
  219. package/src/core/wrapper/index.ts +0 -9
  220. package/src/core/wrapper/instance-patcher.ts +0 -288
  221. package/src/core/wrapper/request-handler.ts +0 -423
  222. package/src/core/wrapper/stream-wrapper.ts +0 -100
  223. package/src/index.ts +0 -336
  224. package/src/types/function-parameters.ts +0 -251
  225. package/src/types/index.ts +0 -313
  226. package/src/types/openai-augmentation.ts +0 -233
  227. package/src/types/responses-api.ts +0 -308
  228. package/src/utils/azure-model-resolver.ts +0 -220
  229. package/src/utils/constants.ts +0 -21
  230. package/src/utils/error-handler.ts +0 -251
  231. package/src/utils/metadata-builder.ts +0 -219
  232. package/src/utils/provider-detection.ts +0 -257
  233. package/src/utils/request-handler-factory.ts +0 -285
  234. package/src/utils/stop-reason-mapper.ts +0 -74
  235. package/src/utils/type-guards.ts +0 -202
  236. package/src/utils/url-builder.ts +0 -68
@@ -1,72 +0,0 @@
1
- /**
2
- * Azure Configuration Module
3
- *
4
- * Handles Azure-specific configuration logic.
5
- * Extracted from provider.ts for better separation of concerns.
6
- */
7
-
8
- import { AzureConfig } from '../../types/index.js';
9
- import { OpenAIClientInstance } from '../../types/function-parameters.js';
10
- import { getLogger } from './manager.js';
11
-
12
- // Global logger
13
- const logger = getLogger();
14
-
15
- /**
16
- * Gather Azure configuration from client and environment
17
- *
18
- * @param client - OpenAI/AzureOpenAI client instance
19
- * @returns AzureConfig object
20
- */
21
- export function gatherAzureConfig(client: OpenAIClientInstance): AzureConfig {
22
- const config: AzureConfig = {};
23
- try {
24
- // Extract from client baseURL if available
25
- if (client?.baseURL) {
26
- const baseUrl =
27
- typeof client.baseURL === 'string' ? client.baseURL : client.baseURL?.toString();
28
- config.endpoint = baseUrl;
29
- }
30
-
31
- // Extract from environment variables
32
- if (process.env.AZURE_OPENAI_ENDPOINT) {
33
- config.endpoint = process.env.AZURE_OPENAI_ENDPOINT;
34
- }
35
-
36
- if (process.env.AZURE_OPENAI_DEPLOYMENT) {
37
- config.deployment = process.env.AZURE_OPENAI_DEPLOYMENT;
38
- }
39
-
40
- if (process.env.AZURE_OPENAI_API_VERSION) {
41
- config.apiVersion = process.env.AZURE_OPENAI_API_VERSION;
42
- } else {
43
- // Default to preferred API version from Python learnings
44
- config.apiVersion = '2024-12-01-preview';
45
- }
46
-
47
- if (process.env.AZURE_OPENAI_API_KEY) {
48
- config.apiKey = process.env.AZURE_OPENAI_API_KEY;
49
- }
50
-
51
- if (process.env.AZURE_OPENAI_TENANT_ID) {
52
- config.tenantId = process.env.AZURE_OPENAI_TENANT_ID;
53
- }
54
-
55
- if (process.env.AZURE_OPENAI_RESOURCE_GROUP) {
56
- config.resourceGroup = process.env.AZURE_OPENAI_RESOURCE_GROUP;
57
- }
58
-
59
- logger.debug('Azure configuration gathered', {
60
- hasEndpoint: !!config.endpoint,
61
- hasDeployment: !!config.deployment,
62
- hasApiKey: !!config.apiKey,
63
- apiVersion: config.apiVersion,
64
- });
65
- } catch (error) {
66
- logger.warn('Error gathering Azure configuration', {
67
- error: error instanceof Error ? error.message : String(error),
68
- });
69
- }
70
-
71
- return config;
72
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Configuration module - Main exports
3
- *
4
- * This module provides a clean interface for configuration management,
5
- * separating concerns into focused sub-modules.
6
- */
7
-
8
- // Re-export all configuration functionality
9
- export { loadConfigFromEnv, loadAzureConfigFromEnv, hasAzureConfigInEnv } from './loader.js';
10
-
11
- export { validateConfig, validateAzureConfig } from './validator.js';
12
-
13
- export {
14
- getConfig,
15
- setConfig,
16
- getLogger,
17
- setLogger,
18
- initializeConfig,
19
- defaultLogger,
20
- } from './manager.js';
21
-
22
- // Export Azure-specific configuration
23
- export * from './azure-config.js';
@@ -1,66 +0,0 @@
1
- /**
2
- * Configuration Loader Module
3
- *
4
- * Handles loading configuration from environment variables.
5
- * Separated from validation and management for single responsibility.
6
- */
7
-
8
- import { ReveniumConfig, AzureConfig } from '../../types/index.js';
9
-
10
- /**
11
- * Default Revenium base URL for consistency with other middleware
12
- */
13
- const DEFAULT_REVENIUM_BASE_URL = 'https://api.revenium.io';
14
-
15
- /**
16
- * Load configuration from environment variables
17
- */
18
- export function loadConfigFromEnv(): ReveniumConfig | null {
19
- const reveniumApiKey = process.env.REVENIUM_METERING_API_KEY || process.env.REVENIUM_API_KEY;
20
- const reveniumBaseUrl =
21
- process.env.REVENIUM_METERING_BASE_URL ||
22
- process.env.REVENIUM_BASE_URL ||
23
- DEFAULT_REVENIUM_BASE_URL;
24
- const openaiApiKey = process.env.OPENAI_API_KEY;
25
-
26
- if (!reveniumApiKey) return null;
27
- return {
28
- reveniumApiKey,
29
- reveniumBaseUrl,
30
- openaiApiKey,
31
- };
32
- }
33
-
34
- /**
35
- * Load Azure configuration from environment variables
36
- */
37
- export function loadAzureConfigFromEnv(): AzureConfig | null {
38
- const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
39
- const deployment = process.env.AZURE_OPENAI_DEPLOYMENT;
40
- const apiVersion = process.env.AZURE_OPENAI_API_VERSION;
41
- const apiKey = process.env.AZURE_OPENAI_API_KEY;
42
- const tenantId = process.env.AZURE_OPENAI_TENANT_ID;
43
- const resourceGroup = process.env.AZURE_OPENAI_RESOURCE_GROUP;
44
-
45
- // Return null if no Azure config is present
46
- if (!endpoint && !deployment && !apiKey) return null;
47
- return {
48
- endpoint,
49
- deployment,
50
- apiVersion: apiVersion || '2024-12-01-preview', // Default from Python learnings
51
- apiKey,
52
- tenantId,
53
- resourceGroup,
54
- };
55
- }
56
-
57
- /**
58
- * Check if Azure configuration is available in environment
59
- */
60
- export function hasAzureConfigInEnv(): boolean {
61
- return !!(
62
- process.env.AZURE_OPENAI_ENDPOINT ||
63
- process.env.AZURE_OPENAI_DEPLOYMENT ||
64
- process.env.AZURE_OPENAI_API_KEY
65
- );
66
- }
@@ -1,94 +0,0 @@
1
- /**
2
- * Configuration Manager Module
3
- *
4
- * Handles global configuration state management and logging.
5
- * Separated from loading and validation for single responsibility.
6
- */
7
-
8
- import { ReveniumConfig, Logger } from '../../types/index.js';
9
- import { loadConfigFromEnv, hasAzureConfigInEnv } from './loader.js';
10
- import { validateConfig } from './validator.js';
11
-
12
- /**
13
- * Default console logger implementation
14
- */
15
- export const defaultLogger: Logger = {
16
- debug: (message: string, ...args: unknown[]) => {
17
- if (process.env.REVENIUM_DEBUG === 'true') {
18
- console.debug(`[Revenium Debug] ${message}`, ...args);
19
- }
20
- },
21
- info: (message: string, ...args: unknown[]) => {
22
- console.info(`[Revenium] ${message}`, ...args);
23
- },
24
- warn: (message: string, ...args: unknown[]) => {
25
- console.warn(`[Revenium Warning] ${message}`, ...args);
26
- },
27
- error: (message: string, ...args: unknown[]) => {
28
- console.error(`[Revenium Error] ${message}`, ...args);
29
- },
30
- };
31
-
32
- /**
33
- * Global configuration instance
34
- */
35
- let globalConfig: ReveniumConfig | null = null;
36
- let globalLogger: Logger = defaultLogger;
37
-
38
- /**
39
- * Get the current global configuration
40
- */
41
- export function getConfig(): ReveniumConfig | null {
42
- return globalConfig;
43
- }
44
-
45
- /**
46
- * Set the global configuration
47
- */
48
- export function setConfig(config: ReveniumConfig): void {
49
- validateConfig(config);
50
- globalConfig = config;
51
- globalLogger.debug('Revenium configuration updated', {
52
- baseUrl: config.reveniumBaseUrl,
53
- hasApiKey: !!config.reveniumApiKey,
54
- hasOpenAIKey: !!config.openaiApiKey,
55
- });
56
- }
57
-
58
- /**
59
- * Get the current logger
60
- */
61
- export function getLogger(): Logger {
62
- return globalLogger;
63
- }
64
-
65
- /**
66
- * Set a custom logger
67
- */
68
- export function setLogger(logger: Logger): void {
69
- globalLogger = logger;
70
- }
71
-
72
- /**
73
- * Initialize configuration from environment variables
74
- */
75
- export function initializeConfig(): boolean {
76
- const envConfig = loadConfigFromEnv();
77
- if (envConfig) {
78
- try {
79
- setConfig(envConfig);
80
- globalLogger.debug('Revenium middleware initialized from environment variables');
81
-
82
- // Log Azure config availability for debugging
83
- if (hasAzureConfigInEnv()) {
84
- globalLogger.debug('Azure OpenAI configuration detected in environment');
85
- }
86
-
87
- return true;
88
- } catch (error) {
89
- globalLogger.error('Failed to initialize Revenium configuration:', error);
90
- return false;
91
- }
92
- }
93
- return false;
94
- }
@@ -1,89 +0,0 @@
1
- /**
2
- * Configuration Validator Module
3
- *
4
- * Handles validation of configuration objects.
5
- * Separated from loading and management for single responsibility.
6
- */
7
-
8
- import { ReveniumConfig, AzureConfig } from '../../types/index.js';
9
-
10
- /**
11
- * Validate Revenium configuration
12
- */
13
- export function validateConfig(config: ReveniumConfig): void {
14
- if (!config.reveniumApiKey) {
15
- throw new Error(
16
- 'Revenium API key is required. Set REVENIUM_METERING_API_KEY environment variable or provide reveniumApiKey in config.'
17
- );
18
- }
19
-
20
- if (!config.reveniumApiKey.startsWith('hak_')) {
21
- throw new Error('Invalid Revenium API key format. Revenium API keys should start with "hak_"');
22
- }
23
-
24
- if (!config.reveniumBaseUrl) {
25
- throw new Error(
26
- 'Revenium base URL is missing. This should not happen as a default URL should be provided.'
27
- );
28
- }
29
-
30
- // Validate URL format
31
- try {
32
- new URL(config.reveniumBaseUrl);
33
- } catch (error) {
34
- throw new Error(`Invalid Revenium base URL format: ${config.reveniumBaseUrl}`);
35
- }
36
- }
37
-
38
- /**
39
- * Validate Azure configuration completeness
40
- *
41
- * @param config - Azure configuration to validate
42
- * @returns validation result with missing fields
43
- */
44
- export function validateAzureConfig(config: AzureConfig): {
45
- isValid: boolean;
46
- missingFields: string[];
47
- warnings: string[];
48
- } {
49
- const missingFields: string[] = [];
50
- const warnings: string[] = [];
51
-
52
- // Required fields for basic Azure OpenAI operation
53
- if (!config.endpoint) {
54
- missingFields.push('endpoint');
55
- }
56
-
57
- if (!config.apiKey) {
58
- missingFields.push('apiKey');
59
- }
60
-
61
- // Optional but recommended fields
62
- if (!config.deployment) {
63
- warnings.push('deployment name not specified - may need to be included in model parameter');
64
- }
65
-
66
- if (!config.apiVersion) {
67
- warnings.push('API version not specified - using default 2024-12-01-preview');
68
- }
69
-
70
- // Validate endpoint format
71
- if (config.endpoint) {
72
- try {
73
- new URL(config.endpoint);
74
- if (!config.endpoint.toLowerCase().includes('azure')) {
75
- warnings.push(
76
- 'endpoint does not contain "azure" - please verify this is an Azure OpenAI endpoint'
77
- );
78
- }
79
- } catch (error) {
80
- missingFields.push('valid endpoint URL');
81
- }
82
- }
83
-
84
- return {
85
- isValid: missingFields.length === 0,
86
- missingFields,
87
- warnings,
88
- };
89
- }
@@ -1,159 +0,0 @@
1
- /**
2
- * Provider Detection Module
3
- *
4
- * Handles detection of AI providers (OpenAI vs Azure OpenAI).
5
- * Extracted from provider.ts for better organization.
6
- */
7
-
8
- import { Provider, ProviderInfo, AzureConfig } from '../../types/index.js';
9
- import { OpenAIClientInstance } from '../../types/function-parameters.js';
10
- import { isOpenAIClientInstance } from '../../utils/type-guards.js';
11
- import { createProviderInfo, validateProviderInfo } from '../../utils/provider-detection.js';
12
- import { getLogger } from '../config/index.js';
13
-
14
- // Global logger
15
- const logger = getLogger();
16
-
17
- /**
18
- * Detect Azure OpenAI provider from client instance
19
- *
20
- * @param client - OpenAI or AzureOpenAI client instance
21
- * @returns ProviderInfo with detection results
22
- */
23
- export function detectProvider(client: OpenAIClientInstance): ProviderInfo {
24
- // Validate client instance
25
- if (!isOpenAIClientInstance(client)) {
26
- logger.warn('Invalid OpenAI client instance provided to detectProvider');
27
- return {
28
- provider: Provider.OPENAI,
29
- isAzure: false,
30
- azureConfig: undefined,
31
- };
32
- }
33
-
34
- try {
35
- // Use strategy pattern for clean provider detection
36
- const providerInfo = createProviderInfo(client, logger);
37
-
38
- // Validate the result
39
- const validation = validateProviderInfo(providerInfo);
40
- if (validation.warnings.length > 0) {
41
- logger.warn('Provider detection completed with warnings', {
42
- warnings: validation.warnings,
43
- });
44
- }
45
-
46
- // Log final result
47
- if (providerInfo.isAzure) {
48
- logger.info('Azure OpenAI provider detected', {
49
- provider: providerInfo.provider,
50
- hasAzureConfig: !!providerInfo.azureConfig,
51
- endpoint: providerInfo.azureConfig?.endpoint ? '[REDACTED]' : undefined,
52
- });
53
- } else {
54
- logger.debug('Standard OpenAI provider detected');
55
- }
56
-
57
- return providerInfo;
58
- } catch (error) {
59
- logger.warn('Error during provider detection, defaulting to OpenAI', {
60
- error: error instanceof Error ? error.message : String(error),
61
- });
62
-
63
- // Default to OpenAI on any error
64
- return {
65
- provider: Provider.OPENAI,
66
- isAzure: false,
67
- azureConfig: undefined,
68
- };
69
- }
70
- }
71
-
72
- /**
73
- * Check if the current environment has Azure configuration
74
- * This is a lightweight check for lazy loading decisions
75
- *
76
- * @returns boolean indicating if Azure config is present
77
- */
78
- export function hasAzureConfig(): boolean {
79
- return !!(
80
- process.env.AZURE_OPENAI_ENDPOINT ||
81
- process.env.AZURE_OPENAI_DEPLOYMENT ||
82
- process.env.AZURE_OPENAI_API_KEY
83
- );
84
- }
85
-
86
- /**
87
- * Validate Azure configuration completeness
88
- *
89
- * @param config - Azure configuration to validate
90
- * @returns validation result with missing fields
91
- */
92
- export function validateAzureConfig(config: AzureConfig): {
93
- isValid: boolean;
94
- missingFields: string[];
95
- warnings: string[];
96
- } {
97
- const missingFields: string[] = [];
98
- const warnings: string[] = [];
99
-
100
- // Required fields for basic Azure OpenAI operation
101
- if (!config.endpoint) {
102
- missingFields.push('endpoint');
103
- }
104
-
105
- if (!config.apiKey) {
106
- missingFields.push('apiKey');
107
- }
108
-
109
- // Optional but recommended fields
110
- if (!config.deployment) {
111
- warnings.push('deployment name not specified - may need to be included in model parameter');
112
- }
113
-
114
- if (!config.apiVersion) {
115
- warnings.push('API version not specified - using default 2024-12-01-preview');
116
- }
117
-
118
- // Validate endpoint format
119
- if (config.endpoint) {
120
- try {
121
- new URL(config.endpoint);
122
- if (!config.endpoint.toLowerCase().includes('azure')) {
123
- warnings.push(
124
- 'endpoint does not contain "azure" - please verify this is an Azure OpenAI endpoint'
125
- );
126
- }
127
- } catch (error) {
128
- missingFields.push('valid endpoint URL');
129
- }
130
- }
131
-
132
- return {
133
- isValid: missingFields.length === 0,
134
- missingFields,
135
- warnings,
136
- };
137
- }
138
-
139
- /**
140
- * Get provider metadata for Revenium payload
141
- *
142
- * @param providerInfo - Provider detection result
143
- * @returns metadata object for Revenium
144
- */
145
- export function getProviderMetadata(providerInfo: ProviderInfo): {
146
- provider: string;
147
- modelSource: string;
148
- } {
149
- if (providerInfo.isAzure) {
150
- return {
151
- provider: 'Azure',
152
- modelSource: 'OPENAI',
153
- };
154
- }
155
- return {
156
- provider: 'OPENAI',
157
- modelSource: 'OPENAI',
158
- };
159
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * Providers module - Main exports
3
- *
4
- * This module provides a clean interface for provider detection and management,
5
- * separating concerns into focused sub-modules.
6
- */
7
-
8
- // Re-export all provider functionality
9
- export {
10
- detectProvider,
11
- hasAzureConfig,
12
- validateAzureConfig,
13
- getProviderMetadata,
14
- } from './detector.js';
15
-
16
- export { gatherAzureConfig } from '../config/azure-config.js';
@@ -1,78 +0,0 @@
1
- /**
2
- * Revenium API Client Module
3
- *
4
- * Handles HTTP communication with the Revenium API.
5
- * Extracted from tracking.ts for single responsibility.
6
- */
7
-
8
- import { ReveniumPayload } from '../../types/index.js';
9
- import { getConfig, getLogger } from '../config/index.js';
10
- import { buildReveniumUrl } from '../../utils/url-builder.js';
11
-
12
- // Global logger
13
- const logger = getLogger();
14
-
15
- /**
16
- * Send payload to Revenium API
17
- *
18
- * This is the shared HTTP function that eliminates all duplication
19
- * between chat completions and embeddings tracking.
20
- *
21
- * @param payload - The payload to send to Revenium
22
- */
23
- export async function sendToRevenium(payload: ReveniumPayload): Promise<void> {
24
- const config = getConfig();
25
- if (!config) return logger.warn('Revenium configuration not found, skipping tracking');
26
-
27
- // Use the new URL builder utility instead of nested conditionals
28
- const url = buildReveniumUrl(
29
- config.reveniumBaseUrl || 'https://api.revenium.io',
30
- '/ai/completions'
31
- );
32
-
33
- logger.debug('Sending Revenium API request', {
34
- url,
35
- operationType: payload.operationType,
36
- transactionId: payload.transactionId,
37
- model: payload.model,
38
- totalTokens: payload.totalTokenCount,
39
- });
40
-
41
- const response = await fetch(url, {
42
- method: 'POST',
43
- headers: {
44
- 'Content-Type': 'application/json',
45
- Accept: 'application/json',
46
- 'x-api-key': config.reveniumApiKey,
47
- },
48
- body: JSON.stringify(payload),
49
- });
50
-
51
- logger.debug('Revenium API response', {
52
- status: response.status,
53
- statusText: response.statusText,
54
- transactionId: payload.transactionId,
55
- operationType: payload.operationType,
56
- });
57
-
58
- if (!response.ok) {
59
- const responseText = await response.text();
60
- logger.error('Revenium API error response', {
61
- status: response.status,
62
- statusText: response.statusText,
63
- body: responseText,
64
- transactionId: payload.transactionId,
65
- operationType: payload.operationType,
66
- });
67
- throw new Error(
68
- `Revenium API error: ${response.status} ${response.statusText} - ${responseText}`
69
- );
70
- }
71
-
72
- const responseBody = await response.text();
73
- logger.debug('Revenium tracking successful', {
74
- transactionId: payload.transactionId,
75
- operationType: payload.operationType,
76
- response: responseBody,
77
- });
78
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * Tracking module - Main exports
3
- *
4
- * This module provides a clean interface for usage tracking,
5
- * separating concerns into focused sub-modules.
6
- */
7
-
8
- // Re-export all tracking functionality
9
- export { sendToRevenium } from './api-client.js';
10
-
11
- export { buildPayload } from './payload-builder.js';
12
-
13
- export {
14
- sendReveniumMetrics,
15
- sendReveniumEmbeddingsMetrics,
16
- trackUsageAsync,
17
- trackEmbeddingsUsageAsync,
18
- } from './usage-tracker.js';
19
-
20
- // Export utility functions
21
- export { mapStopReason } from '../../utils/stop-reason-mapper.js';