Upgrade to Pro — share decks privately, control downloads, hide ads and more …

生成AIのODC周辺開発(External Logic)への適用例

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Junji Watanabe Junji Watanabe
April 25, 2025
260

生成AIのODC周辺開発(External Logic)への適用例

Developer Days Tokyo 2025のMVPセッション。
ODCのローコード部分に使える生成AIとしてはMentorの生成AI機能があるが、周辺的開発(ローコード以外の部分)に生成AIを適用する方法の紹介。ここではExternal Logic(C#)開発を例にする。

Avatar for Junji Watanabe

Junji Watanabe

April 25, 2025
Tweet

Transcript

  1. 生成AIのODC周辺開発 (External Logic)への適用例 Developer Day Tokyo 2025/04/24 OutSystems MVP 渡部

    潤司 : https://qiita.com/jyunji_watanabe : https://twitter.com/JyunjiW : https://www.linkedin.com/in/watanabejyunji/ Qiita X LinkedIn
  2. ODCでのAI利用をざっくり整理すると 1.Appそのものを作る ◦ Mentorの生成AI機能 2.開発をAIで支援する ◦ Mentorの静的解析や、コード補完機能 ◦ 生成AIでODC周辺開発(CSS・JavaScript・C#)を行う、調査を支援してもらう ◦

    生成AIでテストケース・テストデータ作成をしてもらう 3.外部のAIサービスに接続して利用する ◦ MentorのAI Agent Builder ◦ その他様々なベンダーが提供している外部APIにアクセスする ◦ (2025/4/14追加)AIモデル管理する組み込みの機能、およびAI検索サービスへの接続機能 2025/03のOSUGで 説明 [1]
  3. External Logicとは C#のメソッドを、OutSystemsのServer Actionとして利用する • OutSystemsが提供するライブラリを参照して、.NET 8を利用す るClass Libraryを作る •

    ライブラリが提供する属性を付与したメソッドが、OutSystemsの Server Actionになる • 実行時には、Appコンテナのメモリ上ではなく、AWS Lambdaで動 作する(つまり背後ではHTTPSの通信が行われる) [2]
  4. External Logic作成手順 • :定型的な作 業なので手順書 を用意して対応 • :今日のテー マ。この部分のコ ードを生成AIで

    作成してみる 1.Projectを作 成する 2.SDK参照を 追加 3.interfaceを 作成 4.classを作成 5.publish 6.zip化 7.ODC Portal にUpload 8.動作確認 9.Release Library
  5. 1-2 Projectを作り、SDK参照を追加する 定型的なコマンドで実行できるので、必要な部分を書 き換えて実行するか、スクリプト化すれば良い [3] dotnet new sln -o DeveloperDayTokyo2025

    cd DeveloperDayTokyo2025 dotnet new classlib -o DeveloperDayTokyo2025 --framework net8.0 dotnet sln add DeveloperDayTokyo2025/DeveloperDayTokyo2025.csproj cd DeveloperDayTokyo2025 dotnet add package OutSystems.ExternalLibraries.SDK
  6. 次の条件を満たすC#のメソッドを作成してください。 前提 - .NET 8 - OSはLinux - ソリューション及びプロジェクトの作成は不要 -

    NuGetにあるライブラリを使って良い(必要なNuGetライブラリについては、VSCode上でプロジェクトに追加するため のコマンドリストを生成すること) - メソッドはinterfaceで定義し、そのinterfaceを実装する - interfaceとclassは別ファイルで定義する - interfaceには「OSInterface」属性を付与する - interface内のメソッドには「OSAction」属性を付与する - OSInterface及びOSAction属性は別の場所で定義したものを参照するので、定義部分は出力しない 仕様 - Excelの指定セルに値を書き込むメソッド Excelのバイナリファイル、シート位置、セル位置、値を渡し、該当セルに値を書き込んだ結果のExcelバイナリファイルを 返す - Excelの指定セルから値を読み込むメソッド Excelのバイナリファイル、シート位置、セル位置を渡し、該当セルから値を読み、文字列として返す。
  7. 3-4 コード作成 (3)プロンプト入力2回目 • 今度はNuGetのClosedXMLを利用するコードが出 力された • ClosedXML 0.104.2がインストールされた [4]

    • NuGetの該当パッケージページを見ると、MITライセ ンスなので、これを使うことにする dotnet add package ClosedXML
  8. 3-4 コード作成 (3)プロンプト入力2回目 • 出力されたinterfaceファイル using System; // OSInterface属性を付与 [OSInterface]

    public interface IExcelService { // OSAction属性を付与 [OSAction] byte[] WriteCell(byte[] excelFile, string sheetName, string cellAddress, string value); [OSAction] string ReadCell(byte[] excelFile, string sheetName, string cellAddress); } External Logicが要求する 属性が付与されている ActionのI/Fにマッピングさ れるメソッドのシグネチャに も問題なさそう
  9. • 出力されたClassファイルのメソッド部分 1/2 public byte[] WriteCell(byte[] excelFile, string sheetName, string

    cellAddress, string value) { using (var memoryStream = new MemoryStream(excelFile)) using (var workbook = new XLWorkbook(memoryStream)) { var worksheet = workbook.Worksheet(sheetName); if (worksheet == null) { throw new ArgumentException($"Sheet '{sheetName}' not found."); } worksheet.Cell(cellAddress).Value = value; using (var outputStream = new MemoryStream()) { workbook.SaveAs(outputStream); return outputStream.ToArray(); } } } IDisposableを実装するClass のオブジェクトを作成する処理 をusingで囲んでいる シート取得(取得できなかった 時のエラー処理もある) シートオブジェクトを経由して、 指定したセルアドレスに書き 込み 書き込みが終わったオブジェ クトからExcelファイルのバイ ナリを取得している
  10. • 生成されたClassファイルのメソッド部分 2/2 public string ReadCell(byte[] excelFile, string sheetName, string

    cellAddress) { using (var memoryStream = new MemoryStream(excelFile)) using (var workbook = new XLWorkbook(memoryStream)) { var worksheet = workbook.Worksheet(sheetName); if (worksheet == null) { throw new ArgumentException($"Sheet '{sheetName}' not found."); } var value = worksheet.Cell(cellAddress).GetString(); return value; } }
  11. 5-7 ODCに登録 1. Publish(ターミナルから「dotnet publish -c Release -r linux-x64 --self-contained

    false」を入力) 2. Publishで生成されたファイル群をzip圧縮 3. ODC Portal > External logicページからアップロ ードして作成 o 「Try library in an app」で、テスト用App に参照を追加しておく
  12. まとめ 1. C#スキルがなくてもExternal Logic開発できるか o 可能ではある o スキルが無いと出力されたコードの問題点に気づけなかったり、修正対応ができない可能性がある o 対応する範囲を限定する(シンプルな開発に絞る)、問題発生時には相談できる体制を用意する

    2. そこまでいけないとしても、C#スキルのある人がODC のC#開発を効率的に行えるか o こちらは、問題なしでかなり有用 o 大量のコードを即時出力してくれる o 細かい手順まで提示してくれる(間違っていることはあるので判断力は必要) o 知らないライブラリを使ったコードも即時出力してくれるので、開発のとっかかりにも良い
  13. 1. SpeakerDeck. 「Mentor 生成アプリ の構造解析」. https://speakerdeck.com/junjiwatanabe/mentor-sheng- cheng-apuri-nogou-zao-jie-xi 2. External LogicがAWS

    Lambda上で動作する点については、以下のONE2023の動画で確認できる o ONE Conference 2023. 「‘Level Up’ Your Low-Code Game with New Innovations 19:20あたりのスライ ド」.https://learn.outsystems.com/training/journeys/one-conference-2023-695/-level-up-your-low-code- game-with-new-innovations/odc/3832, (参照2024-04-18) o ONE Conference 2023. 「Extending ODC: the new Integrations capabilities of ODC 28:00あたりの説 明」. https://learn.outsystems.com/training/journeys/one-conference-2023-695/extending-odc-the-new- integrations-capabilities-of-odc-/odc/3821, (参照2024-04-18) 3. Qiita. 「External LogicをVisual Studio Codeで作成する」. https://qiita.com/jyunji_watanabe/items/04ffd0bc25ed4e845661 4. NuGet. 「ClosedXML Version 0.104.2」. https://www.nuget.org/packages/ClosedXML/0.104.2 5. Qiita. 「生成AI(GitHub Copilot)にODC向けの非同期JavaScriptを書かせてみる」. https://qiita.com/jyunji_watanabe/items/1f3e05ab985c85495991