Gemini 3.1, Lyria and Nano Banana 2

Published: Mar 3, 2026 by Isaac Johnson

Recently Google rolled out Gemini 3.1 Pro (and Flash). Most notable for many users was the new access to Lyria (music) by way of the AI portal. Lyria did exist before, but one needed to use AI Studio and their GCP account.

Lyria can generate music snippets (limited presently to 30s, but that is just for now). Gemini 3.1 Pro also can do some more personalized AI work if you allow it to look at your stuff (email, photos, drive). I tested this out to see what “Personalized Results” might look like.

It can also do Code in the browser. I test that as well (but I don’t think I’ll move away from Antigravity or Gemini CLI anytime soon).

But first, the new update that really blew me away; Nano Banana 2. Let’s look at why I’m so enamored with this update:

3.1 Nano Banana (Nano Banana 2)

Let’s look at a photo I generated in Nano Banana (1):

“Vintage photo of cow standing on beach in ocean, grainy and realistic, camera imperfections”

/content/images/2026/02/nanobanana-01.png

Loading the same prompt in NB2 shows a much better (and weathered) photograph

/content/images/2026/02/nanobanana-02.png

full image:

/content/images/2026/02/nanobanana-03.png

In NB1, I failed to get a better 3d Image out of a diagram

/content/images/2026/02/nanobanana-04.png

However, this is really quite impressive, it totally got it this time around:

/content/images/2026/02/nanobanana-05.png

Seriously, open this full size and look how it got the icons and fonts down. Just wow.

/content/images/2026/02/nanobanana-06.png

Here is another one…

I wanted to take a camera roll photo that had some lighting imperfections and turn it into a headshot and Nano Banana (1) did a fair job:

/content/images/2026/02/nanobanana-09.png

But now in NB2, not only does it look better

/content/images/2026/02/nanobanana-07.png

It actually really looks like me

/content/images/2026/02/nanobanana-08.png

Imaginative

Those were fun examples of compare/contrast. But what about more useless things.. For instance, I have this photo from the last PWHL game we saw in person

/content/images/2026/02/nanobanana-10.jpg

What if I ask NB2 “Add a velociraptor in proper hockey attire skating in this hockey game”

/content/images/2026/02/nanobanana-11.png

Pretty good, though I had to ask NB2 to make sure she was wearing skates and didn’t have the extra hockey puck

/content/images/2026/02/nanobanana-12.png

I just had to kick that into Veo2 via Gemini AI Pro portal to see it in action…

3.1 in Antigravity

I have continued work from last week to build out my Wilderness Trekking webapp.

I noticed the day after the announcement (Feb 19th) that all of a sudden Gemini 3.1 Pro was available in Antigravity.

I started to use that for updates

/content/images/2026/02/geminipro-01.png

Because of the big rollout, there have been a couple of nuances like timeouts and failures

/content/images/2026/02/geminipro-02.png

Usually a retry sorts that out and I find the quality of the answers is worth the minor inconvenience.

For instance, I threw a harder more complicated ask at it. I could have phrased this nicer, but I kind of wanted to just word vomit my train of thought and see how it handled it

/content/images/2026/02/geminipro-03.png

It came back with the updates I requested

/content/images/2026/02/geminipro-04.png

And we can see how it works

I continued to iterate with Gemini 3.1 pro in Antigravity for the course of a week. I ended up creating 58 runs in total to get a 1.0 release of the app.

Because I was rather pleased with it, I bought a new domain and used a new Hosted Zone in GCP

/content/images/2026/02/geminipro-06.png

At this point, setting up a zone is pretty easy so I won’t cover registrar configuration. I will note, however, that that I did not need a new cluster issuer in Kubernetes because the Cluster Issuer is tied to a GCP credential, not a specific zone.

$ kubectl get clusterissuer gcpleprod2 -o yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"cert-manager.io/v1","kind":"ClusterIssuer","metadata":{"annotations":{},"name":"gcpleprod2"},"spec":{"acme":{"email":"isaac.johnson@gmail.com","privateKeySecretRef":{"name":"gcpleprod2"},"server":"https://acme-v02.api.letsencrypt.org/directory","solvers":[{"dns01":{"cloudDNS":{"project":"myanthosproject2","serviceAccountSecretRef":{"key":"gcpsakey.json","name":"clouddns-dns01-solver-svc-acct"}}}}]}}}
  creationTimestamp: "2024-07-23T12:19:47Z"
  generation: 1
  name: gcpleprod2
  resourceVersion: "22220004"
  uid: 075f0038-ed30-4908-b25f-ca0688d0af2b
spec:
  acme:
    email: isaac.johnson@gmail.com
    privateKeySecretRef:
      name: gcpleprod2
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - dns01:
        cloudDNS:
          project: myanthosproject2
          serviceAccountSecretRef:
            key: gcpsakey.json
            name: clouddns-dns01-solver-svc-acct
status:
  acme:
    lastPrivateKeyHash: yHpQQEaxTIe5ltqvxwZnbioh/Jt3BXNNupAkwpvE5WQ=
    lastRegisteredEmail: isaac.johnson@gmail.com
    uri: https://acme-v02.api.letsencrypt.org/acme/acct/1852642137
  conditions:
  - lastTransitionTime: "2024-07-23T12:19:48Z"
    message: The ACME account was registered with the ACME server
    observedGeneration: 1
    reason: ACMEAccountRegistered
    status: "True"
    type: Ready

So my ingress definition, as defined in the helm chart could just use it

ingress:
  annotations:
    cert-manager.io/cluster-issuer: gcpleprod2
    ingress.kubernetes.io/proxy-body-size: "0"
    ingress.kubernetes.io/ssl-redirect: "true"
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.org/client-max-body-size: "0"
    nginx.org/proxy-connect-timeout: "3600"
    nginx.org/proxy-read-timeout: "3600"
  className: nginx
  enabled: true
  hosts:
  - host: wildtrack.in
    paths:
    - path: /
      pathType: ImplementationSpecific
  tls:
  - hosts:
    - wildtrack.in
    secretName: wildtrackin-tls

As I was now using something other than “tpk.pw”, I needed to update the OAuth configuration to allow for “wildtrack.in” in the GCP OAuth Client

/content/images/2026/02/geminipro-07.png

Video

I also created a very cheesy video using Veo2. You can find it by clicking the animated logo on the login page. But for convenience, I’ll share here (note: there is sound).

(My wife’s main feedback was I forgot to add a good caw sound to the eagles)

Music

They have rolled out some of Lyria for a Gemini 3.1 Pro music option as well.

Which you can listen to here:

They are limited to 30s, so for my cheesy video above, I still used Suno

/content/images/2026/02/geminipro-09.png

Here is the full track (I really think Suno does a fantastic job, which is why it’s one of the few for which I pay).

This is just one of the tracks for “swelling orchestral, inspirational, excelling, push yourself, powerful”

I gave the same prompt to Gemini’s Lyria

I asked it to remove the words and it really didn’t do it. But I came back and asked it: “instrumental track with swelling orchestral, inspirational, excelling, push yourself, powerful”. This time I got what i wanted

Deep Research.. Insights?

So I went to ask about past Dapr conversations

/content/images/2026/02/geminipro-10.png

But after it connected to my systems, it asked me if I wanted Gemini 3.1 Pro to tell me what it noticed about me from my data.

Call me intrigued.. So I told it to go for it:

/content/images/2026/02/geminipro-11.png

Okay, yes, it’s definitely highlighting my positives, which feels good, but I also really love what it captured from my data that is in Google workspaces.

I agree that I’m:

  1. The “Infrastructure Architect”
  2. The “Observability Sleuth”
  3. The “Technical Storyteller”

And, perhaps this comes from some years of experience, I think these are the traits of a very good DevOps and SRE architect. I might call myself a Cloud Architect, but at my core, I’m about the Infrastructure and Observability and that is likely why I’ve leaned into Cloud/FinOps/DevSecOps and other Architecture areas in my current career state.

Personal Intelligence

I’m going to try this - I need to formulate a pitch for IaCConf 2026 (part 2). I’ve been trying to come up with ideas. Let’s give “Personal Intelligence” a try.

First, knowing what it does about me, it answered “What are some new Observability trends I should know about?”

/content/images/2026/02/geminipro-12.png

I agree there are some good things there about FinOps and eBPF. I wonder what we might do there:

My Ask: “I would like 5 conference pitches for an IaC conference that focus on Cloud, FinOps and eBPF. I want to incorporate OpenTelemetry (OTel) into the mix and leverage Google Cloud (GCP). I want to highlight cost savings though serverless, otel instrumentation and proper storage tiers and machine rightsizing.”

I used “Thinking” for this:

/content/images/2026/02/geminipro-13.png

Of these, 2, 3 and 5 sound like fun presentations to build and deliver. Of those three, however, I personally would like to really dive into the Functions space.

/content/images/2026/02/geminipro-14.png

Now, I likely need to think and write this in my own voice. It’s very obvious when people copy paste GenAI pitches - and I’m not trying to avoid mental work. I just wanted some inspiration.

Coding in Gemini Web UI

I usually use Gemini CLI and Antigravity for most of my GenAI needs, but there is a “Pro” dropdown for coding in the Gemini Web UI

Create a FastAPI Python app with OpenTelemetry instrumentation. Any configuration should come from passed in Environment variables. I would also like the requirements.txt I would need to install any dependencies and a Dockerfile to build it

This did provide the code for which I asked:

/content/images/2026/02/geminipro-15.png

However, I usually like the Dockerfile to declare it’s Env vars so there is no confusion. That said, the bottom here shows the actual invokation with environemnt variables for OTel destinations

/content/images/2026/02/geminipro-16.png

The Docker build worked just fine

builder@DESKTOP-QADGF36:~/Workspaces/fastOtelExample$ ls
Dockerfile  main.py  requirements.txt
builder@DESKTOP-QADGF36:~/Workspaces/fastOtelExample$ docker build -t fastapi-otel-app:0.1 .
[+] Building 39.2s (12/12) FINISHED                                                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                                                                 0.0s
 => => transferring dockerfile: 860B                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/python:3.11-slim                                                                                  0.7s
 => [auth] library/python:pull token for registry-1.docker.io                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                      0.0s
 => [1/6] FROM docker.io/library/python:3.11-slim@sha256:0b23cfb7425d065008b778022a17b1551c82f8b4866ee5a7a200084b7e2eafbf                            0.0s
 => [internal] load build context                                                                                                                    0.0s
 => => transferring context: 1.34kB                                                                                                                  0.0s
 => CACHED [2/6] WORKDIR /app                                                                                                                        0.0s
 => [3/6] COPY requirements.txt .                                                                                                                    0.0s
 => [4/6] RUN pip install --no-cache-dir -r requirements.txt                                                                                        12.5s
 => [5/6] RUN opentelemetry-bootstrap -a install                                                                                                    25.2s
 => [6/6] COPY main.py .                                                                                                                             0.1s
 => exporting to image                                                                                                                               0.5s
 => => exporting layers                                                                                                                              0.5s
 => => writing image sha256:e9667f05817fbd7209963e4490545b0ccbfd34170d5f569fb3f2efa9ccac37a1                                                         0.0s
 => => naming to docker.io/library/fastapi-otel-app:0.1                                                                                              0.0s

Let’s assume I want to use New Relic for this. New Relic does need an API key added to the headers. Luckily we see that was documented in the notes:

Note: http://host.docker.internal:4317 is used here so the Docker container can reach an OTLP collector running on your local host machine. If you are deploying to Kubernetes or another cloud provider, you would just swap that URL with your actual collector endpoint and pass any required headers via -e OTEL_EXPORTER_OTLP_HEADERS=”Authorization=Bearer YOUR_TOKEN”.

Let’s give it a shot:

docker run -p 8000:8000 \
  -e OTEL_SERVICE_NAME="my-fastapi-service" \
  -e OTEL_TRACES_EXPORTER="otlp" \
  -e OTEL_METRICS_EXPORTER="otlp" \
  -e OTEL_LOGS_EXPORTER="otlp" \
  -e OTEL_EXPORTER_OTLP_ENDPOINT="https://otlp.nr-data.net:4317" \
  -e OTEL_EXPORTER_OTLP_PROTOCOL="grpc" \
  -e OTEL_EXPORTER_OTLP_HEADERS="api-key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNRAL" \
  fastapi-otel-app:0.1


Attempting to instrument FastAPI app while already instrumented
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

A quick check on the web:

/content/images/2026/02/geminipro-17.png

Because it’s FastAPI, we can use the Swagger (OpenAPI) endpoint to invoke the Simulate Work action

/content/images/2026/02/geminipro-18.png

That said, I tried a couple different active API keys and using HTTP and GRPC endpoints, with and without the protocol and did not see my traces appear.

/content/images/2026/02/geminipro-19.png

I could debug with Gemini CLI or review my past code to see what I’m missing (i think we need to send some traces somewhere, not just set instrumentation), but this was mostly to see if it was close.

Video (with pictures)

I often have fun modifying photos of myself and others.

For instance, I asked for an eagle to land on my shoulder

/content/images/2026/02/geminipro-20.png

Which did a good job.

A lot of models miss my slightly droopy eyelid on the left side (right side facing) which always makes it look ‘not like me’. This caught that which actually impressed me.

Other than making silly videos of family, I also find it pretty good at making title graphics for things.

For instance, I asked for Explosive Cinematic intro for "Fresh/Brewed", movie trailer, loud and got:

and another generation (even better):

Note: you get three video generations a day with AI Pro, so plan accordingly

With text

How about just using words?

I asked to see a “retro 8-bit inspired video game demo about canoeing in the wilderness. it should feature bears, moose, ducks and loons.”

Summary

I have found Gemini 3.1 a bit better at coding that Gemini 3 (but not exponentially). I like the music generator, but 30s is a bit short for me to use it for anything so I’ll still stick with Suno.

The code generation is nice - and I could see using it in a ping, but it would not be enough to get me to give up Copilot, Gemini CLI and Antigravity. But I could imagine dropping some sections of code in for a quick explination or asking for help with a regular expression.

The deep thinking which suggested some personalized ideas for me was interesting. I might try it again.

However, the real winner, but a huge amount, is Nano Banana 2. The differences are really impressive. I’m sure the video is better, but I had no issues with Veo2 as it was so if there are new things, I’m not really seeing them (as much as I do with NB2).

For your pleasure, let’s see Veo deal with those pesky chickens at the Xcel center (yes yes, Grand casino arena, i know):

GenAI Lyria Veo Gemini NanoBanana

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes