@hilbras/omnihilbras 0.1.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 (54) hide show
  1. package/README.md +57 -0
  2. package/dist/adapters/anthropic.d.ts +38 -0
  3. package/dist/adapters/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/anthropic.js +298 -0
  5. package/dist/adapters/anthropic.js.map +1 -0
  6. package/dist/adapters/gemini.d.ts +35 -0
  7. package/dist/adapters/gemini.d.ts.map +1 -0
  8. package/dist/adapters/gemini.js +322 -0
  9. package/dist/adapters/gemini.js.map +1 -0
  10. package/dist/adapters/openai-compatible.d.ts +52 -0
  11. package/dist/adapters/openai-compatible.d.ts.map +1 -0
  12. package/dist/adapters/openai-compatible.js +246 -0
  13. package/dist/adapters/openai-compatible.js.map +1 -0
  14. package/dist/adapters/openai.d.ts +10 -0
  15. package/dist/adapters/openai.d.ts.map +1 -0
  16. package/dist/adapters/openai.js +17 -0
  17. package/dist/adapters/openai.js.map +1 -0
  18. package/dist/adapters/openrouter.d.ts +32 -0
  19. package/dist/adapters/openrouter.d.ts.map +1 -0
  20. package/dist/adapters/openrouter.js +171 -0
  21. package/dist/adapters/openrouter.js.map +1 -0
  22. package/dist/errors.d.ts +28 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +60 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +13 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/registry.d.ts +12 -0
  31. package/dist/registry.d.ts.map +1 -0
  32. package/dist/registry.js +45 -0
  33. package/dist/registry.js.map +1 -0
  34. package/dist/secret-store.d.ts +12 -0
  35. package/dist/secret-store.d.ts.map +1 -0
  36. package/dist/secret-store.js +18 -0
  37. package/dist/secret-store.js.map +1 -0
  38. package/dist/streaming.d.ts +11 -0
  39. package/dist/streaming.d.ts.map +1 -0
  40. package/dist/streaming.js +87 -0
  41. package/dist/streaming.js.map +1 -0
  42. package/dist/transport.d.ts +44 -0
  43. package/dist/transport.d.ts.map +1 -0
  44. package/dist/transport.js +239 -0
  45. package/dist/transport.js.map +1 -0
  46. package/dist/types.d.ts +132 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/url.d.ts +12 -0
  51. package/dist/url.d.ts.map +1 -0
  52. package/dist/url.js +104 -0
  53. package/dist/url.js.map +1 -0
  54. package/package.json +57 -0
@@ -0,0 +1,87 @@
1
+ import { ProviderError } from './errors.js';
2
+ const defaultMaxEventBytes = 1024 * 1024;
3
+ export async function* parseSseStream(source, options = {}) {
4
+ const maxEventBytes = options.maxEventBytes ?? defaultMaxEventBytes;
5
+ let buffer = '';
6
+ let dataLines = [];
7
+ let eventName;
8
+ let eventId;
9
+ let eventBytes = 0;
10
+ const dispatch = () => {
11
+ if (dataLines.length === 0) {
12
+ eventName = undefined;
13
+ eventId = undefined;
14
+ eventBytes = 0;
15
+ return undefined;
16
+ }
17
+ const event = {
18
+ data: dataLines.join('\n'),
19
+ ...(eventName ? { event: eventName } : {}),
20
+ ...(eventId ? { id: eventId } : {}),
21
+ };
22
+ dataLines = [];
23
+ eventName = undefined;
24
+ eventId = undefined;
25
+ eventBytes = 0;
26
+ return event;
27
+ };
28
+ const processLine = (line) => {
29
+ if (line === '')
30
+ return dispatch();
31
+ if (line.startsWith(':'))
32
+ return undefined;
33
+ const separator = line.indexOf(':');
34
+ const field = separator === -1 ? line : line.slice(0, separator);
35
+ let value = separator === -1 ? '' : line.slice(separator + 1);
36
+ if (value.startsWith(' '))
37
+ value = value.slice(1);
38
+ if (field === 'data') {
39
+ eventBytes += value.length + 1;
40
+ if (eventBytes > maxEventBytes)
41
+ throw new ProviderError('INVALID_RESPONSE', 'Provider stream event exceeded the configured size limit.');
42
+ dataLines.push(value);
43
+ }
44
+ if (field === 'event')
45
+ eventName = value;
46
+ if (field === 'id')
47
+ eventId = value;
48
+ return undefined;
49
+ };
50
+ for await (const chunk of source) {
51
+ buffer += chunk;
52
+ if (buffer.length > maxEventBytes && !buffer.includes('\n')) {
53
+ throw new ProviderError('INVALID_RESPONSE', 'Provider stream event exceeded the configured size limit.');
54
+ }
55
+ let newlineIndex = buffer.indexOf('\n');
56
+ while (newlineIndex !== -1) {
57
+ const line = buffer.slice(0, newlineIndex).replace(/\r$/, '');
58
+ buffer = buffer.slice(newlineIndex + 1);
59
+ const event = processLine(line);
60
+ if (event)
61
+ yield event;
62
+ newlineIndex = buffer.indexOf('\n');
63
+ }
64
+ }
65
+ if (buffer) {
66
+ const event = processLine(buffer.replace(/\r$/, ''));
67
+ if (event)
68
+ yield event;
69
+ }
70
+ const finalEvent = dispatch();
71
+ if (finalEvent)
72
+ yield finalEvent;
73
+ }
74
+ export function parseSseJson(event, providerId) {
75
+ if (!event.data || event.data === '[DONE]')
76
+ return undefined;
77
+ try {
78
+ return JSON.parse(event.data);
79
+ }
80
+ catch (error) {
81
+ throw new ProviderError('INVALID_RESPONSE', 'Provider stream contained invalid JSON.', {
82
+ providerId,
83
+ cause: error,
84
+ });
85
+ }
86
+ }
87
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
2
+ export type HttpRequest = {
3
+ method: HttpMethod;
4
+ url: string;
5
+ providerId?: string;
6
+ headers?: Record<string, string>;
7
+ body?: string;
8
+ signal?: AbortSignal;
9
+ };
10
+ export type HttpResponse<T> = {
11
+ status: number;
12
+ headers: Headers;
13
+ data: T;
14
+ };
15
+ export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
16
+ /**
17
+ * Low-level transport for adapter-owned, trusted provider configuration.
18
+ * It is not an arbitrary user-URL fetcher; cloud tenant endpoints require an
19
+ * additional allowlist and DNS-rebinding policy before exposure.
20
+ */
21
+ export interface HttpTransport {
22
+ request<T>(request: HttpRequest): Promise<HttpResponse<T>>;
23
+ stream(request: HttpRequest): AsyncIterable<string>;
24
+ }
25
+ export type FetchHttpTransportOptions = {
26
+ fetch?: FetchLike;
27
+ timeoutMs?: number;
28
+ streamIdleTimeoutMs?: number;
29
+ maxResponseBytes?: number;
30
+ maxStreamBytes?: number;
31
+ maxStreamDurationMs?: number;
32
+ };
33
+ export declare class FetchHttpTransport implements HttpTransport {
34
+ private readonly fetchImpl;
35
+ private readonly timeoutMs;
36
+ private readonly streamIdleTimeoutMs;
37
+ private readonly maxResponseBytes;
38
+ private readonly maxStreamBytes;
39
+ private readonly maxStreamDurationMs;
40
+ constructor(options?: FetchHttpTransportOptions);
41
+ request<T>(request: HttpRequest): Promise<HttpResponse<T>>;
42
+ stream(request: HttpRequest): AsyncIterable<string>;
43
+ }
44
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;CACT,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5F;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAcF,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAEjC,OAAO,GAAE,yBAA8B;IAc7C,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IA0BzD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;CAyD3D"}
@@ -0,0 +1,239 @@
1
+ import { isProviderError, ProviderError } from './errors.js';
2
+ import { assertSafeProviderRequestUrl } from './url.js';
3
+ const defaultTimeoutMs = 30_000;
4
+ const defaultMaxResponseBytes = 10 * 1024 * 1024;
5
+ const defaultMaxStreamBytes = 50 * 1024 * 1024;
6
+ const defaultMaxStreamDurationMs = 10 * 60 * 1000;
7
+ export class FetchHttpTransport {
8
+ fetchImpl;
9
+ timeoutMs;
10
+ streamIdleTimeoutMs;
11
+ maxResponseBytes;
12
+ maxStreamBytes;
13
+ maxStreamDurationMs;
14
+ constructor(options = {}) {
15
+ const fetchImpl = options.fetch ?? globalThis.fetch;
16
+ if (!fetchImpl) {
17
+ throw new ProviderError('CONFIGURATION_ERROR', 'A Fetch implementation is required.');
18
+ }
19
+ this.fetchImpl = fetchImpl;
20
+ this.timeoutMs = options.timeoutMs ?? defaultTimeoutMs;
21
+ this.streamIdleTimeoutMs = options.streamIdleTimeoutMs ?? options.timeoutMs ?? defaultTimeoutMs;
22
+ this.maxResponseBytes = options.maxResponseBytes ?? defaultMaxResponseBytes;
23
+ this.maxStreamBytes = options.maxStreamBytes ?? defaultMaxStreamBytes;
24
+ this.maxStreamDurationMs = options.maxStreamDurationMs ?? defaultMaxStreamDurationMs;
25
+ }
26
+ async request(request) {
27
+ assertSafeProviderRequestUrl(request.url, request.providerId ?? 'provider');
28
+ const lifecycle = createRequestLifecycle(request.signal, this.timeoutMs);
29
+ try {
30
+ const response = await this.fetchImpl(request.url, {
31
+ method: request.method,
32
+ headers: request.headers,
33
+ body: request.body,
34
+ redirect: 'error',
35
+ signal: lifecycle.signal,
36
+ });
37
+ if (!response.ok) {
38
+ await response.body?.cancel();
39
+ throw providerErrorFromResponse(response, undefined, request.providerId);
40
+ }
41
+ const data = await parseResponse(response, this.maxResponseBytes);
42
+ return { status: response.status, headers: response.headers, data };
43
+ }
44
+ catch (error) {
45
+ throw normalizeTransportError(error, request.signal, lifecycle);
46
+ }
47
+ finally {
48
+ lifecycle.cleanup();
49
+ }
50
+ }
51
+ async *stream(request) {
52
+ assertSafeProviderRequestUrl(request.url, request.providerId ?? 'provider');
53
+ const lifecycle = createRequestLifecycle(request.signal, this.streamIdleTimeoutMs, this.maxStreamDurationMs);
54
+ try {
55
+ const response = await this.fetchImpl(request.url, {
56
+ method: request.method,
57
+ headers: request.headers,
58
+ body: request.body,
59
+ redirect: 'error',
60
+ signal: lifecycle.signal,
61
+ });
62
+ if (!response.ok) {
63
+ await response.body?.cancel();
64
+ throw providerErrorFromResponse(response, undefined, request.providerId);
65
+ }
66
+ if (!response.body) {
67
+ throw new ProviderError('INVALID_RESPONSE', 'Provider returned an empty response stream.');
68
+ }
69
+ const reader = response.body.getReader();
70
+ const decoder = new TextDecoder();
71
+ let totalBytes = 0;
72
+ try {
73
+ while (true) {
74
+ lifecycle.resetTimeout();
75
+ const result = await reader.read();
76
+ if (result.done) {
77
+ const tail = decoder.decode();
78
+ if (tail)
79
+ yield tail;
80
+ return;
81
+ }
82
+ totalBytes += result.value.byteLength;
83
+ if (totalBytes > this.maxStreamBytes) {
84
+ throw new ProviderError('INVALID_RESPONSE', 'Provider response stream exceeded the configured size limit.');
85
+ }
86
+ const text = decoder.decode(result.value, { stream: true });
87
+ if (text)
88
+ yield text;
89
+ }
90
+ }
91
+ finally {
92
+ try {
93
+ await reader.cancel();
94
+ }
95
+ catch {
96
+ // The stream may already be closed by the provider.
97
+ }
98
+ reader.releaseLock();
99
+ }
100
+ }
101
+ catch (error) {
102
+ throw normalizeTransportError(error, request.signal, lifecycle);
103
+ }
104
+ finally {
105
+ lifecycle.cleanup();
106
+ }
107
+ }
108
+ }
109
+ function createRequestLifecycle(externalSignal, timeoutMs, maxDurationMs = 0) {
110
+ const controller = new AbortController();
111
+ let timedOut = false;
112
+ let timer;
113
+ let durationTimer;
114
+ const abortFromExternalSignal = () => {
115
+ controller.abort(externalSignal?.reason);
116
+ };
117
+ const resetTimeout = () => {
118
+ if (timer)
119
+ clearTimeout(timer);
120
+ timer = undefined;
121
+ if (timeoutMs > 0 && !controller.signal.aborted) {
122
+ timer = setTimeout(() => {
123
+ timedOut = true;
124
+ controller.abort();
125
+ }, timeoutMs);
126
+ }
127
+ };
128
+ if (externalSignal?.aborted) {
129
+ controller.abort(externalSignal.reason);
130
+ }
131
+ else if (externalSignal) {
132
+ externalSignal.addEventListener('abort', abortFromExternalSignal, { once: true });
133
+ }
134
+ resetTimeout();
135
+ if (maxDurationMs > 0 && !controller.signal.aborted) {
136
+ durationTimer = setTimeout(() => {
137
+ timedOut = true;
138
+ controller.abort();
139
+ }, maxDurationMs);
140
+ }
141
+ return {
142
+ signal: controller.signal,
143
+ didTimeout: () => timedOut,
144
+ resetTimeout,
145
+ cleanup: () => {
146
+ if (timer)
147
+ clearTimeout(timer);
148
+ if (durationTimer)
149
+ clearTimeout(durationTimer);
150
+ externalSignal?.removeEventListener('abort', abortFromExternalSignal);
151
+ },
152
+ };
153
+ }
154
+ async function parseResponse(response, maxBytes) {
155
+ if (response.status === 204)
156
+ return undefined;
157
+ const text = await readResponseText(response, maxBytes);
158
+ if (!text)
159
+ return undefined;
160
+ try {
161
+ return JSON.parse(text);
162
+ }
163
+ catch (error) {
164
+ if (!response.ok)
165
+ return text;
166
+ throw new ProviderError('INVALID_RESPONSE', 'Provider returned a non-JSON response.', {
167
+ statusCode: response.status,
168
+ cause: error,
169
+ });
170
+ }
171
+ }
172
+ async function readResponseText(response, maxBytes) {
173
+ if (!response.body)
174
+ return '';
175
+ const reader = response.body.getReader();
176
+ const decoder = new TextDecoder();
177
+ let totalBytes = 0;
178
+ let text = '';
179
+ try {
180
+ while (true) {
181
+ const result = await reader.read();
182
+ if (result.done)
183
+ return text + decoder.decode();
184
+ totalBytes += result.value.byteLength;
185
+ if (totalBytes > maxBytes)
186
+ throw new ProviderError('INVALID_RESPONSE', 'Provider response exceeded the configured size limit.');
187
+ text += decoder.decode(result.value, { stream: true });
188
+ }
189
+ }
190
+ finally {
191
+ try {
192
+ await reader.cancel();
193
+ }
194
+ catch {
195
+ // The provider may have already closed the response.
196
+ }
197
+ reader.releaseLock();
198
+ }
199
+ }
200
+ function providerErrorFromResponse(response, _body, providerId) {
201
+ const code = response.status === 401 || response.status === 403
202
+ ? 'AUTHENTICATION_FAILED'
203
+ : response.status === 429
204
+ ? 'RATE_LIMITED'
205
+ : response.status === 408 || response.status === 504
206
+ ? 'PROVIDER_TIMEOUT'
207
+ : response.status >= 500
208
+ ? 'PROVIDER_UNAVAILABLE'
209
+ : 'PROVIDER_REQUEST_FAILED';
210
+ const message = code === 'AUTHENTICATION_FAILED'
211
+ ? 'Provider authentication failed.'
212
+ : code === 'RATE_LIMITED'
213
+ ? 'The provider rate limit was reached.'
214
+ : code === 'PROVIDER_TIMEOUT'
215
+ ? 'The provider request timed out.'
216
+ : code === 'PROVIDER_UNAVAILABLE'
217
+ ? 'The provider is temporarily unavailable.'
218
+ : 'The provider rejected the request.';
219
+ return new ProviderError(code, message, {
220
+ providerId,
221
+ statusCode: response.status,
222
+ retryable: code === 'RATE_LIMITED' || code === 'PROVIDER_TIMEOUT' || code === 'PROVIDER_UNAVAILABLE',
223
+ });
224
+ }
225
+ function normalizeTransportError(error, requestSignal, lifecycle) {
226
+ if (isProviderError(error))
227
+ return error;
228
+ if (lifecycle.didTimeout()) {
229
+ return new ProviderError('PROVIDER_TIMEOUT', 'The provider request timed out.', { cause: error, retryable: true });
230
+ }
231
+ if (requestSignal?.aborted || isAbortError(error)) {
232
+ return new ProviderError('CANCELLED', 'The provider request was cancelled.', { cause: error });
233
+ }
234
+ return new ProviderError('PROVIDER_UNAVAILABLE', 'The provider could not be reached.', { cause: error, retryable: true });
235
+ }
236
+ function isAbortError(error) {
237
+ return error instanceof Error && error.name === 'AbortError';
238
+ }
239
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ export type ProviderId = string;
2
+ export type ChatRole = 'system' | 'user' | 'assistant' | 'tool';
3
+ export type FinishReason = 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' | 'other';
4
+ export type TextContentPart = {
5
+ type: 'text';
6
+ text: string;
7
+ };
8
+ export type ImageContentPart = {
9
+ type: 'image_url';
10
+ imageUrl: {
11
+ url: string;
12
+ detail?: 'auto' | 'low' | 'high';
13
+ };
14
+ };
15
+ export type MessageContentPart = TextContentPart | ImageContentPart;
16
+ export type MessageContent = string | readonly MessageContentPart[] | null;
17
+ export type ToolCall = {
18
+ id: string;
19
+ type: 'function';
20
+ function: {
21
+ name: string;
22
+ arguments: string;
23
+ };
24
+ };
25
+ export type ToolCallDelta = {
26
+ index: number;
27
+ id?: string;
28
+ type?: 'function';
29
+ function?: {
30
+ name?: string;
31
+ arguments?: string;
32
+ };
33
+ };
34
+ export type ToolDefinition = {
35
+ name: string;
36
+ description?: string;
37
+ parameters: Record<string, unknown>;
38
+ };
39
+ export type ChatMessage = {
40
+ role: ChatRole;
41
+ content: MessageContent;
42
+ name?: string;
43
+ toolCallId?: string;
44
+ toolCalls?: readonly ToolCall[];
45
+ };
46
+ export type ChatRequest = {
47
+ model: string;
48
+ messages: readonly ChatMessage[];
49
+ temperature?: number;
50
+ maxOutputTokens?: number;
51
+ topP?: number;
52
+ stop?: readonly string[];
53
+ stream?: boolean;
54
+ tools?: readonly ToolDefinition[];
55
+ providerOptions?: Record<string, unknown>;
56
+ };
57
+ export type TokenUsage = {
58
+ inputTokens?: number;
59
+ outputTokens?: number;
60
+ totalTokens?: number;
61
+ };
62
+ export type ChatResponse = {
63
+ id: string;
64
+ providerId: ProviderId;
65
+ model: string;
66
+ createdAt: string;
67
+ message: ChatMessage;
68
+ finishReason: FinishReason;
69
+ usage?: TokenUsage;
70
+ };
71
+ export type ChatChunk = {
72
+ id: string;
73
+ providerId: ProviderId;
74
+ model: string;
75
+ delta: {
76
+ role?: ChatRole;
77
+ content?: string;
78
+ toolCalls?: readonly ToolCallDelta[];
79
+ };
80
+ finishReason?: FinishReason;
81
+ usage?: TokenUsage;
82
+ };
83
+ export type Model = {
84
+ id: string;
85
+ providerId: ProviderId;
86
+ displayName?: string;
87
+ ownedBy?: string;
88
+ contextWindow?: number;
89
+ capabilities?: ProviderCapabilities;
90
+ };
91
+ export type ProviderCapability = 'chat' | 'streaming' | 'models' | 'embeddings' | 'images' | 'audio' | 'search';
92
+ export type ProviderCapabilities = Partial<Record<ProviderCapability, boolean>>;
93
+ export type ProviderCredential = {
94
+ type: 'api-key';
95
+ value: string;
96
+ } | {
97
+ type: 'none';
98
+ };
99
+ export type ProviderRequestContext = {
100
+ credential?: ProviderCredential;
101
+ signal?: AbortSignal;
102
+ requestId?: string;
103
+ };
104
+ export type ProviderHealth = {
105
+ status: 'healthy' | 'degraded' | 'unavailable';
106
+ latencyMs?: number;
107
+ message?: string;
108
+ checkedAt: string;
109
+ };
110
+ export type ModelImportPolicy = 'free' | 'all';
111
+ export type ModelImportOptions = {
112
+ policy: ModelImportPolicy;
113
+ };
114
+ export type CredentialValidation = {
115
+ status: 'valid';
116
+ checkedAt: string;
117
+ latencyMs?: number;
118
+ };
119
+ export type ProviderAdapter = {
120
+ readonly id: ProviderId;
121
+ readonly name: string;
122
+ readonly capabilities: ProviderCapabilities;
123
+ listModels?: (context?: ProviderRequestContext) => Promise<readonly Model[]>;
124
+ chat?: (request: ChatRequest, context?: ProviderRequestContext) => Promise<ChatResponse>;
125
+ streamChat?: (request: ChatRequest, context?: ProviderRequestContext) => AsyncIterable<ChatChunk>;
126
+ /** Performs a provider-specific, side-effect-free credential check. */
127
+ validateCredential?: (credential: ProviderCredential | undefined, context?: ProviderRequestContext) => Promise<CredentialValidation | void>;
128
+ /** Discovers models for a connection import policy. */
129
+ discoverModels?: (context: ProviderRequestContext | undefined, options: ModelImportOptions) => Promise<readonly Model[]>;
130
+ healthCheck?: (context?: ProviderRequestContext) => Promise<ProviderHealth>;
131
+ };
132
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/url.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export declare function normalizeProviderBaseUrl(value: string, providerId: string): string;
2
+ export declare function assertSafeProviderRequestUrl(value: string, providerId: string): string;
3
+ export declare function resolveProviderUrl(baseUrl: string, path: string, providerId: string): string;
4
+ export declare function assertSafeProviderHeaderName(name: string, providerId: string, options?: {
5
+ allowCredential?: boolean;
6
+ }): void;
7
+ export declare function assertSafeProviderHeaderValue(name: string, value: string, providerId: string): void;
8
+ export declare function sanitizeProviderHeaders(headers: Record<string, string> | undefined, providerId: string): Record<string, string>;
9
+ export declare function isPrivateHostname(hostname: string): boolean;
10
+ export declare function isLoopbackHostname(hostname: string): boolean;
11
+ export declare function canonicalLoopbackHost(hostname: string): string;
12
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UASzE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAY7E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAenF;AAKD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,QAKzH;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAI5F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,0BAQtG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,WAWjD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,WAKlD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,UAMrD"}