---
title: "GenAI Processorsを触ってみる 1/4 ~ Content APIについて ~ | grasys blog"
url: "https://blog.grasys.io/post/uema/genai-processors-1/"
description: "はじめまして！エンジニアのUemaです。 今回は、AIパイプラインをシンプルに書けるように設計された、Google DeepMind の新しいオープンソース Python ライブラリである「GenAI Processors」をGet Startedやexampleを参考にしながら触ってみたいと思います。 シンプルに書…"
---

# GenAI Processorsを触ってみる 1/4 ~ Content APIについて ~

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[Kanji Uema](/authors/uema/)
-   公開日：2025年10月29日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Gemini](/tags/gemini/)[#GenAI Processors](/tags/genai-processors/)[#Python](/tags/python/)[#Vertex AI](/tags/vertex-ai/)[#シリーズ: GenAI Processors](/tags/シリーズ-genai-processors/)

![GenAI Processorsを触ってみる 1/4 ~ Content APIについて ~](/_astro/hero.C_K8MFVT_Z2pqrHf.webp)

はじめまして！エンジニアのUemaです。

今回は、AIパイプラインをシンプルに書けるように設計された、Google DeepMind の新しいオープンソース Python ライブラリである「GenAI Processors」をGet Startedやexampleを参考にしながら触ってみたいと思います。

シンプルに書けるとはいえ、ライブラリの構成要素やコンセプトなどを理解しないと混乱するため、それらもまとめてみました。

4部構成となっていて、今回はPart1となっています。

Part1は、GenAI Processorsで扱われるコンテンツの構成要素が実装されているContent APIについて、まとめてみました。

シリーズの他の記事はこちらから見られます。  
[『GenAI Processorsを触ってみる』シリーズ一覧](https://blog.grasys.io/tags/%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-genai-processors/)

## GenAI Processorsとは

AIパイプラインを構築でき、効率的な並列コンテンツ処理を可能にする軽量の Python ライブラリです。

テキスト、音声、画像といった複数のデータ形式（マルチモーダル）を組み合わせ、リアルタイムで処理するような複雑なアプリケーションの開発を効率化することに特化しています。

## Content API

※ [Content API Colab](https://colab.research.google.com/github/google-gemini/genai-processors/blob/main/notebooks/content_api_intro.ipynb) より

GenAI Processorsライブラリには、`content_api` というモジュールがあります。これは、`ProcessorPart` や `ProcessorContent` と言ったGenAI Processorsで扱われるコンテンツの構成要素が実装されています。また、Utilityも実装されています。

テキスト、画像、音声といったマルチモーダルなデータを一貫した処理で扱えるようになっています。コンテンツを分類したりルーティングしたりするための`mimetype`や`substream_name`などのメタデータを添付することもできます。

この2つの要素は知っておくとGenAI Processorsライブラリの理解につながると思います。

### ProcessorPart

`ProcessorPart` は、プロセッサが扱うコンテンツの最小単位です。様々なPythonの型から `ProcessorPart` オブジェクトを作成できるため、テキスト、画像、音声、Pythonのdataclassのデータを格納できます。

ProcessorPartのAttributeは下記をご覧ください。

[https://colab.research.google.com/github/google-gemini/genai-processors/blob/main/notebooks/content\_api\_intro.ipynb#scrollTo=cAXSW37sZCj9](https://colab.research.google.com/github/google-gemini/genai-processors/blob/main/notebooks/content_api_intro.ipynb#scrollTo=cAXSW37sZCj9)

Plain textcontent\_copy

```
import dataclasses

import dataclasses_json
import requests
from genai_processors.content_api import ProcessorPart

print("########## テキストから")

text_data = "テキストパートです"
text_part = ProcessorPart(text_data)

print(f"ProcessorPart: {text_part}")
print(f"MIMEタイプ: {text_part.mimetype}")  # 'text/plain'として自動的に推論されます
print(f"テキストコンテンツ: '{text_part.text}'")

print("\n########## 画像(bytes)から")

def generate_gdm_logo_bytes() -> bytes:
    """generate_gdm_logo_bytes"""
    # The URL of the DeepMind logo image
    image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/DeepMind_new_logo.svg/2560px-DeepMind_new_logo.svg.png"
    headers = {"User-Agent": "genai_processors Colab"}
    response = requests.get(image_url, headers=headers, timeout=60)
    response.raise_for_status()
    return response.content

gdm_png_bytes = generate_gdm_logo_bytes()

image_bytes_part = ProcessorPart(gdm_png_bytes, mimetype="image/png")  # bytesの場合、mimetypeを指定

print(f"ProcessorPart: {image_bytes_part}")
print(f"MIMEタイプ: {image_bytes_part.mimetype}")
try:
    txt = image_bytes_part.text
except ValueError:
    print("textはありません")

print("\n########## dataclassから")

@dataclasses_json.dataclass_json  # JSONシリアライゼーションに重要
@dataclasses.dataclass
class MyStructuredData:
    id: int
    name: str
    tags: list[str]

my_data_instance = MyStructuredData(
    id=101,
    name="Alpha",
    tags=["important", "beta"],
)

dataclass_part = ProcessorPart.from_dataclass(
    dataclass=my_data_instance,
    role="system_event",
    metadata={"source": "internal_module"},
)

print(f"ProcessorPart: {dataclass_part}")
print(f"MIMEタイプ: {dataclass_part.mimetype}")
print(f"テキストコンテンツ (JSON): {dataclass_part.text}")
```

下記を参考に `ProcessorPart` オブジェクトを生成しました。詳細な使い方やその他の `ProcessorPart` のサンプルが気になる場合は下記を参照してください。

[https://colab.research.google.com/github/google-gemini/genai-processors/blob/main/notebooks/content\_api\_intro.ipynb#scrollTo=Y\_xs5YKoZCj8](https://colab.research.google.com/github/google-gemini/genai-processors/blob/main/notebooks/content_api_intro.ipynb#scrollTo=Y_xs5YKoZCj8)

### ProcessorContent

`ProcessorContent` は、1つ以上の `ProcessorPart` オブジェクトが集まったコレクションです。これは、会話のやり取りを表現したり、マルチモーダルの入力のコレクションによく使用されます。

コンストラクタに、`ProcessorPart` オブジェクト、`ProcessorPart` に変換できるデータ、`ProcessorPart` オブジェクトのリストを渡すことで `ProcessorContent` オブジェクトを作成できます。

`ProcessorContent` は、`ProcessorPart`のリストのように振る舞うため、for文でイテレートしたり、`.items()` メソッドを使うことで、mimetypeと`ProcessorPart`オブジェクトを取得できます。

Plain textcontent\_copy

```
from genai_processors.content_api import ProcessorContent, ProcessorPart, is_text

def generate_gdm_logo_bytes() -> bytes:
    """generate_gdm_logo_bytes"""
    # 「ProcessorPart」のサンプルコード参照

print("########## Content 1")

content1 = ProcessorContent(
    "これが最初のテキストパートです。",
    ProcessorPart(generate_gdm_logo_bytes(), mimetype="image/png", role="user"),
    "そして最後のテキストパートです。",
)

for part in content1:  # ProcessorContentは直接イテレートできます
    content_data = f"テキスト: {part.text}" if is_text(part.mimetype) else "[バイナリデータ]"
    print(f"  - mimetype: {part.mimetype}:, {content_data}")
print(f"Content 1の長さ: {len(content1)}")

print("\n########## Content 2")

# ProcessorPartオブジェクトのリストから
parts_list = [
    ProcessorPart("猫について", role="user"),
    ProcessorPart("猫は魅力的な生き物です！", role="model"),
]
content2 = ProcessorContent(parts_list)

for mime, part_obj in content2.items():  # .items()は(mimetype, ProcessorPart)を返す
    print(f"  - ロール: {part_obj.role}, mimetype: {mime}, テキスト: {part_obj.text}")
print(f"Content 2の長さ: {len(content2)}")
```

### Utility: as\_text()

`content_api.as_text()` は、`ProcessorContent` にあるmimetypeがtext/plainである`` `ProcessorPart` `` のテキストを連結します。

Plain textcontent\_copy

```
from genai_processors.content_api import ProcessorContent, ProcessorPart, as_text

def generate_gdm_logo_bytes() -> bytes:
    """generate_gdm_logo_bytes"""
    # 「ProcessorPart」のサンプルコード参照

print("########## as_text")
multimodal_content = ProcessorContent(
    ProcessorPart("最初のテキストがあります。", substream_name="other"),
    ProcessorPart(generate_gdm_logo_bytes(), mimetype="image/png"),  # これはas_textによって無視されます
    "続いてさらにテキストがあります。",
)

all_text = as_text(multimodal_content)
print(f"multimodal_contentから連結されたテキスト:\n{all_text}")

other_text_only = as_text(multimodal_content, substream_name="other")
print(f"'other'substreamからのテキスト:\n{other_text_only}")
```

[`content_api` モジュール](https://github.com/google-gemini/genai-processors/blob/main/genai_processors/content_api.py)には、`as_text()` 以外にもUtilityはあるので気になる場合はソースコードを確認してみてください。

## おわりに

テキスト、音声、画像などを格納して、マルチモーダルなデータを一貫した処理を行えるようにしたのはすごいと思いました。

GenAI ProcessorsのExampleを見ても、`ProcessorPart` や `ProcessorContent` がどの様なオブジェクトなのかわからなかったのですが、Content APIのGet Startedを見たり、動かしてみたりして理解することができたと思います。

次回は、Processorについてです。

## 参考

-   [「GenAI Processors」を発表: 強力で柔軟な Gemini アプリケーションをビルド](https://developers.googleblog.com/ja/genai-processors/)
    
-   [GitHub - google-gemini/genai-processors](https://github.com/google-gemini/genai-processors)
    
-   [Gemini Developer API と Vertex AI](https://ai.google.dev/gemini-api/docs/migrate-to-cloud?hl=ja&_gl=1*13ig326*_up*MQ..*_ga*OTU3ODkwMDA4LjE3NTk4Mjc0MTY.*_ga_P1DBVKWT6V*czE3NTk4Mjc0MTUkbzEkZzAkdDE3NTk4Mjc0MTUkajYwJGwwJGgxMzczNjE2NDU0)
    

こちらのリンクからシリーズ記事を一覧で見られます。よろしければこちらもご覧ください！  
[『GenAI Processorsを触ってみる』シリーズ一覧](https://blog.grasys.io/tags/%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-genai-processors/)

## この記事を書いた人

[![](/_astro/uema.CvdhHMEd_1hxSJA.webp)](/authors/uema/)

### [Kanji Uema](/authors/uema/)

Google CloudとPythonを活用し、データ基盤の設計・開発に取り組んでいます

[プロフィールと記事一覧](/authors/uema/)