-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move start session to thread #27
base: main
Are you sure you want to change the base?
Changes from all commits
a745cd5
a8aeffb
7a81291
56fda75
5f94950
06a9b68
1c8eab6
10c0f1e
960c44c
6c66d0b
c28f16a
2fcb643
277b483
da4ee87
9a9f8ef
1aee480
6b4e50c
7f98d23
379df1d
180edc7
1fefac3
4c591ff
d0524a6
0a673cd
3183f42
88e1e6d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -87,16 +87,13 @@ def initialize(self) -> Union[Session, None]: | |||||||||||||||||||||||
return | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
self.unsuppress_logs() | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if self._config.api_key is None: | ||||||||||||||||||||||||
return logger.error( | ||||||||||||||||||||||||
"Could not initialize AgentOps client - API Key is missing." | ||||||||||||||||||||||||
+ "\n\t Find your API key at https://app.agentops.ai/settings/projects" | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
self._handle_unclean_exits() | ||||||||||||||||||||||||
self._initialize_partner_framework() | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
self._initialized = True | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if self._config.instrument_llm_calls: | ||||||||||||||||||||||||
|
@@ -116,7 +113,7 @@ def initialize(self) -> Union[Session, None]: | |||||||||||||||||||||||
|
||||||||||||||||||||||||
return session | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
def _initialize_partner_framework(self) -> None: | ||||||||||||||||||||||||
def _initialize_autogen_logger(self) -> None: | ||||||||||||||||||||||||
try: | ||||||||||||||||||||||||
import autogen | ||||||||||||||||||||||||
from .partners.autogen_logger import AutogenLogger | ||||||||||||||||||||||||
|
@@ -235,15 +232,33 @@ def start_session( | |||||||||||||||||||||||
if tags is not None: | ||||||||||||||||||||||||
session_tags.update(tags) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
def _start_session_callback(session: Session): | ||||||||||||||||||||||||
if session.is_running: | ||||||||||||||||||||||||
if len(self._pre_init_queue["agents"]) > 0: | ||||||||||||||||||||||||
for agent_args in self._pre_init_queue["agents"]: | ||||||||||||||||||||||||
session.create_agent( | ||||||||||||||||||||||||
name=agent_args["name"], agent_id=agent_args["agent_id"] | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
self._pre_init_queue["agents"] = [] | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
logger.info( | ||||||||||||||||||||||||
colored( | ||||||||||||||||||||||||
f"\x1b[34mSession Replay: https://app.agentops.ai/drilldown?session_id={session.session_id}\x1b[0m", | ||||||||||||||||||||||||
"blue", | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
elif not session.is_running: | ||||||||||||||||||||||||
self._sessions.remove(session) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
session = Session( | ||||||||||||||||||||||||
session_id=session_id, | ||||||||||||||||||||||||
tags=list(session_tags), | ||||||||||||||||||||||||
host_env=get_host_env(self._config.env_data_opt_out), | ||||||||||||||||||||||||
config=self._config, | ||||||||||||||||||||||||
callback=_start_session_callback, | ||||||||||||||||||||||||
Comment on lines
+251
to
+258
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ℹ️ Logic ErrorVerify Session State Before RemovalThe logic for handling sessions has been altered to remove a session if it is not running. Ensure that this change does not inadvertently remove sessions that are intended to be retained. Consider adding a condition to verify the session's state before removal. + elif not session.is_running:
+ self._sessions.remove(session) Commitable Code Suggestion:
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Entelligence.AI /updateCommit There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Error committing file content: 409 - {'message': 'agentops/client.py does not match 0942f1e25f7d0290d2face529c8fc96cd660ee44', 'documentation_url': 'https://docs.github.com/rest/repos/contents#create-or-update-file-contents', 'status': '409'} |
||||||||||||||||||||||||
) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if not session.is_running: | ||||||||||||||||||||||||
return logger.error("Failed to start session") | ||||||||||||||||||||||||
if not session.is_running: return logger.error("Failed to start session") | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
if self._pre_init_queue["agents"] and len(self._pre_init_queue["agents"]) > 0: | ||||||||||||||||||||||||
for agent_args in self._pre_init_queue["agents"]: | ||||||||||||||||||||||||
Comment on lines
+258
to
264
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💻 Code ReadabilityConsolidate Error Logging and Return StatementThe consolidation of the return statement with the error logging improves code readability. However, ensure that the logging message is clear and provides enough context for debugging purposes. + if not session.is_running:
+ return logger.error("Failed to start session: Session is not running") Commitable Code Suggestion:
Suggested change
|
||||||||||||||||||||||||
|
@@ -305,7 +320,8 @@ def create_agent( | |||||||||||||||||||||||
self._pre_init_queue["agents"].append( | ||||||||||||||||||||||||
{"name": name, "agent_id": agent_id} | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
session.create_agent(name=name, agent_id=agent_id) | ||||||||||||||||||||||||
else: | ||||||||||||||||||||||||
session.create_agent(name=name, agent_id=agent_id) | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
return agent_id | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -5,7 +5,7 @@ | |||||||||||||||||||||||||||||||||||||||
import time | ||||||||||||||||||||||||||||||||||||||||
from decimal import ROUND_HALF_UP, Decimal | ||||||||||||||||||||||||||||||||||||||||
from termcolor import colored | ||||||||||||||||||||||||||||||||||||||||
from typing import Optional, List, Union | ||||||||||||||||||||||||||||||||||||||||
from typing import Optional, List, Union, Callable | ||||||||||||||||||||||||||||||||||||||||
from uuid import UUID, uuid4 | ||||||||||||||||||||||||||||||||||||||||
from datetime import datetime | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
@@ -40,10 +40,10 @@ def __init__( | |||||||||||||||||||||||||||||||||||||||
config: Configuration, | ||||||||||||||||||||||||||||||||||||||||
tags: Optional[List[str]] = None, | ||||||||||||||||||||||||||||||||||||||||
host_env: Optional[dict] = None, | ||||||||||||||||||||||||||||||||||||||||
callback: Optional[Callable[["Session"], None]] = None, | ||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||
self.end_timestamp = None | ||||||||||||||||||||||||||||||||||||||||
self.end_state: Optional[str] = None | ||||||||||||||||||||||||||||||||||||||||
self.session_id = session_id | ||||||||||||||||||||||||||||||||||||||||
self.end_state: Optional[str] = None self.session_id = session_id | ||||||||||||||||||||||||||||||||||||||||
self.init_timestamp = get_ISO_time() | ||||||||||||||||||||||||||||||||||||||||
self.tags: List[str] = tags or [] | ||||||||||||||||||||||||||||||||||||||||
self.video: Optional[str] = None | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+43
to
49
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ℹ️ Logic ErrorFix Syntax Error in Attribute InitializationThe initialization of def __init__(
callback: Optional[Callable[["Session"], None]] = None,
):
self.end_timestamp = None
self.end_state: Optional[str] = None
+ self.session_id = session_id
self.init_timestamp = get_ISO_time()
self.tags: List[str] = tags or []
self.video: Optional[str] = None Commitable Code Suggestion:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
|
@@ -60,17 +60,13 @@ def __init__( | |||||||||||||||||||||||||||||||||||||||
"errors": 0, | ||||||||||||||||||||||||||||||||||||||||
"apis": 0, | ||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
self.is_running = False | ||||||||||||||||||||||||||||||||||||||||
active_sessions.append(self) | ||||||||||||||||||||||||||||||||||||||||
self.stop_flag = threading.Event() | ||||||||||||||||||||||||||||||||||||||||
self.thread = threading.Thread(target=self._run) | ||||||||||||||||||||||||||||||||||||||||
self.thread = threading.Thread(target=self._run, args=(callback,)) | ||||||||||||||||||||||||||||||||||||||||
self.thread.daemon = True | ||||||||||||||||||||||||||||||||||||||||
self.thread.start() | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
self.is_running = self._start_session() | ||||||||||||||||||||||||||||||||||||||||
if self.is_running == False: | ||||||||||||||||||||||||||||||||||||||||
self.stop_flag.set() | ||||||||||||||||||||||||||||||||||||||||
self.thread.join(timeout=1) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def set_video(self, video: str) -> None: | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
65
to
70
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ℹ️ Logic ErrorPotential Delay in Session StartThe removal of the session start logic from the Commitable Code Suggestion:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
Sets a url to the video recording of the session. | ||||||||||||||||||||||||||||||||||||||||
|
@@ -274,16 +270,21 @@ def _start_session(self): | |||||||||||||||||||||||||||||||||||||||
self.config.parent_key, | ||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||
except ApiServerException as e: | ||||||||||||||||||||||||||||||||||||||||
return logger.error(f"Could not start session - {e}") | ||||||||||||||||||||||||||||||||||||||||
logger.error(f"Could not start session - {e}") | ||||||||||||||||||||||||||||||||||||||||
return False | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
logger.debug(res.body) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if res.code != 200: | ||||||||||||||||||||||||||||||||||||||||
logger.error(f"Could not start session - server error") | ||||||||||||||||||||||||||||||||||||||||
return False | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
jwt = res.body.get("jwt", None) | ||||||||||||||||||||||||||||||||||||||||
self.jwt = jwt | ||||||||||||||||||||||||||||||||||||||||
if jwt is None: | ||||||||||||||||||||||||||||||||||||||||
logger.error( | ||||||||||||||||||||||||||||||||||||||||
f"Could not start session - server could not authenticate your API Key" | ||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
+286
to
+287
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Comment: Potential exposure of sensitive information in logs. Solution: Ensure that sensitive information is masked or omitted from logs.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||
return False | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
session_url = res.body.get( | ||||||||||||||||||||||||||||||||||||||||
|
@@ -359,10 +360,19 @@ def _flush_queue(self) -> None: | |||||||||||||||||||||||||||||||||||||||
elif event_type == "apis": | ||||||||||||||||||||||||||||||||||||||||
self.event_counts["apis"] += 1 | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def _run(self) -> None: | ||||||||||||||||||||||||||||||||||||||||
def _run(self, callback: Optional[Callable[["Session"], None]] = None) -> None: | ||||||||||||||||||||||||||||||||||||||||
self.is_running = self._start_session() | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if callback: | ||||||||||||||||||||||||||||||||||||||||
callback(self) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if self.is_running == False: | ||||||||||||||||||||||||||||||||||||||||
self.stop_flag.set() | ||||||||||||||||||||||||||||||||||||||||
self.thread.join(timeout=1) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
while not self.stop_flag.is_set(): | ||||||||||||||||||||||||||||||||||||||||
time.sleep(self.config.max_wait_time / 1000) | ||||||||||||||||||||||||||||||||||||||||
if self.queue: | ||||||||||||||||||||||||||||||||||||||||
if self.queue and self.jwt is not None: | ||||||||||||||||||||||||||||||||||||||||
self._flush_queue() | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def create_agent(self, name, agent_id): | ||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -18,7 +18,7 @@ def setup_teardown(): | |||||
|
||||||
|
||||||
@contextlib.contextmanager | ||||||
@pytest.fixture(autouse=True) | ||||||
@pytest.fixture(autouse=True, scope="function") | ||||||
def mock_req(): | ||||||
with requests_mock.Mocker() as m: | ||||||
url = "https://api.agentops.ai" | ||||||
|
@@ -48,10 +48,20 @@ def test_track_agent(self, mock_req): | |||||
assert len(mock_req.request_history) == 0 | ||||||
|
||||||
agentops.init(api_key=self.api_key) | ||||||
time.sleep(1) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Comment: Unnecessary sleep calls in tests can lead to longer test execution times. Solution: Use mocking to simulate time delays instead of using sleep.
Suggested change
|
||||||
|
||||||
# Assert | ||||||
# start session and create agent | ||||||
assert len(mock_req.request_history) == 2 | ||||||
assert mock_req.last_request.headers["X-Agentops-Api-Key"] == self.api_key | ||||||
|
||||||
agentops.end_session(end_state="Success") | ||||||
|
||||||
# Wait for flush | ||||||
time.sleep(1.5) | ||||||
|
||||||
# 3 requests: create session, create agent, update session | ||||||
assert len(mock_req.request_history) == 3 | ||||||
|
||||||
assert ( | ||||||
mock_req.request_history[-2].headers["X-Agentops-Api-Key"] == self.api_key | ||||||
) | ||||||
|
||||||
mock_req.reset() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ℹ️ Logic Error
Ensure Sessions are Only Removed if Not Running
The change in the condition from
else
toelif not session.is_running
ensures that only non-running sessions are removed. This is a critical fix to prevent the removal of active sessions, which could lead to unexpected behavior or errors in session management.Commitable Code Suggestion: