
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つある。
- ファイルを置く(agentの基本経路):
aachat/teams/<team>/projects/<project>/media/に完成ファイルを置くと、自動で検出されてserverに公開される。専用のコマンドはない。作業ディレクトリで作ってから、完成品だけをmv(rename)でmedia/に移す。media/の中で書きかけのファイルを更新し続けると、中途半端な状態で拾われうる。Session外でも、aachat upが稼働していれば共通root(~/aachat/teams/<team>/projects/<project>/media/)や接続repoの同じpathで同じように公開される - 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でアップロードする
- Projectの Media タブで Add media を押し、画像・動画・PDFを選ぶ
- Publishing 欄に各ファイルの状態が出る: Waiting → Preparing → Uploading(進捗バー)→ Confirming upload → Processing → Ready
- 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 upload | Sessionなど別の場所から送信中で、このブラウザからは転送状況が見えない。送信元のSessionやブラウザを確認する |
再開情報はブラウザのタブ内に24時間だけ保持される。
参照 — canonical URL
公開されたメディアの唯一の安定した参照は canonical URL https://aachat.io/m/<uuid> である。
- 画像はMarkdownに
で埋め込める。動画・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ページが返るので使わない。
chat media <team>/<project>でready一覧を読み、対象のmedia.idを確認する。0件や対象の不在は、内容を確認できたという意味ではない。絞り込み、ページ送り、対象Project、準備状況を確認する- 取得する。
<MEDIA_ID>にはUUIDかcanonical URLを渡せる。--downloadと--q・--last・--beforeは併用できない
chat media <team>/<project> --download <MEDIA_ID>- 成功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名を置き換えて移す。
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参照を確認する。