DEV Community

Cover image for Building an AI-Powered Bible Chat App: A Technical Journey with Gemini AI SDK and Flutter
Victor Ihedioha
Victor Ihedioha

Posted on • Edited on

Building an AI-Powered Bible Chat App: A Technical Journey with Gemini AI SDK and Flutter

Introduction

With the integration of artificial intelligence (AI) becoming a game-changer in today's world, I recently embarked on creating a mobile application – an AI-powered Bible chat experience. In this article, I’ll share my journey of creating a simple yet effective AI-powered Bible chat app using the Gemini AI SDK and Flutter, focusing on Stacked architecture for state management and sqflite for local storage.

Conceptualizing the AI Bible Chat App

The idea was to create an application which could provide users with an interactive and personalized Bible study experience. The app would leverage AI to understand natural language queries and provide contextually relevant scripture passages, interpretations, and study materials.

The app utilizes the Gemini large language model API to process these queries and generate informative responses based on the vast amount of biblical text it has been trained on.

To enhance the user experience, I implemented an SQLite local database using the sqflite package. This allows the app to store user queries and corresponding Gemini responses. This cached data enables features like revisiting past conversations and potentially offering offline functionality in the future.

Stacked, a state management solution by Filledstacks, was chosen for its ease of use and focus on reactive programming. Stacked helps manage the application state efficiently, particularly when dealing with user interactions and updates from the Gemini API.

Choosing the Right Tools

  • Frontend: Flutter – A framework from Google, emerged as the ideal framework for its cross-platform capabilities and its expressive and flexible UI, enabling the building of beautiful and performant applications for iOS, Android, Web, and Desktop (MacOS, Windows, and Linux) using a single codebase.

  • State Management: Stacked – A reactive state management solution built for Flutter, simplifying app creation, state handling and data flow within the app.

  • AI Model: Gemini – A large language model from Google AI, trained on a massive dataset of text and code, allowing it to generate creative text formats and answer questions in an informative way.

  • Local Database: sqflite – An ORM (Object Relational Mapper) for Flutter that facilitates interaction with SQLite, a lightweight and embedded relational database engine, for storing user queries and Gemini responses on user devices.

Designing the App with Stacked

Stacked architecture allowed for a clean separation of concerns, making the codebase more readable and easier to manage. It follows the MVVM pattern (Model-View-ViewModel), which fits perfectly with the reactive nature of Flutter apps.

class BibleDataService {
  final _databaseService = locator<DatabaseService>();

  Future<List<SessionConversations>?> 
     getAllSessionsWithConversations() async {
      var allSessionsWithConversations =
        await _databaseService.fetchAllSessionsWithConversations();
    return allSessionsWithConversations;
  }
}
Enter fullscreen mode Exit fullscreen mode
class BibleChatViewModel extends FormViewModel {
  final _bibleDataService = locator<BibleDataService>();
  final _logger = getLogger('BibleChatViewModel');

  List<String> get books => _books;
  List<String> _books = [];

  void fetchBibleBooks() {
    _books = _bibleDataService.getBooks();
    rebuildUi();
  }
}
Enter fullscreen mode Exit fullscreen mode
class BibleChatView extends StackedView<BibleChatViewModel> {
  const BibleChatView({super.key});

  @override
  Widget builder(
    BuildContext context,
    BibleChatViewModel viewModel,
    Widget? child,
  ) {
    return Scaffold(
      backgroundColor: kcChatBackground,
      appBar: ChatAppBar(
        title: viewModel.sessionConversation?.session?.title.toString() ??
            'No title',
        onHistoryPressed: viewModel.showHistoryDialog,
      ),
      body: SafeArea(
        child: Column(
          children: [
            Expanded(
                child: ChatComponent(
              conversations: viewModel.sessionConversation!.conversations!,
            )),
            const ChatBoxComponent()
          ],
        ),
      ),
    );
  }

  @override
  BibleChatViewModel viewModelBuilder(
    BuildContext context,
  ) =>
      BibleChatViewModel();
}
Enter fullscreen mode Exit fullscreen mode

Integrating Gemini AI SDK

The Gemini AI SDK was integrated to handle natural language inputs. It processed user queries and matched them with relevant Bible and scripture content, using a combination of machine learning models and a structured database of scriptures.

  GenerativeModel initializeAIModel() {
    const apiKey = 'YOUR_API_KEY';
    openModel ??= GenerativeModel(
        model: 'gemini-pro',
        apiKey: apiKey,
        generationConfig: GenerationConfig(maxOutputTokens: 1000));
    return openModel!;
  }
Enter fullscreen mode Exit fullscreen mode

Local Storage with sqflite

To enhance the user experience with offline capabilities, sqflite was used for local storage. It stored user chat history with Gemini, allowing for a seamless experience even without an internet connection.

Future<void> init() async {
    _logger.i('Initializing database');
    final directory = await getApplicationDocumentsDirectory();
    _database = await openDatabase(
      '${directory.path}/bible_chat',
      version: 1,
    );
    try {
      _logger.i('Creating database tables');
      await _databaseMigrationService.runMigration(
        _database,
        migrationFiles: [
          '1_bible_chat.sql',
        ],
        verbose: true,
      );
      _logger.i('Database tables created');
    } catch (e, s) {
      _logger.v('Error creating database tables', e, s);
    }
  }
Enter fullscreen mode Exit fullscreen mode

Conclusion

The development of the AI Bible chat app was a fulfilling project that combined my passion for software engineering with the power of AI. By utilizing Flutter, Gemini AI SDK, Stacked, and sqflite, I was able to create an app that not only met the technical requirements but also provided a meaningful experience to its users.

The journey doesn’t end here, though. The field of AI is constantly advancing, and there’s always room for improvement and innovation. I look forward to exploring new ways to enhance the app and bring even more value to users across the world.

This article is a high-level overview of the technical approach taken to build the AI Bible chat app. It’s intended to inspire and guide those who are interested in developing similar applications. Remember, the best technical articles are those that inform, engage, and challenge the reader to think differently about the problems they’re solving.

Here's a link to the next article titled: Flutter & Faith: Crafting an AI Bible Chat App with Stacked Architecture - Part 2

Download the APK app sample (arm64) here

Top comments (8)

Collapse
 
amtzespinosa profile image
Alex Martínez • Edited

Cool! If it was a spanish project you could call it BiblIA hahahaha, well done!

Collapse
 
apow profile image
Victor Ihedioha

Thanks, @amtzespinosa , You know you could almost call it a Spanish project since you can get the result or chat in Spanish too. I look forward to extending the project with time, and making it open source for solid contribution.

Collapse
 
amtzespinosa profile image
Alex Martínez

I am not actually a believer but count on me if you need any help!

Collapse
 
oluwaseun_agbomola profile image
Oluwaseun Agbomola

Very nice, I love the article. well done

Collapse
 
apow profile image
Victor Ihedioha

Gracias, my good man.

Collapse
 
apow profile image
Victor Ihedioha

The article has been updated with a link to the second article. Enjoy!

Collapse
 
jose_rafaelouteirodasi profile image
Jose Rafael Outeiro da Silva

Hi @apow, is this app fully functional?

Collapse
 
apow profile image
Victor Ihedioha

Hi @jose_rafaelouteirodasi , yes it is. And I am working on more updates to the app also, so it can be released to the general public. But you can download the APK at the end of the article to test its current capability.