Flutter谷歌AI集成插件googleai_dart的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter谷歌AI集成插件googleai_dart的使用

简介

googleai_dart 是一个非官方的Dart客户端,用于与Google AI API进行交互。它支持多种功能,包括生成内容、嵌入内容、计算token数量以及获取模型信息等。

特性

  • 基于Google AI的OpenAPI规范生成。
  • 完全类型安全,并且有详细的文档和测试。
  • 支持所有平台。
  • 支持自定义基础URL、头部和查询参数(例如HTTP代理)。
  • 支持自定义HTTP客户端(例如SOCKS5代理或高级用例)。

使用方法

认证

Google AI API使用API密钥进行认证。你需要访问Google AI Studio仪表盘页面来获取API密钥,并在请求中使用它。

import 'dart:io';
import 'package:googleai_dart/googleai_dart.dart';

final googleaiApiKey = Platform.environment['GOOGLEAI_API_KEY'];
final client = GoogleAIClient(apiKey: googleaiApiKey);

生成内容

文本输入

你可以使用generateContent方法根据给定的输入消息从模型生成响应。

final res = await client.generateContent(
  modelId: 'gemini-pro',
  request: const GenerateContentRequest(
    contents: [
      Content(
        parts: [
          Part(text: 'Write a story about a magic backpack.'),
        ],
      ),
    ],
    generationConfig: GenerationConfig(
      temperature: 0.8,
    ),
  ),
);
print(res.candidates?.first.content?.parts?.first.text);
// In a quaint little town nestled amidst rolling hills, there lived a...

文本和图像输入

如果输入包含文本和图像,可以使用gemini-pro-vision模型。

final res = await client.generateContent(
  modelId: 'gemini-pro-vision',
  request: GenerateContentRequest(
    contents: [
      Content(
        parts: [
          const Part(text: 'What is this picture?'),
          Part(
            inlineData: Blob(
              mimeType: 'image/png',
              data: base64.encode(
                await File('./test/assets/1.png').readAsBytes(),
              ),
            ),
          ),
        ],
      ),
    ],
  ),
);
print(res.candidates?.first.content?.parts?.first.text);
// The picture shows some scones with blueberries and flowers...

多轮对话(聊天)

你可以使用Gemini构建多轮对话。

final res = await client.generateContent(
  modelId: 'gemini-pro',
  request: const GenerateContentRequest(
    contents: [
      Content(
        role: 'user',
        parts: [
          Part(
            text: 'Write the first line of a story about a magic backpack.',
          ),
        ],
      ),
      Content(
        role: 'model',
        parts: [
          Part(
            text:
                'In the bustling city of Meadow brook, lived a young girl named Sophie. '
                'She was a bright and curious soul with an imaginative mind.',
          ),
        ],
      ),
      Content(
        role: 'user',
        parts: [
          Part(
            text: 'Can you set it in a quiet village in 1600s France?',
          ),
        ],
      ),
    ],
  ),
);
print(res.candidates?.first.content?.parts?.first.text);
// In the heart of a tranquil village nestled amidst the rolling hills of 17th century France...

流式生成内容

你可以通过streamGenerateContent方法实时处理生成的内容。

final stream = client.streamGenerateContent(
  modelId: 'gemini-pro',
  request: const GenerateContentRequest(
    contents: [
      Content(
        parts: [
          Part(text: 'Write a story about a magic backpack.'),
        ],
      ),
    ],
    generationConfig: GenerationConfig(
      temperature: 0.8,
    ),
  ),
);

await for (final res in stream) {
  print(res.candidates?.first.content?.parts?.first.text);
  // In a quaint little town nestled amidst rolling hills, there lived a...
}

计算Token数量

当使用长提示时,可能需要先计算Token的数量。

final res = await client.countTokens(
  modelId: 'gemini-pro',
  request: const CountTokensRequest(
    contents: [
      Content(
        parts: [
          Part(
            text: 'Write a story about a magic backpack.',
          ),
        ],
      ),
    ],
  ),
);
print(res.totalTokens);
// 8

内容嵌入

你可以使用embedding-001模型将内容转换为嵌入向量。

final res = await client.embedContent(
  modelId: 'embedding-001',
  request: const EmbedContentRequest(
    content: Content(
      parts: [
        Part(text: 'Write a story about a magic backpack.'),
      ],
    ),
  ),
);
print(res.embedding?.values);
// [0.008624583, -0.030451821, -0.042496547, ...]

模型信息

列出所有模型

你可以使用listModels方法列出所有可用的模型。

final res = await client.listModels();
print(res.models);
// [Model(name: models/gemini-pro, displayName: Gemini Pro, description: The best model...

获取特定模型信息

你可以使用getModel方法获取某个模型的详细信息。

final res = await client.getModel(modelId: 'gemini-pro');
print(res);
// Model(name: models/gemini-pro, displayName: Gemini Pro, description: The best model...

示例Demo

以下是一个完整的示例demo,展示了如何使用googleai_dart插件进行各种操作:

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:platform';

import 'package:googleai_dart/googleai_dart.dart';

Future<void> main() async {
  final client = GoogleAIClient(
    apiKey: Platform.environment['GOOGLEAI_API_KEY'],
  );

  // 生成文本输入内容
  await _generateContentTextInput(client);

  // 生成文本和图像输入内容
  await _generateContentTextAndImageInput(client);

  // 多轮对话
  await _generateContentMultiTurnConversations(client);

  // 流式生成内容
  await _streamGenerateContentTextInput(client);

  // 计算Token数量
  await _countTokens(client);

  // 内容嵌入
  await _embedContent(client);

  // 模型操作
  await _listModels(client);
  await _getModel(client);

  client.endSession();
}

Future<void> _generateContentTextInput(final GoogleAIClient client) async {
  final res = await client.generateContent(
    modelId: 'gemini-pro',
    request: const GenerateContentRequest(
      contents: [
        Content(
          parts: [
            Part(text: 'Write a story about a magic backpack.'),
          ],
        ),
      ],
      generationConfig: GenerationConfig(
        temperature: 0.8,
      ),
    ),
  );
  print(res.candidates?.first.content?.parts?.first.text);
}

Future<void> _generateContentTextAndImageInput(
  final GoogleAIClient client,
) async {
  final res = await client.generateContent(
    modelId: 'gemini-pro-vision',
    request: GenerateContentRequest(
      contents: [
        Content(
          parts: [
            const Part(text: 'What is this picture?'),
            Part(
              inlineData: Blob(
                mimeType: 'image/png',
                data: base64.encode(
                  await File('./test/assets/1.png').readAsBytes(),
                ),
              ),
            ),
          ],
        ),
      ],
    ),
  );
  print(res.candidates?.first.content?.parts?.first.text);
}

Future<void> _generateContentMultiTurnConversations(
  final GoogleAIClient client,
) async {
  final res = await client.generateContent(
    modelId: 'gemini-pro',
    request: const GenerateContentRequest(
      contents: [
        Content(
          role: 'user',
          parts: [
            Part(
              text: 'Write the first line of a story about a magic backpack.',
            ),
          ],
        ),
        Content(
          role: 'model',
          parts: [
            Part(
              text:
                  'In the bustling city of Meadow brook, lived a young girl named Sophie. '
                  'She was a bright and curious soul with an imaginative mind.',
            ),
          ],
        ),
        Content(
          role: 'user',
          parts: [
            Part(
              text: 'Can you set it in a quiet village in 1600s France?',
            ),
          ],
        ),
      ],
    ),
  );
  print(res.candidates?.first.content?.parts?.first.text);
}

Future<void> _streamGenerateContentTextInput(
  final GoogleAIClient client,
) async {
  final stream = client.streamGenerateContent(
    modelId: 'gemini-pro',
    request: const GenerateContentRequest(
      contents: [
        Content(
          parts: [
            Part(text: 'Write a story about a magic backpack.'),
          ],
        ),
      ],
      generationConfig: GenerationConfig(
        temperature: 0.8,
      ),
    ),
  );

  await for (final res in stream) {
    print(res.candidates?.first.content?.parts?.first.text);
  }
}

Future<void> _countTokens(final GoogleAIClient client) async {
  final res = await client.countTokens(
    modelId: 'gemini-pro',
    request: const CountTokensRequest(
      contents: [
        Content(
          parts: [
            Part(
              text: 'Write a story about a magic backpack.',
            ),
          ],
        ),
      ],
    ),
  );
  print(res.totalTokens);
}

Future<void> _embedContent(final GoogleAIClient client) async {
  final res = await client.embedContent(
    modelId: 'embedding-001',
    request: const EmbedContentRequest(
      content: Content(
        parts: [
          Part(text: 'Write a story about a magic backpack.'),
        ],
      ),
    ),
  );
  print(res.embedding?.values);
}

Future<void> _listModels(final GoogleAIClient client) async {
  final res = await client.listModels();
  print(res.models);
}

Future<void> _getModel(final GoogleAIClient client) async {
  final res = await client.getModel(modelId: 'gemini-pro');
  print(res);
}

这个示例展示了如何使用googleai_dart插件执行各种操作,如生成内容、流式生成内容、计算Token数量、内容嵌入以及获取模型信息等。希望对你有所帮助!


更多关于Flutter谷歌AI集成插件googleai_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter谷歌AI集成插件googleai_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用googleai_dart插件的示例代码。googleai_dart是一个用于与Google AI服务交互的Dart库,虽然它本身可能不是直接为Flutter设计的,但你可以在Flutter项目中通过平台通道或其他方式调用其Dart API。

请注意,由于googleai_dart库的具体实现和API可能会随时间变化,以下代码是基于假设和通用概念的示例。实际使用时,请查阅最新的googleai_dart文档和Flutter集成指南。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加googleai_dart依赖(如果它是一个可用的Dart包)。由于googleai_dart可能不是一个官方的Flutter插件,你可能需要查找正确的包名和版本。

dependencies:
  flutter:
    sdk: flutter
  googleai_dart: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来安装依赖。

2. 配置Google AI服务

在使用Google AI服务之前,你需要在Google Cloud Platform上创建一个项目,并启用相应的API(如Vision API、Translation API等)。然后,你需要获取一个API密钥或设置OAuth 2.0认证。

3. 编写Flutter代码

以下是一个假设的Flutter代码示例,用于演示如何集成并使用googleai_dart库(具体API调用可能有所不同)。

import 'package:flutter/material.dart';
import 'package:googleai_dart/googleai_dart.dart';  // 假设的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Google AI Integration'),
        ),
        body: Center(
          child: GoogleAiExample(),
        ),
      ),
    );
  }
}

class GoogleAiExample extends StatefulWidget {
  @override
  _GoogleAiExampleState createState() => _GoogleAiExampleState();
}

class _GoogleAiExampleState extends State<GoogleAiExample> {
  String result = '';

  void callGoogleAiService() async {
    // 假设的API密钥和服务配置
    String apiKey = 'YOUR_API_KEY';
    String projectId = 'YOUR_PROJECT_ID';

    // 初始化Google AI客户端(具体实现取决于googleai_dart库)
    // GoogleAiClient client = GoogleAiClient(apiKey: apiKey, projectId: projectId);

    // 示例:调用翻译API(具体API调用取决于googleai_dart库的实现)
    // TranslationRequest request = TranslationRequest(
    //   q: 'Hello, world!',
    //   target: 'es',  // 西班牙语
    // );
    // TranslationResponse response = await client.translate(request);
    // setState(() {
    //   result = response.translatedText;
    // });

    // 注意:以上代码是伪代码,具体实现需要参考googleai_dart库的文档。

    // 由于没有具体的googleai_dart实现细节,这里用一个简单的模拟来展示
    setState(() {
      result = 'This is a simulated response from Google AI service.';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Calling Google AI Service...'),
        ElevatedButton(
          onPressed: callGoogleAiService,
          child: Text('Call Service'),
        ),
        Text(result),
      ],
    );
  }
}

4. 注意事项

  • API密钥安全:不要在客户端代码中硬编码API密钥。考虑使用更安全的方法来管理密钥,如Firebase Cloud Functions或后端服务。
  • 错误处理:在实际应用中,添加适当的错误处理逻辑以处理网络问题、API限制等问题。
  • 平台特定代码:如果googleai_dart需要平台特定的代码(如Android或iOS的原生代码),你可能需要设置平台通道。

由于googleai_dart的具体实现细节和API可能有所不同,建议查阅最新的文档和示例代码来获取准确的集成和使用方法。

回到顶部