Skip to content

Commit 0135815

Browse files
update code.
1 parent 8daa34d commit 0135815

File tree

8 files changed

+349
-131
lines changed

8 files changed

+349
-131
lines changed

ChartGeneratorAISample/ChartGenerator/AIService/ChartsAIService.cs

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Azure;
1+
using Azure;
22
using Azure.AI.OpenAI;
33
using ChartGenerator.AIService;
44
using Microsoft.Extensions.AI;
@@ -9,11 +9,6 @@ internal class ChartAIService : AICredentials
99
{
1010
#region Fields
1111

12-
/// <summary>
13-
/// The already credential validated field
14-
/// </summary>
15-
private static bool isAlreadyValidated;
16-
1712
/// <summary>
1813
/// The uri result field
1914
/// </summary>
@@ -45,19 +40,13 @@ private async void ValidateCredential()
4540
{
4641
this.GetAzureOpenAIKernal();
4742

48-
if (isAlreadyValidated)
49-
{
50-
return;
51-
}
52-
5343
try
5444
{
5545
if (Client != null)
5646
{
5747
await Client!.CompleteAsync("Hello, Test Check");
5848
ChatHistory = string.Empty;
5949
IsCredentialValid = true;
60-
isAlreadyValidated = true;
6150
}
6251
else
6352
{
@@ -91,16 +80,27 @@ private void GetAzureOpenAIKernal()
9180
/// Retrieves an answer from the deployment name model using the provided user prompt.
9281
/// </summary>
9382
/// <param name="userPrompt">The user prompt.</param>
83+
/// <param name="includeClassContext">Whether to include class structure context.</param>
9484
/// <returns>The AI response.</returns>
95-
internal async Task<string> GetAnswerFromGPT(string userPrompt)
85+
internal async Task<string> GetAnswerFromGPT(string userPrompt, bool includeClassContext = false)
9686
{
9787
try
9888
{
9989
if (IsCredentialValid && Client != null)
10090
{
10191
ChatHistory = string.Empty;
102-
// Add the system message and user message to the options
103-
ChatHistory = ChatHistory + userPrompt;
92+
93+
// Only include class context if specifically requested
94+
if (includeClassContext)
95+
{
96+
var classContext = GetChartClassStructureContext();
97+
ChatHistory = classContext + "\n\n" + userPrompt;
98+
}
99+
else
100+
{
101+
ChatHistory = userPrompt;
102+
}
103+
104104
var response = await Client.CompleteAsync(ChatHistory);
105105
return response.ToString();
106106
}
@@ -122,11 +122,38 @@ private async void ShowAlertAsync()
122122
var page = Application.Current?.Windows[0].Page;
123123
if (page != null && !IsCredentialValid)
124124
{
125-
isAlreadyValidated = true;
126125
await page.DisplayAlert("Alert", "The Azure API key or endpoint is missing or incorrect. Please verify your credentials. You can also continue with the offline data.", "OK");
127126
}
128127
}
129-
}
130128

129+
/// <summary>
130+
/// Creates a concise context string that explains the structure of chart-related classes
131+
/// </summary>
132+
/// <returns>A string containing class structure information</returns>
133+
private string GetChartClassStructureContext()
134+
{
135+
return @"
136+
Chart class model reference:
137+
ChartConfig{ChartType:enum, Title:string, Series:Collection<SeriesConfig>, XAxis/YAxis:Collection<AxisConfig>, ShowLegend:bool, SideBySidePlacement:bool}
138+
SeriesConfig{Type:enum, Name:string, DataSource:Collection<DataModel>, Tooltip:bool}
139+
AxisConfig{Title:string, Type:string('Numerical'|'DateTime'|'Category'|'Logarithmic'), Minimum/Maximum:double?}";
140+
}
141+
142+
/// <summary>
143+
/// Gets specific context about a particular chart class based on need
144+
/// </summary>
145+
/// <param name="classType">The class type to get context for ("ChartConfig", "SeriesConfig", or "AxisConfig")</param>
146+
/// <returns>Specific context about the requested class</returns>
147+
internal string GetSpecificClassContext(string classType)
148+
{
149+
return classType.ToLower() switch
150+
{
151+
"chartconfig" => "ChartConfig: Controls overall chart appearance with properties for chart type, title, axis collections, series data, and display options like legends.",
152+
"seriesconfig" => "SeriesConfig: Defines a data series with properties for series type, name, data source collection, and tooltip visibility.",
153+
"axisconfig" => "AxisConfig: Configures chart axes with title, axis type (Numerical, DateTime, Category, Logarithmic), and optional min/max range values.",
154+
_ => "Unknown class type. Available classes: ChartConfig, SeriesConfig, AxisConfig"
155+
};
156+
}
157+
}
131158
#endregion
132-
}
159+
}

ChartGeneratorAISample/ChartGenerator/Helper/JsonConverters.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,50 @@
88

99
namespace ChartGenerator
1010
{
11+
/// <summary>
12+
/// Converter for handling axis type values from string
13+
/// </summary>
14+
public class AxisTypeConverter : JsonConverter
15+
{
16+
public override bool CanConvert(Type objectType)
17+
{
18+
return objectType == typeof(string);
19+
}
20+
21+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
22+
{
23+
if (reader.TokenType == JsonToken.String)
24+
{
25+
string value = reader.Value.ToString().ToLower();
26+
27+
switch (value)
28+
{
29+
case "numerical":
30+
case "linear":
31+
return "Numerical";
32+
case "datetime":
33+
return "DateTime";
34+
case "category":
35+
return "Category";
36+
case "log":
37+
case "logarithmic":
38+
return "Logarithmic";
39+
default:
40+
return "Numerical"; // Default to numerical
41+
}
42+
}
43+
44+
// Default if not a string
45+
return "Numerical";
46+
}
47+
48+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
49+
{
50+
string axisType = (string)value;
51+
writer.WriteValue(axisType);
52+
}
53+
}
54+
1155
/// <summary>
1256
/// Converter for handling ChartTypeEnum values from string
1357
/// </summary>
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
33
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
44
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
55
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
7+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
68
</manifest>

ChartGeneratorAISample/ChartGenerator/View/ChartView.xaml

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838

3939
</ContentPage.Resources>
4040

41-
41+
4242
<ContentPage.Content>
43-
<Grid>
44-
<Grid
43+
<Grid>
44+
<Grid
4545
ColumnDefinitions="{OnPlatform WinUI='7*,3*', MacCatalyst='7*,3*'}"
4646
RowDefinitions="Auto,*">
4747

@@ -127,84 +127,84 @@
127127
RequestCommand="{Binding RequestCommand}"
128128
ShowHeader="{Binding ShowHeader}"
129129
AssistItems="{Binding Messages}">
130-
<aiassistview:SfAIAssistView.HeaderTemplate>
131-
<DataTemplate>
132-
<VerticalStackLayout
130+
<aiassistview:SfAIAssistView.HeaderTemplate>
131+
<DataTemplate>
132+
<VerticalStackLayout
133133
Spacing="12">
134-
<Label Text="How can I assist with generated chart?" Padding="0,20,0,0" LineBreakMode="WordWrap"
134+
<Label Text="How can I assist with generated chart?" Padding="0,20,0,0" LineBreakMode="WordWrap"
135135
FontSize="Subtitle"
136136
HorizontalOptions="Center" />
137-
<HorizontalStackLayout x:Name="listView"
137+
<HorizontalStackLayout x:Name="listView"
138138
HeightRequest="{OnPlatform WinUI=140, Android=160, MacCatalyst=180, iOS=150}"
139139
WidthRequest="{OnPlatform MacCatalyst= 430,Android=335, iOS=310}"
140140
HorizontalOptions="Center" Padding="{OnPlatform MacCatalyst=20}"
141141
BindableLayout.ItemsSource="{Binding Path=ModelPrompts}">
142-
<BindableLayout.ItemTemplate>
143-
<DataTemplate>
144-
<Grid Padding="4">
145-
<Border
142+
<BindableLayout.ItemTemplate>
143+
<DataTemplate>
144+
<Grid Padding="4">
145+
<Border
146146
WidthRequest="{OnPlatform WinUI=120,Android=150,MacCatalyst= 150 , iOS=140}"
147147
HeightRequest="{OnPlatform WinUI=120,Android=130, MacCatalyst= 100, iOS=120}"
148148
Stroke="Gray"
149149
Padding="4">
150-
<Border.GestureRecognizers>
151-
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
152-
</Border.GestureRecognizers>
153-
<VisualStateManager.VisualStateGroups>
154-
<VisualStateGroup x:Name="CommonStates">
155-
<VisualState x:Name="Normal">
156-
<VisualState.Setters>
157-
<Setter Property="Background" Value="Transparent" />
158-
</VisualState.Setters>
159-
</VisualState>
160-
<VisualState x:Name="PointerOver">
161-
<VisualState.Setters>
162-
<Setter Property="Background" Value="#14000000" />
163-
</VisualState.Setters>
164-
</VisualState>
165-
</VisualStateGroup>
166-
</VisualStateManager.VisualStateGroups>
167-
<Border.StrokeShape>
168-
<RoundRectangle CornerRadius="10" />
169-
</Border.StrokeShape>
170-
<Grid RowDefinitions="*">
171-
<Label Text="{Binding .}"
150+
<Border.GestureRecognizers>
151+
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
152+
</Border.GestureRecognizers>
153+
<VisualStateManager.VisualStateGroups>
154+
<VisualStateGroup x:Name="CommonStates">
155+
<VisualState x:Name="Normal">
156+
<VisualState.Setters>
157+
<Setter Property="Background" Value="Transparent" />
158+
</VisualState.Setters>
159+
</VisualState>
160+
<VisualState x:Name="PointerOver">
161+
<VisualState.Setters>
162+
<Setter Property="Background" Value="#14000000" />
163+
</VisualState.Setters>
164+
</VisualState>
165+
</VisualStateGroup>
166+
</VisualStateManager.VisualStateGroups>
167+
<Border.StrokeShape>
168+
<RoundRectangle CornerRadius="10" />
169+
</Border.StrokeShape>
170+
<Grid RowDefinitions="*">
171+
<Label Text="{Binding .}"
172172
LineBreakMode="WordWrap"
173173
VerticalTextAlignment="Center"
174174
HorizontalTextAlignment="Center" />
175-
</Grid>
176-
</Border>
177-
</Grid>
178-
</DataTemplate>
179-
</BindableLayout.ItemTemplate>
180-
</HorizontalStackLayout>
181-
</VerticalStackLayout>
182-
</DataTemplate>
183-
</aiassistview:SfAIAssistView.HeaderTemplate>
184-
<aiassistview:SfAIAssistView.Shadow>
185-
<Shadow Brush="Black" Offset="0,0" Radius="1" Opacity="0.5" />
186-
</aiassistview:SfAIAssistView.Shadow>
187-
</aiassistview:SfAIAssistView>
188-
189-
<ActivityIndicator IsRunning="{Binding ShowIndicator}"
175+
</Grid>
176+
</Border>
177+
</Grid>
178+
</DataTemplate>
179+
</BindableLayout.ItemTemplate>
180+
</HorizontalStackLayout>
181+
</VerticalStackLayout>
182+
</DataTemplate>
183+
</aiassistview:SfAIAssistView.HeaderTemplate>
184+
<aiassistview:SfAIAssistView.Shadow>
185+
<Shadow Brush="Black" Offset="0,0" Radius="1" Opacity="0.5" />
186+
</aiassistview:SfAIAssistView.Shadow>
187+
</aiassistview:SfAIAssistView>
188+
189+
<ActivityIndicator IsRunning="{Binding ShowIndicator}"
190190
x:Name="Indicator"
191191
Color="{AppThemeBinding Light=#1E201E, Dark=#FEFAF6}"
192192
Grid.Column="{OnPlatform Android='0',iOS='0', Default='1'}"
193193
VerticalOptions="Center"
194194
HorizontalOptions="Center"/>
195-
<buttons:SfButton Grid.Row="0"
196-
Margin="0,0,60,0"
197-
Grid.Column="{OnPlatform Android='0',iOS='0', Default='1'}"
198-
x:Name="exportchartbutton"
199-
Text="Export Chart"
195+
<buttons:SfButton Grid.Row="0" Margin="0,0,60,0"
196+
Grid.Column="{OnPlatform Android='0',iOS='0', Default='1'}"
197+
x:Name="exportchartbutton"
198+
Text="Export Chart"
200199
Clicked="Exportchartbutton_Clicked"
201200
FontFamily="MauiSampleFontIcon"
202201
CornerRadius="5"
203202
TextColor="White"
204203
BackgroundColor="#6750a4"
205204
FontSize="{OnPlatform WinUI=17, Android=15, MacCatalyst=17, iOS=17}" WidthRequest="120" HeightRequest="30"
206205
ToolTipProperties.Text="Click to Export the Chart"
207-
FontAttributes="Bold" VerticalOptions="Start"
206+
FontAttributes="Bold"
207+
VerticalOptions="Start"
208208
HorizontalOptions="End"/>
209209
<buttons:SfButton
210210
Grid.Row="0"
@@ -221,7 +221,7 @@
221221
VerticalOptions="Start"
222222
HorizontalOptions="End"/>
223223
</Grid>
224-
</Grid>
224+
</Grid>
225225
</ContentPage.Content>
226226

227227
<ContentPage.Behaviors>

0 commit comments

Comments
 (0)