Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

2406

  • Image Removed

Owned by Sergio Labres

just a moment ago

1 min read

Analytics

...

Key

...

Summary

...

Documentation

...

TECD-2621

...

Erro de RemoteDB ao tentar salvar um consulta personalizada no Person

...

1.Menu
Menu Tabela >> Consultas Personalizadas

2.Objetivo
Realizar correção do problema que está ocorrendo ao tentar alterar uma vsconsulta qualquer.

3.Alteração
Realizada correção do erro de SQL que apresenta na descrição da tarefa ao tentar alterar uma VsConsulta personalizada.

...

TECD-2603

...

Revisão das Tags, Item Recorrente

...

.

...

TECD-2602

...

Documentação do Padrão de Tags

...

.

...

TECD-2570

...

Apresentação Tech Talk

...

.

...

TECD-2569

...

Desenvolvimento do Boletim FinOPS

...

.

...

TECD-2568

...

Planilha de Custo Mensal - Agosto

...

.

...

TECD-2536

...

Criação de Paineis no Cost Gov

...

.

...

TECD-2535

...

Validação de Tags

...

.

...

TECD-2531

...

Controle de uso SKUs

...

.

...

TECD-2517

...

Configurando os deploys do CRM Dev

...

TESTE

...

TECD-2507

...

Inconsistência » Comportamento indevido ao trabalhar com Nested Dataset na arquitetura TMS

...

1.Menu
Core TMS

2.Objetivo
Atender uma demanda específica do Agrotitan onde utiliza-se nested dataset com auto relacionamento (mesma tabela).

3.Alteração

  1. Realizada correção para que em casos onde existe NestedDataSet e não tem nome do provider, que seja utilizado o nome da Query como base para tentar encontrar o nome do provider no qual foi registrado o SQL.

  2. Criado o método TDeltaService.RegistrarNestedTableName('qrTeste', 'PDUPPAGA') para permitir registrar um nome de tabela específico para um determinado nome de Field do tipo TDataSetField utilizado quando usa-se NestedDataSet.

...

TECD-2501

...

Padronização - Avaliar lint para Python

...

.

...

TECD-2498

...

Relatório Cost Gov

...

.

...

TECD-2489

...

Backup automatizado do MySQL-nimitz

...

.

...

TECD-2480

...

Problema ao Criar Varios Filtros e Separa em Guias no Vsrel

...

1.Menu

VsRel - Gerador de relatórios

2.Objetivo
Ajustar o tamanho do formulário de filtros, quando o mesmo possui várias guias de filtros.

3.Alteração
Realizada a correção na lógica que calcula o tamanho da tela em função da quantidade de filtros. Agora o sistema irá identificar a guia que contém mais filtros para saber calcular o tamanho correto do formulário

...

TECD-2478

...

Criação de Cluster Kubernetes Gerenciado para o Ambiente Dev

...

.

...

TECD-2477

...

VPN do Ambiente Dev do CRM

...

.

...

Oportunidades de Saving - Ações

...

.

...

TECD-

...

Custo Rateado

...

TECD-2467

...

Finalização do Boletim

...

.

...

TECD-2458

...

Cloud Guard

...

.

...

TECD-2457

...

Relatório de Consumo APCL

...

.

...

TECD-2456

...

RevTelas - Aplicação das novas telas no projeto Agro3c - Parte 4

...

.

...

TECD-2451

...

Oportunidades de Saving - Ações

...

.

...

TECD-2439

...

Desenvolvimento do Boletim FinOPS

...

.

...

TECD-2438

...

Planilha de Custo Mensal - Julho

...

.

...

TECD-2436

...

Relatório de Consumo TURIM

...

.

...

TECD-2430

...

Relatório de Direitos de Acesso listando informações de módulos não filtrados.

...

1.Menu
Viasof >> Configurações>> Direito de Acesso >> Relatório de direito de acesso

2.Objetivo
Realizar a correção para filtrar por módulo a listagem dos acessos dos menus

3.Alteração
Realizada correção para respeitar o filtro por módulo na listagem dos acessos ao menus

...

TECD-2427

...

Apresentação Padrão de Tags

...

.

...

TECD-2426

...

Validação Novo Padrão de Tags

...

.

...

TECD-2416

...

Atendimentos Dev Sprint 38

...

.

...

TECD-2411

...

Plugins - Correção do plugin Ficha Cadastral Cliente (TURIM)

...

1.Menu

Orion → Plugin Ficha Cadastral → Personalizações

2.Objetivo

Criar 3 novas branchs do projeto Ficha Cadastral, incluindo as personalizações feitas apenas em arquivos locais no cliente

3.Alteração

Na branchs tiveram que ser corrigido alguns SQL que estavam com coalesce que eram aceitos no banco firebird, mas no oracle gerava erro:

Code Block
 -- Exemplo de um caso
-- Antes
COALESCE(CONTAMOVATIVECON.A6HAPLANT, '') AS CULTIVADO,
COALESCE(CONTAMOVATIVECON.A6PRODANUALSC, '') AS PRODUTIVIDADE,
COALESCE(CONTAMOVATIVECON.A5FATBRUTOANUAL, '') AS VALOR

-- Depois
COALESCE(CONTAMOVATIVECON.A6HAPLANT, '') AS CULTIVADO,
COALESCE(CONTAMOVATIVECON.A6PRODANUALSC, '') AS PRODUTIVIDADE,
COALESCE(CONTAMOVATIVECON.A5FATBRUTOANUAL, '') AS VALOR 

Como o projeto foi migrado do 0 para o Linux, tivemos que adicionar vários endpoints que retornavam o stacktrace para saber o que está dando de errado dentro dos plugins, logo foi adicionado o seguinte código:

Code Block
 // Apenas um trecho de uma exception mais genérica que o código pegava
// Pegando o stacktrace inserindo em uma string e jogando para o navegador a resposta
} catch (Exception e) {
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  String stackTrace = sw.toString();
  throw new Exception("Erro desconhecido ao gerar relatório: " + caminho + "\n" + stackTrace, e); 

...

Além de sql, teve que ser alterado algumas formas de caminhos, que são fixas dentro do projeto, como o cliente mudou de servidor de Windows para Linux teve que ser feitas algumas mudanças nesse sentido.

Code Block
 // Antes
report = "/reports/ficha_cadastral/FichaCadastral.jasper";
// Depois
report = "/opt/Orion/webapps/ficha_cadastralothers/WEB-INF/classes/reports/ficha_cadastral/FichaCadastral.jasper"; 

Foi realizado também a mudanças das imagens dentro do template jasper, pois em todos os templates as imagens estavam com diretórios fixos do servidor Windows do cliente, sendo assim os arquivos .jrxml e .jasper tiveram que ser alterados.

A parte do bower_components também não estava sendo extraída dentro do servidor Linux, pelo fato de não estar com o npm instalado, então foi inserido todo o bower_components dentro do próprio .war, sendo que o bower_components foi gerado na minha máquina, para evitar de instalar npm no cliente.

Uma das mudanças também foi a mudança de forma de buscar arquivos pois o getResourceAsStream não estava funcionando como esperado, e logo foi trocado para o FileInputStream.

Code Block
 // Essa parte do código também estava completamente errada, pois quando um arquivo não é encontrado ele gera um erro
// E dessa forma que estava ele validava se era null
// Lembrando que esse in se refere ao FileInputStream
if (in == null) {
  throw new Exception("Arquivo do relatorio nao encontrado: " + caminho);
} 

Houve também mudanças no sentido do objdc6 para o ojdbc8, e também a inclusão da nova lib que libera os plugins para se conectarem a https.

Essas mudanças foram genericas e aplicadas em ambas as branchs, agora o que geralmente mudava de uma branch para a outra era os templates .jasper, e todos os arquivos que geravam de alguma forma o path que ela iria ser extraida dentro do sistema (Todos os arquivos estão descritos na Descrição)

...

TECD-2408

...

Planilha Controle de Utilização

...

.

...

TECD-2406

...

Consignado - Enviar email de proposta para o RH

...

Como definido na tarefa estão sendo enviados e-mails para o Admin e RH, porém pela urgência e característica da demanda esta tarefa será dividida em duas partes. Essa primeira parte está sendo enviado o email para os destinatários desejados, na segunda parte será criada uma página HTML definido um novo layout de envio de e-mails, visto que a biblioteca usada no Consignado precisa que seja criada uma página HTML para envio de e-mail. Neste momento está sendo usada uma página genérica para Admin e RH a segunda parte da tarefa comtempla criar páginas HTML distintas para cada destinatário.

...

TECD-2405

...

Validação Novo Padrão de Tags

...

.

...

TECD-2404

...

Análise Redução de Usuários

...

.

...

TECD-2403

...

Fatura OCI

...

.

...

TECD-2401

...

Apresentação do Padrão de Tags

...

.

...

TECD-2400

...

Aumentar complexidade de criptografia definida em TECD-2297

...

1.Menu
Nova criptografia de senhas

2.Objetivo
Utilizar uma senha mais forte para gerar um MD5 que não seja capaz de ser descriptografados utilizando sites com esta funcionalidade.

3.Alteração

  • criado o novo fonte uMD5EncryptViasoft.pas, neste fonte possui o método MD5Senha que agora é usado para criptografar a senha que será armazenada no banco.

  • Recompilado os projetos da tecnologia na branch feature/TECD-2297.

  • Revisado todos os fontes que antes estavam usando a funcao MD5Xe para agora usar a função MD5Senha

  • OBSERVAÇÕES: Com esta alteração os clientes em TMS que fazem integração serão afetados, atualmente os clientes enviam a senha criptografada com MD5, a partir de agora deverão enviar a senha sem criptografar em MD5.

...

TECD-2397

...

FOLHA: Erro ao consultar a auditoria.

...

.

...

TECD-2391

...

Sincronização Inteligente parou de funcionar

...

1.Menu
Sincronização inteligente

2.Objetivo
Corrigir erro de conexão com o a base postgres que fica hospedada na cloud, pois esse é o motivo da falha na sincronização dos dados.

3.Alteração
Realizada correção adicionando uses do driver dbExpress postgres

...

TECD-2388

...

Custo Cliente

...

.

...

TECD-2385

...

Autenticação para cluster da VSIA

...

.

...

TECD-2382

...

Vs-object-storage para novo cluster da VSIA

...

.

...

TECD-2381

...

IA - Acompanhar e auxiliar desenvolvimento das requisições do Analytics para o serviço de Insights

...

.

...

TECD-2376

...

Consignado - Inconsistência nos dados do RH

...

Foi criado a branch

Jira Legacy
serverSystem Jira
serverIda5c9f197-a7aa-3a3e-91c5-85e0279c94e6
keyTECD-2376
diretamente pela IDE. O método do backend estava com problemas de escopo na variavel.

...

TECD-2372

...

App H1 Fintech - Melhorar lógica para encontrar a chave PIX sendo ela válida como CPF e telefone

...

.

...

TECD-2370

...

Documentação do Padrão de Tags (Confluence e Alterações)

...

.

...

TECD-2367

...

Mensagem de retorno no login do Orion em caso de falha de comunicação com o Viasell

...

  1. Objetivo

Aprimorar a rotina de reset do serviço ResetServiceImpl do sistema Orion para garantir que, em caso de falha de comunicação com os serviços da Viasell, seja exibida uma mensagem informativa ao usuário.

  1. Alterações Implementadas

2.1. Refatoração do Método realizaReset

  • Motivo: Melhorar a legibilidade e manutenção do código, separando responsabilidades distintas.

  • Alteração: O método realizaReset foi refatorado para encapsular a lógica de formatação da série e a tentativa de reset em URLs separadas. A lógica de formatação foi movida para o método formatSeries, e a lógica de tentativa de reset com tratamento de exceções foi movida para o método makeRequestWithExceptionHandling.

Code Block
private Reset realizaReset(String series, String mac) {
    String clientSeries = formatSeries(series);
    try {
        return makeRequestWithExceptionHandling(url, clientSeries, mac);
    } catch (Exception e) {
        logger.error("Erro na primeira tentativa:", e);
        return makeRequestWithExceptionHandling(url2, clientSeries, mac);
    }
}

private String formatSeries(String series) {
    if (NumberUtil.isInteger(series)) {
        return String.valueOf(Integer.parseInt(series));
    }
    return series;
}

private Reset makeRequestWithExceptionHandling(String url, String series, String mac) {
    try {
        return restTemplate.getForObject(url, Reset.class, series, mac);
    } catch (ResourceAccessException | HttpClientErrorException | HttpServerErrorException e) {
        throw e;
    } catch (Exception e) {
        logger.error("Erro na segunda tentativa:", e);
        throw e;
    }
}

2.2. Adição do Método handleValidationAndResponse

  • Motivo: Garantir que em caso de falha de comunicação com a Viasell, uma mensagem informativa seja retornada ao usuário.

  • Alteração: Implementação do método handleValidationAndResponse que encapsula a lógica de reset e validação, e captura exceções para retornar uma resposta padronizada.

Code Block
public ResetSerieMacTOResponse handleValidationAndResponse(SerieMacTO to) {
    try {
        reset();
        boolean isValid = valid();
        logger.info("Orion liberado");
        return createResponse(isValid, "Orion liberado");
    } catch (Exception e) {
        return handleException(e);
    }
}

2.3. Métodos de Tratamento de Exceções e Criação de Respostas

  • Motivo: Centralizar e padronizar o tratamento de exceções e a criação de respostas, garantindo consistência e clareza nas mensagens retornadas.

  • Alteração: Implementação dos métodos createResponse e handleException para criar respostas padronizadas e tratar exceções utilizando a classe ResetExceptionHandler.

Code Block
private ResetSerieMacTOResponse createResponse(boolean hasSuccess, String message) {
    return ResetSerieMacTOResponse.builder()
            .hasSuccess(hasSuccess)
            .message(message)
            .build();
}

private ResetSerieMacTOResponse handleException(Exception e) {
    ResetExceptionHandler resetExceptionHandler = new ResetExceptionHandler(e);
    String logMessage = resetExceptionHandler.getLogMessage();
    logger.error(logMessage + ": " + e.getMessage());
    return createResponse(false, logMessage);
}

2.4. Introdução da Classe ResetExceptionHandler

  • Motivo: Categorizar e gerar mensagens de log específicas para diferentes tipos de exceções, facilitando a identificação e resolução de problemas.

  • Alteração: Implementação da classe ResetExceptionHandler para lidar com diferentes tipos de exceções e retornar mensagens de log apropriadas.

Code Block
public class ResetExceptionHandler {
    private final Exception exception;

    public ResetExceptionHandler(Exception exception) {
        this.exception = exception;
    }

    public String getLogMessage() {
        if (exception instanceof HttpClientErrorException) {
            return "Erro de comunicação com o cliente HTTP";
        } else if (exception instanceof HttpServerErrorException) {
            return "Erro de comunicação com o servidor HTTP";
        } else if (exception instanceof ResourceAccessException) {
            return "Erro de acesso ao recurso";
        } else if (exception instanceof IllegalArgumentException) {
            return "Argumento inválido fornecido";
        } else if (exception instanceof IllegalStateException) {
            return "Estado inválido encontrado";
        } else if (exception instanceof ResetException) {
            return "Erro no reset";
        } else {
            return "Erro geral";
        }
    }
}

2.5. Padronização da Resposta com a Classe ResetSerieMacTOResponse

  • Motivo: Padronizar a resposta da API para incluir um booleano indicando sucesso ou falha, além de uma mensagem informativa.

  • Alteração: Implementação da classe ResetSerieMacTOResponse para encapsular a resposta, contendo um booleano hasSuccess e uma mensagem message.

Code Block
@Data
@Builder
public class ResetSerieMacTOResponse {
    private Boolean hasSuccess;
    private String message;
}

2.6. Ajuste no Controller para Utilizar a Resposta Padronizada

  • Motivo: Garantir que o controller utilize a nova resposta padronizada, fornecendo mensagens informativas em caso de erro.

  • Alteração: O método save no controller foi ajustado para retornar ResetSerieMacTOResponse ao invés de um booleano.

Code Block
@PostMapping
public ResetSerieMacTOResponse save(@RequestBody SerieMacTO to) {
    configuracaoService.save(Configuracao.builder().chave(ConfiguracaoChave.SERIE).valor("\"" + to.getSerie() + "\"").build());
    configuracaoService.save(Configuracao.builder().chave(ConfiguracaoChave.MAC).valor("\"" + to.getMac() + "\"").build());

    return resetService.handleValidationAndResponse(to);
}

Estas alterações visam melhorar a clareza e a especificidade na detecção de erros, fornecer feedback útil ao usuário final, e assegurar que o processo de reset seja robusto e de fácil manutenção, além de padronizar a resposta da API.

...

TECD-2366

...

Fintech - Alterar campo registration_number

...

Necessário corrigir os endpoints de criação e alteração de convenios na Fintech, também foram pedidos ajustes nas variaveis do Filt para enviar valores com 0 a esquerda.

...

TECD-2363

...

Planilha de Custo Mensal - Junho

...

.

...

TECD-2362

...

Desenvolvimento do Boletim FinOPS

...

.

...

TECD-2361

...

Atendimentos Sprint 37

...

.

...

TECD-2360

...

Informações de KPIs

...

.

...

TECD-2358

...

Implementar Cluster Redis na OCI

...

.

...

TECD-2357

...

Implementar serviço de monitoramento e controle de acessos a API

...

.

...

TECD-2356

...

VSIA - Realizar testes e adequação do VSAPI

...

.

...

TECD-2355

...

Acompanhamento POC Zenvia - Parte 7

...

.

...

TECD-2354

...

IA - Desenvolver Serviço de Geração de Insights com Ia

...

.

...

TECD-2352

...

Atualização e compilação dos projetos do agro (continuação da TECD-2140)

...

.

...

TECD-2351

...

RevTelas - Aplicação das novas telas no projeto Agro3c - Parte 2

...

.

...

TECD-2350

...

Estruturas de Equipes e Organização de Tarefas em FinOps

...

.

...

TECD-2345

...

Fintech - Alterar dados Boleto Sicredi

...

Alteração do código beneficiário no momento do cadastro do convenio, pois a conta é cadastrada antes do convenio. Tarefa finalizada porém alguma contas Sicredi sofrerão ajustes manuais e serão validadas.

...

TECD-2344

...

Atualizações do Faturamento em Cloud

...

.

...

TECD-2343

...

Implementar um aplicativo para realizar o papel de producer de filas da OCI (OCI Queues)

...

Informações do projeto

Objetivo

Fornecer uma interface entre receber uma mensagem Json via Rest e armazenar ela em uma OCI Queue. Esse aplicativo é um produtor de mensagens em uma Queue.

Parametros necessários

Configurar no application.properties:

oci.config.path= oci.config.endpoint= oci.config.queue-ocid=

O path é o caminho onde o arquivo config está armazenado (arquivo semelhante ao do resource .oci/config).

Endpoint e queue-ocid são informações que são obtidas na criação das queues.

Métodos a serem utilizados

/ e /ping

são métodos GET servem só para teste se a API subiu.

/api/send

método POST cujo valor do body será armazenado como mensagem na Queue.

Atenção

Como trata-se de um recurso da OCI atentar-se com um uso de chave privada com direitos de acesso de usuário como serviço para execução.

...

TECD-2342

...

Melhoria nas mensagens usando RemoteDB no TMS

...

1.Menu
DmConexao.CDSApplyUpdates do RemoteDB

2.Objetivo
Corrigir para quando usar o método DmConexao.CDSApplyUpdates para gravação de dados, caso ocorra alguma erro no banco que este erro seja apresentado corretamente para o usuário. Atualmente é apresentado apenas uma mensagem genérica de erro.

3.Alteração
Após analise, descoberto que o problema está no uso do Middleware de logging, conforme sugestão do suporte TMS é necessário setar a propriedade LogExceptions para False.

...

TECD-2336

...

Fintech - Boletos - Nome arquivo de remessa

...

Modificação no metodo que gera a remessa na api da Fintech.

...

TECD-2332

...

VsEmbedding - Dividir em serviços de uma rota de cosumo - Implementar serviço vsembedding-create-index

...

.

...

TECD-2329

...

VsIA Api - Confeir as versoes do OpenAI considerando as versões compatíveis com o langchain

...

1.Menu

VsIA Api → OpenAI

2.Objetivo

Verificar versão da OpenIA

3.Alteração

Anteriormente nas versões do langchain tínhamos que fazer um combinado entre a versão do langchain com a versão da OpenIA para que as bibliotecas pudessem funcionar corretamente em conjunto.

Mas parece que dentro dessas novas versões do langchain o próprio langchain criou um pacote nele mesmo para fazer a gestão das versões e chamadas com a OpenIA.

Code Block
>> langchain==0.2.5
>> langchain-openai==0.1.9

No caso ao baixar através do pip install langchain ele já puxara a latest da openai juntamente com ele, ou seja não precisa de implementações e grande pesquisa para funcionar.

...

TECD-2327

...

VsIA Api - Conferir engenharia de prompt

...

1.Menu

VsAPI → Langchain → Prompt

2.Objetivo

Verificar qual a estratégia de prompt está sendo mais utilizada nesse momento, considerando a latest do langchain

3.Alteração

Anteriormente o prompt era gerado de uma forma bem manual, aonde através de uma string formatada era possível colocar algumas variáveis que mais para frente seriam preenchidas pelo langchain, exemplo: context, chat_history e input. E logo após isso chamávamos o PromptTemplate e indicavamos de forma manual quais foram as variáveis adicionadas e qual a variável de prompt utilizada.

Forma que era utilizada:

Code Block
 prompt_template = "Prompt: " + prompt + """

        Context: {context}

        Chat History: {chat_history}

        User Input: {question}"""


FINAL_PROMPT = PromptTemplate(
  input_variables=["context", "question", "chat_history"], template=prompt_template
) 

Atualmente o PromptTemplate já foi descontinuado, mas ainda há algumas semelhanças, pois usamos um método que seria o ChatPromptTemplate, mas nesse método ele já reconhece naturalmente todas as variáveis setadas automaticamente.

Code Block
 # https://api.python.langchain.com/en/latest/prompts/langchain_core.prompts.chat.ChatPromptTemplate.html
real_prompt = ChatPromptTemplate.from_messages([
        ("system", f"{prompt}"),
        MessagesPlaceholder("chat_history"),
        ("assistant", "{context}"),
        ("human", "{input}")
]) 

Além disso, nessa nova forma, nós conseguimos configurar de onde está vindo cada uma das mensagens, ou seja, o contexto vem sempre do “assistant”, o prompt vem sempre do “system” e o “human” que vai perguntar alguma coisa entra como a última interação.

Esse modelo de prompt é muito mais completo pelo fato que pode ser adicionada infinitas varáveis e diversas interações até a última ação, a qual seria a do próprio cliente, além de tudo isso o “chat_history” não entra categorizado nem como “assistant” e nem como “system” ele próprio faz esse controle.

Além desse novo prompt é importante que ressaltar que agora temos um prompt que tem a função de auxiliar o retriever para gerar perguntas e respostas para ele mesmo.

O chat_prompt é um prompt que é usado para gerar a consulta de pesquisa para o retriever. No código que você forneceu, o chat_prompt é obtido a partir do hub LangChain usando o comando hub.pull("langchain-ai/chat-langchain-rephrase").

E vendo através das documentações é possível construir um prompt, ou também podemos utilizar alguns que o próprio langhcian disponibiliza.

Code Block
 def get_history_aware_retriever(llm: ChatOpenAI, vector: ElasticsearchStore):
    # Conforme as documentações do langhcain https://smith.langchain.com/hub/langchain-ai/chat-langchain-rephrase
    chat_prompt = hub.pull("langchain-ai/chat-langchain-rephrase")

    history_aware_retriever = create_history_aware_retriever(
        llm, vector.as_retriever(), chat_prompt
    )

    return history_aware_retriever 

...

TECD-2326

...

VsIA Api - Conferir Vector Store

...

1.Menu

VsApi → Elasticserach → Vetorização de contextos

2.Objetivo

Verificar as documentações e usar também a comunidade para verificar o que devemos implementar no nosso projeto com base nas vetorizações de contextos

3.Documentação

Se entrarmos das documentações do ElasticVectorSearch https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.elastic_vector_search.ElasticVectorSearch.html é possível ver de cara uma mensagem de decaprated:

...

Ele foi migrado para a ElasticsearchStore, aonde ficou muito mais completo agora, pois faz parte de um projeto langchain_elasticsearch invés de langchain_community. Sendo adicionado diversas funcionalidades como strategy, vector_query_field, query_field, distance_strategy. Mas de longe a melhor melhoria foi escolher a estratégia. Qual estratégia escolher?

ApproxRetrievalStrategy (padrão) - Ela usa o algoritmo HNSW para realizar uma pesquisa aproximada do vizinho mais próximo. Esta é a estratégia mais rápida e eficiente em termos de memória.

ExactRetrievalStrategy - Esta estratégia é usada para realizar uma pesquisa de força bruta / vizinho mais próximo exato via script_score (É uma funcionalidade do Elasticsearch que permite modificar a pontuação (score) de documentos durante uma pesquisa, usando um script personalizado. O script pode usar qualquer campo do documento para calcular a nova pontuação. Isso é útil quando você deseja personalizar a relevância de seus resultados de pesquisa com base em critérios específicos do seu aplicativo)

SparseRetrievalStrategy - Esta estratégia é usada para realizar uma pesquisa de vetor esparsa via text_expansion (refere a técnicas usadas para expandir uma consulta de pesquisa com sinônimos, termos relacionados ou variações de um termo para melhorar a precisão e a abrangência dos resultados da pesquisa).

Mas algumas coisas mudaram no sentido de busca de documentos, por padrão o ElasticsearchStore não da mais opção de colocar quantos números de documentos você deseja buscar, ou até mesmo o score que os documentos teriam que ter para aparecer dentro das buscas de indices, isso é feito automaticamente, mas se caso for necessário é possível utilizar o SelfQueryRetriever, que se trata de um auxiliador nesse sentido, mas nos meus testes não achei necessidade para usar o tal método.

O próprio langchain não aconselha utilizar essa parte, resposta do próprio langchain.

In your provided code, the documents are retrieved and processed in the create_history_aware_retriever and create_retrieval_chain functions. These functions are part of the LangChain library and handle the retrieval of documents from your ElasticsearchStore. If you want to manually retrieve a specific number of documents and use them in your context, you would need to modify these functions or create new ones. However, this would require a deep understanding of the LangChain library and might not be the recommended way to use the library.

Criação da POC:

Code Block
 elastic_vector_search = ElasticsearchStore(
        es_connection=es_client,
        index_name=index,
        embedding=embedding
    )

    llm = ChatOpenAI(openai_api_key=openai_api_key, temperature=0.5)

    chat_prompt = hub.pull("langchain-ai/chat-langchain-rephrase")

    history_aware_retriever = create_history_aware_retriever(
        llm, elastic_vector_search.as_retriever(), chat_prompt
    ) 

...

TECD-2325

...

VsIA Api - Verificar como pode ser resolvido LangChainDeprecationWarning

...

1.Menu

VsApi → Novas implementações considerando langchain 0.2.5

2.Objetivo

Verificar todas as partes que estavam com o deprecated e transferir para as novas versões

3.Alteração

Para executar o projeto antigo do VsApi ele já dava 3 erros de decrepeciado logo de cara o qual são os:

Code Block
1. LangChainDeprecationWarning: The class `OpenAIEmbeddings` was deprecated in LangChain 0.0.9 and will be removed in 0.3.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import OpenAIEmbeddings`. ✅

2.LangChainPendingDeprecationWarning: The class `ElasticVectorSearch` will be deprecated in a future version. Use Use ElasticsearchStore class in langchain-elasticsearch package instead. ✅
 
3. UserWarning: ElasticVectorSearch will be removed in a future release. SeeElasticsearch integration docs on how to upgrade. ✅

3.1 - Para instanciar um vector do Elastic sempre é necessário anexar uma estratégia de embedidgs que ele irá executar para analisar as documentações e responder conforme elas, e no nosso caso sempre era passado a OpenAIEmbeddings porém faz um bom tempo que o langchain os seus pacotes, agora temos langchain_openai, langchain_elasticsearch, langchain_community…

E por isso foi alterado a lógica do Embedding, aonde ele faz parte de um pacote especifico da OpenAI, a sua implementação no geral não foi alterado e até deu suporte a passar a chave da openai_api_key como parâmetro (aonde antes não era possível).

Code Block
 from langchain_openai import OpenAIEmbeddings

# Por default usa o modelo de embedding: text-embedding-ada-002
# Por default o tamanho da chunck é 1000 (O qual é usado hoje nas estratégias de embedding)
embedding = OpenAIEmbeddings(openai_api_key=openai_api_key)

# ... 

3.2 e 3.3 - O mesmo aconteceu com o ElasticVectorSearch, ele saiu do pacote inicial do elastic, aonde antes uma única lib do elastic dava suporte a toda estrutura, e agora é divida em submódulos, no geral essa refatoração teve mudanças em seus principais métodos e estrategias, mas ainda mantém sua função principal como vector.

Code Block
  from langchain_elasticsearch import ElasticsearchStore
 import elasticsearch
 
 # Outra coisa que foi alterada nesse sentido foi que agora instanciamos uma conexão do elasticsearch de forma convencional
 # E só depois passamos para o vetor como parametro
 # Anteriormente o próprio vetor cuidava da conexão
 es_client= elasticsearch.Elasticsearch(
        hosts=elastic_full_url
)

# Aqui em si ele mantém a mesma lógica no geral, recebendo um index de contexto, estratégia de embedding
# Mas o seu uso mudou muito daqui para frente
# https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.elasticsearch.ElasticsearchStore.html
# Por padrão utiliza a estratégia ApproxRetrievalStrategy
# Mas pode ser alterada para ExactRetrievalStrategy, ApproxRetrievalStrategy, or SparseRetrievalStrategy.
elastic_vector_search = ElasticsearchStore(
        es_connection=es_client,
        index_name=index,
        embedding=embedding
) 

E uma principal mudança no ElasticserachStore, foi que agora após instanciar ele é possível fazer os embeddings utilizando ele mesmo através do método add_documents}}ou {{aadd_documents, aonde a única diferença entre eles é que um trabalha de forma síncrona e outro de forma assíncrona. Após essa implementação do langchain podemos utilizar o ElasticsearchStore para auxiliar na criação dos embeddings facilmente. Aqui está um exemplo aonde peguei um arquivo de texto e fiz o embedding em um índice específico utilizando as novas documentações.

Code Block
 from langchain_text_splitters import CharacterTextSplitter
import elasticsearch
from langchain_openai import OpenAIEmbeddings
from langchain_elasticsearch import ElasticsearchStore

with open("windows.txt", encoding="utf-8") as f:
    windows_manual = f.read()

text_splitter = CharacterTextSplitter(
    separator="\n\n",
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    is_separator_regex=False,
)

metadatas = [{"document": "windows.pdf"}]

docs = text_splitter.create_documents([windows_manual], metadatas=metadatas)


es_client = elasticsearch.Elasticsearch(
    hosts=elastic
)

embedding = OpenAIEmbeddings(openai_api_key=openai_api_key)

elastic_vector_search = ElasticsearchStore(
    es_connection=es_client,
    index_name=index,
    embedding=embedding
)

elastic_vector_search.add_documents(docs)

# Em poucas linhas uma estratégia de embedding muito útil 

...

TECD-2324

...

VsIA Api - Criar sistema de memória interno dentro do langchain com elasticsearch

...

1.Menu

VsIA Api → Histórico de Mensagens

2.Objetivo

Criar um fork de uma biblioteca que já faz integração com histórico de chats com langchain e elasticsearch

3.Alteração

Nesse sentido foi verficado que a biblioteca do elasticsearch atendia parcialmente nossas demandas, logo foi realizada uma adptação e refatoração do código deles para conseguir servir a nossa demanda. O langchain possui o método ElasticsearchChatMessageHistory que se trata de uma classe que faz a criação de uma conexão com o elasticsearch e além disso é possível adicionar mensagens e visualizar as mensagens no histórico.

Mas para o nosso uso nós precisávamos conseguir odernar as mensagens, além disso limitar a quantidade delas. Por isso foi criado realizado as modicações no ElasticsearchChatMessageHistory e agora ele é o VsApiChatMessageHistory.

Métodos:

Code Block
 def teste():
    # Para instaciar o método preciamos inserir algumas informações
    # Nesse caso temos que colocar a url, username, password do servidor do elastic
    # E também temos que passar o index (Indice que irá armazenar o histórico) 
    # e o session_id (que se trata da memoria do usuario naquela especifica sessão/chat)
    history = VsApiChatMessageHistory(
        es_url=url,
        es_user=username,
        es_password=password,
        index=index,
        session_id=session_id
    )

    # Também podemos adicionar uma mensagem humana, que no caso seria o input do usuario
    history.add_human_message("Olá me chamo Lucca")

    # E também podemos adicionar uma mensagem de IA, que seria a resposta do bot
    history.add_ia_message("Olá Lucca, como posso te ajudar?")

    # Através desse método conseguimos descrever se queremos a ordem das mensagens de forma
    # crescente ou decrescente, e também podemos limitar a quantidade de mensagens que queremos
    # deve ser usar desc para ordem decrescente e asc para ordem crescente
    last_four_messages = history.messagesLimitedBy('desc', 4)

    # E temos um método que retorna as mensagens de forma alternada
    # Dessa forma sempre teremos human, ia, human, ia, human, ia...
    order_messages = history.alternate_messages(last_four_messages) 

...

TECD-2318

...

Erro no applyUpdates usando servidor Datasnap do Agrotitan

...

.

...

TECD-2316

...

Filt - Boletos

...

Dados obtidos com sucesso via api Tecnospeed.

...

TECD-2315

...

Promover Cultura FinOps

...

.

...

TECD-2313

...

Monitoramento de Custos

...

.

...

TECD-2311

...

Ajustes de compilação versão 2024.03

...

.

...

TECD-2309

...

Atendimentos Sprint 36

...

.

...

TECD-2307

...

Atendimento

...

Dados nao localizados sendo necessário executar requisições na api da tecnospeed para preenchimento do código de barra e nosso numero impressão.

...

TECD-2306

...

Acompanhamento POC Zenvia - Parte 6

...

.

...

TECD-2305

...

Mudar segurança das API's VsEmbedding VsApi

...

1.Menu

VsAPI → Segurança

2.Objetivo

Alterar parte de segurança da API

3.Alteração

Foi retirado todo e qualquer tipo de autenticação que havia dentro da api

...

TECD-2303

...

IA - Analytics com insighs

...

.

...

TECD-2302

...

Gateway para IA (VsApi e VsEmbedding)

...

.

...

TECD-2301

...

Oke - Criar estrutura para IA (VsApi e VsEmbedding)

...

.

...

TECD-2300

...

Oke - Criar estrutura para PortalDoc

...

.

...

TECD-2298

...

Fintech - Subir nova versão do apk Android e iOS com a nova versão do extrato

...

.

...

TECD-2297

...

Mudar lógica de criptografia da senha dos usuários no ERP

...

.

...

TECD-2296

...

Novo controle de cache para dicionário de dados e redução de consumo de API's do server

...

1.Menu
Cache de dicionário de dados para aplicações TMS

2.Objetivo
Realizar a revisão da implementação feita pelo time do construshow, bem como realizar correções e melhorias.

3.Alteração
Realizada revisão, correções e melhorias no cache do dicionário. Também foram removidas as diretivas VsCache e substituído por XDATA, o seja, toda aplicação XDATA por padrão irá utilizar o novo cache.

...

TECD-2292

...

Rotina Fluxo de Caixa não carrega adequadamente os filtros salvos

...

.

...

TECD-2281

...

Orion - Estudar forma de manter retrocompatibilidade entre banco H2 e MySQL

...

1.Menu

Orion → Banco de Dados

2.Objetivo

Verificar se é possível deixar os dois bancos funcionando ao mesmo tempo

3.Alteração
Após uma análise detalhada, verificou-se que é viável manter um único projeto do Orion funcionando em dois diferentes bancos de dados (H2 e MySQL). Mas a ressalvas:

A solução para permitir que o Orion funcione com H2 ou MySQL envolve a configuração de uma flag que determine qual banco de dados será utilizado, detalhe que essa funcionalidade já foi utilizada para migrar os logs para o MySQL.

Pelos estudos não vai precisar manter em .war diferentes, pelo fato de que não vamos ter informações fixas dentro do código-fonte do Orion, ele vai buscar as informações direto das variáveis de ambiente do sistema para verificar qual banco deverá usar. A principal dificuldade encontrada está nos repositórios e serviços que possuem SQL fixos. Para resolver isso, é necessário adaptar o código para que seja mais genérico, ou então, utilizar a API do Hibernate para evitar SQL nativo. Em casos onde o SQL nativo for inevitável, podemos parametrizar o banco de dados utilizado, exemplo:

Code Block
 @Query(value = "SELECT * FROM ${tableName} WHERE id = :id", nativeQuery = true)
Optional<Entity> findById(@Param("tableName") String tableName, @Param("id") Long id); 

Agora a análise de forma separada

Code Block
# Model
Os models no projeto Orion representam as entidades do banco de dados.
Como o Spring Data JPA abstrai grande parte das diferenças entre bancos de dados,
o impacto nos models é mínimo, independentemente de você usar H2 ou MySQL.

# Repository
Os repositories são responsáveis por interagir com o banco de dados.
A maioria das operações de CRUD são diretamente suportadas pelo Spring Data JPA,
independentemente do banco subjacente.
No entanto, desafios podem surgir ao usar queries SQL nativas,
que podem diferenciar entre H2 e MySQL.

# Controller
Os controllers no Spring Boot geralmente não são afetados pelo tipo de banco de dados
utilizado, uma vez que eles lidam principalmente com a lógica e encaminham solicitações
para os serviços e repositórios.

...

TECD-2279

...

Orion - Migrar parte de logs dentro do Orion para o MySQL

...

1.Menu

Orion → Banco de Dados

2.Objetivo

Criar feature que grava os logs do Orion no banco MySQL

3.Alteração

O Orion utiliza o log4j2 para geração de logs, e todos os apontamentos e códigos estão sendo feitos para o banco h2, sendo tudo fixo nessa parte.

Logo o que teve que ser feito foi a refatoração do log4j2.xml para um formato que consiga atender tanto os logs no h2 como no mysql, ai entra as peculiaridades de cada banco em si.

Dessa forma teve que criar dois métodos o getDatabase e o getDatabaseLogs, pelo fato dos logs ter a possibilidade de funcionar no banco MySQL além do H2.

Code Block
 <ConnectionFactory class="br.com.viasoft.orion.security.LogFactory" method="getDatabaseConnectionLogs" /> 

Um fato importante a se destacar que o Orion vai utilizar MySQL se ele encontrar as seguintes variáveis de ambiente

  • MYSQL_DB_URL

  • MYSQL_DB_USER

  • MYSQL_DB_PASSWORD

Após ele encontrar as variáveis ele vai tentar fazer um test-connection, caso encontre sucesso vai utilizar o MySQL para armazenar os logs, caso contrário vai utilizar o banco H2 para tudo.

Code Block
 // Exemplo da iniciação da base
Connection conn = LogFactory.getDatabaseConnectionLogs();
                StringBuilder sql = null;
                try {
                    boolean isH2 = true;
                    if (conn != null) {
                        if (conn.getMetaData() != null) {
                            if (conn.getMetaData().getDatabaseProductName() != null) {
                                isH2 = !conn.getMetaData().getDatabaseProductName().equals("MySQL");
                            }
                        }
                    }

                    logger.info("Iniciando com base: " + (isH2 ? "H2" : "MySQL"));
                    sql = isH2 ? sqlBuildH2() : sqlBuildMySQL(); 

Houveram diversas mudanças dentro do código, mas cabe ressaltar que todas tiveram o requisito principal em deixar os dois bancos funcionando ao mesmo tempo.

Aqui é um guia descrito durante a tarefa para dar as instruções de como conectar os logs pelo MySQL no Orion,

/wiki/spaces/TD/pages/3699769371

...

TECD-2276

...

Atendimentos Sprint 35

...

.

...

TECD-2275

...

Implantação Orion Turim na Cloud 2.0

...

.

...

TECD-2273

...

Carregar fundo dinâmico do ERP conforme TECD-2177

...

.

...

TECD-2272

...

Criar ambiente da Aplicação Satélite Construshow Portal do Cliente

...

.

...

TECD-2271

...

Assistente Melhorias Orginalização do Disparo Automático

...

1.Menu

Orion → Viadecisor (API Versão API Oficial)

2.Objetivo

3.Alteração

3.1 -

3.2 -

3.3 -

3.4 -

...

TECD-2270

...

Fintech - Boletos

...

Foram necessarias alteracoes na Fintech e no Filt.