mirror of
https://github.com/NCBM/plyngent.git
synced 2026-07-23 05:55:16 +08:00
ci/lint: apply ruff format and import sort fixes
This commit is contained in:
+2
-7
@@ -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,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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user