In this tutorial, we introduce the implementation of the TinyDev class, a minimal but powerful AI code generation tool that uses the Gemini API to transform simple applications of complete structured applications. Designed to operate effortlessly NotebookTinyDev follows a clean three -phase workflow – Plan → Files → Code – to guarantee consistency, functionality and modular design. Whether it is a web interface, a backend python or a utility script, TinyDev allows users to describe their project in natural language and to receive loans to use code to use, generated automatically and saved in an organized directory. This makes it an ideal starting point for rapid prototyping or learning how AI can help in development tasks.
import google.generativeai as genai
import os
import json
import re
from pathlib import Path
from typing import List, Dict
We start by importing essential libraries required for the TinyDev code generator. Google.generativati is used to interact with the Gemini API, while standard libraries like OS, JSON and RE support file management and word processing. The journey and type of typing of the Own file operations and better readability of the code.
class TinyDev:
"""
TinyDev: A lightweight AI code generator inspired by smol-dev
Uses Gemini API to generate complete applications from simple prompts
Follows the proven three-phase workflow: Plan → Files → Code
"""
def __init__(self, api_key: str, model: str = "gemini-1.5-flash"):
genai.configure(api_key=api_key)
self.model = genai.GenerativeModel(model)
self.generation_config = {
'temperature': 0.1,
'top_p': 0.8,
'max_output_tokens': 8192,
}
def plan(self, prompt: str) -> str:
"""
Phase 1: Generate project plan and shared dependencies
Creates the foundation for consistent code generation
"""
planning_prompt = f"""As an AI developer, you’re building a tool that automatically generates code tailored to the user’s needs.
the program you are writing is based on the following description:
{prompt}
the files we write will be generated by a python script. the goal is for us to all work together to write a program that will write the code for the user.
since we are working together, we need to understand what our shared dependencies are. this includes:
- import statements we all need to use
- variable names that are shared between files
- functions that are called from one file to another
- any other shared state
this is the most critical part of the process, if we don't get this right, the generated code will not work properly.
please output a markdown file called shared_dependencies.md that lists all of the shared dependencies.
the dependencies should be organized as:
1. shared variables (globals, constants)
2. shared functions (function signatures)
3. shared classes (class names and key methods)
4. shared imports (modules to import)
5. shared DOM element ids (if web project)
6. shared file paths/names
be EXHAUSTIVE in your analysis. every file must be able to import or reference these shared items."""
response = self.model.generate_content(
planning_prompt,
generation_config=self.generation_config
)
return response.text
def specify_file_paths(self, prompt: str, shared_deps: str) -> List(str):
"""
Phase 2: Determine what files need to be created
"""
files_prompt = f"""As an AI developer, you’re building a tool that automatically generates code tailored to the user’s needs.
the program:
{prompt}
the shared dependencies:
{shared_deps}
Based on the program description and shared dependencies, return a JSON array of the filenames that should be written.
Only return the JSON array, nothing else. The JSON should be an array of strings representing file paths.
For example, for a simple web app you might return:
("index.html", "styles.css", "script.js")
For a Python project you might return:
("main.py", "utils.py", "config.py", "requirements.txt")
JSON array:"""
response = self.model.generate_content(
files_prompt,
generation_config=self.generation_config
)
try:
json_match = re.search(r'\(.*?\)', response.text, re.DOTALL)
if json_match:
files = json.loads(json_match.group())
return (f for f in files if isinstance(f, str))
else:
lines = (line.strip() for line in response.text.split('\n') if line.strip())
files = ()
for line in lines:
if '.' in line and not line.startswith('#'):
file = re.sub(r'(^\w\-_./)', '', line)
if file:
files.append(file)
return files(:10)
except Exception as e:
print(f"Error parsing files: {e}")
return ("main.py", "README.md")
def generate_code_sync(self, prompt: str, shared_deps: str, filename: str) -> str:
"""
Phase 3: Generate code for individual files
"""
code_prompt = f"""As an AI developer, you’re building a tool that automatically generates code tailored to the user’s needs..
the program:
{prompt}
the shared dependencies:
{shared_deps}
Please write the file {filename}.
Remember that your job is to write the code for {filename} ONLY. Do not write any other files.
the code should be fully functional. meaning:
- all imports should be correct
- all variable references should be correct
- all function calls should be correct
- the code should be syntactically correct
- the code should be logically correct
Make sure to implement every part of the functionality described in the program description.
DO NOT include ``` code fences in your response. Return only the raw code.
Here is the code for {filename}:"""
response = self.model.generate_content(
code_prompt,
generation_config=self.generation_config
)
code = response.text
code = re.sub(r'^```(\w)*\n', '', code, flags=re.MULTILINE)
code = re.sub(r'\n```$', '', code, flags=re.MULTILINE)
return code.strip()
def create_app(self, prompt: str, output_dir: str = "/content/generated_app") -> Dict:
"""
Main workflow: Transform a simple prompt into a complete application
"""
print(f"🚀 TinyDev workflow starting...")
print(f"📝 Prompt: {prompt}")
print("\n📋 Step 1: Planning shared dependencies...")
shared_deps = self.plan(prompt)
print("✅ Dependencies planned")
print("\n📁 Step 2: Determining file structure...")
file_paths = self.specify_file_paths(prompt, shared_deps)
print(f"📄 Files to generate: {file_paths}")
Path(output_dir).mkdir(parents=True, exist_ok=True)
print(f"\n⚡ Step 3: Generating {len(file_paths)} files...")
results = {
'prompt': prompt,
'shared_deps': shared_deps,
'files': {},
'output_dir': output_dir
}
with open(Path(output_dir) / "shared_dependencies.md", 'w') as f:
f.write(shared_deps)
for filename in file_paths:
print(f" 🔧 Generating {filename}...")
try:
code = self.generate_code_sync(prompt, shared_deps, filename)
file_path = Path(output_dir) / filename
file_path.parent.mkdir(parents=True, exist_ok=True)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(code)
results('files')(filename) = code
print(f" ✅ {filename} created ({len(code)} chars)")
except Exception as e:
print(f" ❌ Error generating {filename}: {e}")
results('files')(filename) = f"# Error: {e}"
readme = f"""# Generated by TinyDev (Gemini-Powered)
## Original Prompt
{prompt}
## Generated Files
{chr(10).join(f'- {f}' for f in file_paths)}
## About TinyDev
TinyDev is inspired by smol-ai/developer but uses free Gemini API.
It follows the proven three-phase workflow: Plan → Files → Code
## Usage
Check individual files for specific usage instructions.
Generated on: {os.popen('date').read().strip()}
"""
with open(Path(output_dir) / "README.md", 'w') as f:
f.write(readme)
print(f"\n🎉 Complete! Generated {len(results('files'))} files in {output_dir}")
return results
The TinyDev class summarizes the complete logic of a code generator fueled in AI using the Gemini API. It implements a structured three -phase workflow: first, it analyzes the user prompt to generate shared dependencies (plan); Then, it identifies the necessary files for the application (specify_file_paths); And finally, it generates a functional code for each file individually (generate_code_sync). The CREATE_APP method brings together while orchestrating the complete application generation pipeline and recording the results, including code files and a detailed reader, in a specified output directory, offering a ready -to -use application scaffolding from a single prompt.
def demo_tinydev():
"""Demo the TinyDev code generator"""
api_key = "Use Your API Key here"
if api_key == "YOUR_GEMINI_API_KEY_HERE":
print("❌ Please set your Gemini API key!")
print("Get one free at: https://makersuite.google.com/app/apikey")
return None
tiny_dev = TinyDev(api_key)
demo_prompts = (
"a simple HTML/JS/CSS tic tac toe game",
"a Python web scraper that gets the latest news from multiple sources",
"a responsive landing page for a local coffee shop with contact form",
"a Flask REST API for managing a todo list",
"a JavaScript calculator with a modern UI"
)
print("🤖 TinyDev - AI Code Generator")
print("=" * 50)
print("Inspired by smol-ai/developer, powered by Gemini API")
print(f"Available demo projects:")
for i, prompt in enumerate(demo_prompts, 1):
print(f"{i}. {prompt}")
demo_prompt = demo_prompts(0)
print(f"\n🎯 Running demo: {demo_prompt}")
try:
results = tiny_dev.create_app(demo_prompt)
print(f"\n📊 Results Summary:")
print(f" 📝 Prompt: {results('prompt')}")
print(f" 📁 Output: {results('output_dir')}")
print(f" 📄 Files: {len(results('files'))}")
print(f"\n📋 Generated Files:")
for filename in results('files').keys():
print(f" - {filename}")
if results('files'):
preview_file = list(results('files').keys())(0)
preview_code = results('files')(preview_file)
print(f"\n👁️ Preview of {preview_file}:")
print("-" * 40)
print(preview_code(:400) + "..." if len(preview_code) > 400 else preview_code)
print("-" * 40)
print(f"\n💡 This uses the same proven workflow as smol-ai/developer!")
print(f"📂 Check {results('output_dir')} for all generated files")
return results
except Exception as e:
print(f"❌ Demo failed: {e}")
return None
The Demo_TonyDev () function presents TinyDev's capacities by performing a predefined demo using one of the many samples prompts, such as the generation of a TIC TAC TAC game or a Python News scraper. It initializes the TinyDev class with an API Gemini key, selects the first invite in a list of project ideas and guides the user via the full code generation pipeline, including the planning of shared dependencies, the definition of the file structure and the generation of code. After the execution, it sums up the output, previews an example of a file and points to the directory where the complete application has been saved.
def interactive_tinydev():
"""Interactive version where you can try your own prompts"""
api_key = input("🔑 Enter your Gemini API key: ").strip()
if not api_key:
print("❌ API key required!")
return
tiny_dev = TinyDev(api_key)
print("\n🎮 Interactive TinyDev Mode")
print("Type your app ideas and watch them come to life!")
while True:
prompt = input("\n💭 Describe your app (or 'quit'): ").strip()
if prompt.lower() in ('quit', 'exit', 'q'):
print("👋 Goodbye!")
break
if prompt:
try:
results = tiny_dev.create_app(prompt, f"/content/app_{hash(prompt) % 10000}")
print(f"✅ Success! Check {results('output_dir')}")
except Exception as e:
print(f"❌ Error: {e}")
print("🎬 TinyDev - AI Code Generator Ready!")
print("Inspired by smol-ai/developer, powered by free Gemini API")
print("\nTo run demo: demo_tinydev()")
print("To try interactive mode: interactive_tinydev()")
The interactive_tinydev () function allows users to generate applications from their personalized guests in real time. After entering a valid gemini API key, users can describe any application idea and TinyDev will automatically develop the project, code, structure and support for files. The process continues in a loop until the user hits “leave”. This interactive mode allows practical experimentation and rapid prototyping from natural language descriptions.
Finally, the call Demo_tinydev () performs a predefined demonstration of TinyDev using an example of an application prompt. He travels through the full workflow, planning, creating file structure and code generation, to show how the tool automatically builds a complete application from a simple idea.
In conclusion, TinyDev Class demonstrates the potential for using AI to automate the scaffolding of applications with remarkable precision and efficiency. By decomposing the code generation process into intuitive phases, it guarantees that the outputs are logically healthy, well structured and aligned with the intention of the user. Whether you explore new application ideas or seek to accelerate development, TinyDev provides a light and friendly solution powered by Gemini models. It is a practical tool for developers who seek to integrate AI into their workflow without complexity or unnecessary general costs.
Discover the Notebook here. All the merit of this research goes to researchers in this project. Also, don't hesitate to follow us Twitter And don't forget to join our Subseubdredit 100k + ml and subscribe to Our newsletter.
Sana Hassan, consulting trainee at Marktechpost and double -degree student at Iit Madras, is passionate about the application of technology and AI to meet the challenges of the real world. With a great interest in solving practical problems, it brings a new perspective to the intersection of AI and real life solutions.
