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.
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/PKG-INFO +5 -5
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/pyproject.toml +5 -5
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/__init__.py +1 -1
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/auth.py +2 -4
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/trace.py +8 -3
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/support.py +11 -1
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/.gitignore +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/__main__.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/agent.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/app.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/embed.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/keeper.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/limits.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/modes.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/prompts.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/settings.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/telemetry.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/src/lorebase_guide/tools.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/conftest.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_embed.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_explore.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_limits.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_modes.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_settings.py +0 -0
- {lorebase_guide-0.2.3 → lorebase_guide-0.3.0}/tests/test_tool_catalogue.py +0 -0
- {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.
|
|
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.
|
|
9
|
-
Requires-Dist: lorebase-inference<0.
|
|
10
|
-
Requires-Dist: lorebase-platform<0.
|
|
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.
|
|
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.
|
|
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.
|
|
12
|
-
"lorebase-inference>=0.
|
|
13
|
-
"lorebase-client>=0.
|
|
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.
|
|
23
|
+
fastembed = ["lorebase-inference[fastembed]>=0.3,<0.4"]
|
|
24
24
|
|
|
25
25
|
[project.scripts]
|
|
26
26
|
lorebase-guide = "lorebase_guide.__main__:main"
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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,
|
|
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(
|
|
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})
|
|
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
|