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.
Files changed (24) hide show
  1. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/PKG-INFO +1 -1
  2. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/context_service.py +2 -12
  3. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/interactions_service.py +1 -77
  4. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/models.py +16 -20
  5. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/PKG-INFO +1 -1
  6. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/setup.py +1 -1
  7. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/README.md +0 -0
  8. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/__init__.py +0 -0
  9. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/__init__.py +0 -0
  10. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/context/models.py +0 -0
  11. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/interactions/__init__.py +0 -0
  12. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/py.typed +0 -0
  13. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/__init__.py +0 -0
  14. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/models.py +0 -0
  15. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib/tasks/state.py +0 -0
  16. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/SOURCES.txt +0 -0
  17. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/dependency_links.txt +0 -0
  18. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/requires.txt +0 -0
  19. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/nora_lib.egg-info/top_level.txt +0 -0
  20. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/pyproject.toml +0 -0
  21. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/setup.cfg +0 -0
  22. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/tasks/__init__.py +0 -0
  23. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/tasks/test_state.py +0 -0
  24. {nora_lib-0.0.6.dev0 → nora_lib-0.0.7}/tests/test_placeholder.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nora_lib
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.7
4
4
  Summary: For making and coordinating agents and tools
5
5
  Home-page: https://github.com/allenai/nora_lib
6
6
  Requires-Python: >=3.9
@@ -1,17 +1,7 @@
1
- from datetime import datetime, timezone
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 List, Optional
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: Optional[List[Annotation]] = None
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: Optional[List[Event]] = None
89
+ events: List[Event] = Field(default_factory=list)
98
90
  thread_id: Optional[str] = None
99
91
  channel_id: Optional[str] = None
100
- annotations: Optional[List[Annotation]] = None
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: Optional[List[ReturnedAgentContextEvent]] = None
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nora_lib
3
- Version: 0.0.6.dev0
3
+ Version: 0.0.7
4
4
  Summary: For making and coordinating agents and tools
5
5
  Home-page: https://github.com/allenai/nora_lib
6
6
  Requires-Python: >=3.9
@@ -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.6.dev0",
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