deep learning graphic - circuit board that looks like a brain

AWS CodeWhisperer - ML Augmented Development (3 of 3)

In the previous blog we talked about ChatGPT and went through some examples on how to use it to help develop solutions. Today I'm going to do a similar experiement with AWS CodeWhisperer. 

AWS CodeWhisperer was released in preview in June 2022 as a ML powered developer productivity tool. With CodeWhisperer you provide a prompt via a code comment. Then CodeWhisperer reads the comment and provides a line or segment of code that best matches what you were trying to achieve.

Experiments:

We started very similar to ChatGPT. With a random walk. 

I provided several prompts long the way but I ended up with

import random
import matplotlib.pyplot as plt
import numpy as np
import math

#a function for a random walk (prompt)
def random_walk(n):
   x = 0
   y = 0
   for i in range(n):
       (dx, dy) = random.choice([(0,1), (0,-1), (1,0), (-1,0)])
       x += dx
       y += dy
   return (x,y)

#a function for a random walk displayed in matplotlib (prompt)
def random_walk_plot(n):
   x = []
   y = []
   for i in range(n):
       (x1, y1) = random_walk(1)
       x.append(x1)
       y.append(y1)
   plt.plot(x, y, 'o')
   plt.show()

random_walk_plot(200)

The interesting thing about AWS CodeWhisperer is that it learned from the previous section and reused the function below. This context awareness is incredibly helpful. Unfortunately this function doesn’t really plot a random walk with n steps. Instead it plots n walks 1 step from (0,0). These kinds of small logic bugs are pretty frequent in all the ML Programming Tools that I’ve tested. 

 

Next I tried to create a lambda function to pull a message from SQS and sent it to MailChimp

a lambda function to pull a message from SQS and send it to Mail chimp (prompt)

import boto3
import json
import os

from botocore.exceptions import ClientError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

It Very quickly got stuck in a loop suggesting the same code over and over again.  removed duplicate code and provided another promot. 

 

import boto3
import json


#lambda function to get a message from SQS
def lambda_handler(event, context):

   #get a message from SQS queue (prompt)
   sqs = boto3.resource('sqs')
   queue = sqs.get_queue_by_name(QueueName='test')
   message = queue.receive_messages()

   #parse message
   message = message[0]
   message_body = json.loads(message.body)
   message_body = message_body['Message']
   message_body = json.loads(message_body)
   message_body = message_body['Message']
   message_body = json.loads(message_body)
   message_body = message_body['Message']

It got further but got caught in another loop. In fact, CodeWhisperer got caught in a number of loops before it finished.

Eventually I ended up with:

import boto3
import json

#lambda function to get a message from SQS
def lambda_handler(event, context):

   #get a message from SQS queue (prompt)
   sqs = boto3.resource('sqs')
   queue = sqs.get_queue_by_name(QueueName='test')
   message = queue.receive_messages()

   #parse message
   message = message[0]
   message_body = json.loads(message.body)
   message_body = message_body['Message']

   #send message_body to mailchimp: (prompt)
   data = {
       'email_address': message_body,
       'status': 'subscribed'
       }

   #get user and pass from secret manager (PROMPT)
   secret_name = "mailchimp"
   region_name = "us-east-1"
   session = boto3.session.Session()
   client = session.client(
       service_name='secretsmanager',
       region_name=region_name
       )

   get_secret_value_response = client.get_secret_value(
   get_secret_value_response = client.get_secret_value(
       SecretId=secret_name
       )
       )

   secret = json.loads(get_secret_value_response['SecretString'])
   user = secret['user']
   passw = secret['pass']
   mailchimp_list = secret['list']
   mailchimp_api = secret['api']
   mailchimp_url = secret['url']
   mailchimp_client = boto3.client(
       'api-request-logs',
       aws_access_key_id=user,
       aws_secret_access_key=passw,
       region_name=region_name
       )

   #send to mailchimp
   r = requests.post('https://us17.api.mailchimp.com/3.0/lists/a7c8c8a8a4/members',
   auth=('user', 'pass'),
   data=json.dumps(data))

   #check response
   if r.status_code == 200:
       print('Success!')
   else:
       print('Error: %d' % r.status_code)
       print(r.text)
       raise Exception('Mailchimp Error')
       return 'Error'

   #delete message from queue
   message.delete()
   return 'Success'

Findings:

AWS CodeWhisperer can't provide whole functions of code the way ChatGPT did, but being able to provide a prompt and get started is extremely useful. Additionally, the ability to provide internal prompts make getting the next step correctly without needing to describe the whole solution from the beginning. 

The biggest problem with AWS CodeWhisperer is that it did tend to get stuck frequently, and created some obvious syntax problems.

Date posted: March 1, 2023

Add new comment

Restricted HTML

  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <cpp>, <java>, <php>. The supported tag styles are: <foo>, [foo].
  • Web page addresses and email addresses turn into links automatically.
  • Lines and paragraphs break automatically.

Metal Toad is an Advanced AWS Consulting Partner. Learn more about our AWS Managed Services

About the Author

Nathan Wilkerson, VP of Engineering

Nathan started building computers, programming and networking with a home IPX network at age 13. Since then he has had a love of all things computer; working in programming, system administration, devops, and Cloud Computing. Over the years he's enriched his knowledge of computers with hands on experience and earning his AWS Certified Solutions Architect – Professional.

Recently, Nathan has transitioned to a Cloud Operations Manager role. He helps clients and internal teams interface with the Cloud Team using the best practices of Kanban to ensure a speedy response and resolution to tickets.

Schedule a Free Consultation

Speak with our team to understand how Metal Toad can help you drive innovation, growth, and success.