メインコンテンツまでスキップ
バージョン: 2025-11-13-1650

1. バックエンド仕様 (API)

前提知識レベル:

  • FastAPI, Pydantic, SQLAlchemyに関する開発経験
  • REST API, OAuth2, JWTに関する知識

FastAPIで構築されたバックエンドAPI。主な責務は、認証、ビジネスロジックの実行、外部サービス連携です。

1.1. コンポーネント図​

コンポーネント説明
RoutersAPIエンドポイントを定義し、リクエストを適切なサービスにルーティングする。
Servicesビジネスロジックを実装する。LLMサービス連携やNetworkXMCPの呼び出しなど。
Models/SchemasPydanticモデルとデータベーススキーマを定義する。
Database InterfaceSQLAlchemyを使用してデータベースとのやり取りを抽象化する。
Auth LogicOAuth2/JSON Web Tokenによるユーザー認証・認可のロジックを実装する。

1.2. APIエンドポイント一覧​

1.2.1. 認証 (/auth)​

MethodPath説明
POST/register新規ユーザーを登録する。
POST/tokenユーザー名とパスワードで認証し、JWTアクセストークンを発行する。
GET/users/me現在認証中のユーザー情報を取得する。

1.2.2. 運用​

MethodPath説明
GET/healthサービスのヘルスチェックを行う。

1.2.3. チャット・LLM連携 (/chat)​

MethodPath説明
POST/conversations新しい会話を作成する。
GET/conversationsユーザーの会話一覧を取得する。
GET/conversations/{id}特定の会話の詳細を取得する。
GET/conversations/{id}/messages特定の会話のメッセージ一覧を取得する。
POST/processチャットUIからのメッセージを処理し、LLMやツール呼び出しを実行して最終結果を返す。
POST/recommend-layoutネットワーク概要に基づき、LLMが最適なレイアウトを推薦する。
GET/conversations/{id}/streamWebSocketの接続を確立するエンドポイント。ネットワークの更新通知、計算の進捗、LLMの思考プロセスなどをリアルタイムで送信する。

/chat/process の詳細​

  • Request Body:
{
"conversation_id": 12345,
"message": {
"role": "user",
"content": "次数中心性を計算して、重要なノードを大きく表示してください。"
}
}
  • Response Body (Success):
{
"message": {
"role": "assistant",
"content": "次数中心性を計算し、ノードのサイズに反映しました。"
}
}

このエンドポイントが呼び出された際の、Backend、LLM、NetworkXMCP間のより詳細な連携フローについては、以下のドキュメントを参照してください。

1.2.4. ネットワーク (/network)​

MethodPath説明
POST/uploadGraphMLファイルをアップロードし、新しい会話とネットワークを作成する。 multipart/form-data を使用。この処理の中でNetworkXMCPを呼び出し、デフォルトのレイアウトを計算して属性として保存する。詳細は新規会話開始(ネットワークアップロード)フローを参照。
GET/{network_id}/visdataネットワークの元データ、永続化された全属性、視覚マッピングルールをDBから読み出し、最終的なレンダリングデータ(nodes_dataとedges_data)を動的に組み立てて返す。
GET/{network_id}/exportネットワークをGraphMLファイルとしてダウンロードする。

/network/upload の詳細​

  • Response Body (Success):
{
"conversation_id": "conv_67890",
"network_id": "net_54321"
}

1.3. Backendによる動的なレンダリングデータ生成プロセス​

GET /network/{network_id}/visdata が呼び出された際に、Backendが実行する動的なレンダリングデータ生成プロセスは、本システムの柔軟性を支えるコア機能です。このプロセスは、最終的な視覚スタイルを永続化せず、リクエストの都度、永続化された「データ」と「ルール」から組み立てることで、状態の不整合を防ぎます。

データ変換フロー図​

プロセスは以下のステップで実行されます。

  1. 基礎データ(ネットワーク構造)の取得

    • networks テーブルから、リクエストされた network_id に紐づくGraphMLデータを読み込み、基本的なノードとエッジのリストを構築します。
  2. 全属性データの取得

    • attributes および attribute_values テーブルから、当該ネットワークに属するすべての属性(元データ由来、計算結果を含む)を読み込みます。
    • 効率的にアクセスできるよう、データを { element_id: { attribute_name: value, ... } } のようなMap形式に整理します。
  3. 視覚マッピングルールの取得

    • visual_mapping_rules テーブルから、現在適用されているすべての視覚ルール(例:「'次数中心性'を'NODE_SIZE'に線形スケールでマッピングする」)を取得します。
  4. レンダリングデータの組み立て(ルール適用)

    • Step 1で取得したノードとエッジのリストをループ処理します。
    • 個々のノード(またはエッジ)に対して、以下の処理を行います。
      • Step 2で取得した属性Mapから、その要素の属性値を取得します。
      • Step 3で取得した視覚ルールを一つずつ評価します。
      • ルール適用:
        • 例えば、「NODE_SIZE」に関するルールが存在し、それが「degree_centrality」属性に紐づいている場合、そのノードの degree_centrality の値をルールの定義(スケール種別、出力範囲など)に従って具体的なサイズ(例: 10.5)に変換します。
        • 「NODE_COLOR」に関するルールも同様に、属性値を具体的な色コード(例: #ffcc00)に変換します。
      • デフォルト値: 適用されるルールがない視覚的特徴(例: ノードの形状)については、システムで定義されたデフォルト値を適用します。
    • すべてのノードとエッジの視覚スタイルが決定されたら、Frontendのライブラリ(react-force-graph-2d)が要求する最終的なJSONフォーマット({ "nodes": [...], "links": [...] })に組み立てます。
  5. レスポンス返却

    • 組み立てられたJSONデータを、APIのレスポンスとしてFrontendに返却します。

6. デフォルトの視覚スタイル​

上記のプロセスにおいて、特定の視覚的特徴(例: NODE_SIZE)に適用されるマッピングルールが存在しない場合、システムは以下のデフォルト値を適用します。これにより、ユーザーがファイルをアップロードした直後でも、常に一定のスタイルでネットワークが描画されることを保証します。

  • 初期レイアウト (x, y座標)

    • 値: ネットワークのアップロード時にNetworkXMCPが計算したSpring Layoutの結果が、xおよびyという名前の属性として永続化されています。Backendはこれを読み込み、デフォルトのノード座標として使用します。
  • ノードサイズ (size)

    • デフォルト値: 5
  • ノードカラー (color)

    • デフォルト値: #82b3ff (システムのテーマカラーに合わせた明るい青)
  • エッジ幅 (width)

    • デフォルト値: 1
  • エッジカラー (color)

    • デフォルト値: #cccccc (他の要素を邪魔しない薄いグレー)

1.4. 主要なデータモデル (Pydantic Schemas)​

APIで送受信される主要なデータ構造です。

  • User
フィールド名型説明
idintユーザーID (Auto-increment)
usernamestrユーザー名
  • Token
フィールド名型説明
access_tokenstrJWTアクセストークン
token_typestrトークン種別 (例: "bearer")
  • Conversation
フィールド名型説明
idint会話ID
titlestr会話のタイトル
user_idintこの会話を所有するユーザーのID
created_atdatetime作成日時
updated_atdatetime更新日時
  • ChatMessage
フィールド名型説明
idintメッセージID
conversation_idstr所属する会話のID
rolestr発言者の役割 (user or assistant)
contentstrメッセージの本文
meta_datadict拡張用のメタデータ (JSON)
created_atdatetime作成日時
  • Network (DBモデル)

networksテーブルのスキーマ定義は、このドキュメント群における唯一の信頼できる情報源(Single Source of Truth)である 4. データベーススキーマ仕様 を参照してください。

conversationsテーブルがnetwork_idを保持し、networksテーブルへの1対1の参照を持ちます。

1.5. 外部サービス連携​

  • NetworkXMCP: グラフ計算が必要なリクエストを http://networkx-mcp:8001 に転送(プロキシ)します。(このURLは、環境変数 NETWORKX_MCP_URL によって設定されます。デフォルト値は http://networkx-mcp:8001 です。)
  • LLMサービス: ユーザーの指示解釈、ツールコール変換、結果の要約のために外部LLM(OpenAI, Gemini等)のAPIを呼び出します。

1.6. エラーハンドリング​

APIは、エラー発生時にHTTPステータスコードと、詳細情報を含むJSONオブジェクトを返却します。

  • エラーレスポンス形式:
{
"detail": {
"error_code": "RESOURCE_NOT_FOUND",
"message": "指定された会話が見つかりません。",
"context": {
"conversation_id": "unknown_id"
}
}
}
フィールド名型説明
error_codestrエラーの種類を一意に識別するコード。
messagestr開発者向けのエラー詳細メッセージ。
contextdictエラーが発生した際の関連情報(デバッグ用)。
  • 主要なHTTPステータスコード:
コード説明主な用途
400 Bad Requestリクエストの形式が不正(例: 必須パラメータの欠如、データ型の不一致)。
401 Unauthorized認証が必要なリソースに対し、認証なしでアクセスした場合。
403 Forbidden認証済みだが、リソースへのアクセス権限がない場合。
404 Not Found指定されたリソースが存在しない場合。
500 Internal Server Errorサーバー内部で予期せぬエラーが発生した場合。