top of page

OpenAI CodexのGitHubリリースが明らかにするRusty V8アップグレードの隠れたコスト

OpenAI Codexは、13ファイルの変更を経てrusty-v8 150.4.0をリリースした。これは、1行の依存関係アップグレードが、いかにクロスプラットフォームのビルド移行へ発展しうるかを示している。GitHubリリースの7月29日付エントリーでは、Rustのv8クレートが149.2.0から150.4.0へ更新された。関連するV8ソーススナップショットも置き換えられ、依存関係の固定指定と下流向けパッチも改訂された。

この範囲が中心的な緊張関係を生む。OpenAIは、複数のプラットフォームにわたり、使いやすいRustパッケージとそのソースビルド経路を整合させる必要があった。アーカイブ、チェックサム、LLVMリビジョン、インクルードパスのいずれかが一致しなければ、アプリケーションコードが動く前にその整合性は崩れる可能性がある。

この変更によって、目に見えるCodex機能が導入されたわけではない。性能向上、セキュリティ修正、新たなモデル能力が確立されたわけでもない。その重要性は、信頼できるネイティブ依存関係を支える保守の仕組みにある。

Denoのrusty_v8プロジェクトは7月24日にバージョン150.4.0をリリースした。OpenAIは4日後にプルリクエスト35831をマージし、その後プレリリースタグを公開した。この短い流れは、下流プロジェクトが再現可能なビルドの制御を失わずに、上流のエンジン変更を取り込まなければならないことを示している。

OpenAI CodexのGitHubリリースで実際に変更されたもの

このリリースは、Rustのバージョン文字列だけでなく、ネイティブビルドチェーン全体を更新した。

公開されているリリース記録には、3つの変更グループが記載されている。まず、OpenAIはRustのv8クレートを150.4.0へアップグレードした。また、Bazelで管理されるV8ソースも14.9.207.2から15.0.245.2へ移行した。

Rustクレートは、RustプログラムがV8を埋め込めるようにするバインディングを提供する。V8は、JavaScriptとWebAssemblyを実行するためのGoogleのC++エンジンだ。ChromeやNode.jsで利用されているが、アプリケーションが直接埋め込むこともできる。

この違いが、バージョン番号が異なる理由を説明する。rusty_v8パッケージには独自のリリース番号があり、基盤となるエンジンには別のV8ソースタグがある。OpenAIは両方の固定指定を、協調した単一の作業として進める必要があった。

次に、このリリースではビルド済みアーカイブとそのチェックサムが更新された。ビルド済みアーカイブには、サポート対象のターゲット向けにあらかじめコンパイルされたネイティブライブラリが含まれる。V8をローカルでコンパイルする必要性を減らし、セットアップとビルドの作業を大幅に抑えられる。

チェックサムは、ダウンロードした成果物を検証するための暗号学的フィンガープリントだ。ファイルが変更されている、または設定されたフィンガープリントが誤っている場合、ビルドシステムはそれを拒否する。したがって、新しいバイナリごとに依存関係設定内で対応するチェックサムが必要になる。

OpenAIのコミットは、オペレーティングシステム、アーキテクチャ、コンパイラ環境の組み合わせごとに、サポート対象アーカイブへの参照を置き換えた。確認できる差分には、Arm64とx86-64の両方のWindowsターゲットが含まれる。より広範なチェックサム更新には、ほかのターゲット固有の記録も見られる。

3つ目に、この更新ではLLVMソースの固定指定、Bazelターゲット、上流V8に適用するパッチが改訂された。LLVMはコンパイラ基盤プロジェクトであり、そのC++ライブラリおよびCライブラリのコンポーネントはネイティブビルドを支える。リビジョンを固定することで、本来は変動し続ける依存関係がビルドの下で変化することを防ぐ。

このリリースでは、V8が期待するインクルードパスを通じて、固定されたllvm-libcヘッダーも公開された。llvm-libcは、LLVM内におけるC標準ライブラリの実装である。ネイティブソースファイルはコンパイル中にこれらのインターフェースを参照するため、ヘッダーの可視性は重要になる。

OpenAIのマージ済み変更には、7月28日にmainブランチへ入った1件のコミットが記録されている。対応するコミットでは、13ファイルにわたり210行の追加と202行の削除が報告されている。この変更量の多くは、アプリケーションの挙動ではなく、機械処理向け設定の更新によるものだ。

ただし、これらの数字だけを複雑性の尺度として読むべきではない。生成されたロックファイル、チェックサム、更新されたパッチは、機械的な置換によって大きな差分を生みうる。それでも、変更されたすべての境界は相互に整合している必要がある。

このリリースはプレリリースとしてマークされている。このラベルは、このネイティブコンポーネントの成果物を、従来型のユーザー向けCodexリリースから区別するため重要だ。読者はこのタグを、新しいCodex CLIバージョンや新しいAI機能と見なすべきではない。

この出来事は、サプライチェーン保守として理解するのが最適だ。OpenAIは、組み込みエンジン、Rustインターフェース、バイナリ成果物、ビルド定義、コンパイラソース、ローカルの互換性パッチを同期させた。バージョンの更新は、最も目立つ1行にすぎない。

Rusty V8の更新がCargoをはるかに超える理由

ネイティブ依存関係は、速度のための信頼できるバイナリと、制御のためのソースビルドという、2つの配布経路をチームに維持させる。

一般的な純粋なRust依存関係であれば、多くの場合はCargo.tomlCargo.lockを通じて更新できる。コンパイラがクレートを解決し、ソースをビルドして、結果をリンクする。V8は独自のツールチェーンとビルド前提を持つ大規模なC++エンジンであるため、このパターンを変える。

v8クレートはそのエンジンへのRustインターフェースとして機能する。その上流リリースには74個のアセットが含まれており、関与するパッケージ済み出力の数を反映している。アセット数はCodexのプラットフォーム数が74であることを示すものではないが、上流で維持される配布範囲を示している。

下流プロジェクトは、一致するビルド済みライブラリがあればそれを利用できる。この経路は高速であり、ネイティブコンパイル環境全体を再構築する必要がない。ただし、ターゲットトリプル、アーカイブ名、バージョン、整合性値を正確に対応付ける必要がある。

ターゲットトリプルは、ビルドに関連するプロセッサ、オペレーティングシステム、ツールチェーンを記述する。Microsoftのコンパイラ環境を使うx86-64 Windowsビルドには、Arm64 macOSビルドとは異なるネイティブライブラリが必要になる。各成果物はRustクレートの期待と一致しなければならない。

代替手段は、V8をソースからビルドすることだ。この経路は、ビルド済み成果物が利用できない、または適さない環境をサポートする。ローカルのコンパイラオプション、特殊なターゲット、あるいはビルド入力をより細かく制御したい開発者にも役立つ。

ソースビルドは別の依存関係グラフを導入する。V8ソース、コンパイラコンポーネント、ヘッダー、ビルドルール、下流による変更が必要になる。OpenAIのllvm-libcインクルードパス調整は、この経路に属する。

インクルードパスとは、コンパイラがヘッダーファイルを検索するディレクトリの集合だ。V8が特定の論理パスにヘッダーを期待している場合、別の場所にファイルを公開するだけでは十分ではない。Bazelは、V8のビルドルールが利用する名前と場所で依存関係を提示しなければならない。

OpenAIは、V8が期待するllvm_libc_headersターゲットを、固定されたヘッダーソースへ接続することで、この不一致を解消した。確認できるパッチは、上流ライブラリの公開リリースを変更するのではなく、ローカルのBazel統合を変更している。これにより、管理された下流ビルド構成を維持している。

Bazelはさらにもう1層の依存関係管理を加える。その外部依存関係システムは、アーカイブのダウンロード、整合性値の検証、パッチの適用、宣言済みターゲットへのリポジトリの公開を行う。公式の依存関係概要は、ワークスペースと外部コードの間にあるこの境界を説明している。

したがってCodexは、関連する依存関係についてCargoとBazelの両方の表現を維持している。CargoはRustワークスペースで使われるRustクレートを追跡する。Bazelは、独自のビルドグラフに必要な上流V8ソースと、それを支えるネイティブ入力を追跡する。

これらの表現は整合した状態を保たなければならない。Cargoだけを更新すれば、Bazelが古いエンジンスナップショットをコンパイルしたままになる可能性がある。Bazelだけを更新すれば、新しいネイティブコードと、別のリリース向けに設計されたバインディングが組み合わされる可能性がある。

同じ整合性要件はビルド済みアーカイブにも当てはまる。新しいクレートを、古いラッパーリリース向けに作られたバイナリへ安全に向けることはできない。シンボルのリンクが偶然成功したとしても、検証されていないバージョンのずれは、はるか後になって表面化する障害を生む可能性がある。

このため、更新にはURLの名前変更だけでなく、チェックサムの更新も含まれる。チェックサムは、ダウンロードしたバイナリが更新時に選択された成果物そのものであることを確認する。偶発的な置換を防ぎ、破損したコンテンツを検出する。

チェックサムは成果物が安全であることを証明するものではない。信頼された設定値に対する同一性を証明するものだ。レビュー担当者は依然として、アーカイブの入手元、ビルド方法、選択したバージョンが適切かどうかを評価する必要がある。

この更新では、固定されたlibc++とllvm-libcのコミットも進められている。libc++はLLVMによるC++標準ライブラリの実装だ。これらのリビジョンを進めることで、ソースコンパイルを新しいV8ソースの期待に整合させる。

この動きは保守上の負荷を生む。新しいコンパイラライブラリのスナップショットは、Codexのアプリケーションコードがそのままでも、ヘッダーや実装の詳細を変える可能性がある。固定指定はドリフトを抑えるが、固定指定の更新には依然として互換性作業が必要だ。

エンジニアリングチームにとって実務上の教訓は、文書化である。ネイティブの固定指定、ターゲット対応、パッチの目的は、コードのそばで検索可能な状態を保つべきだ。技術ナレッジベースは、ビルド障害と過去の依存関係に関する判断をチームが結び付ける助けになる。

Codexのリリースは、その必要性を端的に示す例だ。将来の保守担当者は、なぜV8がローカルのllvm-libcターゲットを参照するのか、なぜソースタグがクレートバージョンと異なるのか、なぜすべてのアーカイブに固定されたフィンガープリントがあるのかを理解しなければならない。

真の敵は2つのビルドシステムにまたがるバージョンドリフト

主な対立軸は、OpenAIと別のコーディング支援ツールの競争ではなく、協調した固定指定とバージョンドリフトの間にある。

Codexのあらゆる更新を製品競争の一部として捉えたくなるかもしれない。しかし、その枠組みはこのリリースには当てはまらない。rusty-v8 150.4.0を競争上の機能、ベンチマーク結果、モデル変更と結び付ける公的な証拠はない。

意味のある相手は、Cargo、Bazel、LLVMソース、アーカイブ、パッチの間で生じるドリフトだ。ドリフトは、関連コンポーネントが独立して進み、1つの検証済み構成を表さなくなったときに発生する。ネイティブ依存関係では、この状態の診断に特に大きなコストがかかる。

OpenAIの更新は、正確なバージョンによってドリフトに対処している。Cargoではv8 = "=149.2.0"v8 = "=150.4.0"へ変更される。等号記号は、互換範囲を受け入れるのではなく、選択されるクレートがその正確なバージョンと一致することを要求する。

Bazelには、正確なV8ソースバージョン15.0.245.2が渡される。アーカイブURL、strip prefix、整合性値はすべて同時に更新される。strip prefixは、アーカイブを展開した後にBazelが削除する最上位ディレクトリを指定する。

Rustクレートアーカイブも同じように扱われる。リポジトリ名は150.4.0を参照するように変更され、ソースURLは対応するクレートパッケージを指す。新しいSHA-256値は、この宣言をその正確なファイルへ結び付ける。

固定されたGitリビジョンは、libc++とllvm-libcでも同様の役割を果たす。コミットハッシュは、1つのリポジトリ状態を識別する。これにより、繰り返し行うビルドが、その時点で上流の最新状態に左右されにくくなる。

再現性が意図する仕組みだが、正確な固定指定は責任を下流へ移す。自動化された依存関係解決は、それだけで新しい互換バージョンを選択できない。保守担当者は定期的にこのような更新を実施し、すべての統合ポイントを調整しなければならない。

このトレードオフは、ネイティブエンジンにとってしばしば妥当である。V8には広範な公開APIがあるが、そのドキュメントは、埋め込み側がエンジンインターフェースを直接利用するC++アプリケーションであると説明している。OpenAIはその上にRustバインディングとBazelパッケージング層を加えている。

公式のV8ドキュメントによれば、同エンジンはJavaScriptをコンパイルし、オブジェクトメモリを管理し、ガベージコレクションを実行する。このようなエンジンを組み込むことで、そのランタイムの挙動はホストアプリケーションのプロセス内に取り込まれる。

この近さは、不整合が生じた際のコストを高める。障害はコンパイル、リンク、起動、スクリプト実行、メモリ管理のいずれの段階でも発生し得る。問題の原因は、それを引き起こしたRustコードより数層下にある場合もある。

下流パッチは、別の乖離境界を生む。パッチには、OpenAIが上流のV8を取得した後に適用する変更が記録される。上流ファイルが移動すれば、依然として有効な考え方であっても、きれいに適用できなくなる可能性がある。

このコミットは、名前付きのパッチ領域を3つ更新している。1つはV8のBazelルールを扱い、もう1つはモジュール依存関係を調整し、残る1つはソースの移植性に対応する。これらが引き続き存在することは、下流のビルドが手を加えていない上流チェックアウトとは依然として異なることを示している。

これは本質的に欠陥ではない。プロジェクトでは、ビルドグラフへ統合するためにサードパーティーコードへパッチを当てることが日常的に行われる。リスクは、パッチの意図が不明確になった場合や、上流の変更が古い前提を無効にした場合に現れる。

更新されたv8_bazel_rules.patchは、この保守作業を示す例だ。V8 14.9.207.2から15.0.245.2へパスを更新し、llvm-libcヘッダーをV8のターゲットグラフへ取り込む方法を変更している。このパッチは、新しい上流ファイルのレイアウトに適合していなければならない。

この作業は、ユーザーよりもCodexのメンテナーに大きな負荷をかける。メンテナーは、ソース経路を維持しながら、ビルド済みバイナリの経路を便利に保つ必要がある。両方の経路をサポートすると、OS、プロセッサアーキテクチャ、ビルドツールにまたがるテストの必要性が広がる。

上流メンテナーが直面する圧力は異なる。rusty_v8は、下流の利用者が一貫して取得できるバインディングとバイナリアセットを公開しなければならない。V8は、組み込み側がそれぞれ独自の統合選択を担うとしても、Chrome以外でも利用可能なエンジンインターフェースを維持する必要がある。

ビルドシステムのメンテナーは、3つ目の圧力点に直面する。CargoとBazelは、重なり合う依存関係の問題を異なるモデルで解決する。両方を使うリポジトリでは、どちらのツールも他方のロック状態を理解しないため、明示的な連携を構築しなければならない。

このリリースのGitOrigin-RevIdからは、内部から公開リポジトリへの同期経路も読み取れる。この識別子は、自動マージで使用されたプルリクエストブランチの接尾辞と一致する。追跡可能性は提供するが、公開記録では内部レビューのプロセスまでは説明されない。

この制約は重要だ。この変更は、公開リポジトリに何が入ったかを示している。一方で、すべての内部テスト、動機、あるいは本番依存関係を明らかにするものではない。したがって、Codexのランタイム挙動に関する主張は、可視化された差分より狭い範囲にとどめるべきだ。

差分から証明できないこと

完全な依存関係更新は保守作業を示すが、実行速度の向上、セキュリティの改善、プラットフォーム対応の拡大を証明するものではない。

リリースノートは入力とビルドの変更を説明している。rusty_v8 149.2.0と150.4.0を比較するベンチマークは公開していない。また、このアップグレードで修正された特定のユーザー向け不具合も特定していない。

リリース項目にはパフォーマンス指標がない。読者は、レイテンシの低下、メモリ使用量の削減、JavaScript実行の高速化を推測すべきではない。新しいV8ブランチには多くの上流変更が含まれ得るが、その影響は組み込み構成とワークロードに左右される。

このリリースはセキュリティアドバイザリを引用していない。ネイティブ依存関係の更新は、既に修正された欠陥への露出を減らせる可能性があるが、その結論には文書化された脆弱性マッピングが必要となる。公開されたCodexの注記には、それがない。

また、新しいアーキテクチャ対応も発表していない。更新されたアーカイブはターゲット固有のアーティファクトを保持・更新するが、チェックサムの変更が新たなターゲットを生み出すわけではない。プラットフォームの拡大には、明示的な新規マッピングまたはリリース声明が必要だ。

公開GitHubインターフェースでは、マージイベント前後に30件中11件のチェックが通過したと表示されていた。ただし、GitHubはチェック詳細の読み込みエラーも表示していたため、この数値は慎重に扱う必要がある。このページから、19件のチェックが失敗したとは断定できない。

チェックは、キュー待ち、スキップ、キャンセル、あるいは公開閲覧者には利用不可のままである場合がある。個別結果がなければ、この集計スナップショットからリリース品質について結論を導くことはできない。マージそのものは、リポジトリで設定されたプロセスがこの変更のmainへの取り込みを許可したことを示している。

公開プルリクエストには、従来型の人間によるレビューも記載されていなかった。変更は自動化を通じて提出・マージされ、タイムラインはボット活動が中心だった。だからといって、人間が他の場所で一度も評価しなかったことにはならない。

ブランチ名とGitOrigin-RevIdは、別の開発コンテキストからの同期を示唆している。公開リポジトリが公開するのは結果としてのコミットであり、その前に行われたすべての判断ではない。公開プルリクエストを完全なレビュー記録として説明するのは不正確だろう。

プレリリースのラベルも、別の不確実性を加える。これは、そのアーティファクトを通常の安定版Codexリリースと混同すべきではないことを示す。ただし、GitHubのラベルだけでOpenAIの内部デプロイ状況や本番利用を定義することはできない。

最大の技術的不確実性は、ソースビルドのカバレッジに関わる。リリースでは、V8が想定するllvm-libcヘッダーパスを具体的に修正している。これはソース経路に新しい配線が必要だったことを示すが、注記にはテスト済みのホストとターゲットの組み合わせは列挙されていない。

クロスプラットフォームのネイティブビルドは、コンパイラごとに異なる形で失敗する可能性がある。Microsoftのコンパイラ、Appleのツールチェーン、一般的なLinuxツールチェーンは、それぞれ異なる環境を通じてプラットフォームの詳細を解釈する。アーカイブが利用できることは、あらゆるソース構成が同一に動作する保証にはならない。

パッチの耐久性も未解決の問題だ。OpenAIはこのV8バージョン向けに下流パッチを更新したが、将来のV8変更で同じファイルが再び移動する可能性がある。アップグレードのたびに、それらのパッチが依然として必要かを判断しなければならない。

健全な長期的成果は、上流との整合によってパッチ差分を減らすことだろう。公開リリースはその結果を約束していない。既存の統合を現在のソーススナップショットに適応させているにすぎない。

この更新では、このリリースを選んだ理由も明らかにされていない。通常の依存関係更新サイクル、互換性上の必要性、あるいは公開されていない作業を支援する目的かもしれない。証拠が裏付けるのは時期と仕組みであり、非公開の動機ではない。

この区別は、GitHubリリースを報じる上で重要だ。リポジトリのメタデータは正確な実装変更を明らかにできる一方、事業上の文脈はほとんど提供しないことがある。責任ある分析では、可視化されたサプライチェーン操作と製品戦略に関する推測を分けなければならない。

したがって、最も強く正当化できる結論は限定的だ。OpenAIは、バイナリとソースの両経路を通じてrusty_v8 150.4.0を利用するために必要な入力を調整した。このコミットは、作成時点で既知だった構成不整合を減らしている。

この構成が信頼性を維持するかどうかには、継続的なテストが必要だ。また、V8、rusty_v8、LLVMコンポーネント、ビルドツールが進展するたびに、今後の更新も必要になる。厳密なピン留めが生むのは安定したスナップショットであり、恒久的な互換性ではない。

CodexのV8アップグレード後に注目すべき3つのシグナル

次に確認すべき証拠は、追随する修正、安定版リリースでの採用、下流パッチセットの変化から得られる。

最初のシグナルは、rusty-v8 150.4.0に結び付く修正コミットだ。ヘッダー不足、アーカイブのダウンロード失敗、チェックサム不一致、ターゲット固有のリンクに関する追随変更があれば、当初の統合評価は弱まる。

静かな期間は、逆の解釈を支える。それは、同期されたピンと更新済みアーティファクトが、リポジトリで有効なビルド経路全体で維持されたことを示唆する。沈黙は証明ではないが、有用な運用上の証拠ではある。

V8、llvm-libc、libc++、または150.4.0タグへの言及について、Issueトラッカーと後続のGitHubリリースを確認すべきだ。ネイティブ障害はターゲットの詳細に依存することが多いため、具体的なプラットフォーム報告は一般的な苦情より情報価値が高い。

2つ目のシグナルは、通常の安定版Codexリリース経路に現れることだ。現行タグは、rusty-v8コンポーネント向けのプレリリースと明示されている。後に安定した製品リリースへ組み込まれれば、この依存関係がさらなる統合に耐えたことを示す。

このシグナルは、これが孤立したパッケージング実験ではなく、通常のインフラストラクチャ進展だったという見方を強める。反対に、プレリリースの状態が続けば、より広範な採用は不確実なままだ。

読者は、安定版での採用を機能の公開と同一視しないようにすべきだ。この依存関係は、ユーザーに見えるインターフェースを変えずに、内部実行やテストを支援する可能性がある。安定性と機能への影響は別の問題である。

3つ目のシグナルは、次回のV8更新時におけるOpenAIの下流パッチセットの方向性だ。パッチが減れば、上流V8との整合性向上またはBazel統合の改善を示す。パッチが増えれば、保守対象領域が広がっていることを示す。

パッチ数だけでは決め手にならない。小さなパッチ1つが高いリスクを伴う場合もあれば、複数の機械的パッチが単純なままの場合もある。より良い尺度は、各パッチに明確な適用範囲があり、引き続き問題なく適用できるかどうかだ。

llvm-libcヘッダーのエイリアスには、とりわけ注意を払うべきだ。後続のV8またはrusty_v8リリースが必要なヘッダーを直接公開するようになれば、OpenAIはローカル配線を削除する可能性がある。そうでなければ、そのエイリアスはリポジトリの互換性契約の一部であり続ける。

これらのシグナルの中では、アーカイブのカバレッジも有用な詳細だ。新しいターゲットアーティファクトは配布対応の拡大を示し、削除されたターゲットはビルド済みバイナリの利用可能性を狭める可能性がある。いずれの変更も、V8をローカルでコンパイルしなければならない人に影響する。

Codexのソースを使う開発者は、問題を報告する際に正確な失敗境界を記録すべきだ。OS、アーキテクチャ、コンパイラ、Bazelバージョン、選択したビルド経路は、アーカイブの問題とソースビルドの問題を区別する助けとなる。

メンテナーは、関連ファイルの近くに依存関係の文脈も残すべきだ。厳密なバージョン、整合性ハッシュ、Gitリビジョンは、ビルドが何を利用するかを説明する。パッチコメントでは、上流ソースを変更する必要がある理由を説明すべきだ。

ネイティブのアップグレードは繰り返されるため、この規律は重要である。今日慎重にレビューされた例外が、明日には理由不明の要件になり得る。検索可能なビルド記録は、こうした判断を再構築するための時間を減らす。

GitHubリリースを追う読者にとって、実践的な要点はタグ名だけに注目しないことだ。ネイティブクレートの更新には、ソース、バイナリ、ツールチェーン、ローカルパッチをまたぐ同期作業が隠れている場合がある。Codexの変更は、その作業を異例なほど可視化している。

この更新は、類似の発表を評価する際の有用な基準も示している。プロジェクトがマニフェストだけを変更したのか、それともソースバージョン、アーカイブ、整合性値、コンパイラのピン留め、ビルドターゲットを整合させたのかを確認すべきだ。

次に、リリースが主張していないことを確認する。ベンチマーク、アドバイザリ、プラットフォームに関する発表がなければ、パフォーマンス、セキュリティ、互換性に関する結論を作り出してはならない。保守作業は、機能の物語にならなくても重要になり得る。

最後に、リポジトリが今後数週間で修正を必要とするかを見守るべきだ。追随修正は弱い境界を明らかにする。安定版での採用とパッチ差分の縮小は、現在のアプローチを支えることになる。

これこそが、このリリース記録の真の価値だ。見えなかった依存関係移行を、監査可能な構成変更へと変える。次のGitHubリリースで、周辺ツールチェーンが変化する中でもこの構成が一貫性を保つかどうかが分かる。

 
 

無料で始めましょう

ローカルファーストのパーソナル知識管理付きAIアシスタント

より良いAI体験のために、

remio は現在、 Windows 10+ (x64)M-Chip Mac のみをサポートしています。

仕事のAIパートナー
remioでもっと仕事が進む

計画・作成・仕上げまで
すべてをひとつに

bottom of page