pika-shared 1.0.2 → 1.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/dist/types/chatbot/chatbot-types.d.mts +429 -12
- package/dist/types/chatbot/chatbot-types.d.ts +429 -12
- package/dist/types/chatbot/chatbot-types.js +18 -4
- package/dist/types/chatbot/chatbot-types.js.map +1 -1
- package/dist/types/chatbot/chatbot-types.mjs +17 -5
- package/dist/types/chatbot/chatbot-types.mjs.map +1 -1
- package/dist/util/instruction-assistance-utils.d.mts +49 -0
- package/dist/util/instruction-assistance-utils.d.ts +49 -0
- package/dist/util/instruction-assistance-utils.js +133 -0
- package/dist/util/instruction-assistance-utils.js.map +1 -0
- package/dist/util/instruction-assistance-utils.mjs +129 -0
- package/dist/util/instruction-assistance-utils.mjs.map +1 -0
- package/package.json +1 -1
- package/readme.md +8 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { InstructionAssistanceConfig, TagsChatAppOverridableFeature, AgentInstructionChatAppOverridableFeature, TagDefinition, TagDefinitionWidget } from '../types/chatbot/chatbot-types.mjs';
|
|
2
|
+
import '@aws-sdk/client-bedrock-agent-runtime';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
6
|
+
*
|
|
7
|
+
* The functions in this utility are used both by the front end svelte kit web client in the browser
|
|
8
|
+
* and in the backend lambda converse functions. So, that means it needs to be able
|
|
9
|
+
* to run in a browser. Do not add additional imports beyond anodine types.
|
|
10
|
+
*
|
|
11
|
+
* To be super clear: this is just logic to generate instruction assistance content given
|
|
12
|
+
* the right inputs. It does not collect up those inputs, it is given them.
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
18
|
+
*
|
|
19
|
+
* See header at top of file for important notes.
|
|
20
|
+
*
|
|
21
|
+
* Generate instruction assistance content based on enabled features
|
|
22
|
+
*
|
|
23
|
+
* @param instructionAssistanceConfig - The instruction assistance configuration from SSM
|
|
24
|
+
* @param tags - The tags configuration from the chat app
|
|
25
|
+
* @param agentInstructionFeature - The agent instruction feature configuration from the chat app
|
|
26
|
+
* @returns The instruction assistance content
|
|
27
|
+
*/
|
|
28
|
+
declare function generateInstructionAssistanceContent(instructionAssistanceConfig: InstructionAssistanceConfig | undefined, tags: TagsChatAppOverridableFeature | undefined, agentInstructionFeature: AgentInstructionChatAppOverridableFeature | undefined, tagDefinitions: TagDefinition<TagDefinitionWidget>[]): InstructionAssistanceConfig;
|
|
29
|
+
/**
|
|
30
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
31
|
+
*
|
|
32
|
+
* See header at top of file for important notes.
|
|
33
|
+
*
|
|
34
|
+
* Apply instruction assistance to the base prompt using placeholder replacement
|
|
35
|
+
*/
|
|
36
|
+
declare function applyInstructionAssistance(basePrompt: string, instructionContent: InstructionAssistanceConfig): string;
|
|
37
|
+
/**
|
|
38
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
39
|
+
*
|
|
40
|
+
* See header at top of file for important notes.
|
|
41
|
+
*
|
|
42
|
+
* Get the instruction assistance configuration from raw SSM parameters
|
|
43
|
+
*
|
|
44
|
+
* @param params - The raw SSM parameters
|
|
45
|
+
* @returns The instruction assistance configuration
|
|
46
|
+
*/
|
|
47
|
+
declare function getInstructionsAssistanceConfigFromRawSsmParams(params: Record<string, string>): InstructionAssistanceConfig;
|
|
48
|
+
|
|
49
|
+
export { applyInstructionAssistance, generateInstructionAssistanceContent, getInstructionsAssistanceConfigFromRawSsmParams };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { InstructionAssistanceConfig, TagsChatAppOverridableFeature, AgentInstructionChatAppOverridableFeature, TagDefinition, TagDefinitionWidget } from '../types/chatbot/chatbot-types.js';
|
|
2
|
+
import '@aws-sdk/client-bedrock-agent-runtime';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
6
|
+
*
|
|
7
|
+
* The functions in this utility are used both by the front end svelte kit web client in the browser
|
|
8
|
+
* and in the backend lambda converse functions. So, that means it needs to be able
|
|
9
|
+
* to run in a browser. Do not add additional imports beyond anodine types.
|
|
10
|
+
*
|
|
11
|
+
* To be super clear: this is just logic to generate instruction assistance content given
|
|
12
|
+
* the right inputs. It does not collect up those inputs, it is given them.
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
18
|
+
*
|
|
19
|
+
* See header at top of file for important notes.
|
|
20
|
+
*
|
|
21
|
+
* Generate instruction assistance content based on enabled features
|
|
22
|
+
*
|
|
23
|
+
* @param instructionAssistanceConfig - The instruction assistance configuration from SSM
|
|
24
|
+
* @param tags - The tags configuration from the chat app
|
|
25
|
+
* @param agentInstructionFeature - The agent instruction feature configuration from the chat app
|
|
26
|
+
* @returns The instruction assistance content
|
|
27
|
+
*/
|
|
28
|
+
declare function generateInstructionAssistanceContent(instructionAssistanceConfig: InstructionAssistanceConfig | undefined, tags: TagsChatAppOverridableFeature | undefined, agentInstructionFeature: AgentInstructionChatAppOverridableFeature | undefined, tagDefinitions: TagDefinition<TagDefinitionWidget>[]): InstructionAssistanceConfig;
|
|
29
|
+
/**
|
|
30
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
31
|
+
*
|
|
32
|
+
* See header at top of file for important notes.
|
|
33
|
+
*
|
|
34
|
+
* Apply instruction assistance to the base prompt using placeholder replacement
|
|
35
|
+
*/
|
|
36
|
+
declare function applyInstructionAssistance(basePrompt: string, instructionContent: InstructionAssistanceConfig): string;
|
|
37
|
+
/**
|
|
38
|
+
* IMPORTANT!!!!!!!!!!!!!!!!!!!!!!
|
|
39
|
+
*
|
|
40
|
+
* See header at top of file for important notes.
|
|
41
|
+
*
|
|
42
|
+
* Get the instruction assistance configuration from raw SSM parameters
|
|
43
|
+
*
|
|
44
|
+
* @param params - The raw SSM parameters
|
|
45
|
+
* @returns The instruction assistance configuration
|
|
46
|
+
*/
|
|
47
|
+
declare function getInstructionsAssistanceConfigFromRawSsmParams(params: Record<string, string>): InstructionAssistanceConfig;
|
|
48
|
+
|
|
49
|
+
export { applyInstructionAssistance, generateInstructionAssistanceContent, getInstructionsAssistanceConfigFromRawSsmParams };
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/util/instruction-assistance-utils.ts
|
|
4
|
+
function generateInstructionAssistanceContent(instructionAssistanceConfig, tags, agentInstructionFeature, tagDefinitions) {
|
|
5
|
+
console.log("Generating instruction assistance content:", {
|
|
6
|
+
enabled: agentInstructionFeature?.enabled,
|
|
7
|
+
includeOutputFormattingRequirements: agentInstructionFeature?.includeOutputFormattingRequirements,
|
|
8
|
+
includeInstructionsForTags: agentInstructionFeature?.includeInstructionsForTags,
|
|
9
|
+
completeExampleEnabled: agentInstructionFeature?.completeExampleInstructionEnabled,
|
|
10
|
+
jsonOnlyEnabled: agentInstructionFeature?.jsonOnlyImperativeInstructionEnabled
|
|
11
|
+
});
|
|
12
|
+
let outputFormattingRequirements = "";
|
|
13
|
+
let tagInstructions = "";
|
|
14
|
+
let completeExampleInstructionLine = "";
|
|
15
|
+
let jsonOnlyImperativeInstructionLine = "";
|
|
16
|
+
if (!agentInstructionFeature?.enabled) {
|
|
17
|
+
return {
|
|
18
|
+
outputFormattingRequirements,
|
|
19
|
+
tagInstructions,
|
|
20
|
+
completeExampleInstructionLine,
|
|
21
|
+
jsonOnlyImperativeInstructionLine
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (agentInstructionFeature.includeOutputFormattingRequirements) {
|
|
25
|
+
outputFormattingRequirements = instructionAssistanceConfig?.outputFormattingRequirements || `**Output Formatting Requirements:**
|
|
26
|
+
- **Output Response Enclosure**: All response output MUST be completely enclosed within <answer></answer> tags, including supported custom tags.
|
|
27
|
+
- **Output Content Format:** All responses MUST be in Markdown with supported custom tags.`;
|
|
28
|
+
}
|
|
29
|
+
if (agentInstructionFeature.includeInstructionsForTags && tags && tags.tagsEnabled?.length > 0) {
|
|
30
|
+
console.log("Fetching tag definitions for instruction generation:", tags.tagsEnabled);
|
|
31
|
+
if (tagDefinitions.length > 0) {
|
|
32
|
+
const tagDictionary = tagDefinitions.filter((tagDef) => tagDef.canBeGeneratedByLlm && !tagDef.disabled).map((tagDef) => ` - ${tagDef.tagTitle}: \`${tagDef.shortTagEx}\``).join("\n");
|
|
33
|
+
let tagInstructionsContent = "";
|
|
34
|
+
if (tagDictionary) {
|
|
35
|
+
tagInstructionsContent += `- **Custom Tags Supported:**
|
|
36
|
+
${tagDictionary}
|
|
37
|
+
`;
|
|
38
|
+
}
|
|
39
|
+
for (const tagDef of tagDefinitions) {
|
|
40
|
+
if (tagDef.canBeGeneratedByLlm && !tagDef.disabled && tagDef.llmInstructionsMd) {
|
|
41
|
+
const tagType = `${tagDef.scope}.${tagDef.tag}`;
|
|
42
|
+
tagInstructionsContent += `- **${tagDef.tagTitle}:**
|
|
43
|
+
<tag-instructions type="${tagType}">
|
|
44
|
+
${tagDef.llmInstructionsMd}
|
|
45
|
+
</tag-instructions>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (tagInstructionsContent) {
|
|
50
|
+
tagInstructions = tagInstructionsContent;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (agentInstructionFeature.completeExampleInstructionEnabled) {
|
|
55
|
+
completeExampleInstructionLine = agentInstructionFeature.completeExampleInstructionLine || instructionAssistanceConfig?.completeExampleInstructionLine || "- **Complete Example Output:**\n `<answer>##Example markdown\nNormal text and an <image>http://some.url</image> and some **bold text**\n<chart>(...)</chart></answer>`";
|
|
56
|
+
}
|
|
57
|
+
if (agentInstructionFeature.jsonOnlyImperativeInstructionEnabled) {
|
|
58
|
+
jsonOnlyImperativeInstructionLine = agentInstructionFeature.jsonOnlyImperativeInstructionLine || instructionAssistanceConfig?.jsonOnlyImperativeInstructionLine || "BE ABSOLUTELY CERTAIN ANY JSON INCLUDED IS 100% VALID (especially for charts). Invalid JSON will break the user experience.";
|
|
59
|
+
}
|
|
60
|
+
console.log("Generated instruction assistance content:", {
|
|
61
|
+
hasOutputFormatting: !!outputFormattingRequirements,
|
|
62
|
+
hasTagInstructions: !!tagInstructions,
|
|
63
|
+
hasCompleteExample: !!completeExampleInstructionLine,
|
|
64
|
+
hasJsonValidation: !!jsonOnlyImperativeInstructionLine
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
outputFormattingRequirements,
|
|
68
|
+
tagInstructions,
|
|
69
|
+
completeExampleInstructionLine,
|
|
70
|
+
jsonOnlyImperativeInstructionLine
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function applyInstructionAssistance(basePrompt, instructionContent) {
|
|
74
|
+
let enhancedPrompt = basePrompt;
|
|
75
|
+
if (enhancedPrompt.includes("{{prompt-assistance}}")) {
|
|
76
|
+
console.log("Found {{prompt-assistance}} placeholder");
|
|
77
|
+
const allContent = [
|
|
78
|
+
instructionContent.outputFormattingRequirements,
|
|
79
|
+
instructionContent.tagInstructions,
|
|
80
|
+
instructionContent.completeExampleInstructionLine,
|
|
81
|
+
instructionContent.jsonOnlyImperativeInstructionLine
|
|
82
|
+
].filter((content) => content && content.trim().length > 0).join("\n\n");
|
|
83
|
+
enhancedPrompt = enhancedPrompt.replace("{{prompt-assistance}}", allContent);
|
|
84
|
+
} else {
|
|
85
|
+
const placeholders = [
|
|
86
|
+
{ placeholder: "{{output-formatting-requirements}}", content: instructionContent.outputFormattingRequirements },
|
|
87
|
+
{ placeholder: "{{tag-instructions}}", content: instructionContent.tagInstructions },
|
|
88
|
+
{ placeholder: "{{complete-example-instruction-line}}", content: instructionContent.completeExampleInstructionLine },
|
|
89
|
+
{ placeholder: "{{json-only-imperative-instruction-line}}", content: instructionContent.jsonOnlyImperativeInstructionLine }
|
|
90
|
+
];
|
|
91
|
+
let hasAnyPlaceholder = false;
|
|
92
|
+
for (const { placeholder, content } of placeholders) {
|
|
93
|
+
if (enhancedPrompt.includes(placeholder) && content) {
|
|
94
|
+
console.log(`Found ${placeholder} placeholder`);
|
|
95
|
+
hasAnyPlaceholder = true;
|
|
96
|
+
enhancedPrompt = enhancedPrompt.replace(placeholder, content);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!hasAnyPlaceholder) {
|
|
100
|
+
console.log("No placeholders found, appending to end of prompt");
|
|
101
|
+
const allContent = [
|
|
102
|
+
instructionContent.outputFormattingRequirements,
|
|
103
|
+
instructionContent.tagInstructions,
|
|
104
|
+
instructionContent.completeExampleInstructionLine,
|
|
105
|
+
instructionContent.jsonOnlyImperativeInstructionLine
|
|
106
|
+
].filter((content) => content && content.trim().length > 0);
|
|
107
|
+
if (allContent.length > 0) {
|
|
108
|
+
enhancedPrompt = enhancedPrompt + "\n\n" + allContent.join("\n\n");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return enhancedPrompt;
|
|
113
|
+
}
|
|
114
|
+
function getInstructionsAssistanceConfigFromRawSsmParams(params) {
|
|
115
|
+
const expectedKeys = ["output-formatting-requirements", "default-complete-example-line", "default-json-validation-line"];
|
|
116
|
+
const missingKeys = expectedKeys.filter((key) => !params[key]);
|
|
117
|
+
if (missingKeys.length > 0) {
|
|
118
|
+
throw new Error(
|
|
119
|
+
`Missing required instruction assistance parameters: ${Object.keys(params).filter((key) => !expectedKeys.includes(key)).join(", ")}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
outputFormattingRequirements: params["output-formatting-requirements"],
|
|
124
|
+
completeExampleInstructionLine: params["default-complete-example-line"],
|
|
125
|
+
jsonOnlyImperativeInstructionLine: params["default-json-validation-line"]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
exports.applyInstructionAssistance = applyInstructionAssistance;
|
|
130
|
+
exports.generateInstructionAssistanceContent = generateInstructionAssistanceContent;
|
|
131
|
+
exports.getInstructionsAssistanceConfigFromRawSsmParams = getInstructionsAssistanceConfigFromRawSsmParams;
|
|
132
|
+
//# sourceMappingURL=instruction-assistance-utils.js.map
|
|
133
|
+
//# sourceMappingURL=instruction-assistance-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/instruction-assistance-utils.ts"],"names":[],"mappings":"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","file":"instruction-assistance-utils.js","sourcesContent":["/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * The functions in this utility are used both by the front end svelte kit web client in the browser\n * and in the backend lambda converse functions. So, that means it needs to be able\n * to run in a browser. Do not add additional imports beyond anodine types.\n *\n * To be super clear: this is just logic to generate instruction assistance content given\n * the right inputs. It does not collect up those inputs, it is given them.\n *\n */\n\nimport {\n AgentInstructionChatAppOverridableFeature,\n InstructionAssistanceConfig,\n TagDefinition,\n TagDefinitionWidget,\n TagsChatAppOverridableFeature\n} from '../types/chatbot/chatbot-types';\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Generate instruction assistance content based on enabled features\n *\n * @param instructionAssistanceConfig - The instruction assistance configuration from SSM\n * @param tags - The tags configuration from the chat app\n * @param agentInstructionFeature - The agent instruction feature configuration from the chat app\n * @returns The instruction assistance content\n */\nexport function generateInstructionAssistanceContent(\n instructionAssistanceConfig: InstructionAssistanceConfig | undefined,\n tags: TagsChatAppOverridableFeature | undefined,\n agentInstructionFeature: AgentInstructionChatAppOverridableFeature | undefined,\n tagDefinitions: TagDefinition<TagDefinitionWidget>[]\n): InstructionAssistanceConfig {\n console.log('Generating instruction assistance content:', {\n enabled: agentInstructionFeature?.enabled,\n includeOutputFormattingRequirements: agentInstructionFeature?.includeOutputFormattingRequirements,\n includeInstructionsForTags: agentInstructionFeature?.includeInstructionsForTags,\n completeExampleEnabled: agentInstructionFeature?.completeExampleInstructionEnabled,\n jsonOnlyEnabled: agentInstructionFeature?.jsonOnlyImperativeInstructionEnabled\n });\n\n let outputFormattingRequirements = '';\n let tagInstructions = '';\n let completeExampleInstructionLine = '';\n let jsonOnlyImperativeInstructionLine = '';\n\n if (!agentInstructionFeature?.enabled) {\n return {\n outputFormattingRequirements,\n tagInstructions,\n completeExampleInstructionLine,\n jsonOnlyImperativeInstructionLine\n };\n }\n\n // Generate output formatting requirements\n if (agentInstructionFeature.includeOutputFormattingRequirements) {\n outputFormattingRequirements =\n instructionAssistanceConfig?.outputFormattingRequirements ||\n `**Output Formatting Requirements:**\n- **Output Response Enclosure**: All response output MUST be completely enclosed within <answer></answer> tags, including supported custom tags.\n- **Output Content Format:** All responses MUST be in Markdown with supported custom tags.`;\n }\n\n // Generate tag instructions\n if (agentInstructionFeature.includeInstructionsForTags && tags && tags.tagsEnabled?.length > 0) {\n console.log('Fetching tag definitions for instruction generation:', tags.tagsEnabled);\n\n if (tagDefinitions.length > 0) {\n // First create a dictionary listing all supported tags\n const tagDictionary = tagDefinitions\n .filter((tagDef) => tagDef.canBeGeneratedByLlm && !tagDef.disabled)\n .map((tagDef) => ` - ${tagDef.tagTitle}: \\`${tagDef.shortTagEx}\\``)\n .join('\\n');\n\n let tagInstructionsContent = '';\n if (tagDictionary) {\n tagInstructionsContent += `- **Custom Tags Supported:**\\n${tagDictionary}\\n`;\n }\n\n // Then add detailed instructions for each tag\n for (const tagDef of tagDefinitions) {\n if (tagDef.canBeGeneratedByLlm && !tagDef.disabled && tagDef.llmInstructionsMd) {\n const tagType = `${tagDef.scope}.${tagDef.tag}`;\n tagInstructionsContent += `- **${tagDef.tagTitle}:**\\n <tag-instructions type=\"${tagType}\">\\n${tagDef.llmInstructionsMd}\\n </tag-instructions>\\n`;\n }\n }\n\n if (tagInstructionsContent) {\n tagInstructions = tagInstructionsContent;\n }\n }\n }\n\n // Generate complete example instruction line\n if (agentInstructionFeature.completeExampleInstructionEnabled) {\n completeExampleInstructionLine =\n agentInstructionFeature.completeExampleInstructionLine ||\n instructionAssistanceConfig?.completeExampleInstructionLine ||\n '- **Complete Example Output:**\\n `<answer>##Example markdown\\nNormal text and an <image>http://some.url</image> and some **bold text**\\n<chart>(...)</chart></answer>`';\n }\n\n // Generate JSON validation instruction line\n if (agentInstructionFeature.jsonOnlyImperativeInstructionEnabled) {\n jsonOnlyImperativeInstructionLine =\n agentInstructionFeature.jsonOnlyImperativeInstructionLine ||\n instructionAssistanceConfig?.jsonOnlyImperativeInstructionLine ||\n 'BE ABSOLUTELY CERTAIN ANY JSON INCLUDED IS 100% VALID (especially for charts). Invalid JSON will break the user experience.';\n }\n\n console.log('Generated instruction assistance content:', {\n hasOutputFormatting: !!outputFormattingRequirements,\n hasTagInstructions: !!tagInstructions,\n hasCompleteExample: !!completeExampleInstructionLine,\n hasJsonValidation: !!jsonOnlyImperativeInstructionLine\n });\n\n return {\n outputFormattingRequirements,\n tagInstructions,\n completeExampleInstructionLine,\n jsonOnlyImperativeInstructionLine\n };\n}\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Apply instruction assistance to the base prompt using placeholder replacement\n */\nexport function applyInstructionAssistance(basePrompt: string, instructionContent: InstructionAssistanceConfig): string {\n let enhancedPrompt = basePrompt;\n\n // Check for primary placeholder first\n if (enhancedPrompt.includes('{{prompt-assistance}}')) {\n console.log('Found {{prompt-assistance}} placeholder');\n\n const allContent = [\n instructionContent.outputFormattingRequirements,\n instructionContent.tagInstructions,\n instructionContent.completeExampleInstructionLine,\n instructionContent.jsonOnlyImperativeInstructionLine\n ]\n .filter((content) => content && content.trim().length > 0)\n .join('\\n\\n');\n\n enhancedPrompt = enhancedPrompt.replace('{{prompt-assistance}}', allContent);\n } else {\n // Look for fine-grained placeholders\n const placeholders = [\n { placeholder: '{{output-formatting-requirements}}', content: instructionContent.outputFormattingRequirements },\n { placeholder: '{{tag-instructions}}', content: instructionContent.tagInstructions },\n { placeholder: '{{complete-example-instruction-line}}', content: instructionContent.completeExampleInstructionLine },\n { placeholder: '{{json-only-imperative-instruction-line}}', content: instructionContent.jsonOnlyImperativeInstructionLine }\n ];\n\n let hasAnyPlaceholder = false;\n for (const { placeholder, content } of placeholders) {\n if (enhancedPrompt.includes(placeholder) && content) {\n console.log(`Found ${placeholder} placeholder`);\n hasAnyPlaceholder = true;\n enhancedPrompt = enhancedPrompt.replace(placeholder, content);\n }\n }\n\n // If no placeholders found, append to end\n if (!hasAnyPlaceholder) {\n console.log('No placeholders found, appending to end of prompt');\n const allContent = [\n instructionContent.outputFormattingRequirements,\n instructionContent.tagInstructions,\n instructionContent.completeExampleInstructionLine,\n instructionContent.jsonOnlyImperativeInstructionLine\n ].filter((content) => content && content.trim().length > 0);\n\n if (allContent.length > 0) {\n enhancedPrompt = enhancedPrompt + '\\n\\n' + allContent.join('\\n\\n');\n }\n }\n }\n\n return enhancedPrompt;\n}\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Get the instruction assistance configuration from raw SSM parameters\n *\n * @param params - The raw SSM parameters\n * @returns The instruction assistance configuration\n */\nexport function getInstructionsAssistanceConfigFromRawSsmParams(params: Record<string, string>): InstructionAssistanceConfig {\n const expectedKeys = ['output-formatting-requirements', 'default-complete-example-line', 'default-json-validation-line'];\n const missingKeys = expectedKeys.filter((key) => !params[key]);\n if (missingKeys.length > 0) {\n throw new Error(\n `Missing required instruction assistance parameters: ${Object.keys(params)\n .filter((key) => !expectedKeys.includes(key))\n .join(', ')}`\n );\n }\n\n return {\n outputFormattingRequirements: params['output-formatting-requirements'],\n completeExampleInstructionLine: params['default-complete-example-line'],\n jsonOnlyImperativeInstructionLine: params['default-json-validation-line']\n };\n}\n"]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/util/instruction-assistance-utils.ts
|
|
2
|
+
function generateInstructionAssistanceContent(instructionAssistanceConfig, tags, agentInstructionFeature, tagDefinitions) {
|
|
3
|
+
console.log("Generating instruction assistance content:", {
|
|
4
|
+
enabled: agentInstructionFeature?.enabled,
|
|
5
|
+
includeOutputFormattingRequirements: agentInstructionFeature?.includeOutputFormattingRequirements,
|
|
6
|
+
includeInstructionsForTags: agentInstructionFeature?.includeInstructionsForTags,
|
|
7
|
+
completeExampleEnabled: agentInstructionFeature?.completeExampleInstructionEnabled,
|
|
8
|
+
jsonOnlyEnabled: agentInstructionFeature?.jsonOnlyImperativeInstructionEnabled
|
|
9
|
+
});
|
|
10
|
+
let outputFormattingRequirements = "";
|
|
11
|
+
let tagInstructions = "";
|
|
12
|
+
let completeExampleInstructionLine = "";
|
|
13
|
+
let jsonOnlyImperativeInstructionLine = "";
|
|
14
|
+
if (!agentInstructionFeature?.enabled) {
|
|
15
|
+
return {
|
|
16
|
+
outputFormattingRequirements,
|
|
17
|
+
tagInstructions,
|
|
18
|
+
completeExampleInstructionLine,
|
|
19
|
+
jsonOnlyImperativeInstructionLine
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (agentInstructionFeature.includeOutputFormattingRequirements) {
|
|
23
|
+
outputFormattingRequirements = instructionAssistanceConfig?.outputFormattingRequirements || `**Output Formatting Requirements:**
|
|
24
|
+
- **Output Response Enclosure**: All response output MUST be completely enclosed within <answer></answer> tags, including supported custom tags.
|
|
25
|
+
- **Output Content Format:** All responses MUST be in Markdown with supported custom tags.`;
|
|
26
|
+
}
|
|
27
|
+
if (agentInstructionFeature.includeInstructionsForTags && tags && tags.tagsEnabled?.length > 0) {
|
|
28
|
+
console.log("Fetching tag definitions for instruction generation:", tags.tagsEnabled);
|
|
29
|
+
if (tagDefinitions.length > 0) {
|
|
30
|
+
const tagDictionary = tagDefinitions.filter((tagDef) => tagDef.canBeGeneratedByLlm && !tagDef.disabled).map((tagDef) => ` - ${tagDef.tagTitle}: \`${tagDef.shortTagEx}\``).join("\n");
|
|
31
|
+
let tagInstructionsContent = "";
|
|
32
|
+
if (tagDictionary) {
|
|
33
|
+
tagInstructionsContent += `- **Custom Tags Supported:**
|
|
34
|
+
${tagDictionary}
|
|
35
|
+
`;
|
|
36
|
+
}
|
|
37
|
+
for (const tagDef of tagDefinitions) {
|
|
38
|
+
if (tagDef.canBeGeneratedByLlm && !tagDef.disabled && tagDef.llmInstructionsMd) {
|
|
39
|
+
const tagType = `${tagDef.scope}.${tagDef.tag}`;
|
|
40
|
+
tagInstructionsContent += `- **${tagDef.tagTitle}:**
|
|
41
|
+
<tag-instructions type="${tagType}">
|
|
42
|
+
${tagDef.llmInstructionsMd}
|
|
43
|
+
</tag-instructions>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (tagInstructionsContent) {
|
|
48
|
+
tagInstructions = tagInstructionsContent;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (agentInstructionFeature.completeExampleInstructionEnabled) {
|
|
53
|
+
completeExampleInstructionLine = agentInstructionFeature.completeExampleInstructionLine || instructionAssistanceConfig?.completeExampleInstructionLine || "- **Complete Example Output:**\n `<answer>##Example markdown\nNormal text and an <image>http://some.url</image> and some **bold text**\n<chart>(...)</chart></answer>`";
|
|
54
|
+
}
|
|
55
|
+
if (agentInstructionFeature.jsonOnlyImperativeInstructionEnabled) {
|
|
56
|
+
jsonOnlyImperativeInstructionLine = agentInstructionFeature.jsonOnlyImperativeInstructionLine || instructionAssistanceConfig?.jsonOnlyImperativeInstructionLine || "BE ABSOLUTELY CERTAIN ANY JSON INCLUDED IS 100% VALID (especially for charts). Invalid JSON will break the user experience.";
|
|
57
|
+
}
|
|
58
|
+
console.log("Generated instruction assistance content:", {
|
|
59
|
+
hasOutputFormatting: !!outputFormattingRequirements,
|
|
60
|
+
hasTagInstructions: !!tagInstructions,
|
|
61
|
+
hasCompleteExample: !!completeExampleInstructionLine,
|
|
62
|
+
hasJsonValidation: !!jsonOnlyImperativeInstructionLine
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
outputFormattingRequirements,
|
|
66
|
+
tagInstructions,
|
|
67
|
+
completeExampleInstructionLine,
|
|
68
|
+
jsonOnlyImperativeInstructionLine
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function applyInstructionAssistance(basePrompt, instructionContent) {
|
|
72
|
+
let enhancedPrompt = basePrompt;
|
|
73
|
+
if (enhancedPrompt.includes("{{prompt-assistance}}")) {
|
|
74
|
+
console.log("Found {{prompt-assistance}} placeholder");
|
|
75
|
+
const allContent = [
|
|
76
|
+
instructionContent.outputFormattingRequirements,
|
|
77
|
+
instructionContent.tagInstructions,
|
|
78
|
+
instructionContent.completeExampleInstructionLine,
|
|
79
|
+
instructionContent.jsonOnlyImperativeInstructionLine
|
|
80
|
+
].filter((content) => content && content.trim().length > 0).join("\n\n");
|
|
81
|
+
enhancedPrompt = enhancedPrompt.replace("{{prompt-assistance}}", allContent);
|
|
82
|
+
} else {
|
|
83
|
+
const placeholders = [
|
|
84
|
+
{ placeholder: "{{output-formatting-requirements}}", content: instructionContent.outputFormattingRequirements },
|
|
85
|
+
{ placeholder: "{{tag-instructions}}", content: instructionContent.tagInstructions },
|
|
86
|
+
{ placeholder: "{{complete-example-instruction-line}}", content: instructionContent.completeExampleInstructionLine },
|
|
87
|
+
{ placeholder: "{{json-only-imperative-instruction-line}}", content: instructionContent.jsonOnlyImperativeInstructionLine }
|
|
88
|
+
];
|
|
89
|
+
let hasAnyPlaceholder = false;
|
|
90
|
+
for (const { placeholder, content } of placeholders) {
|
|
91
|
+
if (enhancedPrompt.includes(placeholder) && content) {
|
|
92
|
+
console.log(`Found ${placeholder} placeholder`);
|
|
93
|
+
hasAnyPlaceholder = true;
|
|
94
|
+
enhancedPrompt = enhancedPrompt.replace(placeholder, content);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (!hasAnyPlaceholder) {
|
|
98
|
+
console.log("No placeholders found, appending to end of prompt");
|
|
99
|
+
const allContent = [
|
|
100
|
+
instructionContent.outputFormattingRequirements,
|
|
101
|
+
instructionContent.tagInstructions,
|
|
102
|
+
instructionContent.completeExampleInstructionLine,
|
|
103
|
+
instructionContent.jsonOnlyImperativeInstructionLine
|
|
104
|
+
].filter((content) => content && content.trim().length > 0);
|
|
105
|
+
if (allContent.length > 0) {
|
|
106
|
+
enhancedPrompt = enhancedPrompt + "\n\n" + allContent.join("\n\n");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return enhancedPrompt;
|
|
111
|
+
}
|
|
112
|
+
function getInstructionsAssistanceConfigFromRawSsmParams(params) {
|
|
113
|
+
const expectedKeys = ["output-formatting-requirements", "default-complete-example-line", "default-json-validation-line"];
|
|
114
|
+
const missingKeys = expectedKeys.filter((key) => !params[key]);
|
|
115
|
+
if (missingKeys.length > 0) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`Missing required instruction assistance parameters: ${Object.keys(params).filter((key) => !expectedKeys.includes(key)).join(", ")}`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
outputFormattingRequirements: params["output-formatting-requirements"],
|
|
122
|
+
completeExampleInstructionLine: params["default-complete-example-line"],
|
|
123
|
+
jsonOnlyImperativeInstructionLine: params["default-json-validation-line"]
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export { applyInstructionAssistance, generateInstructionAssistanceContent, getInstructionsAssistanceConfigFromRawSsmParams };
|
|
128
|
+
//# sourceMappingURL=instruction-assistance-utils.mjs.map
|
|
129
|
+
//# sourceMappingURL=instruction-assistance-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/instruction-assistance-utils.ts"],"names":[],"mappings":"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","file":"instruction-assistance-utils.mjs","sourcesContent":["/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * The functions in this utility are used both by the front end svelte kit web client in the browser\n * and in the backend lambda converse functions. So, that means it needs to be able\n * to run in a browser. Do not add additional imports beyond anodine types.\n *\n * To be super clear: this is just logic to generate instruction assistance content given\n * the right inputs. It does not collect up those inputs, it is given them.\n *\n */\n\nimport {\n AgentInstructionChatAppOverridableFeature,\n InstructionAssistanceConfig,\n TagDefinition,\n TagDefinitionWidget,\n TagsChatAppOverridableFeature\n} from '../types/chatbot/chatbot-types';\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Generate instruction assistance content based on enabled features\n *\n * @param instructionAssistanceConfig - The instruction assistance configuration from SSM\n * @param tags - The tags configuration from the chat app\n * @param agentInstructionFeature - The agent instruction feature configuration from the chat app\n * @returns The instruction assistance content\n */\nexport function generateInstructionAssistanceContent(\n instructionAssistanceConfig: InstructionAssistanceConfig | undefined,\n tags: TagsChatAppOverridableFeature | undefined,\n agentInstructionFeature: AgentInstructionChatAppOverridableFeature | undefined,\n tagDefinitions: TagDefinition<TagDefinitionWidget>[]\n): InstructionAssistanceConfig {\n console.log('Generating instruction assistance content:', {\n enabled: agentInstructionFeature?.enabled,\n includeOutputFormattingRequirements: agentInstructionFeature?.includeOutputFormattingRequirements,\n includeInstructionsForTags: agentInstructionFeature?.includeInstructionsForTags,\n completeExampleEnabled: agentInstructionFeature?.completeExampleInstructionEnabled,\n jsonOnlyEnabled: agentInstructionFeature?.jsonOnlyImperativeInstructionEnabled\n });\n\n let outputFormattingRequirements = '';\n let tagInstructions = '';\n let completeExampleInstructionLine = '';\n let jsonOnlyImperativeInstructionLine = '';\n\n if (!agentInstructionFeature?.enabled) {\n return {\n outputFormattingRequirements,\n tagInstructions,\n completeExampleInstructionLine,\n jsonOnlyImperativeInstructionLine\n };\n }\n\n // Generate output formatting requirements\n if (agentInstructionFeature.includeOutputFormattingRequirements) {\n outputFormattingRequirements =\n instructionAssistanceConfig?.outputFormattingRequirements ||\n `**Output Formatting Requirements:**\n- **Output Response Enclosure**: All response output MUST be completely enclosed within <answer></answer> tags, including supported custom tags.\n- **Output Content Format:** All responses MUST be in Markdown with supported custom tags.`;\n }\n\n // Generate tag instructions\n if (agentInstructionFeature.includeInstructionsForTags && tags && tags.tagsEnabled?.length > 0) {\n console.log('Fetching tag definitions for instruction generation:', tags.tagsEnabled);\n\n if (tagDefinitions.length > 0) {\n // First create a dictionary listing all supported tags\n const tagDictionary = tagDefinitions\n .filter((tagDef) => tagDef.canBeGeneratedByLlm && !tagDef.disabled)\n .map((tagDef) => ` - ${tagDef.tagTitle}: \\`${tagDef.shortTagEx}\\``)\n .join('\\n');\n\n let tagInstructionsContent = '';\n if (tagDictionary) {\n tagInstructionsContent += `- **Custom Tags Supported:**\\n${tagDictionary}\\n`;\n }\n\n // Then add detailed instructions for each tag\n for (const tagDef of tagDefinitions) {\n if (tagDef.canBeGeneratedByLlm && !tagDef.disabled && tagDef.llmInstructionsMd) {\n const tagType = `${tagDef.scope}.${tagDef.tag}`;\n tagInstructionsContent += `- **${tagDef.tagTitle}:**\\n <tag-instructions type=\"${tagType}\">\\n${tagDef.llmInstructionsMd}\\n </tag-instructions>\\n`;\n }\n }\n\n if (tagInstructionsContent) {\n tagInstructions = tagInstructionsContent;\n }\n }\n }\n\n // Generate complete example instruction line\n if (agentInstructionFeature.completeExampleInstructionEnabled) {\n completeExampleInstructionLine =\n agentInstructionFeature.completeExampleInstructionLine ||\n instructionAssistanceConfig?.completeExampleInstructionLine ||\n '- **Complete Example Output:**\\n `<answer>##Example markdown\\nNormal text and an <image>http://some.url</image> and some **bold text**\\n<chart>(...)</chart></answer>`';\n }\n\n // Generate JSON validation instruction line\n if (agentInstructionFeature.jsonOnlyImperativeInstructionEnabled) {\n jsonOnlyImperativeInstructionLine =\n agentInstructionFeature.jsonOnlyImperativeInstructionLine ||\n instructionAssistanceConfig?.jsonOnlyImperativeInstructionLine ||\n 'BE ABSOLUTELY CERTAIN ANY JSON INCLUDED IS 100% VALID (especially for charts). Invalid JSON will break the user experience.';\n }\n\n console.log('Generated instruction assistance content:', {\n hasOutputFormatting: !!outputFormattingRequirements,\n hasTagInstructions: !!tagInstructions,\n hasCompleteExample: !!completeExampleInstructionLine,\n hasJsonValidation: !!jsonOnlyImperativeInstructionLine\n });\n\n return {\n outputFormattingRequirements,\n tagInstructions,\n completeExampleInstructionLine,\n jsonOnlyImperativeInstructionLine\n };\n}\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Apply instruction assistance to the base prompt using placeholder replacement\n */\nexport function applyInstructionAssistance(basePrompt: string, instructionContent: InstructionAssistanceConfig): string {\n let enhancedPrompt = basePrompt;\n\n // Check for primary placeholder first\n if (enhancedPrompt.includes('{{prompt-assistance}}')) {\n console.log('Found {{prompt-assistance}} placeholder');\n\n const allContent = [\n instructionContent.outputFormattingRequirements,\n instructionContent.tagInstructions,\n instructionContent.completeExampleInstructionLine,\n instructionContent.jsonOnlyImperativeInstructionLine\n ]\n .filter((content) => content && content.trim().length > 0)\n .join('\\n\\n');\n\n enhancedPrompt = enhancedPrompt.replace('{{prompt-assistance}}', allContent);\n } else {\n // Look for fine-grained placeholders\n const placeholders = [\n { placeholder: '{{output-formatting-requirements}}', content: instructionContent.outputFormattingRequirements },\n { placeholder: '{{tag-instructions}}', content: instructionContent.tagInstructions },\n { placeholder: '{{complete-example-instruction-line}}', content: instructionContent.completeExampleInstructionLine },\n { placeholder: '{{json-only-imperative-instruction-line}}', content: instructionContent.jsonOnlyImperativeInstructionLine }\n ];\n\n let hasAnyPlaceholder = false;\n for (const { placeholder, content } of placeholders) {\n if (enhancedPrompt.includes(placeholder) && content) {\n console.log(`Found ${placeholder} placeholder`);\n hasAnyPlaceholder = true;\n enhancedPrompt = enhancedPrompt.replace(placeholder, content);\n }\n }\n\n // If no placeholders found, append to end\n if (!hasAnyPlaceholder) {\n console.log('No placeholders found, appending to end of prompt');\n const allContent = [\n instructionContent.outputFormattingRequirements,\n instructionContent.tagInstructions,\n instructionContent.completeExampleInstructionLine,\n instructionContent.jsonOnlyImperativeInstructionLine\n ].filter((content) => content && content.trim().length > 0);\n\n if (allContent.length > 0) {\n enhancedPrompt = enhancedPrompt + '\\n\\n' + allContent.join('\\n\\n');\n }\n }\n }\n\n return enhancedPrompt;\n}\n\n/**\n * IMPORTANT!!!!!!!!!!!!!!!!!!!!!!\n *\n * See header at top of file for important notes.\n *\n * Get the instruction assistance configuration from raw SSM parameters\n *\n * @param params - The raw SSM parameters\n * @returns The instruction assistance configuration\n */\nexport function getInstructionsAssistanceConfigFromRawSsmParams(params: Record<string, string>): InstructionAssistanceConfig {\n const expectedKeys = ['output-formatting-requirements', 'default-complete-example-line', 'default-json-validation-line'];\n const missingKeys = expectedKeys.filter((key) => !params[key]);\n if (missingKeys.length > 0) {\n throw new Error(\n `Missing required instruction assistance parameters: ${Object.keys(params)\n .filter((key) => !expectedKeys.includes(key))\n .join(', ')}`\n );\n }\n\n return {\n outputFormattingRequirements: params['output-formatting-requirements'],\n completeExampleInstructionLine: params['default-complete-example-line'],\n jsonOnlyImperativeInstructionLine: params['default-json-validation-line']\n };\n}\n"]}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
# Shared libraries go in here
|
|
2
2
|
|
|
3
3
|
This is mostly for shared types and utilities.
|
|
4
|
+
|
|
5
|
+
## Dev Instructions
|
|
6
|
+
|
|
7
|
+
To publish...
|
|
8
|
+
|
|
9
|
+
1. `pnpm run version:major` or `pnpm run version:minor` or `pnpm run version:patch`
|
|
10
|
+
2. commit and push changes
|
|
11
|
+
3. pnpm publish
|