Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 02 Jul 16:07
93133bf

Added

  • Thread-index cap + ?limit (AGH-1). GET threads/ returns at most
    DJANGO_AG_UI["THREAD_LIST_LIMIT"] rows (default 200); the client may request
    fewer via ?limit=N and a larger value is clamped to the ceiling, so a user
    with thousands of threads no longer fetches and serializes all of them per
    drawer open. ConversationStore.list gains a limit argument.
  • ConversationStore.exists() (AGH-1). A cheap owner-scoped presence check
    (no message body loaded). The rename endpoint now probes it instead of loading
    and deserializing the whole thread just to 404. Model-backed stores answer with
    a metadata-only .exists() query.

Changed (breaking)

  • OpenedAttachment.content is now an open readable stream, not bytes
    (AGH-3).
    Downloads stream the file via FileResponse instead of buffering it
    whole in memory, so a large attachment (with the size cap disabled) no longer
    lands in memory. AttachmentStore.open returns the open handle; the download
    view and the read_attachment tool consume/close it. A custom
    AttachmentStore that built OpenedAttachment(content=<bytes>) must now pass a
    readable binary handle.
  • ConversationStore gains required exists() and a limit on list(). A
    custom store implementation must add exists() and accept limit= on list().

Fixed

  • Rename / upload title & filename caps (AGH-1). A PATCH threads/<id>/
    title longer than the model's CharField(max_length=255) is truncated rather
    than raising a database DataError on a strict backend. (Uploaded filenames
    were already truncated to 255 by Django's UploadedFile.)
  • Cross-toolset name-collision guard (AGH-2). The drf-mcp, SpecToolset, and
    read_attachment toolset builders previously each excluded only the @tool
    registry's names, so if DRF_MCP_SERVER and SERVICE_SPECS exposed the same
    tool name (or either exposed read_attachment), pydantic-ai raised a duplicate
    UserError mid-run while the catalog looked clean. One seen set is now
    threaded through all three builders in build_tool_catalog's precedence order
    (registry → drf-mcp → spec → attachment) so a duplicate can't reach the run.
  • Early upload abort (AGH-3). A CappedUploadHandler aborts an oversized
    upload mid-parse (honoring ATTACHMENT_MAX_BYTES) instead of spooling the whole
    body to a temp file before the 413.
  • Transcription client reuse + timeout (AGH-3). OpenAITranscriptionBackend
    caches its AsyncOpenAI client on the instance rather than constructing one
    (with a new connection pool) per call, and sets a bounded default timeout
    (60 s, overridable) instead of the SDK's 10-minute default.