Ir para o conteúdo

Infra

src.infra

Providers concretos de LLM e Embedding.

Re-exporta todas as implementacoes disponiveis.

Example
from src.infra import GroqProvider, SentenceTransformerEmbeddings

SentenceTransformerEmbeddings(model_name: str = 'sentence-transformers/all-MiniLM-L6-v2', diretorio_modelos: str | Path = 'modelos')

Embeddings via sentence-transformers — local, sem Ollama.

Usa o modelo all-MiniLM-L6-v2 por padrao (~80MB). O modelo e baixado automaticamente na primeira execucao para o diretorio informado em diretorio_modelos, evitando redownload.

Inicializa o provider de embeddings.

Parameters:

Name Type Description Default
model_name str

Nome do modelo sentence-transformers ou caminho local.

'sentence-transformers/all-MiniLM-L6-v2'
diretorio_modelos str | Path

Diretorio onde o modelo e armazenado localmente.

'modelos'
Source code in src/infra/embedding_providers.py
def __init__(
    self,
    model_name: str = 'sentence-transformers/all-MiniLM-L6-v2',
    diretorio_modelos: str | Path = 'modelos',
) -> None:
    """Inicializa o provider de embeddings.

    Args:
        model_name: Nome do modelo sentence-transformers ou caminho local.
        diretorio_modelos: Diretorio onde o modelo e armazenado localmente.
    """
    from sentence_transformers import SentenceTransformer  # noqa: PLC0415 — lazy loading

    dir_modelos = Path(diretorio_modelos)
    dir_modelos.mkdir(parents=True, exist_ok=True)

    self._model = SentenceTransformer(
        model_name,
        cache_folder=str(dir_modelos),
    )

embed(texto: str) -> list[float]

Gera embedding para um texto.

Parameters:

Name Type Description Default
texto str

Texto para gerar embedding.

required

Returns:

Type Description
list[float]

Lista de floats representando o embedding.

Source code in src/infra/embedding_providers.py
def embed(self, texto: str) -> list[float]:
    """Gera embedding para um texto.

    Args:
        texto: Texto para gerar embedding.

    Returns:
        Lista de floats representando o embedding.
    """
    return self._model.encode(texto).tolist()

embed_batch(textos: list[str]) -> list[list[float]]

Gera embeddings para multiplos textos.

Parameters:

Name Type Description Default
textos list[str]

Lista de textos para gerar embeddings.

required

Returns:

Type Description
list[list[float]]

Lista de embeddings (lista de listas de floats).

Source code in src/infra/embedding_providers.py
def embed_batch(self, textos: list[str]) -> list[list[float]]:
    """Gera embeddings para multiplos textos.

    Args:
        textos: Lista de textos para gerar embeddings.

    Returns:
        Lista de embeddings (lista de listas de floats).
    """
    return self._model.encode(textos).tolist()

GroqProvider(api_key: str | None = None, model: str = 'llama-3.1-8b-instant')

LLM via Groq API — cloud, rapido, producao.

Usa o modelo Llama 3.1 8B Instant por padrao. Requer GROQ_API_KEY no ambiente ou passada explicitamente.

Inicializa o provider Groq.

Parameters:

Name Type Description Default
api_key str | None

Chave da API Groq. Se None, le de GROQ_API_KEY.

None
model str

Nome do modelo a usar.

'llama-3.1-8b-instant'
Source code in src/infra/llm_providers.py
def __init__(
    self,
    api_key: str | None = None,
    model: str = 'llama-3.1-8b-instant',
) -> None:
    """Inicializa o provider Groq.

    Args:
        api_key: Chave da API Groq. Se None, le de GROQ_API_KEY.
        model: Nome do modelo a usar.
    """
    from groq import Groq  # noqa: PLC0415 — lazy loading

    self._client = Groq(api_key=api_key or os.getenv('GROQ_API_KEY', ''))
    self._model = model

completar(prompt: str, max_tokens: int = 10) -> str

Envia prompt ao Groq e retorna resposta texto.

Parameters:

Name Type Description Default
prompt str

Texto do prompt para o LLM.

required
max_tokens int

Maximo de tokens na resposta.

10

Returns:

Type Description
str

Texto da resposta do LLM.

Source code in src/infra/llm_providers.py
def completar(self, prompt: str, max_tokens: int = 10) -> str:
    """Envia prompt ao Groq e retorna resposta texto.

    Args:
        prompt: Texto do prompt para o LLM.
        max_tokens: Maximo de tokens na resposta.

    Returns:
        Texto da resposta do LLM.
    """
    response = self._client.chat.completions.create(
        model=self._model,
        messages=[{'role': 'user', 'content': prompt}],
        temperature=0,
        max_tokens=max_tokens,
    )
    return response.choices[0].message.content or ''

OllamaProvider(model: str = 'qwen3.5:2b', num_predict: int = 10)

LLM via Ollama local — dev/testing, sem API key.

Usa qwen3.5:2b por padrao. Requer Ollama rodando localmente.

Inicializa o provider Ollama.

Parameters:

Name Type Description Default
model str

Nome do modelo Ollama a usar.

'qwen3.5:2b'
num_predict int

Maximo de tokens na resposta.

10
Source code in src/infra/llm_providers.py
def __init__(
    self,
    model: str = 'qwen3.5:2b',
    num_predict: int = 10,
) -> None:
    """Inicializa o provider Ollama.

    Args:
        model: Nome do modelo Ollama a usar.
        num_predict: Maximo de tokens na resposta.
    """
    from langchain_ollama import OllamaLLM  # noqa: PLC0415 — lazy loading

    self._model = model
    self._llm = OllamaLLM(
        model=model,
        temperature=0,
        reasoning=False,
        num_ctx=512,
        num_predict=num_predict,
    )

completar(prompt: str, max_tokens: int = 10) -> str

Envia prompt ao Ollama e retorna resposta texto.

Parameters:

Name Type Description Default
prompt str

Texto do prompt para o LLM.

required
max_tokens int

Ignorado (Ollama usa num_predict do construtor).

10

Returns:

Type Description
str

Texto da resposta do LLM.

Source code in src/infra/llm_providers.py
def completar(self, prompt: str, max_tokens: int = 10) -> str:
    """Envia prompt ao Ollama e retorna resposta texto.

    Args:
        prompt: Texto do prompt para o LLM.
        max_tokens: Ignorado (Ollama usa num_predict do construtor).

    Returns:
        Texto da resposta do LLM.
    """
    return self._llm.invoke(prompt)

src.infra.llm_providers

Providers concretos de LLM.

Implementacoes do protocolo LLMProvider para diferentes backends.

Example
from src.infra.llm_providers import GroqProvider

llm = GroqProvider(api_key='sua-chave')
llm.completar('Classifique: "quero um lanche"')

GroqProvider(api_key: str | None = None, model: str = 'llama-3.1-8b-instant')

LLM via Groq API — cloud, rapido, producao.

Usa o modelo Llama 3.1 8B Instant por padrao. Requer GROQ_API_KEY no ambiente ou passada explicitamente.

Inicializa o provider Groq.

Parameters:

Name Type Description Default
api_key str | None

Chave da API Groq. Se None, le de GROQ_API_KEY.

None
model str

Nome do modelo a usar.

'llama-3.1-8b-instant'
Source code in src/infra/llm_providers.py
def __init__(
    self,
    api_key: str | None = None,
    model: str = 'llama-3.1-8b-instant',
) -> None:
    """Inicializa o provider Groq.

    Args:
        api_key: Chave da API Groq. Se None, le de GROQ_API_KEY.
        model: Nome do modelo a usar.
    """
    from groq import Groq  # noqa: PLC0415 — lazy loading

    self._client = Groq(api_key=api_key or os.getenv('GROQ_API_KEY', ''))
    self._model = model

completar(prompt: str, max_tokens: int = 10) -> str

Envia prompt ao Groq e retorna resposta texto.

Parameters:

Name Type Description Default
prompt str

Texto do prompt para o LLM.

required
max_tokens int

Maximo de tokens na resposta.

10

Returns:

Type Description
str

Texto da resposta do LLM.

Source code in src/infra/llm_providers.py
def completar(self, prompt: str, max_tokens: int = 10) -> str:
    """Envia prompt ao Groq e retorna resposta texto.

    Args:
        prompt: Texto do prompt para o LLM.
        max_tokens: Maximo de tokens na resposta.

    Returns:
        Texto da resposta do LLM.
    """
    response = self._client.chat.completions.create(
        model=self._model,
        messages=[{'role': 'user', 'content': prompt}],
        temperature=0,
        max_tokens=max_tokens,
    )
    return response.choices[0].message.content or ''

OllamaProvider(model: str = 'qwen3.5:2b', num_predict: int = 10)

LLM via Ollama local — dev/testing, sem API key.

Usa qwen3.5:2b por padrao. Requer Ollama rodando localmente.

Inicializa o provider Ollama.

Parameters:

Name Type Description Default
model str

Nome do modelo Ollama a usar.

'qwen3.5:2b'
num_predict int

Maximo de tokens na resposta.

10
Source code in src/infra/llm_providers.py
def __init__(
    self,
    model: str = 'qwen3.5:2b',
    num_predict: int = 10,
) -> None:
    """Inicializa o provider Ollama.

    Args:
        model: Nome do modelo Ollama a usar.
        num_predict: Maximo de tokens na resposta.
    """
    from langchain_ollama import OllamaLLM  # noqa: PLC0415 — lazy loading

    self._model = model
    self._llm = OllamaLLM(
        model=model,
        temperature=0,
        reasoning=False,
        num_ctx=512,
        num_predict=num_predict,
    )

completar(prompt: str, max_tokens: int = 10) -> str

Envia prompt ao Ollama e retorna resposta texto.

Parameters:

Name Type Description Default
prompt str

Texto do prompt para o LLM.

required
max_tokens int

Ignorado (Ollama usa num_predict do construtor).

10

Returns:

Type Description
str

Texto da resposta do LLM.

Source code in src/infra/llm_providers.py
def completar(self, prompt: str, max_tokens: int = 10) -> str:
    """Envia prompt ao Ollama e retorna resposta texto.

    Args:
        prompt: Texto do prompt para o LLM.
        max_tokens: Ignorado (Ollama usa num_predict do construtor).

    Returns:
        Texto da resposta do LLM.
    """
    return self._llm.invoke(prompt)

src.infra.embedding_providers

Providers concretos de Embedding.

Implementacoes do protocolo EmbeddingProvider para diferentes backends.

Example
from src.infra.embedding_providers import SentenceTransformerEmbeddings

emb = SentenceTransformerEmbeddings(diretorio_modelos='modelos')
emb.embed('quero um lanche')

SentenceTransformerEmbeddings(model_name: str = 'sentence-transformers/all-MiniLM-L6-v2', diretorio_modelos: str | Path = 'modelos')

Embeddings via sentence-transformers — local, sem Ollama.

Usa o modelo all-MiniLM-L6-v2 por padrao (~80MB). O modelo e baixado automaticamente na primeira execucao para o diretorio informado em diretorio_modelos, evitando redownload.

Inicializa o provider de embeddings.

Parameters:

Name Type Description Default
model_name str

Nome do modelo sentence-transformers ou caminho local.

'sentence-transformers/all-MiniLM-L6-v2'
diretorio_modelos str | Path

Diretorio onde o modelo e armazenado localmente.

'modelos'
Source code in src/infra/embedding_providers.py
def __init__(
    self,
    model_name: str = 'sentence-transformers/all-MiniLM-L6-v2',
    diretorio_modelos: str | Path = 'modelos',
) -> None:
    """Inicializa o provider de embeddings.

    Args:
        model_name: Nome do modelo sentence-transformers ou caminho local.
        diretorio_modelos: Diretorio onde o modelo e armazenado localmente.
    """
    from sentence_transformers import SentenceTransformer  # noqa: PLC0415 — lazy loading

    dir_modelos = Path(diretorio_modelos)
    dir_modelos.mkdir(parents=True, exist_ok=True)

    self._model = SentenceTransformer(
        model_name,
        cache_folder=str(dir_modelos),
    )

embed(texto: str) -> list[float]

Gera embedding para um texto.

Parameters:

Name Type Description Default
texto str

Texto para gerar embedding.

required

Returns:

Type Description
list[float]

Lista de floats representando o embedding.

Source code in src/infra/embedding_providers.py
def embed(self, texto: str) -> list[float]:
    """Gera embedding para um texto.

    Args:
        texto: Texto para gerar embedding.

    Returns:
        Lista de floats representando o embedding.
    """
    return self._model.encode(texto).tolist()

embed_batch(textos: list[str]) -> list[list[float]]

Gera embeddings para multiplos textos.

Parameters:

Name Type Description Default
textos list[str]

Lista de textos para gerar embeddings.

required

Returns:

Type Description
list[list[float]]

Lista de embeddings (lista de listas de floats).

Source code in src/infra/embedding_providers.py
def embed_batch(self, textos: list[str]) -> list[list[float]]:
    """Gera embeddings para multiplos textos.

    Args:
        textos: Lista de textos para gerar embeddings.

    Returns:
        Lista de embeddings (lista de listas de floats).
    """
    return self._model.encode(textos).tolist()