Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Python: [Python] structured_outputs_transform reuses ChatHistory across calls (prompt pollution)

Aperta Adatta ai principianti
#14,483 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
ai

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

python triage

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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/semantic-kernel

Tutte le issue di microsoft/semantic-kernel

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.