quidproquo-actionprocessor-awslambda 0.1.5 → 0.1.7
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/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js +8 -3
- package/lib/commonjs/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
- package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +12 -5
- package/lib/commonjs/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
- package/lib/commonjs/getActionProcessor/core/ai/logic/index.d.ts +2 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/index.js +2 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/index.js.map +1 -1
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.d.ts +2 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js +19 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.d.ts +2 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.js +23 -0
- package/lib/commonjs/getActionProcessor/core/ai/logic/toCacheableSystem.js.map +1 -0
- package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js +8 -3
- package/lib/esm/getActionProcessor/core/ai/getAiPromptActionProcessor.js.map +1 -1
- package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js +10 -4
- package/lib/esm/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.js.map +1 -1
- package/lib/esm/getActionProcessor/core/ai/logic/index.d.ts +2 -0
- package/lib/esm/getActionProcessor/core/ai/logic/index.js +2 -0
- package/lib/esm/getActionProcessor/core/ai/logic/index.js.map +1 -1
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.d.ts +2 -0
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js +21 -0
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableMessages.js.map +1 -0
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.d.ts +2 -0
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.js +19 -0
- package/lib/esm/getActionProcessor/core/ai/logic/toCacheableSystem.js.map +1 -0
- package/package.json +7 -7
|
@@ -15,7 +15,7 @@ const ai_1 = require("ai");
|
|
|
15
15
|
const logic_1 = require("./logic");
|
|
16
16
|
const getProcessAiPrompt = (qpqConfig) => {
|
|
17
17
|
return (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
-
var _a;
|
|
18
|
+
var _a, _b, _c;
|
|
19
19
|
const prepared = (0, logic_1.prepareAiPromptCall)(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
|
|
20
20
|
if ('error' in prepared) {
|
|
21
21
|
return (0, quidproquo_core_1.actionResultError)(prepared.error.type, prepared.error.message);
|
|
@@ -23,14 +23,19 @@ const getProcessAiPrompt = (qpqConfig) => {
|
|
|
23
23
|
try {
|
|
24
24
|
const promptOrMessages = payload.messages
|
|
25
25
|
? {
|
|
26
|
-
messages: yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
|
|
26
|
+
messages: (0, logic_1.toCacheableMessages)(yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
|
|
27
27
|
}
|
|
28
28
|
: { prompt: payload.prompt };
|
|
29
29
|
// Extended thinking — the model reasons before answering, within the token budget.
|
|
30
30
|
const providerOptions = payload.reasoning
|
|
31
31
|
? { bedrock: { reasoningConfig: { type: 'enabled', budgetTokens: (_a = payload.reasoning.budgetTokens) !== null && _a !== void 0 ? _a : 4096 } } }
|
|
32
32
|
: undefined;
|
|
33
|
-
const result = yield (0, ai_1.generateText)(Object.assign(Object.assign({ model: prepared.model, system: payload.system }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10) }));
|
|
33
|
+
const result = yield (0, ai_1.generateText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10) }));
|
|
34
|
+
if (payload.caching) {
|
|
35
|
+
// The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
|
|
36
|
+
// field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
|
|
37
|
+
console.log('AI prompt cache usage:', (_c = (_b = result.finalStep) === null || _b === void 0 ? void 0 : _b.usage) === null || _c === void 0 ? void 0 : _c.inputTokenDetails);
|
|
38
|
+
}
|
|
34
39
|
return (0, quidproquo_core_1.actionResult)({ text: result.text });
|
|
35
40
|
}
|
|
36
41
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,2BAA+C;AAE/C,
|
|
1
|
+
{"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDASyB;AAEzB,2BAA+C;AAE/C,mCAA8H;AAE9H,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC3E,OAAO,CAAO,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;;QACjH,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,IAAA,mCAAiB,EAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;gBACvC,CAAC,CAAC;oBACE,QAAQ,EAAE,IAAA,2BAAmB,EAC3B,MAAM,IAAA,qBAAa,EACjB,OAAO,CAAC,QAAQ,EAChB,IAAA,+BAAuB,EAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAC9G,EACD,OAAO,CAAC,OAAO,CAChB;iBACF;gBACH,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAE/B,mFAAmF;YACnF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,MAAA,OAAO,CAAC,SAAS,CAAC,YAAY,mCAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAY,gCAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,MAAM,EAAE,IAAA,yBAAiB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IACvD,gBAAgB,KACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,eAAe,EACf,QAAQ,EAAE,IAAA,gBAAW,EAAC,EAAE,CAAC,IACzB,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,sFAAsF;gBACtF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAA,MAAA,MAAM,CAAC,SAAS,0CAAE,KAAK,0CAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,IAAA,8BAAY,EAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,IAAA,mCAAiB,EAAC,+BAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAA,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,0BAA0B,GAAgC,CAAO,SAAoB,EAAgC,EAAE;IAAC,OAAA,CAAC;QACpI,CAAC,8BAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC;KACrD,CAAC,CAAA;EAAA,CAAC;AAFU,QAAA,0BAA0B,8BAEpC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { generateText, stepCountIs } from 'ai';\n\nimport { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPrompt = (qpqConfig: QPQConfig): AiPromptActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — the model reasons before answering, within the token budget.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const result = await generateText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n });\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n console.log('AI prompt cache usage:', result.finalStep?.usage?.inputTokenDetails);\n }\n\n return actionResult({ text: result.text });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt execution.');\n }\n };\n};\n\nexport const getAiPromptActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.Prompt]: getProcessAiPrompt(qpqConfig),\n});\n"]}
|
|
@@ -44,14 +44,14 @@ const getProcessAiPromptStream = (qpqConfig) => {
|
|
|
44
44
|
try {
|
|
45
45
|
const promptOrMessages = payload.messages
|
|
46
46
|
? {
|
|
47
|
-
messages: yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
|
|
47
|
+
messages: (0, logic_1.toCacheableMessages)(yield (0, logic_1.toSdkMessages)(payload.messages, (0, logic_1.createDriveFileResolver)(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
|
|
48
48
|
}
|
|
49
49
|
: { prompt: payload.prompt };
|
|
50
50
|
// Extended thinking — thinking progress streams out as Reasoning* parts.
|
|
51
51
|
const providerOptions = payload.reasoning
|
|
52
52
|
? { bedrock: { reasoningConfig: { type: 'enabled', budgetTokens: (_a = payload.reasoning.budgetTokens) !== null && _a !== void 0 ? _a : 4096 } } }
|
|
53
53
|
: undefined;
|
|
54
|
-
const { fullStream } = (0, ai_1.streamText)(Object.assign(Object.assign({ model: prepared.model, system: payload.system }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10),
|
|
54
|
+
const { fullStream, finalStep } = (0, ai_1.streamText)(Object.assign(Object.assign({ model: prepared.model, system: (0, logic_1.toCacheableSystem)(payload.system, payload.caching) }, promptOrMessages), { tools: prepared.tools, providerOptions, stopWhen: (0, ai_1.stepCountIs)(10),
|
|
55
55
|
// streamText swallows errors by default to keep the server alive — surface them to CloudWatch.
|
|
56
56
|
onError: ({ error }) => {
|
|
57
57
|
// todo yeild this out
|
|
@@ -61,10 +61,11 @@ const getProcessAiPromptStream = (qpqConfig) => {
|
|
|
61
61
|
function aiStreamIterator() {
|
|
62
62
|
return __asyncGenerator(this, arguments, function* aiStreamIterator_1() {
|
|
63
63
|
var _a, e_1, _b, _c;
|
|
64
|
+
var _d;
|
|
64
65
|
try {
|
|
65
|
-
for (var
|
|
66
|
+
for (var _e = true, fullStream_1 = __asyncValues(fullStream), fullStream_1_1; fullStream_1_1 = yield __await(fullStream_1.next()), _a = fullStream_1_1.done, !_a; _e = true) {
|
|
66
67
|
_c = fullStream_1_1.value;
|
|
67
|
-
|
|
68
|
+
_e = false;
|
|
68
69
|
const part = _c;
|
|
69
70
|
yield yield __await(JSON.stringify((0, logic_1.mapAiStreamPart)(part)));
|
|
70
71
|
}
|
|
@@ -72,10 +73,16 @@ const getProcessAiPromptStream = (qpqConfig) => {
|
|
|
72
73
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
73
74
|
finally {
|
|
74
75
|
try {
|
|
75
|
-
if (!
|
|
76
|
+
if (!_e && !_a && (_b = fullStream_1.return)) yield __await(_b.call(fullStream_1));
|
|
76
77
|
}
|
|
77
78
|
finally { if (e_1) throw e_1.error; }
|
|
78
79
|
}
|
|
80
|
+
if (payload.caching) {
|
|
81
|
+
// The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
|
|
82
|
+
// field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
|
|
83
|
+
const step = yield __await(finalStep);
|
|
84
|
+
console.log('AI prompt cache usage:', (_d = step.usage) === null || _d === void 0 ? void 0 : _d.inputTokenDetails);
|
|
85
|
+
}
|
|
79
86
|
});
|
|
80
87
|
}
|
|
81
88
|
streamRegistry.register(streamId, aiStreamIterator());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDASyB;AAEzB,2BAA6C;AAE7C,4DAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptStreamActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { stepCountIs, streamText } from 'ai';\n\nimport { randomGuid } from '../../../awsLambdaUtils';\nimport { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPromptStream = (qpqConfig: QPQConfig): AiPromptStreamActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — thinking progress streams out as Reasoning* parts.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const { fullStream, finalStep } = streamText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n // streamText swallows errors by default to keep the server alive — surface them to CloudWatch.\n onError: ({ error }) => {\n // todo yeild this out\n console.error('AI prompt stream error:', error);\n },\n });\n\n const streamId = `ai-prompt-${Date.now()}-${randomGuid()}`;\n\n async function* aiStreamIterator(): AsyncIterableIterator<string> {\n for await (const part of fullStream) {\n yield JSON.stringify(mapAiStreamPart(part));\n }\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n const step = await finalStep;\n console.log('AI prompt cache usage:', step.usage?.inputTokenDetails);\n }\n }\n\n streamRegistry.register(streamId, aiStreamIterator());\n\n return actionResult({ id: streamId, encoding: 'json' as const });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt stream.');\n }\n };\n};\n\nexport const getAiPromptStreamActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.PromptStream]: getProcessAiPromptStream(qpqConfig),\n});\n"]}
|
|
@@ -29,5 +29,7 @@ export * from './mapAiStreamToolOutputDenied';
|
|
|
29
29
|
export * from './mapAiStreamToolResult';
|
|
30
30
|
export * from './prepareAiPromptCall';
|
|
31
31
|
export * from './toAiStreamUsage';
|
|
32
|
+
export * from './toCacheableMessages';
|
|
33
|
+
export * from './toCacheableSystem';
|
|
32
34
|
export * from './toErrorMessage';
|
|
33
35
|
export * from './toSdkMessages';
|
|
@@ -45,6 +45,8 @@ __exportStar(require("./mapAiStreamToolOutputDenied"), exports);
|
|
|
45
45
|
__exportStar(require("./mapAiStreamToolResult"), exports);
|
|
46
46
|
__exportStar(require("./prepareAiPromptCall"), exports);
|
|
47
47
|
__exportStar(require("./toAiStreamUsage"), exports);
|
|
48
|
+
__exportStar(require("./toCacheableMessages"), exports);
|
|
49
|
+
__exportStar(require("./toCacheableSystem"), exports);
|
|
48
50
|
__exportStar(require("./toErrorMessage"), exports);
|
|
49
51
|
__exportStar(require("./toSdkMessages"), exports);
|
|
50
52
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,0DAAwC;AACxC,oDAAkC;AAClC,mDAAiC;AACjC,8DAA4C;AAC5C,4DAA0C;AAC1C,iEAA+C;AAC/C,8DAA4C;AAC5C,0DAAwC;AACxC,qDAAmC;AACnC,yDAAuC;AACvC,yDAAuC;AACvC,uDAAqC;AACrC,yDAAuC;AACvC,mEAAiD;AACjD,oEAAkD;AAClD,wDAAsC;AACtC,yDAAuC;AACvC,8DAA4C;AAC5C,4DAA0C;AAC1C,8DAA4C;AAC5C,gEAA8C;AAC9C,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,mDAAiC;AACjC,kDAAgC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamUsage';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,qDAAmC;AACnC,sDAAoC;AACpC,qDAAmC;AACnC,wDAAsC;AACtC,sDAAoC;AACpC,0DAAwC;AACxC,oDAAkC;AAClC,mDAAiC;AACjC,8DAA4C;AAC5C,4DAA0C;AAC1C,iEAA+C;AAC/C,8DAA4C;AAC5C,0DAAwC;AACxC,qDAAmC;AACnC,yDAAuC;AACvC,yDAAuC;AACvC,uDAAqC;AACrC,yDAAuC;AACvC,mEAAiD;AACjD,oEAAkD;AAClD,wDAAsC;AACtC,yDAAuC;AACvC,8DAA4C;AAC5C,4DAA0C;AAC1C,8DAA4C;AAC5C,gEAA8C;AAC9C,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,mDAAiC;AACjC,kDAAgC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamUsage';\nexport * from './toCacheableMessages';\nexport * from './toCacheableSystem';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCacheableMessages = void 0;
|
|
4
|
+
// Marks the newest message as a cache point so the next call in the same conversation can read
|
|
5
|
+
// everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point
|
|
6
|
+
// this is meant to be used alongside — Bedrock's cache lookback only covers a limited number of
|
|
7
|
+
// recent content blocks, so long conversations still need both.
|
|
8
|
+
const toCacheableMessages = (messages, caching) => {
|
|
9
|
+
if (!caching || messages.length === 0) {
|
|
10
|
+
return messages;
|
|
11
|
+
}
|
|
12
|
+
const lastMessage = messages[messages.length - 1];
|
|
13
|
+
return [
|
|
14
|
+
...messages.slice(0, -1),
|
|
15
|
+
Object.assign(Object.assign({}, lastMessage), { providerOptions: Object.assign(Object.assign({}, lastMessage.providerOptions), { bedrock: { cachePoint: { type: 'default' } } }) }),
|
|
16
|
+
];
|
|
17
|
+
};
|
|
18
|
+
exports.toCacheableMessages = toCacheableMessages;
|
|
19
|
+
//# sourceMappingURL=toCacheableMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCacheableMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableMessages.ts"],"names":[],"mappings":";;;AAEA,+FAA+F;AAC/F,iGAAiG;AACjG,gGAAgG;AAChG,gEAAgE;AACzD,MAAM,mBAAmB,GAAG,CAAC,QAAwB,EAAE,OAA4B,EAAkB,EAAE;IAC5G,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wCAEnB,WAAW,KACd,eAAe,kCACV,WAAW,CAAC,eAAe,KAC9B,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;KAGjD,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,mBAAmB,uBAiB9B","sourcesContent":["import type { ModelMessage } from 'ai';\n\n// Marks the newest message as a cache point so the next call in the same conversation can read\n// everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point\n// this is meant to be used alongside — Bedrock's cache lookback only covers a limited number of\n// recent content blocks, so long conversations still need both.\nexport const toCacheableMessages = (messages: ModelMessage[], caching: boolean | undefined): ModelMessage[] => {\n if (!caching || messages.length === 0) {\n return messages;\n }\n\n const lastMessage = messages[messages.length - 1];\n\n return [\n ...messages.slice(0, -1),\n {\n ...lastMessage,\n providerOptions: {\n ...lastMessage.providerOptions,\n bedrock: { cachePoint: { type: 'default' } },\n },\n },\n ];\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCacheableSystem = void 0;
|
|
4
|
+
// Bedrock only reads cache points off message objects, not the bare `system` string, so caching
|
|
5
|
+
// requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no
|
|
6
|
+
// equivalent hook for the tools array, so tool definitions can't be cached this way yet.
|
|
7
|
+
const toCacheableSystem = (system, caching) => {
|
|
8
|
+
if (!system) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
if (!caching) {
|
|
12
|
+
return system;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
role: 'system',
|
|
16
|
+
content: system,
|
|
17
|
+
providerOptions: {
|
|
18
|
+
bedrock: { cachePoint: { type: 'default' } },
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.toCacheableSystem = toCacheableSystem;
|
|
23
|
+
//# sourceMappingURL=toCacheableSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCacheableSystem.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableSystem.ts"],"names":[],"mappings":";;;AAEA,gGAAgG;AAChG,0FAA0F;AAC1F,yFAAyF;AAClF,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAE,OAA4B,EAA2C,EAAE;IACrI,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;SAC7C;KACF,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,iBAAiB,qBAgB5B","sourcesContent":["import type { SystemModelMessage } from 'ai';\n\n// Bedrock only reads cache points off message objects, not the bare `system` string, so caching\n// requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no\n// equivalent hook for the tools array, so tool definitions can't be cached this way yet.\nexport const toCacheableSystem = (system: string | undefined, caching: boolean | undefined): string | SystemModelMessage | undefined => {\n if (!system) {\n return undefined;\n }\n\n if (!caching) {\n return system;\n }\n\n return {\n role: 'system',\n content: system,\n providerOptions: {\n bedrock: { cachePoint: { type: 'default' } },\n },\n };\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { actionResult, actionResultError, AiActionType, ErrorTypeEnum, } from 'quidproquo-core';
|
|
2
2
|
import { generateText, stepCountIs } from 'ai';
|
|
3
|
-
import { createDriveFileResolver, prepareAiPromptCall, toSdkMessages } from './logic';
|
|
3
|
+
import { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';
|
|
4
4
|
const getProcessAiPrompt = (qpqConfig) => {
|
|
5
5
|
return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
|
|
6
6
|
const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
|
|
@@ -10,7 +10,7 @@ const getProcessAiPrompt = (qpqConfig) => {
|
|
|
10
10
|
try {
|
|
11
11
|
const promptOrMessages = payload.messages
|
|
12
12
|
? {
|
|
13
|
-
messages: await toSdkMessages(payload.messages, createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
|
|
13
|
+
messages: toCacheableMessages(await toSdkMessages(payload.messages, createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
|
|
14
14
|
}
|
|
15
15
|
: { prompt: payload.prompt };
|
|
16
16
|
// Extended thinking — the model reasons before answering, within the token budget.
|
|
@@ -19,12 +19,17 @@ const getProcessAiPrompt = (qpqConfig) => {
|
|
|
19
19
|
: undefined;
|
|
20
20
|
const result = await generateText({
|
|
21
21
|
model: prepared.model,
|
|
22
|
-
system: payload.system,
|
|
22
|
+
system: toCacheableSystem(payload.system, payload.caching),
|
|
23
23
|
...promptOrMessages,
|
|
24
24
|
tools: prepared.tools,
|
|
25
25
|
providerOptions,
|
|
26
26
|
stopWhen: stepCountIs(10),
|
|
27
27
|
});
|
|
28
|
+
if (payload.caching) {
|
|
29
|
+
// The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
|
|
30
|
+
// field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
|
|
31
|
+
console.log('AI prompt cache usage:', result.finalStep?.usage?.inputTokenDetails);
|
|
32
|
+
}
|
|
28
33
|
return actionResult({ text: result.text });
|
|
29
34
|
}
|
|
30
35
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EAEZ,aAAa,GAEd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"getAiPromptActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EAEZ,aAAa,GAEd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9H,MAAM,kBAAkB,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,EAAE;QACjH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACpI,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ;gBACvC,CAAC,CAAC;oBACE,QAAQ,EAAE,mBAAmB,CAC3B,MAAM,aAAa,CACjB,OAAO,CAAC,QAAQ,EAChB,uBAAuB,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAC9G,EACD,OAAO,CAAC,OAAO,CAChB;iBACF;gBACH,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAE/B,mFAAmF;YACnF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS;gBACvC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,IAAI,IAAI,EAAE,EAAE,EAAE;gBACtH,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC1D,GAAG,gBAAgB;gBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,eAAe;gBACf,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;aAC1B,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,sFAAsF;gBACtF,uFAAuF;gBACvF,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,+CAA+C,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IACpI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,SAAS,CAAC;CACrD,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { generateText, stepCountIs } from 'ai';\n\nimport { createDriveFileResolver, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPrompt = (qpqConfig: QPQConfig): AiPromptActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — the model reasons before answering, within the token budget.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const result = await generateText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n });\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n console.log('AI prompt cache usage:', result.finalStep?.usage?.inputTokenDetails);\n }\n\n return actionResult({ text: result.text });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt execution.');\n }\n };\n};\n\nexport const getAiPromptActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.Prompt]: getProcessAiPrompt(qpqConfig),\n});\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { actionResult, actionResultError, AiActionType, ErrorTypeEnum, } from 'quidproquo-core';
|
|
2
2
|
import { stepCountIs, streamText } from 'ai';
|
|
3
3
|
import { randomGuid } from '../../../awsLambdaUtils';
|
|
4
|
-
import { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toSdkMessages } from './logic';
|
|
4
|
+
import { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';
|
|
5
5
|
const getProcessAiPromptStream = (qpqConfig) => {
|
|
6
6
|
return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {
|
|
7
7
|
const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);
|
|
@@ -11,16 +11,16 @@ const getProcessAiPromptStream = (qpqConfig) => {
|
|
|
11
11
|
try {
|
|
12
12
|
const promptOrMessages = payload.messages
|
|
13
13
|
? {
|
|
14
|
-
messages: await toSdkMessages(payload.messages, createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)),
|
|
14
|
+
messages: toCacheableMessages(await toSdkMessages(payload.messages, createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry)), payload.caching),
|
|
15
15
|
}
|
|
16
16
|
: { prompt: payload.prompt };
|
|
17
17
|
// Extended thinking — thinking progress streams out as Reasoning* parts.
|
|
18
18
|
const providerOptions = payload.reasoning
|
|
19
19
|
? { bedrock: { reasoningConfig: { type: 'enabled', budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }
|
|
20
20
|
: undefined;
|
|
21
|
-
const { fullStream } = streamText({
|
|
21
|
+
const { fullStream, finalStep } = streamText({
|
|
22
22
|
model: prepared.model,
|
|
23
|
-
system: payload.system,
|
|
23
|
+
system: toCacheableSystem(payload.system, payload.caching),
|
|
24
24
|
...promptOrMessages,
|
|
25
25
|
tools: prepared.tools,
|
|
26
26
|
providerOptions,
|
|
@@ -36,6 +36,12 @@ const getProcessAiPromptStream = (qpqConfig) => {
|
|
|
36
36
|
for await (const part of fullStream) {
|
|
37
37
|
yield JSON.stringify(mapAiStreamPart(part));
|
|
38
38
|
}
|
|
39
|
+
if (payload.caching) {
|
|
40
|
+
// The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that
|
|
41
|
+
// field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).
|
|
42
|
+
const step = await finalStep;
|
|
43
|
+
console.log('AI prompt cache usage:', step.usage?.inputTokenDetails);
|
|
44
|
+
}
|
|
39
45
|
}
|
|
40
46
|
streamRegistry.register(streamId, aiStreamIterator());
|
|
41
47
|
return actionResult({ id: streamId, encoding: 'json' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EAEZ,aAAa,GAEd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"getAiPromptStreamActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/ai/getAiPromptStreamActionProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n AiActionType,\n AiPromptStreamActionProcessor,\n ErrorTypeEnum,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { stepCountIs, streamText } from 'ai';\n\nimport { randomGuid } from '../../../awsLambdaUtils';\nimport { createDriveFileResolver, mapAiStreamPart, prepareAiPromptCall, toCacheableMessages, toCacheableSystem, toSdkMessages } from './logic';\n\nconst getProcessAiPromptStream = (qpqConfig: QPQConfig): AiPromptStreamActionProcessor => {\n return async (payload, session, actionProcessorList, logger, updateSession, dynamicModuleLoader, streamRegistry) => {\n const prepared = prepareAiPromptCall(qpqConfig, payload, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry);\n if ('error' in prepared) {\n return actionResultError(prepared.error.type, prepared.error.message);\n }\n\n try {\n const promptOrMessages = payload.messages\n ? {\n messages: toCacheableMessages(\n await toSdkMessages(\n payload.messages,\n createDriveFileResolver(qpqConfig, session, actionProcessorList, logger, dynamicModuleLoader, streamRegistry),\n ),\n payload.caching,\n ),\n }\n : { prompt: payload.prompt };\n\n // Extended thinking — thinking progress streams out as Reasoning* parts.\n const providerOptions = payload.reasoning\n ? { bedrock: { reasoningConfig: { type: 'enabled' as const, budgetTokens: payload.reasoning.budgetTokens ?? 4096 } } }\n : undefined;\n\n const { fullStream, finalStep } = streamText({\n model: prepared.model,\n system: toCacheableSystem(payload.system, payload.caching),\n ...promptOrMessages,\n tools: prepared.tools,\n providerOptions,\n stopWhen: stepCountIs(10),\n // streamText swallows errors by default to keep the server alive — surface them to CloudWatch.\n onError: ({ error }) => {\n // todo yeild this out\n console.error('AI prompt stream error:', error);\n },\n });\n\n const streamId = `ai-prompt-${Date.now()}-${randomGuid()}`;\n\n async function* aiStreamIterator(): AsyncIterableIterator<string> {\n for await (const part of fullStream) {\n yield JSON.stringify(mapAiStreamPart(part));\n }\n\n if (payload.caching) {\n // The SDK's cross-provider usage breakdown, not providerMetadata.bedrock.usage — that\n // field never carries cacheReadInputTokens through on @ai-sdk/amazon-bedrock (5.0.11).\n const step = await finalStep;\n console.log('AI prompt cache usage:', step.usage?.inputTokenDetails);\n }\n }\n\n streamRegistry.register(streamId, aiStreamIterator());\n\n return actionResult({ id: streamId, encoding: 'json' as const });\n } catch (error) {\n if (error instanceof Error) {\n return actionResultError(ErrorTypeEnum.GenericError, error.message);\n }\n\n return actionResultError(ErrorTypeEnum.GenericError, 'An error occurred during AI prompt stream.');\n }\n };\n};\n\nexport const getAiPromptStreamActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [AiActionType.PromptStream]: getProcessAiPromptStream(qpqConfig),\n});\n"]}
|
|
@@ -29,5 +29,7 @@ export * from './mapAiStreamToolOutputDenied';
|
|
|
29
29
|
export * from './mapAiStreamToolResult';
|
|
30
30
|
export * from './prepareAiPromptCall';
|
|
31
31
|
export * from './toAiStreamUsage';
|
|
32
|
+
export * from './toCacheableMessages';
|
|
33
|
+
export * from './toCacheableSystem';
|
|
32
34
|
export * from './toErrorMessage';
|
|
33
35
|
export * from './toSdkMessages';
|
|
@@ -29,6 +29,8 @@ export * from './mapAiStreamToolOutputDenied';
|
|
|
29
29
|
export * from './mapAiStreamToolResult';
|
|
30
30
|
export * from './prepareAiPromptCall';
|
|
31
31
|
export * from './toAiStreamUsage';
|
|
32
|
+
export * from './toCacheableMessages';
|
|
33
|
+
export * from './toCacheableSystem';
|
|
32
34
|
export * from './toErrorMessage';
|
|
33
35
|
export * from './toSdkMessages';
|
|
34
36
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamUsage';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './aiStreamPartMappers';\nexport * from './createDriveFileResolver';\nexport * from './mapAiStreamAbort';\nexport * from './mapAiStreamCustom';\nexport * from './mapAiStreamError';\nexport * from './mapAiStreamFilePart';\nexport * from './mapAiStreamFinish';\nexport * from './mapAiStreamFinishStep';\nexport * from './mapAiStreamPart';\nexport * from './mapAiStreamRaw';\nexport * from './mapAiStreamReasoningDelta';\nexport * from './mapAiStreamReasoningEnd';\nexport * from './mapAiStreamReasoningFilePart';\nexport * from './mapAiStreamReasoningStart';\nexport * from './mapAiStreamSourcePart';\nexport * from './mapAiStreamStart';\nexport * from './mapAiStreamStartStep';\nexport * from './mapAiStreamTextDelta';\nexport * from './mapAiStreamTextEnd';\nexport * from './mapAiStreamTextStart';\nexport * from './mapAiStreamToolApprovalRequest';\nexport * from './mapAiStreamToolApprovalResponse';\nexport * from './mapAiStreamToolCall';\nexport * from './mapAiStreamToolError';\nexport * from './mapAiStreamToolInputDelta';\nexport * from './mapAiStreamToolInputEnd';\nexport * from './mapAiStreamToolInputStart';\nexport * from './mapAiStreamToolOutputDenied';\nexport * from './mapAiStreamToolResult';\nexport * from './prepareAiPromptCall';\nexport * from './toAiStreamUsage';\nexport * from './toCacheableMessages';\nexport * from './toCacheableSystem';\nexport * from './toErrorMessage';\nexport * from './toSdkMessages';\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Marks the newest message as a cache point so the next call in the same conversation can read
|
|
2
|
+
// everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point
|
|
3
|
+
// this is meant to be used alongside — Bedrock's cache lookback only covers a limited number of
|
|
4
|
+
// recent content blocks, so long conversations still need both.
|
|
5
|
+
export const toCacheableMessages = (messages, caching) => {
|
|
6
|
+
if (!caching || messages.length === 0) {
|
|
7
|
+
return messages;
|
|
8
|
+
}
|
|
9
|
+
const lastMessage = messages[messages.length - 1];
|
|
10
|
+
return [
|
|
11
|
+
...messages.slice(0, -1),
|
|
12
|
+
{
|
|
13
|
+
...lastMessage,
|
|
14
|
+
providerOptions: {
|
|
15
|
+
...lastMessage.providerOptions,
|
|
16
|
+
bedrock: { cachePoint: { type: 'default' } },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=toCacheableMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCacheableMessages.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableMessages.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAC/F,iGAAiG;AACjG,gGAAgG;AAChG,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAwB,EAAE,OAA4B,EAAkB,EAAE;IAC5G,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB;YACE,GAAG,WAAW;YACd,eAAe,EAAE;gBACf,GAAG,WAAW,CAAC,eAAe;gBAC9B,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;aAC7C;SACF;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { ModelMessage } from 'ai';\n\n// Marks the newest message as a cache point so the next call in the same conversation can read\n// everything up to here from cache. See toCacheableSystem for the fixed system/tools cache point\n// this is meant to be used alongside — Bedrock's cache lookback only covers a limited number of\n// recent content blocks, so long conversations still need both.\nexport const toCacheableMessages = (messages: ModelMessage[], caching: boolean | undefined): ModelMessage[] => {\n if (!caching || messages.length === 0) {\n return messages;\n }\n\n const lastMessage = messages[messages.length - 1];\n\n return [\n ...messages.slice(0, -1),\n {\n ...lastMessage,\n providerOptions: {\n ...lastMessage.providerOptions,\n bedrock: { cachePoint: { type: 'default' } },\n },\n },\n ];\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Bedrock only reads cache points off message objects, not the bare `system` string, so caching
|
|
2
|
+
// requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no
|
|
3
|
+
// equivalent hook for the tools array, so tool definitions can't be cached this way yet.
|
|
4
|
+
export const toCacheableSystem = (system, caching) => {
|
|
5
|
+
if (!system) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
if (!caching) {
|
|
9
|
+
return system;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
role: 'system',
|
|
13
|
+
content: system,
|
|
14
|
+
providerOptions: {
|
|
15
|
+
bedrock: { cachePoint: { type: 'default' } },
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=toCacheableSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCacheableSystem.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/ai/logic/toCacheableSystem.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,0FAA0F;AAC1F,yFAAyF;AACzF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAE,OAA4B,EAA2C,EAAE;IACrI,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;SAC7C;KACF,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { SystemModelMessage } from 'ai';\n\n// Bedrock only reads cache points off message objects, not the bare `system` string, so caching\n// requires shaping system as a SystemModelMessage. @ai-sdk/amazon-bedrock (5.0.11) has no\n// equivalent hook for the tools array, so tool definitions can't be cached this way yet.\nexport const toCacheableSystem = (system: string | undefined, caching: boolean | undefined): string | SystemModelMessage | undefined => {\n if (!system) {\n return undefined;\n }\n\n if (!caching) {\n return system;\n }\n\n return {\n role: 'system',\n content: system,\n providerOptions: {\n bedrock: { cachePoint: { type: 'default' } },\n },\n };\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quidproquo-actionprocessor-awslambda",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./lib/commonjs/index.js",
|
|
6
6
|
"module": "./lib/esm/index.js",
|
|
@@ -60,11 +60,11 @@
|
|
|
60
60
|
"lodash": "^4.17.21",
|
|
61
61
|
"node-cache": "^5.1.2",
|
|
62
62
|
"node-match-path": "^0.6.3",
|
|
63
|
-
"quidproquo-actionprocessor-js": "0.1.
|
|
64
|
-
"quidproquo-actionprocessor-node": "0.1.
|
|
65
|
-
"quidproquo-config-aws": "0.1.
|
|
66
|
-
"quidproquo-core": "0.1.
|
|
67
|
-
"quidproquo-webserver": "0.1.
|
|
63
|
+
"quidproquo-actionprocessor-js": "0.1.7",
|
|
64
|
+
"quidproquo-actionprocessor-node": "0.1.7",
|
|
65
|
+
"quidproquo-config-aws": "0.1.7",
|
|
66
|
+
"quidproquo-core": "0.1.7",
|
|
67
|
+
"quidproquo-webserver": "0.1.7"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@types/busboy": "^1.5.0",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"@types/lodash": "^4.14.194",
|
|
73
73
|
"@types/node": "^22.13.13",
|
|
74
74
|
"esbuild": "^0.25.8",
|
|
75
|
-
"quidproquo-tsconfig": "0.1.
|
|
75
|
+
"quidproquo-tsconfig": "0.1.7",
|
|
76
76
|
"typescript": "^5.8.2"
|
|
77
77
|
}
|
|
78
78
|
}
|