ci/lint: apply ruff format and import sort fixes

This commit is contained in:
2026-07-15 22:09:52 +08:00
parent 074a3313ce
commit d267a5f869
13 changed files with 28 additions and 45 deletions
+2 -7
View File
@@ -187,10 +187,7 @@ def ensure_windows_uv(layout: WineLayout) -> None:
return return
print(f"Fetching Windows uv {layout.win_uv_version} ...", file=sys.stderr) print(f"Fetching Windows uv {layout.win_uv_version} ...", file=sys.stderr)
layout.bin_dir.mkdir(parents=True, exist_ok=True) layout.bin_dir.mkdir(parents=True, exist_ok=True)
url = ( url = f"https://github.com/astral-sh/uv/releases/download/{layout.win_uv_version}/uv-x86_64-pc-windows-msvc.zip"
f"https://github.com/astral-sh/uv/releases/download/"
f"{layout.win_uv_version}/uv-x86_64-pc-windows-msvc.zip"
)
zip_path = layout.bin_dir / "uv.zip" zip_path = layout.bin_dir / "uv.zip"
_ = urlretrieve(url, zip_path) _ = urlretrieve(url, zip_path)
with zipfile.ZipFile(zip_path) as zf: with zipfile.ZipFile(zip_path) as zf:
@@ -283,9 +280,7 @@ def find_project_venv_scripts(layout: WineLayout) -> Path | None:
users = layout.prefix / "drive_c" / "users" users = layout.prefix / "drive_c" / "users"
if not users.is_dir(): if not users.is_dir():
return None return None
matches = sorted( matches = sorted(p for p in users.glob("**/pdm/pdm/venvs/project-view-*/Scripts") if p.is_dir())
p for p in users.glob("**/pdm/pdm/venvs/project-view-*/Scripts") if p.is_dir()
)
return matches[-1] if matches else None return matches[-1] if matches else None
+2 -2
View File
@@ -2,8 +2,6 @@ from .chat import ChatAgent as ChatAgent
from .client import ChatClient as ChatClient from .client import ChatClient as ChatClient
from .compact import build_compacted_seed_messages as build_compacted_seed_messages from .compact import build_compacted_seed_messages as build_compacted_seed_messages
from .compact import summarize_messages as summarize_messages from .compact import summarize_messages as summarize_messages
from .responses_client import ResponsesChatClient as ResponsesChatClient
from .responses_client import wrap_openai_for_agent as wrap_openai_for_agent
from .events import AgentEvent as AgentEvent from .events import AgentEvent as AgentEvent
from .events import AssistantMessageEvent as AssistantMessageEvent from .events import AssistantMessageEvent as AssistantMessageEvent
from .events import CancelledEvent as CancelledEvent from .events import CancelledEvent as CancelledEvent
@@ -16,6 +14,8 @@ from .events import ToolResultEvent as ToolResultEvent
from .events import UsageEvent as UsageEvent from .events import UsageEvent as UsageEvent
from .loop import DEFAULT_MAX_ROUNDS as DEFAULT_MAX_ROUNDS from .loop import DEFAULT_MAX_ROUNDS as DEFAULT_MAX_ROUNDS
from .loop import run_chat_loop as run_chat_loop from .loop import run_chat_loop as run_chat_loop
from .responses_client import ResponsesChatClient as ResponsesChatClient
from .responses_client import wrap_openai_for_agent as wrap_openai_for_agent
from .tools import DangerClassifier as DangerClassifier from .tools import DangerClassifier as DangerClassifier
from .tools import ToolConfirmHook as ToolConfirmHook from .tools import ToolConfirmHook as ToolConfirmHook
from .tools import ToolDefinition as ToolDefinition from .tools import ToolDefinition as ToolDefinition
+10 -5
View File
@@ -87,10 +87,15 @@ class ResponsesChatClient:
if etype == "response.output_text.delta" and isinstance(event.delta, str) and event.delta: if etype == "response.output_text.delta" and isinstance(event.delta, str) and event.delta:
yield text_delta_chunk(model=model, content=event.delta) yield text_delta_chunk(model=model, content=event.delta)
continue continue
if etype in { if (
"response.reasoning_summary_text.delta", etype
"response.reasoning_text.delta", in {
} and isinstance(event.delta, str) and event.delta: "response.reasoning_summary_text.delta",
"response.reasoning_text.delta",
}
and isinstance(event.delta, str)
and event.delta
):
yield reasoning_delta_chunk(model=model, content=event.delta) yield reasoning_delta_chunk(model=model, content=event.delta)
continue continue
if etype == "response.completed" and event.response is not UNSET: if etype == "response.completed" and event.response is not UNSET:
@@ -101,7 +106,7 @@ class ResponsesChatClient:
try: try:
final = msgspec.convert(event.response, ResponseModel) final = msgspec.convert(event.response, ResponseModel)
except (TypeError, ValueError, msgspec.ValidationError): except TypeError, ValueError, msgspec.ValidationError:
final = None final = None
if final is not None: if final is not None:
+1 -2
View File
@@ -74,8 +74,7 @@ def _warn_recoverable_providers(recoverable: Mapping[str, object]) -> None:
return return
names = ", ".join(sorted(recoverable.keys())) names = ", ".join(sorted(recoverable.keys()))
click.secho( click.secho(
f"warning: providers with empty models ({len(recoverable)}): {names} " f"warning: providers with empty models ({len(recoverable)}): {names} (will try GET /models or --model on use)",
f"(will try GET /models or --model on use)",
fg="yellow", fg="yellow",
err=True, err=True,
) )
+3 -7
View File
@@ -22,7 +22,7 @@ async def discover_model_ids(provider: Provider) -> list[str]:
return [] return []
try: try:
return await fetch_remote_model_ids(client) return await fetch_remote_model_ids(client)
except (RuntimeError, TypeError, OSError, ValueError): except RuntimeError, TypeError, OSError, ValueError:
return [] return []
@@ -79,8 +79,7 @@ async def ensure_provider_ready(
promoted = await try_promote_provider(store, name, seed_model_ids=seeds or None) promoted = await try_promote_provider(store, name, seed_model_ids=seeds or None)
if promoted is not None: if promoted is not None:
click.secho( click.secho(
f"recovered provider {name!r} with {len(promoted.models)} model(s) " f"recovered provider {name!r} with {len(promoted.models)} model(s) (was empty models in config)",
f"(was empty models in config)",
fg="yellow", fg="yellow",
err=True, err=True,
) )
@@ -110,8 +109,5 @@ async def ensure_provider_ready(
) )
return promoted return promoted
msg = ( msg = f"provider {name!r} has empty models and could not be recovered (pass --model or fix GET /models)"
f"provider {name!r} has empty models and could not be recovered "
f"(pass --model or fix GET /models)"
)
raise click.ClickException(msg) raise click.ClickException(msg)
+1 -2
View File
@@ -655,8 +655,7 @@ def models_cmd(state: ReplState, *, refresh: bool) -> None:
click.secho(f"remote list unavailable: {remote_err}", fg="yellow", err=True) click.secho(f"remote list unavailable: {remote_err}", fg="yellow", err=True)
elif remote is not None: elif remote is not None:
click.echo( click.echo(
f"({len(remote)} remote, {len(config_ids)} config; " f"({len(remote)} remote, {len(config_ids)} config; cache TTL {int(DEFAULT_MODELS_CACHE_TTL)}s)",
f"cache TTL {int(DEFAULT_MODELS_CACHE_TTL)}s)",
err=True, err=True,
) )
+3 -3
View File
@@ -185,7 +185,7 @@ class ReplState:
remote: list[str] | None remote: list[str] | None
try: try:
remote = await self.ensure_remote_models(refresh=refresh) remote = await self.ensure_remote_models(refresh=refresh)
except (RuntimeError, TypeError, OSError, ValueError): except RuntimeError, TypeError, OSError, ValueError:
remote = self.cached_remote_models() remote = self.cached_remote_models()
return model_choices_for_provider(self.provider, remote_ids=remote) return model_choices_for_provider(self.provider, remote_ids=remote)
@@ -269,13 +269,13 @@ class ReplState:
preferred=pname, preferred=pname,
interactive=False, interactive=False,
) )
except (click.ClickException, ProviderNotSupportedError): except click.ClickException, ProviderNotSupportedError:
return False return False
# Session resume: seed empty recoverable with remembered model if any. # Session resume: seed empty recoverable with remembered model if any.
if not provider.models and self.model: if not provider.models and self.model:
try: try:
provider = self.config.promote_provider(name, [self.model]) provider = self.config.promote_provider(name, [self.model])
except (KeyError, ValueError): except KeyError, ValueError:
return False return False
if name != self.provider_name or provider is not self.provider: if name != self.provider_name or provider is not self.provider:
self.provider_name = name self.provider_name = name
+1 -3
View File
@@ -66,9 +66,7 @@ class OpenAIClient(BaseOpenAIClient):
return self.decoder.decode(body) return self.decoder.decode(body)
@overload @overload
async def responses( async def responses(self, param: ResponsesCreateParam, *, stream: Literal[False] = False) -> Response: ...
self, param: ResponsesCreateParam, *, stream: Literal[False] = False
) -> Response: ...
@overload @overload
async def responses( async def responses(
+1 -1
View File
@@ -316,7 +316,7 @@ def response_function_calls(response: Response) -> list[ResponseFunctionToolCall
continue continue
try: try:
result.append(msgspec_convert_function_call(raw)) result.append(msgspec_convert_function_call(raw))
except (TypeError, ValueError, KeyError, msgspec.ValidationError): except TypeError, ValueError, KeyError, msgspec.ValidationError:
continue continue
return result return result
+1 -3
View File
@@ -20,9 +20,7 @@ if TYPE_CHECKING:
DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1" DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1"
DEFAULT_DEEPSEEK_BASE_URL = "https://api.deepseek.com" DEFAULT_DEEPSEEK_BASE_URL = "https://api.deepseek.com"
type ProtocolClient = ( type ProtocolClient = OpenAIClient | OpenAICompatibleClient | DeepseekOpenAIClient | ResponsesChatClient
OpenAIClient | OpenAICompatibleClient | DeepseekOpenAIClient | ResponsesChatClient
)
# Backward-compatible name used by older imports/tests. # Backward-compatible name used by older imports/tests.
type OpenAICompatibleClientUnion = ProtocolClient type OpenAICompatibleClientUnion = ProtocolClient
+1 -1
View File
@@ -97,7 +97,7 @@ class PosixPtyHandle:
ready, _, _ = select.select([self.master_fd], [], [], timeout) ready, _, _ = select.select([self.master_fd], [], [], timeout)
if ready: if ready:
data = os.read(self.master_fd, max_bytes) data = os.read(self.master_fd, max_bytes)
except (OSError, ValueError): except OSError, ValueError:
data = b"" data = b""
_ = self.poll_exit() _ = self.poll_exit()
return data return data
+1 -5
View File
@@ -24,11 +24,7 @@ async def test_client_models_sorted_unique(monkeypatch: pytest.MonkeyPatch) -> N
@property @property
def content(self) -> bytes: def content(self) -> bytes:
return ( return b'{"object":"list","data":[{"id":"m2"},{"id":"m1"},{"id":"m2"},{"id":""}]}'
b'{"object":"list","data":['
b'{"id":"m2"},{"id":"m1"},{"id":"m2"},{"id":""}'
b"]}"
)
async def fake_get(path: str, **kwargs: object) -> _Resp: async def fake_get(path: str, **kwargs: object) -> _Resp:
assert path == "/models" assert path == "/models"
+1 -4
View File
@@ -59,10 +59,7 @@ def test_create_param_encode_omits_defaults() -> None:
def test_stream_event_decode() -> None: def test_stream_event_decode() -> None:
raw = ( raw = b'{"type":"response.output_text.delta","item_id":"msg_1","output_index":0,"content_index":0,"delta":"hel"}'
b'{"type":"response.output_text.delta","item_id":"msg_1",'
b'"output_index":0,"content_index":0,"delta":"hel"}'
)
event = msgspec.json.decode(raw, type=ResponseStreamEvent) event = msgspec.json.decode(raw, type=ResponseStreamEvent)
assert event.type == "response.output_text.delta" assert event.type == "response.output_text.delta"
assert event.delta == "hel" assert event.delta == "hel"