Observed since 20 Oct, 22:21 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agentic-resume-builder
AI-powered resume builder using Strands Agents and Ollama
A Python library that helps users create professional, impact-oriented resumes through an AI-guided interactive process using Strands Agents SDK and Ollama.
ollama serveollama pull llama3.2:3b# Clone the repository
git clone <repository-url>
cd agentic-resume-builder
# Install in development mode
pip install -e .
# Or install with development dependencies
pip install -e ".[dev]"
pip install agentic-resume-builder
# Create from default professional template
agentic-resume init my_resume.md
# Or choose a specific template
agentic-resume init my_resume.md --template academic
# Let the AI guide you through building your resume (uses llama3.2:3b by default)
agentic-resume interactive my_resume.md
# Or use a different Ollama model
agentic-resume --model mistral interactive my_resume.md
agentic-resume --model llama3.2 interactive my_resume.md
The AI will ask you questions about your experiences and automatically update your resume with impact-oriented content.
# Create a professional PDF
agentic-resume generate my_resume.md my_resume.pdf
# Convert your existing PDF resume to Markdown
agentic-resume import old_resume.pdf my_resume.md
# Then continue with interactive session
agentic-resume interactive my_resume.md
These options can be used with any command:
--config PATH # Path to custom configuration file (YAML)
--model MODEL # Ollama model to use (default: llama3.2:3b)
Examples:
# Use a different model for all commands
agentic-resume --model mistral interactive my_resume.md
agentic-resume --model llama3.2 interactive my_resume.md
agentic-resume --model codellama interactive my_resume.md
# Use custom configuration file
agentic-resume --config my_config.yaml interactive my_resume.md
# Combine both options
agentic-resume --config my_config.yaml --model mistral interactive my_resume.md
Popular Ollama Models:
llama3.2:3b - Default, fast and efficient (3B parameters)llama3.2 - Larger version with better quality (7B+ parameters)mistral - Alternative high-quality modelcodellama - Optimized for technical resumesphi - Microsoft's efficient modelTo install a model: ollama pull <model_name>
init - Create New ResumeCreate a new resume from a template.
agentic-resume init <output_path> [--template TEMPLATE]
# Examples:
agentic-resume init my_resume.md
agentic-resume init my_resume.md --template academic
agentic-resume init my_resume.md --template technical
Options:
--template: Template type (professional, academic, technical). Default: professionalload - Load Existing ResumeLoad and validate an existing Markdown resume.
agentic-resume load <markdown_path>
# Example:
agentic-resume load my_resume.md
import - Import from PDFImport a resume from PDF format and convert to Markdown.
agentic-resume import <pdf_path> <output_path>
# Example:
agentic-resume import old_resume.pdf my_resume.md
interactive - Start AI SessionStart an AI-assisted interactive session to build your resume.
agentic-resume interactive <markdown_path> [--config CONFIG]
# Examples:
agentic-resume interactive my_resume.md
agentic-resume interactive my_resume.md --config custom_config.yaml
Options:
--config: Path to custom configuration fileDuring the session:
quit or exit to save and exitpause to save and pause the sessiongenerate - Generate PDFGenerate a professional PDF from your Markdown resume.
agentic-resume generate <markdown_path> <output_path> [--style STYLE]
# Examples:
agentic-resume generate my_resume.md my_resume.pdf
agentic-resume generate my_resume.md my_resume.pdf --style custom_style.yaml
Options:
--style: Path to custom PDF style configurationresume - Resume SessionContinue a previously saved interactive session.
agentic-resume resume <session_id>
# Example:
agentic-resume resume 550e8400-e29b-41d4-a716-446655440000
Note: Session IDs are displayed when you pause or exit an interactive session.
For detailed help on any command:
agentic-resume --help
agentic-resume <command> --help
The library provides a high-level Python API for programmatic use.
from agentic_resume_builder import api
# Create a new resume
resume = api.create_resume("my_resume.md", template="professional")
# Load an existing resume
resume = api.load_resume("my_resume.md")
# Import from PDF
resume = api.import_resume_from_pdf("old_resume.pdf", "my_resume.md")
# Generate PDF
api.generate_pdf(resume, "my_resume.pdf")
from agentic_resume_builder import api
# Load resume
resume = api.load_resume("my_resume.md")
# Start interactive session
session = api.start_interactive_session(resume)
# In a real application, you would present questions to the user
# and process their responses in a loop
from agentic_resume_builder import api
resume = api.load_resume("my_resume.md")
# Update multiple sections at once
updates = [
{"section_name": "Summary", "content": "Experienced software engineer..."},
{"section_name": "Skills", "content": "Python, JavaScript, Go, AWS"}
]
resume = api.batch_update_resume(resume, updates)
# Save changes
api.save_resume(resume)
from agentic_resume_builder import api
def my_callback(question):
"""Handle questions from the AI agent."""
print(question.text)
return input("Your answer: ")
# Run complete workflow from start to finish
resume = api.complete_workflow(
input_path="my_resume.md",
output_pdf_path="my_resume.pdf",
interactive_callback=my_callback
)
from agentic_resume_builder import api
resume = api.load_resume("my_resume.md")
# Validate resume
validation = api.validate_resume(resume)
if not validation["is_valid"]:
print("Errors:", validation["errors"])
print("Warnings:", validation["warnings"])
# Get statistics
stats = api.get_resume_statistics(resume)
print(f"Completeness: {stats['completeness_score']:.1%}")
print(f"Experiences: {stats['num_experiences']}")
print(f"Metrics found: {stats['num_metrics']}")
For more examples, see the examples/ directory and API Examples README.
You can customize the behavior using a YAML configuration file.
Create a config.yaml file:
# Ollama Configuration
ollama:
base_url: "http://localhost:11434" # Ollama server URL (must be local)
model: "llama3.2:3b" # Model to use
temperature: 0.7 # Generation temperature (0.0-2.0)
timeout: 30 # Request timeout in seconds
# PDF Style Configuration
pdf_style:
font_family: "Helvetica" # Font family
font_size: 11 # Base font size
heading_font_size: 14 # Heading font size
line_spacing: 1.2 # Line spacing multiplier
# Margins (in cm)
margin_top: 2.0
margin_bottom: 2.0
margin_left: 2.0
margin_right: 2.0
# Colors (hex format)
color_primary: "#000000" # Primary text color
color_secondary: "#666666" # Secondary text color
color_accent: "#0066cc" # Accent color for highlights
# Template and Session Directories
templates:
directory: "./templates"
default: "professional"
sessions:
directory: "./sessions"
auto_save: true
save_interval: 60 # Auto-save interval in seconds
With CLI:
agentic-resume --config config.yaml interactive my_resume.md
With Python API:
from agentic_resume_builder import ResumeConfig
# Load from YAML
config = ResumeConfig.from_yaml("config.yaml")
# Or create programmatically
from agentic_resume_builder import OllamaConfig, PDFStyle
config = ResumeConfig(
ollama=OllamaConfig(
model="llama3.2:3b",
temperature=0.8
),
pdf_style=PDFStyle(
font_family="Arial",
font_size=11
)
)
| Option | Type | Default | Description |
|---|---|---|---|
base_url | string | http://localhost:11434 | Ollama server URL (must be local) |
model | string | llama3.2:3b | Model name to use |
temperature | float | 0.7 | Generation temperature (0.0-2.0) |
timeout | int | 30 | Request timeout in seconds |
Recommended Models:
llama3.2:3b: General purpose, good balancellama3: Improved reasoningmistral: Fast and efficientcodellama: For technical resumesphi: Lightweight and fast| Option | Type | Default | Description |
|---|---|---|---|
font_family | string | Helvetica | Font family name |
font_size | int | 11 | Base font size in points |
heading_font_size | int | 14 | Heading font size in points |
line_spacing | float | 1.2 | Line spacing multiplier |
margin_top | float | 2.0 | Top margin in cm |
margin_bottom | float | 2.0 | Bottom margin in cm |
margin_left | float | 2.0 | Left margin in cm |
margin_right | float | 2.0 | Right margin in cm |
color_primary | string | #000000 | Primary text color (hex) |
color_secondary | string | #666666 | Secondary text color (hex) |
color_accent | string | #0066cc | Accent color (hex) |
For more details, see docs/configuration.md.
The examples/ directory contains comprehensive examples:
api_basic_usage.py - Basic API operations (create, load, import, generate)api_interactive_workflow.py - Interactive sessions with the AI agentapi_advanced_patterns.py - Advanced patterns and best practicesresume_manager_example.py - Using ResumeManager directlypdf_generator_example.py - PDF generation with custom stylingollama_client_example.py - Ollama integration examplesSee examples/API_EXAMPLES_README.md for detailed documentation.
# Clone repository
git clone <repository-url>
cd agentic-resume-builder
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install with development dependencies
pip install -e ".[dev]"
# Run all tests
pytest
# Run specific test types
pytest tests/unit/ # Unit tests only
pytest tests/property/ # Property-based tests only
pytest tests/integration/ # Integration tests only
# Run with coverage
pytest --cov=agentic_resume_builder --cov-report=html
# Run with verbose output
pytest -v
# Format code
black src/ tests/
# Lint code
ruff check src/ tests/
# Type checking (if mypy is installed)
mypy src/
agentic-resume-builder/
├── src/agentic_resume_builder/ # Main package
│ ├── __init__.py # Package initialization & API
│ ├── models.py # Data models (Pydantic)
│ ├── exceptions.py # Custom exceptions
│ ├── config.py # Configuration models
│ ├── manager.py # Resume manager
│ ├── agent.py # AI agent (Strands)
│ ├── agent_tools.py # Agent tools
│ ├── markdown_processor.py # Markdown parsing/rendering
│ ├── document_converter.py # PDF to Markdown conversion
│ ├── pdf_generator.py # PDF generation
│ ├── session_manager.py # Session persistence
│ ├── ollama_client.py # Ollama integration
│ └── cli.py # Command-line interface
├── tests/
│ ├── unit/ # Unit tests
│ ├── property/ # Property-based tests
│ ├── integration/ # Integration tests
│ └── conftest.py # Shared fixtures
├── examples/ # Usage examples
├── docs/ # Documentation
├── pyproject.toml # Project configuration
└── README.md # This file
For more details, see DEVELOPMENT.md.
Problem: "Could not connect to Ollama"
Solutions:
ollama servecurl http://localhost:11434/api/tagsProblem: "Model not found: llama3.2:3b"
Solutions:
ollama pull llama3.2:3bollama listProblem: "PDF generation failed"
Solutions:
Problem: "PDF conversion produced poor results"
Solutions:
Problem: "Session not found"
Solutions:
For more troubleshooting help, see docs/troubleshooting.md.
MIT License - see LICENSE file for details
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)pytest)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
strands-agentsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | strands-agents | runtime |
ollamaEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | ollama | runtime |
markitdownEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | markitdown | runtime |
markdownEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | markdown>=3.4.0 | runtime |
weasyprintEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | weasyprint>=60.0 | runtime |
pydanticEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pydantic>=2.0.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0.0 | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.4.0; extra == "dev" | runtime |
hypothesisEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | hypothesis>=6.90.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.1.0; extra == "dev" | runtime |
blackEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | black>=23.0.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.1.0; extra == "dev" | runtime |
bdist_wheel · 64.47 KB · Python py3
sdist · 63.26 KB · Python source
Observed since 20 Oct, 22:21 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:51433d275fa4e171c58c069433d3ace2a214f8e9c4795aaa2866d611758aeebc