Skip to content

Commit 73eac4d

Browse files
authored
Merge pull request #1557 from x0x0b/feat-model-earlyaccess
feat: add Early Access update badge
2 parents 387c7b9 + 14693ef commit 73eac4d

File tree

12 files changed

+430
-51
lines changed

12 files changed

+430
-51
lines changed

StabilityMatrix.Avalonia/Languages/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@
231231
<data name="Label_UpdateAvailable" xml:space="preserve">
232232
<value>更新あり</value>
233233
</data>
234+
<data name="Label_EarlyAccessUpdateAvailable" xml:space="preserve">
235+
<value>Early Accessの更新あり</value>
236+
</data>
234237
<data name="Label_BecomeAPatron" xml:space="preserve">
235238
<value>Patreonになる</value>
236239
</data>
@@ -1432,4 +1435,4 @@ Sparkは兆レベルのパラメータを持つ基盤モデルで、膨大なパ
14321435
### 🔒 プライバシーファースト
14331436
私たちはプライバシーを最優先に考えています。([生成AI利用規約](https://lykos.ai/gen-ai-terms)) **あなたのプロンプトや出力内容は、Lykos AIや必要なクラウドインフラパートナーによるAI学習には一切使用されません。** 処理はお客様の質問に対する返答を生成するためだけに安全を重視して使われ、**その後はプロンプト内容そのものではなく、メタデータ(タイムスタンプやトークン数など)のみを保存します。** あなたのデータが販売や共有されることは決してありません。</value>
14341437
</data>
1435-
</root>
1438+
</root>

StabilityMatrix.Avalonia/Languages/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@
231231
<data name="Label_UpdateAvailable" xml:space="preserve">
232232
<value>Update Available</value>
233233
</data>
234+
<data name="Label_EarlyAccessUpdateAvailable" xml:space="preserve">
235+
<value>Early Access Update Available</value>
236+
</data>
234237
<data name="Label_BecomeAPatron" xml:space="preserve">
235238
<value>Become a Patron</value>
236239
</data>

StabilityMatrix.Avalonia/Styles/Card.axaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@
9494
</Style>
9595
</Style>
9696

97+
<!-- Early Access -->
98+
<Style Selector="controls|Card.early-access">
99+
<Setter Property="Background" Value="{DynamicResource ThemeDeepOrangeColorTransparent}" />
100+
<Setter Property="BorderBrush" Value="{DynamicResource ThemeDeepOrangeColorTransparent}" />
101+
<Style Selector="^ /template/ ContentPresenter#PART_ContentPresenter">
102+
<Setter Property="Foreground" Value="{DynamicResource ButtonForeground}" />
103+
</Style>
104+
</Style>
105+
97106
<!-- Info -->
98107
<Style Selector="controls|Card.info">
99108
<Setter Property="Background" Value="{DynamicResource ThemeDarkBlueColorTransparent}" />
Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
<ResourceDictionary xmlns="https://github.com/avaloniaui"
2-
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3-
xmlns:sty="clr-namespace:FluentAvalonia.Styling;assembly=FluentAvalonia">
4-
<!-- Static colors -->
1+
<ResourceDictionary
2+
xmlns="https://github.com/avaloniaui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:sty="clr-namespace:FluentAvalonia.Styling;assembly=FluentAvalonia">
5+
<!-- Static colors -->
56
<Color x:Key="ThemePrimaryColor">#333333</Color>
67
<Color x:Key="ThemeDarkDarkRedColor">#952923</Color>
78
<Color x:Key="ThemeDarkRedColor">#C2362E</Color>
@@ -32,58 +33,59 @@
3233
<Color x:Key="ThemeAmberColor">#FFC107</Color>
3334
<Color x:Key="ThemeOrangeColor">#FF9800</Color>
3435
<Color x:Key="ThemeDeepOrangeColor">#FF5722</Color>
36+
<Color x:Key="ThemeDeepOrangeColorTransparent">#AAFF5722</Color>
3537
<Color x:Key="ThemeEldenRingOrangeColor">#FF4F00</Color>
3638
<Color x:Key="ThemeBrownColor">#795548</Color>
3739
<Color x:Key="ThemeGreyColor">#9E9E9E</Color>
3840
<Color x:Key="ThemeLightGreyColor">#C0C0C0</Color>
3941
<Color x:Key="ThemeBlueGreyColor">#607D8B</Color>
40-
41-
<!-- Dark / light dynamic colors -->
42+
43+
<!-- Dark / light dynamic colors -->
4244
<ResourceDictionary.ThemeDictionaries>
4345
<ResourceDictionary x:Key="Default">
44-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA"/>
45-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
46-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868"/>
47-
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA"/>
48-
49-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
50-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
51-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
52-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
53-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
54-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
55-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
46+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA" />
47+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
48+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868" />
49+
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA" />
50+
51+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
52+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
53+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
54+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
55+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
56+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
57+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
5658
</ResourceDictionary>
57-
59+
5860
<ResourceDictionary x:Key="Dark">
59-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#282828"/>
60-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
61-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#252525"/>
62-
<SolidColorBrush x:Key="RegionColor" Color="#282828"/>
63-
64-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
65-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
66-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
67-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
68-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
69-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
70-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
61+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#282828" />
62+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
63+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#252525" />
64+
<SolidColorBrush x:Key="RegionColor" Color="#282828" />
65+
66+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
67+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
68+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
69+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
70+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
71+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
72+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
7173
</ResourceDictionary>
72-
74+
7375
<ResourceDictionary x:Key="{x:Static sty:FluentAvaloniaTheme.HighContrastTheme}">
74-
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA"/>
75-
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA"/>
76-
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868"/>
77-
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA"/>
78-
79-
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A"/>
80-
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30"/>
81-
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40"/>
82-
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF"/>
83-
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D"/>
84-
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E"/>
85-
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4"/>
76+
<SolidColorBrush x:Key="ThemeBackgroundBrush" Color="#AAAAAA" />
77+
<SolidColorBrush x:Key="ThemeDarkAccentForegroundBrush" Color="#AAAAAA" />
78+
<SolidColorBrush x:Key="ThemeDarkAccentBackgroundBrush" Color="#686868" />
79+
<SolidColorBrush x:Key="RegionColor" Color="#AAAAAA" />
80+
81+
<SolidColorBrush x:Key="CompletionBorderBrush" Color="#43454A" />
82+
<SolidColorBrush x:Key="CompletionBackgroundBrush" Color="#2B2D30" />
83+
<SolidColorBrush x:Key="CompletionSecondaryBackgroundBrush" Color="#393B40" />
84+
<SolidColorBrush x:Key="CompletionForegroundBrush" Color="#B4B8BF" />
85+
<SolidColorBrush x:Key="CompletionSecondaryForegroundBrush" Color="#878B8D" />
86+
<SolidColorBrush x:Key="CompletionSelectionBackgroundBrush" Color="#2E436E" />
87+
<SolidColorBrush x:Key="CompletionSelectionForegroundBrush" Color="#5389F4" />
8688
</ResourceDictionary>
8789
</ResourceDictionary.ThemeDictionaries>
88-
90+
8991
</ResourceDictionary>

StabilityMatrix.Avalonia/ViewModels/CheckpointManager/CheckpointFileViewModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ namespace StabilityMatrix.Avalonia.ViewModels.CheckpointManager;
2525
public partial class CheckpointFileViewModel : SelectableViewModelBase
2626
{
2727
[ObservableProperty]
28+
[NotifyPropertyChangedFor(nameof(HasEarlyAccessUpdateOnly))]
29+
[NotifyPropertyChangedFor(nameof(HasStandardUpdate))]
2830
private LocalModelFile checkpointFile;
2931

3032
[ObservableProperty]
@@ -64,6 +66,8 @@ public partial class CheckpointFileViewModel : SelectableViewModelBase
6466
public bool CanShowTriggerWords => CheckpointFile.ConnectedModelInfo?.TrainedWords?.Length > 0;
6567
public string BaseModelName => CheckpointFile.ConnectedModelInfo?.BaseModel ?? string.Empty;
6668
public CivitModelType ModelType => CheckpointFile.ConnectedModelInfo?.ModelType ?? CivitModelType.Unknown;
69+
public bool HasEarlyAccessUpdateOnly => CheckpointFile.HasEarlyAccessUpdateOnly;
70+
public bool HasStandardUpdate => CheckpointFile.HasUpdate && !CheckpointFile.HasEarlyAccessUpdateOnly;
6771

6872
/// <inheritdoc/>
6973
public CheckpointFileViewModel(

StabilityMatrix.Avalonia/Views/CheckpointsPage.axaml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@
629629
HorizontalAlignment="Left"
630630
VerticalAlignment="Top"
631631
Classes="success"
632-
IsVisible="{Binding CheckpointFile.HasUpdate}">
632+
IsVisible="{Binding HasStandardUpdate}">
633633

634634
<TextBlock
635635
HorizontalAlignment="Center"
@@ -640,6 +640,24 @@
640640
<Run Text="{Binding CheckpointFile.LatestModelInfo.LatestVersionCreatedAt}" />
641641
</TextBlock>
642642
</controls:Card>
643+
<controls:Card
644+
Height="24"
645+
Margin="4,8,0,0"
646+
Padding="4"
647+
HorizontalAlignment="Left"
648+
VerticalAlignment="Top"
649+
Classes="early-access"
650+
IsVisible="{Binding HasEarlyAccessUpdateOnly}">
651+
652+
<TextBlock
653+
HorizontalAlignment="Center"
654+
VerticalAlignment="Center"
655+
FontSize="11"
656+
FontWeight="Medium">
657+
<Run Text="{x:Static lang:Resources.Label_EarlyAccessUpdateAvailable}" />
658+
<Run Text="{Binding CheckpointFile.LatestModelInfo.LatestVersionCreatedAt}" />
659+
</TextBlock>
660+
</controls:Card>
643661
</WrapPanel>
644662
</LayoutTransformControl>
645663

StabilityMatrix.Core/Models/Database/LocalModelFile.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ public bool Equals(LocalModelFile? x, LocalModelFile? y)
2424
return false;
2525
return x.RelativePath == y.RelativePath
2626
&& Equals(x.ConnectedModelInfo, y.ConnectedModelInfo)
27-
&& x.HasUpdate == y.HasUpdate;
27+
&& x.HasUpdate == y.HasUpdate
28+
&& x.HasEarlyAccessUpdateOnly == y.HasEarlyAccessUpdateOnly;
2829
}
2930

3031
public int GetHashCode(LocalModelFile obj)
3132
{
32-
return HashCode.Combine(obj.RelativePath, obj.ConnectedModelInfo, obj.HasUpdate);
33+
return HashCode.Combine(
34+
obj.RelativePath,
35+
obj.ConnectedModelInfo,
36+
obj.HasUpdate,
37+
obj.HasEarlyAccessUpdateOnly
38+
);
3339
}
3440
}
3541

@@ -44,12 +50,13 @@ public virtual bool Equals(LocalModelFile? other)
4450
return true;
4551
return RelativePath == other.RelativePath
4652
&& ConnectedModelInfo == other.ConnectedModelInfo
47-
&& HasUpdate == other.HasUpdate;
53+
&& HasUpdate == other.HasUpdate
54+
&& HasEarlyAccessUpdateOnly == other.HasEarlyAccessUpdateOnly;
4855
}
4956

5057
public override int GetHashCode()
5158
{
52-
return HashCode.Combine(RelativePath, ConnectedModelInfo, HasUpdate);
59+
return HashCode.Combine(RelativePath, ConnectedModelInfo, HasUpdate, HasEarlyAccessUpdateOnly);
5360
}
5461

5562
/// <summary>
@@ -88,6 +95,11 @@ public override int GetHashCode()
8895
/// </summary>
8996
public bool HasUpdate { get; set; }
9097

98+
/// <summary>
99+
/// Whether updates are limited to Early Access versions only.
100+
/// </summary>
101+
public bool HasEarlyAccessUpdateOnly { get; set; }
102+
91103
/// <summary>
92104
/// Last time this model was checked for an update
93105
/// </summary>

StabilityMatrix.Core/Services/ModelIndexService.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ private async Task RefreshIndexParallelCore()
511511
if (modelsDict.TryGetValue(model.RelativePath, out var dbModel))
512512
{
513513
model.HasUpdate = dbModel.HasUpdate;
514+
model.HasEarlyAccessUpdateOnly = dbModel.HasEarlyAccessUpdateOnly;
514515
model.LastUpdateCheck = dbModel.LastUpdateCheck;
515516
model.LatestModelInfo = dbModel.LatestModelInfo;
516517
}
@@ -668,6 +669,7 @@ await liteDbContext.LocalModelFiles.FindAllAsync().ConfigureAwait(false) ?? []
668669
.ToList();
669670

670671
dbModel.HasUpdate = !latestHashes.Any(hash => installedHashes.Contains(hash!));
672+
dbModel.HasEarlyAccessUpdateOnly = GetHasEarlyAccessUpdateOnly(dbModel, remoteModel);
671673
dbModel.LastUpdateCheck = DateTimeOffset.UtcNow;
672674
dbModel.LatestModelInfo = remoteModel;
673675

@@ -700,4 +702,24 @@ private static HashSet<string> CollectModelHashes(IEnumerable<LocalModelFile> mo
700702
}
701703
return hashes;
702704
}
705+
706+
private static bool GetHasEarlyAccessUpdateOnly(LocalModelFile model, CivitModel? remoteModel)
707+
{
708+
if (!model.HasUpdate || !model.HasCivitMetadata)
709+
return false;
710+
711+
var versions = remoteModel?.ModelVersions;
712+
if (versions == null || versions.Count == 0)
713+
return false;
714+
715+
var installedVersionId = model.ConnectedModelInfo?.VersionId;
716+
if (installedVersionId == null)
717+
return false;
718+
719+
var installedIndex = versions.FindIndex(version => version.Id == installedVersionId.Value);
720+
if (installedIndex <= 0)
721+
return false;
722+
723+
return versions.Take(installedIndex).All(version => version.IsEarlyAccess);
724+
}
703725
}

0 commit comments

Comments
 (0)