Tabs can now be dragged to reorder within a group and to move between sections in one gesture: dropping on a tab's left/right half inserts before/after it and adopts that tab's section, while a dedicated zone past the last group ungroups and appends at the end. A blue indicator line shows the drop position while dragging. core/notes.reorder() takes the full new page-id order computed client-side (NotePanel.vue has the reactive list already) rather than recomputing positions server-side, validates it against the current page-id set, sets the moved page's section, then renumbers position. POST /api/notes/reorder exposes it. Also adds docs/notes-guide.md, an end-user walkthrough of the shared notes panel (pages, sections, drag-and-drop, AI interaction) — the existing docs were all developer-facing specs with no operating instructions for the feature itself. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.8 KiB
API リファレンス
ベースURL: http://localhost:8000
Swagger UI: http://localhost:8000/docs
チャット
POST /chat/stream
SSE でストリーミング応答を返す。
リクエストボディ
{
"message": "こんにちは",
"session_id": "uuid(省略時は新規セッション作成)",
"model": "gpt-5.4(省略時は DEFAULT_MODEL)"
}
SSE イベント
| type | value | タイミング |
|---|---|---|
session_id |
セッション UUID | 新規セッション作成直後 |
chunk |
テキスト断片 | LLM トークン生成ごと |
notes_updated |
— | AI が共有ノートを書き換えた直後 |
done |
— | 正常完了 |
error |
エラーメッセージ | 例外発生時 |
GET /chat/sessions
セッション一覧を updated_at 降順で返す。
レスポンス
[
{
"id": "uuid",
"title": "セッションタイトル",
"model": "gpt-5.4",
"updated_at": "2026-06-01T12:00:00"
}
]
GET /chat/sessions/{session_id}/messages
セッションのメッセージ一覧を created_at 昇順で返す。
レスポンス
[
{ "id": 1, "role": "user", "content": "...", "created_at": "..." },
{ "id": 2, "role": "assistant", "content": "...", "created_at": "..." }
]
DELETE /chat/sessions/{session_id}
セッションと紐づくメッセージ・メモリをすべて削除。204 No Content を返す。
メモリ
GET /memory/{session_id}
セッションの長期メモリ(要約)一覧を created_at 昇順で返す。
レスポンス
[
{
"id": 1,
"session_id": "uuid",
"summary": "要約テキスト",
"created_at": "2026-06-01T12:00:00"
}
]
DELETE /memory/{memory_id}
特定のメモリエントリを削除。204 No Content を返す。
共有ノート
ユーザーと AI が共同編集するノート。ページのタイトル一覧は毎回システムプロンプトに注入され、
本文は AI が read_note / write_note ツールで読み書きする。
section を設定すると、同じセクション名のページはタブバー上で常に連続してグループ表示される。
GET /api/notes
全ページを position 昇順で返す。同じ section のページは常に連続する(隣接=同一グループとして扱われる)。
レスポンス
[
{
"id": 1,
"title": "買い物リスト",
"content": "- 牛乳
- 卵",
"position": 0,
"section": "生活",
"updated_at": "2026-08-19T12:00:00"
}
]
POST /api/notes
ページを新規作成し、201 Created で作成したページを返す。
section を指定すると、作成直後にそのセクションの末尾へ配置される(他ページの position も再採番される)。
リクエスト
{ "title": "新しいページ", "content": "", "section": null }
PATCH /api/notes/{page_id}
ページのタイトル・本文・セクションを更新する。指定したフィールドだけが変更される。
タイトルを空文字にしようとした場合は 400、ページが存在しない場合は 404 を返す。
section はリクエストボディにキーとして含まれているかどうかで判定する(null を明示的に送るとグループ解除)。
セクションを変更すると、そのページは新しいセクションの末尾(該当ページが無ければ末尾)へ移動し、
全ページの position が振り直される。
リクエスト
{ "content": "更新後の本文", "section": "生活" }
POST /api/notes/sections/rename
old_name セクションに属する全ページを new_name セクションへ一括で付け替える。
new_name を空文字/未指定にすると、そのセクションの全ページのグループを解除する。
ページの並び順(position)は変更しない。
リクエスト
{ "old_name": "生活", "new_name": "生活雑貨" }
レスポンス
{ "renamed": 2 }
POST /api/notes/reorder
タブのドラッグ&ドロップによる並べ替えを反映する。order には全ページIDをドラッグ後の
新しい順序で渡す(サーバー側では計算しない。フロントが store.pages から算出する)。
page_id のページには先に section を設定してから、order の順に position を振り直す。
別セクションのタブの前後にドロップした場合は、そのセクションへの移動も兼ねる。
order が現在の全ページIDの集合と一致しない場合は 400 を返す。
リクエスト
{ "page_id": 3, "section": "生活", "order": [1, 3, 2, 4] }
レスポンス
{ "reordered": 4 }
DELETE /api/notes/{page_id}
ページを削除。204 No Content を返す。
ログ
GET /logs
LLM API 呼び出しログを created_at 降順で返す。
クエリパラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
session_id |
string | セッションで絞り込み |
status |
ok / error |
成功・失敗で絞り込み |
limit |
int (≤500) | 最大件数(デフォルト 100) |
offset |
int | スキップ件数 |
レスポンス
[
{
"id": 1,
"session_id": "uuid",
"model": "gpt-5.4",
"request_json": "[{\"role\":\"user\",\"content\":\"...\"}]",
"response_text": "...",
"error": null,
"latency_ms": 832.5,
"created_at": "2026-06-01T12:00:00"
}
]
DELETE /logs/{log_id}
指定ログを削除。204 No Content を返す。
ヘルスチェック
GET /health
{ "status": "ok" }