lorebase-guide 0.2.3__tar.gz → 0.3.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.
Files changed (26) hide show
  1. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/PKG-INFO +5 -5
  2. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/pyproject.toml +5 -5
  3. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/__init__.py +1 -1
  4. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/auth.py +2 -4
  5. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/trace.py +8 -3
  6. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/support.py +11 -1
  7. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/.gitignore +0 -0
  8. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/__main__.py +0 -0
  9. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/agent.py +0 -0
  10. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/app.py +0 -0
  11. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/embed.py +0 -0
  12. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/keeper.py +0 -0
  13. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/limits.py +0 -0
  14. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/modes.py +0 -0
  15. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/prompts.py +0 -0
  16. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/settings.py +0 -0
  17. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/telemetry.py +0 -0
  18. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/tools.py +0 -0
  19. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/conftest.py +0 -0
  20. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_embed.py +0 -0
  21. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_explore.py +0 -0
  22. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_limits.py +0 -0
  23. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_modes.py +0 -0
  24. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_settings.py +0 -0
  25. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_tool_catalogue.py +0 -0
  26. {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_trace_contract.py +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: lorebase-guide
3
- Version: 0.2.3
3
+ Version: 0.3.0
4
4
  Summary: Lorebase Guide: optional exploration assistant and query embedding over Keeper
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: fastapi>=0.115
7
7
  Requires-Dist: httpx>=0.27
8
- Requires-Dist: lorebase-client<0.3,>=0.2
9
- Requires-Dist: lorebase-inference<0.3,>=0.2
10
- Requires-Dist: lorebase-platform<0.3,>=0.2
8
+ Requires-Dist: lorebase-client<0.4,>=0.3
9
+ Requires-Dist: lorebase-inference<0.4,>=0.3
10
+ Requires-Dist: lorebase-platform<0.4,>=0.3
11
11
  Requires-Dist: opentelemetry-api>=1.25
12
12
  Requires-Dist: pydantic>=2.7
13
13
  Requires-Dist: uvicorn>=0.30
14
14
  Provides-Extra: fastembed
15
- Requires-Dist: lorebase-inference[fastembed]<0.3,>=0.2; extra == 'fastembed'
15
+ Requires-Dist: lorebase-inference[fastembed]<0.4,>=0.3; extra == 'fastembed'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lorebase-guide"
3
- version = "0.2.3"
3
+ version = "0.3.0"
4
4
  description = "Lorebase Guide: optional exploration assistant and query embedding over Keeper"
5
5
  requires-python = ">=3.12"
6
6
  # lorebase-inference: the chat model of the exploration agent and the embedding model of /embed.
@@ -8,9 +8,9 @@ requires-python = ">=3.12"
8
8
  # lorebase-platform: layered settings, secret references, structured logs and telemetry.
9
9
  # fastapi and uvicorn: the HTTP service (JSON for /embed, server-sent events for /explore).
10
10
  dependencies = [
11
- "lorebase-platform>=0.2,<0.3",
12
- "lorebase-inference>=0.2,<0.3",
13
- "lorebase-client>=0.2,<0.3",
11
+ "lorebase-platform>=0.3,<0.4",
12
+ "lorebase-inference>=0.3,<0.4",
13
+ "lorebase-client>=0.3,<0.4",
14
14
  "fastapi>=0.115",
15
15
  "uvicorn>=0.30",
16
16
  "httpx>=0.27",
@@ -20,7 +20,7 @@ dependencies = [
20
20
 
21
21
  [project.optional-dependencies]
22
22
  # In-process ONNX embeddings (the default embedding provider of the inference settings).
23
- fastembed = ["lorebase-inference[fastembed]>=0.2,<0.3"]
23
+ fastembed = ["lorebase-inference[fastembed]>=0.3,<0.4"]
24
24
 
25
25
  [project.scripts]
26
26
  lorebase-guide = "lorebase_guide.__main__:main"
@@ -5,6 +5,6 @@ Importing the package registers the `guide` settings section with `lorebase_plat
5
5
 
6
6
  from lorebase_guide.settings import GuideSettings, guide_settings
7
7
 
8
- __version__ = "0.2.3"
8
+ __version__ = "0.3.0"
9
9
 
10
10
  __all__ = ["GuideSettings", "guide_settings"]
@@ -26,10 +26,9 @@ import re
26
26
  from collections.abc import Mapping
27
27
  from dataclasses import dataclass
28
28
  from http.cookies import CookieError, SimpleCookie
29
- from typing import Any, Literal
29
+ from typing import Literal
30
30
 
31
31
  from lorebase_client import AsyncLorebaseClient
32
- from lorebase_client.core import Call, parse_json
33
32
  from lorebase_client.errors import LorebaseError
34
33
  from lorebase_guide.settings import HttpSettings
35
34
 
@@ -163,8 +162,7 @@ async def verify(caller: Caller, client: AsyncLorebaseClient) -> Caller:
163
162
  try:
164
163
  who = await client.whoami()
165
164
  if caller.kind == "session":
166
- session: Any = await client.send(Call("GET", "/auth/session", parse_json, safe=True))
167
- expected = str(session.get("csrf_token") or "") if isinstance(session, dict) else ""
165
+ expected = (await client.session_info()).csrf_token
168
166
  given = caller.csrf_token or ""
169
167
  if not expected or not hmac.compare_digest(expected.encode(), given.encode()):
170
168
  raise AuthRefusedError(403, "csrf", "the CSRF token does not match the session")
@@ -12,8 +12,9 @@ from __future__ import annotations
12
12
  import logging
13
13
  import uuid
14
14
 
15
- from lorebase_client import AsyncLorebaseClient
16
- from lorebase_client.core import Call, parse_json
15
+ import httpx
16
+
17
+ from lorebase_client import AsyncLorebaseClient, Call
17
18
  from lorebase_client.errors import LorebaseError
18
19
  from lorebase_guide.settings import TraceSettings
19
20
 
@@ -27,6 +28,10 @@ def new_session_id() -> str:
27
28
  return SESSION_PREFIX + uuid.uuid4().hex
28
29
 
29
30
 
31
+ def _ignore(response: httpx.Response) -> None:
32
+ """Notes are fire and forget: the answer is not read."""
33
+
34
+
30
35
  class TraceSession:
31
36
  """Headers and notes of one exploration's trace session."""
32
37
 
@@ -57,7 +62,7 @@ class TraceSession:
57
62
  path = self.settings.notes_path.replace("{session}", self.session_id)
58
63
  body = {"text": text[: self.settings.max_note_chars], "domain_id": self.domain}
59
64
  try:
60
- await client.send(Call("POST", path, parse_json, body=body))
65
+ await client.send(Call("POST", path, _ignore, body=body))
61
66
  except LorebaseError as exc:
62
67
  self._notes_enabled = False
63
68
  logger.info(
@@ -102,7 +102,17 @@ class FakeKeeper:
102
102
  },
103
103
  )
104
104
  if path == f"{API}/auth/session":
105
- return httpx.Response(200, json={"csrf_token": CSRF, "csrf_header": "X-CSRF-Token"})
105
+ return httpx.Response(
106
+ 200,
107
+ json={
108
+ "principal_id": "web-user",
109
+ "display_name": "Reader",
110
+ "csrf_header": "X-CSRF-Token",
111
+ "csrf_token": CSRF,
112
+ "expires_at": "2026-10-01T18:00:00Z",
113
+ "idle_timeout_s": 1800,
114
+ },
115
+ )
106
116
  if path.startswith(f"{API}/trace/sessions/") and path.endswith("/notes"):
107
117
  self.notes.append({"path": path, **body})
108
118
  return httpx.Response(202, json={"recorded": True})