|
| 1 | + |
| 2 | +# GSoC 2025 Proposal: AI UI Designer for APIs |
| 3 | + |
| 4 | +## About |
| 5 | + |
| 6 | +**Full Name**: Ning Wei |
| 7 | +**Contact Info **: [email protected] |
| 8 | +**Discord Handle**: @allen_wn |
| 9 | +**GitHub Profile**: [https://github.com/AllenWn](https://github.com/AllenWn) |
| 10 | +**LinkedIn**: [https://www.linkedin.com/in/ning-wei-allen0503](https://www.linkedin.com/in/ning-wei-allen0503) |
| 11 | +**Time Zone**: UTC+8 |
| 12 | +**Resume**: https://drive.google.com/file/d/1Zvf1IhKju3rFfnDsBW1WmV40lz0ZMNrD/view?usp=sharing |
| 13 | + |
| 14 | +## University Info |
| 15 | + |
| 16 | +**University**: University of Illinois at Urbana-Champaign |
| 17 | +**Program**: B.S. in Computer Engineering |
| 18 | +**Year**: 2nd year undergraduate |
| 19 | +**Expected Graduation**: May 2027 |
| 20 | + |
| 21 | +--- |
| 22 | + |
| 23 | +## Motivation & Past Experience |
| 24 | + |
| 25 | +1. **Have you worked on or contributed to a FOSS project before?** |
| 26 | +Not yet officially, but I’ve been actively exploring open source projects like API Dash and contributing via discussion and design planning. I am currently studying the API Dash repository and developer guide to prepare for my first PR. |
| 27 | + |
| 28 | +2. **What is your one project/achievement that you are most proud of? Why?** |
| 29 | +I'm proud of building an AI-assisted email management app using Flutter and Go, which automatically categorized and responded to emails using ChatGPT API. It gave me end-to-end experience in integrating APIs, generating dynamic UIs, and designing developer-friendly tools. |
| 30 | + |
| 31 | +3. **What kind of problems or challenges motivate you the most to solve them?** |
| 32 | +I enjoy solving problems that eliminate repetitive work for developers and improve workflow productivity — especially through automation and AI integration. |
| 33 | + |
| 34 | +4. **Will you be working on GSoC full-time?** |
| 35 | +Yes. I will be dedicating full-time to this project during the summer. |
| 36 | + |
| 37 | +5. **Do you mind regularly syncing up with the project mentors?** |
| 38 | +Not at all — I look forward to regular syncs and feedback to align with the project vision. |
| 39 | + |
| 40 | +6. **What interests you the most about API Dash?** |
| 41 | +API Dash is focused on improving the developer experience around APIs, which is something I care deeply about. I love the vision of combining UI tools with AI assistance in a privacy-first, extensible way. |
| 42 | + |
| 43 | +7. **Can you mention some areas where the project can be improved?** |
| 44 | +- More intelligent code generation from API response types |
| 45 | +- Drag-and-drop UI workflow |
| 46 | +- Visual previews and theming customization |
| 47 | +- Integration with modern LLMs for field-level naming and layout suggestions |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +## Project Proposal Information |
| 52 | + |
| 53 | +### Proposal Title |
| 54 | + |
| 55 | +AI UI Designer for APIs |
| 56 | + |
| 57 | +# Relevant Issues: [#617] |
| 58 | + |
| 59 | +### Abstract |
| 60 | + |
| 61 | +This project proposes the development of an AI-powered UI generation assistant within the API Dash application. The tool will automatically analyze API responses (primarily in JSON format), infer their structure, and dynamically generate Flutter-based UI components such as tables, forms, or cards. Developers will be able to preview, customize, and export these layouts as usable Dart code. By combining rule-based heuristics with optional LLM (e.g., Ollama, GPT) enhancements, the feature aims to streamline API data visualization and speed up frontend prototyping. The generated UI will be clean, modular, and directly reusable in real-world Flutter applications. |
| 62 | + |
| 63 | +--- |
| 64 | + |
| 65 | +### Detailed Description |
| 66 | + |
| 67 | +This project introduces a new feature into API Dash: AI UI Designer — an intelligent assistant that takes an API response and converts it into dynamic UI components, allowing developers to quickly visualize, customize, and export frontend code based on live API data. It will analyze the data and suggest corresponding UI layouts using Dart/Flutter widgets such as `DataTable`, `Card`, or `Form`. |
| 68 | + |
| 69 | +#### Step 1: Parse API Response Structure |
| 70 | + |
| 71 | +The first step is to understand the structure of the API response, which is usually in JSON format. The goal is to transform the raw response into an intermediate schema that can guide UI generation. |
| 72 | + |
| 73 | +- Most API responses are either: |
| 74 | + - Object: A flat or nested key-value map. |
| 75 | + - Array of Objects: A list of items, each following a similar structure. |
| 76 | +- Understanding the structure allows us to decide: |
| 77 | + - What kind of UI component fits best (e.g., table, form, card). |
| 78 | + - How many fields to show, and how deep the nesting goes. |
| 79 | +- Common field types (string, number, boolean, array, object) impact widget selection. |
| 80 | +- Special patterns (e.g., timestamps, emails, URLs) can be detected and used to enhance UI. |
| 81 | + |
| 82 | +##### Implementation Plan: |
| 83 | + |
| 84 | +- Start with JSON |
| 85 | + - Initially only support JSON input, as it's the most common. |
| 86 | + - Use Dart's built-in dart:convert package to parse the response. |
| 87 | +- Build a Recursive Schema Parser |
| 88 | + - Traverse the JSON response recursively. |
| 89 | + - For each node (key), determine: |
| 90 | + - Type: string, number, bool, object, array |
| 91 | + - Optional metadata (e.g., nullability, format hints) |
| 92 | + - Depth and parent-child relationships |
| 93 | + - Output a tree-like structure such as: |
| 94 | + ```json |
| 95 | + { |
| 96 | + "type": "object", |
| 97 | + "fields": [ |
| 98 | + {"key": "name", "type": "string"}, |
| 99 | + {"key": "age", "type": "number"}, |
| 100 | + {"key": "profile", "type": "object", "fields": [...]}, |
| 101 | + {"key": "posts", "type": "array", "itemType": "object", "fields": [...]} |
| 102 | + ] |
| 103 | + } |
| 104 | + ``` |
| 105 | + |
| 106 | +- Detect Patterns (Optional AI Help) |
| 107 | + - Apply heuristics or regex to detect: |
| 108 | + - Timestamps: ISO strings, epoch time |
| 109 | + - Prices: numeric + currency signs |
| 110 | + - Boolean flags: isActive, enabled, etc. |
| 111 | + - This helps in choosing smart widgets (e.g., Switch for booleans). |
| 112 | + |
| 113 | +- Create a Schema Class |
| 114 | + - Implement a Dart class (e.g., ParsedSchema) to store this structure. |
| 115 | + - This class will be passed into the UI generation logic in Step 2. |
| 116 | + |
| 117 | +- Add Support for Validation |
| 118 | + - Check if response is malformed or inconsistent (e.g., arrays with mixed types). |
| 119 | + - If invalid, show fallback UI or error. |
| 120 | + |
| 121 | +- Future Scope |
| 122 | + - Add XML support by using XML parsers. |
| 123 | + - Extend the parser to allow user overrides/custom schema mapping. |
| 124 | + |
| 125 | +#### Step 2: Design AI Agent Logic |
| 126 | + |
| 127 | +This step involves designing the core logic that maps the parsed API response schema to corresponding UI components. The AI agent will follow a hybrid approach: combining rule-based mapping with optional LLM-powered enhancement for smarter UI suggestions. |
| 128 | + |
| 129 | +##### 2.1 Rule-Based Mapping System |
| 130 | +To ensure fast and consistent results, we will first implement a simple rule-based system that maps specific JSON structures to Flutter widgets. This allows us to generate a basic layout even in environments where LLMs are not available or desirable. |
| 131 | + |
| 132 | +Example rules: |
| 133 | +- If the root is an array of objects → generate a DataTable |
| 134 | +- If the object contains mostly key-value pairs → generate a Card or Form |
| 135 | +- If fields include timestamps or numeric trends → suggest LineChart |
| 136 | +- If keys match common patterns like email, phone, price, etc. → render with appropriate widgets (TextField, Dropdown, Currency formatter) |
| 137 | + |
| 138 | +These mappings will be implemented using Dart classes and can be loaded from a YAML/JSON config file to support extensibility. |
| 139 | + |
| 140 | +##### 2.2 LLM-Powered Enhancements |
| 141 | +To go beyond static rules and provide smarter UI suggestions, we will integrate an LLM (e.g., Ollama locally or GPT via API). The LLM will receive the parsed schema and be prompted to: |
| 142 | +- Suggest the layout structure (vertical list, tabs, grouped cards, etc.) |
| 143 | +- Label fields more intuitively (e.g., product_id → "Product ID") |
| 144 | +- Reorder fields based on usage context |
| 145 | +- Suggest default values, placeholder text, or icons |
| 146 | + |
| 147 | +Prompt Example: |
| 148 | +```json |
| 149 | +{ |
| 150 | + "task": "Generate UI plan for API response", |
| 151 | + "schema": { |
| 152 | + "type": "object", |
| 153 | + "fields": [ |
| 154 | + {"name": "username", "type": "string"}, |
| 155 | + {"name": "email", "type": "string"}, |
| 156 | + {"name": "created_at", "type": "timestamp"} |
| 157 | + ] |
| 158 | + } |
| 159 | +} |
| 160 | +``` |
| 161 | + |
| 162 | +Expected LLM output: |
| 163 | +```json |
| 164 | +{ |
| 165 | + "layout": "vertical_card", |
| 166 | + "fields": [ |
| 167 | + {"label": "Username", "widget": "TextField"}, |
| 168 | + {"label": "Email", "widget": "TextField"}, |
| 169 | + {"label": "Signup Date", "widget": "DateDisplay"} |
| 170 | + ] |
| 171 | +} |
| 172 | +``` |
| 173 | + |
| 174 | +##### 2.3 Fallback and Configuration |
| 175 | +- If LLM call fails or is disabled (e.g., offline use), the system falls back to rule-based logic. |
| 176 | +- The user can toggle LLM mode in settings. |
| 177 | +- The response from LLM will be cached for repeat inputs to reduce latency and cost. |
| 178 | + |
| 179 | +##### 2.4 Customization Layer (Optional) |
| 180 | +After layout generation, users will be able to: |
| 181 | +- Preview different layout suggestions (from rule-based vs. LLM) |
| 182 | +- Select a layout and make field-level changes (hide/show, rename, rearrange) |
| 183 | +- Submit feedback for improving future suggestions (optional) |
| 184 | + |
| 185 | +#### Step 3: Generate and Render UI in Flutter |
| 186 | + |
| 187 | +Once the layout plan is decided (via rule-based mapping or LLM suggestion), the system will dynamically generate corresponding Flutter widgets based on the API response structure and content types. |
| 188 | + |
| 189 | +##### 3.1 Widget Mapping and Construction |
| 190 | + |
| 191 | +- For each field or group in the parsed schema, we map it to a predefined Flutter widget. Example mappings: |
| 192 | + - List of Objects → DataTable |
| 193 | + - Simple key-value object → Card, Column with Text widgets |
| 194 | + - String fields → TextField (if editable), or SelectableText |
| 195 | + - Number series over time → Line chart (e.g., using fl_chart package) |
| 196 | +- The widget structure will be built using standard Dart code with StatefulWidget or StatelessWidget, depending on interactivity. |
| 197 | +- |
| 198 | +Implementation Plan: |
| 199 | + |
| 200 | +- Create a WidgetFactory class that receives a layout plan and schema, and returns a Widget tree. |
| 201 | +- This factory will follow a clean design pattern to make it testable and modular. |
| 202 | +- Use Flutter’s json_serializable or custom classes to deserialize API responses into displayable values. |
| 203 | + |
| 204 | +##### 3.2 Dynamic Rendering in the App |
| 205 | + |
| 206 | +- The generated widget tree will be rendered in a dedicated “AI UI Preview” pane inside API Dash. |
| 207 | +- The rendering will be fully dynamic: when the schema or layout changes, the UI preview updates in real time. |
| 208 | +- This pane will support: |
| 209 | + - Light customization like toggling fields, reordering, hiding/showing |
| 210 | + - Live data preview using the actual API response |
| 211 | + |
| 212 | +Technical Flow: |
| 213 | + |
| 214 | +- When user clicks "AI UI Designer", a modal or new route opens with the UI preview panel. |
| 215 | +- This panel will: |
| 216 | + - Show the raw schema & layout (editable if needed) |
| 217 | + - Render the widget tree using Flutter's widget system |
| 218 | +- Any user adjustments will re-trigger the widget regeneration and re-render. |
| 219 | + |
| 220 | +##### 3.3 Preview and Debugging Tools |
| 221 | + |
| 222 | +- Add a “Developer Mode” that shows: |
| 223 | + - Schema tree |
| 224 | + - Widget mapping details |
| 225 | + - Generated Dart code (read-only) |
| 226 | +- This helps with debugging and refining layout logic. |
| 227 | + |
| 228 | +##### 3.4 Scalability Considerations |
| 229 | + |
| 230 | +- To keep UI rendering responsive: |
| 231 | + - Use lazy-loading for large JSON arrays (e.g., scrollable tables) |
| 232 | + - Avoid deep nesting: limit UI depth or use ExpansionTile for hierarchical views |
| 233 | + - Support pagination if list is too long |
| 234 | + |
| 235 | +By the end of this step, users should be able to preview their API response as a fully functional, dynamic UI inside API Dash — without writing a single line of Flutter code. |
| 236 | + |
| 237 | +#### Step 4: Export UI Code |
| 238 | + |
| 239 | +Once the user is satisfied with the generated and customized UI layout, the tool should allow them to export the UI as usable Flutter code, so it can be directly reused in their own projects. This step focuses on transforming the dynamic widget tree into clean, readable Dart code and offering convenient export options. |
| 240 | + |
| 241 | +##### 4.1 Code Generation Pipeline |
| 242 | + |
| 243 | +To generate Flutter code dynamically, we will: |
| 244 | +- Traverse the internal widget tree (from Step 3) |
| 245 | +- For each widget, generate corresponding Dart code using string templates |
| 246 | + - Example: a DataTable widget will generate its DataTable constructor and children rows |
| 247 | + - Use indentation and formatting to ensure readability |
| 248 | + |
| 249 | +Implementation Plan: |
| 250 | +- Create a CodeGenerator class responsible for converting widget definitions into raw Dart code strings. |
| 251 | +- Use prebuilt templates for common components: Card, Column, DataTable, etc. |
| 252 | +- Handle nested widgets recursively to maintain structure. |
| 253 | + |
| 254 | +##### 4.2 Export Formats |
| 255 | + |
| 256 | +We will support two export options: |
| 257 | +1.Raw Dart Code Export |
| 258 | +- Output the generated Dart code into a text area or preview pane |
| 259 | +- Allow users to: |
| 260 | + - Copy to clipboard |
| 261 | + - Download as .dart file |
| 262 | +- Highlight syntax for better UX (using a package like highlight) |
| 263 | + |
| 264 | +2.Optional JSON Layout Export |
| 265 | +- If we implement a config-driven rendering architecture, offer an export of the layout plan/schema as JSON |
| 266 | +- Useful for re-importing or using with a visual UI builder |
| 267 | + |
| 268 | +##### 4.3 Integration into API Dash |
| 269 | + |
| 270 | +- Add an "Export" button below the UI preview pane |
| 271 | +- When clicked, the generated code will be shown in a modal or new tab |
| 272 | +- Provide one-click buttons: |
| 273 | + - "Copy Code" |
| 274 | + - "Download Dart File" |
| 275 | + - (Optional) "Download Layout JSON" |
| 276 | + |
| 277 | +##### 4.4 Reusability and Developer Focus |
| 278 | + |
| 279 | +- Ensure that the exported code: |
| 280 | + - Is clean and idiomatic Dart |
| 281 | + - Can be copied directly into any Flutter project with minimal edits |
| 282 | + - Includes basic import statements and class wrappers if needed |
| 283 | +- Add helpful comments in the generated code (e.g., // This widget was generated from API response) |
| 284 | + |
| 285 | +##### 4.5 Challenges and Considerations |
| 286 | + |
| 287 | +- Ensuring valid syntax across nested widgets |
| 288 | +- Handling edge cases (e.g., empty fields, null values) |
| 289 | +- Optionally, offer theming/styling presets to match user preferences |
| 290 | + |
| 291 | +By the end of this step, users can instantly turn live API data into production-ready Flutter UI code, significantly reducing time spent on repetitive frontend scaffolding. |
| 292 | + |
| 293 | +#### Step 5: Integrate into API Dash |
| 294 | + |
| 295 | +The final step is to fully integrate the AI UI Designer into the API Dash application, so that users can seamlessly trigger UI generation from real API responses and interact with the entire pipeline — from data to UI preview to export — within the app. |
| 296 | + |
| 297 | +##### 5.1 Entry Point in UI |
| 298 | + |
| 299 | +We will add a new button or menu entry labeled “AI UI Designer” within the API response tab (or near the response preview area). |
| 300 | + |
| 301 | +- When a user executes an API call and gets a JSON response: |
| 302 | + - A floating action button or contextual menu becomes available |
| 303 | + - Clicking it opens the AI UI Designer pane |
| 304 | + |
| 305 | +Implementation Plan: |
| 306 | +- Extend the existing response panel UI to include a trigger button |
| 307 | +- Use a showModalBottomSheet() or a full-screen route to launch the designer |
| 308 | + |
| 309 | +##### 5.2 Internal Architecture and Flow |
| 310 | + |
| 311 | +The full integration involves multiple coordinated modules: |
| 312 | +- Trigger UI → (Button click) |
| 313 | +- JSON Parser Module (from Step 1) → Convert API response to schema |
| 314 | +- Mapping Logic (Step 2) → Rule-based and/or LLM-assisted UI mapping |
| 315 | +- Widget Tree Builder (Step 3) → Build live widget layout |
| 316 | +- Preview + Export UI (Step 4) → Let users customize and extract code |
| 317 | + |
| 318 | +Each module will be built as a reusable Dart service/class, and all UI logic stays within the API Dash UI tree. |
| 319 | + |
| 320 | +We’ll keep the architecture modular so the designer logic is isolated and testable. |
| 321 | + |
| 322 | +##### 5.3 Offline / Privacy-Friendly Support |
| 323 | + |
| 324 | +Since API Dash is a privacy-first local client, the AI agent should work entirely offline by default using lightweight LLMs such as Ollama, which can run locally. |
| 325 | + |
| 326 | +- If a user prefers using OpenAI or Anthropic APIs, provide optional settings to configure remote endpoints |
| 327 | +- Set Ollama as the default backend, and wrap LLM logic inside a service with interchangeable backends |
| 328 | + |
| 329 | +##### 5.4 User Flow Example |
| 330 | + |
| 331 | +- User sends API request in API Dash |
| 332 | +- JSON response is shown |
| 333 | +- User clicks “AI UI Designer” button |
| 334 | +- The parsed structure is shown with layout suggestions |
| 335 | +- User can preview UI, rearrange components, and customize styles |
| 336 | +- Once satisfied, user clicks “Export” |
| 337 | +- Dart code is generated and available to copy/download |
| 338 | + |
| 339 | +##### 5.5 Tests, Documentation & Maintenance |
| 340 | + |
| 341 | +- Add integration tests to validate: |
| 342 | + - Triggering and rendering behavior |
| 343 | + - Correct widget tree output |
| 344 | + - Export function accuracy |
| 345 | +- Document: |
| 346 | + - Each module (parsing, mapping, UI rendering, export) |
| 347 | + - Developer usage guide (in docs/) |
| 348 | +- Ensure all new code follows API Dash’s contribution style and linting rules |
| 349 | + |
| 350 | +By integrating into API Dash cleanly and modularly, this feature becomes a native part of the developer workflow — helping users transform any API into usable UI in seconds, without leaving the app. |
| 351 | + |
| 352 | +--- |
| 353 | + |
| 354 | +## Weekly Timeline (Tentative) |
| 355 | + |
| 356 | +| Week | Milestone | |
| 357 | +|---------------|---------------------------------------------------------------------------------------------| |
| 358 | +| Community Bonding | Join Discord, introduce myself, understand API Dash architecture, finalize scope with mentors | |
| 359 | +| Week 1 | Build recursive parser for JSON responses; test on static examples; output schema trees | |
| 360 | +| Week 2 | Extend parser to handle nested objects, arrays, and basic pattern recognition (e.g., timestamps) | |
| 361 | +| Week 3 | Implement rule-based schema-to-widget mapper; define mapping logic for tables, cards, forms | |
| 362 | +| Week 4 | Design widget data model and logic for translating schema into Flutter widget trees | |
| 363 | +| Week 5 | Develop dynamic Flutter widget generator; render `DataTable`, `Card`, `TextField`, etc. | |
| 364 | +| Week 6 | Build basic UI preview pane inside API Dash with user interaction support (e.g., toggles) | |
| 365 | +| Week 7 (Midterm Evaluation) | Submit code with parser + rule-based mapping + preview UI; receive mentor feedback | |
| 366 | +| Week 8 | Add layout customization features: visibility toggles, reordering, field labels | |
| 367 | +| Week 9 | Integrate basic Ollama-based LLM agent for field naming & layout suggestion | |
| 368 | +| Week 10 | Abstract LLM backend to support GPT/Anthropic alternatives via API config | |
| 369 | +| Week 11 | Implement code export: generate Dart source code, copy-to-clipboard & download options | |
| 370 | +| Week 12 | Optional: add JSON config export; polish UX and improve error handling | |
| 371 | +| Week 13 | Write documentation, developer setup guide, internal tests for each module | |
| 372 | +| Week 14 (Final Evaluation) | Final review, cleanup, feedback response, and submission | |
| 373 | + |
| 374 | +Thanks again for your time and guidance. I’ve already started studying the API Dash codebase and developer guide, and I’d love your feedback on this plan — does it align with your vision? |
| 375 | +If selected, I’m excited to implement this project. If this idea is already taken, I’m open to switching to another API Dash project that fits my background. |
0 commit comments