Исходный код candidate.utils

""" Файл для вспомогательных функций и констант """
import json
import logging
import os
from typing import Iterator

import ollama
from ollama import ChatResponse
from pydantic import BaseModel, Field

SYSTEM_PROMPT = (
    "Ты – HR-менеджер, который отбирает людей на должность. По представленным навыкам тебе необходимо"
    "оценить, подходит ли кандидат на должность, и если подходит, то на какую."
)

VACANCIES_PATH = os.path.join("data", "vacancies.json")
if os.path.exists(VACANCIES_PATH):
    with open(VACANCIES_PATH, "r", encoding="utf-8") as file:
        vacancies = json.load(file)
else:
    vacancies = {}

API_URL = os.environ.get("OLLAMA_API_URL", "http://localhost:11434")
MODEL_NAME = os.environ.get("OLLAMA_MODEL_NAME", "gemma3:4b")


[документация] class VacancySchema(BaseModel): """ Pydantic-схема для структурированного ответа от модели Ollama.: title: VacancySchema """ vacancy: str = Field(..., description="Название вакансии") percentage: int = Field( ..., description="Процент соответствия кандидата вакансии от 0 до 100" ) explaining: str = Field(..., description="Описание соответствия кандидата вакансии") recommendations: str = Field(..., description="Рекомендации по улучшению навыков")
[документация] def ollama_chat( client: ollama.Client, model_name: str, prompt: str, system: str | None = None, schema: dict | None = None, max_tokens: int = 4096, temperature: float = 0.4, stream: bool = False, ) -> str | Iterator[ChatResponse]: """ Функция-оболочка для отправки Ollama запроса в виде чата, с системным промптом и форматированием в формате JSON-схемы. Args: client (ollama.Client): Клиент ollama. model_name (str): название модели в Ollama. prompt (str): Основный промпт. system (str | None): Системный промпт schema (dict | None): Опциональная Json-схема для форматирования ответа. max_tokens (int): Максимальное количество токенов temperature (float): Температура для генерации текста. stream (bool): Следует ли возвращать итератор, который выдает потоковые ответы. Returns: str: Содержимое ответа модели (или строка JSON, если указана схема). """ params: dict = { "model": model_name, "messages": [], "stream": stream, } if system is not None: params["messages"].append({"role": "system", "content": system}) params["messages"].append({"role": "user", "content": prompt}) if schema is not None: params["format"] = schema try: response = client.chat( **params, options={ "num_ctx": max_tokens, "temperature": temperature, }, ) logging.debug(f"response: {response}") if not stream: return response["message"]["content"] return response except Exception as e: logging.error(f"Error calling Ollama API: {e}") raise