-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdev_phases.html
More file actions
242 lines (230 loc) · 22.1 KB
/
Copy pathdev_phases.html
File metadata and controls
242 lines (230 loc) · 22.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>script</title>
<link rel="stylesheet" href="https://stackedit.io/style.css" />
</head>
<body class="stackedit">
<div class="stackedit__html"><p>Certainly! Let’s go through the project in stages and choose a technical stack that balances efficiency, scalability, and user experience.</p>
<h3 id="tech-stack-selection">Tech Stack Selection:</h3>
<p><strong>Frontend:</strong></p>
<ul>
<li><strong>Flutter</strong>: This is an excellent choice because it allows you to build cross-platform applications from a single codebase (Android, iOS, Web). Flutter offers high performance and a smooth user experience by using Dart as its programming language.</li>
</ul>
<p><strong>Backend:</strong></p>
<ul>
<li><strong>FireBase Functions:</strong> Firebase Functions allows serverless deployment of your backend logic. It’s lightweight and scalable.</li>
<li><strong>RESTful APIs:</strong> For interaction between the frontend app and the remote Firebase cloud functions.</li>
<li><strong>Docker (optional):</strong> Since Firestore runs on Google’s servers, deploying a locally-hosted solution might be tricky due to security restrictions. Docker can help containerize services for easier management.</li>
</ul>
<p><strong>Model Management:</strong></p>
<ul>
<li><strong>LocalStorage (SQLite) for User Models:</strong> To save models and avoid re-uploading them when the app loads.</li>
</ul>
<h3 id="detailed-implementation-plan">Detailed Implementation Plan:</h3>
<h4 id="phase-1-initial-project-setup-2-weeks">Phase 1: Initial Project Setup (2 Weeks)</h4>
<ol>
<li>
<p><strong>Set up Flutter Environment:</strong></p>
<ul>
<li>Install Flutter SDK on your development machine.</li>
<li>Configure an IDE of your choice (e.g., Android Studio).</li>
</ul>
</li>
<li>
<p><strong>Create Flutter App:</strong></p>
<ul>
<li>Initialize a new Flutter project using:<pre class=" language-bash"><code class="prism language-bash">flutter create local_ai_app
</code></pre>
</li>
<li>Navigate to the project directory and open the <code>lib/main.dart</code> file to start building your app’s UI.</li>
</ul>
</li>
</ol>
<h4 id="phase-2-implementing-local-model-storage-2-weeks">Phase 2: Implementing Local Model Storage (2 Weeks)</h4>
<ol>
<li><strong>Integrate SQLite for Local Storage:</strong>
<ul>
<li>
<p>Add the <code>sqflite</code> package to your Flutter project.</p>
<pre class=" language-yaml"><code class="prism language-yaml"><span class="token key atrule">dependencies</span><span class="token punctuation">:</span>
<span class="token key atrule">sqflite</span><span class="token punctuation">:</span> ^2.0.0+3
<span class="token key atrule">path_provider</span><span class="token punctuation">:</span> ^2.0.2 <span class="token comment"># Needed for saving the database file</span>
</code></pre>
</li>
<li>
<p>Create a model class that extends <code>SqfliteDatabase</code>.</p>
</li>
<li>
<p>Write functions to insert, retrieve, update, and delete models in the local database.</p>
<p>Example:</p>
<pre class=" language-dart"><code class="prism language-dart"><span class="token keyword">import</span> <span class="token string">'package:sqflite/sqflite.dart'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token string">'package:path_provider/path_provider.dart'</span><span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">ModelDatabase</span> <span class="token punctuation">{</span>
<span class="token keyword">static</span> <span class="token keyword">final</span> _databaseName <span class="token operator">=</span> <span class="token string">"Models.db"</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token keyword">final</span> _databaseVersion <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> Database<span class="token operator">?</span> _database<span class="token punctuation">;</span>
Future<span class="token operator"><</span>Database<span class="token operator">></span> <span class="token keyword">get</span> database <span class="token keyword">async</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>_database <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token keyword">return</span> _database<span class="token operator">!</span><span class="token punctuation">;</span>
_database <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">initializeDB</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> _database<span class="token operator">!</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
Future<span class="token operator"><</span>Database<span class="token operator">></span> <span class="token function">initializeDB</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> documentsDirectory <span class="token operator">=</span>
<span class="token keyword">await</span> <span class="token function">getApplicationDocumentsDirectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Get app data directory</span>
<span class="token keyword">final</span> path <span class="token operator">=</span> <span class="token function">join</span><span class="token punctuation">(</span>documentsDirectory<span class="token punctuation">.</span>path<span class="token punctuation">,</span> _databaseName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token keyword">await</span> <span class="token function">openDatabase</span><span class="token punctuation">(</span>
path<span class="token punctuation">,</span>
version<span class="token punctuation">:</span> _databaseVersion<span class="token punctuation">,</span>
onCreate<span class="token punctuation">:</span> <span class="token punctuation">(</span>Database db<span class="token punctuation">,</span> int version<span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">{</span>
<span class="token keyword">await</span> db<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token string">'''
CREATE TABLE models (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
parameters TEXT NOT NULL
)
'''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
</li>
</ul>
</li>
</ol>
<h4 id="phase-3-implement-model-upload-and-inference-2-weeks">Phase 3: Implement Model Upload and Inference (2 Weeks)</h4>
<ol>
<li>
<p><strong>Develop User Interface:</strong></p>
<ul>
<li>Create screens for uploading models, viewing a list of saved models, and running them.</li>
</ul>
</li>
<li>
<p><strong>Add Model Upload Functionality:</strong></p>
<ul>
<li>Write functions to allow users to pick a model file and upload it to the local SQLite database.</li>
<li>Validate model files before saving (e.g., check if they are in a supported format).</li>
</ul>
</li>
<li>
<p><strong>Implement Inference Service using Firebase Functions:</strong></p>
<ul>
<li>Create a Firebase function that will handle inference requests.<pre class=" language-javascript"><code class="prism language-javascript"><span class="token comment">// functions/index.js</span>
<span class="token keyword">const</span> functions <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'firebase-functions'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> firebaseConfig <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./config'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Path to your Firebase config file</span>
<span class="token keyword">const</span> <span class="token punctuation">{</span> exec <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'child_process'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> admin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'firebase-admin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
admin<span class="token punctuation">.</span><span class="token function">initializeApp</span><span class="token punctuation">(</span>firebaseConfig<span class="token punctuation">)</span><span class="token punctuation">;</span>
exports<span class="token punctuation">.</span>runInference <span class="token operator">=</span> functions<span class="token punctuation">.</span>https<span class="token punctuation">.</span><span class="token function">onRequest</span><span class="token punctuation">(</span><span class="token punctuation">(</span>req<span class="token punctuation">,</span> res<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token comment">// Extract data from query parameters or request body</span>
<span class="token keyword">const</span> modelId <span class="token operator">=</span> req<span class="token punctuation">.</span>query<span class="token punctuation">.</span>modelId<span class="token punctuation">;</span>
<span class="token keyword">const</span> inputData <span class="token operator">=</span> req<span class="token punctuation">.</span>query<span class="token punctuation">.</span>inputData<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>modelId <span class="token operator">||</span> <span class="token operator">!</span>inputData<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> <span class="token string">'Missing parameters'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">exec</span><span class="token punctuation">(</span><span class="token template-string"><span class="token string">`python run_inference.py </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>modelId<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>inputData<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span><span class="token punctuation">,</span> <span class="token punctuation">(</span>error<span class="token punctuation">,</span> stdout<span class="token punctuation">,</span> stderr<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token string">`Error running inference: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>error<span class="token punctuation">.</span>message<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> <span class="token string">'Internal server error'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>stderr<span class="token punctuation">)</span> <span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token string">`Stderr: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>stderr<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token punctuation">:</span> stderr <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>stdout<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
</li>
<li>Deploy this function to Firebase Functions:<pre class=" language-bash"><code class="prism language-bash">firebase deploy --only functions
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>Create Inference API in the Flutter App:</strong></p>
<ul>
<li>Define a method to make an HTTP request to your Firebase Function and display results.<pre class=" language-dart"><code class="prism language-dart"><span class="token keyword">import</span> <span class="token string">'package:http/http.dart'</span> <span class="token operator">as</span> http<span class="token punctuation">;</span>
Future<span class="token operator"><</span>String<span class="token operator">></span> <span class="token function">runInference</span><span class="token punctuation">(</span>String modelId<span class="token punctuation">,</span> String inputData<span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> response <span class="token operator">=</span> <span class="token keyword">await</span> http<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span>
Uri<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token string">'https://<your-firebase-project>.cloudfunctions.net/runInference'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
headers<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"Content-Type"</span><span class="token punctuation">:</span> <span class="token string">"application/json"</span><span class="token punctuation">}</span><span class="token punctuation">,</span>
body<span class="token punctuation">:</span> <span class="token function">jsonEncode</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">'modelId'</span><span class="token punctuation">:</span> modelId<span class="token punctuation">,</span> <span class="token string">'inputData'</span><span class="token punctuation">:</span> inputData<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>response<span class="token punctuation">.</span>statusCode <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> response<span class="token punctuation">.</span>body<span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">throw</span> <span class="token function">Exception</span><span class="token punctuation">(</span><span class="token string">'Failed to load data'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
</li>
</ul>
</li>
</ol>
<h4 id="phase-4-user-authentication-2-weeks">Phase 4: User Authentication (2 Weeks)</h4>
<ol>
<li>
<p><strong>Implement Firebase Auth:</strong></p>
<ul>
<li>Add Firebase Authentication to your Flutter app using the <code>firebase_auth</code> and <code>provider</code> packages.<pre class=" language-yaml"><code class="prism language-yaml"><span class="token key atrule">dependencies</span><span class="token punctuation">:</span>
<span class="token key atrule">firebase_auth</span><span class="token punctuation">:</span> ^3.0.0+0
<span class="token key atrule">provider</span><span class="token punctuation">:</span> ^6.0.0 <span class="token comment"># For state management</span>
</code></pre>
</li>
<li>Create screens for user registration, login, and logout.</li>
</ul>
</li>
<li>
<p><strong>Implement Authentication Logic in Backend:</strong></p>
<ul>
<li>Ensure that Firebase Function requests are authenticated using Firebase Auth tokens.</li>
</ul>
</li>
</ol>
<h4 id="phase-5-testing-1-week">Phase 5: Testing (1 Week)</h4>
<ol>
<li>
<p><strong>End-to-End User Flow Tests:</strong></p>
<ul>
<li>Manually test each feature: uploading models, running inference, etc., to ensure the app works as expected.</li>
</ul>
</li>
<li>
<p><strong>Unit tests and Integration tests for backend functions:</strong></p>
<ul>
<li>Use packages like <code>dart_test</code> and <code>mockito</code> to write unit tests and mock server responses.<pre class=" language-yaml"><code class="prism language-yaml"><span class="token key atrule">dev_dependencies</span><span class="token punctuation">:</span>
<span class="token key atrule">test</span><span class="token punctuation">:</span> ^1.16.0
<span class="token key atrule">mockito</span><span class="token punctuation">:</span> ^5.0.0
<span class="token key atrule">http_client_mock</span><span class="token punctuation">:</span> ^0.4.0
</code></pre>
</li>
</ul>
</li>
</ol>
<h4 id="phase-6-deployment-1-week">Phase 6: Deployment (1 Week)</h4>
<ol>
<li>
<p><strong>Publish App to Google Play Store:</strong></p>
<ul>
<li>Build a release version of the app.</li>
<li>Follow Google’s guidelines for publishing an app on the Google Play Store.</li>
</ul>
</li>
<li>
<p><strong>Submit App for Review:</strong></p>
<ul>
<li>Submit your app for review by following the guidelines provided by Firebase and the Play Store.</li>
</ul>
</li>
</ol>
<h3 id="conclusion">Conclusion:</h3>
<p>By following this schedule, we will build a robust Flutter application with local model storage using SQLite, a backend server running in Firebase Functions for inference requests, user authentication using Firebase Auth, and comprehensive testing to ensure functionality. Slow and steady progress, making sure each phase is completed thoroughly before moving on to the next, will help us deliver a high-quality app efficiently.</p>
<hr>
</div>
</body>
</html>