見出し画像

OpenCodeでもループエンジニアリングはできる|しかも無料で

前回の「Codex編」、前々回の「Claude Code編」に引き続き、今回は OpenCode でループエンジニアリングを試してみた。

先に結論を言う。できた。しかも無料で。

この企画の流れ

この記事は3部作のオチにあたる。

  1. Claude Code編 — サブエージェント+フックで本格ループ(有料)

  2. Codex編 — FizzBuzzで小さく試す(一部無料枠あり)

  3. OpenCode編 ← イマココ。DeepSeekモデルなら完全無料

Claude CodeとCodexは月$20~+API課金・追加使用量どちらも使えば使うほどお金がかかる。じゃあ、無料の組み合わせでもループエンジニアリングってできるの? というのが今回のテーマだ。

結論から言うと、できる。しかも気持ちよく回る。

OpenCodeって何

OpenCodeはCLIベースのオープンソースAIエージェントだ。

Claude Codeにインスパイアされつつ、いくつかアプローチが違う。いちばんの違いは、モデルを自由に選べること。OpenAIでもAnthropicでも、そして DeepSeek でも動く。DeepSeekは推論モデルがかなり安く、無料枠もある。つまり、お金をかけずにループエンジニアリングが試せる。

今回の検証内容

前回のCodex編とまったく同じ条件で試した。

  1. わざとバグを入れたFizzBuzzを用意する(15でだけ "Fizz" を返してしまう)

  2. テストを書いて期待値を固定する

  3. テストを実行して失敗を確認する

  4. 最小差分で直す

  5. 再実行してPASSするまで回す

この「書く人」と「採点する人」を分けて、合格するまで自動で繰り返す仕組みがループエンジニアリングだ。

用意したもの

プロジェクト構成は以下の通り。

loop_engineering/
├── fizzbuzz.py          # わざとバグ入り
├── test_fizzbuzz.py     # unittest (4ケース)
└── AGENTS.md            # ループエンジニアリングのルール

バグ入りFizzBuzz(fizzbuzz.py

def fizzbuzz(value: int) -> str:
    if value % 3 == 0:
        return "Fizz"
    if value % 5 == 0:
        return "Buzz"
    return str(value)

15のとき、3の倍数判定が先に来るので "Fizz" が返ってしまう。あるある。

テスト(test_fizzbuzz.py)

class TestFizzBuzz(unittest.TestCase):
    def test_normal(self):
        self.assertEqual(fizzbuzz(1), "1")
    def test_fizz(self):
        self.assertEqual(fizzbuzz(3), "Fizz")
    def test_buzz(self):
        self.assertEqual(fizzbuzz(5), "Buzz")
    def test_fizzbuzz(self):
        self.assertEqual(fizzbuzz(15), "FizzBuzz")  # ← ここが落ちる

15のときだけ "FizzBuzz" を期待する。これが完了条件の基準になる。

実演:ループを回す

1周目:テスト実行→FAIL確認

$ python test_fizzbuzz.py
..F.
======================================================================
FAIL: test_fizzbuzz
AssertionError: 'Fizz' != 'FizzBuzz'

想定どおり、15のケースだけ落ちた。エラーメッセージは明確で、何を直せばいいかが一瞬でわかる。

2周目:最小差分で修正

ここがポイント。余計なリファクタリングは一切しない。 直すべきは1箇所だけ。15の倍数判定を最初に持ってくる。

def fizzbuzz(value: int) -> str:
    if value % 15 == 0:
        return "FizzBuzz"   # ←15の倍数を先に判定
    if value % 3 == 0:
        return "Fizz"
    if value % 5 == 0:
        return "Buzz"
    return str(value)

3周目:再実行→PASS確認

$ python test_fizzbuzz.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK

全4ケースPASS。たった1行追加しただけで完了。

ループは2周で終わった。かかった時間は数十秒、課金はゼロ。

なんでOpenCodeだと「無料」なのか

普通、AIエージェントを使うと「呼ぶたびにお金がかかる」という壁がある。ループエンジニアリングはテスト→修正を繰り返すから、回せば回すほど課金が気になる。

OpenCode + DeepSeekの組み合わせだと、この壁がほぼなくなる。

  • モデルが安い — DeepSeekはGPTより1桁安い

  • 無料枠がある — 軽い検証なら十分収まる

  • オープンソース — 自分でホストすればAPI代すら不要

「気にせずループを回せる」というのは、実は結構なアドバンテージだ。

Claude Code / Codex / OpenCode 比較

Claude Code / Codex / OpenCode 比較表

OpenCodeに足りないものもある。サブエージェントの管理体系はClaude Codeほど成熟していないし、Stopフックのような強制ループ機構もない。

でも、「AGENTS.mdにルールを書いて、テストで検証して、合格するまで回す」という基本設計は、Claude Codeとまったく同じ思想で書ける。

大事なのはツールじゃない

今回3つのツールで同じFizzBuzzを回してみて、気づいたことがある。

ループエンジニアリングの本質は、ツールの機能ではない。

そうではなくて、「完了条件を機械判定可能な形で定義する」「実装と検証を分離する」「合格するまで諦めない」という3つの考え方だ。これはClaude CodeでもCodexでもOpenCodeでも、あるいは人間同士のコードレビューでも同じように機能する。

高級なツールを使えば成功率が上がることはある。でも、「なければできない」ものではない。

まとめ

OpenCode + DeepSeek でもループエンジニアリングはできる。

今回のFizzBuzzでは、バグの特定→修正→再実行→合格までを数十秒で完了できた。課金はゼロ。つまり、お金を理由にループエンジニアリングを諦める必要はない。

  • まずはFizzBuzzで試す

  • 完了条件をテストとして書く

  • ルールをAGENTS.mdに書く

  • 回す。直す。合格するまで。

これだけ。無料でできる。だから、やってみてほしい。


いいなと思ったら応援しよう!