@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,75 @@
|
|
|
1
|
+
// The providers on the Responses format: OpenAI and Fireworks.
|
|
2
|
+
/** OpenAI's prices for the tier that served a response. Other tiers' are not published. */
|
|
3
|
+
const OPENAI_TIERS = { default: 1, flex: 0.5 };
|
|
4
|
+
export const openAiProfile = {
|
|
5
|
+
provider: 'openai',
|
|
6
|
+
label: 'OpenAI',
|
|
7
|
+
url: 'https://api.openai.com/v1/responses',
|
|
8
|
+
systemRole: 'developer',
|
|
9
|
+
files: true,
|
|
10
|
+
fileIds: true,
|
|
11
|
+
customTools: true,
|
|
12
|
+
echoFields: ['prompt', 'prompt_cache_retention', 'prompt_cache_options'],
|
|
13
|
+
// Written on output items and refused on input.
|
|
14
|
+
outputOnlyFields: ['created_by'],
|
|
15
|
+
headers({ apiKey, organization, project }) {
|
|
16
|
+
return {
|
|
17
|
+
authorization: `Bearer ${apiKey}`,
|
|
18
|
+
...(organization === undefined ? {} : { 'openai-organization': organization }),
|
|
19
|
+
...(project === undefined ? {} : { 'openai-project': project }),
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
priceMultiplier(native) {
|
|
23
|
+
const tier = native['service_tier'];
|
|
24
|
+
return OPENAI_TIERS[typeof tier === 'string' ? tier : 'default'];
|
|
25
|
+
},
|
|
26
|
+
classifyError({ status, message }) {
|
|
27
|
+
// Some context window errors come without the context_length_exceeded code.
|
|
28
|
+
if (status === 400 &&
|
|
29
|
+
message !== undefined &&
|
|
30
|
+
/exceeds the context window|maximum context length/i.test(message)) {
|
|
31
|
+
return { kind: 'context_overflow' };
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export const fireworksProfile = {
|
|
37
|
+
provider: 'fireworks',
|
|
38
|
+
label: 'Fireworks',
|
|
39
|
+
url: 'https://api.fireworks.ai/inference/v1/responses',
|
|
40
|
+
systemRole: 'system',
|
|
41
|
+
// Fireworks drops file parts without an error, has no file storage, and
|
|
42
|
+
// takes custom tools its models never call.
|
|
43
|
+
files: false,
|
|
44
|
+
fileIds: false,
|
|
45
|
+
customTools: false,
|
|
46
|
+
// Fireworks repeats the reasoning settings it was sent; they say nothing new.
|
|
47
|
+
echoFields: ['reasoning'],
|
|
48
|
+
outputOnlyFields: ['created_by'],
|
|
49
|
+
headers({ apiKey }) {
|
|
50
|
+
return { authorization: `Bearer ${apiKey}` };
|
|
51
|
+
},
|
|
52
|
+
// The response does not say which tier served it. Standard prices hold
|
|
53
|
+
// unless the request asked for another tier, whose prices differ by model.
|
|
54
|
+
priceMultiplier(_native, options) {
|
|
55
|
+
const tier = options['service_tier'];
|
|
56
|
+
return tier === undefined || tier === null || tier === 'default' ? 1 : undefined;
|
|
57
|
+
},
|
|
58
|
+
classifyError({ status, message }) {
|
|
59
|
+
// A previous response that is unknown, expired or not stored: a bare 404 `{ detail }`.
|
|
60
|
+
if (status === 404 && message !== undefined && /^previous response not found/i.test(message)) {
|
|
61
|
+
return { kind: 'not_found', param: 'previous_response_id' };
|
|
62
|
+
}
|
|
63
|
+
if (message !== undefined &&
|
|
64
|
+
/prompt is too long|exceeds maximum context length/i.test(message)) {
|
|
65
|
+
return { kind: 'context_overflow' };
|
|
66
|
+
}
|
|
67
|
+
if (status === 402)
|
|
68
|
+
return { kind: 'quota_exceeded' };
|
|
69
|
+
// A suspended account.
|
|
70
|
+
if (status === 412)
|
|
71
|
+
return { kind: 'auth' };
|
|
72
|
+
return undefined;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/client/responses/providers.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAI/D,2FAA2F;AAC3F,MAAM,YAAY,GAAwC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAEpF,MAAM,CAAC,MAAM,aAAa,GAA+B;IACvD,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,QAAQ;IACf,GAAG,EAAE,qCAAqC;IAC1C,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,wBAAwB,EAAE,sBAAsB,CAAC;IACxE,gDAAgD;IAChD,gBAAgB,EAAE,CAAC,YAAY,CAAC;IAEhC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE;QACvC,OAAO;YACL,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,YAAY,EAAE,CAAC;YAC9E,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;SAChE,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,MAAM;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,YAAY,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;QAC/B,4EAA4E;QAC5E,IACE,MAAM,KAAK,GAAG;YACd,OAAO,KAAK,SAAS;YACrB,oDAAoD,CAAC,IAAI,CAAC,OAAO,CAAC,EAClE,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC7D,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,iDAAiD;IACtD,UAAU,EAAE,QAAQ;IACpB,wEAAwE;IACxE,4CAA4C;IAC5C,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,KAAK;IAClB,8EAA8E;IAC9E,UAAU,EAAE,CAAC,WAAW,CAAC;IACzB,gBAAgB,EAAE,CAAC,YAAY,CAAC;IAEhC,OAAO,CAAC,EAAE,MAAM,EAAE;QAChB,OAAO,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,uEAAuE;IACvE,2EAA2E;IAC3E,eAAe,CAAC,OAAO,EAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,CAAC;IAED,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE;QAC/B,uFAAuF;QACvF,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,KAAK,SAAS,IAAI,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7F,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAC9D,CAAC;QACD,IACE,OAAO,KAAK,SAAS;YACrB,oDAAoD,CAAC,IAAI,CAAC,OAAO,CAAC,EAClE,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;QACtD,uBAAuB;QACvB,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonObject } from '@acentric/types';
|
|
2
|
+
import type { LlmRequest } from '../../request.js';
|
|
3
|
+
import type { ResponsesProfile, ResponsesProvider } from './profile.js';
|
|
4
|
+
export declare function buildRequest<P extends ResponsesProvider>(request: LlmRequest<P>, profile: ResponsesProfile<P>): JsonObject;
|
|
5
|
+
//# sourceMappingURL=request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/client/responses/request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAQ,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAKxE,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,EACtD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,UAAU,CAiCZ"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// The body of a Responses create-response request. Requests may come from
|
|
2
|
+
// a log or, at the gateway, from anyone, so every shape is checked as it is
|
|
3
|
+
// written, and anything the provider would drop without a word is refused.
|
|
4
|
+
import { isArray, isObject } from '../../json.js';
|
|
5
|
+
import { invalidRequest, ownFields, plainText, show } from '../util.js';
|
|
6
|
+
/** Request fields the request itself sets. */
|
|
7
|
+
const OWNED_OPTIONS = ['model', 'input', 'instructions'];
|
|
8
|
+
export function buildRequest(request, profile) {
|
|
9
|
+
const { provider } = profile;
|
|
10
|
+
const options = ownFields(provider, request.options, OWNED_OPTIONS, 'request', 'options');
|
|
11
|
+
if (options['stream'] === true) {
|
|
12
|
+
throw invalidRequest(provider, 'streaming is not supported: a call returns one finished response');
|
|
13
|
+
}
|
|
14
|
+
if (options['background'] === true) {
|
|
15
|
+
throw invalidRequest(provider, 'background mode is not supported: a call returns one finished response');
|
|
16
|
+
}
|
|
17
|
+
const { tools: nativeTools, ...rest } = options;
|
|
18
|
+
if (nativeTools !== undefined && !isArray(nativeTools)) {
|
|
19
|
+
throw invalidRequest(provider, 'options.tools must be an array of native tool definitions');
|
|
20
|
+
}
|
|
21
|
+
const messages = request.messages;
|
|
22
|
+
if (!isArray(messages))
|
|
23
|
+
throw invalidRequest(provider, 'messages must be an array');
|
|
24
|
+
const instructions = buildInstructions(provider, request.instructions);
|
|
25
|
+
const tools = [
|
|
26
|
+
...(request.tools ?? []).map((tool, index) => buildTool(tool, `tools[${index}]`, profile)),
|
|
27
|
+
...(nativeTools ?? []),
|
|
28
|
+
];
|
|
29
|
+
return {
|
|
30
|
+
...rest,
|
|
31
|
+
model: request.model,
|
|
32
|
+
...(instructions === undefined ? {} : { instructions }),
|
|
33
|
+
input: messages.flatMap((message, index) => buildItems(message, `messages[${index}]`, profile)),
|
|
34
|
+
...(tools.length > 0 ? { tools } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function buildInstructions(provider, value) {
|
|
38
|
+
if (value === undefined || typeof value === 'string')
|
|
39
|
+
return value;
|
|
40
|
+
if (!isArray(value))
|
|
41
|
+
throw invalidRequest(provider, 'instructions must be a string or text parts');
|
|
42
|
+
const texts = value.map((part, index) => {
|
|
43
|
+
if (!isObject(part) || part['type'] !== 'text' || typeof part['text'] !== 'string') {
|
|
44
|
+
throw invalidRequest(provider, `instructions[${index}] must be a text part`);
|
|
45
|
+
}
|
|
46
|
+
if (part['providerOptions'] !== undefined) {
|
|
47
|
+
throw invalidRequest(provider, `instructions[${index}].providerOptions is not taken: instructions are one string here. ` +
|
|
48
|
+
'Send a system message for options such as a cache breakpoint');
|
|
49
|
+
}
|
|
50
|
+
return part['text'];
|
|
51
|
+
});
|
|
52
|
+
return texts.length > 0 ? texts.join('\n\n') : undefined;
|
|
53
|
+
}
|
|
54
|
+
function buildItems(message, where, profile) {
|
|
55
|
+
const { provider, label } = profile;
|
|
56
|
+
if (!isObject(message))
|
|
57
|
+
throw invalidRequest(provider, `${where} must be a message`);
|
|
58
|
+
switch (message['role']) {
|
|
59
|
+
case 'user':
|
|
60
|
+
return [
|
|
61
|
+
{ type: 'message', role: 'user', content: buildParts(message['content'], where, profile) },
|
|
62
|
+
];
|
|
63
|
+
case 'system':
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
type: 'message',
|
|
67
|
+
role: profile.systemRole,
|
|
68
|
+
content: buildParts(message['content'], where, profile, true),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
case 'assistant':
|
|
72
|
+
if (message['provider'] !== provider) {
|
|
73
|
+
throw invalidRequest(provider, `${where} is from ${show(message['provider'])}: convert it before sending it to ${label}`);
|
|
74
|
+
}
|
|
75
|
+
return items(provider, message['content'], where).map((item) => outputOnly(item, profile.outputOnlyFields));
|
|
76
|
+
case 'native':
|
|
77
|
+
if (message['provider'] !== provider) {
|
|
78
|
+
throw invalidRequest(provider, `${where} holds ${show(message['provider'])} items, which ${label} cannot take`);
|
|
79
|
+
}
|
|
80
|
+
return items(provider, message['content'], where);
|
|
81
|
+
case 'tool_result':
|
|
82
|
+
return [buildToolResult(message, where, profile)];
|
|
83
|
+
case 'custom':
|
|
84
|
+
throw invalidRequest(provider, `${where} is the application's own: leave custom messages out`);
|
|
85
|
+
default:
|
|
86
|
+
throw invalidRequest(provider, `${where} has an unknown role: ${show(message['role'])}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function items(provider, value, where) {
|
|
90
|
+
if (!isArray(value))
|
|
91
|
+
throw invalidRequest(provider, `${where}.content must be an array of items`);
|
|
92
|
+
return value.map((item, index) => {
|
|
93
|
+
if (!isObject(item) || typeof item['type'] !== 'string') {
|
|
94
|
+
throw invalidRequest(provider, `${where}.content[${index}] must be an item with a type`);
|
|
95
|
+
}
|
|
96
|
+
return item;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** An output item without the fields the provider writes but refuses back. */
|
|
100
|
+
function outputOnly(item, fields) {
|
|
101
|
+
if (!fields.some((field) => field in item))
|
|
102
|
+
return item;
|
|
103
|
+
return Object.fromEntries(Object.entries(item).filter(([key]) => !fields.includes(key)));
|
|
104
|
+
}
|
|
105
|
+
function buildToolResult(message, where, profile) {
|
|
106
|
+
const { provider, label } = profile;
|
|
107
|
+
const callId = message['toolCallId'];
|
|
108
|
+
if (typeof callId !== 'string' || callId === '') {
|
|
109
|
+
throw invalidRequest(provider, `${where}.toolCallId must be a string that is not empty`);
|
|
110
|
+
}
|
|
111
|
+
const toolType = message['toolType'] ?? 'function';
|
|
112
|
+
if (toolType !== 'function' && toolType !== 'custom') {
|
|
113
|
+
throw invalidRequest(provider, `${where}.toolType must be function or custom`);
|
|
114
|
+
}
|
|
115
|
+
if (toolType === 'custom' && !profile.customTools) {
|
|
116
|
+
throw invalidRequest(provider, `${where} answers a custom tool, and ${label} has none`);
|
|
117
|
+
}
|
|
118
|
+
const fields = ownFields(provider, message['providerOptions'], ['type', 'call_id', 'output'], where);
|
|
119
|
+
return {
|
|
120
|
+
...fields,
|
|
121
|
+
type: toolType === 'function' ? 'function_call_output' : 'custom_tool_call_output',
|
|
122
|
+
call_id: callId,
|
|
123
|
+
output: plainText(message['content']) ?? buildParts(message['content'], where, profile),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function buildParts(value, where, profile, textOnly = false) {
|
|
127
|
+
const { provider } = profile;
|
|
128
|
+
if (!isArray(value))
|
|
129
|
+
throw invalidRequest(provider, `${where}.content must be an array of parts`);
|
|
130
|
+
return value.map((part, index) => {
|
|
131
|
+
const at = `${where}.content[${index}]`;
|
|
132
|
+
if (!isObject(part))
|
|
133
|
+
throw invalidRequest(provider, `${at} must be a content part`);
|
|
134
|
+
if (textOnly && part['type'] !== 'text')
|
|
135
|
+
throw invalidRequest(provider, `${at} must be a text part`);
|
|
136
|
+
return buildPart(part, at, profile);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function buildPart(part, at, profile) {
|
|
140
|
+
const { provider, label } = profile;
|
|
141
|
+
const options = part['providerOptions'];
|
|
142
|
+
switch (part['type']) {
|
|
143
|
+
case 'text': {
|
|
144
|
+
const text = part['text'];
|
|
145
|
+
if (typeof text !== 'string')
|
|
146
|
+
throw invalidRequest(provider, `${at}.text must be a string`);
|
|
147
|
+
return { ...ownFields(provider, options, ['type', 'text'], at), type: 'input_text', text };
|
|
148
|
+
}
|
|
149
|
+
case 'image': {
|
|
150
|
+
const fields = ownFields(provider, options, ['type', 'image_url', 'file_id'], at);
|
|
151
|
+
const source = checkSource(part['source'], at, profile);
|
|
152
|
+
return {
|
|
153
|
+
...fields,
|
|
154
|
+
type: 'input_image',
|
|
155
|
+
...(source.type === 'url'
|
|
156
|
+
? { image_url: source.url }
|
|
157
|
+
: source.type === 'base64'
|
|
158
|
+
? { image_url: dataUrl(source.mediaType, source.data) }
|
|
159
|
+
: { file_id: source.id }),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
case 'file': {
|
|
163
|
+
if (!profile.files) {
|
|
164
|
+
throw invalidRequest(provider, `${at} is a file, which ${label} would drop without a word`);
|
|
165
|
+
}
|
|
166
|
+
const owned = ['type', 'file_url', 'file_data', 'file_id', 'filename'];
|
|
167
|
+
const fields = ownFields(provider, options, owned, at);
|
|
168
|
+
const source = checkSource(part['source'], at, profile);
|
|
169
|
+
const filename = part['filename'];
|
|
170
|
+
if (filename !== undefined && typeof filename !== 'string') {
|
|
171
|
+
throw invalidRequest(provider, `${at}.filename must be a string`);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
...fields,
|
|
175
|
+
type: 'input_file',
|
|
176
|
+
...(source.type === 'url'
|
|
177
|
+
? { file_url: source.url }
|
|
178
|
+
: source.type === 'base64'
|
|
179
|
+
? { file_data: dataUrl(source.mediaType, source.data) }
|
|
180
|
+
: { file_id: source.id }),
|
|
181
|
+
...(filename === undefined ? {} : { filename }),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
throw invalidRequest(provider, `${at} has an unknown type: ${show(part['type'])}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function checkSource(source, at, profile) {
|
|
189
|
+
const { provider, label } = profile;
|
|
190
|
+
if (isObject(source)) {
|
|
191
|
+
const { type, url, id, data, mediaType } = source;
|
|
192
|
+
if (type === 'url' && typeof url === 'string')
|
|
193
|
+
return { type, url };
|
|
194
|
+
if (type === 'base64' && typeof data === 'string' && typeof mediaType === 'string') {
|
|
195
|
+
return { type, mediaType, data };
|
|
196
|
+
}
|
|
197
|
+
if (type === 'file_id' && typeof id === 'string') {
|
|
198
|
+
if (!profile.fileIds) {
|
|
199
|
+
throw invalidRequest(provider, `${at}.source is a file ID, which ${label} cannot take: send a URL or base64 data`);
|
|
200
|
+
}
|
|
201
|
+
return { type, id };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
throw invalidRequest(provider, `${at}.source must be a url, base64 or file_id source`);
|
|
205
|
+
}
|
|
206
|
+
function dataUrl(mediaType, base64) {
|
|
207
|
+
return `data:${mediaType};base64,${base64}`;
|
|
208
|
+
}
|
|
209
|
+
function buildTool(tool, where, profile) {
|
|
210
|
+
const { provider, label } = profile;
|
|
211
|
+
if (!isObject(tool) ||
|
|
212
|
+
typeof tool['name'] !== 'string' ||
|
|
213
|
+
typeof tool['description'] !== 'string') {
|
|
214
|
+
throw invalidRequest(provider, `${where} needs a type, a name and a description`);
|
|
215
|
+
}
|
|
216
|
+
const { name, description, parameters, strict, format } = tool;
|
|
217
|
+
const at = `tool ${name}`;
|
|
218
|
+
if (tool['type'] === 'function') {
|
|
219
|
+
const owned = ['type', 'name', 'description', 'parameters', 'strict'];
|
|
220
|
+
const fields = ownFields(provider, tool['providerOptions'], owned, at);
|
|
221
|
+
if (!isObject(parameters))
|
|
222
|
+
throw invalidRequest(provider, `${at}: parameters must be a JSON Schema object`);
|
|
223
|
+
// A `strict` left out stays out: the provider treats it differently from false.
|
|
224
|
+
return {
|
|
225
|
+
...fields,
|
|
226
|
+
type: 'function',
|
|
227
|
+
name,
|
|
228
|
+
description,
|
|
229
|
+
parameters,
|
|
230
|
+
...(strict === undefined ? {} : { strict }),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (tool['type'] === 'custom') {
|
|
234
|
+
if (!profile.customTools) {
|
|
235
|
+
throw invalidRequest(provider, `${at} is a custom tool, which ${label} cannot take: use a function tool`);
|
|
236
|
+
}
|
|
237
|
+
const fields = ownFields(provider, tool['providerOptions'], ['type', 'name', 'description', 'format'], at);
|
|
238
|
+
return {
|
|
239
|
+
...fields,
|
|
240
|
+
type: 'custom',
|
|
241
|
+
name,
|
|
242
|
+
description,
|
|
243
|
+
...(format === undefined ? {} : { format }),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
throw invalidRequest(provider, `${where} has an unknown type: ${show(tool['type'])}`);
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/client/responses/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JsonObject } from '@acentric/types';
|
|
2
|
+
import type { LlmRequest } from '../../request.js';
|
|
3
|
+
import type { LlmResponse } from '../../response.js';
|
|
4
|
+
import type { Usage } from '../../usage.js';
|
|
5
|
+
import type { JsonAnswer } from '../http.js';
|
|
6
|
+
import type { ResponsesProfile, ResponsesProvider } from './profile.js';
|
|
7
|
+
export declare function parseResponse<P extends ResponsesProvider>(request: LlmRequest<P>, answer: JsonAnswer, profile: ResponsesProfile<P>): LlmResponse<P>;
|
|
8
|
+
/** Usage as the format reports it: `input_tokens` is every prompt token, cache reads and writes among them. */
|
|
9
|
+
export declare function readUsage(raw: JsonObject): Usage;
|
|
10
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/client/responses/response.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA4CxE,wBAAgB,aAAa,CAAC,CAAC,SAAS,iBAAiB,EACvD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,WAAW,CAAC,CAAC,CAAC,CA0EhB;AAED,+GAA+G;AAC/G,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,KAAK,CAsBhD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// A Responses answer read into an LlmResponse.
|
|
2
|
+
import { estimateCost } from '../../cost.js';
|
|
3
|
+
import { LlmError } from '../../failure.js';
|
|
4
|
+
import { isArray, isObject } from '../../json.js';
|
|
5
|
+
import { findModel } from '../../models.js';
|
|
6
|
+
import { pendingToolCalls } from '../../read/responses.js';
|
|
7
|
+
import { invalidResponse, omit, tokens, show } from '../util.js';
|
|
8
|
+
import { failedResponse } from './errors.js';
|
|
9
|
+
/** Response fields every Responses provider repeats from the request, or that the response already holds. */
|
|
10
|
+
const ECHO_FIELDS = [
|
|
11
|
+
'id',
|
|
12
|
+
'object',
|
|
13
|
+
'model',
|
|
14
|
+
'output',
|
|
15
|
+
'output_text',
|
|
16
|
+
'usage',
|
|
17
|
+
'error',
|
|
18
|
+
'instructions',
|
|
19
|
+
'tools',
|
|
20
|
+
'tool_choice',
|
|
21
|
+
'parallel_tool_calls',
|
|
22
|
+
'max_output_tokens',
|
|
23
|
+
'max_tool_calls',
|
|
24
|
+
'temperature',
|
|
25
|
+
'top_p',
|
|
26
|
+
'top_logprobs',
|
|
27
|
+
'frequency_penalty',
|
|
28
|
+
'presence_penalty',
|
|
29
|
+
'text',
|
|
30
|
+
'truncation',
|
|
31
|
+
'store',
|
|
32
|
+
'background',
|
|
33
|
+
'previous_response_id',
|
|
34
|
+
'conversation',
|
|
35
|
+
'prompt_cache_key',
|
|
36
|
+
'safety_identifier',
|
|
37
|
+
'user',
|
|
38
|
+
'metadata',
|
|
39
|
+
'include',
|
|
40
|
+
];
|
|
41
|
+
/** Usage fields `readUsage` maps; anything else in `usage` stays in `native.usage`. */
|
|
42
|
+
const TOKEN_FIELDS = {
|
|
43
|
+
input_tokens: true,
|
|
44
|
+
output_tokens: true,
|
|
45
|
+
total_tokens: true,
|
|
46
|
+
input_tokens_details: ['cached_tokens', 'cache_write_tokens'],
|
|
47
|
+
output_tokens_details: ['reasoning_tokens'],
|
|
48
|
+
};
|
|
49
|
+
export function parseResponse(request, answer, profile) {
|
|
50
|
+
const { provider, label } = profile;
|
|
51
|
+
const body = answer.body;
|
|
52
|
+
if (!isObject(body))
|
|
53
|
+
throw invalidResponse(provider, `${label} did not answer with a response`, body);
|
|
54
|
+
const id = typeof body['id'] === 'string' && body['id'] !== '' ? body['id'] : undefined;
|
|
55
|
+
const rawUsage = body['usage'];
|
|
56
|
+
const usage = isObject(rawUsage) ? readUsage(rawUsage) : undefined;
|
|
57
|
+
// A failure can come with HTTP 200, as a failed response or a bare error.
|
|
58
|
+
const error = body['error'];
|
|
59
|
+
if (body['status'] === 'failed' || (error !== null && error !== undefined)) {
|
|
60
|
+
throw failedResponse(profile, error ?? null, id, usage);
|
|
61
|
+
}
|
|
62
|
+
const output = body['output'];
|
|
63
|
+
const status = body['status'];
|
|
64
|
+
if (body['object'] !== 'response' || !isArray(output)) {
|
|
65
|
+
throw invalidResponse(provider, `${label} did not answer with a response`, body);
|
|
66
|
+
}
|
|
67
|
+
if (status === 'cancelled') {
|
|
68
|
+
throw new LlmError(`${label} cancelled the response`, {
|
|
69
|
+
kind: 'cancelled',
|
|
70
|
+
provider,
|
|
71
|
+
...(id === undefined ? {} : { responseId: id }),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (status !== 'completed' && status !== 'incomplete') {
|
|
75
|
+
throw invalidResponse(provider, `${label} answered with a ${show(status)} response, not a finished one`, body);
|
|
76
|
+
}
|
|
77
|
+
const details = body['incomplete_details'];
|
|
78
|
+
const incomplete = isObject(details) && typeof details['reason'] === 'string' ? details['reason'] : undefined;
|
|
79
|
+
const extras = isObject(rawUsage) ? usageExtras(rawUsage) : undefined;
|
|
80
|
+
const native = {
|
|
81
|
+
...omit(body, [...ECHO_FIELDS, ...profile.echoFields]),
|
|
82
|
+
...(extras === undefined ? {} : { usage: extras }),
|
|
83
|
+
};
|
|
84
|
+
const served = typeof body['model'] === 'string' ? body['model'] : undefined;
|
|
85
|
+
const pricing = (findModel(provider, request.model) ?? findModel(provider, served ?? ''))
|
|
86
|
+
?.pricing;
|
|
87
|
+
const multiplier = profile.priceMultiplier(native, request.options ?? {});
|
|
88
|
+
const cost = usage === undefined || multiplier === undefined
|
|
89
|
+
? undefined
|
|
90
|
+
: estimateCost(usage, pricing, { multiplier });
|
|
91
|
+
const response = {
|
|
92
|
+
...(id === undefined ? {} : { id }),
|
|
93
|
+
provider,
|
|
94
|
+
model: request.model,
|
|
95
|
+
...(served === undefined || served === request.model ? {} : { responseModel: served }),
|
|
96
|
+
message: {
|
|
97
|
+
role: 'assistant',
|
|
98
|
+
provider,
|
|
99
|
+
api: 'openai-responses',
|
|
100
|
+
model: request.model,
|
|
101
|
+
...(id === undefined ? {} : { id }),
|
|
102
|
+
timestamp: answer.timestamp,
|
|
103
|
+
content: output,
|
|
104
|
+
},
|
|
105
|
+
stopReason: stopReason(status, incomplete, output),
|
|
106
|
+
...(incomplete === undefined ? {} : { providerStopReason: incomplete }),
|
|
107
|
+
...(usage === undefined ? {} : { usage: cost === undefined ? usage : { ...usage, cost } }),
|
|
108
|
+
native,
|
|
109
|
+
durationMs: answer.durationMs,
|
|
110
|
+
timestamp: answer.timestamp,
|
|
111
|
+
};
|
|
112
|
+
// The output is the provider's own items, which the format's types describe.
|
|
113
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion
|
|
114
|
+
return response;
|
|
115
|
+
}
|
|
116
|
+
/** Usage as the format reports it: `input_tokens` is every prompt token, cache reads and writes among them. */
|
|
117
|
+
export function readUsage(raw) {
|
|
118
|
+
const details = isObject(raw['input_tokens_details']) ? raw['input_tokens_details'] : {};
|
|
119
|
+
const outputDetails = isObject(raw['output_tokens_details']) ? raw['output_tokens_details'] : {};
|
|
120
|
+
const totalInput = tokens(raw['input_tokens']);
|
|
121
|
+
const cacheRead = tokens(details['cached_tokens']);
|
|
122
|
+
const cacheWrite = tokens(details['cache_write_tokens']);
|
|
123
|
+
const output = tokens(raw['output_tokens']);
|
|
124
|
+
const reasoning = tokens(outputDetails['reasoning_tokens']);
|
|
125
|
+
// A model with no cache writes reports none; the uncached rest is still known.
|
|
126
|
+
const cached = (cacheRead ?? 0) + (cacheWrite ?? 0);
|
|
127
|
+
const input = totalInput !== undefined && cacheRead !== undefined && cached <= totalInput
|
|
128
|
+
? totalInput - cached
|
|
129
|
+
: undefined;
|
|
130
|
+
return {
|
|
131
|
+
...(totalInput === undefined ? {} : { totalInput }),
|
|
132
|
+
...(input === undefined ? {} : { input }),
|
|
133
|
+
...(output === undefined ? {} : { output }),
|
|
134
|
+
...(reasoning === undefined ? {} : { reasoning }),
|
|
135
|
+
...(cacheRead === undefined ? {} : { cacheRead }),
|
|
136
|
+
...(cacheWrite === undefined ? {} : { cacheWrite }),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** What the provider reports in `usage` beyond the counts `readUsage` maps, or undefined. */
|
|
140
|
+
function usageExtras(raw) {
|
|
141
|
+
const extras = {};
|
|
142
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
143
|
+
const mapped = TOKEN_FIELDS[key];
|
|
144
|
+
if (mapped === true || value === null)
|
|
145
|
+
continue;
|
|
146
|
+
if (mapped === undefined || !isObject(value)) {
|
|
147
|
+
extras[key] = value;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const rest = omit(value, mapped);
|
|
151
|
+
if (Object.keys(rest).length > 0)
|
|
152
|
+
extras[key] = rest;
|
|
153
|
+
}
|
|
154
|
+
return Object.keys(extras).length > 0 ? extras : undefined;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The format has no stop reason: it reports a status, and the output shows
|
|
158
|
+
* the rest.
|
|
159
|
+
*/
|
|
160
|
+
function stopReason(status, incomplete, output) {
|
|
161
|
+
if (status === 'incomplete')
|
|
162
|
+
return incomplete === 'content_filter' ? 'content_filter' : 'length';
|
|
163
|
+
if (pendingToolCalls(output).length > 0)
|
|
164
|
+
return 'tool_use';
|
|
165
|
+
const messages = output.filter((item) => isObject(item) && item['type'] === 'message');
|
|
166
|
+
const refused = messages.some((message) => {
|
|
167
|
+
const content = isObject(message) ? message['content'] : undefined;
|
|
168
|
+
return isArray(content) && content.some((part) => isObject(part) && part['type'] === 'refusal');
|
|
169
|
+
});
|
|
170
|
+
if (refused)
|
|
171
|
+
return 'refusal';
|
|
172
|
+
const answered = messages.some((message) => isObject(message) && message['phase'] !== 'commentary');
|
|
173
|
+
// Work with no final answer (hosted calls, a program, commentary) goes on when sent back.
|
|
174
|
+
return answered || output.length === 0 ? 'stop' : 'pause_turn';
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/client/responses/response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Json, JsonObject } from '@acentric/types';
|
|
2
|
+
import { LlmError } from '../failure.js';
|
|
3
|
+
export declare function invalidRequest(provider: string | undefined, message: string): LlmError;
|
|
4
|
+
export declare function invalidResponse(provider: string, message: string, body?: Json): LlmError;
|
|
5
|
+
/**
|
|
6
|
+
* A part's `providerOptions`, or the request's `options`, refused when it sets
|
|
7
|
+
* a field the client sets itself on the same object: that is never
|
|
8
|
+
* overwritten silently.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ownFields(provider: string, fields: Json | undefined, owned: readonly string[], where: string, field?: string): JsonObject;
|
|
11
|
+
/** A count of tokens: a whole number, zero or more. */
|
|
12
|
+
export declare function tokens(value: Json | undefined): number | undefined;
|
|
13
|
+
/** `record` without `keys`, and without fields that are null, which say nothing. */
|
|
14
|
+
export declare function omit(record: JsonObject, keys: readonly string[]): JsonObject;
|
|
15
|
+
/** Error bodies are cut short, so a proxy's HTML page does not fill a failure. */
|
|
16
|
+
export declare function cut(body: Json): Json;
|
|
17
|
+
/** The text of content that is one text part with no options: sent as a plain string. */
|
|
18
|
+
export declare function plainText(content: Json | undefined): string | undefined;
|
|
19
|
+
/** A value as a message shows it. */
|
|
20
|
+
export declare function show(value: Json | undefined): string;
|
|
21
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/client/util.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAKtF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,QAAQ,CAMxF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,GAAG,SAAS,EACxB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,SAAoB,GACxB,UAAU,CAYZ;AAED,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAK5E;AAED,kFAAkF;AAClF,wBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAEpC;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASvE;AAED,qCAAqC;AACrC,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAEpD"}
|