


Añade proveedores de IA y almacenes vectoriales a un framework modular de IA en Rust
Úsalo al ampliar un framework de Rust que funciona con muchos proveedores de IA. La IA sigue los traits y builders existentes, mantiene el soporte de WebAssembly, hace que los hooks actúen igual con y sin streaming y comprueba que los cassettes no tengan claves de API.
Para usar estas reglas de IA
## Cambia solo lo pedido y no hagas commit salvo que te lo pidan
- Lee la implementación, los manifiestos, las pruebas y la documentación pública existentes antes de cambiar el código.
- Mantén cada cambio dentro del alcance solicitado por el usuario.
- Prefiere los traits, builders, módulos y tipos de error existentes frente a abstracciones paralelas.
- No añadas TODO, stubs, comportamientos provisionales ni API públicas especulativas.
- No hagas commits, prepares cambios, hagas push, crees ramas ni abras pull requests salvo que el usuario lo solicite explícitamente.
- Conserva los cambios no relacionados del usuario y trabaja con seguridad alrededor de un árbol de trabajo sucio.
- Evita refactorizaciones no relacionadas aunque un diseño cercano pueda mejorarse.
- Distingue la política para colaboradores de las reglas de ingeniería propias del repositorio y cumple ambas.
- Detente cuando falte la intención de producto necesaria o una autorización externa.
## Mantén coherentes los crates y los feature flags en todo el workspace
- Mantén el crate de fachada pública, el crate central, las integraciones complementarias, las macros derive, los ejemplos y las pruebas en sus funciones establecidas.
- Haz que la fachada reexporte las API centrales y exponga crates complementarios opcionales mediante feature flags.
- Revisa el manifiesto del workspace y las exportaciones de la fachada antes de cambiar features públicas, integraciones o rutas de módulos.
- Coloca las integraciones de proveedores y almacenes vectoriales en crates complementarios salvo que una razón arquitectónica sólida exija incluirlas en el núcleo.
- Mantén separados los ejemplos del workspace, los ejemplos de cada crate y las pruebas de integración.
- Al añadir un crate complementario, actualiza según corresponda la dependencia raíz, la feature, la reexportación de la fachada, los ejemplos, el README y la documentación del crate.
- Asegúrate de que las combinaciones de features compilen sin exponer módulos no disponibles.
- Mantén sincronizada la documentación pública entre la fachada y los crates complementarios afectados.
- No describas una ruta de módulo ni una feature hasta que el código y los manifiestos la confirmen.
## Construye sobre los traits comunes en lugar de versiones por proveedor
- Construye las integraciones sobre los traits centrales del framework para completado, embeddings, índices vectoriales y herramientas invocables.
- No crees alternativas específicas de un proveedor para un trait existente que abarca varios proveedores.
- Sigue el patrón de builder establecido para los tipos públicos configurables.
- Mantén la construcción fluida y tipada, y complétala solo tras un paso de build explícito.
- Usa una arquitectura de cliente genérica que separe las extensiones del proveedor del transporte HTTP subyacente.
- Declara explícitamente las capacidades del proveedor para que los comportamientos no compatibles fallen durante la compilación.
- Representa las capacidades ausentes mediante un tipo marcador deliberado, no mediante conjeturas en tiempo de ejecución.
- Conserva las relaciones de tipos de API key entre los builders del proveedor y los aliases de cliente públicos.
- Mantén los tipos de request y response propios del proveedor detrás de límites de conversión.
## Mantén el código asíncrono compartido funcionando en WebAssembly
- Conserva la compatibilidad con WebAssembly en los traits, futures, errores e integraciones compartidos.
- Usa las abstracciones de compatibilidad del framework en lugar de límites `Send` y `Sync` sin procesar cuando los targets difieran.
- Usa el tipo boxed-future portable designado para los futures devueltos dinámicamente.
- Aplica límites nativos de seguridad entre hilos solo en los targets que los admitan.
- Mantén los errores boxed de WebAssembly libres de límites exclusivos de plataformas nativas que no sean compatibles.
- Prueba las firmas de tipos nativas y las orientadas a WebAssembly después de cambiar traits compartidos.
- Evita añadir una dependencia o API que excluya silenciosamente un target compatible.
- Mantén la compilación condicional en un ámbito reducido y explica la diferencia entre targets.
- Asegúrate de que las API de proveedores, almacenes vectoriales y hooks utilicen el mismo contrato de portabilidad.
## Usa tipos de error explícitos y documenta cada API pública nueva
- No uses `String` como tipo de error para una nueva API falible.
- Define enums de error explícitos y conserva los detalles útiles de las respuestas del proveedor mediante los helpers de error del framework.
- Prefiere `?` y conversiones significativas frente a perder manualmente el contexto del error.
- Usa `unwrap()` o `expect()` solo cuando la imposibilidad resulte evidente por la invariante circundante.
- Añade documentación de elemento a cada nuevo tipo, función, trait y método públicos.
- Añade documentación de módulo a cada nuevo módulo público.
- Mantén los ejemplos alineados con las API reales, las constantes de modelos, las rutas de módulos y las feature flags.
- Marca los ejemplos como no ejecutables cuando requieran credenciales o servicios externos.
- Actualiza los archivos README y la documentación de nivel de crate siempre que cambie el comportamiento público.
## Añade un nuevo proveedor de IA siguiendo el más parecido que ya existe
- Estudia el proveedor existente más parecido antes de implementar o modificar otro.
- Añade los tipos de extensión y builder del proveedor, la implementación del proveedor y una declaración explícita de capacidades.
- Admite la construcción desde valores del entorno y valores directos cuando el framework exponga ambas rutas.
- Mantén los aliases públicos de cliente y builder coherentes con el tipo de API key del builder del proveedor.
- Usa tipos explícitos de marcador de credencial o autenticación y oculta en debug los valores que contengan credenciales.
- Convierte los requests del framework al formato real del proveedor y las responses de vuelta a los tipos del framework.
- Añade streaming solo cuando el proveedor lo admita realmente y conserva los errores del proveedor mediante los helpers estándar.
- Sigue las convenciones de telemetría y los traits de extensión establecidos.
- No inventes campos de request o response que no existan en la API real del proveedor.
- Añade pruebas o ejemplos enfocados que demuestren el comportamiento compatible.
## Integra un almacén vectorial con filtros reales y resultados de búsqueda claros
- Coloca una integración de almacén vectorial en un crate complementario salvo que se justifique su pertenencia al núcleo.
- Implementa tanto la búsqueda que devuelve resultados como la búsqueda que devuelve solo identificadores.
- Usa un tipo de filtro que refleje las capacidades reales de filtrado del backend.
- Devuelve las variantes de error del almacén vectorial del framework en lugar de errores de texto improvisados.
- Aplica los mismos límites asíncronos portables que utiliza el framework central.
- Mantén explícitas las conversiones de puntuación, documento, identificador y metadatos.
- Define el orden, el límite, el resultado vacío y el comportamiento ante errores del backend.
- Prueba los filtros, el orden de clasificación, los límites de resultados, los registros ausentes y los fallos de conversión.
- Documenta las features, credenciales, índices y configuración externa necesarios sin incrustar secretos.
## Define las acciones permitidas para cada evento de hook
- Modela los hooks como observadores y orientadores del ciclo de vida con alcance por ejecución.
- Pasa un contexto de ejecución a cada evento, incluida la identidad de ejecución, el turno, el modo streaming, la identidad del agente y el estado temporal compartido.
- Proporciona a cada evento su propio tipo de acción para que las combinaciones no compatibles fallen durante la compilación.
- Permite que los hooks de llamada de completado modifiquen un request o detengan el procesamiento.
- Permite que los hooks de llamada y resultado de herramientas reescriban valores para hooks posteriores, con skip o stop como acciones terminales donde se definan.
- Representa la gestión de llamadas de herramienta no válidas mediante opciones explícitas de fail, retry, repair, skip y stop.
- Limita los eventos de solo observación a continue o stop.
- Registra los hooks de observación antes que los de orientación cuando las acciones stop cortocircuiten la pila.
- Documenta qué acciones transforman datos, cuáles los acumulan y cuáles terminan el procesamiento.
## Combina los hooks apilados igual con y sin streaming
- Conserva la semántica de composición específica de cada evento cuando los hooks estén anidados o apilados.
- Fusiona las modificaciones de requests de completado en orden de registro.
- Anexa contexto adicional, fusiona superficialmente los parámetros adicionales e interseca los conjuntos de herramientas activas.
- Aplica el criterio de último escritor solo a los campos escalares e históricos documentados y avisa cuando una sobrescritura sea relevante.
- Limita cada modificación de request a un turno; nunca permitas que persista por accidente.
- Encadena las reescrituras de llamadas y resultados de herramientas en todos los hooks posteriores.
- Deja de evaluar la pila inmediatamente cuando lo exija una acción terminal.
- Haz que las superficies con streaming y sin streaming compartan el mismo controlador de ciclo de vida.
- Prueba un comportamiento idéntico de los hooks mediante los puntos de entrada con streaming y sin streaming.
- Añade pruebas de composición para pilas anidadas, conflictos de fusión, cadenas de reescritura, skip y stop.
## Elige la prueba de regresión más pequeña y usa cassettes grabados para las llamadas al proveedor
- Añade cobertura de regresión en el ámbito fiable más pequeño.
- Prefiere una prueba unitaria junto a la implementación para defectos aislados de conversión o lógica.
- Usa pruebas de proveedor respaldadas por cassettes cuando el comportamiento dependa del tráfico de requests y responses del proveedor.
- Usa pruebas live ignoradas solo cuando una reproducción determinista mediante cassette no pueda representar el comportamiento.
- Lee la guía de pruebas del repositorio antes de añadir, actualizar, grabar o reproducir pruebas de proveedores.
- Reproduce cassettes de forma predeterminada para que las pruebas normales no necesiten credenciales del proveedor.
- Limita la ejecución de pruebas al proveedor y al comportamiento que se estén modificando.
- Cubre el comportamiento con streaming y sin streaming cuando existan ambas superficies.
- Conserva el modo de fallo original en la aserción de regresión.
## Graba cassettes solo para la prueba objetivo y revisa que no contengan secretos
- Trata el modo de grabación como una operación externa, con credenciales y que sobrescribe archivos.
- Exige la credencial correspondiente del proveedor antes de grabar y nunca la expongas en la salida.
- Graba solo la prueba del proveedor objetivo para minimizar cambios no relacionados en los fixtures.
- Inspecciona manualmente cada diff de cassette antes de presentarlo o hacer commit.
- Rechaza fixtures que contengan API keys, credenciales bearer, cookies, identificadores de cuenta u otros valores sensibles.
- Elimina los cambios no relacionados de requests y responses en lugar de aceptar un fixture ruidoso.
- Mantén activadas las comprobaciones automáticas de limpieza y seguridad, pero no las trates como sustituto de la inspección.
- Conserva datos de reproducción deterministas mientras ocultas secretos y metadatos inestables.
- Nunca sobrescribas fixtures solo para hacer pasar una prueba fallida sin explicar el cambio de comportamiento.
## Ejecuta comprobaciones de menor a mayor alcance e informa lo que no se pudo verificar
- Ejecuta primero las comprobaciones útiles más pequeñas y amplía después según el alcance y el riesgo afectados.
- Formatea el workspace y ejecuta los lints en todos los targets y features afectados.
- Ejecuta pruebas enfocadas antes que pruebas amplias del workspace.
- Genera la documentación sin dependencias cuando cambien las API públicas o los documentos.
- Verifica la compatibilidad nativa y con WebAssembly cuando cambien límites o futures compartidos.
- Confirma que los campos del protocolo del proveedor coincidan con la API real y que los diffs de cassette no contengan secretos.
- Confirma que la semántica de los hooks coincida en las superficies con streaming y sin streaming.
- No declares la finalización mientras falle una comprobación obligatoria.
- Si un comando no puede ejecutarse, explica por qué e indica exactamente qué queda sin verificar.
- Informa de las superficies modificadas, las comprobaciones ejecutadas, los resultados observados, los riesgos residuales y el alcance excluido deliberadamente.
