[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

Claude Opus 4.7 完全ガイド — 公式情報で読み解くモデル仕様とClaude Codeでの実践ノウハウ

Claude Opus 4.7 完全ガイド — 公式情報で読み解くモデル仕様とClaude Codeでの実践ノウハウ

こんにちは! Qualitegプロダクト開発部です! 2026年4月に、AnthropicからClaude Opus 4.7がリリースされました。 今回のアップデートは、単にベンチマークが上がったという話ではありません。命令の解釈の仕方、応答長、ツール呼び出しの頻度、subagentの起動方針まで、モデルの振る舞いそのものが変わっています。 それに伴い、4.6までに作り込んだプロンプトや設定の一部は、外したり再評価したりする必要があります。本記事では、そうした移行時の落とし穴と、4.7時代に合わせた運用作法を、できるだけ実践的にまとめました。 この記事では、まずOpus 4.7で何が変わったのかを確認し、そのうえでClaude Code CLI版とClaude Code Web版でどう使いこなすべきかを見ていきます。 (通常のclaude.aiチャットUIは対象外です。) なお、けっこう長めの記事になっているので、 頭から通読していただく必要はありません。 下の目次から、気になるところや今すぐ困っているところだけ拾い読みしていただいて大丈夫です。 たとえば「とりあえず4.

By Qualiteg プロダクト開発部
サブスクリプションビジネスの完全ガイド【第3回】サブスクリプションビジネスの成長設計

サブスクリプションビジネスの完全ガイド【第3回】サブスクリプションビジネスの成長設計

こんにちは、Qualitegコンサルティングです! サブスクリプションビジネスの完全ガイド 第3回 をお届けいたします! 今回は、 PLG・SLG、ユニットエコノミクス、データ改善の実務ポイントについて解説していきたいとおもいます! この記事でわかること  ・PLG・SLG・ランドアンドエクスパンドの違いと使い分け  ・NRR、LTV/CAC、ペイバック期間など主要指標の実務的な読み方  ・バーンレートとランウェイから資金繰りリスクを把握する方法  ・ファネル分析・コホート分析・A/Bテストによる改善の進め方  ・AIプロダクト特有の原価構造とユニットエコノミクスの注意点 サブスクビジネス完全攻略 シリーズ一覧 第1回 『アープがさぁ...』『チャーンがさぁ...』にもう困らない サブスクビジネス完全攻略 第1回~『アープがさぁ...』『チャーンがさぁ...』にもう困らない完全ガイドなぜサブスクリプションモデルが世界を変えているのか、でもAI台頭でSaaSは終わってしまうの? こんにちは! Qualitegコンサルティングです! 新規事業戦略コンサルタントとして日々

By Qualiteg コンサルティング
(株)Qualiteg、Startup JAPAN EXPO 2026 出展レポート

(株)Qualiteg、Startup JAPAN EXPO 2026 出展レポート

こんにちは! Qualitegビジ開マーケティング部です! 2026年4月15日(水)から16日(木)までの2日間、幕張メッセで開催された「Startup JAPAN EXPO 2026」(主催:Eight / Sansan株式会社)に、 株式会社Qualitegとして出展してまいりました! Startup JAPAN EXPO 2026 出展概要 項目内容会期2026年4月15日(水)〜16日(木) 各日10:00〜17:00会場幕張メッセ 展示ホール7・8ブース16-16主催Eight(Sansan株式会社) 今回の展示テーマは—— 「依頼は並列に、思考は止めず。」 主力プロダクト「Bestllam®」に新搭載されたAIエージェント機能と、AIセキュリティソリューション「LLM-Audit™」の実演デモを、2日間にわたってお届けしました。 ブース番号は 16-16。展示ホール7・8の一角に、今回も気合いを入れて陣を構えました💪 プレスリリース 株式会社Qualiteg、

By Qualiteg ビジネス開発本部 | マーケティング部