mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-01 03:46:25 +02:00
feat: enhance Obsidian plugin schema with HeadingRef class
This commit is contained in:
parent
1d324f169f
commit
6eeaa2db4d
4 changed files with 38 additions and 3 deletions
|
|
@ -21,6 +21,13 @@ class _PluginBase(BaseModel):
|
||||||
model_config = _PLUGIN_MODEL_CONFIG
|
model_config = _PLUGIN_MODEL_CONFIG
|
||||||
|
|
||||||
|
|
||||||
|
class HeadingRef(_PluginBase):
|
||||||
|
"""One markdown heading extracted from Obsidian metadata cache."""
|
||||||
|
|
||||||
|
heading: str
|
||||||
|
level: int = Field(ge=1, le=6)
|
||||||
|
|
||||||
|
|
||||||
class NotePayload(_PluginBase):
|
class NotePayload(_PluginBase):
|
||||||
"""One Obsidian note as pushed by the plugin (the source of truth)."""
|
"""One Obsidian note as pushed by the plugin (the source of truth)."""
|
||||||
|
|
||||||
|
|
@ -36,7 +43,7 @@ class NotePayload(_PluginBase):
|
||||||
|
|
||||||
frontmatter: dict[str, Any] = Field(default_factory=dict)
|
frontmatter: dict[str, Any] = Field(default_factory=dict)
|
||||||
tags: list[str] = Field(default_factory=list)
|
tags: list[str] = Field(default_factory=list)
|
||||||
headings: list[str] = Field(default_factory=list)
|
headings: list[HeadingRef] = Field(default_factory=list)
|
||||||
resolved_links: list[str] = Field(default_factory=list)
|
resolved_links: list[str] = Field(default_factory=list)
|
||||||
unresolved_links: list[str] = Field(default_factory=list)
|
unresolved_links: list[str] = Field(default_factory=list)
|
||||||
embeds: list[str] = Field(default_factory=list)
|
embeds: list[str] = Field(default_factory=list)
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,6 @@ from app.schemas.obsidian_plugin import (
|
||||||
ManifestResponse,
|
ManifestResponse,
|
||||||
NotePayload,
|
NotePayload,
|
||||||
)
|
)
|
||||||
from app.services.llm_service import get_user_long_context_llm
|
|
||||||
from app.utils.document_converters import generate_unique_identifier_hash
|
from app.utils.document_converters import generate_unique_identifier_hash
|
||||||
from app.utils.document_versioning import create_version_snapshot
|
from app.utils.document_versioning import create_version_snapshot
|
||||||
|
|
||||||
|
|
@ -102,7 +101,7 @@ def _build_metadata(
|
||||||
"extension": payload.extension,
|
"extension": payload.extension,
|
||||||
"frontmatter": payload.frontmatter,
|
"frontmatter": payload.frontmatter,
|
||||||
"tags": payload.tags,
|
"tags": payload.tags,
|
||||||
"headings": payload.headings,
|
"headings": [h.model_dump() for h in payload.headings],
|
||||||
"outgoing_links": payload.resolved_links,
|
"outgoing_links": payload.resolved_links,
|
||||||
"unresolved_links": payload.unresolved_links,
|
"unresolved_links": payload.unresolved_links,
|
||||||
"embeds": payload.embeds,
|
"embeds": payload.embeds,
|
||||||
|
|
@ -237,6 +236,8 @@ async def upsert_note(
|
||||||
|
|
||||||
document = prepared[0]
|
document = prepared[0]
|
||||||
|
|
||||||
|
from app.services.llm_service import get_user_long_context_llm
|
||||||
|
|
||||||
llm = await get_user_long_context_llm(session, str(user_id), search_space_id)
|
llm = await get_user_long_context_llm(session, str(user_id), search_space_id)
|
||||||
return await pipeline.index(document, connector_doc, llm)
|
return await pipeline.index(document, connector_doc, llm)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ from app.schemas.obsidian_plugin import (
|
||||||
ConnectRequest,
|
ConnectRequest,
|
||||||
DeleteAck,
|
DeleteAck,
|
||||||
DeleteBatchRequest,
|
DeleteBatchRequest,
|
||||||
|
HeadingRef,
|
||||||
ManifestResponse,
|
ManifestResponse,
|
||||||
NotePayload,
|
NotePayload,
|
||||||
RenameAck,
|
RenameAck,
|
||||||
|
|
@ -74,6 +75,7 @@ def _make_note_payload(vault_id: str, path: str, content_hash: str) -> NotePaylo
|
||||||
name=path.rsplit("/", 1)[-1].rsplit(".", 1)[0],
|
name=path.rsplit("/", 1)[-1].rsplit(".", 1)[0],
|
||||||
extension="md",
|
extension="md",
|
||||||
content="# Test\n\nbody",
|
content="# Test\n\nbody",
|
||||||
|
headings=[HeadingRef(heading="Test", level=1)],
|
||||||
content_hash=content_hash,
|
content_hash=content_hash,
|
||||||
mtime=now,
|
mtime=now,
|
||||||
ctime=now,
|
ctime=now,
|
||||||
|
|
|
||||||
25
surfsense_backend/tests/unit/test_obsidian_plugin_indexer.py
Normal file
25
surfsense_backend/tests/unit/test_obsidian_plugin_indexer.py
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from datetime import UTC, datetime
|
||||||
|
|
||||||
|
from app.schemas.obsidian_plugin import HeadingRef, NotePayload
|
||||||
|
from app.services.obsidian_plugin_indexer import _build_metadata
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_metadata_serializes_headings_to_plain_json() -> None:
|
||||||
|
now = datetime.now(UTC)
|
||||||
|
payload = NotePayload(
|
||||||
|
vault_id="vault-1",
|
||||||
|
path="notes.md",
|
||||||
|
name="notes",
|
||||||
|
extension="md",
|
||||||
|
content="# Notes",
|
||||||
|
headings=[HeadingRef(heading="Notes", level=1)],
|
||||||
|
content_hash="abc123",
|
||||||
|
mtime=now,
|
||||||
|
ctime=now,
|
||||||
|
)
|
||||||
|
|
||||||
|
metadata = _build_metadata(payload, vault_name="My Vault", connector_id=42)
|
||||||
|
|
||||||
|
assert metadata["headings"] == [{"heading": "Notes", "level": 1}]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue