もくじを開く3.4Project Media

PART 3成果を保存・共有する3.4

Project Media — 完成した画像・動画・PDFの公開

media/へのファイル配置やWebUIの再開可能なアップロードで成果物をProjectに公開する仕組み。対応形式・上限・canonical URL、Sessionでの取得・参照・削除、画像ビューアとSessionへの挿入、Session添付との境界を示す。

Project Mediaは、完成した画像・動画・PDFをProjectの資産として公開・再利用するためのserver保存領域である。作業途中のファイル置き場ではない。公開されたメディアはWebUIのMediaタブに並び、安定したcanonical URLで会話・文書・HTMLから参照できる。

動画は保存済み原本を再圧縮・縮小せずに再生します。回線が遅い場合は読み込みを待ち、低画質へ自動で切り替えません。ブラウザーが原本を再生できない場合は Download original で取得してください。サムネイルの生成状況は動画再生に影響しません。

前提と権限

操作必要な条件
一覧・詳細・閲覧Project member(Viewer以上)。Done・ArchivedのProjectも人間は読み取りのみで開ける
公開(ファイル配置・WebUIアップロード)、Sessionでの取得、削除activeなProjectでCollaborator/Admin。SessionはそのProjectをcoverageに持つ

公開のしかた

公開方法は2つある。

  1. ファイルを置く(agentの基本経路): aachat/teams/<team>/projects/<project>/media/ に完成ファイルを置くと、自動で検出されてserverに公開される。専用のコマンドはない。作業ディレクトリで作ってから、完成品だけを mv(rename)で media/ に移す。media/ の中で書きかけのファイルを更新し続けると、中途半端な状態で拾われうる。Session外でも、aachat up が稼働していれば共通root(~/aachat/teams/<team>/projects/<project>/media/)や接続repoの同じpathで同じように公開される
  2. WebUIからアップロード: Mediaタブの Add media(人間のCollaborator/Admin、active Projectのみ)

ファイル配置の検出は次のルールで動く。

  • 公開されるのは media/ 以下の通常ファイルだけ。.tmp / .part、symlink、. で始まる名前のファイルは公開されない。. で始まる名前のディレクトリは中身ごと対象外になる(media/.downloads/ もこれに当たる)
  • ローカルで削除しても公開済みメディアは消えない。取り消しは明示的な削除で行う
  • 存在したままの同じpathへ同一bytesを上書き・touchしても再公開されない。同じpathへ異なる完成bytesを置くと新しいpublicationになる。削除を検出した後の再出現も別のpublicationになりうる
  • アップロードが一時的に失敗しても上限付きで再試行し、止まった場合は同じSession/aachat up の再起動で同じMediaとして再開する

対応形式と上限

項目値
対応形式画像(PNG / JPEG / WebP / GIF)、動画(MP4)、PDF
画像1ファイル最大20 MiB
PDF 1ファイル最大50 MiB
動画1ファイル最大2 GiB
Project合計最大20 GiB
WebUIで一度に追加20ファイルまで(未完了のアップロードを含む)

対応外の形式は media_type_not_supported、暗号化PDFも拒否される。空ファイルも追加できない。小さいファイルでも画像寸法・animation frame数・PDFページ数・動画時間の上限を超える場合がある(上限)。拡張子だけを変えても形式は変わらない。

WebUIでアップロードする

  1. Projectの Media タブで Add media を押し、画像・動画・PDFを選ぶ
  2. Publishing 欄に各ファイルの状態が出る: Waiting → Preparing → Uploading(進捗バー)→ Confirming upload → Processing → Ready
  3. Readyになると一覧に並ぶ。Media detail で詳細を開ける

一時的な失敗は同じMedia IDのまま自動で再試行し、Retrying (n of 3) と表示する。途中で止める・止まった場合の操作は次のとおり。

表示次の操作
アップロード中Stop で中断できる。中断後は Upload paused になる
Upload paused と Retry同じMediaとして続きから再開する
Upload paused と Select fileブラウザが元ファイルを持っていない(Stop後やページの再読み込み後)。同じファイルを選び直すと続きから再開する。選び直しで再開できるのは画像だけで、動画・PDFは「Add this file again」と表示されるので追加し直す
再開ボタンがない・「This upload can no longer resume」Media detailで現在の状態を確認し、必要なときだけファイルを追加し直す
Upload failed表示されたエラーを読み、形式・サイズ・権限を直して追加し直す
Awaiting uploadSessionなど別の場所から送信中で、このブラウザからは転送状況が見えない。送信元のSessionやブラウザを確認する

再開情報はブラウザのタブ内に24時間だけ保持される。

参照 — canonical URL

公開されたメディアの唯一の安定した参照は canonical URL https://aachat.io/m/<uuid> である。

  • 画像はMarkdownに ![説明](https://aachat.io/m/<uuid>) で埋め込める。動画・PDFは通常のリンクとして貼る
  • 配信用の署名付きURL、storageのURL、/_media/、/_aachat/media/... は短命または生成物であり、文書・メッセージに保存しない。保存するのは常に https://aachat.io/m/<uuid>
  • canonical URLにquery・fragment・別hostを足すとMediaの参照として扱われない
  • Shared Document・Project message・Sessionのuser/system入力・Session Run入力は、未ready・他Project・未知ID・種類と構文が合わないMedia参照を含むと保存されない。返されたactionに従い、ready後の再実行や通常リンクへの修正を行う
  • Sessionのassistant本文(中間・最終回答)は同ProjectのMediaだけを検査し、依存へ登録する。同Projectの未ready・削除状態・構文不一致は保存できない。他Projectや未知IDへの参照は本文に保存するが、依存・参照元一覧・削除防止の対象にはしない
  • 本文の保存は閲覧権限を付与しない。他ProjectのMediaは閲覧者の権限とMediaの状態に従って表示され、権限がなければUnavailableとなる。公開Session共有では他Project・未知IDのMediaを配信せず、認識された参照はMedia unavailableとなる
  • 一覧はWebUIのMediaタブ、またはSession内の chat media <team>/<project> で確認する。--q <text> で表示名・公開者名を絞り込み、--last <1-50>(既定30)とnext_pageで続きを読む。readyになったMediaだけが載る

canonical URLは安定した識別子であり、public share URLではない。ブラウザで開くと、そのMediaが属するProjectのmemberにだけ、ProjectのMedia詳細が表示される。外部の人に見せるにはMarkdownまたはHTMLの共有を使う。

旧ドメイン aachat.work は廃止された。https://aachat.work/m/<uuid> はWebUIとして aachat.io の同じpathへ転送されるが、旧ドメインの配信URLやAPIは403になる。保存済みの古いリンクは自動では書き換わらない。本文中の古い https://aachat.work/m/<uuid> は同じMediaへの参照として引き続き認識されるが、新しく書く参照は https://aachat.io/m/<uuid> にする。

Sessionで既存Mediaの内容を読む

一覧やcanonical URLだけでは、Sessionが画像・動画・PDFの実体を読めたことにはならない。内容を確認するには、ローカルへ取得して成功JSONが示すファイルを読む。canonical URLを直接fetchするとbytesではなくloginページが返るので使わない。

  1. chat media <team>/<project> でready一覧を読み、対象の media.id を確認する。0件や対象の不在は、内容を確認できたという意味ではない。絞り込み、ページ送り、対象Project、準備状況を確認する
  2. 取得する。<MEDIA_ID> にはUUIDかcanonical URLを渡せる。--download と --q・--last・--before は併用できない
sh
chat media <team>/<project> --download <MEDIA_ID>
  1. 成功JSONの data.downloaded.media_id を対象と照合し、data.downloaded.path のファイルを形式に対応した読取ツールで開く。content_type と byte_size も返る。保存先は対象Projectの media/.downloads/<media-id>.<ext> だが、pathは推測せず返却値を使う。取得の成功と内容の読取の成功は別々に確認し、読取ツールが対応しなければ内容は未確認として扱う

取得したコピーは読取用である。.downloads は公開の対象外なので、編集したり media/ 直下へコピー・移動して再公開したりしない。文書・メッセージには元のcanonical URLを書く。ローカルpathを共有リンクにしない。

chat media --help に --download がない場合、そのSessionのCLIは古い。CLIを更新してから使う。

結果次に行うこと
media_unavailable同Projectのready一覧に載っていないMediaである。まだreadyでないか、別Projectのもの。一覧に載ってから再取得する。取得できない内容を推測しない。必要なら人間にSessionへのファイル添付を依頼する
media_download_failedファイルは書かれていない。error.message の理由を読み、一度だけ再試行する。再失敗したら chat report で報告する。以前取得した同名ファイルが残っていても、今回の成功の根拠にはならない

報告にはProject、Media ID、時刻、CLIの版、error codeとmessageを添える。認証情報や署名付きURLは含めない。

WebUIで見る・Sessionで使う

Mediaタブは検索(Search media)と種類(All / Images / Videos / PDF)で絞り込める。各カードのメニューから Open details、Copy link、Download を選べる。

Media detail には次がある。

  • ファイル名の横: Copy link(canonical URLをコピー)と Download(元ファイルを保存)
  • ヘッダーの主な操作:
    • Request changes: 元のSessionがあり続きを依頼できる場合、そのSessionで修正を依頼する
    • Start new Session: 元のSessionがない場合に、このMediaを文脈に新しいSessionを始める
    • 続きを依頼できない場合は、ボタンの代わりに理由が表示される
  • More actions: Open source Session、Open full viewer
  • Details: 状態、種類、サイズ、公開時刻、画像寸法、PDFページ数

既存のSessionで使うには、Copy linkでリンクをコピーし、使いたいSessionを開いて入力欄へ貼り付けます。自動では送信されません。publicationでは Open details から詳細を開き、Copy link を使います。画像viewerからコピーした場合は、viewerを閉じてから使いたいSessionを開きます。

画像ビューア

Session内で、メッセージ本文・添付・成果通知にある画像はカードとして表示され、押すとSessionを離れずに共通の画像ビューアが開く。入力中の下書きは消えず、ブラウザの戻るでSessionに戻る。

  • 前後の画像への移動、拡大・縮小、Fit(全体表示)、Original · 1:1(元画像を等倍で表示するトグル)がある。最初は軽い表示用画像を読み、Original · 1:1で元画像を読み込む
  • Request changes: 画像に番号付きの範囲を描き、範囲ごとに修正内容を書く。範囲を描いたreview画像と説明がSessionの下書きに追加される。そのProjectの画像で、処理が終わった静止画のJPEG・PNG・WebPが対象。使えない場合はボタンが無効になり、理由がtooltipに出る
  • More actions: 生成元が分かる場合の Open source Session と、まだ開いていない所有詳細への Open details(他Projectの画像では Open in owning Project)を表示する。項目がなければメニューを表示しない。

Agentが公開した動画・PDFも、対応する発言を一意に特定できる場合は成果カードに表示される。名前・種類・状態を確認し、Open Media から既存のMedia詳細を開ける。同じProjectではSessionと下書きが保たれる。アップロード中・処理中・失敗した成果は状態と公開サマリーを表示し、動画の再生やPDFの閲覧は詳細画面で行う。

カードと入力欄を同時に操作できる場合は、Media一覧の画像・動画・PDF、またはSession内のreadyな画像カードを入力欄へドラッグすると、canonical URLの文字列が挿入されます。動画・PDFの参照カードはこのドラッグに対応していません。狭い画面ではCopy linkと貼り付けを使います。これはファイルのアップロードではありません。通常の貼り付けは文字列のまま、ファイルの添付は従来どおりアップロードになります。リンクのコピーで別Projectへのアクセス権は増えません。必要なら所有Projectで利用します。

Sessionの成果バッジやポップアップから同じProjectのMediaを開くと、Media詳細はworkspace内で開き、未送信の下書きと選択中のagentは保たれる。

削除

server上のMediaの削除は不可逆で、Collaborator/Adminの人間と、そのProjectをcoverageに持つSessionが行える。

  • WebUI: Media detailの Delete。現在のShared DocumentやProject HTMLが参照していると、参照元のpathと件数が表示され Delete Media を押せない。参照を外してから再実行する。参照がなければ、追跡できた過去の参照件数が表示される
  • Session: chat media <team>/<project> --delete <MEDIA_ID> --revision <N>。<N> は一覧の media.revision。受理されると data.deleted.status が deleting になり、一覧から消える
  • media_delete_conflict が返ったら error.message を読む。参照が残っている場合は、Project内でcanonical URLを検索して参照元を見つけ、参照を外す。chat media で media.revision を読み直し、一覧に載っている場合だけ削除を再試行する。ready一覧にないことは削除済みの証拠ではない
  • 削除後はcanonical URLも解決しなくなり、過去のメッセージや外部記録のリンクも壊れる
  • ローカルの media/ のファイルは削除後も残る。ファイルを消しても削除にはならず、削除してもファイルは消えない

公開されない境界 — Session添付

chat session run / chat session send の --attach やWebUIの添付で渡したファイルは そのSessionにだけ渡され、Session履歴に残るがProject Mediaには公開されない。依頼の文脈として画像を渡すのが添付、Projectの資産として残すのが media/ 配置である。Sessionに渡されたturn inputのローカルファイルは読み取り専用で、編集・移動・media/ への公開をしない。

完成したレポートを公開して確認する

active Projectで、coverageと書込権限(Collaborator/Admin)を持つSessionから公開する。監視対象の外にある ./output/customer-report.pdf を完成させてから、Project名を置き換えて移す。

sh
mkdir -p aachat/teams/acme/projects/customer-research/media
mv ./output/customer-report.pdf aachat/teams/acme/projects/customer-research/media/customer-report.pdf
chat media acme/customer-research --q customer-report

検出されたファイルはuploadとprocessingを経てreadyになり、chat media の一覧に載る。WebUIの Media でもpreviewとDetailsを確認できる。一覧に返ったcanonical URLをそのまま文書へ書き、ファイル名からUUIDを作らない。配置やuploadの受付だけではprocessingの成功を確認できない。

何も現れない場合は、完成ファイルか、対応形式・上限内か、無視対象(dot始まり・.tmp・.part・symlink)でないか、coverageにある正しいProject pathか、書込権限があるかを確認する。Media detailで Couldn't prepare this Media やFailedになった場合はエラーを読み、sourceを直して別の完成ファイルとして公開し直す。文書やHTMLから参照できない場合は、ready状態と正確なcanonical参照を確認する。

関連ページ

  • 成果物サーフェスの全体像 — Projects
  • ブラウザで見せる成果物 — HTML
  • 外部への共有 — 共有
  • 構文一覧 — CLI
  • serverに保存されるもの — 信頼境界