Python: [Python] structured_outputs_transform reuses ChatHistory across calls (prompt pollution)
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 88/100
Direzione di ricerca
Leggi semantic_kernel/agents/orchestration/tools.py, concentrandoti su structured_outputs_transform e sulla relativa closure output_transform. Usa la riproduzione mock fornita per verificare la lunghezza della cronologia della chat in chiamate ripetute; il lavoro è completato quando ogni invocazione contiene solo il messaggio di sistema e il messaggio corrente, producendo le lunghezze [2, 2, 2].
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- C#
- Stelle
- 28.6k
- Fork
- 4.8k
- Merge medio
- 13h 24m
- PR unite (30g)
- 11
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/semantic-kernel
-
python triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
microsoft/semantic-kernel#14491 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
python triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
microsoft/semantic-kernel#14490 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
.NET python triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
microsoft/semantic-kernel#14482 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
Python: [Python] as_agent_framework_tool drops parameter defaults (optionals become required)Apertapython triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
microsoft/semantic-kernel#14481 ·
I maintainer di solito rispondono entro 2 giorni
-
python triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/semantic-kernel#14460 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di microsoft/semantic-kernel
Issue simili
-
[Simple] NavigationBar primary commands do not render AppBarButton.Content when it is a UIElementApertacontrol/navigationbar kind/bug triage/untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
unoplatform/uno.toolkit.ui#1652 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
microsoft/copilot-camp#1053 ·
I maintainer di solito rispondono entro 1 giorno
-
bug effort:S P3
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
nightscout/nocturne#1861 ·
I maintainer di solito rispondono entro 1 giorno
-
agentic-workflows area/Docs partner/agentic-workflows
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
microsoft/fluentui-blazor#5364 ·
I maintainer di solito rispondono entro 1 giorno