{"id":25857809,"url":"https://github.com/fareedkhan-dev/gemini-ai-copilot","last_synced_at":"2025-09-01T19:37:44.704Z","repository":{"id":216670029,"uuid":"741970951","full_name":"FareedKhan-dev/gemini-AI-copilot","owner":"FareedKhan-dev","description":"Intelligent Help for Efficient Programming","archived":false,"fork":false,"pushed_at":"2024-01-11T15:02:40.000Z","size":33,"stargazers_count":17,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-01T19:17:53.416Z","etag":null,"topics":["chatgpt","copilot","gemini","github-copilot","huggingface","llm"],"latest_commit_sha":null,"homepage":"https://medium.com/@fareedkhandev/create-copilot-inside-your-notebooks-that-can-chat-with-graphs-write-code-and-more-e9390e2b9ed8","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FareedKhan-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-11T13:47:59.000Z","updated_at":"2024-09-07T21:10:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"d23d9b5c-8905-473e-b195-bfccebc37520","html_url":"https://github.com/FareedKhan-dev/gemini-AI-copilot","commit_stats":null,"previous_names":["fareedkhan-dev/create-copilot-in-your-notebooks","fareedkhan-dev/gemini-ai-copilot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FareedKhan-dev/gemini-AI-copilot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FareedKhan-dev%2Fgemini-AI-copilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FareedKhan-dev%2Fgemini-AI-copilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FareedKhan-dev%2Fgemini-AI-copilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FareedKhan-dev%2Fgemini-AI-copilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FareedKhan-dev","download_url":"https://codeload.github.com/FareedKhan-dev/gemini-AI-copilot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FareedKhan-dev%2Fgemini-AI-copilot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273181931,"owners_count":25059808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-01T02:00:09.058Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatgpt","copilot","gemini","github-copilot","huggingface","llm"],"created_at":"2025-03-01T19:17:55.588Z","updated_at":"2025-09-01T19:37:44.410Z","avatar_url":"https://github.com/FareedKhan-dev.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Create Copilot inside your notebooks that can chat with graphs, write code and more\n\n\u003cimg src=\"https://cdn-images-1.medium.com/max/2904/1*DETUd5sgj8GAQAVvLMrkEQ.png\" width=\"600\"\u003e\n\nThe above is an example of one of the copilot features that you are going to build.%graphsignals to our copilot that I need to ask question related to graphs. It can take a cell reference, such as --in16, which contains the graph we need to analyze. Also, the input prompt specifies what information you need to ask about the graph, and it outputs accurate results. It can operate in Anaconda Jupyter Notebooks, VS Code Notebooks, Jupyter Lab, or any local notebook environment you work in.\n\n## Short Story\n\n[GitHub Copilot](https://github.com/features/copilot) is free for verified students, teachers, and maintainers of popular open-source projects. Meanwhile, [Google](https://cloud.google.com/duet-ai?hl=en) is soon expected to release  its own version based on Gemini, a recently launched multi-model, but it will likely require a budget-friendly subscription. \n\nWhat if you don’t fall into any category eligible for GitHub Copilot or you’re not in the mood to pay for Google’s future Copilot release?\n\nI recently explored a project by [Jupyter AI](https://jupyter-ai.readthedocs.io/en/latest/) that allows you to code through AI, depending on open-source LLM or the OpenAI API. However, a challenge arises with the pricing or suboptimal performance of the open-source LLM. Although it is good, Many of us rely on ChatGPT while coding. What sets Gemini Multi-Model apart is that it provides a free API and a large context window. I used the opportunity and decided to build a Copilot on top of it to test its capabilities.\n\n## Setting the stage\n\nTo create features of our Copilot, the first step is to initialize Gemini MultiModel. For that, you need to install a few libraries:\n```bash\n# Install necessary libraries\npip install -q -U google-generativeai grpcio grpcio-tools\n```\nNow, we need to import the necessary library that will fetch Gemini LLM API calls and instantiate the required API key.\n```python\n# Import the Google Generative AI library\nimport google.generativeai as genai\n\n# Initialize the GenerativeModel with 'gemini-pro' for chat and code\ntext_model = genai.GenerativeModel('gemini-pro')\n\n# Initialize the GenerativeModel with 'gemini-pro-vision' for graphs\nimage_model = genai.GenerativeModel('gemini-pro-vision')\n\n# Configure the library with your API key\ngenai.configure(api_key=\"Your-API-key\")\n```\nWe have loaded two models, gemini-pro, which serves as our text model for generating code or engaging in code-related conversations, and gemini-pro-vision, which will be used to manage image-related features of our Copilot. You can obtain your API key from [here](https://makersuite.google.com/app/apikey) for free. Next, we need to import the library that we will be using to create Copilot functions.\n```python\n# Regular expression for pattern matching\nimport re\n\n# IPython for working with IPython environment\nimport IPython\n\n# OS for interacting with the operating system\nimport os\n\n# JSON for working with JSON data\nimport json\n\n# Base64 for encoding and decoding base64 data\nimport base64\n\n# Image class from IPython.display for displaying images\nfrom IPython.display import Image\n\n# register_line_magic for registering custom magic commands\nfrom IPython.core.magic import register_line_magic\n```\nLet’s start coding a simple feature of our Copilot, which is to chat. The reason for starting with this feature is that it will make it easier to understand later code when we build more complex features.\n\n## Simple Chat Feature\n\nYou are coding in your notebooks, and then you realize you need to ask something to ChatGPT. To avoid switching to a browser tab for chatting, we will create a chat feature that allows you to chat right next to your code cell. Our “chat” function takes one input, which is our prompt, and in response, the Gemini text model will provide an answer.\n```python\n# Registering a Jupyter Notebook magic command named 'chat'\n@register_line_magic\ndef chat(contents):\n    # Generating a response using the 'generate_content' method of the 'text_model' object\n    # The method takes a formatted string containing the provided 'contents'\n    response = text_model.generate_content(f'''\n                                    Answer the question in a short quick readable paragraph, dont provide answer in any format or code\n                                    {contents}\n                                    ''').text\n\n    # Printing the generated response to the output\n    print(response)\n```\nthere are two important lines in our chat function, one is@register_line_magic decorator. It will help us to call our function with %chat rather than chat( ). This makes it more like an AI-like feel, although this is not necessary. The second important part is the prompt template that is used. The reason for choosing this prompt is that Gemini has a habit to generate chat responses in markdown format most of the time. Therefore, it is necessary to instruct Gemini that the response must not be in markdown or code format. You can update the prompt template based on your needs.\n\nYou can use the “chat” feature in any of your code cells. For this, you need to pass %chat [your_question], and it will print the response.\n```python\n# Running Chat Feature\n%chat What are some useful libraries for coding neural networks in Python\n```\n![how chat function works](https://cdn-images-1.medium.com/max/5036/1*o2RJdTFfR-hg0A-pdn3I2w.png)\n\n## Chat with Code Feature\n\nThis feature gives you the ability to chat with your code within your notebook, you don’t have to use ChatGPT separately to go there, paste the code, and ask questions. The “Chat with Code” function requires two things, your prompt and the code on which you want to ask a question.\n```python\n# Define a function named 'chatn' that takes 'contents' as a parameter\n@register_line_magic\ndef chatn(contents):\n    try:\n        # Use regular expression to find all occurrences of '--in' followed by digits in 'contents'\n        numbers = [int(match.group().replace('--in', '')) for match in re.finditer(r'--in\\d+', contents)]\n\n        # Remove the found pattern '--in\\d+' from 'contents'\n        contents_filter = re.sub(r'--in\\d+', '', contents)\n\n        # Check if there are any references (numbers) found\n        if numbers:\n            # Retrieve the current cell contents for all references using the IPython 'In' variable\n            current_cell_contents = [In[number] for number in numbers]\n\n            # Combine the contents into a single string with line breaks\n            combined_content = '\\n'.join(current_cell_contents)\n\n            # Execute the text_model to generate response\n            response = text_model.generate_content(f'''\n                                            {combined_content}\n                                            Answer the question in a short readable paragraph, don't provide the answer in any format or code\n                                            {contents_filter}\n                                            ''').text\n\n            # Print the generated response\n            print(response)\n\n        else:\n            # Print an error message if no references are found\n            print('Please provide a correct codeblock reference.')\n\n    except Exception as e:\n        # Print an error message if an exception occurs\n        print('Please provide a correct codeblock reference.')\n```\nLet’s understand our chatn function. The try-except block is used to avoid any errors in case you didn't pass a cell reference in it. The first thing we do is use regex to extract all --in patterns for cell references and clean the prompt to avoid passing it in the Gemini API. I have used the --in format for cell number references because it is easier to remember. In[number] will fetch all the code from the cell numbers you mentioned in your prompt, merge it, and pass it along with your cleaned prompt. You can pass as many cell references as you want, and there is no need to order them.\n\nTo use the “Chat with Code” feature, you need to pass %chatn [cell references][your_question], and it will print the response.\n```python\n# Running Chat with Code Feature\n%chatn --in17 --in11 I sum element wise but it is not working\n```\n![How chat with code feature works](https://cdn-images-1.medium.com/max/5508/1*YrkT6-7J_DJyzXdQ3dsHHA.png)\n\nYou may think it is a very easy question, but it will work on more complex code.\n\n## Generate Code Feature\n\nGenerating code is one of the most important features that you will most probably be using every minute. There are two versions we will be coding, one is to generate code based on your prompt, and the second is to generate relational code, which you will see in the next section. The simple “Generate Code” function takes one input, which is your prompt, and it will generate code in the very next cell.\n```python\n# Register a custom line magic command\n@register_line_magic\ndef code(contents):\n\n    # Get the IPython shell instance\n    from IPython.core.getipython import get_ipython\n    shell = get_ipython()\n\n    # Generate code content using a text model\n    response = text_model.generate_content(f'''\n                                    write a python code that and dont answer anything else\n                                    {contents}\n                                    ''').text\n\n    # Remove ``` and python from the response\n    response = response.replace('```', '')\n\n    # Clean up the response\n    response = response.replace('python', '').strip('\\n').rstrip('\\n').replace('```python', '')\n\n    # Prepare payload for setting the next input\n    payload = dict(\n        source='set_next_input',\n        text=response,\n        replace=False,\n    )\n\n    # Write the payload to the IPython shell\n    shell.payload_manager.write_payload(payload, single=False)\n```\nIn our code function, the get_ipython module is responsible for generating code right next to the current cell where you provide the prompt. Cleaning is necessary because the generated Python code contains some extra characters that need to be removed. The payload is going to take the response of our Gemini model and create a new cell to paste it.\n\nTo use the “Generate Code” feature, you need to pass %code [your_prompt], and it will create your requested code in the next cell.\n```python\n# Running Generate Code Feature\n%code load my data.csv and take random sample of 100 rows\n```\n![how generate code feature works](https://cdn-images-1.medium.com/max/2000/1*txPswnpkMIZ50d77NAO_Sw.gif)\n\n## Generate Relational Code Feature\n\nThe relational coding feature is very important because most of the time, you will likely be coding on top of some other code. The good thing is that this feature is same as what we use in the chatn function. The “Relational Code” function requires two things, your prompt and the code which you want to relate.\n```python\n# Define a function named 'coden' that takes 'contents' as a parameter\n@register_line_magic\ndef coden(contents):\n    try:\n\n        # Get the IPython shell instance\n        from IPython.core.getipython import get_ipython\n        shell = get_ipython()\n\n        # Use regular expression to find all occurrences of '--in' followed by digits in 'contents'\n        numbers = [int(match.group().replace('--in', '')) for match in re.finditer(r'--in\\d+', contents)]\n\n        # Remove the found pattern '--in\\d+' from 'contents'\n        contents_filter = re.sub(r'--in\\d+', '', contents)\n\n        # Check if there are any references (numbers) found\n        if numbers:\n            # Retrieve the current cell contents for all references using the IPython 'In' variable\n            current_cell_contents = [In[number] for number in numbers]\n\n            # Combine the contents into a single string with line breaks\n            combined_content = '\\n'.join(current_cell_contents)\n\n            # Execute the text_model to generate code\n            response = text_model.generate_content(f'''{combined_content}\n                                                  {contents_filter}\n                                                  please write Python code and don't answer anything else, dont provide output of the code\n                                                  ''').text\n            # Remove ``` and python from the response\n            response = response.replace('```', '')\n\n            # Clean up the response\n            response = response.replace('python', '').strip('\\n').rstrip('\\n').replace('```python', '')\n\n            # Prepare payload for setting the next input\n            payload = dict(\n                source='set_next_input',\n                text=response,\n                replace=False,\n            )\n\n            # Write the payload to the IPython shell\n            shell.payload_manager.write_payload(payload, single=False)\n\n        else:\n            # Print an error message if no references are found\n            print('Please provide a correct codeblock reference.')\n\n    except Exception as e:\n        # Print an error message if an exception occurs\n        print('Please provide a correct codeblock reference.')\n```\npayload and cleaning text code are used from the code function, while rest of the code is taken from the chatn function. To use the “Relational Code” feature, you need to pass %coden [cell references] [your_prompt], and it will create your requested code in the next cell. You can pass as many cell references as you want.\n\nTo use the “Relational Code” feature, you need to pass %code [cell_references] [your_prompt], and it will create your requested code in the next cell.\n```python\n# Running Relational Code Feature\n%coden --in83 --in76 multiply y with each x item\n```\n![How relational code works](https://cdn-images-1.medium.com/max/2000/1*YF_REtoDAM6Aw4MSP7xuQg.gif)\n\n## Chat with Graph Feature\n\nThis feature is going to be a complicated one. Let’s build it step by step. First, you have to programmatically fetch the filename in which you are writing code.\n```python\n# Import the IPython module\nimport IPython\n\n# Import the os module for interacting with the operating system\nimport os\n\n# Extract the local variables from the IPython environment\nfile_path = IPython.extract_module_locals()[1]['__vsc_ipynb_file__']\n\n# Extract the base name (file name) from the file path\nfile_name = os.path.basename(file_path)\n\n# Return the file name\nprint(file_name)\n\n\n############### OUTPUT ###############\n\n      myfile.ipynb\n  \n############### OUTPUT ############### \n```\nThis would only work in VSCode but not in Jupyter Lab or Anaconda notebooks. If you don’t use VSCode, you can skip this step because our final code will have this ability, allowing you to pass the filename manually in your prompt. Next, we need to load this notebook in json.\n```python\n# Import the json module for working with JSON data\nimport json\n\nimport base64\nfrom IPython.display import Image\n\n# Open the notebook file in read mode\nwith open(file_name, \"r\") as f:\n    # Load the content of the notebook file as JSON\n    notebook_json = json.load(f)\n```\nOnce we load the notebook file, we can loop through the data and fetch that specific cell output where our graph exists. Suppose our graph exist at cell number 65.\n```python\n# Import the base64 module for encoding and decoding base64 data\nimport base64\n\n# Import the Image class from the IPython.display module for displaying images in an IPython environment\nfrom IPython.display import Image\n\n####### Cell Number #######\ncell_number = 65\n\n# Find the cell in the notebook JSON with execution count equal to 65\nelement = next(cell for cell in notebook_json['cells'] if 'execution_count' in cell and cell['execution_count'] == cell_number)\n\n# Extract the base64-encoded PNG image data from the cell's outputs\nimage_data = element['outputs'][0]['data']['image/png']\n\n# Decode the base64-encoded image data\nimage_base64 = base64.b64decode(image_data)\n\n# Save the decoded image data as a JPG file in the local directory\nwith open('img_code.jpg', 'wb') as f:\n    f.write(image_base64)\n\n# Assuming 'Image' is imported from the IPython.display module, load the saved image using the Image() function\nimage = Image(filename='img_code.jpg')\n```\nGemini image model only takes images that are locally stored, you have to save that extracted graph and load the image using the Image module. we can use this approach to build our chat with the graph feature. It will take two inputs, one is the prompt, and the second is the cell reference which contains the graph.\n```python\n# Try to get the current notebook filename using IPython\ntry:\n    file_name = IPython.extract_module_locals()[1]['__vsc_ipynb_file__']\n\n    # Extract the base name (file name) from the file path\n    file_name = os.path.basename(file_name)\n\nexcept:\n    # If an exception occurs, print a message indicating no file\n    file_name = None\n\n# Register a custom magic command for the Jupyter notebook\n@register_line_magic\ndef graph(contents):\n    # Search for the pattern --in\u003cnumber\u003e\n    pattern = re.compile(r'--in\\d+')\n\n    # Find the first occurrence of the pattern in the contents\n    match = pattern.search(contents)\n\n    # Remove the pattern from the contents\n    contents_filter = pattern.sub('', contents)\n\n    # Define a new pattern for --filename=\u003cword\u003e\n    pattern_f = re.compile(r'--filename=\\w+')\n\n    # Find the first occurrence of the new pattern in the contents\n    match_f = pattern_f.search(contents)\n\n    # Remove the new pattern from the filtered contents\n    contents_filter = pattern_f.sub('', contents_filter)\n\n    # If the --in\u003cnumber\u003e pattern is found\n    if match:\n        # Get the global variable file_name\n        global file_name\n\n        # Check if file_name is available from the IPython magic command\n        if file_name:\n            notebookName = file_name\n            with open(notebookName, \"r\") as f:\n                # Load the notebook JSON data\n                notebook_json = json.load(f)\n        elif match_f:\n            # Extract the filename from the --filename=\u003cword\u003e pattern\n            match_c = match_f.group().replace('--filename=', '')\n            notebookName = match_c + '.ipynb'\n            with open(notebookName, \"r\") as f:\n                # Load the notebook JSON data\n                notebook_json = json.load(f)\n        else:\n            # If neither file_name nor --filename=\u003cword\u003e is provided, print an error message\n            return 'Please provide a correct file path using --filename=\u003cfilename\u003e.ipynb, e.g., --filename=mycode.ipynb'\n\n        # Extract the number from the --in\u003cnumber\u003e pattern\n        number = int(match.group().replace('--in', ''))\n\n        # Find the cell with the specified execution_count in the notebook JSON data\n        element = next(cell for cell in notebook_json['cells'] if 'execution_count' in cell and cell['execution_count'] == number)\n\n        # Extract image data from the cell's output\n        image_data = element['outputs'][0]['data']['image/png']\n\n        # Decode base64 image data\n        image_base64 = base64.b64decode(image_data)\n\n        # Save the image in the local directory as img_code.jpg\n        with open('img_code.jpg', 'wb') as f:\n            f.write(image_base64)\n\n        # Load the image using the Image() function\n        image = Image(filename='img_code.jpg')\n\n        # extract information using image model\n        response = image_model.generate_content([contents_filter, image])\n        print(response.text)\n    else:\n        # If --in\u003cnumber\u003e pattern is not found, print an error message\n        print('Please provide a correct code block reference.')\n```\nConversations with graphs require the image_model, and we have performed text pattern extraction for filename in the same way as we have done for --in cell references. To use the “Chat with Graph” feature, you need to pass %graph [single_cell_reference] [your_prompt] [filename], and it will print the response.\n```python\n# Running Chat with Image Feature\n%coden --in143 how many outliers are there\n```\n![How chat with graph feature works (working in jupyterLab, filename is important)](https://cdn-images-1.medium.com/max/5224/1*RSu32nntj2cycHyJT-E70g.png)\n\n![VS Code Result Chat with graph feature (no filename needed)](https://cdn-images-1.medium.com/max/4384/1*A5t7R-yISH1ftb1ssTx3vg.png)\n\n## Chat with Files Feature\n\nSmall-scale projects often depend on multiple Python files. This feature is helpful when you want to chat with py files within your notebook instead of inspecting their code one by one. The “Chat with Files” function requires two things, your prompt and the folder name which contain py files.\n```python\n# Register a custom magic command for IPython\n@register_line_magic\ndef chatf(contents):\n    try:\n        # Parse the folder name from the provided argument\n        folder_match = re.search(r'--folder_name=(\\S+)', contents)\n        if not folder_match:\n            # Print an error message if folder name is not provided in the correct format\n            print(\"Please provide a valid folder name using the format '--folder_name=\u003cfolder_name\u003e'.\")\n            return\n\n        # Extract the folder name from the regex match\n        folder_name = folder_match.group(1)\n\n        # Get a list of Python files in the specified folder\n        python_files = [file for file in os.listdir(folder_name) if file.endswith('.py')]\n\n        # Check if any Python files were found\n        if not python_files:\n            print(f\"No Python files found in the folder '{folder_name}'.\")\n            return\n\n        # Initialize an empty string to store combined content\n        combined_content = \"\"\n\n        # Iterate through each Python file in the folder\n        for file_name in python_files:\n            with open(os.path.join(folder_name, file_name), 'r') as file:\n                # Read the content of the file\n                file_content = file.read()\n\n                # Format the combined content with file name and its code\n                combined_content += f\"\\nfile: {file_name}\\n{file_content}\\n{'_'*15}\\n\"\n\n        # Remove the pattern of folder from the input contents\n        contents_filter = re.sub(r'--folder_name=\\S+', '', contents)\n\n        # Generate content using a model and display the response\n        response = text_model.generate_content(f'''\n                                        {combined_content}\n                                        Answer the question in a short readable paragraph, don't provide the answer in any format or code\n                                        {contents_filter}\n                                        ''').text\n        print(response)\n\n    except Exception as e:\n        # Print an error message if an exception occurs\n        print(f'An error occurred: {str(e)}')\n```\nThe chatf function will take a folder reference, similar to the way we provide a cell reference. It will then merge all file names with their content, and rest of the code will remain the same which we use in our chatn function. To use the “Chat with Files” feature, you need to pass %chatf [single_folder_reference] [your_prompt], and it will print the response.\n```python\n# Running chat with files Feature\n%chatf --folder_name=myfolder How to clean and format data\n```\n![How chat with files feature works](https://cdn-images-1.medium.com/max/9188/1*eks6A3gbWwfcnvQyOZHTjQ.png)\n\n## Compiling the Features\n\nYou don’t want to type each feature function again and again for different projects, it will be a time-consuming task. What you can do is simply merge all your functions in one py file. I named it my_copilot.py, and then I can simply import this module and use any feature from it.\n```python\n# Importing all features of your copilot\nfrom my_copilot import *\n\n# using generate code feature\n%code load my data.csv file using pandas\n```\nThere are many more features you can create with the help of the knowledge and code you have seen in this blog. For example, you can create a multi-graph chat, or instead of chatting with files, you can extend this to code with files and more. The cool thing is that the majority of the tasks you will be creating contain most of the code that you have already seen here.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffareedkhan-dev%2Fgemini-ai-copilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffareedkhan-dev%2Fgemini-ai-copilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffareedkhan-dev%2Fgemini-ai-copilot/lists"}