gavio 0.1.0 → 0.3.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.
Files changed (160) hide show
  1. package/dist/cjs/config.js +106 -0
  2. package/dist/cjs/errors.js +29 -1
  3. package/dist/cjs/gateway.js +88 -0
  4. package/dist/cjs/index.js +4 -2
  5. package/dist/cjs/interceptors/audit/index.js +4 -1
  6. package/dist/cjs/interceptors/audit/interceptor.js +11 -0
  7. package/dist/cjs/interceptors/audit/record.js +17 -3
  8. package/dist/cjs/interceptors/audit/trace.js +43 -0
  9. package/dist/cjs/interceptors/cache/embedding.js +53 -0
  10. package/dist/cjs/interceptors/cache/index.js +9 -5
  11. package/dist/cjs/interceptors/cache/interceptor.js +80 -0
  12. package/dist/cjs/interceptors/cache/vector.js +35 -0
  13. package/dist/cjs/interceptors/governance/budget.js +45 -0
  14. package/dist/cjs/interceptors/governance/index.js +10 -0
  15. package/dist/cjs/interceptors/governance/model-policy.js +18 -0
  16. package/dist/cjs/interceptors/governance/rate-limit.js +46 -0
  17. package/dist/cjs/interceptors/guardrails/index.js +11 -0
  18. package/dist/cjs/interceptors/guardrails/interceptor.js +40 -0
  19. package/dist/cjs/interceptors/guardrails/validator.js +8 -0
  20. package/dist/cjs/interceptors/guardrails/validators/regex.js +32 -0
  21. package/dist/cjs/interceptors/guardrails/validators/schema.js +63 -0
  22. package/dist/cjs/interceptors/injection.js +62 -0
  23. package/dist/cjs/interceptors/metrics/index.js +9 -0
  24. package/dist/cjs/interceptors/metrics/interceptor.js +37 -0
  25. package/dist/cjs/interceptors/metrics/registry.js +0 -0
  26. package/dist/cjs/interceptors/quality/index.js +7 -0
  27. package/dist/cjs/interceptors/quality/risk.js +49 -0
  28. package/dist/cjs/interceptors/reliability/circuit-breaker.js +82 -0
  29. package/dist/cjs/interceptors/reliability/index.js +8 -1
  30. package/dist/cjs/interceptors/reliability/load-balancer.js +38 -0
  31. package/dist/cjs/interceptors/reliability/stream-buffer.js +28 -0
  32. package/dist/cjs/pricing.js +5 -1
  33. package/dist/cjs/providers/azure-openai.js +56 -0
  34. package/dist/cjs/providers/base.js +9 -0
  35. package/dist/cjs/providers/gemini.js +73 -0
  36. package/dist/cjs/providers/index.js +22 -6
  37. package/dist/cjs/providers/ollama.js +41 -0
  38. package/dist/cjs/request.js +3 -0
  39. package/dist/cjs/shim/openai.js +57 -0
  40. package/dist/cjs/types.js +53 -1
  41. package/dist/esm/config.d.ts +12 -0
  42. package/dist/esm/config.js +102 -0
  43. package/dist/esm/errors.d.ts +17 -0
  44. package/dist/esm/errors.js +24 -0
  45. package/dist/esm/gateway.d.ts +18 -1
  46. package/dist/esm/gateway.js +55 -0
  47. package/dist/esm/index.d.ts +3 -3
  48. package/dist/esm/index.js +2 -2
  49. package/dist/esm/interceptors/audit/index.d.ts +2 -0
  50. package/dist/esm/interceptors/audit/index.js +1 -0
  51. package/dist/esm/interceptors/audit/interceptor.d.ts +2 -0
  52. package/dist/esm/interceptors/audit/interceptor.js +11 -0
  53. package/dist/esm/interceptors/audit/record.d.ts +4 -2
  54. package/dist/esm/interceptors/audit/record.js +18 -4
  55. package/dist/esm/interceptors/audit/trace.d.ts +19 -0
  56. package/dist/esm/interceptors/audit/trace.js +39 -0
  57. package/dist/esm/interceptors/cache/embedding.d.ts +14 -0
  58. package/dist/esm/interceptors/cache/embedding.js +49 -0
  59. package/dist/esm/interceptors/cache/index.d.ts +7 -4
  60. package/dist/esm/interceptors/cache/index.js +4 -4
  61. package/dist/esm/interceptors/cache/interceptor.d.ts +19 -0
  62. package/dist/esm/interceptors/cache/interceptor.js +77 -0
  63. package/dist/esm/interceptors/cache/vector.d.ts +9 -0
  64. package/dist/esm/interceptors/cache/vector.js +32 -0
  65. package/dist/esm/interceptors/governance/budget.d.ts +11 -0
  66. package/dist/esm/interceptors/governance/budget.js +42 -0
  67. package/dist/esm/interceptors/governance/index.d.ts +7 -0
  68. package/dist/esm/interceptors/governance/index.js +4 -0
  69. package/dist/esm/interceptors/governance/model-policy.d.ts +8 -0
  70. package/dist/esm/interceptors/governance/model-policy.js +15 -0
  71. package/dist/esm/interceptors/governance/rate-limit.d.ts +9 -0
  72. package/dist/esm/interceptors/governance/rate-limit.js +43 -0
  73. package/dist/esm/interceptors/guardrails/index.d.ts +6 -0
  74. package/dist/esm/interceptors/guardrails/index.js +4 -0
  75. package/dist/esm/interceptors/guardrails/interceptor.d.ts +15 -0
  76. package/dist/esm/interceptors/guardrails/interceptor.js +37 -0
  77. package/dist/esm/interceptors/guardrails/validator.d.ts +11 -0
  78. package/dist/esm/interceptors/guardrails/validator.js +3 -0
  79. package/dist/esm/interceptors/guardrails/validators/regex.d.ts +6 -0
  80. package/dist/esm/interceptors/guardrails/validators/regex.js +28 -0
  81. package/dist/esm/interceptors/guardrails/validators/schema.d.ts +5 -0
  82. package/dist/esm/interceptors/guardrails/validators/schema.js +60 -0
  83. package/dist/esm/interceptors/injection.d.ts +17 -0
  84. package/dist/esm/interceptors/injection.js +59 -0
  85. package/dist/esm/interceptors/metrics/index.d.ts +5 -0
  86. package/dist/esm/interceptors/metrics/index.js +3 -0
  87. package/dist/esm/interceptors/metrics/interceptor.d.ts +22 -0
  88. package/dist/esm/interceptors/metrics/interceptor.js +33 -0
  89. package/dist/esm/interceptors/metrics/registry.d.ts +31 -0
  90. package/dist/esm/interceptors/metrics/registry.js +0 -0
  91. package/dist/esm/interceptors/quality/index.d.ts +3 -0
  92. package/dist/esm/interceptors/quality/index.js +2 -0
  93. package/dist/esm/interceptors/quality/risk.d.ts +32 -0
  94. package/dist/esm/interceptors/quality/risk.js +44 -0
  95. package/dist/esm/interceptors/reliability/circuit-breaker.d.ts +15 -0
  96. package/dist/esm/interceptors/reliability/circuit-breaker.js +78 -0
  97. package/dist/esm/interceptors/reliability/index.d.ts +5 -0
  98. package/dist/esm/interceptors/reliability/index.js +3 -0
  99. package/dist/esm/interceptors/reliability/load-balancer.d.ts +8 -0
  100. package/dist/esm/interceptors/reliability/load-balancer.js +35 -0
  101. package/dist/esm/interceptors/reliability/stream-buffer.d.ts +18 -0
  102. package/dist/esm/interceptors/reliability/stream-buffer.js +24 -0
  103. package/dist/esm/pricing.js +5 -1
  104. package/dist/esm/providers/azure-openai.d.ts +28 -0
  105. package/dist/esm/providers/azure-openai.js +53 -0
  106. package/dist/esm/providers/base.d.ts +7 -0
  107. package/dist/esm/providers/base.js +9 -1
  108. package/dist/esm/providers/gemini.d.ts +36 -0
  109. package/dist/esm/providers/gemini.js +69 -0
  110. package/dist/esm/providers/index.d.ts +7 -1
  111. package/dist/esm/providers/index.js +18 -5
  112. package/dist/esm/providers/ollama.d.ts +21 -0
  113. package/dist/esm/providers/ollama.js +38 -0
  114. package/dist/esm/request.d.ts +4 -1
  115. package/dist/esm/request.js +4 -1
  116. package/dist/esm/shim/openai.d.ts +56 -0
  117. package/dist/esm/shim/openai.js +53 -0
  118. package/dist/esm/types.d.ts +54 -0
  119. package/dist/esm/types.js +50 -0
  120. package/package.json +41 -2
  121. package/src/config.ts +125 -0
  122. package/src/errors.ts +28 -0
  123. package/src/gateway.ts +62 -1
  124. package/src/index.ts +4 -2
  125. package/src/interceptors/audit/index.ts +2 -0
  126. package/src/interceptors/audit/interceptor.ts +13 -0
  127. package/src/interceptors/audit/record.ts +18 -4
  128. package/src/interceptors/audit/trace.ts +47 -0
  129. package/src/interceptors/cache/embedding.ts +53 -0
  130. package/src/interceptors/cache/index.ts +7 -4
  131. package/src/interceptors/cache/interceptor.ts +111 -0
  132. package/src/interceptors/cache/vector.ts +45 -0
  133. package/src/interceptors/governance/budget.ts +59 -0
  134. package/src/interceptors/governance/index.ts +8 -0
  135. package/src/interceptors/governance/model-policy.ts +25 -0
  136. package/src/interceptors/governance/rate-limit.ts +63 -0
  137. package/src/interceptors/guardrails/index.ts +7 -0
  138. package/src/interceptors/guardrails/interceptor.ts +56 -0
  139. package/src/interceptors/guardrails/validator.ts +14 -0
  140. package/src/interceptors/guardrails/validators/regex.ts +29 -0
  141. package/src/interceptors/guardrails/validators/schema.ts +62 -0
  142. package/src/interceptors/injection.ts +72 -0
  143. package/src/interceptors/metrics/index.ts +6 -0
  144. package/src/interceptors/metrics/interceptor.ts +46 -0
  145. package/src/interceptors/metrics/registry.ts +0 -0
  146. package/src/interceptors/quality/index.ts +4 -0
  147. package/src/interceptors/quality/risk.ts +64 -0
  148. package/src/interceptors/reliability/circuit-breaker.ts +102 -0
  149. package/src/interceptors/reliability/index.ts +5 -0
  150. package/src/interceptors/reliability/load-balancer.ts +56 -0
  151. package/src/interceptors/reliability/stream-buffer.ts +27 -0
  152. package/src/pricing.ts +5 -1
  153. package/src/providers/azure-openai.ts +77 -0
  154. package/src/providers/base.ts +21 -1
  155. package/src/providers/gemini.ts +95 -0
  156. package/src/providers/index.ts +21 -5
  157. package/src/providers/ollama.ts +61 -0
  158. package/src/request.ts +6 -2
  159. package/src/shim/openai.ts +76 -0
  160. package/src/types.ts +77 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * OpenAI drop-in shim (F-DX-04) — point existing OpenAI SDK code at Gavio.
3
+ *
4
+ * import { Gateway } from 'gavio'
5
+ * import { GavioOpenAI } from 'gavio/shim/openai'
6
+ *
7
+ * const client = new GavioOpenAI(new Gateway({ provider: 'openai', model: 'gpt-4o' }))
8
+ * const resp = await client.chat.completions.create({
9
+ * model: 'gpt-4o', messages: [{ role: 'user', content: 'hi' }],
10
+ * })
11
+ * console.log(resp.choices[0].message.content)
12
+ */
13
+
14
+ import type { Gateway } from '../gateway.js'
15
+ import type { GavioResponse } from '../response.js'
16
+ import type { Message } from '../types.js'
17
+
18
+ export interface ChatCompletion {
19
+ id: string
20
+ object: 'chat.completion'
21
+ model: string
22
+ choices: { index: number; message: { role: string; content: string }; finish_reason: string }[]
23
+ usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }
24
+ gavio: { costUsd: number; cacheHit: boolean; interceptorsFired: string[] }
25
+ }
26
+
27
+ export interface CreateParams {
28
+ messages: Message[]
29
+ model?: string
30
+ temperature?: number
31
+ // eslint-disable-next-line @typescript-eslint/naming-convention
32
+ max_tokens?: number
33
+ }
34
+
35
+ function toCompletion(resp: GavioResponse): ChatCompletion {
36
+ return {
37
+ id: resp.traceId,
38
+ object: 'chat.completion',
39
+ model: resp.modelVersion || resp.model,
40
+ choices: [
41
+ { index: 0, message: { role: 'assistant', content: resp.content }, finish_reason: 'stop' },
42
+ ],
43
+ usage: {
44
+ prompt_tokens: resp.usage.promptTokens,
45
+ completion_tokens: resp.usage.completionTokens,
46
+ total_tokens: resp.usage.totalTokens,
47
+ },
48
+ gavio: {
49
+ costUsd: resp.costUsd,
50
+ cacheHit: resp.cacheHit,
51
+ interceptorsFired: resp.interceptorsFired,
52
+ },
53
+ }
54
+ }
55
+
56
+ class Completions {
57
+ constructor(private readonly gw: Gateway) {}
58
+
59
+ async create(params: CreateParams): Promise<ChatCompletion> {
60
+ const resp = await this.gw.complete({
61
+ messages: params.messages,
62
+ model: params.model,
63
+ options: { temperature: params.temperature ?? 0.7, maxTokens: params.max_tokens ?? 1024 },
64
+ })
65
+ return toCompletion(resp)
66
+ }
67
+ }
68
+
69
+ /** OpenAI-client-shaped facade over a Gavio Gateway. */
70
+ export class GavioOpenAI {
71
+ readonly chat: { completions: Completions }
72
+
73
+ constructor(gateway: Gateway) {
74
+ this.chat = { completions: new Completions(gateway) }
75
+ }
76
+ }
package/src/types.ts CHANGED
@@ -81,3 +81,80 @@ export class TokenUsage {
81
81
  }
82
82
  }
83
83
  }
84
+
85
+ export interface RagChunkInit {
86
+ source: string
87
+ chunkId?: string | null
88
+ score?: number | null
89
+ }
90
+
91
+ /**
92
+ * A single retrieved source that contributed to a prompt. Carries a *reference*
93
+ * to the source — never the retrieved text — so prompt lineage stays within the
94
+ * audit record's metadata-only contract.
95
+ */
96
+ export class RagChunk {
97
+ readonly source: string
98
+ readonly chunkId: string | null
99
+ readonly score: number | null
100
+
101
+ constructor(init: RagChunkInit) {
102
+ this.source = init.source
103
+ this.chunkId = init.chunkId ?? null
104
+ this.score = init.score ?? null
105
+ }
106
+
107
+ toJSON(): { source: string; chunkId: string | null; score: number | null } {
108
+ return { source: this.source, chunkId: this.chunkId, score: this.score }
109
+ }
110
+ }
111
+
112
+ export interface PromptLineageInit {
113
+ templateId?: string | null
114
+ templateVersion?: string | null
115
+ variables?: Record<string, unknown>
116
+ ragChunks?: Array<RagChunk | RagChunkInit>
117
+ }
118
+
119
+ /**
120
+ * Provenance for a rendered prompt (F-OBS-04): the template, the variable
121
+ * bindings interpolated into it, and the RAG chunk sources retrieved for it.
122
+ *
123
+ * Attached to a GavioRequest by the caller and copied into the AuditRecord so
124
+ * any prompt can be reconstructed and debugged. RAG chunk text is never stored
125
+ * — only source references (see {@link RagChunk}).
126
+ */
127
+ export class PromptLineage {
128
+ readonly templateId: string | null
129
+ readonly templateVersion: string | null
130
+ readonly variables: Record<string, unknown>
131
+ readonly ragChunks: RagChunk[]
132
+
133
+ constructor(init: PromptLineageInit = {}) {
134
+ this.templateId = init.templateId ?? null
135
+ this.templateVersion = init.templateVersion ?? null
136
+ this.variables = init.variables ?? {}
137
+ this.ragChunks = (init.ragChunks ?? []).map((c) =>
138
+ c instanceof RagChunk ? c : new RagChunk(c),
139
+ )
140
+ }
141
+
142
+ /** Coerce a PromptLineage instance or plain init object into a PromptLineage. */
143
+ static from(value: PromptLineage | PromptLineageInit): PromptLineage {
144
+ return value instanceof PromptLineage ? value : new PromptLineage(value)
145
+ }
146
+
147
+ toJSON(): {
148
+ templateId: string | null
149
+ templateVersion: string | null
150
+ variables: Record<string, unknown>
151
+ ragChunks: Array<{ source: string; chunkId: string | null; score: number | null }>
152
+ } {
153
+ return {
154
+ templateId: this.templateId,
155
+ templateVersion: this.templateVersion,
156
+ variables: this.variables,
157
+ ragChunks: this.ragChunks.map((c) => c.toJSON()),
158
+ }
159
+ }
160
+ }