Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Upgrade .NET8 to .NET10.
- Changed feature by issue.([Issue #62](https://github.com/overdrive1708/MagonoteToolkit/issues/62))
- Changed feature by issue.([Issue #68](https://github.com/overdrive1708/MagonoteToolkit/issues/68))

### Fixed

Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
- AI翻訳
- 英語
- 日本語
- AI校正

## ダウンロード方法
- [GitHubのReleases](https://github.com/overdrive1708/MagonoteToolkit/releases)にあるLatestのAssetsより
Expand Down Expand Up @@ -115,6 +116,7 @@ MagonoteToolkit_vx.x.x.zipをダウンロードしてください。
- [ファイル変更監視](docs/HowToUseFileChangeMonitor.md)を参照してください。
- [クリップボードID->名称変換](docs/HowToUseClipboardNumberToName.md)を参照してください。
- [AI翻訳](docs/HowToUseAITranslation.md)を参照してください。
- [AI校正](docs/HowToUseAIProofreading.md)を参照してください。

## 開発環境
- Microsoft Visual Studio Community 2022
Expand Down
12 changes: 12 additions & 0 deletions docs/HowToUseAIProofreading.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# AI校正の使い方
事前に設定画面でAI関連の設定を行ってください。
| 設定項目 | 設定内容 |
| --- | --- |
| AIOpenAIAPIBaseUrl | OpenAI APIのベースURLを設定します。LM StudioなどのAPIも指定可能です。(例:http://127.0.0.1:1234/v1) |
| AIOpenAIAPIKey | OpenAI APIのAPIキーを設定します。LM Studioなどで認証不要にしている場合は設定不要です。 |

1. 使用するモデルを指定して、校正したいテキストを入力したあと、校正実施ボタンを押してください。
<img alt="ExecuteExamination" src="images/AIProofreading/InputText.png" width="75%">

1. 校正結果が表示されます。
<img alt="ExecuteExamination" src="images/AIProofreading/Result.png" width="75%">
Binary file added docs/images/AIProofreading/InputText.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/AIProofreading/Result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
74 changes: 74 additions & 0 deletions src/MagonoteToolkit/Models/AIProofreader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using OpenAI;
using OpenAI.Chat;
using OpenAI.Models;
using System;
using System.ClientModel;
using System.Collections.ObjectModel;

namespace MagonoteToolkit.Models
{
internal class AIProofreader
{
//--------------------------------------------------
// メソッド
//--------------------------------------------------
/// <summary>
/// 校正処理
/// </summary>
/// <param name="inputText">入力テキスト</param>
/// <param name="model">使用するモデル</param>
/// <returns>校正結果</returns>
public static string Proofread(string inputText, string model)
{
// OpenAI APIの設定
OpenAIClientOptions options = new() { Endpoint = new Uri(ApplicationSettings.ReadSettingsAIOpenAIAPIBaseUrl()) };
OpenAIClient client = new(new ApiKeyCredential(ApplicationSettings.ReadSettingsAIOpenAIAPIKey()), options);
ChatClient chatClient = client.GetChatClient(model);

// プロンプトの作成
string prompt = string.Format(Resources.Strings.AIProofreadingPrompt, inputText);

// リクエストしてレスポンスを校正結果として採用
string proofreadingResult;
try
{
ChatCompletion completion = chatClient.CompleteChat(prompt);
proofreadingResult = completion.Content[0].Text;
}
catch (Exception ex)
{
proofreadingResult = $"{Resources.Strings.Error}:{ex.Message}";
}
return proofreadingResult;
}

/// <summary>
/// モデルリスト取得処理
/// </summary>
/// <returns>モデルリスト</returns>
public static ObservableCollection<string> GetModels()
{
// OpenAI APIの設定
OpenAIClientOptions options = new() { Endpoint = new Uri(ApplicationSettings.ReadSettingsAIOpenAIAPIBaseUrl()) };
OpenAIClient client = new(new ApiKeyCredential(ApplicationSettings.ReadSettingsAIOpenAIAPIKey()), options);
OpenAIModelClient modelClient = client.GetOpenAIModelClient();

// モデルリストを取得
ObservableCollection<string> modelList = [];
try
{
OpenAIModelCollection models = modelClient.GetModels();
foreach (var model in models)
{
modelList.Add(model.Id);
}
}
catch (Exception)
{
// エラーが発生した場合は空のリストを返す
}

return modelList;
}
}
}
82 changes: 82 additions & 0 deletions src/MagonoteToolkit/Resources/Strings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 46 additions & 0 deletions src/MagonoteToolkit/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -432,4 +432,50 @@
<data name="ModelToBeUsed" xml:space="preserve">
<value>使用するモデル</value>
</data>
<data name="AIProofreading" xml:space="preserve">
<value>AI校正</value>
</data>
<data name="ProofreadingTargetText" xml:space="preserve">
<value>校正対象テキスト</value>
</data>
<data name="ProofreadingResult" xml:space="preserve">
<value>校正結果</value>
</data>
<data name="ExecuteProofreading" xml:space="preserve">
<value>校正実施</value>
</data>
<data name="AIProofreadingPrompt" xml:space="preserve">
<value>あなたはプロの校正者です。
以下の【観点】で【校正対象】をチェックして、【出力形式】に沿って指摘の一覧と修正案を提示してください。
語彙や言い回しは変えないでください。

【観点】
- 文法的な誤りがないこと。
- 取引先に対して不適切な表現がないこと。
- 表記の揺れがないこと。
- 誤字・脱字がないこと。
- 読みやすく、一度読んですぐ意味が伝わること。
- 一文が長すぎないこと。
- 無駄な表現を省き、短くまとめてあること。
- 一文一義になっていること。
- 敬語表現が適切であること。
- 主語や目的語は明確か、述語と近いところにあるか。
- 箇条書きや見出し、囲みなどを適切に使えているか。
- 二重否定を使っていないこと。
- 用語や表記、書式が全体で統一されていること。
- 読み手の操作は能動態で、結果は受動態で書いてあること。

【出力形式】
=====指摘一覧=====
指摘をMarkdownの表形式で出力(観点を番号のみで表現するのは不可)
=====修正案=====
修正案を出力(修正案の解説があると尚可)

【校正対象】
{0}</value>
</data>
<data name="MessageStatusNowProofreading" xml:space="preserve">
<value>校正を行っています。
しばらくお待ちください。</value>
</data>
</root>
96 changes: 96 additions & 0 deletions src/MagonoteToolkit/ViewModels/AIProofreadingPageViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MagonoteToolkit.Models;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;

namespace MagonoteToolkit.ViewModels
{
internal partial class AIProofreadingPageViewModel : ObservableObject
{
//--------------------------------------------------
// バインディングデータ
//--------------------------------------------------
/// <summary>
/// 校正対象テキスト
/// </summary>
[ObservableProperty]
private string _proofreadingTargetText = string.Empty;

/// <summary>
/// 校正結果
/// </summary>
[ObservableProperty]
private string _proofreadingResult = string.Empty;

/// <summary>
/// モデルリスト
/// </summary>
[ObservableProperty]
private ObservableCollection<string> _modelList = [];

/// <summary>
/// 選択中のモデル
/// </summary>
[ObservableProperty]
private string _selectedModel = string.Empty;

/// <summary>
/// 校正実施中フラグ
/// </summary>
[ObservableProperty]
private bool _isOperationEnable = true;

//--------------------------------------------------
// バインディングコマンド
//--------------------------------------------------
/// <summary>
/// 校正実施
/// </summary>
[RelayCommand]
private void Proofreading() => ExecuteCommandProofreading();

//--------------------------------------------------
// メソッド
//--------------------------------------------------
/// <summary>
/// コンストラクタ
/// </summary>
public AIProofreadingPageViewModel()
{
// モデルリストの生成
LoadModels();
}

/// <summary>
/// 校正実施コマンド実行処理
/// </summary>
private async void ExecuteCommandProofreading()
{
// 校正前処理
IsOperationEnable = false;
ProofreadingResult = Resources.Strings.MessageStatusNowProofreading;

// 校正処理
ProofreadingResult = await Task.Run(() => AIProofreader.Proofread(ProofreadingTargetText, SelectedModel));

// 校正後処理
IsOperationEnable = true;
}

/// <summary>
/// モデルリストの生成
/// </summary>
private async void LoadModels()
{
// モデルリストの初期化
if (!(bool)System.ComponentModel.DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(System.Windows.DependencyObject)).DefaultValue)
{
// (XAMLデザイナーのエラー対策でデザインモードではない場合のみ)
ModelList = await Task.Run(AIProofreader.GetModels);
}
SelectedModel = ModelList.FirstOrDefault();
}
}
}
Loading
Loading