| # Integration Examples | |
| This document provides concrete examples of integrating LLMPromptKit into various applications and workflows. | |
| ## Customer Support Chatbot | |
| ### Setup | |
| ```python | |
| from llmpromptkit import PromptManager, VersionControl | |
| import openai | |
| # Initialize components | |
| prompt_manager = PromptManager() | |
| version_control = VersionControl(prompt_manager) | |
| # Create prompt templates for different scenarios | |
| greeting_prompt = prompt_manager.create( | |
| content="You are a helpful customer service agent for {company_name}. Greet the customer politely.", | |
| name="Customer Greeting", | |
| tags=["customer-service", "greeting"] | |
| ) | |
| inquiry_prompt = prompt_manager.create( | |
| content=""" | |
| You are a helpful customer service agent for {company_name}. | |
| Customer inquiry: {customer_message} | |
| Based on this inquiry: | |
| 1. Identify the main issue | |
| 2. Provide a helpful response | |
| 3. Offer additional assistance | |
| Keep your tone professional but friendly. | |
| """, | |
| name="Customer Inquiry Response", | |
| tags=["customer-service", "inquiry"] | |
| ) | |
| # Version them | |
| version_control.commit(greeting_prompt.id, "Initial version") | |
| version_control.commit(inquiry_prompt.id, "Initial version") | |
| # OpenAI callback | |
| def generate_response(prompt_text): | |
| response = openai.ChatCompletion.create( | |
| model="gpt-3.5-turbo", | |
| messages=[{"role": "user", "content": prompt_text}] | |
| ) | |
| return response.choices[0].message.content | |
| # Main handler function | |
| def handle_customer_message(customer_name, message, is_new_conversation): | |
| if is_new_conversation: | |
| # Use greeting prompt for new conversations | |
| prompt = prompt_manager.get(greeting_prompt.id) | |
| prompt_text = prompt.render(company_name="Acme Inc.") | |
| return generate_response(prompt_text) | |
| else: | |
| # Use inquiry prompt for ongoing conversations | |
| prompt = prompt_manager.get(inquiry_prompt.id) | |
| prompt_text = prompt.render( | |
| company_name="Acme Inc.", | |
| customer_message=message | |
| ) | |
| return generate_response(prompt_text) | |
| ``` | |
| ## Content Generation System | |
| ### Setup | |
| ```python | |
| from llmpromptkit import PromptManager, PromptTesting, Evaluator | |
| import asyncio | |
| # Initialize components | |
| prompt_manager = PromptManager("content_system_prompts") | |
| testing = PromptTesting(prompt_manager) | |
| evaluator = Evaluator(prompt_manager) | |
| # Create content generation prompt | |
| blog_prompt = prompt_manager.create( | |
| content=""" | |
| Write a blog post about {topic}. | |
| Title: {title} | |
| The post should: | |
| - Be approximately {word_count} words | |
| - Be written in a {tone} tone | |
| - Include {num_sections} main sections | |
| - Target audience: {audience} | |
| - Include a compelling call-to-action at the end | |
| Keywords to include: {keywords} | |
| """, | |
| name="Blog Post Generator", | |
| tags=["content", "blog"] | |
| ) | |
| # Test cases | |
| test_case = testing.create_test_case( | |
| prompt_id=blog_prompt.id, | |
| input_vars={ | |
| "topic": "Sustainable Living", | |
| "title": "10 Simple Ways to Reduce Your Carbon Footprint", | |
| "word_count": "800", | |
| "tone": "informative yet casual", | |
| "num_sections": "5", | |
| "audience": "environmentally-conscious millennials", | |
| "keywords": "sustainability, eco-friendly, carbon footprint, climate change, lifestyle changes" | |
| } | |
| ) | |
| # LLM callback | |
| async def content_llm_callback(prompt, vars): | |
| # Call your preferred LLM API here | |
| # This is a placeholder | |
| return f"Generated content about {vars.get('topic', 'unknown topic')}" | |
| # Content generation function | |
| async def generate_content(content_type, parameters): | |
| if content_type == "blog": | |
| prompt = prompt_manager.get(blog_prompt.id) | |
| rendered_prompt = prompt.render(**parameters) | |
| # Generate content | |
| content = await content_llm_callback(rendered_prompt, parameters) | |
| # Evaluate quality | |
| evaluation = await evaluator.evaluate_prompt( | |
| prompt_id=blog_prompt.id, | |
| inputs=[parameters], | |
| llm_callback=content_llm_callback | |
| ) | |
| quality_score = evaluation["aggregated_metrics"].get("length", 0) | |
| return { | |
| "content": content, | |
| "quality_score": quality_score, | |
| "metadata": { | |
| "prompt_id": blog_prompt.id, | |
| "prompt_version": prompt.version, | |
| "parameters": parameters | |
| } | |
| } | |
| else: | |
| raise ValueError(f"Unsupported content type: {content_type}") | |
| ``` | |
| ## AI-Assisted Research Tool | |
| ### Setup | |
| ```python | |
| from llmpromptkit import PromptManager, VersionControl | |
| import json | |
| import openai | |
| # Initialize components | |
| prompt_manager = PromptManager("research_prompts") | |
| version_control = VersionControl(prompt_manager) | |
| # Create research prompts | |
| article_summary_prompt = prompt_manager.create( | |
| content=""" | |
| Summarize the following research article: | |
| Title: {article_title} | |
| Abstract: {article_abstract} | |
| Provide a summary that: | |
| 1. Identifies the main research question | |
| 2. Outlines the methodology | |
| 3. Summarizes key findings | |
| 4. Highlights limitations | |
| 5. Explains the significance of the results | |
| Keep the summary concise, approximately 250 words. | |
| """, | |
| name="Article Summarizer", | |
| tags=["research", "summary"] | |
| ) | |
| research_question_prompt = prompt_manager.create( | |
| content=""" | |
| Based on the following information: | |
| Research Area: {research_area} | |
| Existing Knowledge: {existing_knowledge} | |
| Observed Gap: {knowledge_gap} | |
| Generate 5 potential research questions that: | |
| 1. Address the identified knowledge gap | |
| 2. Are specific and answerable | |
| 3. Have theoretical or practical significance | |
| 4. Can be investigated with available research methods | |
| """, | |
| name="Research Question Generator", | |
| tags=["research", "question-generation"] | |
| ) | |
| # Version control | |
| version_control.commit(article_summary_prompt.id, "Initial version") | |
| version_control.commit(research_question_prompt.id, "Initial version") | |
| # OpenAI callback | |
| def research_assistant(prompt_text): | |
| response = openai.ChatCompletion.create( | |
| model="gpt-4", | |
| messages=[{"role": "user", "content": prompt_text}] | |
| ) | |
| return response.choices[0].message.content | |
| # Research functions | |
| def summarize_article(article_title, article_abstract): | |
| prompt = prompt_manager.get(article_summary_prompt.id) | |
| prompt_text = prompt.render( | |
| article_title=article_title, | |
| article_abstract=article_abstract | |
| ) | |
| return research_assistant(prompt_text) | |
| def generate_research_questions(research_area, existing_knowledge, knowledge_gap): | |
| prompt = prompt_manager.get(research_question_prompt.id) | |
| prompt_text = prompt.render( | |
| research_area=research_area, | |
| existing_knowledge=existing_knowledge, | |
| knowledge_gap=knowledge_gap | |
| ) | |
| return research_assistant(prompt_text) | |
| # Save results | |
| def save_research_data(research_project, data_type, content): | |
| # Save the data along with prompt metadata for reproducibility | |
| if data_type == "summary": | |
| prompt_id = article_summary_prompt.id | |
| prompt = prompt_manager.get(prompt_id) | |
| elif data_type == "questions": | |
| prompt_id = research_question_prompt.id | |
| prompt = prompt_manager.get(prompt_id) | |
| research_data = { | |
| "content": content, | |
| "metadata": { | |
| "prompt_id": prompt_id, | |
| "prompt_version": prompt.version, | |
| "timestamp": datetime.datetime.now().isoformat() | |
| } | |
| } | |
| # Save to file (in real application, might save to database) | |
| with open(f"{research_project}_{data_type}.json", "w") as f: | |
| json.dump(research_data, f, indent=2) | |
| ``` | |
| ## Educational Quiz Generator | |
| ### Setup | |
| ```python | |
| from llmpromptkit import PromptManager, PromptTemplate | |
| import asyncio | |
| import aiohttp | |
| # Initialize components | |
| prompt_manager = PromptManager("education_prompts") | |
| # Quiz generation prompt | |
| quiz_prompt = prompt_manager.create( | |
| content=""" | |
| Generate a quiz on the topic of {topic} at a {difficulty_level} difficulty level. | |
| The quiz should: | |
| - Have {num_questions} multiple-choice questions | |
| - Cover the following subtopics: {subtopics} | |
| - Include {include_explanation} explanations for the correct answers | |
| - Be appropriate for {grade_level} students | |
| For each question, provide: | |
| 1. The question text | |
| 2. Four possible answers (A, B, C, D) | |
| 3. The correct answer | |
| {if include_explanation == "yes"} | |
| 4. An explanation of why the answer is correct | |
| {endif} | |
| Format the output as valid JSON. | |
| """, | |
| name="Quiz Generator", | |
| tags=["education", "quiz"] | |
| ) | |
| # Quiz rendering template using advanced templating | |
| render_template = PromptTemplate(""" | |
| <h1>{quiz_title}</h1> | |
| <form id="quiz-form"> | |
| {for question in questions} | |
| <div class="question"> | |
| <p><strong>Question {question.number}:</strong> {question.text}</p> | |
| <ul style="list-style-type: none;"> | |
| {for option in question.options} | |
| <li> | |
| <input type="radio" name="q{question.number}" id="q{question.number}_{option.letter}" value="{option.letter}"> | |
| <label for="q{question.number}_{option.letter}">{option.letter}. {option.text}</label> | |
| </li> | |
| {endfor} | |
| </ul> | |
| {if show_answers} | |
| <div class="answer"> | |
| <p><strong>Correct Answer:</strong> {question.correct_answer}</p> | |
| {if question.has_explanation} | |
| <p><strong>Explanation:</strong> {question.explanation}</p> | |
| {endif} | |
| </div> | |
| {endif} | |
| </div> | |
| {endfor} | |
| {if !show_answers} | |
| <button type="submit">Submit Quiz</button> | |
| {endif} | |
| </form> | |
| """) | |
| # LLM callback | |
| async def education_llm_callback(prompt, vars): | |
| # This would call your LLM API | |
| # Simulated response for this example | |
| await asyncio.sleep(1) # Simulate API call | |
| if "quiz" in prompt: | |
| return """ | |
| { | |
| "questions": [ | |
| { | |
| "text": "What is the capital of France?", | |
| "options": [ | |
| {"letter": "A", "text": "London"}, | |
| {"letter": "B", "text": "Berlin"}, | |
| {"letter": "C", "text": "Paris"}, | |
| {"letter": "D", "text": "Madrid"} | |
| ], | |
| "correct_answer": "C", | |
| "explanation": "Paris is the capital and most populous city of France." | |
| }, | |
| { | |
| "text": "Who wrote 'Romeo and Juliet'?", | |
| "options": [ | |
| {"letter": "A", "text": "Charles Dickens"}, | |
| {"letter": "B", "text": "William Shakespeare"}, | |
| {"letter": "C", "text": "Jane Austen"}, | |
| {"letter": "D", "text": "Mark Twain"} | |
| ], | |
| "correct_answer": "B", | |
| "explanation": "William Shakespeare wrote 'Romeo and Juliet' around 1594-1596." | |
| } | |
| ] | |
| } | |
| """ | |
| return "Default response" | |
| # Quiz generation function | |
| async def generate_quiz(topic, difficulty, num_questions, grade_level, include_explanations=True): | |
| prompt = prompt_manager.get(quiz_prompt.id) | |
| rendered_prompt = prompt.render( | |
| topic=topic, | |
| difficulty_level=difficulty, | |
| num_questions=num_questions, | |
| subtopics=", ".join(["key concepts", "historical context", "practical applications"]), | |
| include_explanation="yes" if include_explanations else "no", | |
| grade_level=grade_level | |
| ) | |
| # Get quiz content from LLM | |
| quiz_json = await education_llm_callback(rendered_prompt, {}) | |
| # Parse JSON | |
| quiz_data = json.loads(quiz_json) | |
| # Prepare data for HTML template | |
| template_data = { | |
| "quiz_title": f"{topic} Quiz ({difficulty} Level)", | |
| "questions": [], | |
| "show_answers": False | |
| } | |
| # Format questions | |
| for i, q in enumerate(quiz_data["questions"]): | |
| question = { | |
| "number": i + 1, | |
| "text": q["text"], | |
| "options": q["options"], | |
| "correct_answer": q["correct_answer"], | |
| "has_explanation": "explanation" in q, | |
| "explanation": q.get("explanation", "") | |
| } | |
| template_data["questions"].append(question) | |
| # Render HTML | |
| return render_template.render(**template_data) | |
| ``` | |
| ## Automated Coding Assistant | |
| ### Setup | |
| ```python | |
| from llmpromptkit import PromptManager, PromptTesting | |
| import asyncio | |
| import subprocess | |
| import tempfile | |
| # Initialize components | |
| prompt_manager = PromptManager("coding_prompts") | |
| testing = PromptTesting(prompt_manager) | |
| # Create code generation prompts | |
| function_prompt = prompt_manager.create( | |
| content=""" | |
| Write a {language} function that solves the following problem: | |
| {problem_description} | |
| Function signature: {function_signature} | |
| Requirements: | |
| - The function should handle edge cases | |
| - Include appropriate comments | |
| - Follow {language} best practices | |
| - Be optimized for {optimization_goal} | |
| {if include_tests == "yes"} | |
| Also include unit tests for the function. | |
| {endif} | |
| """, | |
| name="Function Generator", | |
| tags=["coding", "function"] | |
| ) | |
| bug_fix_prompt = prompt_manager.create( | |
| content=""" | |
| Debug the following {language} code which has an issue: | |
| ```{language} | |
| {buggy_code} | |
| ``` | |
| Error message or problem description: | |
| {error_description} | |
| Please: | |
| 1. Identify the issue | |
| 2. Explain the root cause | |
| 3. Provide a fixed version of the code | |
| 4. Suggest how to prevent similar issues | |
| """, | |
| name="Bug Fix Assistant", | |
| tags=["coding", "debugging"] | |
| ) | |
| # LLM callback | |
| async def coding_llm_callback(prompt, vars): | |
| # This would call your LLM API | |
| # Simplified example response | |
| await asyncio.sleep(1) | |
| if "function" in prompt: | |
| return """ | |
| ```python | |
| def find_max_subarray_sum(arr): | |
| """ | |
| Finds the maximum sum of any contiguous subarray. | |
| Uses Kadane's algorithm with O(n) time complexity. | |
| Args: | |
| arr: List of integers | |
| Returns: | |
| Maximum subarray sum | |
| """ | |
| if not arr: | |
| return 0 | |
| current_max = global_max = arr[0] | |
| for num in arr[1:]: | |
| current_max = max(num, current_max + num) | |
| global_max = max(global_max, current_max) | |
| return global_max | |
| # Unit tests | |
| def test_find_max_subarray_sum(): | |
| assert find_max_subarray_sum([]) == 0 | |
| assert find_max_subarray_sum([-2, 1, -3, 4, -1, 2, 1, -5, 4]) == 6 | |
| assert find_max_subarray_sum([-1, -2, -3]) == -1 | |
| print("All tests passed!") | |
| ``` | |
| """ | |
| elif "debug" in prompt: | |
| return """ | |
| The issue is a classic off-by-one error in the loop boundary. | |
| Root cause: | |
| The loop is using `i <= len(arr)` which accesses an index that's out of bounds. | |
| Fixed code: | |
| ```python | |
| def process_array(arr): | |
| result = [] | |
| for i in range(len(arr)): # Changed from i <= len(arr) | |
| result.append(arr[i] * 2) | |
| return result | |
| ``` | |
| Prevention: | |
| - Remember that array indices are 0-based and go up to len(arr)-1 | |
| - Use range() or enumerate() when iterating through arrays by index | |
| - Add bounds checking for critical operations | |
| """ | |
| return "Default response" | |
| # Function to test generated code | |
| def test_generated_code(code, language): | |
| """Test the generated code by running it in a safe environment.""" | |
| if language.lower() == "python": | |
| with tempfile.NamedTemporaryFile(suffix=".py") as temp: | |
| temp.write(code.encode()) | |
| temp.flush() | |
| try: | |
| result = subprocess.run(["python", temp.name], | |
| capture_output=True, | |
| text=True, | |
| timeout=5) | |
| if result.returncode == 0: | |
| return {"success": True, "output": result.stdout} | |
| else: | |
| return {"success": False, "error": result.stderr} | |
| except subprocess.TimeoutExpired: | |
| return {"success": False, "error": "Code execution timed out"} | |
| return {"success": False, "error": f"Testing not implemented for {language}"} | |
| # Main coding assistant function | |
| async def generate_function(problem, language="python", optimization_goal="readability", include_tests=True): | |
| function_name = problem.lower().replace(" ", "_").replace("-", "_") | |
| signature = f"def {function_name}(parameters):" | |
| prompt = prompt_manager.get(function_prompt.id) | |
| rendered_prompt = prompt.render( | |
| language=language, | |
| problem_description=problem, | |
| function_signature=signature, | |
| optimization_goal=optimization_goal, | |
| include_tests="yes" if include_tests else "no" | |
| ) | |
| # Get code from LLM | |
| generated_code = await coding_llm_callback(rendered_prompt, {}) | |
| # Extract code from markdown if present | |
| if "```" in generated_code: | |
| code_blocks = re.findall(r"```(?:\w+)?\n(.+?)```", generated_code, re.DOTALL) | |
| if code_blocks: | |
| clean_code = code_blocks[0] | |
| else: | |
| clean_code = generated_code | |
| else: | |
| clean_code = generated_code | |
| # Test the code | |
| test_result = test_generated_code(clean_code, language) | |
| return { | |
| "code": clean_code, | |
| "test_result": test_result, | |
| "prompt_id": function_prompt.id | |
| } | |
| ``` | |