@acentric/llm 0.0.0-stage → 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.
- package/README.md +128 -2
- package/dist/catalog/anthropic.d.ts +77 -0
- package/dist/catalog/anthropic.d.ts.map +1 -0
- package/dist/catalog/anthropic.js +73 -0
- package/dist/catalog/anthropic.js.map +1 -0
- package/dist/catalog/fireworks.d.ts +93 -0
- package/dist/catalog/fireworks.d.ts.map +1 -0
- package/dist/catalog/fireworks.js +117 -0
- package/dist/catalog/fireworks.js.map +1 -0
- package/dist/catalog/openai.d.ts +103 -0
- package/dist/catalog/openai.d.ts.map +1 -0
- package/dist/catalog/openai.js +102 -0
- package/dist/catalog/openai.js.map +1 -0
- package/dist/client/anthropic/errors.d.ts +4 -0
- package/dist/client/anthropic/errors.d.ts.map +1 -0
- package/dist/client/anthropic/errors.js +80 -0
- package/dist/client/anthropic/errors.js.map +1 -0
- package/dist/client/anthropic/request.d.ts +9 -0
- package/dist/client/anthropic/request.d.ts.map +1 -0
- package/dist/client/anthropic/request.js +232 -0
- package/dist/client/anthropic/request.js.map +1 -0
- package/dist/client/anthropic/response.d.ts +13 -0
- package/dist/client/anthropic/response.d.ts.map +1 -0
- package/dist/client/anthropic/response.js +207 -0
- package/dist/client/anthropic/response.js.map +1 -0
- package/dist/client/direct.d.ts +18 -0
- package/dist/client/direct.d.ts.map +1 -0
- package/dist/client/direct.js +104 -0
- package/dist/client/direct.js.map +1 -0
- package/dist/client/gateway.d.ts +43 -0
- package/dist/client/gateway.d.ts.map +1 -0
- package/dist/client/gateway.js +72 -0
- package/dist/client/gateway.js.map +1 -0
- package/dist/client/http.d.ts +41 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +190 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/llm.d.ts +41 -0
- package/dist/client/llm.d.ts.map +1 -0
- package/dist/client/llm.js +100 -0
- package/dist/client/llm.js.map +1 -0
- package/dist/client/responses/errors.d.ts +13 -0
- package/dist/client/responses/errors.d.ts.map +1 -0
- package/dist/client/responses/errors.js +144 -0
- package/dist/client/responses/errors.js.map +1 -0
- package/dist/client/responses/profile.d.ts +50 -0
- package/dist/client/responses/profile.d.ts.map +1 -0
- package/dist/client/responses/profile.js +4 -0
- package/dist/client/responses/profile.js.map +1 -0
- package/dist/client/responses/providers.d.ts +4 -0
- package/dist/client/responses/providers.d.ts.map +1 -0
- package/dist/client/responses/providers.js +75 -0
- package/dist/client/responses/providers.js.map +1 -0
- package/dist/client/responses/request.d.ts +5 -0
- package/dist/client/responses/request.d.ts.map +1 -0
- package/dist/client/responses/request.js +248 -0
- package/dist/client/responses/request.js.map +1 -0
- package/dist/client/responses/response.d.ts +10 -0
- package/dist/client/responses/response.d.ts.map +1 -0
- package/dist/client/responses/response.js +176 -0
- package/dist/client/responses/response.js.map +1 -0
- package/dist/client/util.d.ts +21 -0
- package/dist/client/util.d.ts.map +1 -0
- package/dist/client/util.js +63 -0
- package/dist/client/util.js.map +1 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -0
- package/dist/content.d.ts +38 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +5 -0
- package/dist/content.js.map +1 -0
- package/dist/convert/anthropic.d.ts +3 -0
- package/dist/convert/anthropic.d.ts.map +1 -0
- package/dist/convert/anthropic.js +114 -0
- package/dist/convert/anthropic.js.map +1 -0
- package/dist/convert/index.d.ts +12 -0
- package/dist/convert/index.d.ts.map +1 -0
- package/dist/convert/index.js +221 -0
- package/dist/convert/index.js.map +1 -0
- package/dist/convert/responses.d.ts +3 -0
- package/dist/convert/responses.d.ts.map +1 -0
- package/dist/convert/responses.js +197 -0
- package/dist/convert/responses.js.map +1 -0
- package/dist/convert/types.d.ts +88 -0
- package/dist/convert/types.d.ts.map +1 -0
- package/dist/convert/types.js +3 -0
- package/dist/convert/types.js.map +1 -0
- package/dist/cost.d.ts +18 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +49 -0
- package/dist/cost.js.map +1 -0
- package/dist/failure.d.ts +90 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +111 -0
- package/dist/failure.js.map +1 -0
- package/dist/fields.d.ts +14 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +3 -0
- package/dist/fields.js.map +1 -0
- package/dist/formats/anthropic.d.ts +152 -0
- package/dist/formats/anthropic.d.ts.map +1 -0
- package/dist/formats/anthropic.js +7 -0
- package/dist/formats/anthropic.js.map +1 -0
- package/dist/formats/responses.d.ts +179 -0
- package/dist/formats/responses.d.ts.map +1 -0
- package/dist/formats/responses.js +9 -0
- package/dist/formats/responses.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +6 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +10 -0
- package/dist/json.js.map +1 -0
- package/dist/messages.d.ts +82 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +4 -0
- package/dist/messages.js.map +1 -0
- package/dist/model.d.ts +36 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +4 -0
- package/dist/model.js.map +1 -0
- package/dist/models.d.ts +9 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +19 -0
- package/dist/models.js.map +1 -0
- package/dist/providers/anthropic.d.ts +130 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +5 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/fireworks.d.ts +108 -0
- package/dist/providers/fireworks.d.ts.map +1 -0
- package/dist/providers/fireworks.js +6 -0
- package/dist/providers/fireworks.js.map +1 -0
- package/dist/providers/openai.d.ts +193 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +4 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers.d.ts +50 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +5 -0
- package/dist/providers.js.map +1 -0
- package/dist/read/anthropic.d.ts +15 -0
- package/dist/read/anthropic.d.ts.map +1 -0
- package/dist/read/anthropic.js +56 -0
- package/dist/read/anthropic.js.map +1 -0
- package/dist/read/responses.d.ts +26 -0
- package/dist/read/responses.d.ts.map +1 -0
- package/dist/read/responses.js +121 -0
- package/dist/read/responses.js.map +1 -0
- package/dist/read.d.ts +32 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +73 -0
- package/dist/read.js.map +1 -0
- package/dist/request.d.ts +23 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +4 -0
- package/dist/request.js.map +1 -0
- package/dist/response.d.ts +38 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +4 -0
- package/dist/response.js.map +1 -0
- package/dist/secrets.d.ts +22 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +35 -0
- package/dist/secrets.js.map +1 -0
- package/dist/tool-calls.d.ts +28 -0
- package/dist/tool-calls.d.ts.map +1 -0
- package/dist/tool-calls.js +4 -0
- package/dist/tool-calls.js.map +1 -0
- package/dist/tools.d.ts +33 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +4 -0
- package/dist/tools.js.map +1 -0
- package/dist/usage.d.ts +31 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +3 -0
- package/dist/usage.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -3
- package/src/catalog/anthropic.ts +83 -0
- package/src/catalog/fireworks.ts +121 -0
- package/src/catalog/openai.ts +133 -0
- package/src/client/anthropic/errors.ts +88 -0
- package/src/client/anthropic/request.ts +272 -0
- package/src/client/anthropic/response.ts +236 -0
- package/src/client/direct.ts +157 -0
- package/src/client/gateway.ts +120 -0
- package/src/client/http.ts +231 -0
- package/src/client/llm.ts +151 -0
- package/src/client/responses/errors.ts +166 -0
- package/src/client/responses/profile.ts +55 -0
- package/src/client/responses/providers.ts +87 -0
- package/src/client/responses/request.ts +326 -0
- package/src/client/responses/response.ts +203 -0
- package/src/client/util.ts +81 -0
- package/src/client.ts +20 -0
- package/src/content.ts +46 -0
- package/src/convert/anthropic.ts +115 -0
- package/src/convert/index.ts +275 -0
- package/src/convert/responses.ts +203 -0
- package/src/convert/types.ts +104 -0
- package/src/cost.ts +71 -0
- package/src/failure.ts +164 -0
- package/src/fields.ts +13 -0
- package/src/formats/anthropic.ts +191 -0
- package/src/formats/responses.ts +207 -0
- package/src/index.ts +44 -0
- package/src/json.ts +13 -0
- package/src/messages.ts +99 -0
- package/src/model.ts +41 -0
- package/src/models.ts +23 -0
- package/src/providers/anthropic.ts +137 -0
- package/src/providers/fireworks.ts +140 -0
- package/src/providers/openai.ts +275 -0
- package/src/providers.ts +59 -0
- package/src/read/anthropic.ts +64 -0
- package/src/read/responses.ts +159 -0
- package/src/read.ts +108 -0
- package/src/request.ts +28 -0
- package/src/response.ts +44 -0
- package/src/secrets.ts +40 -0
- package/src/tool-calls.ts +33 -0
- package/src/tools.ts +38 -0
- package/src/usage.ts +33 -0
- package/src/version.ts +6 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// One HTTP exchange with a provider or the gateway: a JSON body out, a JSON
|
|
2
|
+
// body back, stopped by the handler's signal or a time limit. Never retried:
|
|
3
|
+
// whether to try again is the agent's decision.
|
|
4
|
+
import { LlmError } from '../failure.js';
|
|
5
|
+
import { cut } from './util.js';
|
|
6
|
+
/** The longest one call may take, and the default, in milliseconds. */
|
|
7
|
+
export const MAX_TIMEOUT_MS = 15 * 60 * 1000;
|
|
8
|
+
const MAX_RESPONSE_BYTES = 32 * 1024 * 1024;
|
|
9
|
+
export async function postJson(post) {
|
|
10
|
+
const { provider, label } = post;
|
|
11
|
+
const timeoutMs = Math.min(post.timeoutMs ?? MAX_TIMEOUT_MS, MAX_TIMEOUT_MS);
|
|
12
|
+
if (!(Number.isSafeInteger(timeoutMs) && timeoutMs > 0)) {
|
|
13
|
+
throw new LlmError('timeoutMs must be a positive whole number', {
|
|
14
|
+
kind: 'invalid_request',
|
|
15
|
+
provider,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
const onAbort = () => controller.abort(new LlmError(`the ${label} call was cancelled`, { kind: 'cancelled', provider }));
|
|
20
|
+
post.signal?.addEventListener('abort', onAbort, { once: true });
|
|
21
|
+
if (post.signal?.aborted === true)
|
|
22
|
+
onAbort();
|
|
23
|
+
const timer = setTimeout(() => controller.abort(new LlmError(`the ${label} call took longer than ${timeoutMs} ms`, {
|
|
24
|
+
kind: 'timeout',
|
|
25
|
+
provider,
|
|
26
|
+
})), timeoutMs);
|
|
27
|
+
const started = performance.now();
|
|
28
|
+
let requestId;
|
|
29
|
+
try {
|
|
30
|
+
controller.signal.throwIfAborted();
|
|
31
|
+
const send = post.fetch ?? globalThis.fetch;
|
|
32
|
+
// Raced against the signal, so a fetch that does not watch it cannot outlast a timeout.
|
|
33
|
+
const response = await untilAborted(send(post.url, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: requestHeaders(provider, post.headers),
|
|
36
|
+
body: JSON.stringify(post.body),
|
|
37
|
+
signal: controller.signal,
|
|
38
|
+
redirect: 'manual',
|
|
39
|
+
}), controller.signal);
|
|
40
|
+
if (post.providerAnswers !== false)
|
|
41
|
+
requestId = readRequestId(response.headers);
|
|
42
|
+
if (response.status >= 300 && response.status < 400) {
|
|
43
|
+
void response.body?.cancel().catch(() => undefined);
|
|
44
|
+
throw new LlmError(`${label} answered with a redirect, which is not followed`, {
|
|
45
|
+
kind: 'network_error',
|
|
46
|
+
provider,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const text = await readText(response, provider, label);
|
|
50
|
+
controller.signal.throwIfAborted();
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
throw post.failed({
|
|
53
|
+
status: response.status,
|
|
54
|
+
headers: response.headers,
|
|
55
|
+
body: parseLoosely(text),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
let body;
|
|
59
|
+
try {
|
|
60
|
+
body = JSON.parse(text);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
throw new LlmError(`${label} answered with something that is not JSON`, {
|
|
64
|
+
kind: 'invalid_response',
|
|
65
|
+
provider,
|
|
66
|
+
httpStatus: response.status,
|
|
67
|
+
providerError: cut(text),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
body,
|
|
72
|
+
durationMs: Math.round(performance.now() - started),
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
...(requestId === undefined ? {} : { requestId }),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const reason = controller.signal.aborted ? controller.signal.reason : error;
|
|
79
|
+
if (reason instanceof LlmError)
|
|
80
|
+
throw withRequestId(reason, requestId);
|
|
81
|
+
throw new LlmError(`${label} could not be reached`, {
|
|
82
|
+
kind: 'network_error',
|
|
83
|
+
provider,
|
|
84
|
+
...(requestId === undefined ? {} : { requestId }),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
post.signal?.removeEventListener('abort', onAbort);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** `Retry-After` in milliseconds, given in seconds or as an HTTP date. */
|
|
93
|
+
export function retryAfter(headers) {
|
|
94
|
+
const value = headers.get('retry-after')?.trim();
|
|
95
|
+
if (value === undefined || value === '')
|
|
96
|
+
return undefined;
|
|
97
|
+
const seconds = Number(value);
|
|
98
|
+
if (Number.isFinite(seconds))
|
|
99
|
+
return seconds >= 0 ? Math.round(seconds * 1000) : undefined;
|
|
100
|
+
const date = Date.parse(value);
|
|
101
|
+
return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());
|
|
102
|
+
}
|
|
103
|
+
/** A failure from after the provider answered names its request ID, for its support. */
|
|
104
|
+
export function withRequestId(error, requestId) {
|
|
105
|
+
if (requestId === undefined || error.failure.requestId !== undefined)
|
|
106
|
+
return error;
|
|
107
|
+
return LlmError.fromJSON({ ...error.failure, requestId });
|
|
108
|
+
}
|
|
109
|
+
/** The promise's value, or the signal's reason as soon as it fires. */
|
|
110
|
+
function untilAborted(promise, signal) {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const abort = () => reject(signal.reason);
|
|
113
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
114
|
+
promise.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function requestHeaders(provider, entries) {
|
|
118
|
+
try {
|
|
119
|
+
return new Headers({
|
|
120
|
+
accept: 'application/json',
|
|
121
|
+
'content-type': 'application/json',
|
|
122
|
+
...entries,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw new LlmError('the credentials hold characters a header cannot', {
|
|
127
|
+
kind: 'invalid_request',
|
|
128
|
+
provider,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function readRequestId(answer) {
|
|
133
|
+
const id = answer.get('x-request-id') ?? answer.get('request-id') ?? answer.get('x-oai-request-id');
|
|
134
|
+
return id?.trim() || undefined;
|
|
135
|
+
}
|
|
136
|
+
function parseLoosely(text) {
|
|
137
|
+
try {
|
|
138
|
+
return JSON.parse(text);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return cut(text);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function readText(response, provider, label) {
|
|
145
|
+
if (response.body === null)
|
|
146
|
+
return '';
|
|
147
|
+
const reader = response.body.getReader();
|
|
148
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
149
|
+
const decode = (value) => {
|
|
150
|
+
try {
|
|
151
|
+
return decoder.decode(value, { stream: value !== undefined });
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
throw new LlmError(`${label} answered with text that is not UTF-8`, {
|
|
155
|
+
kind: 'invalid_response',
|
|
156
|
+
provider,
|
|
157
|
+
httpStatus: response.status,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
let bytes = 0;
|
|
162
|
+
let text = '';
|
|
163
|
+
try {
|
|
164
|
+
for (;;) {
|
|
165
|
+
// Reading a stream is one chunk at a time.
|
|
166
|
+
// oxlint-disable-next-line no-await-in-loop
|
|
167
|
+
const { done, value } = await reader.read();
|
|
168
|
+
if (done)
|
|
169
|
+
break;
|
|
170
|
+
bytes += value.byteLength;
|
|
171
|
+
if (bytes > MAX_RESPONSE_BYTES) {
|
|
172
|
+
throw new LlmError(`${label} answered with more than ${MAX_RESPONSE_BYTES} bytes`, {
|
|
173
|
+
kind: 'invalid_response',
|
|
174
|
+
provider,
|
|
175
|
+
httpStatus: response.status,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
text += decode(value);
|
|
179
|
+
}
|
|
180
|
+
return text + decode();
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
void reader.cancel().catch(() => undefined);
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
reader.releaseLock();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Secrets } from '@acentric/types';
|
|
2
|
+
import type { Credentials, Provider } from '../providers.js';
|
|
3
|
+
import type { LlmRequest } from '../request.js';
|
|
4
|
+
import type { LlmResponse } from '../response.js';
|
|
5
|
+
import type { Gateway } from './gateway.js';
|
|
6
|
+
/** What the client needs of a handler's context. A HandlerContext is one. */
|
|
7
|
+
export type LlmContext = {
|
|
8
|
+
readonly secrets: Secrets;
|
|
9
|
+
/** Stops every call, unless a call passes its own. */
|
|
10
|
+
readonly signal?: AbortSignal;
|
|
11
|
+
/** The effect's key, kind and attempt, which the gateway shows each call under. */
|
|
12
|
+
readonly key?: string;
|
|
13
|
+
readonly kind?: string;
|
|
14
|
+
readonly attempt?: number;
|
|
15
|
+
};
|
|
16
|
+
export type LlmOptions = {
|
|
17
|
+
/** Credentials for a provider, used instead of its secret or a gateway. */
|
|
18
|
+
readonly credentials?: {
|
|
19
|
+
readonly [P in Provider]?: Credentials<P>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A gateway to call instead of the provider's key or the gateway in the
|
|
23
|
+
* secrets, or `false` to call providers directly even when the secrets name
|
|
24
|
+
* one.
|
|
25
|
+
*/
|
|
26
|
+
readonly gateway?: Gateway | false;
|
|
27
|
+
/** A fetch to use instead of the global one, such as in tests. */
|
|
28
|
+
readonly fetch?: typeof fetch;
|
|
29
|
+
};
|
|
30
|
+
export type LlmClient = {
|
|
31
|
+
/**
|
|
32
|
+
* One completion, from the request's provider. The application's `custom`
|
|
33
|
+
* messages are left out. Never retried: on failure it throws an LlmError,
|
|
34
|
+
* which step reads back with `llmFailure`.
|
|
35
|
+
*/
|
|
36
|
+
complete<P extends Provider>(request: LlmRequest<P>, options?: {
|
|
37
|
+
readonly signal?: AbortSignal;
|
|
38
|
+
}): Promise<LlmResponse<P>>;
|
|
39
|
+
};
|
|
40
|
+
export declare function createLlm(context: LlmContext, options?: LlmOptions): LlmClient;
|
|
41
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/client/llm.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,cAAc,CAAC;AAE3D,6EAA6E;AAC7E,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;KAAE,CAAC;IACrE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB;;;;OAIG;IACH,QAAQ,CAAC,CAAC,SAAS,QAAQ,EACzB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EACtB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC1C,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC;AAEF,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CAwBlF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// The client a handler uses: it finds the provider's key or the gateway in
|
|
2
|
+
// the handler's secrets, never in the environment, so the same code runs on
|
|
3
|
+
// every runner.
|
|
4
|
+
//
|
|
5
|
+
// A call goes straight to its provider when that provider's key is set, so an
|
|
6
|
+
// application with its own account uses it. Otherwise, with ACENTRIC_LLM_URL
|
|
7
|
+
// and ACENTRIC_LLM_TOKEN set, it goes through the gateway, which calls the
|
|
8
|
+
// provider with keys of its own. Options override all of this.
|
|
9
|
+
import { LlmError } from '../failure.js';
|
|
10
|
+
import { requestMessages } from '../read.js';
|
|
11
|
+
import { GATEWAY_SECRETS, PROVIDER_SECRETS } from '../secrets.js';
|
|
12
|
+
import { callProvider } from './direct.js';
|
|
13
|
+
import { callGateway } from './gateway.js';
|
|
14
|
+
export function createLlm(context, options = {}) {
|
|
15
|
+
return {
|
|
16
|
+
async complete(request, call = {}) {
|
|
17
|
+
const signal = call.signal ?? context.signal;
|
|
18
|
+
const callOptions = {
|
|
19
|
+
...(signal === undefined ? {} : { signal }),
|
|
20
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
21
|
+
};
|
|
22
|
+
const sent = withoutCustom(request);
|
|
23
|
+
const route = await routeFor(request.provider, context.secrets, options);
|
|
24
|
+
if (route === undefined) {
|
|
25
|
+
throw new LlmError(`no credentials for ${request.provider}: set the secret ${PROVIDER_SECRETS[request.provider]}, ` +
|
|
26
|
+
`or ${GATEWAY_SECRETS.url} and ${GATEWAY_SECRETS.token} for the gateway`, { kind: 'auth', provider: request.provider });
|
|
27
|
+
}
|
|
28
|
+
if ('credentials' in route)
|
|
29
|
+
return callProvider(sent, route.credentials, callOptions);
|
|
30
|
+
return callGateway(sent, route.gateway, { ...callOptions, ...effectOf(context) });
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** The request without the application's own messages, which never reach a provider. */
|
|
35
|
+
function withoutCustom(request) {
|
|
36
|
+
return { ...request, messages: requestMessages(request.messages) };
|
|
37
|
+
}
|
|
38
|
+
async function gatewayIn(secrets) {
|
|
39
|
+
const url = await secret(secrets, GATEWAY_SECRETS.url);
|
|
40
|
+
const token = await secret(secrets, GATEWAY_SECRETS.token);
|
|
41
|
+
if (url === undefined && token === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (url === undefined || token === undefined) {
|
|
44
|
+
const [set, missing] = url === undefined
|
|
45
|
+
? [GATEWAY_SECRETS.token, GATEWAY_SECRETS.url]
|
|
46
|
+
: [GATEWAY_SECRETS.url, GATEWAY_SECRETS.token];
|
|
47
|
+
throw new LlmError(`${set} is set but ${missing} is not: the gateway needs both`, {
|
|
48
|
+
kind: 'auth',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return { url, token };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Where a call goes: credentials or a gateway given as options, then the
|
|
55
|
+
* provider's key, then the gateway in the secrets. Undefined when there is
|
|
56
|
+
* none of these.
|
|
57
|
+
*/
|
|
58
|
+
async function routeFor(provider, secrets, options) {
|
|
59
|
+
const given = options.credentials?.[provider];
|
|
60
|
+
if (given !== undefined)
|
|
61
|
+
return { credentials: given };
|
|
62
|
+
if (options.gateway !== undefined && options.gateway !== false) {
|
|
63
|
+
return { gateway: options.gateway };
|
|
64
|
+
}
|
|
65
|
+
const apiKey = await secret(secrets, PROVIDER_SECRETS[provider]);
|
|
66
|
+
if (apiKey !== undefined)
|
|
67
|
+
return { credentials: { apiKey } };
|
|
68
|
+
if (options.gateway === false)
|
|
69
|
+
return undefined;
|
|
70
|
+
const gateway = await gatewayIn(secrets);
|
|
71
|
+
return gateway === undefined ? undefined : { gateway };
|
|
72
|
+
}
|
|
73
|
+
/** The effect the context names, for the gateway, when it names one. */
|
|
74
|
+
function effectOf(context) {
|
|
75
|
+
const { key, kind, attempt } = context;
|
|
76
|
+
if (key === undefined && kind === undefined && attempt === undefined)
|
|
77
|
+
return {};
|
|
78
|
+
return {
|
|
79
|
+
effect: {
|
|
80
|
+
...(key === undefined ? {} : { key }),
|
|
81
|
+
...(kind === undefined ? {} : { kind }),
|
|
82
|
+
...(attempt === undefined ? {} : { attempt }),
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A secret's value, or undefined when it is not set. Any other failure to
|
|
88
|
+
* read it is thrown: it must not quietly send the call another way.
|
|
89
|
+
*/
|
|
90
|
+
async function secret(secrets, name) {
|
|
91
|
+
try {
|
|
92
|
+
return await secrets.get(name);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof Error && error.name === 'SecretNotSet')
|
|
96
|
+
return undefined;
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/client/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Json } from '@acentric/types';
|
|
2
|
+
import { LlmError } from '../../failure.js';
|
|
3
|
+
import type { LlmFailureKind } from '../../failure.js';
|
|
4
|
+
import type { Usage } from '../../usage.js';
|
|
5
|
+
import type { HttpAnswer } from '../http.js';
|
|
6
|
+
import type { ResponsesProfile, ResponsesProvider } from './profile.js';
|
|
7
|
+
/** The kind an HTTP status means when nothing more is known. */
|
|
8
|
+
export declare function kindForStatus(status: number): LlmFailureKind;
|
|
9
|
+
/** A provider's answer that is not 2xx, as an LlmError. */
|
|
10
|
+
export declare function httpFailure<P extends ResponsesProvider>(profile: ResponsesProfile<P>, answer: HttpAnswer): LlmError;
|
|
11
|
+
/** A response whose status is `failed`, or an error that came with HTTP 200. */
|
|
12
|
+
export declare function failedResponse<P extends ResponsesProvider>(profile: ResponsesProfile<P>, error: Json, responseId: string | undefined, usage: Usage | undefined): LlmError;
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/client/responses/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAc,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA2BpF,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAS5D;AASD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,CAAC,SAAS,iBAAiB,EACrD,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC5B,MAAM,EAAE,UAAU,GACjB,QAAQ,CAoBV;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,CAAC,SAAS,iBAAiB,EACxD,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC5B,KAAK,EAAE,IAAI,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,GAAG,SAAS,GACvB,QAAQ,CAgBV"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Responses failures read into LlmErrors: from an HTTP error, or from a
|
|
2
|
+
// failed response that came with HTTP 200.
|
|
3
|
+
import { LlmError } from '../../failure.js';
|
|
4
|
+
import { isArray, isObject } from '../../json.js';
|
|
5
|
+
import { retryAfter } from '../http.js';
|
|
6
|
+
import { cut, show } from '../util.js';
|
|
7
|
+
const POLICY_CODES = new Set([
|
|
8
|
+
'bio_policy',
|
|
9
|
+
'cyber_policy',
|
|
10
|
+
'misalignment_policy_violation',
|
|
11
|
+
'image_content_policy_violation',
|
|
12
|
+
]);
|
|
13
|
+
const QUOTA_CODES = new Set([
|
|
14
|
+
'insufficient_quota',
|
|
15
|
+
'credit_balance_exhausted',
|
|
16
|
+
'organization_spend_limit_exceeded',
|
|
17
|
+
'project_spend_limit_exceeded',
|
|
18
|
+
'organization_usage_limit_exceeded',
|
|
19
|
+
]);
|
|
20
|
+
const KIND_BY_CODE = {
|
|
21
|
+
context_length_exceeded: 'context_overflow',
|
|
22
|
+
previous_response_not_found: 'not_found',
|
|
23
|
+
rate_limit_exceeded: 'rate_limited',
|
|
24
|
+
slow_down: 'rate_limited',
|
|
25
|
+
server_is_overloaded: 'overloaded',
|
|
26
|
+
server_error: 'provider_error',
|
|
27
|
+
vector_store_timeout: 'timeout',
|
|
28
|
+
};
|
|
29
|
+
/** The kind an HTTP status means when nothing more is known. */
|
|
30
|
+
export function kindForStatus(status) {
|
|
31
|
+
if (status === 401 || status === 403)
|
|
32
|
+
return 'auth';
|
|
33
|
+
if (status === 402)
|
|
34
|
+
return 'quota_exceeded';
|
|
35
|
+
if (status === 404)
|
|
36
|
+
return 'not_found';
|
|
37
|
+
if (status === 408)
|
|
38
|
+
return 'timeout';
|
|
39
|
+
if (status === 429)
|
|
40
|
+
return 'rate_limited';
|
|
41
|
+
if (status === 503 || status === 529)
|
|
42
|
+
return 'overloaded';
|
|
43
|
+
if (status >= 500)
|
|
44
|
+
return 'provider_error';
|
|
45
|
+
return 'invalid_request';
|
|
46
|
+
}
|
|
47
|
+
/** A provider's answer that is not 2xx, as an LlmError. */
|
|
48
|
+
export function httpFailure(profile, answer) {
|
|
49
|
+
const { fields, detail } = readError(answer.body);
|
|
50
|
+
const input = { ...fields, status: answer.status };
|
|
51
|
+
const reading = profile.classifyError?.(input);
|
|
52
|
+
const message = fields.message ??
|
|
53
|
+
(typeof answer.body === 'string' && answer.body !== '' ? answer.body : undefined) ??
|
|
54
|
+
`the ${profile.label} call failed with HTTP ${answer.status}`;
|
|
55
|
+
const param = fields.param ?? reading?.param;
|
|
56
|
+
const after = retryAfter(answer.headers);
|
|
57
|
+
return new LlmError(message, {
|
|
58
|
+
kind: reading?.kind ?? kindForCode(fields) ?? kindForStatus(answer.status),
|
|
59
|
+
provider: profile.provider,
|
|
60
|
+
httpStatus: answer.status,
|
|
61
|
+
providerError: cut(detail),
|
|
62
|
+
...(fields.code === undefined ? {} : { providerCode: fields.code }),
|
|
63
|
+
...(fields.type === undefined ? {} : { providerType: fields.type }),
|
|
64
|
+
...(param === undefined ? {} : { providerParam: param }),
|
|
65
|
+
...(after === undefined ? {} : { retryAfterMs: after }),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** A response whose status is `failed`, or an error that came with HTTP 200. */
|
|
69
|
+
export function failedResponse(profile, error, responseId, usage) {
|
|
70
|
+
const { fields, detail } = readError({ error });
|
|
71
|
+
const reading = profile.classifyError?.(fields);
|
|
72
|
+
const param = fields.param ?? reading?.param;
|
|
73
|
+
return new LlmError(fields.message ?? `the ${profile.label} response failed`, {
|
|
74
|
+
kind: reading?.kind ??
|
|
75
|
+
kindForCode(fields) ??
|
|
76
|
+
(fields.code === undefined ? 'provider_error' : 'invalid_request'),
|
|
77
|
+
provider: profile.provider,
|
|
78
|
+
providerError: cut(detail),
|
|
79
|
+
...(fields.code === undefined ? {} : { providerCode: fields.code }),
|
|
80
|
+
...(param === undefined ? {} : { providerParam: param }),
|
|
81
|
+
...(responseId === undefined ? {} : { responseId }),
|
|
82
|
+
...(usage === undefined ? {} : { usage }),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function kindForCode({ code, type }) {
|
|
86
|
+
if (code !== undefined && POLICY_CODES.has(code))
|
|
87
|
+
return 'policy_violation';
|
|
88
|
+
if ((code !== undefined && QUOTA_CODES.has(code)) || type === 'insufficient_quota') {
|
|
89
|
+
return 'quota_exceeded';
|
|
90
|
+
}
|
|
91
|
+
return code === undefined ? undefined : KIND_BY_CODE[code];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The error in an answer. Besides the format's `{ error: {...} }`, Fireworks
|
|
95
|
+
* also answers FastAPI's `{ detail }`: a message, an error, or a list of
|
|
96
|
+
* validation errors.
|
|
97
|
+
*/
|
|
98
|
+
function readError(body) {
|
|
99
|
+
if (isObject(body) && body['error'] === undefined && body['detail'] !== undefined) {
|
|
100
|
+
const detail = body['detail'];
|
|
101
|
+
if (typeof detail === 'string')
|
|
102
|
+
return { fields: { message: detail }, detail };
|
|
103
|
+
if (isArray(detail))
|
|
104
|
+
return { fields: validationErrors(detail), detail };
|
|
105
|
+
return { fields: errorFields(detail), detail };
|
|
106
|
+
}
|
|
107
|
+
const detail = isObject(body) && body['error'] !== undefined ? body['error'] : body;
|
|
108
|
+
return { fields: errorFields(detail), detail };
|
|
109
|
+
}
|
|
110
|
+
function errorFields(detail) {
|
|
111
|
+
if (!isObject(detail))
|
|
112
|
+
return {};
|
|
113
|
+
const { message, code, type, param } = detail;
|
|
114
|
+
return {
|
|
115
|
+
...(typeof message === 'string' ? { message } : {}),
|
|
116
|
+
...(typeof code === 'string' || typeof code === 'number' ? { code: String(code) } : {}),
|
|
117
|
+
...(typeof type === 'string' ? { type } : {}),
|
|
118
|
+
...(typeof param === 'string' ? { param } : {}),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** FastAPI's validation errors: `[{ loc: ["body", "temperature"], msg }]`. */
|
|
122
|
+
function validationErrors(list) {
|
|
123
|
+
const entries = list.filter(isObject).map((entry) => {
|
|
124
|
+
const loc = entry['loc'];
|
|
125
|
+
const msg = entry['msg'];
|
|
126
|
+
const path = isArray(loc)
|
|
127
|
+
? loc
|
|
128
|
+
.filter((part) => part !== 'body')
|
|
129
|
+
.map((part) => show(part))
|
|
130
|
+
.join('.')
|
|
131
|
+
: '';
|
|
132
|
+
return { param: path, message: typeof msg === 'string' ? msg : '' };
|
|
133
|
+
});
|
|
134
|
+
const message = entries
|
|
135
|
+
.map((entry) => (entry.param === '' ? entry.message : `${entry.param}: ${entry.message}`))
|
|
136
|
+
.filter((text) => text !== '')
|
|
137
|
+
.join('; ');
|
|
138
|
+
const only = entries.length === 1 ? entries[0]?.param : undefined;
|
|
139
|
+
return {
|
|
140
|
+
...(message === '' ? {} : { message }),
|
|
141
|
+
...(only === undefined || only === '' ? {} : { param: only }),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/client/responses/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { JsonObject } from '@acentric/types';
|
|
2
|
+
import type { LlmFailureKind } from '../../failure.js';
|
|
3
|
+
import type { Credentials, ProviderOf } from '../../providers.js';
|
|
4
|
+
/** The providers called through the Responses format. */
|
|
5
|
+
export type ResponsesProvider = ProviderOf<'openai-responses'>;
|
|
6
|
+
export type ResponsesProfile<P extends ResponsesProvider> = {
|
|
7
|
+
readonly provider: P;
|
|
8
|
+
/** Names the provider in messages, such as "OpenAI". */
|
|
9
|
+
readonly label: string;
|
|
10
|
+
/** The create-response URL. */
|
|
11
|
+
readonly url: string;
|
|
12
|
+
/** Authentication and other headers. */
|
|
13
|
+
headers(credentials: Credentials<P>): {
|
|
14
|
+
readonly [name: string]: string;
|
|
15
|
+
};
|
|
16
|
+
/** The role mid-conversation system messages are sent with. */
|
|
17
|
+
readonly systemRole: 'system' | 'developer';
|
|
18
|
+
/** Whether file parts work. When not, they are refused, since the provider drops them without a word. */
|
|
19
|
+
readonly files: boolean;
|
|
20
|
+
/** Whether images and files may be a file ID in the provider's own storage. */
|
|
21
|
+
readonly fileIds: boolean;
|
|
22
|
+
/** Whether custom tools work. When not, they and their results are refused. */
|
|
23
|
+
readonly customTools: boolean;
|
|
24
|
+
/** Response fields that only repeat the request, left out of `native`. */
|
|
25
|
+
readonly echoFields: readonly string[];
|
|
26
|
+
/** Fields the provider writes on output items but refuses on input, left out when sending back. */
|
|
27
|
+
readonly outputOnlyFields: readonly string[];
|
|
28
|
+
/**
|
|
29
|
+
* What to multiply standard prices by for how the response was served, or
|
|
30
|
+
* undefined when that is not known, which means no cost estimate.
|
|
31
|
+
*/
|
|
32
|
+
priceMultiplier(native: JsonObject, options: JsonObject): number | undefined;
|
|
33
|
+
/** The provider's own reading of an error the format does not recognize. */
|
|
34
|
+
classifyError?(error: ErrorInput): ErrorReading | undefined;
|
|
35
|
+
};
|
|
36
|
+
/** What a profile sees of an error. */
|
|
37
|
+
export type ErrorInput = {
|
|
38
|
+
/** Left out for a failed response that came with HTTP 200. */
|
|
39
|
+
readonly status?: number;
|
|
40
|
+
readonly code?: string;
|
|
41
|
+
readonly type?: string;
|
|
42
|
+
readonly message?: string;
|
|
43
|
+
};
|
|
44
|
+
/** What an error means, where the provider's own code does not say. */
|
|
45
|
+
export type ErrorReading = {
|
|
46
|
+
readonly kind: LlmFailureKind;
|
|
47
|
+
/** The request field at fault, when the error does not name it. */
|
|
48
|
+
readonly param?: string;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/client/responses/profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAElE,yDAAyD;AACzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAE/D,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,IAAI;IAC1D,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAC1E,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC5C,yGAAyG;IACzG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,mGAAmG;IACnG,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7E,4EAA4E;IAC5E,aAAa,CAAC,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;CAC7D,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAAG;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/client/responses/profile.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uEAAuE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/client/responses/providers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,eAAO,MAAM,aAAa,EAAE,gBAAgB,CAAC,QAAQ,CAoCpD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,CAAC,WAAW,CAyC1D,CAAC"}
|