Skip to content

feat(integrations): discover hosted Copilot model catalogs - #850

Closed
bandzalkin wants to merge 70 commits into
band-ai:mainfrom
bandzalkin:feat/host-list-models-copilot-refresh
Closed

bandzalkin wants to merge 70 commits into
band-ai:mainfrom
bandzalkin:feat/host-list-models-copilot-refresh

Conversation

@bandzalkin

@bandzalkin bandzalkin commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This lets hosts discover the configured Copilot account's hosted models without a Band connection, room workspace, ACP session, or model turn. await adapter.probe_models(timeout_s=...) uses the Copilot SDK and returns the canonical ModelCatalog.

  • Preserve advertised model IDs, labels, reasoning efforts, and default efforts without inventing provider, current-model, or default-selection metadata. A valid empty catalog remains distinct from failed or unsupported discovery.
  • Use the configured executable, arguments, working directory, trimmed inherited environment, and explicit credentials/overrides. Honor configured PATH/cwd/PATHEXT on Windows, including an explicitly resolved Node interpreter for JavaScript entrypoints; do not fall back to an unrelated host executable.
  • Register ownership before SDK startup and retain late startup or failed cleanup for cleanup_all() retries. A narrow version/type-checked teardown bridge retains the SDK's Popen handles before public stop() can erase them and confirms physical exit before releasing custody. Startup uses the public SDK API.
  • Preserve ACP room/MCP shutdown in the original requesting task and attempt probe cleanup even after room cleanup fails.

Discovery requires the optional copilot_sdk extra with released github-copilot-sdk>=1.0.5,<2; ordinary ACP operation does not. This lists hosted-account models, not BYOK catalogs, and does not establish inference entitlement or validate MCP/tools. Band sanitizes public discovery errors, but the upstream SDK may emit its own traceback.

Prerequisite

Depends on the shared probe contracts in #844.

Validation

Tests cover catalog metadata, credential precedence, configured executable/interpreter resolution, physical process custody, cancellation, late startup, and cleanup retry.

@bandzalkin bandzalkin changed the title feat(copilot): discover hosted models with retained SDK custody feat(integrations): discover hosted Copilot model catalogs Oct 18, 2026
github-actions Bot pushed a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 19, 2026
@bandzalkin
bandzalkin force-pushed the feat/host-list-models-copilot-refresh branch from 0f04da7 to 077f616 Compare October 20, 2026 06:36
github-actions Bot pushed a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 20, 2026
AlexanderZ-Band and others added 8 commits October 20, 2026 13:08
…t-activity-detail-to-the-platform-INT-1744

Keep main's BackendTurns ownership of OpenCode cancellation and register the
watcher as a turn worker so activity reporting outlives the handler. Reporter
unit tests move to tests/runtime/workingreporter; main's workingstate package
keeps the execution-level tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744

Port the startup-backlog claim-failure test edit to the split
tests/runtime/execution package.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-delivery-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-producers-INT-1744

Adopt main's agno and tool test layouts and carry the producer edits into
them; keep the split CrewAI/Parlant coverage guards with main's new paths.
Letta streams provider events through main's BackendTurns run, and the
CrewAI flow tool activity wraps main's turn-owned tool execution.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
It runs three collect-only subprocesses, which exceeded the default
per-test timeout on Windows runners.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgnNR4uiqD787Bg3yKdZpL
…detail-to-the-platform-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-delivery-INT-1744
…detail-to-the-platform-delivery-INT-1744' into feat/python-sdk-report-activity-detail-to-the-platform-producers-INT-1744
Adapters that do not report tool calls must not leak tool names through the
live room indicator. The decision is taken once per turn in SimpleAdapter
from the negotiated emit set and enforced at the single observer every
activity reporter funnels through, so no adapter can bypass it. Permission
and memory detail name no content and always report.

Guards: tests/runtime/activity/test_namegate.py pins that a tool_call frame
reaches the wire with Emit.TOOL_CALLS and degrades to nameless reasoning
without it; fails if the wrapper is removed.
Room Sim and others added 21 commits October 20, 2026 22:19
…them

A name longer than 1024 characters is a 422 on the activity endpoint,
and the compatibility path reads a detail-bearing 422 as an old
platform: one oversized tool name would latch activity detail off for
the whole process. Clip at the serialization chokepoint instead, one
constant, so a long name costs characters and nothing else. Guarded by
tests/platform/activity/test_truncation.py (over-limit clipped,
exact-limit untouched).
The lifecycle peer rejects narration posts with the stopped-execution
answer, so the first reported tool call read as a platform stop and tore
down the turn machinery around a parked approval. A running room echoes
201 like the posting peer before it; stopped peers keep rejecting.
github-actions Bot pushed a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 21, 2026
github-actions Bot pushed a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 21, 2026
bandzalkin and others added 4 commits October 21, 2026 08:12
The mask wrapper was attached only when the flag was already off, so an
adapter that binds its observer before the emit sync (codex's item/started
path) kept reporting named tool_calls after the choice was turned off. The
observer now always wraps and reads the live flag on every report; the hook
site gates on the OMP branch remain as the second guard. Red-first test:
observer bound with names on, choice flipped off mid-turn, tool report must
arrive nameless.

Co-Authored-By: Claude <noreply@anthropic.com>
github-actions Bot pushed a commit to bandzalkin/band-sdk-python that referenced this pull request Oct 21, 2026
@bandzalkin

Copy link
Copy Markdown
Contributor Author

Closing: band-agent does not consume this; may be re-proposed per feature.

@bandzalkin bandzalkin closed this Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants