Skip to content

Commit 5a0bbe2

Browse files
redsun82Copilot
andcommitted
Fix reset CI failures
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 20a1547 commit 5a0bbe2

7 files changed

Lines changed: 103 additions & 81 deletions

File tree

java/src/main/java/com/github/copilot/CopilotSession.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,11 +2173,15 @@ private CompletableFuture<Void> destroyAsync(boolean cleanupOnFailure) {
21732173
isTerminated = true;
21742174
}
21752175

2176+
if (cleanupOnFailure) {
2177+
forceLocalClose();
2178+
}
2179+
21762180
return rpc.invoke("session.destroy", Map.of("sessionId", sessionId), Void.class)
21772181
.whenComplete((ignored, error) -> {
2178-
if (error == null || cleanupOnFailure) {
2182+
if (error == null && !cleanupOnFailure) {
21792183
forceLocalClose();
2180-
} else {
2184+
} else if (error != null && !cleanupOnFailure) {
21812185
synchronized (this) {
21822186
isTerminated = false;
21832187
}

python/copilot/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
CopilotClientMode,
1717
ToolSet,
1818
)
19+
from ._reset import ResetSessionResult
1920
from .canvas import (
2021
CanvasAction,
2122
CanvasDeclaration,
@@ -114,7 +115,6 @@
114115
PreToolUseHookOutput,
115116
ProviderConfig,
116117
ReasoningSummary,
117-
ResetSessionResult,
118118
SessionCapabilities,
119119
SessionEndHandler,
120120
SessionEndHookInput,
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""Model capability override types."""
2+
3+
from __future__ import annotations
4+
5+
from dataclasses import dataclass
6+
7+
8+
@dataclass
9+
class ModelVisionLimitsOverride:
10+
supported_media_types: list[str] | None = None
11+
max_prompt_images: int | None = None
12+
max_prompt_image_size: int | None = None
13+
14+
15+
@dataclass
16+
class ModelLimitsOverride:
17+
max_prompt_tokens: int | None = None
18+
max_output_tokens: int | None = None
19+
max_context_window_tokens: int | None = None
20+
vision: ModelVisionLimitsOverride | None = None
21+
22+
23+
@dataclass
24+
class ModelSupportsOverride:
25+
vision: bool | None = None
26+
reasoning_effort: bool | None = None
27+
28+
29+
@dataclass
30+
class ModelCapabilitiesOverride:
31+
supports: ModelSupportsOverride | None = None
32+
limits: ModelLimitsOverride | None = None
33+
34+
35+
def capabilities_to_dict(caps: ModelCapabilitiesOverride) -> dict:
36+
result: dict = {}
37+
if caps.supports is not None:
38+
supports: dict = {}
39+
if caps.supports.vision is not None:
40+
supports["vision"] = caps.supports.vision
41+
if caps.supports.reasoning_effort is not None:
42+
supports["reasoningEffort"] = caps.supports.reasoning_effort
43+
if supports:
44+
result["supports"] = supports
45+
if caps.limits is not None:
46+
limits: dict = {}
47+
if caps.limits.max_prompt_tokens is not None:
48+
limits["max_prompt_tokens"] = caps.limits.max_prompt_tokens
49+
if caps.limits.max_output_tokens is not None:
50+
limits["max_output_tokens"] = caps.limits.max_output_tokens
51+
if caps.limits.max_context_window_tokens is not None:
52+
limits["max_context_window_tokens"] = caps.limits.max_context_window_tokens
53+
if caps.limits.vision is not None:
54+
vision: dict = {}
55+
if caps.limits.vision.supported_media_types is not None:
56+
vision["supported_media_types"] = caps.limits.vision.supported_media_types
57+
if caps.limits.vision.max_prompt_images is not None:
58+
vision["max_prompt_images"] = caps.limits.vision.max_prompt_images
59+
if caps.limits.vision.max_prompt_image_size is not None:
60+
vision["max_prompt_image_size"] = caps.limits.vision.max_prompt_image_size
61+
if vision:
62+
limits["vision"] = vision
63+
if limits:
64+
result["limits"] = limits
65+
return result

python/copilot/_reset.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""Session reset result types."""
2+
3+
from __future__ import annotations
4+
5+
from dataclasses import dataclass
6+
from typing import Any
7+
8+
9+
@dataclass
10+
class ResetSessionResult:
11+
"""Result returned by :meth:`copilot.session.CopilotSession.reset`."""
12+
13+
previous_session_id: str
14+
"""The session ID that was closed and replaced."""
15+
16+
session: Any
17+
"""The fresh session created from the supplied reset configuration."""

python/copilot/client.py

Lines changed: 10 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@
5353
_system_message_for_mode,
5454
_validate_tool_filter_list,
5555
)
56+
from ._model_capabilities import (
57+
ModelCapabilitiesOverride,
58+
ModelLimitsOverride, # noqa: F401
59+
ModelSupportsOverride, # noqa: F401
60+
ModelVisionLimitsOverride, # noqa: F401
61+
)
62+
from ._model_capabilities import (
63+
capabilities_to_dict as _capabilities_to_dict,
64+
)
65+
from ._reset import ResetSessionResult
5666
from ._sdk_protocol_version import get_sdk_protocol_version
5767
from ._telemetry import get_trace_context
5868
from .canvas import (
@@ -90,7 +100,6 @@
90100
ProviderConfig,
91101
ReasoningEffort,
92102
ReasoningSummary,
93-
ResetSessionResult,
94103
SectionTransformFn,
95104
SessionFsConfig,
96105
SessionHooks,
@@ -583,66 +592,6 @@ def to_dict(self) -> dict:
583592
return result
584593

585594

586-
@dataclass
587-
class ModelVisionLimitsOverride:
588-
supported_media_types: list[str] | None = None
589-
max_prompt_images: int | None = None
590-
max_prompt_image_size: int | None = None
591-
592-
593-
@dataclass
594-
class ModelLimitsOverride:
595-
max_prompt_tokens: int | None = None
596-
max_output_tokens: int | None = None
597-
max_context_window_tokens: int | None = None
598-
vision: ModelVisionLimitsOverride | None = None
599-
600-
601-
@dataclass
602-
class ModelSupportsOverride:
603-
vision: bool | None = None
604-
reasoning_effort: bool | None = None
605-
606-
607-
@dataclass
608-
class ModelCapabilitiesOverride:
609-
supports: ModelSupportsOverride | None = None
610-
limits: ModelLimitsOverride | None = None
611-
612-
613-
def _capabilities_to_dict(caps: ModelCapabilitiesOverride) -> dict:
614-
result: dict = {}
615-
if caps.supports is not None:
616-
s: dict = {}
617-
if caps.supports.vision is not None:
618-
s["vision"] = caps.supports.vision
619-
if caps.supports.reasoning_effort is not None:
620-
s["reasoningEffort"] = caps.supports.reasoning_effort
621-
if s:
622-
result["supports"] = s
623-
if caps.limits is not None:
624-
lim: dict = {}
625-
if caps.limits.max_prompt_tokens is not None:
626-
lim["max_prompt_tokens"] = caps.limits.max_prompt_tokens
627-
if caps.limits.max_output_tokens is not None:
628-
lim["max_output_tokens"] = caps.limits.max_output_tokens
629-
if caps.limits.max_context_window_tokens is not None:
630-
lim["max_context_window_tokens"] = caps.limits.max_context_window_tokens
631-
if caps.limits.vision is not None:
632-
v: dict = {}
633-
if caps.limits.vision.supported_media_types is not None:
634-
v["supported_media_types"] = caps.limits.vision.supported_media_types
635-
if caps.limits.vision.max_prompt_images is not None:
636-
v["max_prompt_images"] = caps.limits.vision.max_prompt_images
637-
if caps.limits.vision.max_prompt_image_size is not None:
638-
v["max_prompt_image_size"] = caps.limits.vision.max_prompt_image_size
639-
if v:
640-
lim["vision"] = v
641-
if lim:
642-
result["limits"] = lim
643-
return result
644-
645-
646595
@dataclass
647596
class ModelPolicy:
648597
"""Model policy state"""

python/copilot/session.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
from ._diagnostics import log_timing
2626
from ._jsonrpc import JsonRpcError, ProcessExitedError
27+
from ._model_capabilities import ModelCapabilitiesOverride, capabilities_to_dict
28+
from ._reset import ResetSessionResult
2729
from ._telemetry import get_trace_context, trace_context
2830
from .canvas import CanvasError, CanvasHandler, OpenCanvasInstance
2931
from .generated.rpc import (
@@ -83,24 +85,12 @@
8385

8486

8587
if TYPE_CHECKING:
86-
from .client import ModelCapabilitiesOverride
8788
from .session_fs_provider import SessionFsProvider
8889

8990
# Re-export SessionEvent under an alias used internally
9091
SessionEventTypeAlias = SessionEvent
9192

9293

93-
@dataclass
94-
class ResetSessionResult:
95-
"""Result returned by :meth:`CopilotSession.reset`."""
96-
97-
previous_session_id: str
98-
"""The session ID that was closed and replaced."""
99-
100-
session: CopilotSession
101-
"""The fresh session created from the supplied reset configuration."""
102-
103-
10494
_ResetSessionCallback = Callable[["CopilotSession", dict[str, Any]], Awaitable[ResetSessionResult]]
10595
_UnregisterSessionCallback = Callable[[str], None]
10696

@@ -2513,10 +2503,8 @@ async def set_model(
25132503
"""
25142504
rpc_caps = None
25152505
if model_capabilities is not None:
2516-
from .client import _capabilities_to_dict
2517-
25182506
rpc_caps = _RpcModelCapabilitiesOverride.from_dict(
2519-
_capabilities_to_dict(model_capabilities)
2507+
capabilities_to_dict(model_capabilities)
25202508
)
25212509
await self.rpc.model.switch_to(
25222510
ModelSwitchToRequest(

rust/src/session.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2393,8 +2393,7 @@ mod tests {
23932393
use serde_json::json;
23942394
use tokio_util::sync::CancellationToken;
23952395

2396-
use super::Session;
2397-
use super::notification_permission_payload;
2396+
use super::{Session, notification_permission_payload};
23982397
use crate::handler::PermissionResult;
23992398
use crate::types::{SessionConfig, SessionId};
24002399
use crate::{Client, ErrorKind, SessionErrorKind};

0 commit comments

Comments
 (0)