個人でアプリを開発していると、Gemma 4 に頼んだコードが「見た目は完璧」なのに実行するとエラーで止まる、という経験を繰り返すことがあります。構文チェックは通るのにランタイムで落ちる。それがいちばん時間を溶かすパターンです。
2014年からひとりでアプリを作り続けてきた中で、累計5,000万ダウンロードを超えるまでに何度もこの壁にぶつかりました。Gemma 4 という強力なモデルが登場してからは状況が変わりましたが、ランタイムエラーに悩む構造は変わっていません。
Antigravity の IDE 上で Gemma 4 を使っていて、生成されたコードが実行時に落ちる場合、原因はほぼ4つのパターンに絞られます。それぞれの見分け方と修正手順をまとめます。
パターン1: TypeError — 型の不一致
症状: TypeError: unsupported operand type(s) for +: 'int' and 'str' のようなエラー。
Gemma 4 は変数の型を静的に推論しながらコードを生成しますが、Python の動的型付けに起因する不一致が生じやすいです。特に関数の戻り値が str | int のような Union 型になっている場合、Gemma 4 は片方の型のみで処理を組み立てることがあります。
例: よく起きるパターン
# Gemma 4 が生成したコード(問題あり)
def fetch_user_age(user_id: str) -> int:
result = db.query(f"SELECT age FROM users WHERE id = '{user_id}'")
return result[0] # db によっては文字列で返ることがある
# 呼び出し側
total = fetch_user_age("u001") + 5 # TypeError が発生しうる修正手順:
- エラーメッセージの変数名を特定する
- その変数の生成元(関数・APIレスポンス)を追う
type()またはprint()でデバッグ出力を挟む- 明示的なキャスト(
int(),str())を追加する
# 修正後
def fetch_user_age(user_id: str) -> int:
result = db.query(f"SELECT age FROM users WHERE id = '{user_id}'")
return int(result[0]) # 明示的にキャストAntigravity では Cmd+K(インライン編集)で「この関数の戻り値に型キャストを追加して」と伝えると、Gemma 4 が修正案を出してくれます。
パターン2: AttributeError — None アクセス
症状: AttributeError: 'NoneType' object has no attribute 'xxx'
Gemma 4 が生成するコードは「データが必ず存在する前提」で書かれることが多いです。API レスポンスや DB クエリが None を返すケースを考慮していないため、None チェックが漏れます。
# Gemma 4 生成コード(問題あり)
user = db.find_user(email=email)
print(user.name) # user が None のとき AttributeError修正手順:
- エラーが出た行のオブジェクトを特定する
- そのオブジェクトを返す処理を追う(None になる条件を把握)
- ガード節を追加する
# 修正後
user = db.find_user(email=email)
if user is None:
raise ValueError(f"User not found: {email}")
print(user.name)Antigravity の Chat パネルで「find_user の返り値が None のケースを考慮したガード節を追加して」と依頼すると、コンテキストを把握した上で適切な修正を提案してくれます。
パターン3: asyncio エラー — await 漏れ・ループ衝突
症状: RuntimeWarning: coroutine 'xxx' was never awaited または RuntimeError: This event loop is already running
Gemma 4 は非同期コードの生成が得意ですが、既存の同期コードに async def を混ぜ込む際に await が漏れることがあります。また、Jupyter Notebook 環境やフレームワーク内で使うとイベントループの二重起動エラーが出ます。
# Gemma 4 生成コード(問題あり)
import asyncio
async def fetch_data(url: str) -> dict:
async with aiohttp.ClientSession() as session:
response = await session.get(url)
return await response.json()
# 呼び出し側(同期関数内で誤って呼び出し)
def process():
data = fetch_data("https://api.example.com/data") # await が漏れている
print(data)修正パターン:
# ① asyncio.run() を使う(スクリプト実行の場合)
def process():
data = asyncio.run(fetch_data("https://api.example.com/data"))
print(data)
# ② Jupyter 環境では nest_asyncio を使う
import nest_asyncio
nest_asyncio.apply()
loop = asyncio.get_event_loop()
data = loop.run_until_complete(fetch_data("https://api.example.com/data"))Antigravity では生成されたコードに await が漏れているとき、エディタが薄い下線で警告することがあります。気づいたら @ 参照でファイルを指定して「非同期コードの await 漏れをチェックして修正して」と依頼するのが最速です。
パターン4: ImportError — バージョン・API の不一致
症状: ImportError: cannot import name 'xxx' from 'yyy' または AttributeError: module 'xxx' has no attribute 'yyy'
Gemma 4 はトレーニングデータの時点のライブラリ API を参照するため、最新バージョンで変更・廃止された API を呼び出すコードを生成することがあります。
# Gemma 4 生成コード(問題あり — 旧 API を使用)
from langchain.chat_models import ChatOpenAI # v0.1以降は廃止
# 最新版の正しいインポート
from langchain_openai import ChatOpenAI # v0.1以降はこちら確認手順:
- エラーメッセージのモジュール名とクラス名を把握する
pip show [パッケージ名]でインストール済みバージョンを確認する- 公式ドキュメントやリリースノートで移行先の API を確認する
- Antigravity Chat に「
langchainv0.3 の最新のインポートパスを教えて」と聞く
Antigravity に Context7 MCP を組み込んでいると、ライブラリの最新ドキュメントを参照しながら正しい API を提案してくれます。これが一番早い解決策です。
Antigravity での系統的なデバッグ手順
4つのパターンを踏まえた上で、Antigravity 上で効率よく診断するフローを整理します。
ステップ1: エラーメッセージをそのまま Antigravity の Chat にペーストします。Gemma 4 は traceback を読むのが得意なので、貼るだけで原因の仮説を出してくれます。
ステップ2: 「なぜこのエラーが起きているか、考えられる原因を3つ列挙して」と続けて聞く。複数候補を出させることで見落としを減らせます。
ステップ3: 候補を絞ったら「このファイルの該当箇所を修正して」と依頼します。@ファイル名 でコンテキストを指定するとより正確に修正されます。
詳細なデバッグ手法については AI時代のデバッグ思考法 や Antigravity AI デバッグガイド も参考にしてみてください。Python SDK 固有のエラーについては Python SDK エラー診断と修正 に整理してあります。
全体を振り返って
Gemma 4 が生成するコードは、構文の正しさという点では非常に高い精度を持っています。ランタイムエラーの大半は型・None チェック・await・旧 API の4パターンに集約されます。エラーメッセージを見て「どのパターンか」を判断できれば、修正にかかる時間は大幅に短くなります。
次のステップとして、まず手元で出ているエラーのメッセージをコピーして Antigravity の Chat に投げてみてください。それだけで解決への道筋が見えることがほとんどです。
同じ課題に取り組んでいる方の参考になれば嬉しいです。