sf-queue-sdk 0.2.0b21__tar.gz → 0.2.0b23__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.
- sf_queue_sdk-0.2.0b21/README.md → sf_queue_sdk-0.2.0b23/PKG-INFO +42 -0
- sf_queue_sdk-0.2.0b21/PKG-INFO → sf_queue_sdk-0.2.0b23/README.md +34 -8
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/pyproject.toml +1 -1
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/__init__.py +5 -1
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/client.py +2 -0
- sf_queue_sdk-0.2.0b23/queue_sdk/queues/recommendation_queue.py +72 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/types.py +19 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/.gitignore +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/__init__.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/email/v1/email_pb2.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/email/v1/email_pb2.pyi +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/tool_assignment/v1/tool_assignment_pb2.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/tool_assignment/v1/tool_assignment_pb2.pyi +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/topic_assignment/v1/topic_assignment_pb2.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/topic_assignment/v1/topic_assignment_pb2.pyi +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/__init__.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/base_queue.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/email_queue.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/pdf_to_image_queue.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/tool_assignment_queue.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/queues/topic_assignment_queue.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/redis_client.py +0 -0
- {sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/sanitize.py +0 -0
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sf-queue-sdk
|
|
3
|
+
Version: 0.2.0b23
|
|
4
|
+
Summary: Python SDK for sf-queue - Redis-based queue system
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Requires-Dist: redis>=5.0.0
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
|
|
1
9
|
# sf-queue-sdk
|
|
2
10
|
|
|
3
11
|
Python SDK for sf-queue. Enqueues emails via Redis Streams with optional blocking confirmation from the Go consumer service.
|
|
@@ -350,6 +358,40 @@ result = client.tool_assignment.send_batch_and_wait(
|
|
|
350
358
|
| `current_assignment` | `Optional[str]` | Yes | Current cluster_id (None for new embeddings) |
|
|
351
359
|
| `new_assignment` | `str` | Yes | The cluster_id to assign to |
|
|
352
360
|
|
|
361
|
+
## Recommendations
|
|
362
|
+
|
|
363
|
+
### Fire and forget
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
result = client.recommendations.create(
|
|
367
|
+
user_id="user_xyz",
|
|
368
|
+
topic_id="topic_abc123",
|
|
369
|
+
limit=10, # optional
|
|
370
|
+
)
|
|
371
|
+
print("Enqueued:", result.message_id)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Create and wait for result
|
|
375
|
+
|
|
376
|
+
```python
|
|
377
|
+
result = client.recommendations.create_and_wait(
|
|
378
|
+
user_id="user_xyz",
|
|
379
|
+
topic_id="topic_abc123",
|
|
380
|
+
limit=10, # optional
|
|
381
|
+
timeout=30,
|
|
382
|
+
)
|
|
383
|
+
print(result.success)
|
|
384
|
+
print(result.message_id)
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Recommendation Fields
|
|
388
|
+
|
|
389
|
+
| Field | Type | Required | Description |
|
|
390
|
+
|-------|------|----------|-------------|
|
|
391
|
+
| `user_id` | `str` | Yes | User requesting recommendations |
|
|
392
|
+
| `topic_id` | `str` | Yes | Topic context for recommendations |
|
|
393
|
+
| `limit` | `Optional[int]` | No | Max recommendations to return |
|
|
394
|
+
|
|
353
395
|
## Cleanup
|
|
354
396
|
|
|
355
397
|
```python
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: sf-queue-sdk
|
|
3
|
-
Version: 0.2.0b21
|
|
4
|
-
Summary: Python SDK for sf-queue - Redis-based queue system
|
|
5
|
-
Requires-Python: >=3.11
|
|
6
|
-
Requires-Dist: redis>=5.0.0
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
|
|
9
1
|
# sf-queue-sdk
|
|
10
2
|
|
|
11
3
|
Python SDK for sf-queue. Enqueues emails via Redis Streams with optional blocking confirmation from the Go consumer service.
|
|
@@ -358,6 +350,40 @@ result = client.tool_assignment.send_batch_and_wait(
|
|
|
358
350
|
| `current_assignment` | `Optional[str]` | Yes | Current cluster_id (None for new embeddings) |
|
|
359
351
|
| `new_assignment` | `str` | Yes | The cluster_id to assign to |
|
|
360
352
|
|
|
353
|
+
## Recommendations
|
|
354
|
+
|
|
355
|
+
### Fire and forget
|
|
356
|
+
|
|
357
|
+
```python
|
|
358
|
+
result = client.recommendations.create(
|
|
359
|
+
user_id="user_xyz",
|
|
360
|
+
topic_id="topic_abc123",
|
|
361
|
+
limit=10, # optional
|
|
362
|
+
)
|
|
363
|
+
print("Enqueued:", result.message_id)
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Create and wait for result
|
|
367
|
+
|
|
368
|
+
```python
|
|
369
|
+
result = client.recommendations.create_and_wait(
|
|
370
|
+
user_id="user_xyz",
|
|
371
|
+
topic_id="topic_abc123",
|
|
372
|
+
limit=10, # optional
|
|
373
|
+
timeout=30,
|
|
374
|
+
)
|
|
375
|
+
print(result.success)
|
|
376
|
+
print(result.message_id)
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Recommendation Fields
|
|
380
|
+
|
|
381
|
+
| Field | Type | Required | Description |
|
|
382
|
+
|-------|------|----------|-------------|
|
|
383
|
+
| `user_id` | `str` | Yes | User requesting recommendations |
|
|
384
|
+
| `topic_id` | `str` | Yes | Topic context for recommendations |
|
|
385
|
+
| `limit` | `Optional[int]` | No | Max recommendations to return |
|
|
386
|
+
|
|
361
387
|
## Cleanup
|
|
362
388
|
|
|
363
389
|
```python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""sf-queue Python SDK - Redis-based queue system."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.0b23"
|
|
4
4
|
|
|
5
5
|
from queue_sdk.client import QueueClient
|
|
6
6
|
from queue_sdk.types import (
|
|
@@ -16,6 +16,8 @@ from queue_sdk.types import (
|
|
|
16
16
|
EmailResponse,
|
|
17
17
|
QueueClientConfig,
|
|
18
18
|
QueueResponse,
|
|
19
|
+
RecommendationRequestData,
|
|
20
|
+
RecommendationResponse,
|
|
19
21
|
SendResult,
|
|
20
22
|
ToolAssignmentData,
|
|
21
23
|
TopicAssignmentData,
|
|
@@ -31,6 +33,8 @@ __all__ = [
|
|
|
31
33
|
"BatchEmailResponse",
|
|
32
34
|
"QueueResponse",
|
|
33
35
|
"BatchQueueResponse",
|
|
36
|
+
"RecommendationRequestData",
|
|
37
|
+
"RecommendationResponse",
|
|
34
38
|
"TopicAssignmentData",
|
|
35
39
|
"BatchTopicAssignmentData",
|
|
36
40
|
"ToolAssignmentData",
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from queue_sdk.queues.email_queue import EmailQueue
|
|
4
4
|
from queue_sdk.queues.pdf_to_image_queue import PdfToImageQueue
|
|
5
|
+
from queue_sdk.queues.recommendation_queue import RecommendationQueue
|
|
5
6
|
from queue_sdk.queues.tool_assignment_queue import ToolAssignmentQueue
|
|
6
7
|
from queue_sdk.queues.topic_assignment_queue import TopicAssignmentQueue
|
|
7
8
|
from queue_sdk.redis_client import create_redis_client
|
|
@@ -65,6 +66,7 @@ class QueueClient:
|
|
|
65
66
|
self.topic_assignment = TopicAssignmentQueue(self._redis, self._environment)
|
|
66
67
|
self.tool_assignment = ToolAssignmentQueue(self._redis, self._environment)
|
|
67
68
|
self.pdf_to_image = PdfToImageQueue(self._redis, self._environment)
|
|
69
|
+
self.recommendations = RecommendationQueue(self._redis, self._environment)
|
|
68
70
|
|
|
69
71
|
def disconnect(self) -> None:
|
|
70
72
|
"""Close the Redis connection."""
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""Recommendation queue with typed methods."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
from typing import Any, Optional
|
|
5
|
+
|
|
6
|
+
import redis as redis_lib
|
|
7
|
+
|
|
8
|
+
from queue_sdk.queues.base_queue import BaseQueue
|
|
9
|
+
from queue_sdk.types import RecommendationResponse, SendResult
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RecommendationQueue(BaseQueue):
|
|
13
|
+
"""Typed methods for creating recommendation requests via the queue."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, redis_client: redis_lib.Redis, environment: str):
|
|
16
|
+
super().__init__(redis_client, environment, "recommendation-requests")
|
|
17
|
+
|
|
18
|
+
def create(
|
|
19
|
+
self,
|
|
20
|
+
user_id: str,
|
|
21
|
+
topic_id: str,
|
|
22
|
+
limit: Optional[int] = None,
|
|
23
|
+
) -> SendResult:
|
|
24
|
+
"""Enqueue a recommendation request (fire and forget)."""
|
|
25
|
+
self._validate(user_id, topic_id)
|
|
26
|
+
payload = self._build_payload(user_id, topic_id, limit)
|
|
27
|
+
message_id = self._enqueue(payload)
|
|
28
|
+
return SendResult(message_id=message_id)
|
|
29
|
+
|
|
30
|
+
def create_and_wait(
|
|
31
|
+
self,
|
|
32
|
+
user_id: str,
|
|
33
|
+
topic_id: str,
|
|
34
|
+
limit: Optional[int] = None,
|
|
35
|
+
timeout: Optional[int] = None,
|
|
36
|
+
) -> RecommendationResponse:
|
|
37
|
+
"""Enqueue a recommendation request and wait for the result."""
|
|
38
|
+
self._validate(user_id, topic_id)
|
|
39
|
+
payload = self._build_payload(user_id, topic_id, limit)
|
|
40
|
+
response = self._enqueue_and_wait(payload, timeout)
|
|
41
|
+
|
|
42
|
+
return RecommendationResponse(
|
|
43
|
+
success=response.success,
|
|
44
|
+
message_id=response.message_id,
|
|
45
|
+
error=response.error,
|
|
46
|
+
processed_at=response.processed_at,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def _build_payload(
|
|
50
|
+
self,
|
|
51
|
+
user_id: str,
|
|
52
|
+
topic_id: str,
|
|
53
|
+
limit: Optional[int],
|
|
54
|
+
) -> dict[str, Any]:
|
|
55
|
+
"""Build the recommendation request payload."""
|
|
56
|
+
payload: dict[str, Any] = {
|
|
57
|
+
"userId": user_id,
|
|
58
|
+
"topicId": topic_id,
|
|
59
|
+
"requestedAt": datetime.now(timezone.utc).isoformat(),
|
|
60
|
+
"key": f"{user_id}-{topic_id}",
|
|
61
|
+
}
|
|
62
|
+
if limit is not None:
|
|
63
|
+
payload["limit"] = limit
|
|
64
|
+
return payload
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def _validate(user_id: str, topic_id: str) -> None:
|
|
68
|
+
"""Validate the recommendation request."""
|
|
69
|
+
if not user_id:
|
|
70
|
+
raise ValueError("user_id is required")
|
|
71
|
+
if not topic_id:
|
|
72
|
+
raise ValueError("topic_id is required")
|
|
@@ -128,6 +128,25 @@ class BatchToolAssignmentData:
|
|
|
128
128
|
assignments: list[ToolAssignmentData]
|
|
129
129
|
|
|
130
130
|
|
|
131
|
+
@dataclass
|
|
132
|
+
class RecommendationRequestData:
|
|
133
|
+
"""Data for a recommendation request (mirrors Kafka recommendationRequests)."""
|
|
134
|
+
|
|
135
|
+
user_id: str
|
|
136
|
+
topic_id: str
|
|
137
|
+
limit: Optional[int] = None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@dataclass
|
|
141
|
+
class RecommendationResponse:
|
|
142
|
+
"""Response from a processed recommendation request."""
|
|
143
|
+
|
|
144
|
+
success: bool
|
|
145
|
+
message_id: str
|
|
146
|
+
error: Optional[str] = None
|
|
147
|
+
processed_at: Optional[str] = None
|
|
148
|
+
|
|
149
|
+
|
|
131
150
|
@dataclass
|
|
132
151
|
class ConvertData:
|
|
133
152
|
"""Data for a PDF/video to image conversion request."""
|
|
File without changes
|
|
File without changes
|
{sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/email/v1/email_pb2.py
RENAMED
|
File without changes
|
{sf_queue_sdk-0.2.0b21 → sf_queue_sdk-0.2.0b23}/queue_sdk/generated/queue/email/v1/email_pb2.pyi
RENAMED
|
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
|