Python: [Python] structured_outputs_transform reuses ChatHistory across calls (prompt pollution)
メンテナーはふだん 6 日以内に返信
評価
調査の方向性
semantic_kernel/agents/orchestration/tools.py を読み、structured_outputs_transform とその output_transform クロージャに注目してください。提供されたモックによる再現例を使って、繰り返し呼び出したときのチャット履歴の長さを確認してください。各呼び出しにシステムメッセージと現在のメッセージだけが含まれ、長さ [2, 2, 2] が生成されれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Description
structured_outputs_transform creates a single ChatHistory in the factory and closes over it. Each output_transform call add_messages into that same history, so prior orchestration outputs leak into later structured-output prompts and the history grows without bound (lengths 2→3→4…).
Environment
semantic-kernel==1.44.1(Python)- Python 3.13
- Repro uses a mocked chat service (no API keys)
Minimal repro
import asyncio
from typing import Any
from pydantic import BaseModel, PrivateAttr
from semantic_kernel.agents.orchestration.tools import structured_outputs_transform
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.prompt_execution_settings import PromptExecutionSettings
from semantic_kernel.contents import ChatMessageContent
from semantic_kernel.contents.utils.author_role import AuthorRole
class Out(BaseModel):
answer: str
class FakeSettings(PromptExecutionSettings):
response_format: Any = None
class FakeService(ChatCompletionClientBase):
_calls: list = PrivateAttr(default_factory=list)
def __init__(self) -> None:
super().__init__(service_id="fake", ai_model_id="fake")
def get_prompt_execution_settings_class(self):
return FakeSettings
async def get_chat_message_contents(self, chat_history, settings, **kwargs):
self._calls.append(len(chat_history.messages))
return [ChatMessageContent(role=AuthorRole.ASSISTANT, content='{"answer":"x"}')]
async def get_chat_message_content(self, chat_history, settings, **kwargs):
self._calls.append(len(chat_history.messages))
return ChatMessageContent(role=AuthorRole.ASSISTANT, content='{"answer":"x"}')
async def main():
svc = FakeService()
transform = structured_outputs_transform(Out, svc)
await transform(ChatMessageContent(role=AuthorRole.USER, content="first"))
await transform(ChatMessageContent(role=AuthorRole.USER, content="second"))
await transform(ChatMessageContent(role=AuthorRole.USER, content="third"))
print(svc._calls) # ACTUAL: [2, 3, 4] EXPECTED: [2, 2, 2]
asyncio.run(main())
Expected
Each transform invocation uses a fresh history (system + current message only), so independent orchestration steps do not pollute each other.
Actual
Shared history grows across calls; prior outputs leak into later structured-output prompts.
Root cause (pointer)
semantic_kernel/agents/orchestration/tools.py — structured_outputs_transform: chat_history = ChatHistory(...) created once in the factory and mutated inside output_transform.
Suggested fix direction
Construct a fresh ChatHistory (with the system message) inside output_transform on every call.
- 主要言語
- C#
- スター
- 28.7k
- フォーク
- 4.8k
- 平均マージ
- 7日 5時間
- マージ済み PR(30日)
- 59
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
microsoft/semantic-kernel のほかの issue
-
.Net: gpt-image-1 is the default image model in the .NET OpenAI connector, and OpenAI shuts it down on October 23対応中かも @nightcityblade が 25 日前に担当しました。 オープン.NET triage
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
microsoft/semantic-kernel#14526 · コメント 1 件 ·
メンテナーはふだん 6 日以内に返信
-
Python: VolatileMemoryStore.get_batch and get_nearest_matches ignore with_embeddings=False (deepcopy result is discarded)対応中かも @VANDRANKI が 27 日前に担当しました。 オープンpython triage
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
microsoft/semantic-kernel#14522 ·
メンテナーはふだん 6 日以内に返信
-
Python: VolatileMemoryStore.get_nearest_match returns an un-awaited coroutine instead of a (MemoryRecord, score) tuple対応中かも @VANDRANKI が 27 日前に担当しました。 オープンpython triage
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
microsoft/semantic-kernel#14521 ·
メンテナーはふだん 6 日以内に返信
-
.Net: Bug: BinaryContent does not decode the %xx escapes of a non-base64 data URI対応中かも @Laurianti が 27 日前に担当しました。 オープン.NET triage
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
microsoft/semantic-kernel#14518 ·
メンテナーはふだん 6 日以内に返信
-
Python: FunctionCallContent.combine_arguments drops a streamed "{}" chunk, producing invalid JSON arguments対応中かも @VANDRANKI が 28 日前に担当しました。 オープンpython triage
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
microsoft/semantic-kernel#14512 · コメント 2 件 ·
メンテナーはふだん 6 日以内に返信
microsoft/semantic-kernel の issue をすべて見る
似ている issue
-
Importer: an empty or non-numeric Error cell is imported as 0 instead of missing対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
Open-Systems-Pharmacology/OSPSuite.Core#3049 ·
メンテナーはふだん 1 日以内に返信
-
needs attention public-client untriaged
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
AzureAD/microsoft-authentication-library-for-dotnet#6242 ·
メンテナーはふだん 2 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 90/100
criticalmanufacturing/cli#882 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
Dome-Works/DOME#129 ·
メンテナーはふだん 1 日以内に返信
-
bug sev:L
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
Systemorph/MeshWeaver#7480 ·
メンテナーはふだん 1 日以内に返信