nora-lib 0.0.6.dev0__tar.gz → 0.0.7__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.
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/PKG-INFO +1 -1
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/context_service.py +2 -12
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/interactions_service.py +1 -77
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/models.py +16 -20
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/PKG-INFO +1 -1
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/setup.py +1 -1
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/README.md +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/__init__.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/__init__.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/models.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/__init__.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/py.typed +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/__init__.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/models.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/state.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/SOURCES.txt +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/dependency_links.txt +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/requires.txt +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/top_level.txt +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/pyproject.toml +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/setup.cfg +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/tasks/__init__.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/tasks/test_state.py +0 -0
- {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/test_placeholder.py +0 -0
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
from typing import List, Optional
|
|
3
|
-
from uuid import UUID
|
|
1
|
+
from typing import Optional
|
|
4
2
|
|
|
5
3
|
from nora_lib.interactions.interactions_service import InteractionsService
|
|
6
|
-
from nora_lib.interactions.models import
|
|
7
|
-
ReturnedMessage,
|
|
8
|
-
ReturnedAgentContextMessage,
|
|
9
|
-
ReturnedAgentContextEvent,
|
|
10
|
-
EventType,
|
|
11
|
-
AgentMessageData,
|
|
12
|
-
Event,
|
|
13
|
-
)
|
|
14
|
-
from nora_lib.context.models import WrappedTaskObject
|
|
4
|
+
from nora_lib.interactions.models import ReturnedMessage
|
|
15
5
|
|
|
16
6
|
|
|
17
7
|
class ContextService:
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
import logging
|
|
3
1
|
import requests
|
|
4
|
-
from typing import
|
|
2
|
+
from typing import Optional
|
|
5
3
|
import json
|
|
6
4
|
|
|
7
5
|
from nora_lib.interactions.models import (
|
|
8
6
|
AnnotationBatch,
|
|
9
7
|
Event,
|
|
10
|
-
EventType,
|
|
11
8
|
Message,
|
|
12
9
|
ReturnedMessage,
|
|
13
10
|
ThreadRelationsResponse,
|
|
14
|
-
ThreadForkEventData,
|
|
15
11
|
)
|
|
16
12
|
|
|
17
13
|
|
|
@@ -98,43 +94,6 @@ class InteractionsService:
|
|
|
98
94
|
response.raise_for_status()
|
|
99
95
|
return response.json()
|
|
100
96
|
|
|
101
|
-
def fetch_messages_and_agent_context_events_for_thread(
|
|
102
|
-
self, message_id: str, event_type: str
|
|
103
|
-
) -> List[ReturnedMessage]:
|
|
104
|
-
"""Build a history of messages for a given message including associated events.
|
|
105
|
-
This includes messages from pre-forked threads."""
|
|
106
|
-
messages_with_events: List[ReturnedMessage] = []
|
|
107
|
-
|
|
108
|
-
messages_for_thread: ThreadRelationsResponse = (
|
|
109
|
-
self.fetch_thread_messages_and_events_for_message(
|
|
110
|
-
message_id, [event_type, EventType.THREAD_FORK.value]
|
|
111
|
-
)
|
|
112
|
-
)
|
|
113
|
-
messages_with_events.extend(messages_for_thread.messages)
|
|
114
|
-
|
|
115
|
-
# Process any thread_fork events
|
|
116
|
-
try:
|
|
117
|
-
for msg in messages_for_thread.messages:
|
|
118
|
-
events = msg.events if msg.events else []
|
|
119
|
-
for event in events:
|
|
120
|
-
if event.type == EventType.THREAD_FORK.value:
|
|
121
|
-
event_data = ThreadForkEventData.model_validate(event.data)
|
|
122
|
-
forked_thread: ThreadRelationsResponse = (
|
|
123
|
-
self.fetch_thread_messages_and_events_for_message(
|
|
124
|
-
event_data.previous_message_id, [event_type]
|
|
125
|
-
)
|
|
126
|
-
)
|
|
127
|
-
messages_with_events.extend(forked_thread.messages)
|
|
128
|
-
except Exception as e: # pylint: disable=broad-except
|
|
129
|
-
logging.exception(
|
|
130
|
-
"Failed to fetch forked thread messages for message %s: %s",
|
|
131
|
-
message_id,
|
|
132
|
-
e,
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
messages_with_events.sort(key=lambda x: x.ts)
|
|
136
|
-
return messages_with_events
|
|
137
|
-
|
|
138
97
|
def fetch_thread_messages_and_events_for_message(
|
|
139
98
|
self, message_id: str, event_types: list[str]
|
|
140
99
|
) -> ThreadRelationsResponse:
|
|
@@ -183,41 +142,6 @@ class InteractionsService:
|
|
|
183
142
|
response.raise_for_status()
|
|
184
143
|
return response.json()
|
|
185
144
|
|
|
186
|
-
def fetch_messages_and_events_for_forked_thread(
|
|
187
|
-
self, message_id: str, event_type: str
|
|
188
|
-
) -> List[ReturnedMessage]:
|
|
189
|
-
"""Build a history of messages for a given message including associated events.
|
|
190
|
-
This includes messages from pre-forked threads."""
|
|
191
|
-
returned_messages: List[ReturnedMessage] = []
|
|
192
|
-
|
|
193
|
-
messages_for_thread: ThreadRelationsResponse = (
|
|
194
|
-
self.fetch_thread_messages_and_events_for_message(message_id, [event_type])
|
|
195
|
-
)
|
|
196
|
-
if messages_for_thread.messages:
|
|
197
|
-
returned_messages.extend(messages_for_thread.messages)
|
|
198
|
-
|
|
199
|
-
# Lookup any thread_fork events (conversation across surfaces)
|
|
200
|
-
thread_fork_events = self.fetch_messages_and_events_for_thread(
|
|
201
|
-
messages_for_thread.thread_id, EventType.THREAD_FORK.value
|
|
202
|
-
)
|
|
203
|
-
for forked_thread_event in thread_fork_events.get("thread", {}).get(
|
|
204
|
-
"events", []
|
|
205
|
-
):
|
|
206
|
-
event_data = ThreadForkEventData.model_validate(
|
|
207
|
-
forked_thread_event.get("data", {})
|
|
208
|
-
)
|
|
209
|
-
forked_thread: ThreadRelationsResponse = (
|
|
210
|
-
self.fetch_thread_messages_and_events_for_message(
|
|
211
|
-
event_data.previous_message_id, [event_type]
|
|
212
|
-
)
|
|
213
|
-
)
|
|
214
|
-
if forked_thread.messages:
|
|
215
|
-
returned_messages.extend(forked_thread.messages)
|
|
216
|
-
|
|
217
|
-
returned_messages.sort(key=lambda x: x.ts)
|
|
218
|
-
|
|
219
|
-
return returned_messages
|
|
220
|
-
|
|
221
145
|
def fetch_events_for_message(
|
|
222
146
|
self,
|
|
223
147
|
message_id: str,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Model for interactions to be sent to the interactions service.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
from datetime import datetime
|
|
6
7
|
from enum import Enum
|
|
7
8
|
from typing import Dict, List, Optional, Tuple
|
|
@@ -43,7 +44,7 @@ class Message(BaseModel):
|
|
|
43
44
|
channel_id: str
|
|
44
45
|
surface: Surface
|
|
45
46
|
ts: datetime
|
|
46
|
-
annotations:
|
|
47
|
+
annotations: List[Annotation] = Field(default_factory=list)
|
|
47
48
|
|
|
48
49
|
@field_serializer("actor_id")
|
|
49
50
|
def serialize_actor_id(self, actor_id: UUID):
|
|
@@ -54,15 +55,6 @@ class Message(BaseModel):
|
|
|
54
55
|
return ts.isoformat()
|
|
55
56
|
|
|
56
57
|
|
|
57
|
-
class EventType(str, Enum):
|
|
58
|
-
"""Event types for the interactions service"""
|
|
59
|
-
|
|
60
|
-
AGENT_CONTEXT = "agent:message_context"
|
|
61
|
-
S2_ANNOTATION = "s2_annotation"
|
|
62
|
-
THREAD_FORK = "thread_fork"
|
|
63
|
-
UI_INTERACTION = "ui_interaction"
|
|
64
|
-
|
|
65
|
-
|
|
66
58
|
class Event(BaseModel):
|
|
67
59
|
"""event object to be sent to the interactions service; requires association with a message, thread or channel id"""
|
|
68
60
|
|
|
@@ -89,15 +81,25 @@ class Event(BaseModel):
|
|
|
89
81
|
class ReturnedMessage(BaseModel):
|
|
90
82
|
"""Message format returned by interaction service"""
|
|
91
83
|
|
|
92
|
-
message_id: str
|
|
93
84
|
actor_id: UUID
|
|
94
85
|
text: str
|
|
95
86
|
ts: datetime
|
|
87
|
+
message_id: Optional[str] = None
|
|
96
88
|
annotated_text: Optional[str] = None
|
|
97
|
-
events:
|
|
89
|
+
events: List[Event] = Field(default_factory=list)
|
|
98
90
|
thread_id: Optional[str] = None
|
|
99
91
|
channel_id: Optional[str] = None
|
|
100
|
-
annotations:
|
|
92
|
+
annotations: List[Annotation] = Field(default_factory=list)
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def from_event(cls, event: Event) -> "ReturnedMessage":
|
|
96
|
+
"""Convert an event to a message"""
|
|
97
|
+
return ReturnedMessage(
|
|
98
|
+
actor_id=event.actor_id,
|
|
99
|
+
text=json.dumps(event.data),
|
|
100
|
+
ts=event.timestamp,
|
|
101
|
+
message_id=event.message_id,
|
|
102
|
+
)
|
|
101
103
|
|
|
102
104
|
|
|
103
105
|
class AgentMessageData(BaseModel):
|
|
@@ -127,13 +129,7 @@ class ReturnedAgentContextMessage(BaseModel):
|
|
|
127
129
|
text: str
|
|
128
130
|
ts: str
|
|
129
131
|
annotated_text: Optional[str] = None
|
|
130
|
-
events:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
class ThreadForkEventData(BaseModel):
|
|
134
|
-
"""Event data for a thread fork event"""
|
|
135
|
-
|
|
136
|
-
previous_message_id: str
|
|
132
|
+
events: List[ReturnedAgentContextEvent] = Field(default_factory=list)
|
|
137
133
|
|
|
138
134
|
|
|
139
135
|
class ThreadRelationsResponse(BaseModel):
|
|
@@ -7,7 +7,7 @@ dev_requirements = ["mypy", "pytest", "black", "types-requests"]
|
|
|
7
7
|
|
|
8
8
|
setuptools.setup(
|
|
9
9
|
name="nora_lib",
|
|
10
|
-
version="0.0.
|
|
10
|
+
version="0.0.7",
|
|
11
11
|
description="For making and coordinating agents and tools",
|
|
12
12
|
url="https://github.com/allenai/nora_lib",
|
|
13
13
|
packages=setuptools.find_packages(exclude=(["tests"])),
|
|
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
|