Using crewai, ollama, and pandantic

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 %