Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
An easy-to-use prompt builder for creating structured prompts in TypeScript for Large Language Models (LLMs) and AI applications.
This project aims to improve prompt readability and maintainability through a simple interface, compatible with various AI models from OpenAI, Anthropic, Google Gemini, and more. It also uses an XML-based prompt structure recommended by Anthropic to improve prompt quality and model understanding.
Originally developed to meet DreamLoom's internal needs, we've open-sourced it to benefit the wider community. We welcome your suggestions for improvements and other feedback on GitHub.
Contribute to the project on GitHub
This project utilizes XML-based prompts, which is the preferred structure for Anthropic's Claude AI model. According to Anthropic's documentation, using XML tags in prompts offers several advantages:
While recommended by Anthropic for Claude, this structured approach to prompt engineering can be extremely beneficial when working with other LLMs and AI models as well, helping the models understand and respond better to your prompts, making them more accurate and useful.
Install prompt-ez using npm:
npm install prompt-ez
The PromptBuilder
class is the main interface for creating structured prompts. Here's a quick overview of its methods:
tag(name: string, contentFn?: (builder: PromptBuilder) => void): PromptBuilder
name
: The name of the tag.contentFn
: Optional function to add content inside the tag.text(text: string): PromptBuilder
list(items: string[]): PromptBuilder
inputs(): PromptBuilder
build(params?: Record<string, unknown>): string
params
: Optional object with key-value pairs for dynamic inputs.
Here's a simple example of creating a structured prompt:
import PromptBuilder from 'prompt-ez';
const prompt = new PromptBuilder()
.tag('system', b => b
.text('You are a helpful AI assistant.')
.text('Please provide accurate and concise information.')
)
.tag('task', b => b
.text('Explain the benefits of regular exercise.')
)
.tag('output_format', b => b
.text('Provide the explanation in a paragraph.')
)
.build();
console.log(prompt);
This generates the following prompt:
<system>
You are a helpful AI assistant.
Please provide accurate and concise information.
</system>
<task>
Explain the benefits of regular exercise.
</task>
<output_format>
Provide the explanation in a paragraph.
</output_format>
Here's how to use dynamic inputs in your prompts:
const promptWithInputs = new PromptBuilder()
.tag('system', b => b
.text('You are a language translator.')
)
.tag('task', b => b
.text('Translate the following text:')
.inputs()
)
.build({
source_language: 'English',
target_language: 'French',
text: 'Hello, how are you?'
});
console.log(promptWithInputs);
This produces:
<system>
You are a language translator.
</system>
<task>
Translate the following text:
<source_language>English</source_language>
<target_language>French</target_language>
<text>Hello, how are you?</text>
</task>
Here's a more complex example that demonstrates nested tags, list creation, and dynamic inputs:
import PromptBuilder from 'prompt-ez';
export const AI_MEDICAL_DIAGNOSIS_PROMPT = new PromptBuilder()
.tag('medical_diagnosis_prompt', (builder) =>
builder
.tag('role', (b) => b.text('Act as an AI medical assistant. Analyze the provided patient information and suggest three potential diagnoses with recommended next steps.'))
.inputs()
.tag('guidelines', (b) =>
b
.text('For each potential diagnosis:')
.list([
'Consider the patient\'s symptoms, medical history, and test results',
'Provide a brief explanation of the condition',
'List key symptoms that align with the diagnosis',
'Suggest additional tests or examinations if needed',
'Outline potential treatment options',
'Indicate the urgency level (e.g., immediate attention, routine follow-up)',
'Highlight any lifestyle changes or preventive measures',
'Consider possible complications if left untreated',
'Use medical terminology appropriately, with layman explanations',
'Provide a confidence level for each diagnosis (low, medium, high)',
'First analyze the information thoroughly, then produce the output'
])
)
.tag('reminder', (b) => b.text('Ensure the diagnoses are evidence-based and consider a range of possibilities from common to rare conditions. Always emphasize the importance of consulting with a human healthcare professional for a definitive diagnosis.'))
.tag('output_format', (b) =>
b.list([
'Present information in a clear, structured manner',
'Use bullet points for symptoms and recommendations',
'Include relevant medical terms with brief explanations',
'Provide a summary of each potential diagnosis',
'Suggest follow-up questions to gather more information if needed',
'End with a disclaimer about the limitations of AI diagnosis'
])
)
)
.build({
patient_age: 45,
patient_gender: 'Female',
main_symptoms: 'Persistent headache, blurred vision, and occasional dizziness for the past two weeks',
medical_history: 'Hypertension, controlled with medication',
recent_tests: 'Blood pressure: 150/95 mmHg, Blood sugar: 110 mg/dL (fasting)'
});
console.log(AI_MEDICAL_DIAGNOSIS_PROMPT);
This will generate a complex, structured prompt for an AI medical diagnosis scenario:
<medical_diagnosis_prompt>
<role>Act as an AI medical assistant. Analyze the provided patient information and suggest three potential diagnoses with recommended next steps.</role>
<patient_age>45</patient_age>
<patient_gender>Female</patient_gender>
<main_symptoms>Persistent headache, blurred vision, and occasional dizziness for the past two weeks</main_symptoms>
<medical_history>Hypertension, controlled with medication</medical_history>
<recent_tests>Blood pressure: 150/95 mmHg, Blood sugar: 110 mg/dL (fasting)</recent_tests>
<guidelines>
For each potential diagnosis:
1. Consider the patient's symptoms, medical history, and test results
2. Provide a brief explanation of the condition
3. List key symptoms that align with the diagnosis
4. Suggest additional tests or examinations if needed
5. Outline potential treatment options
6. Indicate the urgency level (e.g., immediate attention, routine follow-up)
7. Highlight any lifestyle changes or preventive measures
8. Consider possible complications if left untreated
9. Use medical terminology appropriately, with layman explanations
10. Provide a confidence level for each diagnosis (low, medium, high)
11. First analyze the information thoroughly, then produce the output
</guidelines>
<reminder>Ensure the diagnoses are evidence-based and consider a range of possibilities from common to rare conditions. Always emphasize the importance of consulting with a human healthcare professional for a definitive diagnosis.</reminder>
<output_format>
1. Present information in a clear, structured manner
2. Use bullet points for symptoms and recommendations
3. Include relevant medical terms with brief explanations
4. Provide a summary of each potential diagnosis
5. Suggest follow-up questions to gather more information if needed
6. End with a disclaimer about the limitations of AI diagnosis
</output_format>
</medical_diagnosis_prompt>
We welcome contributions! Please see our Contributing Guide for more details on how to get started.
prompt-ez is released under the MIT License. See the LICENSE file for more details.
FAQs
An easy-to-use prompt builder for creating structured prompts
We found that prompt-ez demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.