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.
- package/dist/cjs/config.js +106 -0
- package/dist/cjs/errors.js +29 -1
- package/dist/cjs/gateway.js +88 -0
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/interceptors/audit/index.js +4 -1
- package/dist/cjs/interceptors/audit/interceptor.js +11 -0
- package/dist/cjs/interceptors/audit/record.js +17 -3
- package/dist/cjs/interceptors/audit/trace.js +43 -0
- package/dist/cjs/interceptors/cache/embedding.js +53 -0
- package/dist/cjs/interceptors/cache/index.js +9 -5
- package/dist/cjs/interceptors/cache/interceptor.js +80 -0
- package/dist/cjs/interceptors/cache/vector.js +35 -0
- package/dist/cjs/interceptors/governance/budget.js +45 -0
- package/dist/cjs/interceptors/governance/index.js +10 -0
- package/dist/cjs/interceptors/governance/model-policy.js +18 -0
- package/dist/cjs/interceptors/governance/rate-limit.js +46 -0
- package/dist/cjs/interceptors/guardrails/index.js +11 -0
- package/dist/cjs/interceptors/guardrails/interceptor.js +40 -0
- package/dist/cjs/interceptors/guardrails/validator.js +8 -0
- package/dist/cjs/interceptors/guardrails/validators/regex.js +32 -0
- package/dist/cjs/interceptors/guardrails/validators/schema.js +63 -0
- package/dist/cjs/interceptors/injection.js +62 -0
- package/dist/cjs/interceptors/metrics/index.js +9 -0
- package/dist/cjs/interceptors/metrics/interceptor.js +37 -0
- package/dist/cjs/interceptors/metrics/registry.js +0 -0
- package/dist/cjs/interceptors/quality/index.js +7 -0
- package/dist/cjs/interceptors/quality/risk.js +49 -0
- package/dist/cjs/interceptors/reliability/circuit-breaker.js +82 -0
- package/dist/cjs/interceptors/reliability/index.js +8 -1
- package/dist/cjs/interceptors/reliability/load-balancer.js +38 -0
- package/dist/cjs/interceptors/reliability/stream-buffer.js +28 -0
- package/dist/cjs/pricing.js +5 -1
- package/dist/cjs/providers/azure-openai.js +56 -0
- package/dist/cjs/providers/base.js +9 -0
- package/dist/cjs/providers/gemini.js +73 -0
- package/dist/cjs/providers/index.js +22 -6
- package/dist/cjs/providers/ollama.js +41 -0
- package/dist/cjs/request.js +3 -0
- package/dist/cjs/shim/openai.js +57 -0
- package/dist/cjs/types.js +53 -1
- package/dist/esm/config.d.ts +12 -0
- package/dist/esm/config.js +102 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.js +24 -0
- package/dist/esm/gateway.d.ts +18 -1
- package/dist/esm/gateway.js +55 -0
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/interceptors/audit/index.d.ts +2 -0
- package/dist/esm/interceptors/audit/index.js +1 -0
- package/dist/esm/interceptors/audit/interceptor.d.ts +2 -0
- package/dist/esm/interceptors/audit/interceptor.js +11 -0
- package/dist/esm/interceptors/audit/record.d.ts +4 -2
- package/dist/esm/interceptors/audit/record.js +18 -4
- package/dist/esm/interceptors/audit/trace.d.ts +19 -0
- package/dist/esm/interceptors/audit/trace.js +39 -0
- package/dist/esm/interceptors/cache/embedding.d.ts +14 -0
- package/dist/esm/interceptors/cache/embedding.js +49 -0
- package/dist/esm/interceptors/cache/index.d.ts +7 -4
- package/dist/esm/interceptors/cache/index.js +4 -4
- package/dist/esm/interceptors/cache/interceptor.d.ts +19 -0
- package/dist/esm/interceptors/cache/interceptor.js +77 -0
- package/dist/esm/interceptors/cache/vector.d.ts +9 -0
- package/dist/esm/interceptors/cache/vector.js +32 -0
- package/dist/esm/interceptors/governance/budget.d.ts +11 -0
- package/dist/esm/interceptors/governance/budget.js +42 -0
- package/dist/esm/interceptors/governance/index.d.ts +7 -0
- package/dist/esm/interceptors/governance/index.js +4 -0
- package/dist/esm/interceptors/governance/model-policy.d.ts +8 -0
- package/dist/esm/interceptors/governance/model-policy.js +15 -0
- package/dist/esm/interceptors/governance/rate-limit.d.ts +9 -0
- package/dist/esm/interceptors/governance/rate-limit.js +43 -0
- package/dist/esm/interceptors/guardrails/index.d.ts +6 -0
- package/dist/esm/interceptors/guardrails/index.js +4 -0
- package/dist/esm/interceptors/guardrails/interceptor.d.ts +15 -0
- package/dist/esm/interceptors/guardrails/interceptor.js +37 -0
- package/dist/esm/interceptors/guardrails/validator.d.ts +11 -0
- package/dist/esm/interceptors/guardrails/validator.js +3 -0
- package/dist/esm/interceptors/guardrails/validators/regex.d.ts +6 -0
- package/dist/esm/interceptors/guardrails/validators/regex.js +28 -0
- package/dist/esm/interceptors/guardrails/validators/schema.d.ts +5 -0
- package/dist/esm/interceptors/guardrails/validators/schema.js +60 -0
- package/dist/esm/interceptors/injection.d.ts +17 -0
- package/dist/esm/interceptors/injection.js +59 -0
- package/dist/esm/interceptors/metrics/index.d.ts +5 -0
- package/dist/esm/interceptors/metrics/index.js +3 -0
- package/dist/esm/interceptors/metrics/interceptor.d.ts +22 -0
- package/dist/esm/interceptors/metrics/interceptor.js +33 -0
- package/dist/esm/interceptors/metrics/registry.d.ts +31 -0
- package/dist/esm/interceptors/metrics/registry.js +0 -0
- package/dist/esm/interceptors/quality/index.d.ts +3 -0
- package/dist/esm/interceptors/quality/index.js +2 -0
- package/dist/esm/interceptors/quality/risk.d.ts +32 -0
- package/dist/esm/interceptors/quality/risk.js +44 -0
- package/dist/esm/interceptors/reliability/circuit-breaker.d.ts +15 -0
- package/dist/esm/interceptors/reliability/circuit-breaker.js +78 -0
- package/dist/esm/interceptors/reliability/index.d.ts +5 -0
- package/dist/esm/interceptors/reliability/index.js +3 -0
- package/dist/esm/interceptors/reliability/load-balancer.d.ts +8 -0
- package/dist/esm/interceptors/reliability/load-balancer.js +35 -0
- package/dist/esm/interceptors/reliability/stream-buffer.d.ts +18 -0
- package/dist/esm/interceptors/reliability/stream-buffer.js +24 -0
- package/dist/esm/pricing.js +5 -1
- package/dist/esm/providers/azure-openai.d.ts +28 -0
- package/dist/esm/providers/azure-openai.js +53 -0
- package/dist/esm/providers/base.d.ts +7 -0
- package/dist/esm/providers/base.js +9 -1
- package/dist/esm/providers/gemini.d.ts +36 -0
- package/dist/esm/providers/gemini.js +69 -0
- package/dist/esm/providers/index.d.ts +7 -1
- package/dist/esm/providers/index.js +18 -5
- package/dist/esm/providers/ollama.d.ts +21 -0
- package/dist/esm/providers/ollama.js +38 -0
- package/dist/esm/request.d.ts +4 -1
- package/dist/esm/request.js +4 -1
- package/dist/esm/shim/openai.d.ts +56 -0
- package/dist/esm/shim/openai.js +53 -0
- package/dist/esm/types.d.ts +54 -0
- package/dist/esm/types.js +50 -0
- package/package.json +41 -2
- package/src/config.ts +125 -0
- package/src/errors.ts +28 -0
- package/src/gateway.ts +62 -1
- package/src/index.ts +4 -2
- package/src/interceptors/audit/index.ts +2 -0
- package/src/interceptors/audit/interceptor.ts +13 -0
- package/src/interceptors/audit/record.ts +18 -4
- package/src/interceptors/audit/trace.ts +47 -0
- package/src/interceptors/cache/embedding.ts +53 -0
- package/src/interceptors/cache/index.ts +7 -4
- package/src/interceptors/cache/interceptor.ts +111 -0
- package/src/interceptors/cache/vector.ts +45 -0
- package/src/interceptors/governance/budget.ts +59 -0
- package/src/interceptors/governance/index.ts +8 -0
- package/src/interceptors/governance/model-policy.ts +25 -0
- package/src/interceptors/governance/rate-limit.ts +63 -0
- package/src/interceptors/guardrails/index.ts +7 -0
- package/src/interceptors/guardrails/interceptor.ts +56 -0
- package/src/interceptors/guardrails/validator.ts +14 -0
- package/src/interceptors/guardrails/validators/regex.ts +29 -0
- package/src/interceptors/guardrails/validators/schema.ts +62 -0
- package/src/interceptors/injection.ts +72 -0
- package/src/interceptors/metrics/index.ts +6 -0
- package/src/interceptors/metrics/interceptor.ts +46 -0
- package/src/interceptors/metrics/registry.ts +0 -0
- package/src/interceptors/quality/index.ts +4 -0
- package/src/interceptors/quality/risk.ts +64 -0
- package/src/interceptors/reliability/circuit-breaker.ts +102 -0
- package/src/interceptors/reliability/index.ts +5 -0
- package/src/interceptors/reliability/load-balancer.ts +56 -0
- package/src/interceptors/reliability/stream-buffer.ts +27 -0
- package/src/pricing.ts +5 -1
- package/src/providers/azure-openai.ts +77 -0
- package/src/providers/base.ts +21 -1
- package/src/providers/gemini.ts +95 -0
- package/src/providers/index.ts +21 -5
- package/src/providers/ollama.ts +61 -0
- package/src/request.ts +6 -2
- package/src/shim/openai.ts +76 -0
- 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
|
+
}
|