Skip to main content
Glama

estudIA-MCP

by JpAboytes
gemini.cpython-312.pyc25.1 kB
� �� ib����dZddlZddlmZmZmZmZddlmZ ddl m Z e jre je j��ne d��dZd ed eeeffd �ZGd �d �Ze�Zy)u9 Cliente para Google Gemini AI - Integración con FiscAI �N)�List�Dict�Any�Optional�)�config)�api_keyu#GEMINI_API_KEY no está configuradau� Eres Juan Pablo, un asistente fiscal experto en México especializado en ayudar a micro y pequeños negocios. **CAPACIDADES ESPECIALES:** 1. **Ubicaciones de Bancos y SAT:** - Cuando el usuario pregunte sobre dónde encontrar un banco Banorte o una oficina del SAT - USA la herramienta 'open_map_location' para abrir el mapa - Ejemplos de preguntas que deben activar el mapa: * "¿Dónde hay un Banorte?" * "¿Dónde está el SAT más cercano?" * "Necesito ir a un banco" * "Muéstrame oficinas del SAT" * "Busca un Banorte en Reforma" * "¿Hay alguna oficina del SAT cerca?" 2. **Asesoría Fiscal:** - Proporciona información sobre régimen fiscal, obligaciones, trámites - USA la herramienta 'get_fiscal_advice' para consultas de formalización 3. **Análisis de Riesgo:** - Evalúa la situación fiscal del usuario - USA la herramienta 'analyze_fiscal_risk' cuando pregunten sobre su nivel de cumplimiento **FORMATO DE RESPUESTA PARA UBICACIONES:** Cuando uses 'open_map_location', tu respuesta debe ser breve y clara: - "¡Claro! Te abro el mapa con los Banorte más cercanos." - "Perfecto, te muestro las oficinas del SAT en tu zona." - "Busco Banorte en Reforma para ti." **NO incluyas las coordenadas o detalles técnicos en tu respuesta, eso lo maneja el mapa automáticamente.** **Tono:** Cercano, profesional pero amigable, como un asesor de confianza. �message�returnc�� �|j�� gd�gd�d�}gd�}d}t� fd�|dD��rd}nt� fd�|d D��rd }t� fd �|D��}d}gd �}|D]�}|� vs�� j|d �}t|�d kDs�)|d jd �djd�djd�dj �} t| �dkDs��| }n|xr|du|||xr|dud�S)un Detecta la intención del usuario antes de llamar a Gemini para optimizar el uso de herramientas )�banorte�bancozsucursal bancariaz ir al banco�sucursal)�satzoficina del satu&servicio de administración tributariazcentro tributarioumódulo de atenciónzoficina tributaria)�bankr)udónde�donde�ubica� encuentra�busca�hay�mostrar�muestra�llevar�ir�cerca�cercanoz necesito irz quiero iru cómo llegarNc3�&�K�|]}|�v��� y�w�N���.0�keyword� message_lowers ��2C:\Users\Owner\Downloads\estudIA-MCP\src\gemini.py� <genexpr>z%detect_user_intent.<locals>.<genexpr>Hs����� M�3L��7�m� #�3L���rc3�&�K�|]}|�v��� y�wrrr s �r$r%z%detect_user_intent.<locals>.<genexpr>Js����� N�5M�'�W� � %�5M�r&rc3�&�K�|]}|�v��� y�wrr)r!�verbr#s �r$r%z%detect_user_intent.<locals>.<genexpr>Ns�����M�n�d�D�M�1�n�r&)� en z de z cerca de z por r�.r�,�?�)�is_location_query� location_type� search_query� requires_map)�lower�any�split�len�strip) r �location_keywords�location_verbsr0r/r1�location_indicators� indicator�parts�potential_queryr#s @r$�detect_user_intentr>3s6��� �M�M�O�M�U�S���B�N� �M� � M�3D�V�3L� M�M�� � � N�5F�u�5M� N� N�� ��M�n�M�M���L�A��(� � � � %�!�'�'� �1�5�E��5�z�A�~�"'��(�.�.��"5�a�"8�">�">�s�"C�A�"F�"L�"L�S�"Q�RS�"T�"Z�"Z�"\����'�!�+�#2�L��)�/�L�=��3L�&�$�)�G�m�4�.G�  ��c �P�eZdZdZd�Zdedefd�Zdedeefd�Z de ee fd edefd �Z dd e ee fd ee ee fde e ee fde ee ffd�Z ddede e ee fdee ee fdee ee fdef d�Zde ee fde ee ffd�Zdedee ee fde ee ffd�Zy )� GeminiClientz-Cliente para interactuar con Google Gemini AIc�T�tjtj�|_yr)�genai�GenerativeModelr� GEMINI_MODEL�model)�selfs r$�__init__zGeminiClient.__init__hs���*�*�6�+>�+>�?�� r?�promptr c���K� tj|jj|��d{���}|jr |jSdS7�#t $r}t d|���|�d}~wwxYw�w)z� Genera texto simple usando Gemini Args: prompt: Prompt para generar texto Returns: Texto generado por Gemini NzNo se pudo generar respuestazError generando texto: )�asyncio� to_threadrF�generate_content�text� Exception�print)rGrI�response�errors r$� generate_textzGeminiClient.generate_textkss���� �$�.�.�� � �+�+����H�%-�M�M�8�=�=� U�7U� U� �� � � �+�E�7�3� 4��K�� �sD�A3�-A�A�A� A3�A�A3�A� A0�A+�+A0�0A3rNc��K� tjtjtj |dtj ���d{���}t|t�r�d|vr0|d}t|t�r d|vr|dSt|t�r|Sd|vrKt|dt�r8|dr3|dd}t|t�r d|vr|dSt|t�r|St|d�rOt|d�}t|t�r d|vr|dSt|d�r |jSt|t�r|St|d�rZt|d�xsg}|rH|d}t|t�r d|vr|dSt|d�r |jSt|t�r|Std��7��d#t$r}td |���|�d}~wwxYw�w) u Genera embedding para un texto usando Gemini Compatible con el formato del código Python original Args: text: Texto para generar embedding Returns: Lista de números representando el embedding �RETRIEVAL_QUERY)rF�content� task_type�output_dimensionalityN� embedding�values� embeddingsrz,No se pudo extraer embedding de la respuestazError generando embedding: )rKrLrC� embed_contentr�GEMINI_EMBED_MODEL� EMBED_DIM� isinstance�dict�list�hasattr�getattrrZ� RuntimeErrorrOrP)rGrN�result�emb�e0�emb_listrRs r$�generate_embeddingzGeminiClient.generate_embeddings�����2 �"�,�,��#�#��/�/��+�&,�&6�&6� ��F��&�$�'��&�(� ��-�C�!�#�t�,��S��"�8�}�,�!�#�t�,�"� ��6�)�j�� �9M�t�.T�Y_�`l�Ym�� �-�a�0�B�!�"�d�+��B��!�(�|�+�!�"�d�+�!� ��v�{�+��f�k�2���c�4�(�X��_��x�=�(��3��)��:�:�%��c�4�(��J��v�|�,�"�6�<�8�>�B���!�!��B�!�"�d�+��B��!�(�|�+��r�8�,�!�y�y�(�!�"�d�+�!� ��M�N� N�[��^� � �/��w�7� 8��K�� �s��G�AF2� F/� 5F2�G�F2�G�<F2�G�F2�"G�#0F2�G�F2�+G�,F2�=G�>;F2�9G�:F2�G�F2�#G�$ F2�2 G�;G � G�G�profile�contextc��K� ddl}d}d|j|dd���d|�d �j�}tjt j |d d d �� �}tj|j|��d{���}|jxsdS7�#t$r)}td|���ddl } | j�|�d}~wwxYw�w)u� Genera recomendación fiscal usando RAG (contexto de documentos relevantes) Usa el mismo prompt que simulate_recomendation.py que funciona Args: profile: Perfil fiscal del usuario context: Contexto construido de documentos relevantes Returns: Recomendación detallada en formato markdown rNu�Eres un contador experto en México. Responde SOLO con el CONTEXTO provisto. Si no es suficiente, indica claramente 'Información insuficiente en la base'. Usa lenguaje claro y profesional.z PERFIL: Fr.)� ensure_ascii�indentu� TAREA: Como contador en México, necesito analizar este perfil y sugerir: 1) **Régimen fiscal más conveniente:** - Identifica el régimen fiscal óptimo para este perfil - Explica brevemente por qué es el más adecuado - Menciona alternativas si aplican 2) **Pasos específicos de formalización:** - Lista los pasos concretos para formalizarse (RFC, e.firma, CFDI, declaraciones) - Indica el orden recomendado - Menciona requisitos y documentos necesarios 3) **Fuentes oficiales del SAT consultadas:** - Lista las fuentes utilizadas con formato: Título -> URL - Usa solo las fuentes del CONTEXTO provisto - Cita las secciones relevantes CONTEXTO: � g333333�?i�)� temperature�max_output_tokens)� model_name�system_instruction�generation_configz (Sin texto)u$Error generando recomendación RAG: )�json�dumpsr7rCrDrrErKrLrMrNrOrP� traceback� print_exc) rGrjrkrurs� user_promptrFrQrRrws r$�generate_recommendationz$GeminiClient.generate_recommendation�s����� 9 � �\� � ����G�%���2�3�4�* � � �/�0 �E�G�1 �6�)�)�!�.�.�#5�#&�)-�#��E�%�.�.��&�&����H� �=�=�1�M� 1� ��� � �8���@� A� � � � � !��K��  �s;�C �A;B�?B�B�C �B� C�$C�C�C N�lambda_response� similar_cases� user_contextc ��K� d|jd|��d|jdi��d|dd�d|rd |��nd �d � }tj|jj|��d{���}|j }i|�|d tj �j�d ��S7�:#t$r}td|���|cYd}~Sd}~wwxYw�w)u7 Enriquecer recomendación fiscal con Gemini Args: lambda_response: Respuesta base del sistema similar_cases: Casos similares encontrados user_context: Contexto del usuario Returns: Recomendación enriquecida u� Eres un experto asesor fiscal mexicano. Basándote en la siguiente información, genera una recomendación personalizada y detallada: **Recomendación Base:** �recommendationz **Perfil del Usuario:** rjz) **Casos Similares (para referencia):** N�� z**Contexto del Usuario:** �u� **Instrucciones:** 1. Mantén el formato de la recomendación original con sus secciones (Régimen Fiscal, Pasos, Checklist, etc.) 2. Usa texto en **negrita** para títulos importantes 3. Usa *cursiva* para notas adicionales 4. Mantén los bullets y numeración 5. Asegúrate de incluir las fuentes al final 6. Sé específico con montos, fechas y requisitos 7. Usa lenguaje claro y accesible para micro-negocios Responde SOLO con la recomendación mejorada, sin comentarios adicionales. T)r�enhanced� enhanced_atu$Error enriqueciendo recomendación: ) �getrKrLrFrMrN�get_event_loop�timerOrP)rGr{r|r}rIrQ� enhanced_textrRs r$�enhance_recommendationz#GeminiClient.enhance_recommendation s����", #�����%��7�8�9����Y��#�$�%��r�����1=��|�n�-�2�F� G��F�4%�.�.�� � �+�+����H� %�M�M�M��!��"/� �&�5�5�7�<�<�>� � ���� #� �8���@� A�"� "�� #�sG�C �A&B'�*B%�+9B'�$C �%B'�' C �0C�?C �C �C � C r � chat_history� relevant_docsc ��K� t|�}|dr�td|d���d}d|d��g}|dr|jd|d���|�dd j|���}|dd k(rd nd } |dr d | �d|d�d�} nd| �d�} ddl} | j | |d|d|dd�d�d��S|�g}|�g}d} |reg} |ddD]J}| jd|j dd����| jd|j dd�����Ldj| �} d}|rtd |j d!d"��d#|j d$d%��d&|j d'd(���}|j d)�r |d*|d)d+��z }|j d,�r |d-|d,��z }d}|rZg}|D]?}|j d.d�dd/}|jd0|j d1d2��d3|�d4���Ad5d6j|�z}d6t�d|�d| rd7| ��nd�d|�d8|�d9� }tj|jj|��d{���}ddl} | j |jdd:id�d��S7�*#t$rK}td;|���ddl} | j d<t|���dd=d=t|�id�d��cYd}~Sd}~wwxYw�w)>u� Chat con el asistente fiscal usando Gemini con detección automática de intenciones Args: message: Mensaje del usuario user_context: Contexto del usuario chat_history: Historial de conversación relevant_docs: Documentos relevantes Returns: Respuesta del asistente en formato JSON con texto, deep_link y tool_used r2u2[CHAT] Detección automática: requiere mapa tipo=r0z fiscai://mapztype=r1zquery=r-�&r�Banortezoficinas del SATu 📍 Busco r*z para ti.u&📍 ¡Claro! Te abro el mapa con los u más cercanos.rN�open_map_location)r0r1)rN� deep_link� tool_used�detailsF)rmr������z Usuario: r z Asistente: rQr�u(**Información del Usuario:** - Nombre: �name�Usuarioz - Email: �emailz No disponiblez - Actividad: � actividadzNo especificada�ingresos_anualesz - Ingresos anuales: $r,�estadoz - Estado: rV��z- �title� Documento�: z...z**Documentos de Referencia:** rou**Conversación Previa:** z# **Pregunta Actual del Usuario:** u� **Instrucciones:** - Responde en español de manera clara y profesional - Usa ejemplos prácticos y específicos para México - Si mencionas montos o fechas, sé específico - Usa **negrita** para conceptos importantes - Usa *cursiva* para notas adicionales - Si no tienes suficiente información, pregunta amablemente - Mantén un tono amigable pero profesional - Si la pregunta requiere información personal del usuario que no tienes, pídela Responde de manera concisa pero completa: �chatzError en chat con asistente: z1Lo siento, hubo un error al procesar tu mensaje: rR)r>rP�append�joinrurvr�� SYSTEM_PROMPTrKrLrFrMrNrO�str)rGr r}r�r��intent�base_url�paramsr�� location_name� message_textru�history_context� history_items�h� user_info� docs_context� docs_list�docrVrIrQrRs r$�chat_with_assistantz GeminiClient.chat_with_assistantHs�����&x #�'��0�F��n�%��J�6�Ra�Kb�Jc�d�e�*��!�&��"9�!:�;�<���.�)��M�M�F�6�.�+A�*B�"C�D�'�j��#�(�(�6�*:�);�<� �.4�O�-D��-N� �Tf� ��.�)�%0���t�F�>�DZ�C[�[d�#e�L�%K�M�?�Zi�#j�L���z�z�(�!*�!4�)/��)@�(.�~�(>� � #�!&�"�'�'��#�!� ��$� "� �!�O�� "� �%�b�c�*�A�!�(�(�9�Q�U�U�9�b�5I�4J�)K�L�!�(�(�;�q�u�u�Z��7L�6M�)N�O�+�#)�+�+�m�"<���I��! � � � �F�I� .� /�0 � � � �7�O� 4� 5�6����{�,=�>� ?�C� �  �#�#�$6�7��#:�<�HZ�;[�\]�:^�!_�_�I��#�#�H�-��<� �X�0F�/G�!H�H�I��L��� �(�C�!�g�g�i��4�T�c�:�G��$�$�r�#�'�'�'�;�*G�)H��7�)�SV�%W�X�)�"A�D�I�I�i�DX�X� ����� � � �4C���/�0��L�M� ��� � � ��F�2%�.�.�� � �+�+����H� ��:�:� � � �!�#�� � "� �#� #���� #� �1�%��9� :� ��:�:�K�C�PU�J�<�X�!�$�#�S��Z�0� � "� �#� #�� #�sU�K�B&I)�*K�+FI)�<I'�=)I)�&K�'I)�) J=�2AJ8�2J=�3K�8J=�=Kc ��K� d|�d�}tj|jj|��d{���}|j}ddl}ddl}|jd|�}|r |j|jd��Std��7�W#t$re}td|���ddd |jd d �|jd d �|jd d �|jdd �d�gd�cYd}~Sd}~wwxYw�w)u� Analizar perfil fiscal y calcular riesgo Args: profile: Perfil fiscal del usuario Returns: Análisis de riesgo zO Analiza el siguiente perfil fiscal y calcula un nivel de riesgo: **Perfil:** ua Responde en JSON con este formato exacto: { "score": <número del 0 al 100, donde 0 es sin riesgo y 100 es alto riesgo>, "level": "<Verde|Amarillo|Rojo>", "message": "<mensaje breve del estado>", "details": { "has_rfc": <boolean>, "has_efirma": <boolean>, "emite_cfdi": <boolean>, "declara_mensual": <boolean> }, "recommendations": [ "<lista de recomendaciones específicas>" ] } Criterios de evaluación: - Verde (0-30): Cumplimiento fiscal óptimo - Amarillo (31-60): Requiere atención en algunas áreas - Rojo (61-100): Alto riesgo fiscal, acción inmediata requerida Nr� \{[\s\S]*\}u6No se pudo parsear la respuesta de análisis de riesgoz Error analizando riesgo fiscal: �VerdeuAnálisis no disponible�has_rfcF� has_efirma� emite_cfdi�declara_mensual)r�r�r�r�)�score�levelr r��recommendations)rKrLrFrMrNru�re�search�loads�group� ValueErrorrOrPr�) rGrjrIrQrNrur�� json_matchrRs r$�analyze_fiscal_riskz GeminiClient.analyze_fiscal_risk�s����< �� � � � �F�8%�.�.�� � �+�+����H� �=�=�D� � ����>�4�8�J���z�z�*�"2�"2�1�"5�6�6��U�V� V���"� � �4�U�G�<� =�� �4�&�{�{�9�e�<�")�+�+�l�E�"B�")�+�+�l�E�"B�'.�{�{�3D�e�'L� � $&� � �� �sF�D�3B�B�A B�D� B� C?�AC:�4C?�5D�:C?�?D�current_context�conversation_messagesc��0K� d}|D]I}|jd�rdnd}|jdd�}|jdd�}|d|�d|�d |��z }�Kd |r|nd �d |�d �}tj|jj|��d{���} | j j �} ddl} ddl} | jd�r| dd} | jd�r| dd} | jd�r| dd} | j �} | jd| �} | r"| j| jd��}|Std��7��#t$r@}t!d|���ddl}|j%�d|dt'|���gid�cYd}~Sd}~wwxYw�w)u� Analiza la conversación del usuario y determina si el contexto debe actualizarse. Args: current_context: Contexto actual del usuario (puede ser texto o JSON string) conversation_messages: Lista de mensajes de la conversación con 'content', 'created_at', 'user_id' Returns: Dict con should_update (bool), new_context (str), y reasons (list) r��user_idr�� AsistenterV� created_atz [z] r�z�Eres un asistente educativo que analiza conversaciones para personalizar la experiencia del usuario. **CONTEXTO ACTUAL DEL USUARIO:** zNo hay contexto previou **CONVERSACIÓN COMPLETA:** u# **INSTRUCCIONES:** Analiza la conversación y determina si hay información valiosa para actualizar el contexto del usuario. Busca información sobre: 1. **Nivel educativo**: Grado, carrera, área de estudio 2. **Estilo de aprendizaje**: Visual, auditivo, kinestésico, preferencias de explicación 3. **Intereses académicos**: Temas que le interesan, áreas de especialización 4. **Fortalezas y debilidades**: Materias en las que es fuerte o necesita ayuda 5. **Objetivos educativos**: Metas de aprendizaje, proyectos, exámenes 6. **Preferencias de comunicación**: Cómo prefiere que le expliquen, nivel de detalle 7. **Horarios o hábitos**: Cuándo estudia, con qué frecuencia 8. **Contexto personal relevante**: Cualquier dato que ayude a personalizar el aprendizaje **RESPONDE EN JSON CON ESTE FORMATO:** { "should_update": true/false, "new_context": "Contexto actualizado en formato de texto descriptivo. Combina el contexto anterior con la nueva información encontrada.", "reasons": [ "Razón 1 por la que se debe actualizar", "Razón 2..." ], "key_findings": { "nivel_educativo": "...", "estilo_aprendizaje": "...", "intereses": ["tema1", "tema2"], "fortalezas": ["..."], "debilidades": ["..."], "objetivos": "...", "preferencias": "...", "otros": "..." } } **CRITERIOS PARA ACTUALIZAR:** - Si encuentras información nueva y relevante que no está en el contexto actual - Si hay cambios en el nivel educativo, intereses o objetivos - Si identificas patrones de aprendizaje o preferencias claras - Si hay información contradictoria que necesita corrección **NO ACTUALICES SI:** - La conversación es muy breve o superficial - No hay información personal o educativa relevante - La información ya está en el contexto actual Responde SOLO con el JSON:Nrz```json�z```r������r�u8No se pudo parsear la respuesta de análisis de contextou9Error analizando conversación para actualizar contexto: FuError en el análisis: )� should_update� new_context�reasons� key_findings)r�rKrLrFrMrNr7rur�� startswith�endswithr�r�r�r�rOrPrwrxr�)rGr�r��conversation_text�msg�senderrV� timestamprIrQrNrur�r�rerRrws r$�'analyze_conversation_for_context_updatez4GeminiClient.analyze_conversation_for_context_updates�����d � "� �,��&)�g�g�i�&8��k���'�'�)�R�0���G�G�L�"�5� �!�s�9�+�R��x�r�'��%K�K�!� -��$��)A�B�C���.� 4�F�l%�.�.�� � �+�+����H� �=�=�&�&�(�D� � ����y�)��A�B�x�����u�%��A�B�x���}�}�U�#��C�R�y���:�:�<�D����>�4�8�J�����J�$4�$4�Q�$7�8��� ��W�X� X�3��6� � �M�e�W�U� V� � � � � !�!&�.�5�c�%�j�\�B�C� "� � �� �sH�F�B E �E�B-E �<F�= E � F�5F�F� F�F�Fr)NNN)�__name__� __module__� __qualname__�__doc__rHr�rSr�floatrirrrzrr�r�r�r�rr?r$rArAes���7�@��#��#��(=�S�=�T�%�[�=�~I��c�3�h��I��I� � I�^26� =#��c�3�h��=#��D��c��N�+�=#��t�C��H�~�.� =#� �c�3�h�� =#�D26�-1�.2� K#��K#��t�C��H�~�.�K#��4��S��>�*� K#� �D��c��N�+� K#� � K#�ZF��c�3�h��F�D��c��N�F�Ps��s� $�D��c��N�3�s� �c�3�h�� sr?rA)r�rK�typingrrrr�google.generativeai� generativeairCr�GEMINI_API_KEY� configurer�r�r�r>rA� gemini_clientrr?r$�<module>r�s�����,�,�#�� ����E�O�O�F�1�1�2� �:� ;�;�!� �F0��0��S�#�X��0�dk�k�^�� r?

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JpAboytes/estudIA-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server