@@ -229,30 +229,12 @@ func (s *AIPluginService) defaultDatabaseType() string {
229229 return "mysql"
230230}
231231
232- func extractDatabaseTypeFromMap (values map [string ]any ) string {
233- if values == nil {
234- return ""
235- }
236-
237- keys := []string {"database_type" , "databaseDialect" , "database_dialect" , "dialect" }
238- for _ , key := range keys {
239- if raw , ok := values [key ]; ok {
240- if str , ok := raw .(string ); ok {
241- if normalized := normalizeDatabaseType (str ); normalized != "" {
242- return normalized
243- }
244- }
245- }
246- }
247- return ""
248- }
249-
250- func (s * AIPluginService ) resolveDatabaseType (explicit string , configMap map [string ]any ) string {
232+ func (s * AIPluginService ) resolveDatabaseType (explicit string , overrides GenerationConfigOverrides ) string {
251233 if normalized := normalizeDatabaseType (explicit ); normalized != "" {
252234 return normalized
253235 }
254236
255- if fromConfig := extractDatabaseTypeFromMap ( configMap ); fromConfig != "" {
237+ if fromConfig := overrides . preferredDatabaseType ( ); fromConfig != "" {
256238 return fromConfig
257239 }
258240
@@ -703,6 +685,45 @@ var (
703685 MinCompatibleAPITestingVersion = GRPCInterfaceVersion
704686)
705687
688+ // GenerationMetadata describes metadata returned with AI generation responses.
689+ type GenerationMetadata struct {
690+ Confidence float32 `json:"confidence"`
691+ Model string `json:"model,omitempty"`
692+ Dialect string `json:"dialect"`
693+ }
694+
695+ // CapabilitySummary is returned when the capability detector is unavailable.
696+ type CapabilitySummary struct {
697+ PluginReady bool `json:"plugin_ready"`
698+ AIAvailable bool `json:"ai_available"`
699+ DegradedMode bool `json:"degraded_mode"`
700+ PluginVersion string `json:"plugin_version"`
701+ APIVersion string `json:"api_version"`
702+ }
703+
704+ // GenerationConfigOverrides captures optional generation configuration overrides.
705+ type GenerationConfigOverrides struct {
706+ DatabaseTypePrimary string `json:"database_type"`
707+ DatabaseDialect string `json:"databaseDialect"`
708+ DatabaseDialectAlt string `json:"database_dialect"`
709+ Dialect string `json:"dialect"`
710+ }
711+
712+ func (g GenerationConfigOverrides ) preferredDatabaseType () string {
713+ candidates := []string {
714+ g .DatabaseTypePrimary ,
715+ g .DatabaseDialect ,
716+ g .DatabaseDialectAlt ,
717+ g .Dialect ,
718+ }
719+ for _ , candidate := range candidates {
720+ if normalized := normalizeDatabaseType (candidate ); normalized != "" {
721+ return normalized
722+ }
723+ }
724+ return ""
725+ }
726+
706727// handleAIGenerate handles ai.generate calls
707728func (s * AIPluginService ) handleAIGenerate (ctx context.Context , req * server.DataQuery ) (* server.DataQueryResult , error ) {
708729 start := time .Now ()
@@ -732,9 +753,9 @@ func (s *AIPluginService) handleAIGenerate(ctx context.Context, req *server.Data
732753 }
733754
734755 // Parse optional config
735- var configMap map [ string ] interface {}
756+ var generationOverrides GenerationConfigOverrides
736757 if params .Config != "" {
737- if err := json .Unmarshal ([]byte (params .Config ), & configMap ); err != nil {
758+ if err := json .Unmarshal ([]byte (params .Config ), & generationOverrides ); err != nil {
738759 logging .Logger .Warn ("Failed to parse config JSON" , "error" , err )
739760 }
740761 }
@@ -757,7 +778,7 @@ func (s *AIPluginService) handleAIGenerate(ctx context.Context, req *server.Data
757778 }
758779
759780 // Get database type from configuration, fallback to mysql if not configured
760- databaseType := s .resolveDatabaseType (params .DatabaseType , configMap )
781+ databaseType := s .resolveDatabaseType (params .DatabaseType , generationOverrides )
761782 context ["database_type" ] = databaseType
762783
763784 sqlResult , err := s .aiEngine .GenerateSQL (ctx , & ai.GenerateSQLRequest {
@@ -790,12 +811,12 @@ func (s *AIPluginService) handleAIGenerate(ctx context.Context, req *server.Data
790811 simpleFormat := fmt .Sprintf ("sql:%s\n explanation:%s" , sqlResult .SQL , sqlResult .Explanation )
791812
792813 // Build minimal meta information for UI display
793- metaData := map [ string ] interface {} {
794- "confidence" : sqlResult .ConfidenceScore ,
795- "model" : sqlResult .ModelUsed ,
796- "dialect" : databaseType ,
814+ meta := GenerationMetadata {
815+ Confidence : sqlResult .ConfidenceScore ,
816+ Model : sqlResult .ModelUsed ,
817+ Dialect : databaseType ,
797818 }
798- metaJSON , err := json .Marshal (metaData )
819+ metaJSON , err := json .Marshal (meta )
799820 if err != nil {
800821 metaJSON = []byte (fmt .Sprintf (`{"confidence": %f, "model": "%s"}` ,
801822 sqlResult .ConfidenceScore , sqlResult .ModelUsed ))
@@ -851,14 +872,14 @@ func (s *AIPluginService) handleAICapabilities(ctx context.Context, req *server.
851872 if s .capabilityDetector == nil {
852873 logging .Logger .Warn ("Capability detector not available - returning minimal capabilities" )
853874 // Return minimal capabilities when detector is not available
854- minimalCaps := map [ string ] interface {} {
855- "plugin_ready" : true ,
856- "ai_available" : false ,
857- "degraded_mode" : true ,
858- "plugin_version" : PluginVersion ,
859- "api_version" : APIVersion ,
875+ fallback := CapabilitySummary {
876+ PluginReady : true ,
877+ AIAvailable : false ,
878+ DegradedMode : true ,
879+ PluginVersion : PluginVersion ,
880+ APIVersion : APIVersion ,
860881 }
861- capsJSON , _ := json .Marshal (minimalCaps )
882+ capsJSON , _ := json .Marshal (fallback )
862883 return & server.DataQueryResult {
863884 Data : []* server.Pair {
864885 {Key : "api_version" , Value : APIVersion },
@@ -1102,12 +1123,12 @@ func (s *AIPluginService) handleLegacyQuery(ctx context.Context, req *server.Dat
11021123 simpleFormat := fmt .Sprintf ("sql:%s\n explanation:%s" , sqlResult .SQL , sqlResult .Explanation )
11031124
11041125 // Build minimal meta information for UI display
1105- metaData := map [ string ] interface {} {
1106- "confidence" : sqlResult .ConfidenceScore ,
1107- "model" : sqlResult .ModelUsed ,
1108- "dialect" : databaseType ,
1126+ meta := GenerationMetadata {
1127+ Confidence : sqlResult .ConfidenceScore ,
1128+ Model : sqlResult .ModelUsed ,
1129+ Dialect : databaseType ,
11091130 }
1110- metaJSON , err := json .Marshal (metaData )
1131+ metaJSON , err := json .Marshal (meta )
11111132 if err != nil {
11121133 metaJSON = []byte (fmt .Sprintf (`{"confidence": %f, "model": "%s"}` ,
11131134 sqlResult .ConfidenceScore , sqlResult .ModelUsed ))
0 commit comments