Skip to content

Conversation

@roaga
Copy link
Member

@roaga roaga commented Nov 6, 2025

Adds support for devs to pass in a pydantic model as an artifact schema to the client, and to read the generated artifact back. Also refactors the client into a class to make managing all this easier.

Requries https://github.com/getsentry/seer/pull/3945

@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Nov 6, 2025
@codecov
Copy link

codecov bot commented Nov 6, 2025

❌ 14 Tests Failed:

Tests completed Failed Passed Skipped
29527 14 29513 244
View the top 3 failed test(s) by shortest run time
tests.sentry.seer.endpoints.test_organization_seer_explorer_chat.OrganizationSeerExplorerChatEndpointTest::test_post_new_conversation_calls_client
Stack Traces | 1.22s run time
#x1B[1m#x1B[.../testutils/helpers/features.py#x1B[0m:215: in wrapped_method
    return method(*args, **kwargs)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1421: in patched
    with self.decoration_helper(patched,
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:141: in __enter__
    return next(self.gen)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1403: in decoration_helper
    arg = exit_stack.enter_context(patching)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:530: in enter_context
    result = _enter(cm)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_chat' from '.../seer/endpoints/organization_seer_explorer_chat.py'> does not have the attribute 'start_seer_run'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_chat.OrganizationSeerExplorerChatEndpointTest::test_post_continue_conversation_calls_client
Stack Traces | 1.25s run time
#x1B[1m#x1B[.../testutils/helpers/features.py#x1B[0m:215: in wrapped_method
    return method(*args, **kwargs)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1421: in patched
    with self.decoration_helper(patched,
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:141: in __enter__
    return next(self.gen)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1403: in decoration_helper
    arg = exit_stack.enter_context(patching)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:530: in enter_context
    result = _enter(cm)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_chat' from '.../seer/endpoints/organization_seer_explorer_chat.py'> does not have the attribute 'continue_seer_run'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_chat.OrganizationSeerExplorerChatEndpointTest::test_get_with_run_id_calls_client
Stack Traces | 1.36s run time
#x1B[1m#x1B[.../testutils/helpers/features.py#x1B[0m:215: in wrapped_method
    return method(*args, **kwargs)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1421: in patched
    with self.decoration_helper(patched,
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:141: in __enter__
    return next(self.gen)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1403: in decoration_helper
    arg = exit_stack.enter_context(patching)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/contextlib.py#x1B[0m:530: in enter_context
    result = _enter(cm)
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1................../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_chat' from '.../seer/endpoints/organization_seer_explorer_chat.py'> does not have the attribute 'get_seer_run'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_with_category_key_filter
Stack Traces | 1.77s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_with_both_category_filters
Stack Traces | 1.8s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpointFeatureFlags::test_missing_seer_explorer_flag
Stack Traces | 1.82s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:267: in test_missing_seer_explorer_flag
    with patch(
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_with_category_filters_and_pagination
Stack Traces | 1.84s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_simple
Stack Traces | 1.9s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpointFeatureFlags::test_missing_allow_joinleave_org_flag
Stack Traces | 1.99s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:295: in test_missing_allow_joinleave_org_flag
    with patch(
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpointFeatureFlags::test_missing_gen_ai_features_flag
Stack Traces | 2.01s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:257: in test_missing_gen_ai_features_flag
    with patch(
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_with_category_value_filter
Stack Traces | 2.1s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpointFeatureFlags::test_missing_seer_acknowledgement
Stack Traces | 2.2s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:279: in test_missing_seer_acknowledgement
    with patch(
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1....../x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_cursor_pagination
Stack Traces | 2.24s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m
tests.sentry.seer.endpoints.test_organization_seer_explorer_runs.TestOrganizationSeerExplorerRunsEndpoint::test_get_with_seer_error
Stack Traces | 2.28s run time
#x1B[1m#x1B[.../seer/endpoints/test_organization_seer_explorer_runs.py#x1B[0m:32: in setUp
    self.get_seer_runs = self.get_seer_runs_patcher.start()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1652: in start
    result = self.__enter__()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1495: in __enter__
    original, local = self.get_original()
#x1B[1m#x1B[.../hostedtoolcache/Python/3.13.1........./x64/lib/python3.13/unittest/mock.py#x1B[0m:1465: in get_original
    raise AttributeError(
#x1B[1m#x1B[31mE   AttributeError: <module 'sentry.seer.endpoints.organization_seer_explorer_runs' from '.../seer/endpoints/organization_seer_explorer_runs.py'> does not have the attribute 'get_seer_runs'#x1B[0m

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@roaga roaga marked this pull request as ready for review November 6, 2025 21:40
@roaga roaga requested a review from a team as a code owner November 6, 2025 21:40
@roaga roaga requested a review from aliu39 November 6, 2025 21:40
@roaga roaga merged commit 17f21ec into master Nov 12, 2025
65 checks passed
@roaga roaga deleted the explorer/client-artifacts branch November 12, 2025 02:57
Jesse-Box pushed a commit that referenced this pull request Nov 12, 2025
Adds support for devs to pass in a pydantic model as an artifact schema
to the client, and to read the generated artifact back. Also refactors
the client into a class to make managing all this easier.

Requries getsentry/seer#3945
andrewshie-sentry pushed a commit that referenced this pull request Nov 13, 2025
Adds support for devs to pass in a pydantic model as an artifact schema
to the client, and to read the generated artifact back. Also refactors
the client into a class to make managing all this easier.

Requries getsentry/seer#3945
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Scope: Backend Automatically applied to PRs that change backend components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants