???????????????????????????????????????????????????????????????????
? USER CODE ?
? ?????????????????? ?????????????????? ?????????????????? ?
? ? WeatherTools ? ? MathTools ? ? DatabaseTools ? ?
? ? ? ? ? ? ? ?
? ? [Tool] ? ? [Tool] ? ? [Tool] ? ?
? ? GetWeather() ? ? Add() ? ? ExecuteQuery()? ?
? ? [ToolParam] ? ? [ToolParam] ? ? [ToolParam] ? ?
? ?????????????????? ?????????????????? ?????????????????? ?
???????????????????????????????????????????????????????????????????
?
?
???????????????????????????????????????????????????????????????????
? FRAMEWORK CORE ?
? ???????????????????????????????????????????????????????? ?
? ? ToolRegistry ? ?
? ? • AddToolsFrom<T>() ? ?
? ? • GetAllTools() ? ?
? ? • InvokeTool() ? ?
? ? • GenerateToolSchemas() ? ?
? ???????????????????????????????????????????????????????? ?
? ? ? ?
? ? ? ?
? ??????????????????????? ??????????????????????? ?
? ? Reflection Engine ? ? JsonSchemaGenerator ? ?
? ? • Discovery ? ? • Type Mapping ? ?
? ? • Parameter Read ? ? • Property Scan ? ?
? ? • Delegate Create ? ? • Schema Build ? ?
? ??????????????????????? ??????????????????????? ?
???????????????????????????????????????????????????????????????????
?
?
???????????????????????????????????????????????????????????????????
? DATA STRUCTURES ?
? ?????????????????? ???????????????? ???????????????????? ?
? ? ToolDefinition ? ?ToolParameter ? ?JsonSchemaDefinition? ?
? ? • Name ? ? • Name ? ? • Properties ? ?
? ? • Description ? ? • Type ? ? • Required ? ?
? ? • Parameters ? ? • Required ? ? • Description ? ?
? ? • Handler ? ? • Desc. ? ???????????????????? ?
? ?????????????????? ???????????????? ?
???????????????????????????????????????????????????????????????????
User Code ToolRegistry Reflection
? ? ?
???AddToolsFrom<T>()???????? ?
? ? ?
? ???Scan Methods??????????
? ? ?
? ?????Tool Methods????????
? ? ?
? ???Read Attributes???????
? ? ?
? ?????Metadata????????????
? ? ?
? ???Create Delegate???????
? ? ?
? ?????Handler?????????????
? ? ?
????Registration OK????????? ?
User Code ToolRegistry Handler Tool Method
? ? ? ?
??InvokeTool(...)?????? ? ?
? ? ? ?
? ??Lookup Tool??????? ?
? ? ? ?
? ??Validate Args????? ?
? ? ? ?
? ??DynamicInvoke????? ?
? ? ? ?
? ? ??Execute???????????
? ? ? ?
? ? ????Result??????????
? ? ? ?
? ???Result??????????? ?
? ? ? ?
??????Result??????????? ? ?
User Code ToolRegistry JsonSchemaGenerator Reflection
? ? ? ?
??GenerateSchemas()?? ? ?
? ? ? ?
? ???For each tool??????? ?
? ? ? ?
? ? ??Get Return Type???
? ? ? ?
? ? ???Type Info????????
? ? ? ?
? ? ??Scan Properties???
? ? ? ?
? ? ???Property Info????
? ? ? ?
? ? ??Read Attributes???
? ? ? ?
? ? ???Metadata?????????
? ? ? ?
? ????JsonSchema????????? ?
? ? ? ?
????Schemas?????????? ? ?
Por qué: Permite descubrimiento automático de métodos y metadata sin generación de código.
Trade-offs:
- ? Flexibilidad y facilidad de uso
- ? No requiere source generators
- ?? Overhead de performance mínimo en registro
- ?? Validación en runtime en lugar de compile-time
Decisión: Usar atributos en lugar de interfaces.
Razones:
- ? Metadata declarativa clara
- ? No contamina la jerarquía de tipos
- ? Permite múltiples decoradores
- ? Más natural para definir schemas JSON
Decisión: Crear delegates en lugar de usar MethodInfo.Invoke().
Razones:
- ? Mejor performance
- ? Type-safety donde es posible
- ? Más cercano a llamadas directas
- ?? Requiere reflexión para crear el delegate
Decisión: Implementar mapeo básico en lugar de usar JSON Schema completo.
Razones:
- ? Suficiente para demostración
- ? Código más legible
- ? Fácil de extender
- ?? No es spec-compliant
- Custom Attributes: Agregar nuevos atributos para metadata adicional
- Type Mappings: Extender mapeo CLR ? JSON Schema
- Validators: Implementar validaciones personalizadas
- Serializers: Agregar diferentes formatos de exportación
- Middleware: Interceptar invocaciones de tools
// Nuevo atributo para rate limiting
[AttributeUsage(AttributeTargets.Method)]
public class RateLimitAttribute : Attribute
{
public int MaxCallsPerMinute { get; set; }
}
// Extender ToolRegistry
public class RateLimitedToolRegistry : ToolRegistry
{
// Implementar rate limiting en InvokeTool
}ToolRegistry actúa como registro central de tools.
Uso extensivo de atributos para metadata declarativa.
Uso de delegates para invocación dinámica eficiente.
JsonSchemaGenerator construye schemas paso a paso.
ToolRegistry.AddToolsFrom() sigue pasos consistentes.
- Tiempo: O(n) donde n = número de métodos
- Memoria: O(m) donde m = número de tools
- Una vez: Solo ocurre en startup
- Tiempo: O(1) lookup + delegate call (casi nativa)
- Memoria: Mínima (solo parámetros)
- Frecuente: Optimizado para llamadas repetidas
- Tiempo: O(p) donde p = número de propiedades
- Memoria: O(s) donde s = tamaño del schema
- Ocasional: Típicamente una vez o bajo demanda
- Async Support: Soportar métodos async
- Dependency Injection: Integrar con DI container
- Caching: Cache de schemas y metadata
- Validation: Validación de argumentos en runtime
- Error Handling: Manejo robusto de errores
- Logging: Integrar ILogger
- Metrics: Telemetría y métricas
- Security: Validación de permisos
- Tool Chaining: Composición de tools
- Streaming: Soporte para respuestas streaming
- Versioning: Versionado de tools
- OpenAPI Export: Exportar a OpenAPI spec
- GraphQL: Generar schema GraphQL
- gRPC: Generar servicios gRPC