Skip to content

Commit 168744e

Browse files
committed
sdk update
1 parent ae9a30f commit 168744e

8 files changed

Lines changed: 853 additions & 113 deletions

File tree

sdks/python/sdk/pyproject.toml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "moss"
7-
version = "1.0.0b19"
8-
description = "Python SDK for semantic search with on-device AI capabilities"
7+
version = "1.4.1"
8+
description = "Python SDK for semantic search with on-device AI capabilities, including local-first session indexing"
99
readme = "README.md"
1010
license-files = ["LICENSE"]
1111
authors = [
@@ -28,7 +28,7 @@ requires-python = ">=3.10"
2828
dependencies = [
2929
"typing-extensions>=4.0.0",
3030
"httpx>=0.25.0",
31-
"inferedge-moss-core==0.8.7",
31+
"inferedge-moss-core==0.17.0",
3232
]
3333

3434
[project.optional-dependencies]
@@ -78,6 +78,13 @@ target-version = ['py310']
7878
profile = "black"
7979
line_length = 88
8080

81+
[tool.pytest.ini_options]
82+
asyncio_mode = "strict"
83+
markers = [
84+
"e2e: integration tests that require real cloud credentials (MOSS_TEST_PROJECT_ID / MOSS_TEST_PROJECT_KEY)",
85+
"slow: tests that take a long time to run (large indexes, etc.)",
86+
]
87+
8188
[tool.mypy]
8289
python_version = "3.10"
8390
warn_return_any = false

sdks/python/sdk/src/moss/__init__.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616
await client.load_index('my-index')
1717
results = await client.query('my-index', 'search query')
1818
```
19+
20+
Local-first session indexing:
21+
```python
22+
session = await client.session("call-abc123")
23+
24+
await session.add_docs([DocumentInfo(id="1", text="Customer asked about billing")])
25+
results = await session.query("billing issue")
26+
27+
result = await session.push_index()
28+
```
1929
"""
2030

2131
from moss_core import (
@@ -24,24 +34,31 @@
2434
IndexInfo,
2535
IndexStatus,
2636
IndexStatusValues,
37+
LoadIndexesResult,
2738
ModelRef,
2839
MutationOptions,
2940
MutationResult,
3041
JobStatus,
3142
JobPhase,
3243
JobProgress,
3344
JobStatusResponse,
45+
PushIndexResult,
3446
QueryOptions,
3547
QueryResultDocumentInfo,
3648
SearchResult,
3749
)
3850

39-
from .client.moss_client import MossClient
51+
from .client.moss_client import MossClient, ParseFileInput
52+
from .client.session_index import SessionIndex
4053

41-
__version__ = "1.0.0b19"
54+
__version__ = "1.4.1"
4255

4356
__all__ = [
4457
"MossClient",
58+
"ParseFileInput",
59+
"SessionIndex",
60+
"PushIndexResult",
61+
"LoadIndexesResult",
4562
# Core data types
4663
"DocumentInfo",
4764
"GetDocumentsOptions",

sdks/python/sdk/src/moss/__init__.pyi

Lines changed: 104 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import ClassVar, Dict, List, Optional, Sequence
3+
from typing import ClassVar, Dict, List, Optional, Sequence, Tuple
44

55

66
class MossClient:
@@ -10,13 +10,26 @@ class MossClient:
1010

1111
def __init__(self, project_id: str, project_key: str) -> None: ...
1212

13+
async def session(
14+
self,
15+
index_name: str,
16+
model_id: Optional[str] = None,
17+
) -> SessionIndex: ...
18+
1319
async def create_index(
1420
self,
1521
name: str,
1622
docs: List[DocumentInfo],
1723
model_id: Optional[str] = ...,
1824
) -> MutationResult: ...
1925

26+
async def create_index_from_files(
27+
self,
28+
name: str,
29+
files: List[ParseFileInput],
30+
model_id: Optional[str] = None,
31+
) -> MutationResult: ...
32+
2033
async def add_docs(
2134
self,
2235
name: str,
@@ -53,16 +66,99 @@ class MossClient:
5366

5467
async def unload_index(self, name: str) -> None: ...
5568

69+
async def load_indexes(
70+
self,
71+
names: List[str],
72+
auto_refresh: bool = False,
73+
polling_interval_in_seconds: int = 600,
74+
) -> LoadIndexesResult: ...
75+
76+
async def unload_indexes(self, names: List[str]) -> None: ...
77+
5678
async def query(
5779
self,
5880
name: str,
5981
query: str,
6082
options: Optional[QueryOptions] = None,
6183
) -> SearchResult: ...
6284

85+
async def query_multi_index(
86+
self,
87+
names: List[str],
88+
query: str,
89+
options: Optional[QueryOptions] = None,
90+
) -> SearchResult: ...
91+
92+
93+
class SessionIndex:
94+
"""Local in-session index for real-time indexing and querying."""
95+
96+
name: str
97+
doc_count: int
98+
99+
async def add_docs(
100+
self,
101+
docs: List[DocumentInfo],
102+
options: Optional[MutationOptions] = None,
103+
) -> Tuple[int, int]: ...
104+
105+
async def delete_docs(self, doc_ids: List[str]) -> int: ...
106+
107+
async def get_docs(
108+
self,
109+
options: Optional[GetDocumentsOptions] = None,
110+
) -> List[DocumentInfo]: ...
111+
112+
async def query(
113+
self,
114+
query: str,
115+
options: Optional[QueryOptions] = None,
116+
) -> SearchResult: ...
117+
118+
async def push_index(self) -> PushIndexResult: ...
119+
120+
121+
class ParseFileInput:
122+
"""Input descriptor for a single file in the parse pipeline."""
123+
124+
name: str
125+
content_type: str
126+
path: Optional[str]
127+
data: Optional[bytes]
128+
129+
def __init__(
130+
self,
131+
name: str,
132+
content_type: str,
133+
path: Optional[str] = None,
134+
data: Optional[bytes] = None,
135+
) -> None: ...
136+
137+
138+
class PushIndexResult:
139+
"""Result from SessionIndex.push_index()."""
140+
141+
job_id: str
142+
index_name: str
143+
doc_count: int
144+
status: str
145+
146+
147+
class LoadIndexesResult:
148+
"""Outcome of a load_indexes call. Best-effort across the batch."""
149+
150+
loaded: List[str]
151+
failed: Dict[str, str]
152+
153+
def __init__(
154+
self,
155+
loaded: Optional[List[str]] = None,
156+
failed: Optional[Dict[str, str]] = None,
157+
) -> None: ...
158+
63159

64160
class MutationResult:
65-
"""Return value from create_index/add_docs/delete_docs."""
161+
"""Return value from create_index / add_docs / delete_docs."""
66162

67163
job_id: str
68164
index_name: str
@@ -86,8 +182,6 @@ class GetDocumentsOptions:
86182

87183

88184
class JobStatus:
89-
"""Enum-like class for job status values."""
90-
91185
PENDING_UPLOAD: ClassVar[str]
92186
UPLOADING: ClassVar[str]
93187
BUILDING: ClassVar[str]
@@ -98,8 +192,6 @@ class JobStatus:
98192

99193

100194
class JobPhase:
101-
"""Enum-like class for job phase values."""
102-
103195
DOWNLOADING: ClassVar[str]
104196
DESERIALIZING: ClassVar[str]
105197
GENERATING_EMBEDDINGS: ClassVar[str]
@@ -111,17 +203,13 @@ class JobPhase:
111203

112204

113205
class JobProgress:
114-
"""Progress update for a job."""
115-
116206
job_id: str
117207
status: JobStatus
118208
progress: float
119209
current_phase: Optional[JobPhase]
120210

121211

122212
class JobStatusResponse:
123-
"""Full status response from get_job_status."""
124-
125213
job_id: str
126214
status: JobStatus
127215
progress: float
@@ -143,12 +231,14 @@ class QueryResultDocumentInfo:
143231
text: str
144232
metadata: Optional[Dict[str, str]]
145233
score: float
234+
index_name: Optional[str]
146235
def __init__(
147236
self,
148237
id: str,
149238
text: str,
150239
metadata: Optional[Dict[str, str]] = ...,
151240
score: float = ...,
241+
index_name: Optional[str] = ...,
152242
) -> None: ...
153243

154244

@@ -230,6 +320,10 @@ __version__: str
230320

231321
__all__ = [
232322
"MossClient",
323+
"SessionIndex",
324+
"ParseFileInput",
325+
"PushIndexResult",
326+
"LoadIndexesResult",
233327
"DocumentInfo",
234328
"GetDocumentsOptions",
235329
"IndexInfo",

0 commit comments

Comments
 (0)