I am using crewai, ollama, pandantic. But I am getting these error and it is frusttating.
here is my codes:
main.py
#!/usr/bin/env python
import sys
import warnings
from dotenv import load_dotenv
load_dotenv(‘creds.env’) # Adjust path if needed
from resume_crew.crew import ResumeCrew
warnings.filterwarnings(“ignore”, category=SyntaxWarning, module=“pysbd”)
def run():
“”"
Run the resume optimization crew.
“”"
inputs = {
‘job_url’: ‘Jobs | Careers | McKinsey & Company’,
‘company_name’: ‘Mckinsey & Co.’
}
ResumeCrew().crew().kickoff(inputs=inputs)
if name == “main”:
run()
##resume_crew.py
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-oo86brBMfkJOgDC4E"
from crewai import Agent, Crew, Process, Task, LLM
from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool, ScrapeWebsiteTool, PDFSearchTool
from crewai.knowledge.source.pdf_knowledge_source import PDFKnowledgeSource
from .models import (
JobRequirements,
ResumeOptimization,
CompanyResearch
)
from langchain_openai import ChatOpenAI
llm_local = ChatOpenAI(
model="ollama/phi4:latest",
base_url="http://localhost:11434"
)
# llm_local = LLM(
# model="ollama/phi4:latest",
# base_url="http://localhost:11434",
# api_key="ollama", # Adjust if needed by your local Ollama
# max_tokens=32000,
# temperature=0.1
# )
@CrewBase
class ResumeCrew():
"""ResumeCrew for resume optimization and interview preparation"""
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
def __init__(self) -> None:
"""Sample resume PDF for testing from https://www.hbs.edu/doctoral/Documents/job-market/CV_Mohan.pdf"""
self.resume_pdf = PDFKnowledgeSource(
file_paths=["CV_Mohan.pdf"],
config=dict(
llm=dict(
provider="ollama",
config=dict(
model="phi4:latest",
base_url="http://localhost:11434",
),
),
embedder=dict(
provider="ollama",
config=dict(
model="nomic-embed-text:latest",
base_url="http://localhost:11434", # Added base_url parameter
),
),
)
)
print(self.resume_pdf)
@agent
def resume_analyzer(self) -> Agent:
return Agent(
config=self.agents_config['resume_analyzer'],
verbose=True,
llm=llm_local,
knowledge_sources=[self.resume_pdf]
)
@agent
def job_analyzer(self) -> Agent:
return Agent(
config=self.agents_config['job_analyzer'],
verbose=True,
tools=[ScrapeWebsiteTool()],
llm=llm_local
)
@agent
def company_researcher(self) -> Agent:
return Agent(
config=self.agents_config['company_researcher'],
verbose=True,
tools=[SerperDevTool()],
llm=llm_local,
knowledge_sources=[self.resume_pdf]
)
@agent
def resume_writer(self) -> Agent:
return Agent(
config=self.agents_config['resume_writer'],
verbose=True,
llm=llm_local
)
@agent
def report_generator(self) -> Agent:
return Agent(
config=self.agents_config['report_generator'],
verbose=True,
llm=llm_local
)
@task
def analyze_job_task(self) -> Task:
return Task(
config=self.tasks_config['analyze_job_task'],
output_file='output/job_analysis.json',
output_pydantic=JobRequirements
)
@task
def optimize_resume_task(self) -> Task:
return Task(
config=self.tasks_config['optimize_resume_task'],
output_file='output/resume_optimization.json',
output_pydantic=ResumeOptimization
)
@task
def research_company_task(self) -> Task:
return Task(
config=self.tasks_config['research_company_task'],
output_file='output/company_research.json',
output_pydantic=CompanyResearch
)
@task
def generate_resume_task(self) -> Task:
return Task(
config=self.tasks_config['generate_resume_task'],
output_file='output/optimized_resume.md'
)
@task
def generate_report_task(self) -> Task:
return Task(
config=self.tasks_config['generate_report_task'],
output_file='output/final_report.md'
)
@crew
def crew(self) -> Crew:
return Crew(
agents=self.agents,
tasks=self.tasks,
verbose=True,
process=Process.sequential,
knowledge_sources=[self.resume_pdf],
embedder={
"provider": "ollama",
"config": {
"model": "nomic-embed-text:latest"
}
}
# embedder={
# "provider": "ollama",
# "config": {
# "model": "nomic-embed-text:latest",
# # "api_key": "ollama",
# # "base_url": "http://localhost:11434"
# }
# }
)
#models.py
from typing import List, Dict, Optional
from pydantic import BaseModel, Field, confloat
class SkillScore(BaseModel):
skill_name: str = Field(description=“Name of the skill being scored”)
required: bool = Field(description=“Whether this skill is required or nice-to-have”)
match_level: confloat(ge=0, le=1) = Field(description=“How well the candidate’s experience matches (0-1)”)
years_experience: Optional[float] = Field(description=“Years of experience with this skill”, default=None)
context_score: confloat(ge=0, le=1) = Field(
description=“How relevant the skill usage context is to the job requirements”,
default=0.5
)
class JobMatchScore(BaseModel):
overall_match: confloat(ge=0, le=100) = Field(
description=“Overall match percentage (0-100)”
)
technical_skills_match: confloat(ge=0, le=100) = Field(
description=“Technical skills match percentage”
)
soft_skills_match: confloat(ge=0, le=100) = Field(
description=“Soft skills match percentage”
)
experience_match: confloat(ge=0, le=100) = Field(
description=“Experience level match percentage”
)
education_match: confloat(ge=0, le=100) = Field(
description=“Education requirements match percentage”
)
industry_match: confloat(ge=0, le=100) = Field(
description=“Industry experience match percentage”
)
skill_details: List[SkillScore] = Field(
description=“Detailed scoring for each skill”,
default_factory=list
)
strengths: List[str] = Field(
description=“List of areas where candidate exceeds requirements”,
default_factory=list
)
gaps: List[str] = Field(
description=“List of areas needing improvement”,
default_factory=list
)
scoring_factors: Dict[str, float] = Field(
description=“Weights used for different scoring components”,
default_factory=lambda: {
“technical_skills”: 0.35,
“soft_skills”: 0.20,
“experience”: 0.25,
“education”: 0.10,
“industry”: 0.10
}
)
class JobRequirements(BaseModel):
technical_skills: List[str] = Field(
description=“List of required technical skills”,
default_factory=list
)
soft_skills: List[str] = Field(
description=“List of required soft skills”,
default_factory=list
)
experience_requirements: List[str] = Field(
description=“List of experience requirements”,
default_factory=list
)
key_responsibilities: List[str] = Field(
description=“List of key job responsibilities”,
default_factory=list
)
education_requirements: List[str] = Field(
description=“List of education requirements”,
default_factory=list
)
nice_to_have: List[str] = Field(
description=“List of preferred but not required skills”,
default_factory=list
)
job_title: str = Field(
description=“Official job title”,
default=“”
)
department: Optional[str] = Field(
description=“Department or team within the company”,
default=None
)
reporting_structure: Optional[str] = Field(
description=“Who this role reports to and any direct reports”,
default=None
)
job_level: Optional[str] = Field(
description=“Level of the position (e.g., Entry, Senior, Lead)”,
default=None
)
location_requirements: Dict[str, str] = Field(
description=“Location details including remote/hybrid options”,
default_factory=dict
)
work_schedule: Optional[str] = Field(
description=“Expected work hours and schedule flexibility”,
default=None
)
travel_requirements: Optional[str] = Field(
description=“Expected travel frequency and scope”,
default=None
)
compensation: Dict[str, str] = Field(
description=“Salary range and compensation details if provided”,
default_factory=dict
)
benefits: List[str] = Field(
description=“List of benefits and perks”,
default_factory=list
)
tools_and_technologies: List[str] = Field(
description=“Specific tools, software, or technologies used”,
default_factory=list
)
industry_knowledge: List[str] = Field(
description=“Required industry-specific knowledge”,
default_factory=list
)
certifications_required: List[str] = Field(
description=“Required certifications or licenses”,
default_factory=list
)
security_clearance: Optional[str] = Field(
description=“Required security clearance level if any”,
default=None
)
team_size: Optional[str] = Field(
description=“Size of the immediate team”,
default=None
)
key_projects: List[str] = Field(
description=“Major projects or initiatives mentioned”,
default_factory=list
)
cross_functional_interactions: List[str] = Field(
description=“Teams or departments this role interacts with”,
default_factory=list
)
career_growth: List[str] = Field(
description=“Career development and growth opportunities”,
default_factory=list
)
training_provided: List[str] = Field(
description=“Training or development programs offered”,
default_factory=list
)
diversity_inclusion: Optional[str] = Field(
description=“D&I statements or requirements”,
default=None
)
company_values: List[str] = Field(
description=“Company values mentioned in the job posting”,
default_factory=list
)
job_url: str = Field(
description=“URL of the job posting”,
default=“”
)
posting_date: Optional[str] = Field(
description=“When the job was posted”,
default=None
)
application_deadline: Optional[str] = Field(
description=“Application deadline if specified”,
default=None
)
special_instructions: List[str] = Field(
description=“Any special application instructions or requirements”,
default_factory=list
)
match_score: JobMatchScore = Field(
description=“Detailed scoring of how well the candidate matches the job requirements”,
default_factory=JobMatchScore
)
score_explanation: List[str] = Field(
description=“Detailed explanation of how scores were calculated”,
default_factory=list
)
class ResumeOptimization(BaseModel):
content_suggestions: List[Dict[str, str]] = Field(
description=“List of content optimization suggestions with ‘before’ and ‘after’ examples”
)
skills_to_highlight: List[str] = Field(
description=“List of skills that should be emphasized based on job requirements”
)
achievements_to_add: List[str] = Field(
description=“List of achievements that should be added or modified”
)
keywords_for_ats: List[str] = Field(
description=“List of important keywords for ATS optimization”
)
formatting_suggestions: List[str] = Field(
description=“List of formatting improvements”
)
class CompanyResearch(BaseModel):
recent_developments: List[str] = Field(
description=“List of recent company news and developments”
)
culture_and_values: List[str] = Field(
description=“Key points about company culture and values”
)
market_position: Dict[str, List[str]] = Field(
description=“Information about market position, including competitors and industry standing”
)
growth_trajectory: List[str] = Field(
description=“Information about company’s growth and future plans”
)
interview_questions: List[str] = Field(
description=“Strategic questions to ask during the interview”
)
here is the error:
(.venv) (base) skasmani@Saeeds-MacBook-Pro resume-optimization-crew % crewai run
Running the Crew
LLM value is an unknown object
[2025-02-22 23:46:17][ERROR]: Failed to upsert documents: APIStatusError.init() missing 2 required keyword-only arguments: ‘response’ and ‘body’
Traceback (most recent call last):
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/bin/run_crew”, line 12, in
sys.exit(run())
^^^^^
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/src/resume_crew/main.py”, line 19, in run
ResumeCrew().crew().kickoff(inputs=inputs)
^^^^^^^^^^^^
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/lib/python3.12/site-packages/crewai/project/crew_base.py”, line 36, in init
self.map_all_task_variables()
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/lib/python3.12/site-packages/crewai/project/crew_base.py”, line 203, in map_all_task_variables
self._map_task_variables(
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/lib/python3.12/site-packages/crewai/project/crew_base.py”, line 236, in _map_task_variables
self.tasks_config[task_name][“agent”] = agentsagent_name
^^^^^^^^^^^^^^^^^^^^
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/lib/python3.12/site-packages/crewai/project/utils.py”, line 11, in memoized_func
cache[key] = func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/src/resume_crew/crew.py”, line 62, in resume_analyzer
return Agent(
^^^^^^
File “/Users/skasmani/Downloads/IBM/CSM/Experiments/csm/agentic_ai/AgenticAI_app/cv_optimize/resume-optimization-crew/.venv/lib/python3.12/site-packages/pydantic/main.py”, line 214, in init
validated_self = self.pydantic_validator.validate_python(data, self_instance=self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pydantic_core._pydantic_core.ValidationError: 1 validation error for Agent
Value error, Invalid Knowledge Configuration: APIStatusError.init() missing 2 required keyword-only arguments: ‘response’ and ‘body’ [type=value_error, input_value={‘verbose’: True, ‘llm’: …d ATS compatibility.\n’}, input_type=dict]
For further information visit Redirecting...
sys:1: ResourceWarning: unclosed <ssl.SSLSocket fd=7, family=2, type=1, proto=0, laddr=(‘192.168.0.52’, 63451), raddr=(‘162.159.140.245’, 443)>
An error occurred while running the crew: Command ‘[‘uv’, ‘run’, ‘run_crew’]’ returned non-zero exit status 1.
(.venv) (base) skasmani@Saeeds-MacBook-Pro resume-optimization-crew %