[ChatStream] Web API エンドポイントの実装

[ChatStream] Web API エンドポイントの実装

こんにちは! (株)Qualiteg プロダクト開発部 です!

本稿では、 ChatStream を FastAPI の Web API として実装する方法についてご説明いたします!

エンドポイントの実装

/chat_stream という URL パスに、ストリーミングチャット用のWebエンドポイントをつくるには
以下のように handle_chat_stream_request を呼び出します。

これだけで、ユーザーからのリクエストは 文章生成の同時実行数を制御したストリーミングチャットの実装は完了です

@app.post("/chat_stream")
async def stream_api(request: Request):
    # handling FastAPI/Starlette's Request
    response = await chat_stream.handle_chat_stream_request(request)
    return response

メッセージインターセプト

FastAPI/Starlette を利用している場合、エンドポイントで await request.body()await request.json() を実行すると、
リクエストストリームを消費(consume)してしまうため、 ChatStream にリクエストを委譲する前にリクエストをインターセプトをする場合は以下のように実装します

import json
from fastapi import FastAPI, Request

@app.post("/chat_stream")
async def stream_api(request: Request):

    # Request を インターセプトする場合
    request_body = await request.body()
    data = json.loads(request_body)
    
    user_input = data["user_input"]
    regenerate = data["regenerate"]

    print(f"user_input:{user_input} regenerate:{regenerate}")
    
    # インターセプトした場合は `request_body` を指定する
    response = await chat_stream.handle_chat_stream_request(request, request_body)

    return response

チャットストリームの送出完了のコールバックを受け取る

ChatStream では、ストリーミングレスポンスを行うため、エンドポイントで return reponse を行ったタイミングが文章生成処理の終了ではありません。

そこで、文章生成の完了のタイミングをキャッチしたい場合、
エンドポイントの実装で、 handle_chat_stream_request の引数 callback にコールバック関数を指定します。

文章生成が完了すると、指定したコールバック関数が呼び出されます

@app.post("/chat_stream")
async def stream_api(request: Request):

    def callback_func(request, message):
        # 文章生成が終了したとき
        
        # ここでは、セッションに格納されている ChatPrompt を取得して、これまでの会話履歴をもとにプロンプトを生成する例
        session_mgr = getattr(request.state, "session", None)
        session = session_mgr.get_session()
        chat_prompt = session.get("chat_prompt")
        print(chat_prompt.create_prompt())

    pass

    response = await chat_stream.handle_chat_stream_request(request, callback=callback_func)

    return response

文章生成終了時のコールバック関数のパラメータ message の取り得る値と意味

message の値 説明
success ストリームがクライアントに向け正常に送出された
client_disconnected_while_streaming ストリーム送出中にクライアントから切断された
client_disconnected_before_streaming ストリーム送出前にクライアントから切断されていた
unknown_error_occurred ストリーム送出中に予期せぬエラーが発生した

Read more

NCCL error: unhandled cuda error が出たら ─ WSL2 + マルチGPU + vLLM で詰まった話

NCCL error: unhandled cuda error が出たら ─ WSL2 + マルチGPU + vLLM で詰まった話

こんにちは! Qualitegプロダクト開発部です! 今日は、Windows + WSL2 のマシンに RTX 4090 を2枚挿して、大規模なオープンモデルを vLLM で動かそうとしたら、NCCL の初期化で見事に詰まった話を書きます。 世の中に断片的にしか情報がなく、抜けるまでにかなり粘ったので、同じ構成で消耗している方の時間を少しでも節約できれば嬉しいです。 経緯 今回の目的は、次々と登場する最新のオープンモデル(オープンウェイトのLLM)を、手元で評価することでした。 オープンモデルは数週間単位で新しいものが出てきます。ベンチマークの数字だけでなく、自分たちのユースケースに対して実際にどう振る舞うのか——出力の質、速度、量子化したときの劣化具合、エージェント的なタスクの得手不得手——を、手を動かして確かめています 今回の環境は Windows + WSL2(Ubuntu) に RTX 4090 を2枚(各24GB)挿したマシンです。 nvidia-smi 上の CUDA Version は 12.8。 動かすのは大規模オープンモデルを

By Qualiteg プロダクト開発部
Claude Codeで「The model's tool call could not be parsed」が頻発する問題の原因分析と対策

Claude Codeで「The model's tool call could not be parsed」が頻発する問題の原因分析と対策

こんにちは!Qualitegプロダクト開発部です。 Claude Code(CLI)を使った開発中に、次のようなエラーが繰り返し表示されて作業が止まる現象に遭遇しました。 ● The model's tool call could not be parsed (retry also failed). リトライしても直らず、/clear で会話をリセットしても、しばらく作業を続けるとまた同じエラーが出るという状況です。本記事では、実際のセッションログ(jsonl)を解析して特定した原因と、その対策について共有します。 結論から書くと、これは利用者側の設定ミスやコンテキスト枯渇が原因ではなく、 Opus 4.7(1Mコンテキスト)+ extended thinking の組み合わせで発生する、モデル応答側のストリーミングバグ でした。 現象 エラーが発生した環境は以下のとおりです。 * Claude Code 2.1.148 * モデル: Opus 4.

By Qualiteg プロダクト開発部
Mythos(ミュトス)レベルのオープンモデルはいつ出るのか

Mythos(ミュトス)レベルのオープンモデルはいつ出るのか

こんにちは! 本日は、ここ最近のAI業界で一番ざわついている話題、「Claude Mythos(ミュトス)」とその周辺について書きます。 発表から1ヶ月半が経って、ホワイトハウスの反対、日本のメガバンクの動き、AISIの追加評価、Anthropicの方針転換と、状況がかなり動いてきました。ここで一度、「で、結局オープンソースで同じものが使えるようになるのはいつなの?」という素朴な問いに、数字で答えてみます。 2026年4月7日、AnthropicはClaude Mythos Previewを発表しました。 サイバーセキュリティ能力で人類トップ層に到達したとされる、フロンティアモデルです。 Anthropicは"gated research preview"として、Project Glasswingのローンチパートナー(AWS、Apple、Cisco、CrowdStrike、Google、JPMorganChase、Microsoft、NVIDIAなど)に加え、重要ソフトウェアインフラを担う40超の追加組織に限定して提供しており、一般公開はしていません(Anthropic公式)

By Qualiteg 研究部, Qualiteg コンサルティング
AIエージェントを"事業に載せる"ために【第3回】AI導入を止めないために、実務で先に設計すべきこと

AIエージェントを"事業に載せる"ために【第3回】AI導入を止めないために、実務で先に設計すべきこと

— AI導入を"事業に載せる"ために、いま設計すべきこと(全3回) こんにちは!Qualitegコンサルティングチームです。 今回の「AI導入を“事業に載せる”ために、いま設計すべきこと」シリーズも、いよいよ第3回です。 第1回では、実際のAI導入事故を通じて、AIエージェントのリスクが単なる技術不良ではなく、権限や運用設計の不在から生まれることを見てきました。第2回では、事故が起きたときに責任をどこに置くのか、法務・契約・組織の観点から責任分解の難しさを整理しました。 では、AI導入を止めずに前に進めるためには、実務として何を先に設計しておくべきなのでしょうか。 本記事では、品質保証の転換、人間レビューの限界、海外で進む保険市場の変化も踏まえながら、AIエージェント導入前に設計すべき5つの領域と、経営として先に答えるべき3つの問いを整理します。 1. 品質保証の転換:「AIは自信を持って間違える」を前提にする 従来のソフトウェアの品質保証は、少なくとも同じ入力に対して同じ結果を期待しやすく、仕様・テスト・再現性を軸に品質を確認する考え方に立っていました。 ISACA

By Qualiteg コンサルティング