body method

  1. @override
String body(
  1. String baseName,
  2. String className
)
override

Defines the actual body code. path is passed relative to lib, baseName is the filename, and className is the filename converted to Pascal case.

実際の本体コードを定義します。pathlibからの相対パス、baseNameにファイル名が渡され、classNameにファイル名をパスカルケースに変換した値が渡されます。

Implementation

@override
String body(String baseName, String className) {
  return """
`Generative AI`は下記のように利用する。

## 概要

$excerpt

MasamuneフレームワークではOpenAIとGeminiの2つのAIプロバイダーをサポートしています。

**注意**: `masamune_ai`がコアパッケージで、具体的な実装として`masamune_ai_openai`(ChatGPT)または`masamune_ai_firebase`(Gemini)を追加します。

## 設定方法

### katana.yamlを使用する場合(推奨)

1. `katana.yaml`に下記の設定を追加。

  ```yaml
  # katana.yaml

  # Configure settings for generative AI.
  # 生成AIの設定を行います。
  generative_ai:
    # Describe the settings for using OpenAI's GPT, etc.
    # OpenAIのGPT等を利用するための設定を記述します。
    openai:
      enable: true # OpenAI ChatGPTを利用する場合false -> trueに変更

    # Configure settings for the gemini.
    # Geminiのための設定を行います。
    gemini:
      enable: false # Geminiを利用する場合false -> trueに変更
  ```

2. 下記のコマンドを実行して設定を適用。

  ```bash
  katana apply
  ```

3. `lib/adapter.dart`の`masamuneAdapters`にAIアダプターを追加。

  **OpenAI ChatGPTの場合:**

  ```dart
  // lib/adapter.dart

  import 'package:masamune_ai_openai/masamune_ai_openai.dart';

  /// Masamune adapter.
  ///
  /// The Masamune framework plugin functions can be defined together.
  // TODO: Add the adapters.
  final masamuneAdapters = <MasamuneAdapter>[
      const UniversalMasamuneAdapter(),

      // OpenAI ChatGPTのアダプターを追加
      OpenaiAIMasamuneAdapter(
        apiKey: String.fromEnvironment("OPENAI_API_KEY"),  // 必須: OpenAI APIキー
        model: OpenaiAIModel.gpt4o,                         // 使用するモデル
        defaultConfig: AIConfig(
          systemPromptContent: AIContent.system([
            AIContent.model(text: "あなたは親切なアシスタントです。"),
          ]),
        ),
      ),
  ];
  ```

  **Firebase Geminiの場合:**

  ```dart
  // lib/adapter.dart

  import 'package:masamune_ai_firebase/masamune_ai_firebase.dart';

  /// Masamune adapter.
  ///
  /// The Masamune framework plugin functions can be defined together.
  // TODO: Add the adapters.
  final masamuneAdapters = <MasamuneAdapter>[
      const UniversalMasamuneAdapter(),

      // Firebase Geminiのアダプターを追加
      FirebaseAIMasamuneAdapter(
        options: DefaultFirebaseOptions.currentPlatform,  // Firebase設定
        model: FirebaseAIModel.gemini20Flash,             // 使用するモデル
        enableAppCheck: true,                              // オプション: App Checkを有効化
        defaultConfig: AIConfig(
          systemPromptContent: AIContent.system([
            AIContent.model(text: "あなたは親切なアシスタントです。"),
          ]),
        ),
      ),
  ];
  ```

### 手動でパッケージを追加する場合

**OpenAI ChatGPTの場合:**

1. パッケージをプロジェクトに追加。

  ```bash
  flutter pub add masamune_ai
  flutter pub add masamune_ai_openai
  ```

2. `lib/adapter.dart`の`masamuneAdapters`に`OpenaiAIMasamuneAdapter`を追加。

  ```dart
  // lib/adapter.dart

  import 'package:masamune_ai_openai/masamune_ai_openai.dart';

  /// Masamune adapter.
  ///
  /// The Masamune framework plugin functions can be defined together.
  // TODO: Add the adapters.
  final masamuneAdapters = <MasamuneAdapter>[
      const UniversalMasamuneAdapter(),

      // OpenAI ChatGPTのアダプターを追加
      OpenaiAIMasamuneAdapter(
        apiKey: String.fromEnvironment("OPENAI_API_KEY"),  // 必須: OpenAI APIキー
        model: OpenaiAIModel.gpt4o,                         // 使用するモデル
        defaultConfig: AIConfig(
          systemPromptContent: AIContent.system([
            AIContent.model(text: "あなたは親切なアシスタントです。"),
          ]),
        ),
      ),
  ];
  ```

**Firebase Geminiの場合:**

1. パッケージをプロジェクトに追加。

  ```bash
  flutter pub add masamune_ai
  flutter pub add masamune_ai_firebase
  ```

2. `lib/adapter.dart`の`masamuneAdapters`に`FirebaseAIMasamuneAdapter`を追加。

  ```dart
  // lib/adapter.dart

  import 'package:masamune_ai_firebase/masamune_ai_firebase.dart';

  /// Masamune adapter.
  ///
  /// The Masamune framework plugin functions can be defined together.
  // TODO: Add the adapters.
  final masamuneAdapters = <MasamuneAdapter>[
      const UniversalMasamuneAdapter(),

      // Firebase Geminiのアダプターを追加
      FirebaseAIMasamuneAdapter(
        options: DefaultFirebaseOptions.currentPlatform,  // Firebase設定
        model: FirebaseAIModel.gemini20Flash,             // 使用するモデル
        enableAppCheck: true,                              // オプション: App Checkを有効化
        defaultConfig: AIConfig(
          systemPromptContent: AIContent.system([
            AIContent.model(text: "あなたは親切なアシスタントです。"),
          ]),
        ),
      ),
  ];
  ```

## 利用方法

### マルチターン会話(AIThread)

複数回のやり取りを管理する場合は`AIThread`を使用:

```dart
class ChatPage extends PageScopedWidget {
@override
Widget build(BuildContext context, PageRef ref) {
  // マルチターン会話のコントローラーを取得
  final thread = ref.app.controller(
    AIThread.query(
      threadId: "chat-1",
      initialContents: [
        AIContent.text("こんにちは!"),
      ],
    ),
  );

  return Column(
    children: [
      Expanded(
        child: ListView.builder(
          itemCount: thread.value.length,
          itemBuilder: (context, index) {
            final content = thread.value[index];
            return ListTile(
              title: Text(content.role.name),
              subtitle: Text(content.text),
            );
          },
        ),
      ),
      ElevatedButton(
        onPressed: () async {
          // ユーザーの質問を送信してAIの応答を取得
          await thread.generateContent([
            AIContent.text("最新のニュースを教えて"),
          ]);
        },
        child: const Text("送信"),
      ),
    ],
  );
}
}
```

### シングルターン会話(AISingle)

1回限りの質問と回答の場合は`AISingle`を使用:

```dart
class SummaryScopedWidget extends PageScopedWidget {
@override
Widget build(BuildContext context, PageRef ref) {
  final single = ref.app.controller(
    AISingle.query(
      config: AIConfig(
        model: "gpt-4o-mini",  // または "gemini-2.0-flash"
      ),
    ),
  );

  return ElevatedButton(
    onPressed: () async {
      final result = await single.generateContent([
        AIContent.text("この文章を要約してください"),
      ]);
      print("要約: \${result.first.text}");
    },
    child: const Text("要約する"),
  );
}
}
```

### ストリーミング応答

AIの応答をリアルタイムで表示:

```dart
final thread = ref.app.controller(
AIThread.query(threadId: "chat-1"),
);

final response = await thread.generateContent([
AIContent.text("長い物語を教えて"),
]);

// ストリーミング更新を監視
response.loading.then((_) {
print("応答完了!");
});
```

### ツール連携(MCP)

AIにカスタムツールを使わせることができます:

```dart
// ツールの定義
final weatherTool = AITool(
name: "weather",
description: "現在の天気を取得",
parameters: {
  "city": AISchema.string(description: "都市名"),
},
);

// ツールを使用する会話
final thread = ref.app.controller(
AIThread.query(
  threadId: "chat-with-tools",
  tools: {weatherTool},
),
);

await thread.generateContent([
AIContent.text("東京の天気は?"),
]);
```

## 利用可能なモデル

### OpenAI ChatGPT

```dart
OpenaiAIModel.gpt4o                 // GPT-4o (デフォルト)
OpenaiAIModel.gpt4oMini             // GPT-4o mini
OpenaiAIModel.gpt5Mini              // GPT-5 mini (最新)
OpenaiAIModel.o1                    // O1モデル
OpenaiAIModel.o1Mini                // O1 mini
OpenaiAIModel.gpt4                  // GPT-4
OpenaiAIModel.gpt4Turbo             // GPT-4 Turbo
OpenaiAIModel.gpt35Turbo            // GPT-3.5 Turbo
```

### Firebase Gemini

```dart
FirebaseAIModel.gemini20Flash         // Gemini 2.0 Flash (デフォルト)
FirebaseAIModel.gemini15Flash         // Gemini 1.5 Flash
FirebaseAIModel.gemini15FlashLatest   // Gemini 1.5 Flash (最新版)
FirebaseAIModel.gemini15Flash8B       // Gemini 1.5 Flash 8B (軽量版)
FirebaseAIModel.gemini15Pro           // Gemini 1.5 Pro
FirebaseAIModel.gemini15ProLatest     // Gemini 1.5 Pro (最新版)
```

## 環境変数の設定

**OpenAI ChatGPT:**

```bash
# ターミナルまたは.envファイルで設定
export OPENAI_API_KEY="sk-your-api-key-here"

# または実行時に--dart-defineを使用
flutter run --dart-define=OPENAI_API_KEY=sk-your-api-key-here
```

OpenAI APIキーは[OpenAI Platform](https://platform.openai.com/api-keys)から取得できます。

**Firebase Gemini:**

Firebase設定は`firebase_options.dart`で管理されます。Firebase CLIで設定:

```bash
flutterfire configure
```

## バックエンド連携(OpenAI専用)

`OpenaiChatGPTFunctionsAction`を使用してバックエンドからChatGPTを呼び出し:

```dart
import "package:masamune_ai_openai/functions.dart";

// Masamune Functionsハンドラー内で実行
final response = await functions.execute(
OpenaiChatGPTFunctionsAction(
  apiKey: yourApiKey,
  model: "gpt-4o",
  messages: [
    {"role": "user", "content": "こんにちは、ChatGPT!"},
  ],
),
);

print(response.text);
```

### Tips

- OpenAIとGeminiは同じ`AIThread`/`AISingle` APIで使用可能
- ストリーミング応答に対応し、リアルタイムで結果を表示できる
- MCPツールで関数呼び出し機能を拡張可能
- Geminiの場合、Firebase App Checkで追加のセキュリティを有効化できる
- OpenAIのAPIキーはバックエンドで管理することを推奨
```
""";
}