AWS謹製のClaude.ai Artifactsクローン「Open Artifacts for Amazon Bedrock」を試しました

Claude.aiのArtifacts便利ですよね。

Artifactsを模したアプリがGitHubのAWS Samplesリポジトリに存在しました。

* Open Artifacts for Amazon Bedrock

https://github.com/aws-samples/open_artifacts_for_bedrock

この記事では「Open Artifacts for Amazon Bedrock」に付いて紹介します。

## Open Artifacts for Amazon Bedrock

Open Artifacts for Amazon Bedrockは、Next.jsアプリーケーションとして提供されています。バックエンドのコードインタープリター部分はDockerコンテナで実現されています。

* 主要な使用ライブラリー
    * react: 18
    * next: 14.2.4
    * tailwindcss: 3.4.1
    * ai: 3.2.15
    * @ai-sdk/amazon-bedrock: 0.0.5
    * @ai-sdk/anthropic: 0.0.23
    
「ai」というライブラリーはVercel AI SDKです。

https://sdk.vercel.ai/docs/introduction

> Vercel AI SDK は、開発者が React、Next.js、Vue、Svelte、Node.js などを使用して AI を活用したアプリケーションを構築できるように設計された TypeScript ツールキットです。

コードインタープリター部分のDockerfileはこちらです。「Python 3.10」のベースイメージにいくつかライブラリーとフォントをインストールしています。（中国の方が作成されたようで、Noto Fontsがインストールされるようになっています）

```Dockerfile
FROM python:3.10

# Set working directory
WORKDIR /app

RUN apt-get update && apt-get install -y \
    wget \
    bzip2 \
    ca-certificates \
    libglib2.0-0 \
    libxext6 \
    libsm6 \
    libxrender1 \
    git \
    graphviz \
    unzip \
    && rm -rf /var/lib/apt/lists/*

# 更新包列表并安装字体
RUN apt-get update && apt-get install -y \
    fonts-wqy-microhei \
    fonts-wqy-zenhei \
    fonts-noto-cjk \
    && rm -rf /var/lib/apt/lists/*

# 使用 Google Noto Fonts（广泛支持多种语言）：
RUN wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKsc-hinted.zip \
    && unzip NotoSansCJKsc-hinted.zip -d /usr/share/fonts/noto \
    && fc-cache -f -v \
    && rm NotoSansCJKsc-hinted.zip


# Install Python packages using pip
RUN pip install --no-cache-dir numpy pandas scipy scikit-learn matplotlib seaborn jupyter_client \
    diagrams requests bs4 requests openpyxl

# Set default command
CMD ["python"]
```

### プロンプトとツールの仕組み

システムプロンプトでは、「あなたはPythonとJavaScriptの開発者です」というロールが指定されています。PythonのツールとJavaScriptのツールの仕様が説明されています。

```typescript:app/api/chat/route.ts
`
You are a skilled Python and Javascript developer.
You are also expert of data science and data analysis, and you are also expert of solution architecture of AWS, Google Cloud, Azure, etc.
You are very familiar with the following tools and libraries:
For Python:
<python_libraries>
pandas, numpy, matplotlib, seaborn, scikit-learn, diagrams, etc.
</python_libraries>

For JavaScript:
<js_libraries>
d3, react, canvas, threejs, cannonjs, etc.
</js_libraries>

You have the ability to choose the appropriate tools and run Python or JavaScript code to solve the user's task. Code for each programming language runs in its own context and can reference previous definitions and variables.
Your code will be run in a seperate sandbox, so you don't write the code that contains code to read the data or file locally.
Here is extra guidance that help you to prevent bugs:
<guidance>
1. when you use matplotlib to plot a chart, you should not generate code "plt.style.use('seaborn')", because it will errors, you can use plt.style.use('ggplot') instead.
2. when you use  matplotlib to plot a chart, to add chinese font, you should add the following code before plotting:
    <code_snippet>
    plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei']  # 使用文泉驿微米黑
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    </code_snippet>
</guidance>
`
```


ツールは「runPython」「runJs」の２つが用意されています。

* runJs

こちらは特に処理がなく、JavaScriptのコードが画面側に返却されるようでした

```typescript:lib/local-sandbox.ts
export async function runJs(userID: string, code: string) {
    const result ={
      logs:{stdout:[],stderr:[]},
      error:undefined,
      results:[{html:code}]
    }
    return result
  }
```

* runPython

Pythonの方は、Dockerコンテナを起動し、実行結果を取得する形式です。
Bedrockが生成したPythonコードと添付ファイル（ユーザーが添付した場合）を永続化後、ボリュームマウントを使ってDockerコンテナに渡します。

```typescript:lib/local-sandbox.ts
const dockerCommand = `docker run --rm -v "${workingDirPath}:/app" -w /app ${pythonContainer} python ${tempPrefix}_temp_script.py`;
```

Pythonコード実行後、おそらく画像が同じディレクトリにPNGで出力されるようで、ディレクトリ内のPNGファイルを取得し、画面側に返却するような動作となっています。


### 構築方法

Node.js、Yarn、Dockerを事前にインストールしておきます。

まずソースをクローンします。

```console
git clone https://github.com/aws-samples/open_artifacts_for_bedrock.git
```

コードインタープリターのDockerイメージをビルドします。

```console
cd open_artifacts/docker_files

docker build -t python3.10 .
```

.envファイルを作成します。AWS CLI導入済みであれば、AWS_ACCESS_KEY_IDなどの設定は不要です。

```text
AWS_ACCESS_KEY_ID=*******
AWS_SECRET_ACCESS_KEY=******
AWS_REGION=us-east-1
PYTHON_DOCKER_IMAGE=python3.10
MODEL_ID=anthropic.claude-3-5-sonnet-20240620-v1:0
USERNAME=
PASSWORD=
```

ビルドして起動します。

```console
cd ..
yarn
yarn dev
```

ブラウザで`http://localhost:3000/`にアクセスします。

.envに設定したユーザー名とパスワードでログインします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/79912d54-40f3-c8b7-ae29-b035dbf36889.png)

ブロック崩しゲームを作ってみました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/281c1f53-5ead-40d9-a9e1-49dc6e787c88.png)

右半分が「code」と「Preview」で切り替えられます。切り替えるとブロック崩しゲームが表示されます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ccbaa8b8-cf3b-661b-5b51-9c84436b7a10.png)

:::note
矢印キーをつかって遊べます！
:::

追加でボールの色を変更してもらいました。いい感じです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0cdcdf38-57a6-8c50-7045-9b4685affc75.png)

CSVを渡してグラフ化もできました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/13bdb89b-6db8-4b29-5db2-886e8b0c4ffa.png)

---

GitHubにはもう一つArtifactsのクローンがありましたので、こちらも追って検証してみようとと思います。

* Artifacts and Tools for Bedrock

https://github.com/aws-samples/artifacts-and-tools-for-bedrock