UNPKG

@cosmixclub/parsero

Version:

Construtor de agentes de IA de maneira simplificada.

349 lines (344 loc) 14.3 kB
import * as _langchain_langgraph from '@langchain/langgraph'; import { KVMap } from 'langsmith/schemas'; import { z } from 'zod'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; /** * Extrai os tipos genéricos Input e Output de um tipo State * Usado para facilitar o uso de Procedure com State sem necessidade de * recriar os tipos manualmente. */ type InferState<T> = T extends State<infer I, infer O> ? State<I, O>["values"] : never; /** * Representa o formato mínimo esperado para os valores de estado * utilizados por um agente. Estes valores são normalmente divididos * em `input` e `output`. */ type StateValuesFormat = { /** * Propriedades que compõem o estado de **entrada**. */ input: any; /** * Propriedades que compõem o estado de **saída**. */ output: any; }; /** * A classe `State` controla o estado interno de um agente, contendo * tanto as propriedades de **entrada** quanto de **saída** de forma * tipada, utilizando `Zod` para validação. * * @template Input - Schema Zod para o estado de entrada * @template Output - Schema Zod para o estado de saída */ declare class State<Input extends z.AnyZodObject, Output extends z.AnyZodObject> { private readonly props; /** * Mantém em memória o estado atual do agente, separado em `input` e `output`, * ambos tipados e validados via Zod. * * @private */ private _runtime; constructor(props: { /** * Schema Zod para validar a forma do estado de entrada. */ inputSchema: Input; /** * Schema Zod para validar a forma do estado de saída. */ outputSchema: Output; }); /** * Retorna o estado atual do agente, composto pelas chaves * `input` e `output`. */ get values(): { input: z.TypeOf<Input>; output: z.TypeOf<Output>; }; /** * Tenta validar um objeto qualquer contra o schema de entrada definido. * * @param input - Dados a serem validados. * @returns O resultado da validação (sucesso ou erro). */ parseInput(input: any): z.SafeParseReturnType<{ [x: string]: any; }, { [x: string]: any; }>; /** * Tenta validar um objeto qualquer contra o schema de saída definido. * * @param output - Dados a serem validados. * @returns O resultado da validação (sucesso ou erro). */ parseOutput(output: any): z.SafeParseReturnType<{ [x: string]: any; }, { [x: string]: any; }>; /** * Atualiza o estado de entrada do agente. Ideal para ser usado após * a validação com `parseInput`. * * @param input - Objeto de estado de entrada que segue o schema definido. */ setInput(input: z.infer<Input>): void; /** * Atualiza o estado de saída do agente. Ideal para ser usado após * a validação com `parseOutput`. * * @param output - Objeto de estado de saída que segue o schema definido. */ setOutput(output: z.infer<Output>): void; /** * Função auxiliar que processa recursivamente objetos aninhados e arrays * para converter para o formato LangGraph * * @param obj - Objeto ou array a ser processado * @param prefix - Prefixo a ser adicionado às chaves * @param result - Objeto de resultado acumulado * @private */ private static processObject; /** * Converte um objeto de estado no formato `{ input, output }` * para um formato de objeto plano, onde cada chave é prefixada * com `"input_"` ou `"output_"`. * * Este método pode ser útil para integrar com outras bibliotecas * que necessitem de chaves únicas (por exemplo, `LangGraph`). * * @param values - Objeto com as chaves `input` e `output`. * @returns Objeto plano contendo as chaves prefixadas, ex: `{ input_<key>: value, output_<key>: value }`. */ static valuesToLanggraph(values: StateValuesFormat): Record<string, any>; /** * Faz o caminho inverso de `valuesToLanggraph`, ou seja, converte um * objeto plano (com chaves `input_...` e `output_...`) para um * objeto `{ input, output }`. * * @param object - Objeto contendo chaves prefixadas em `input_` e `output_`. * @returns Objeto `{ input, output }` reconstruído a partir das chaves lidas. */ static langgraphToValues(object: Record<string, any>): { input: Record<string, any>; output: Record<string, any>; }; } /** * Representa uma procedure do tipo "Action", cujo objetivo é **mudar** o estado do agente. * * O `ActionProcedure` faz mutações ou computações que alteram o estado de forma persistente. * Quando executada, retorna o objeto de estado atualizado. * * @template StateValues - Formato dos valores de estado usados pelas procedures * @template LLMType - Tipo específico do modelo de linguagem passado para o procedimento */ interface ActionProcedure<StateValues extends StateValuesFormat, LLMType extends LLMTypeBase = BaseChatModel> extends BaseProcedure { /** * Nome da próxima procedure que deve ser executada. * * Se fornecido, o fluxo de execução passa diretamente para `nextProcedure`. * Se não for definido, o Agent tentará executar a próxima procedure listada * na sequência fornecida ao `Agent`. * É opcional quando a lista de procedures não tiver ao menos uma procedure `check`. Quando houver, * é necessário indicar o nome da próxima procedure, podendo também ser `__end__`, ou a constante `END` do LangGraph. */ nextProcedure?: string; /** * Método responsável por executar a ação. * Recebe o estado atual e o modelo de linguagem (LLM), podendo realizar alterações * no estado e retornando-o em seguida. * * @param state - Estado atual do agente * @param llm - Modelo de linguagem que o Agent utiliza para auxiliar na execução * @returns Estado atualizado */ run(state: StateValues, llm: LLMType): Promise<StateValues>; /** * Tipo do procedimento, neste caso é sempre `"action"` */ type: "action"; } /** * Interface base para todas as procedures, tanto `ActionProcedure` quanto `CheckProcedure`. */ interface BaseProcedure { /** * Nome único para identificação da procedure */ name: string; /** * Opções de tracing para a integração com o LangSmith */ tracing?: { /** * Nome do procedimento a ser rastreado. Sobrescreve o nome padrão */ label?: string; /** * Metadados adicionais para o procedimento. Pode ser usado para rastreamento * ou para fornecer informações extras sobre a execução. */ metadata?: KVMap; /** * Tipo da execução procedimento a ser rastreado. Default: `"tool"` */ runType?: "chain" | "embedding" | "llm" | "parser" | "prompt" | "retriever" | "tool"; }; } /** * Representa uma procedure do tipo "Check", cujo objetivo é **não alterar** o estado, * mas sim decidir qual será a próxima procedure. * * O `CheckProcedure` recebe o estado atual, faz uma verificação (ou análise) e * retorna o **nome da próxima procedure** que deve ser executada pelo {@link Agent}. * * @template StateValues - Formato dos valores de estado usados pelas procedures * @template LLMType - Tipo específico do modelo de linguagem passado para o procedimento */ interface CheckProcedure<StateValues extends StateValuesFormat, LLMType extends LLMTypeBase = BaseChatModel> extends BaseProcedure { /** * Método responsável por verificar/analisar o estado atual e retornar * o nome da próxima procedure a ser executada. * * @param state - Estado atual do agente * @param llm - Modelo de linguagem que o Agent utiliza para auxiliar na execução * @returns Nome da próxima procedure que o Agent deve executar, ou null/undefined para finalizar a execução */ run(state: StateValues, llm: LLMType): Promise<null | string | undefined>; /** * Tipo do procedimento, neste caso é sempre `"check"` */ type: "check"; } /** * Tipo unificado que agrupa tanto `ActionProcedure` quanto `CheckProcedure`. * * O `Agent` irá lidar de maneira diferenciada com cada um: * - **Action**: Altera o estado e pode (opcionalmente*) indicar o nome da próxima procedure. * - **Check**: Não altera o estado e sempre retorna o nome da próxima procedure. * * @template StateValues - Formato dos valores de estado usados pelas procedures * @template LLMType - Tipo específico do modelo de linguagem */ type Procedure<StateValues extends StateValuesFormat, LLMType extends LLMTypeBase = BaseChatModel> = ActionProcedure<StateValues, LLMType> | CheckProcedure<StateValues, LLMType>; /** * Tipo base que define o que um modelo de linguagem (LLM) deve ser. * Pode ser um BaseChatModel ou um objeto com chaves sendo os nomes dos modelos * e os valores sendo instâncias de BaseChatModel. */ type LLMTypeBase = BaseChatModel | Record<string, BaseChatModel>; /** * Representa um agente de IA que processa uma sequência de {@link Procedure|Procedures}. * * A classe `Agent` é responsável por receber um estado, um conjunto de `Procedure` * e um modelo de linguagem (LLM), para então executar passos (Procedures) de forma * sequencial ou customizada (usando `nextProcedure` e/ou `CheckProcedure`). Existem dois tipos principais de `Procedure`: * * - **ActionProcedure**: Recebe e **altera** o estado do agente, realizando mutações * e computações necessárias. * - **CheckProcedure**: Recebe o estado do agente, **não o altera**, e retorna um * **nome** de próxima procedure que será executada. * * @template Input - Schema Zod para o estado de entrada * @template Output - Schema Zod para o estado de saída * @template LLMType - Tipo específico do modelo de linguagem (inferido automaticamente) */ declare class Agent<Input extends z.AnyZodObject, Output extends z.AnyZodObject, LLMType extends LLMTypeBase = BaseChatModel> { private readonly props; constructor(props: { /** * Modelo de linguagem que será utilizado pelas procedures. Pode ser um `ChatModel` do LangChain * ou um objeto mapeando nomes para modelos. * * @see {@link https://js.langchain.com/docs/concepts/chat_models} Saiba mais sobre `ChatModel` do LangChain. * * @example * // Modelo único * new ChatOpenAI() * * // Mapa de modelos * { * "default": new ChatOpenAI(), * "summarize": new ChatGoogleGenerativeAI() * } */ llm: LLMType; /** * Opções adicionais */ options?: { /** * Número máximo de iterações para evitar loops infinitos. Padrão: 100 iterações (use `Infinity` para desabilitar o limite) */ maxIterations?: number; /** * Metadados adicionais para o agente. Pode ser usado para rastreamento * ou para fornecer informações extras sobre a cadeia de procedimentos. */ metadata?: KVMap; /** * Nome do agente. Útil para depuração e rastreamento. */ name?: string; /** * Se `true`, habilita logs de execução */ verbose?: boolean; }; /** * Lista de {@link Procedure} que serão executadas pelo agente */ procedures: Procedure<State<Input, Output>["values"], LLMType>[]; /** * Instância de {@link State} que contém os schemas de entrada/saída e o estado do agente */ state: State<Input, Output>; }); /** * Verifica se todos os nomes de procedures são únicos, lançando um erro caso haja duplicados. * * @throws {ProcedureNameError} - Se forem detectados nomes duplicados. * @private */ private validateProcedureNames; /** * Verifica a consistência da cadeia de procedures: * 1. Se existe ao menos uma procedure do tipo `check`. * 2. Se todas as procedures do tipo `action` que fazem parte de uma cadeia * com `check` declaram o `nextProcedure`. * * @throws {ProcedureChainError} - Se for detectada inconsistência na declaração de procedures. * @private */ private validateProcedureChain; /** * Retorna o grafo do agente usando o LangGraph. Útil para casos de uso mais complexos * que a biblioteca não forneça suporte nativo. * * @see {@link https://langchain-ai.github.io/langgraphjs/} Saiba mais sobre o LangGraph na documentação oficial. * * @returns `StateGraph` compilado do LangGraph baseado nas procedures e no estado do agente. */ get graph(): _langchain_langgraph.CompiledStateGraph<_langchain_langgraph.StateType<Record<string, any>>, _langchain_langgraph.UpdateType<Record<string, any>>, "__start__", Record<string, any>, Record<string, any>, _langchain_langgraph.StateDefinition>; /** * Executa o agente, processando as {@link Procedure|Procedures} até chegar em um fim. * * 1. Faz o parse do input inicial de acordo com o schema de entrada. * 2. Valida a lista e a cadeia de procedures. * 3. Executa cada procedure (action ou check) em loop até atingir um `END` ou o fim da lista. * 4. Faz o parse do output final de acordo com o schema de saída. * * @param input - Dados de entrada que seguem o schema definido em `State`. * @returns Dados de saída que seguem o schema definido em `State`. * @throws {StateValidationError} - Caso o input ou o output não siga o schema. * @throws {ProcedureChainError} - Caso a cadeia de procedures ultrapassar o número máximo de iterações. */ run(input: z.infer<Input>): Promise<z.infer<Output>>; } export { type ActionProcedure, Agent, type BaseProcedure, type CheckProcedure, type InferState, type Procedure, State, type StateValuesFormat };