| name | aws_bedrock_integration |
| description | Use AWS Bedrock with Nova models for JD generation, embeddings, and agentic workflows |
AWS Bedrock Integration Skill
Purpose
Master AWS Bedrock integration with Nova models for the AARLP platform. This skill covers Bedrock client usage, Nova model invocation, embedding generation, and provider switching for the Amazon Nova AI Hackathon.
Hackathon Context
Amazon Nova AI Hackathon Entry:
Provider Configuration
Environment Variables (.env)
AI_PROVIDER=bedrock
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_REGION=us-east-1
BEDROCK_MODEL_ID=amazon.nova-lite-v1:0
BEDROCK_EMBEDDING_MODEL_ID=amazon.titan-embed-text-v2:0
OPENAI_API_KEY=sk-...
Switching Providers
from app.ai.client import is_bedrock_provider, get_ai_provider
provider = get_ai_provider()
if is_bedrock_provider():
from app.ai.bedrock_client import invoke_nova_model
result = await invoke_nova_model(messages=[...])
else:
from app.ai.client import get_openai_client
client = get_openai_client()
Nova Models Available
Text Generation (via Bedrock)
| Model ID | Use Case | Tokens | Speed |
|---|
amazon.nova-lite-v1:0 | Fast JD generation | 300K | Fastest |
amazon.nova-pro-v1:0 | Complex reasoning | 300K | Fast |
amazon.nova-premier-v1:0 | Best quality | 1M | Slower |
Embeddings
| Model ID | Dimensions | Use Case |
|---|
amazon.titan-embed-text-v2:0 | 1024 | Text embeddings |
amazon.titan-embed-image-v1:0 | 1024 | Multimodal |
Core Usage
1. Invoke Nova Model
from app.ai.bedrock_client import invoke_nova_model
result = await invoke_nova_model(
messages=[{"role": "user", "content": "Generate a JD for a Python developer"}],
system_prompt="You are an expert HR professional.",
max_tokens=2048,
temperature=0.7
)
print(result)
2. Generate Embeddings
from app.ai.bedrock_client import generate_embedding
embedding = await generate_embedding("Senior Python Developer with FastAPI experience")
print(f"Dimension: {len(embedding)}")
3. JD Generation with Nova
from app.ai.jd_generator import generate_job_description
from app.jobs.schemas import JobInput
job_input = JobInput(
role_title="Senior Backend Engineer",
company_name="TechCorp",
experience_years=5,
key_requirements=["Python", "FastAPI", "PostgreSQL"],
)
jd = await generate_job_description(job_input)
print(jd.job_title)
print(jd.description)
Bedrock Client Architecture
Files
app/ai/
├── client.py # Provider abstraction (is_bedrock_provider)
├── bedrock_client.py # Bedrock client factory, invoke functions
├── bedrock_utils.py # Message formatting, response parsing
├── jd_generator.py # JD generation (supports both providers)
└── embeddings.py # Embeddings (supports both providers)
Client Functions
from app.ai.bedrock_client import get_bedrock_client
client = get_bedrock_client()
from app.ai.bedrock_client import get_async_bedrock_client
async with get_async_bedrock_client() as client:
response = await client.invoke_model(...)
from app.ai.bedrock_client import test_bedrock_connection
is_connected = await test_bedrock_connection()
Message Formatting
from app.ai.bedrock_utils import format_messages_for_bedrock
openai_messages = [{"role": "user", "content": "Hello"}]
bedrock_messages = format_messages_for_bedrock(openai_messages)
Response Parsing
from app.ai.bedrock_utils import parse_bedrock_response, parse_bedrock_json_response
text = parse_bedrock_response(response)
data = parse_bedrock_json_response(response)
Error Handling
from app.ai.bedrock_utils import BedrockInvocationError
try:
result = await invoke_nova_model(messages=[...])
except BedrockInvocationError as e:
logger.error(f"Bedrock call failed: {e}")
Embedding Dimension Differences
IMPORTANT: Nova/Titan embeddings use 1024 dimensions, OpenAI uses 1536.
from app.ai.client import get_embedding_dimension
dimension = get_embedding_dimension()
Pinecone Index Considerations
When switching providers, you need a new Pinecone index:
PINECONE_INDEX=aarlp-candidates
PINECONE_INDEX_NOVA=aarlp-nova-candidates
Testing Bedrock Integration
pytest tests/ai/test_jd_generator.py -v
pytest tests/ai/test_embeddings.py -v
Common Issues & Solutions
| Issue | Solution |
|---|
AccessDeniedException | Enable model access in AWS Bedrock console |
ValidationException | Check message format matches Nova's schema |
ThrottlingException | Implement retry logic, reduce request rate |
| Embedding dimension mismatch | Create new Pinecone index for 1024 dimensions |
Rollback to OpenAI
If Bedrock issues arise:
AI_PROVIDER=openai
All code automatically falls back to OpenAI.
Related Skills
Resources