spawnllm 0.13.4__tar.gz → 0.15.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {spawnllm-0.13.4 → spawnllm-0.15.0}/PKG-INFO +1 -1
- {spawnllm-0.13.4 → spawnllm-0.15.0}/pyproject.toml +1 -1
- {spawnllm-0.13.4 → spawnllm-0.15.0}/pyproject.toml.orig +1 -1
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/__init__.py +2 -1
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/_core/spawnllm_core.wasm +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/codex.py +2 -2
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/openai_endpoint.py +18 -3
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/types.py +4 -1
- {spawnllm-0.13.4 → spawnllm-0.15.0}/LICENSE +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/README.md +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/__main__.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/_core/__init__.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/__init__.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/apple.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/base.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/claude.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/claude_sdk.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/gemini.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/mlx.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/backends/registry.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/call.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/cli.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/extract.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/mlx/__init__.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/mlx/codec.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/mlx/engine.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/mlx/fuse.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/mlx/patches.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/proc.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/py.typed +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/response.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/run.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/spec.py +0 -0
- {spawnllm-0.13.4 → spawnllm-0.15.0}/spawnllm/structured.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "spawnllm"
|
|
3
3
|
# Inert sentinel: the real version is set from the release tag (uv version --frozen).
|
|
4
|
-
version = "0.
|
|
4
|
+
version = "0.15.0"
|
|
5
5
|
description = "Delete your subprocess wrappers around claude, codex, and gemini."
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "MIT"
|
|
@@ -34,7 +34,7 @@ from spawnllm.extract import extract, extract_sync
|
|
|
34
34
|
from spawnllm.response import DiscardedAttempt, Error, Output, Response, Result
|
|
35
35
|
from spawnllm.run import run, run_sync
|
|
36
36
|
from spawnllm.spec import AppleConfig, ClaudeConfig, CodexConfig, GeminiConfig, RunSpec
|
|
37
|
-
from spawnllm.types import ProviderName, TModel, TSpecialty
|
|
37
|
+
from spawnllm.types import ProviderName, TModel, TReasoningEffort, TSpecialty
|
|
38
38
|
|
|
39
39
|
__all__ = [
|
|
40
40
|
"AntigravityCliBackend",
|
|
@@ -66,6 +66,7 @@ __all__ = [
|
|
|
66
66
|
"Result",
|
|
67
67
|
"RunSpec",
|
|
68
68
|
"TModel",
|
|
69
|
+
"TReasoningEffort",
|
|
69
70
|
"TSpecialty",
|
|
70
71
|
"call",
|
|
71
72
|
"call_sync",
|
|
Binary file
|
|
@@ -29,8 +29,8 @@ class CodexCliBackend(CliBackend):
|
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
31
|
models: ClassVar[dict[TModel, str]] = {
|
|
32
|
-
"small": "gpt-
|
|
33
|
-
"medium": "gpt-
|
|
32
|
+
"small": "gpt-6-luna:low",
|
|
33
|
+
"medium": "gpt-6-luna:medium",
|
|
34
34
|
"large": "gpt-5.5:medium",
|
|
35
35
|
}
|
|
36
36
|
provider: ClassVar[ProviderName] = "codex"
|
|
@@ -12,7 +12,7 @@ if TYPE_CHECKING:
|
|
|
12
12
|
from spawnllm.backends.base import BackendStatus
|
|
13
13
|
from spawnllm.response import Response
|
|
14
14
|
from spawnllm.spec import RunSpec
|
|
15
|
-
from spawnllm.types import ProviderName, TModel
|
|
15
|
+
from spawnllm.types import ProviderName, TModel, TReasoningEffort
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class OpenAiEndpointBackend(LlmBackend):
|
|
@@ -30,6 +30,9 @@ class OpenAiEndpointBackend(LlmBackend):
|
|
|
30
30
|
model: The literal model id sent in every request body.
|
|
31
31
|
api_key: Bearer token for the `Authorization` header; defaults to
|
|
32
32
|
`"local"` for self-hosted servers that ignore it.
|
|
33
|
+
reasoning_effort: The `reasoning_effort` sent in every request body;
|
|
34
|
+
`None` omits it and leaves the server's default, which on a
|
|
35
|
+
reasoning model can spend most of a call's latency thinking.
|
|
33
36
|
transport: Async transport injected into the `httpx.AsyncClient` used by
|
|
34
37
|
`aexecute` — e.g. a record/replay caching transport; `None` uses
|
|
35
38
|
httpx's default transport. The synchronous `execute` path always uses
|
|
@@ -44,17 +47,29 @@ class OpenAiEndpointBackend(LlmBackend):
|
|
|
44
47
|
schema_dialect: ClassVar[str | None] = "openai"
|
|
45
48
|
|
|
46
49
|
def __init__(
|
|
47
|
-
self,
|
|
50
|
+
self,
|
|
51
|
+
base_url: str,
|
|
52
|
+
model: str,
|
|
53
|
+
*,
|
|
54
|
+
api_key: str = "local",
|
|
55
|
+
reasoning_effort: TReasoningEffort | None = None,
|
|
56
|
+
transport: httpx.AsyncBaseTransport | None = None,
|
|
48
57
|
) -> None:
|
|
49
58
|
self.base_url = base_url.rstrip("/")
|
|
50
59
|
self.model = model
|
|
51
60
|
self.api_key = api_key
|
|
61
|
+
self.reasoning_effort = reasoning_effort
|
|
52
62
|
self.transport = transport
|
|
53
63
|
self.models: dict[TModel, str] = {"small": model, "medium": model, "large": model}
|
|
54
64
|
|
|
55
65
|
def openai_section(self) -> dict[str, Any]:
|
|
56
66
|
"""Return the `openai_endpoint` wire section the core turns into the HTTP request."""
|
|
57
|
-
return {
|
|
67
|
+
return {
|
|
68
|
+
"api_key": self.api_key,
|
|
69
|
+
"base_url": self.base_url,
|
|
70
|
+
"model": self.model,
|
|
71
|
+
"reasoning_effort": self.reasoning_effort,
|
|
72
|
+
}
|
|
58
73
|
|
|
59
74
|
def resolve(self, resp: httpx.Response, spec: RunSpec) -> Response:
|
|
60
75
|
return self.to_response(
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Literal
|
|
6
6
|
|
|
7
|
-
__all__ = ["ProviderName", "TModel", "TSettingSource", "TSpecialty"]
|
|
7
|
+
__all__ = ["ProviderName", "TModel", "TReasoningEffort", "TSettingSource", "TSpecialty"]
|
|
8
8
|
|
|
9
9
|
TSpecialty = Literal["debugging", "review", "general"]
|
|
10
10
|
"""Task specialty; `LlmBackends.for_specialty` maps each to its registered backend."""
|
|
@@ -15,5 +15,8 @@ TSettingSource = Literal["user", "project", "local"]
|
|
|
15
15
|
TModel = Literal["small", "medium", "large"]
|
|
16
16
|
"""Abstract model tier; each backend maps it to a provider-specific model name."""
|
|
17
17
|
|
|
18
|
+
TReasoningEffort = Literal["none", "minimal", "low", "medium", "high", "xhigh"]
|
|
19
|
+
"""A `reasoning_effort` an OpenAI-compatible endpoint accepts; `OpenAiEndpointBackend` sends it with every request."""
|
|
20
|
+
|
|
18
21
|
ProviderName = Literal["claude", "claude-sdk", "codex", "gemini", "antigravity", "mlx", "apple", "openai_endpoint"]
|
|
19
22
|
"""Backend provider identifier; keys the per-backend `provider_configs` on a `RunSpec`."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|