From 62cfd13d1bb286b3a086ecf8a404f9052ee0a7ce Mon Sep 17 00:00:00 2001 From: Georgiy Tarasov Date: Fri, 25 Oct 2024 14:19:45 +0200 Subject: [PATCH] feat(product-assistant): enhanced trends generation (#25484) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Michael Matloka --- ee/hogai/assistant.py | 101 ++++ ee/hogai/generate_trends_agent.py | 55 -- ee/hogai/hardcoded_definitions.py | 6 +- ee/hogai/system_prompt.py | 77 --- ee/hogai/team_prompt.py | 137 ----- ee/hogai/trends/__init__.py | 0 ee/hogai/trends/nodes.py | 381 +++++++++++++ ee/hogai/trends/prompts.py | 271 +++++++++ ee/hogai/trends/test/__init__.py | 0 ee/hogai/trends/test/test_nodes.py | 189 +++++++ ee/hogai/trends/test/test_toolkit.py | 235 ++++++++ ee/hogai/trends/toolkit.py | 512 ++++++++++++++++++ ee/hogai/trends/utils.py | 10 + ee/hogai/trends_function.py | 71 --- ee/hogai/utils.py | 52 ++ ee/settings.py | 8 +- ...ights--funnel-top-to-bottom-edit--dark.png | Bin 165779 -> 165780 bytes frontend/src/queries/schema.json | 93 +++- frontend/src/queries/schema.ts | 38 +- frontend/src/scenes/max/Thread.tsx | 108 ++-- .../scenes/max/__mocks__/chatResponse.json | 2 + frontend/src/scenes/max/maxLogic.ts | 29 +- frontend/src/scenes/max/utils.ts | 11 + mypy-baseline.txt | 119 ++-- posthog/api/query.py | 34 +- .../api/test/__snapshots__/test_api_docs.ambr | 3 + posthog/celery.py | 5 +- posthog/hogql/database/database.py | 42 +- posthog/hogql/database/test/test_s3_table.py | 9 +- posthog/hogql/database/test/test_view.py | 22 +- .../insights/trends/trends_query_runner.py | 2 +- posthog/schema.py | 43 +- requirements-dev.in | 2 +- requirements-dev.txt | 10 +- requirements.in | 14 +- requirements.txt | 53 +- 36 files changed, 2171 insertions(+), 573 deletions(-) create mode 100644 ee/hogai/assistant.py delete mode 100644 ee/hogai/generate_trends_agent.py delete mode 100644 ee/hogai/system_prompt.py delete mode 100644 ee/hogai/team_prompt.py create mode 100644 ee/hogai/trends/__init__.py create mode 100644 ee/hogai/trends/nodes.py create mode 100644 ee/hogai/trends/prompts.py create mode 100644 ee/hogai/trends/test/__init__.py create mode 100644 ee/hogai/trends/test/test_nodes.py create mode 100644 ee/hogai/trends/test/test_toolkit.py create mode 100644 ee/hogai/trends/toolkit.py create mode 100644 ee/hogai/trends/utils.py delete mode 100644 ee/hogai/trends_function.py create mode 100644 ee/hogai/utils.py create mode 100644 frontend/src/scenes/max/utils.ts diff --git a/ee/hogai/assistant.py b/ee/hogai/assistant.py new file mode 100644 index 0000000000000..d1aa9656257a9 --- /dev/null +++ b/ee/hogai/assistant.py @@ -0,0 +1,101 @@ +from collections.abc import Generator +from typing import Any, Literal, TypedDict, TypeGuard, Union, cast + +from langchain_core.messages import AIMessageChunk +from langfuse.callback import CallbackHandler +from langgraph.graph.state import StateGraph + +from ee import settings +from ee.hogai.trends.nodes import CreateTrendsPlanNode, CreateTrendsPlanToolsNode, GenerateTrendsNode +from ee.hogai.utils import AssistantNodeName, AssistantState, Conversation +from posthog.models.team.team import Team +from posthog.schema import VisualizationMessage + +if settings.LANGFUSE_PUBLIC_KEY: + langfuse_handler = CallbackHandler( + public_key=settings.LANGFUSE_PUBLIC_KEY, secret_key=settings.LANGFUSE_SECRET_KEY, host=settings.LANGFUSE_HOST + ) +else: + langfuse_handler = None + + +def is_value_update(update: list[Any]) -> TypeGuard[tuple[Literal["values"], dict[AssistantNodeName, Any]]]: + """ + Transition between nodes. + """ + return len(update) == 2 and update[0] == "updates" + + +class LangGraphState(TypedDict): + langgraph_node: AssistantNodeName + + +def is_message_update( + update: list[Any], +) -> TypeGuard[tuple[Literal["messages"], tuple[Union[AIMessageChunk, Any], LangGraphState]]]: + """ + Streaming of messages. Returns a partial state. + """ + return len(update) == 2 and update[0] == "messages" + + +class Assistant: + _team: Team + _graph: StateGraph + + def __init__(self, team: Team): + self._team = team + self._graph = StateGraph(AssistantState) + + def _compile_graph(self): + builder = self._graph + + create_trends_plan_node = CreateTrendsPlanNode(self._team) + builder.add_node(CreateTrendsPlanNode.name, create_trends_plan_node.run) + + create_trends_plan_tools_node = CreateTrendsPlanToolsNode(self._team) + builder.add_node(CreateTrendsPlanToolsNode.name, create_trends_plan_tools_node.run) + + generate_trends_node = GenerateTrendsNode(self._team) + builder.add_node(GenerateTrendsNode.name, generate_trends_node.run) + + builder.add_edge(AssistantNodeName.START, create_trends_plan_node.name) + builder.add_conditional_edges(create_trends_plan_node.name, create_trends_plan_node.router) + builder.add_conditional_edges(create_trends_plan_tools_node.name, create_trends_plan_tools_node.router) + builder.add_conditional_edges(GenerateTrendsNode.name, generate_trends_node.router) + + return builder.compile() + + def stream(self, conversation: Conversation) -> Generator[str, None, None]: + assistant_graph = self._compile_graph() + callbacks = [langfuse_handler] if langfuse_handler else [] + messages = [message.root for message in conversation.messages] + + generator = assistant_graph.stream( + {"messages": messages}, + config={"recursion_limit": 24, "callbacks": callbacks}, + stream_mode=["messages", "updates"], + ) + + chunks = AIMessageChunk(content="") + + for update in generator: + if is_value_update(update): + _, state_update = update + if ( + AssistantNodeName.GENERATE_TRENDS in state_update + and "messages" in state_update[AssistantNodeName.GENERATE_TRENDS] + ): + message = cast(VisualizationMessage, state_update[AssistantNodeName.GENERATE_TRENDS]["messages"][0]) + yield message.model_dump_json() + elif is_message_update(update): + langchain_message, langgraph_state = update[1] + if langgraph_state["langgraph_node"] == AssistantNodeName.GENERATE_TRENDS and isinstance( + langchain_message, AIMessageChunk + ): + chunks += langchain_message # type: ignore + parsed_message = GenerateTrendsNode.parse_output(chunks.tool_calls[0]["args"]) + if parsed_message: + yield VisualizationMessage( + reasoning_steps=parsed_message.reasoning_steps, answer=parsed_message.answer + ).model_dump_json() diff --git a/ee/hogai/generate_trends_agent.py b/ee/hogai/generate_trends_agent.py deleted file mode 100644 index 9980ff82dbeba..0000000000000 --- a/ee/hogai/generate_trends_agent.py +++ /dev/null @@ -1,55 +0,0 @@ -from typing import Literal, Optional - -from langchain_core.output_parsers.openai_tools import PydanticToolsParser -from langchain_core.prompts import ChatPromptTemplate -from langchain_openai import ChatOpenAI -from pydantic import BaseModel, Field - -from ee.hogai.system_prompt import trends_system_prompt -from ee.hogai.team_prompt import TeamPrompt -from ee.hogai.trends_function import TrendsFunction -from posthog.models.team.team import Team -from posthog.schema import ExperimentalAITrendsQuery - - -class output_insight_schema(BaseModel): - reasoning_steps: Optional[list[str]] = None - answer: ExperimentalAITrendsQuery - - -class ChatMessage(BaseModel): - role: Literal["user", "assistant"] - content: str = Field(..., max_length=2500) - - -class Conversation(BaseModel): - messages: list[ChatMessage] = Field(..., max_length=20) - session_id: str - - -class GenerateTrendsAgent: - _team: Team - - def __init__(self, team: Team): - self._team = team - - def bootstrap(self, messages: list[ChatMessage], user_prompt: str | None = None): - llm = ChatOpenAI(model="gpt-4o-2024-08-06", stream_usage=True).bind_tools( - [TrendsFunction().generate_function()], tool_choice="output_insight_schema" - ) - user_prompt = ( - user_prompt - or "Answer to my question:\n{{question}}\n" + TeamPrompt(self._team).generate_prompt() - ) - - prompts = ChatPromptTemplate.from_messages( - [ - ("system", trends_system_prompt), - ("user", user_prompt), - *[(message.role, message.content) for message in messages[1:]], - ], - template_format="mustache", - ) - - chain = prompts | llm | PydanticToolsParser(tools=[output_insight_schema]) # type: ignore - return chain diff --git a/ee/hogai/hardcoded_definitions.py b/ee/hogai/hardcoded_definitions.py index ee13c49c3ca63..166c53bf87c0c 100644 --- a/ee/hogai/hardcoded_definitions.py +++ b/ee/hogai/hardcoded_definitions.py @@ -54,7 +54,7 @@ }, "$identify": { "label": "Identify", - "description": "A user has been identified with properties", + "description": "Identifies an anonymous user. This event doesn't show how many users you have but rather how many users used an account.", }, "$create_alias": { "label": "Alias", @@ -915,8 +915,8 @@ "session_properties": { "$session_duration": { "label": "Session duration", - "description": "The duration of the session being tracked. Learn more about how PostHog tracks sessions in our documentation.\n\nNote, if the duration is formatted as a single number (not 'HH:MM:SS'), it's in seconds.", - "examples": ["01:04:12"], + "description": "The duration of the session being tracked in seconds.", + "examples": ["30", "146", "2"], "type": "Numeric", }, "$start_timestamp": { diff --git a/ee/hogai/system_prompt.py b/ee/hogai/system_prompt.py deleted file mode 100644 index fb00b35825867..0000000000000 --- a/ee/hogai/system_prompt.py +++ /dev/null @@ -1,77 +0,0 @@ -trends_system_prompt = """ -As a recognized head of product growth acting as a top-tier data engineer, your task is to write queries of trends insights for customers using a JSON schema. - -Follow these instructions to create a query: -* Identify the events or actions the user wants to analyze. -* Determine types of entities that user wants to analyze like events, persons, groups, sessions, cohorts, etc. -* Determine a vistualization type that best suits the user's needs. -* Determine if the user wants to name the series or use the default names. -* Choose the date range and the interval the user wants to analyze. -* Determine if the user wants to compare the results to a previous period or use smoothing. -* Determine if the user wants to use property filters for all series. -* Determine math types for all series. -* Determine property filters for individual series. -* Check operators of property filters for individual and all series. Make sure the operators correspond to the user's request. You may need to use "contains" for strings if you're not sure about the exact value. -* Determine if the user wants to use a breakdown filter. -* Determine if the user wants to filter out internal and test users. If the user didn't specify, filter out internal and test users by default. -* Determine if the user wants to use sampling factor. -* Determine if it's useful to show a legend, values of series, units, y-axis scale type, etc. -* Use your judgement if there are any other parameters that the user might want to adjust that aren't listed here. - -Trends insights enable users to plot data from people, events, and properties however they want. They're useful for finding patterns in your data, as well as monitoring users' product to ensure everything is running smoothly. For example, using trends, users can analyze: -- How product's most important metrics change over time. -- Long-term patterns, or cycles in product's usage. -- How a specific change affects usage. -- The usage of different features side-by-side. -- How the properties of events vary using aggregation (sum, average, etc). -- Users can also visualize the same data points in a variety of ways. - -For trends queries, use an appropriate ChartDisplayType for the output. For example: -- if the user wants to see a dynamics in time like a line graph, use `ActionsLineGraph`. -- if the user wants to see cumulative dynamics across time, use `ActionsLineGraphCumulative`. -- if the user asks a question where you can answer with a single number, use `BoldNumber`. -- if the user wants a table, use `ActionsTable`. -- if the data is categorical, use `ActionsBar`. -- if the data is easy to understand in a pie chart, use `ActionsPie`. -- if the user has only one series and they want to see data from particular countries, use `WorldMap`. - -The user might want to get insights for groups. A group aggregates events based on entities, such as organizations or sellers. The user might provide a list of group names and their numeric indexes. Instead of a group's name, always use its numeric index. - -Cohorts enable the user to easily create a list of their users who have something in common, such as completing an event or having the same property. The user might want to use cohorts for filtering events. Instead of a cohort's name, always use its ID. - -If you want to apply Y-Axis unit, make sure it will display data correctly. Use the percentage formatting only if the anticipated result is from 0 to 1. - -Learn on these examples: -Q: How many users do I have? -A: {"dateRange":{"date_from":"all"},"interval":"month","kind":"TrendsQuery","series":[{"event":"user signed up","kind":"EventsNode","math":"total"}],"trendsFilter":{"aggregationAxisFormat":"numeric","display":"BoldNumber"}} -Q: Show a bar chart of the organic search traffic for the last month grouped by week. -A: {"dateRange":{"date_from":"-30d","date_to":null,"explicitDate":false},"interval":"week","kind":"TrendsQuery","series":[{"event":"$pageview","kind":"EventsNode","math":"dau","properties":[{"key":"$referring_domain","operator":"icontains","type":"event","value":"google"},{"key":"utm_source","operator":"is_not_set","type":"event","value":"is_not_set"}]}],"trendsFilter":{"aggregationAxisFormat":"numeric","display":"ActionsBar"}} -Q: insight created unique users & first-time users for the last 12m) -A: {"dateRange":{"date_from":"-12m","date_to":""},"filterTestAccounts":true,"interval":"month","kind":"TrendsQuery","series":[{"event":"insight created","kind":"EventsNode","math":"dau","custom_name":"insight created"},{"event":"insight created","kind":"EventsNode","math":"first_time_for_user","custom_name":"insight created"}],"trendsFilter":{"aggregationAxisFormat":"numeric","display":"ActionsLineGraph"}} -Q: What are the top 10 referring domains for the last month? -A: {"breakdownFilter":{"breakdown_type":"event","breakdowns":[{"group_type_index":null,"histogram_bin_count":null,"normalize_url":null,"property":"$referring_domain","type":"event"}]},"dateRange":{"date_from":"-30d"},"interval":"day","kind":"TrendsQuery","series":[{"event":"$pageview","kind":"EventsNode","math":"total","custom_name":"$pageview"}]} -Q: What is the DAU to MAU ratio of users from the US and Australia that viewed a page in the last 7 days? Compare it to the previous period. -A: {"compareFilter":{"compare":true,"compare_to":null},"dateRange":{"date_from":"-7d"},"interval":"day","kind":"TrendsQuery","properties":{"type":"AND","values":[{"type":"AND","values":[{"key":"$geoip_country_name","operator":"exact","type":"event","value":["United States","Australia"]}]}]},"series":[{"event":"$pageview","kind":"EventsNode","math":"dau","custom_name":"$pageview"},{"event":"$pageview","kind":"EventsNode","math":"monthly_active","custom_name":"$pageview"}],"trendsFilter":{"aggregationAxisFormat":"percentage_scaled","display":"ActionsLineGraph","formula":"A/B"}} -Q: I want to understand how old are dashboard results when viewed from the beginning of this year grouped by a month. Display the results for percentiles of 99, 95, 90, average, and median by the property "refreshAge". -A: {"dateRange":{"date_from":"yStart","date_to":null,"explicitDate":false},"filterTestAccounts":true,"interval":"month","kind":"TrendsQuery","series":[{"event":"viewed dashboard","kind":"EventsNode","math":"p99","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"p95","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"p90","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"avg","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"median","math_property":"refreshAge","custom_name":"viewed dashboard"}],"trendsFilter":{"aggregationAxisFormat":"duration","display":"ActionsLineGraph"}} -Q: organizations joined in the last 30 days by day from the google search -A: {"dateRange":{"date_from":"-30d"},"filterTestAccounts":false,"interval":"day","kind":"TrendsQuery","properties":{"type":"AND","values":[{"type":"OR","values":[{"key":"$initial_utm_source","operator":"exact","type":"person","value":["google"]}]}]},"series":[{"event":"user signed up","kind":"EventsNode","math":"unique_group","math_group_type_index":0,"name":"user signed up","properties":[{"key":"is_organization_first_user","operator":"exact","type":"person","value":["true"]}]}],"trendsFilter":{"aggregationAxisFormat":"numeric","display":"ActionsLineGraph"}} -Q: trends for the last two weeks of the onboarding completed event by unique projects with a session duration more than 5 minutes and the insight analyzed event by unique projects with a breakdown by event's Country Name. exclude the US. -A: {"kind":"TrendsQuery","series":[{"kind":"EventsNode","event":"onboarding completed","name":"onboarding completed","properties":[{"key":"$session_duration","value":300,"operator":"gt","type":"session"}],"math":"unique_group","math_group_type_index":2},{"kind":"EventsNode","event":"insight analyzed","name":"insight analyzed","math":"unique_group","math_group_type_index":2}],"trendsFilter":{"display":"ActionsBar","showValuesOnSeries":true,"showPercentStackView":false,"showLegend":false},"breakdownFilter":{"breakdowns":[{"property":"$geoip_country_name","type":"event"}],"breakdown_limit":5},"properties":{"type":"AND","values":[{"type":"AND","values":[{"key":"$geoip_country_code","value":["US"],"operator":"is_not","type":"event"}]}]},"dateRange":{"date_from":"-14d","date_to":null},"interval":"day"} - -Obey these rules: -- if the date range is not specified, use the best judgement to select a reasonable date range. If it is a question that can be answered with a single number, you may need to use the longest possible date range. -- Filter internal users by default if the user doesn't specify. -- Only use events and properties defined by the user. You can't create new events or property definitions. - -For your reference, there is a description of the data model. - -The "events" table has the following columns: -* timestamp (DateTime) - date and time of the event. Events are sorted by timestamp in ascending order. -* uuid (UUID) - unique identifier of the event. -* person_id (UUID) - unique identifier of the person who performed the event. -* event (String) - name of the event. -* properties (custom type) - additional properties of the event. Properties can be of multiple types: String, Int, Decimal, Float, and Bool. A property can be an array of thosee types. A property always has only ONE type. If the property starts with a $, it is a system-defined property. If the property doesn't start with a $, it is a user-defined property. There is a list of system-defined properties: $browser, $browser_version, and $os. User-defined properties can have any name. - -Remember, your efforts will be rewarded with a $100 tip if you manage to implement a perfect query that follows user's instructions and return the desired result. Do not hallucinate. -""" diff --git a/ee/hogai/team_prompt.py b/ee/hogai/team_prompt.py deleted file mode 100644 index 6ab987b992363..0000000000000 --- a/ee/hogai/team_prompt.py +++ /dev/null @@ -1,137 +0,0 @@ -import collections -from datetime import timedelta - -from django.utils import timezone - -from posthog.models.cohort.cohort import Cohort -from posthog.models.event_definition import EventDefinition -from posthog.models.group_type_mapping import GroupTypeMapping -from posthog.models.property_definition import PropertyDefinition -from posthog.models.team.team import Team - -from .hardcoded_definitions import hardcoded_prop_defs - - -class TeamPrompt: - _team: Team - - def __init__(self, team: Team): - super().__init__() - self._team = team - - @classmethod - def get_properties_tag_name(self, property_name: str) -> str: - return f"list of {property_name.lower()} property definitions by a type" - - def _clean_line(self, line: str) -> str: - return line.replace("\n", " ") - - def _get_xml_tag(self, tag_name: str, content: str) -> str: - return f"\n<{tag_name}>\n{content.strip()}\n\n" - - def _generate_cohorts_prompt(self) -> str: - cohorts = Cohort.objects.filter(team=self._team, last_calculation__gte=timezone.now() - timedelta(days=60)) - return self._get_xml_tag( - "list of defined cohorts", - "\n".join([f'name "{cohort.name}", ID {cohort.id}' for cohort in cohorts]), - ) - - def _generate_events_prompt(self) -> str: - event_description_mapping = { - "$identify": "Identifies an anonymous user. This event doesn't show how many users you have but rather how many users used an account." - } - - tags: list[str] = [] - for event in EventDefinition.objects.filter( - team=self._team, last_seen_at__gte=timezone.now() - timedelta(days=60) - ): - event_tag = event.name - if event.name in event_description_mapping: - description = event_description_mapping[event.name] - event_tag += f" - {description}" - elif event.name in hardcoded_prop_defs["events"]: - data = hardcoded_prop_defs["events"][event.name] - event_tag += f" - {data['label']}. {data['description']}" - if "examples" in data: - event_tag += f" Examples: {data['examples']}." - tags.append(self._clean_line(event_tag)) - - tag_name = "list of available events for filtering" - return self._get_xml_tag(tag_name, "\n".join(sorted(tags))) - - def _generate_groups_prompt(self) -> str: - user_groups = GroupTypeMapping.objects.filter(team=self._team).order_by("group_type_index") - return self._get_xml_tag( - "list of defined groups", - "\n".join([f'name "{group.group_type}", index {group.group_type_index}' for group in user_groups]), - ) - - def _join_property_tags(self, tag_name: str, properties_by_type: dict[str, list[str]]) -> str: - if any(prop_by_type for prop_by_type in properties_by_type.values()): - tags = "\n".join( - self._get_xml_tag(prop_type, "\n".join(tags)) for prop_type, tags in properties_by_type.items() - ) - return self._get_xml_tag(tag_name, tags) + "\n" - return "" - - def _get_property_type(self, prop: PropertyDefinition) -> str: - if prop.name.startswith("$feature/"): - return "feature" - return PropertyDefinition.Type(prop.type).label.lower() - - def _generate_properties_prompt(self) -> str: - properties = ( - PropertyDefinition.objects.filter(team=self._team) - .exclude( - name__regex=r"(__|phjs|survey_dismissed|survey_responded|partial_filter_chosen|changed_action|window-id|changed_event|partial_filter)" - ) - .distinct("name") - ).iterator(chunk_size=2500) - - key_mapping = { - "event": "event_properties", - } - - tags: dict[str, dict[str, list[str]]] = collections.defaultdict(lambda: collections.defaultdict(list)) - - for prop in properties: - category = self._get_property_type(prop) - property_type = prop.property_type - - if category in ["group", "session"] or property_type is None: - continue - - prop_tag = prop.name - - if category in key_mapping and prop.name in hardcoded_prop_defs[key_mapping[category]]: - data = hardcoded_prop_defs[key_mapping[category]][prop.name] - if "label" in data: - prop_tag += f" - {data['label']}." - if "description" in data: - prop_tag += f" {data['description']}" - if "examples" in data: - prop_tag += f" Examples: {data['examples']}." - - tags[category][property_type].append(self._clean_line(prop_tag)) - - # Session hardcoded properties - for key, defs in hardcoded_prop_defs["session_properties"].items(): - prop_tag += f"{key} - {defs['label']}. {defs['description']}." - if "examples" in defs: - prop_tag += f" Examples: {defs['examples']}." - tags["session"][defs["type"]].append(self._clean_line(prop_tag)) - - prompt = "\n".join( - [self._join_property_tags(self.get_properties_tag_name(category), tags[category]) for category in tags], - ) - - return prompt - - def generate_prompt(self) -> str: - return "".join( - [ - self._generate_groups_prompt(), - self._generate_events_prompt(), - self._generate_properties_prompt(), - ] - ) diff --git a/ee/hogai/trends/__init__.py b/ee/hogai/trends/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ee/hogai/trends/nodes.py b/ee/hogai/trends/nodes.py new file mode 100644 index 0000000000000..4727ff07f4f78 --- /dev/null +++ b/ee/hogai/trends/nodes.py @@ -0,0 +1,381 @@ +import itertools +import json +import xml.etree.ElementTree as ET +from functools import cached_property +from typing import Union, cast + +from langchain.agents.format_scratchpad import format_log_to_str +from langchain.agents.output_parsers import ReActJsonSingleInputOutputParser +from langchain_core.agents import AgentAction, AgentFinish +from langchain_core.exceptions import OutputParserException +from langchain_core.messages import AIMessage as LangchainAssistantMessage +from langchain_core.messages import BaseMessage, merge_message_runs +from langchain_core.messages import HumanMessage as LangchainHumanMessage +from langchain_core.output_parsers import PydanticOutputParser +from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate +from langchain_core.runnables import RunnableConfig, RunnableLambda +from langchain_openai import ChatOpenAI +from pydantic import ValidationError + +from ee.hogai.hardcoded_definitions import hardcoded_prop_defs +from ee.hogai.trends.prompts import ( + react_definitions_prompt, + react_follow_up_prompt, + react_scratchpad_prompt, + react_system_prompt, + react_user_prompt, + trends_group_mapping_prompt, + trends_new_plan_prompt, + trends_plan_prompt, + trends_question_prompt, + trends_system_prompt, +) +from ee.hogai.trends.toolkit import ( + GenerateTrendTool, + TrendsAgentToolkit, + TrendsAgentToolModel, +) +from ee.hogai.trends.utils import GenerateTrendOutputModel +from ee.hogai.utils import ( + AssistantNode, + AssistantNodeName, + AssistantState, + remove_line_breaks, +) +from posthog.hogql_queries.ai.team_taxonomy_query_runner import TeamTaxonomyQueryRunner +from posthog.hogql_queries.query_runner import ExecutionMode +from posthog.models.group_type_mapping import GroupTypeMapping +from posthog.schema import CachedTeamTaxonomyQueryResponse, HumanMessage, TeamTaxonomyQuery, VisualizationMessage + + +class CreateTrendsPlanNode(AssistantNode): + name = AssistantNodeName.CREATE_TRENDS_PLAN + + def run(self, state: AssistantState, config: RunnableConfig): + intermediate_steps = state.get("intermediate_steps") or [] + + prompt = ( + ChatPromptTemplate.from_messages( + [ + ("system", react_system_prompt), + ("user", react_definitions_prompt), + ], + template_format="mustache", + ) + + self._reconstruct_conversation(state) + + ChatPromptTemplate.from_messages( + [ + ("user", react_scratchpad_prompt), + ], + template_format="mustache", + ) + ).partial( + events=self._events_prompt, + groups=self._team_group_types, + ) + + toolkit = TrendsAgentToolkit(self._team) + output_parser = ReActJsonSingleInputOutputParser() + merger = merge_message_runs() + + agent = prompt | merger | self._model | output_parser + + try: + result = cast( + Union[AgentAction, AgentFinish], + agent.invoke( + { + "tools": toolkit.render_text_description(), + "tool_names": ", ".join([t["name"] for t in toolkit.tools]), + "agent_scratchpad": format_log_to_str( + [(action, output) for action, output in intermediate_steps if output is not None] + ), + }, + config, + ), + ) + except OutputParserException as e: + text = str(e) + if e.send_to_llm: + observation = str(e.observation) + text = str(e.llm_output) + else: + observation = "Invalid or incomplete response. You must use the provided tools and output JSON to answer the user's question." + result = AgentAction("handle_incorrect_response", observation, text) + + if isinstance(result, AgentFinish): + # Exceptional case + return { + "plan": result.log, + "intermediate_steps": None, + } + + return { + "intermediate_steps": [*intermediate_steps, (result, None)], + } + + def router(self, state: AssistantState): + if state.get("plan") is not None: + return AssistantNodeName.GENERATE_TRENDS + + if state.get("intermediate_steps", []): + return AssistantNodeName.CREATE_TRENDS_PLAN_TOOLS + + raise ValueError("Invalid state.") + + @property + def _model(self) -> ChatOpenAI: + return ChatOpenAI(model="gpt-4o", temperature=0.7, streaming=True) + + @cached_property + def _events_prompt(self) -> str: + response = TeamTaxonomyQueryRunner(TeamTaxonomyQuery(), self._team).run( + ExecutionMode.RECENT_CACHE_CALCULATE_BLOCKING_IF_STALE + ) + + if not isinstance(response, CachedTeamTaxonomyQueryResponse): + raise ValueError("Failed to generate events prompt.") + + events = [item.event for item in response.results] + + # default for null in the + tags: list[str] = ["all events"] + + for event_name in events: + event_tag = event_name + if event_name in hardcoded_prop_defs["events"]: + data = hardcoded_prop_defs["events"][event_name] + event_tag += f" - {data['label']}. {data['description']}" + if "examples" in data: + event_tag += f" Examples: {data['examples']}." + tags.append(remove_line_breaks(event_tag)) + + root = ET.Element("list of available events for filtering") + root.text = "\n" + "\n".join(tags) + "\n" + return ET.tostring(root, encoding="unicode") + + @cached_property + def _team_group_types(self) -> list[str]: + return list( + GroupTypeMapping.objects.filter(team=self._team) + .order_by("group_type_index") + .values_list("group_type", flat=True) + ) + + def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: + """ + Reconstruct the conversation for the agent. On this step we only care about previously asked questions and generated plans. All other messages are filtered out. + """ + messages = state.get("messages", []) + if len(messages) == 0: + return [] + + conversation = [ + HumanMessagePromptTemplate.from_template(react_user_prompt, template_format="mustache").format( + question=messages[0].content if isinstance(messages[0], HumanMessage) else "" + ) + ] + + for message in messages[1:]: + if isinstance(message, HumanMessage): + conversation.append( + HumanMessagePromptTemplate.from_template( + react_follow_up_prompt, + template_format="mustache", + ).format(feedback=message.content) + ) + elif isinstance(message, VisualizationMessage): + conversation.append(LangchainAssistantMessage(content=message.plan or "")) + + return conversation + + +class CreateTrendsPlanToolsNode(AssistantNode): + name = AssistantNodeName.CREATE_TRENDS_PLAN_TOOLS + + def run(self, state: AssistantState, config: RunnableConfig): + toolkit = TrendsAgentToolkit(self._team) + intermediate_steps = state.get("intermediate_steps") or [] + action, _ = intermediate_steps[-1] + + try: + input = TrendsAgentToolModel.model_validate({"name": action.tool, "arguments": action.tool_input}).root + except ValidationError as e: + feedback = f"Invalid tool call. Pydantic exception: {e.errors(include_url=False)}" + return {"intermediate_steps": [*intermediate_steps, (action, feedback)]} + + # The plan has been found. Move to the generation. + if input.name == "final_answer": + return { + "plan": input.arguments, + "intermediate_steps": None, + } + + output = "" + if input.name == "retrieve_event_properties": + output = toolkit.retrieve_event_properties(input.arguments) + elif input.name == "retrieve_event_property_values": + output = toolkit.retrieve_event_property_values(input.arguments.event_name, input.arguments.property_name) + elif input.name == "retrieve_entity_properties": + output = toolkit.retrieve_entity_properties(input.arguments) + elif input.name == "retrieve_entity_property_values": + output = toolkit.retrieve_entity_property_values(input.arguments.entity, input.arguments.property_name) + else: + output = toolkit.handle_incorrect_response(input.arguments) + + return {"intermediate_steps": [*intermediate_steps[:-1], (action, output)]} + + def router(self, state: AssistantState): + if state.get("plan") is not None: + return AssistantNodeName.GENERATE_TRENDS + return AssistantNodeName.CREATE_TRENDS_PLAN + + +class GenerateTrendsNode(AssistantNode): + name = AssistantNodeName.GENERATE_TRENDS + + def run(self, state: AssistantState, config: RunnableConfig): + generated_plan = state.get("plan", "") + + trends_generation_prompt = ChatPromptTemplate.from_messages( + [ + ("system", trends_system_prompt), + ], + template_format="mustache", + ) + self._reconstruct_conversation(state) + merger = merge_message_runs() + + chain = ( + trends_generation_prompt + | merger + | self._model + # Result from structured output is a parsed dict. Convert to a string since the output parser expects it. + | RunnableLambda(lambda x: json.dumps(x)) + # Validate a string input. + | PydanticOutputParser[GenerateTrendOutputModel](pydantic_object=GenerateTrendOutputModel) + ) + + try: + message: GenerateTrendOutputModel = chain.invoke({}, config) + except OutputParserException: + return { + "messages": [VisualizationMessage(plan=generated_plan, reasoning_steps=["Schema validation failed"])] + } + + return { + "messages": [ + VisualizationMessage( + plan=generated_plan, + reasoning_steps=message.reasoning_steps, + answer=message.answer, + ) + ] + } + + def router(self, state: AssistantState): + if state.get("tool_argument") is not None: + return AssistantNodeName.GENERATE_TRENDS_TOOLS + return AssistantNodeName.END + + @property + def _model(self): + return ChatOpenAI(model="gpt-4o", temperature=0.7, streaming=True).with_structured_output( + GenerateTrendTool().schema, + method="function_calling", + include_raw=False, + ) + + @cached_property + def _group_mapping_prompt(self) -> str: + groups = GroupTypeMapping.objects.filter(team=self._team).order_by("group_type_index") + if not groups: + return "The user has not defined any groups." + + root = ET.Element("list of defined groups") + root.text = ( + "\n" + "\n".join([f'name "{group.group_type}", index {group.group_type_index}' for group in groups]) + "\n" + ) + return ET.tostring(root, encoding="unicode") + + def _reconstruct_conversation(self, state: AssistantState) -> list[BaseMessage]: + """ + Reconstruct the conversation for the generation. Take all previously generated questions, plans, and schemas, and return the history. + """ + messages = state.get("messages", []) + generated_plan = state.get("plan", "") + + if len(messages) == 0: + return [] + + conversation: list[BaseMessage] = [ + HumanMessagePromptTemplate.from_template(trends_group_mapping_prompt, template_format="mustache").format( + group_mapping=self._group_mapping_prompt + ) + ] + + stack: list[LangchainHumanMessage] = [] + human_messages: list[LangchainHumanMessage] = [] + visualization_messages: list[VisualizationMessage] = [] + + for message in messages: + if isinstance(message, HumanMessage): + stack.append(LangchainHumanMessage(content=message.content)) + elif isinstance(message, VisualizationMessage) and message.answer: + if stack: + human_messages += merge_message_runs(stack) + stack = [] + visualization_messages.append(message) + + if stack: + human_messages += merge_message_runs(stack) + + first_ai_message = True + + for human_message, ai_message in itertools.zip_longest(human_messages, visualization_messages): + if ai_message: + conversation.append( + HumanMessagePromptTemplate.from_template( + trends_plan_prompt if first_ai_message else trends_new_plan_prompt, + template_format="mustache", + ).format(plan=ai_message.plan or "") + ) + first_ai_message = False + elif generated_plan: + conversation.append( + HumanMessagePromptTemplate.from_template( + trends_plan_prompt if first_ai_message else trends_new_plan_prompt, + template_format="mustache", + ).format(plan=generated_plan) + ) + + if human_message: + conversation.append( + HumanMessagePromptTemplate.from_template(trends_question_prompt, template_format="mustache").format( + question=human_message.content + ) + ) + + if ai_message: + conversation.append( + LangchainAssistantMessage(content=ai_message.answer.model_dump_json() if ai_message.answer else "") + ) + + return conversation + + @classmethod + def parse_output(cls, output: dict): + try: + return GenerateTrendOutputModel.model_validate(output) + except ValidationError: + return None + + +class GenerateTrendsToolsNode(AssistantNode): + """ + Used for failover from generation errors. + """ + + name = AssistantNodeName.GENERATE_TRENDS_TOOLS + + def run(self, state: AssistantState, config: RunnableConfig): + return state diff --git a/ee/hogai/trends/prompts.py b/ee/hogai/trends/prompts.py new file mode 100644 index 0000000000000..c53ae5d3453a5 --- /dev/null +++ b/ee/hogai/trends/prompts.py @@ -0,0 +1,271 @@ +react_system_prompt = """ +You're a product analyst agent. Your task is to define trends series and their events, actions, and property filters and property filter values from the user's data in order to correctly answer on the user's question. Answer the following question as best you can. + +You have access to the following tools: +{{tools}} + +Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). + +Valid "action" values: {{tool_names}} + +Provide only ONE action per $JSON_BLOB, as shown: + +``` +{ + "action": $TOOL_NAME, + "action_input": $INPUT +} +``` + +Follow this format: + +Question: input question to answer +Thought: consider previous and subsequent steps +Action: +``` +$JSON_BLOB +``` +Observation: action result +... (repeat Thought/Action/Observation N times) +Thought: I know what to respond +Action: +``` +{ + "action": "final_answer", + "action_input": "Final response to human" +} +``` + +Below you will find information on how to correctly discover the taxonomy of the user's data. + +## General Information + +Trends insights enable users to plot data from people, events, and properties however they want. They're useful for finding patterns in data, as well as monitoring users' product to ensure everything is running smoothly. For example, using trends, users can analyze: +- How product's most important metrics change over time. +- Long-term patterns, or cycles in product's usage. +- How a specific change affects usage. +- The usage of different features side-by-side. +- How the properties of events vary using aggregation (sum, average, etc). +- Users can also visualize the same data points in a variety of ways. + +Users can use multiple independent series in a single query to see trends. They can also use a formula to calculate a metric. Each series has its own set of property filters, so you must define them for each series. + +## Events and Actions + +You’ll be given a list of events in addition to the user’s question. Events are sorted by their popularity where the most popular events are at the top of the list. Prioritize popular events. You must always specify events to use. + +## Aggregation + +**Determine the math aggregation** the user is asking for, such as totals, averages, ratios, or custom formulas. If not specified, choose a reasonable default based on the event type (e.g., total count). By default, total count should be used. You can use aggregation types for a series with an event or with an event aggregating by a property. + +Available math aggregations types for the event count are: +- total count +- average +- minimum +- maximum +- median +- 90th percentile +- 95th percentile +- 99th percentile +- unique users +- weekly active users +- daily active users +- first time for a user +{{#groups}} +- unique {{this}} +{{/groups}} + +Available math aggregation types for event's property values are: +- average +- sum +- minimum +- maximum +- median +- 90th percentile +- 95th percentile +- 99th percentile + +Examples of using aggregation types: +- `unique users` to find how many distinct users have logged the event per a day. +- `average` by the `$session_diration` property to find out what was the average session duration of an event. + +## Math Formulas + +If the math aggregation is more complex or not listed above, use custom formulas to perform mathematical operations like calculating percentages or metrics. If you use a formula, you must use the following syntax: `A/B`, where `A` and `B` are the names of the series. You can combine math aggregations and formulas. + +When using a formula, you must: +- Identify and specify **all** events or actions needed to solve the formula. +- Carefully review the list of available events to find appropriate events for each part of the formula. +- Ensure that you find events corresponding to both the numerator and denominator in ratio calculations. + +Examples of using math formulas: +- If you want to calculate the percentage of users who have completed onboarding, you need to find and use events similar to `$identify` and `onboarding complete`, so the formula will be `A / B`, where `A` is `onboarding complete` (unique users) and `B` is `$identify` (unique users). + +## Property Filters + +**Look for property filters** that the user wants to apply. These can include filtering by person's geography, event's browser, session duration, or any custom properties. Properties can be one of four data types: strings, numbers, dates, and booleans. + +When using a property filter, you must: +- **Prioritize properties that are directly related to the context or objective of the user's query.** Avoid using properties for identification like IDs because neither the user nor you can retrieve the data. Instead, prioritize filtering based on general properties like `paidCustomer` or `icp_score`. You don't need to find properties for a time frame. +- **Ensure that you find both the property group and name.** Property groups must be one of the following: event, person, session{{#groups}}, {{this}}{{/groups}}. +- After selecting a property, **validate that the property value accurately reflects the intended criteria**. +- **Find the suitable operator for type** (e.g., `contains`, `is set`). The operators are listed below. +- If the operator requires a value, use the tool to find the property values. Verify that you can answer the question with given property values. If you can't, try to find a different property or event. +- You set logical operators to combine multiple properties of a single series: AND or OR. + +Infer the property groups from the user's request. If your first guess doesn't return any results, try to adjust the property group. You must make sure that the property name matches the lookup value, e.g. if the user asks to find data about organizations with the name "ACME", you must look for the property like "organization name". + +Supported operators for the String type are: +- contains +- doesn't contain +- matches regex +- doesn't match regex +- is set +- is not set + +Supported operators for the Numeric type are: +- equals +- doesn't equal +- contains +- doesn't contain +- matches regex +- doesn't match regex +- is set +- is not set + +Supported operators for the DateTime type are: +- equals +- doesn't equal +- greater than +- less than +- is set +- is not set + +Supported operators for the Boolean type are: +- equals +- doesn't equal +- is set +- is not set + +## Breakdown Series by Properties + +Optionally, you can breakdown all series by multiple properties. Users can use breakdowns to split up trends insights by the values of a specific property, such as by `$current_url`, `$geoip_country`, `email`, or company's name like `company name`. + +When using breakdowns, you must: +- **Identify the property group** and name for each breakdown. +- **Provide the property name** for each breakdown. +- **Validate that the property value accurately reflects the intended criteria**. + +--- + +Begin! Reminder that you must ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB``` then Observation. +""" + +react_definitions_prompt = """ +Here are the event names. +{{events}} +""" + +react_scratchpad_prompt = """ +Thought: {{agent_scratchpad}} +""" + +react_user_prompt = """ +Question: What events, actions, properties and/or property values should I use to answer this question: "{{question}}"? +""" + +react_follow_up_prompt = """ +Improve the previously generated plan based on the feedback: {{feedback}} +""" + +trends_system_prompt = """ +You're a recognized head of product growth with the skills of a top-tier data engineer. Your task is to implement queries of trends insights for customers using a JSON schema. You will be given a plan describing series and breakdowns. Answer the user's questions as best you can. + +Below is the additional context. + +Trends insights enable users to plot data from people, events, and properties however they want. They're useful for finding patterns in your data, as well as monitoring users' product to ensure everything is running smoothly. For example, using trends, users can analyze: +- How product's most important metrics change over time. +- Long-term patterns, or cycles in product's usage. +- How a specific change affects usage. +- The usage of different features side-by-side. +- How the properties of events vary using aggregation (sum, average, etc). +- Users can also visualize the same data points in a variety of ways. + +Follow this instruction to create a query: +* Build series according to the plan. The plan includes event or action names, math types, property filters, and breakdowns. +* Check operators of property filters for individual and all series. Make sure the operators correspond to the user's request. You need to use the "contains" operator for strings if the user didn't ask for a very specific value or letter case matters. +* Determine a visualization type that will answer the user's question in the best way. +* Determine if the user wants to name the series or use the default names. +* Choose the date range and the interval the user wants to analyze. +* Determine if the user wants to compare the results to a previous period or use smoothing. +* Determine if the user wants to filter out internal and test users. If the user didn't specify, filter out internal and test users by default. +* Determine if the user wants to use a sampling factor. +* Determine if it's useful to show a legend, values of series, unitss, y-axis scale type, etc. +* Use your judgment if there are any other parameters that the user might want to adjust that aren't listed here. + +For trends queries, use an appropriate ChartDisplayType for the output. For example: +- if the user wants to see dynamics in time like a line graph, use `ActionsLineGraph`. +- if the user wants to see cumulative dynamics across time, use `ActionsLineGraphCumulative`. +- if the user asks a question where you can answer with a single number, use `BoldNumber`. +- if the user wants a table, use `ActionsTable`. +- if the data is categorical, use `ActionsBar`. +- if the data is easy to understand in a pie chart, use `ActionsPie`. +- if the user has only one series and wants to see data from particular countries, use `WorldMap`. + +The user might want to get insights for groups. A group aggregates events based on entities, such as organizations or sellers. The user might provide a list of group names and their numeric indexes. Instead of a group's name, always use its numeric index. + +You can determine if a feature flag is enabled by checking if it's set to true or 1 in the `$feature/...` property. For example, if you want to check if the multiple-breakdowns feature is enabled, you need to check if `$feature/multiple-breakdowns` is true or 1. + +Learn on these examples: +Q: How many users do I have? +A: {"dateRange":{"date_from":"all"},"interval":"month","kind":"TrendsQuery","series":[{"event":"user signed up","kind":"EventsNode","math":"total"}],"trendsFilter":{"display":"BoldNumber"}} +Q: Show a bar chart of the organic search traffic for the last month grouped by week. +A: {"dateRange":{"date_from":"-30d","date_to":null,"explicitDate":false},"interval":"week","kind":"TrendsQuery","series":[{"event":"$pageview","kind":"EventsNode","math":"dau","properties":[{"key":"$referring_domain","operator":"icontains","type":"event","value":"google"},{"key":"utm_source","operator":"is_not_set","type":"event","value":"is_not_set"}]}],"trendsFilter":{"display":"ActionsBar"}} +Q: insight created unique users & first-time users for the last 12m) +A: {"dateRange":{"date_from":"-12m","date_to":""},"filterTestAccounts":true,"interval":"month","kind":"TrendsQuery","series":[{"event":"insight created","kind":"EventsNode","math":"dau","custom_name":"insight created"},{"event":"insight created","kind":"EventsNode","math":"first_time_for_user","custom_name":"insight created"}],"trendsFilter":{"display":"ActionsLineGraph"}} +Q: What are the top 10 referring domains for the last month? +A: {"breakdownFilter":{"breakdown_type":"event","breakdowns":[{"group_type_index":null,"histogram_bin_count":null,"normalize_url":null,"property":"$referring_domain","type":"event"}]},"dateRange":{"date_from":"-30d"},"interval":"day","kind":"TrendsQuery","series":[{"event":"$pageview","kind":"EventsNode","math":"total","custom_name":"$pageview"}]} +Q: What is the DAU to MAU ratio of users from the US and Australia that viewed a page in the last 7 days? Compare it to the previous period. +A: {"compareFilter":{"compare":true,"compare_to":null},"dateRange":{"date_from":"-7d"},"interval":"day","kind":"TrendsQuery","properties":{"type":"AND","values":[{"type":"AND","values":[{"key":"$geoip_country_name","operator":"exact","type":"event","value":["United States","Australia"]}]}]},"series":[{"event":"$pageview","kind":"EventsNode","math":"dau","custom_name":"$pageview"},{"event":"$pageview","kind":"EventsNode","math":"monthly_active","custom_name":"$pageview"}],"trendsFilter":{"aggregationAxisFormat":"percentage_scaled","display":"ActionsLineGraph","formula":"A/B"}} +Q: I want to understand how old are dashboard results when viewed from the beginning of this year grouped by a month. Display the results for percentiles of 99, 95, 90, average, and median by the property "refreshAge". +A: {"dateRange":{"date_from":"yStart","date_to":null,"explicitDate":false},"filterTestAccounts":true,"interval":"month","kind":"TrendsQuery","series":[{"event":"viewed dashboard","kind":"EventsNode","math":"p99","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"p95","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"p90","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"avg","math_property":"refreshAge","custom_name":"viewed dashboard"},{"event":"viewed dashboard","kind":"EventsNode","math":"median","math_property":"refreshAge","custom_name":"viewed dashboard"}],"trendsFilter":{"aggregationAxisFormat":"duration","display":"ActionsLineGraph"}} +Q: organizations joined in the last 30 days by day from the google search +A: {"dateRange":{"date_from":"-30d"},"filterTestAccounts":false,"interval":"day","kind":"TrendsQuery","properties":{"type":"AND","values":[{"type":"OR","values":[{"key":"$initial_utm_source","operator":"exact","type":"person","value":["google"]}]}]},"series":[{"event":"user signed up","kind":"EventsNode","math":"unique_group","math_group_type_index":0,"name":"user signed up","properties":[{"key":"is_organization_first_user","operator":"exact","type":"person","value":["true"]}]}],"trendsFilter":{"display":"ActionsLineGraph"}} +Q: trends for the last two weeks of the onboarding completed event by unique projects with a session duration more than 5 minutes and the insight analyzed event by unique projects with a breakdown by event's Country Name. exclude the US. +A: {"kind":"TrendsQuery","series":[{"kind":"EventsNode","event":"onboarding completed","name":"onboarding completed","properties":[{"key":"$session_duration","value":300,"operator":"gt","type":"session"}],"math":"unique_group","math_group_type_index":2},{"kind":"EventsNode","event":"insight analyzed","name":"insight analyzed","math":"unique_group","math_group_type_index":2}],"trendsFilter":{"display":"ActionsBar","showValuesOnSeries":true,"showPercentStackView":false,"showLegend":false},"breakdownFilter":{"breakdowns":[{"property":"$geoip_country_name","type":"event"}],"breakdown_limit":5},"properties":{"type":"AND","values":[{"type":"AND","values":[{"key":"$geoip_country_code","value":["US"],"operator":"is_not","type":"event"}]}]},"dateRange":{"date_from":"-14d","date_to":null},"interval":"day"} + +Obey these rules: +- if the date range is not specified, use the best judgment to select a reasonable date range. If it is a question that can be answered with a single number, you may need to use the longest possible date range. +- Filter internal users by default if the user doesn't specify. +- Only use events and properties defined by the user. You can't create new events or property definitions. + +For your reference, there is a description of the data model. + +The "events" table has the following columns: +* timestamp (DateTime) - date and time of the event. Events are sorted by timestamp in ascending order. +* uuid (UUID) - unique identifier of the event. +* person_id (UUID) - unique identifier of the person who performed the event. +* event (String) - the name of the event. +* properties (Map) - additional properties of the event. Properties can be of multiple types: String, Int, Decimal, Float, and Bool. A property can be an array of those types. A property always has only ONE type. If the property starts with a $, it is a system-defined property. If the property doesn't start with a $, it is a user-defined property. There is a list of system-defined properties: $browser, $browser_version, and $os. User-defined properties can have any name. + +Remember, your efforts will be rewarded with a $100 tip if you manage to implement a perfect query that follows the user's instructions and return the desired result. Do not hallucinate. +""" + +trends_group_mapping_prompt = """ +Here is the group mapping: +{{group_mapping}} +""" + +trends_plan_prompt = """ +Here is the plan: +{{plan}} +""" + +trends_new_plan_prompt = """ +Here is the new plan: +{{plan}} +""" + +trends_question_prompt = """ +Answer to this question: {{question}} +""" diff --git a/ee/hogai/trends/test/__init__.py b/ee/hogai/trends/test/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ee/hogai/trends/test/test_nodes.py b/ee/hogai/trends/test/test_nodes.py new file mode 100644 index 0000000000000..6e878e80ffbc7 --- /dev/null +++ b/ee/hogai/trends/test/test_nodes.py @@ -0,0 +1,189 @@ +from django.test import override_settings + +from ee.hogai.trends.nodes import CreateTrendsPlanNode, GenerateTrendsNode +from posthog.schema import AssistantMessage, ExperimentalAITrendsQuery, HumanMessage, VisualizationMessage +from posthog.test.base import ( + APIBaseTest, + ClickhouseTestMixin, +) + + +@override_settings(IN_UNIT_TESTING=True) +class TestPlanAgentNode(ClickhouseTestMixin, APIBaseTest): + def setUp(self): + self.schema = ExperimentalAITrendsQuery(series=[]) + + def test_agent_reconstructs_conversation(self): + node = CreateTrendsPlanNode(self.team) + history = node._reconstruct_conversation({"messages": [HumanMessage(content="Text")]}) + self.assertEqual(len(history), 1) + self.assertEqual(history[0].type, "human") + self.assertIn("Text", history[0].content) + self.assertNotIn(f"{{question}}", history[0].content) + + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + VisualizationMessage(answer=self.schema, plan="randomplan"), + ] + } + ) + self.assertEqual(len(history), 2) + self.assertEqual(history[0].type, "human") + self.assertIn("Text", history[0].content) + self.assertNotIn("{{question}}", history[0].content) + self.assertEqual(history[1].type, "ai") + self.assertEqual(history[1].content, "randomplan") + + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + VisualizationMessage(answer=self.schema, plan="randomplan"), + HumanMessage(content="Text"), + ] + } + ) + self.assertEqual(len(history), 3) + self.assertEqual(history[0].type, "human") + self.assertIn("Text", history[0].content) + self.assertNotIn("{{question}}", history[0].content) + self.assertEqual(history[1].type, "ai") + self.assertEqual(history[1].content, "randomplan") + self.assertEqual(history[2].type, "human") + self.assertIn("Text", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + + def test_agent_reconstructs_conversation_and_omits_unknown_messages(self): + node = CreateTrendsPlanNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + AssistantMessage(content="test"), + ] + } + ) + self.assertEqual(len(history), 1) + self.assertEqual(history[0].type, "human") + self.assertIn("Text", history[0].content) + self.assertNotIn("{{question}}", history[0].content) + + +@override_settings(IN_UNIT_TESTING=True) +class TestGenerateTrendsNode(ClickhouseTestMixin, APIBaseTest): + def setUp(self): + self.schema = ExperimentalAITrendsQuery(series=[]) + + def test_agent_reconstructs_conversation(self): + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation({"messages": [HumanMessage(content="Text")]}) + self.assertEqual(len(history), 2) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("Answer to this question:", history[1].content) + self.assertNotIn("{{question}}", history[1].content) + + history = node._reconstruct_conversation({"messages": [HumanMessage(content="Text")], "plan": "randomplan"}) + self.assertEqual(len(history), 3) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Text", history[2].content) + + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + VisualizationMessage(answer=self.schema, plan="randomplan"), + HumanMessage(content="Follow Up"), + ], + "plan": "newrandomplan", + } + ) + + self.assertEqual(len(history), 6) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Text", history[2].content) + self.assertEqual(history[3].type, "ai") + self.assertEqual(history[3].content, self.schema.model_dump_json()) + self.assertEqual(history[4].type, "human") + self.assertIn("the new plan", history[4].content) + self.assertNotIn("{{plan}}", history[4].content) + self.assertIn("newrandomplan", history[4].content) + self.assertEqual(history[5].type, "human") + self.assertIn("Answer to this question:", history[5].content) + self.assertNotIn("{{question}}", history[5].content) + self.assertIn("Follow Up", history[5].content) + + def test_agent_reconstructs_conversation_and_merges_messages(self): + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [HumanMessage(content="Te"), HumanMessage(content="xt")], + "plan": "randomplan", + } + ) + self.assertEqual(len(history), 3) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Te\nxt", history[2].content) + + node = GenerateTrendsNode(self.team) + history = node._reconstruct_conversation( + { + "messages": [ + HumanMessage(content="Text"), + VisualizationMessage(answer=self.schema, plan="randomplan"), + HumanMessage(content="Follow"), + HumanMessage(content="Up"), + ], + "plan": "newrandomplan", + } + ) + + self.assertEqual(len(history), 6) + self.assertEqual(history[0].type, "human") + self.assertIn("mapping", history[0].content) + self.assertEqual(history[1].type, "human") + self.assertIn("the plan", history[1].content) + self.assertNotIn("{{plan}}", history[1].content) + self.assertIn("randomplan", history[1].content) + self.assertEqual(history[2].type, "human") + self.assertIn("Answer to this question:", history[2].content) + self.assertNotIn("{{question}}", history[2].content) + self.assertIn("Text", history[2].content) + self.assertEqual(history[3].type, "ai") + self.assertEqual(history[3].content, self.schema.model_dump_json()) + self.assertEqual(history[4].type, "human") + self.assertIn("the new plan", history[4].content) + self.assertNotIn("{{plan}}", history[4].content) + self.assertIn("newrandomplan", history[4].content) + self.assertEqual(history[5].type, "human") + self.assertIn("Answer to this question:", history[5].content) + self.assertNotIn("{{question}}", history[5].content) + self.assertIn("Follow\nUp", history[5].content) diff --git a/ee/hogai/trends/test/test_toolkit.py b/ee/hogai/trends/test/test_toolkit.py new file mode 100644 index 0000000000000..12cd086b033c5 --- /dev/null +++ b/ee/hogai/trends/test/test_toolkit.py @@ -0,0 +1,235 @@ +from datetime import datetime + +from django.test import override_settings +from freezegun import freeze_time + +from ee.hogai.trends.toolkit import TrendsAgentToolkit +from posthog.models.group.util import create_group +from posthog.models.group_type_mapping import GroupTypeMapping +from posthog.models.property_definition import PropertyDefinition, PropertyType +from posthog.test.base import APIBaseTest, ClickhouseTestMixin, _create_event, _create_person + + +@override_settings(IN_UNIT_TESTING=True) +class TestToolkit(ClickhouseTestMixin, APIBaseTest): + def _create_taxonomy(self): + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.EVENT, name="$browser", property_type=PropertyType.String + ) + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.EVENT, name="id", property_type=PropertyType.Numeric + ) + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.EVENT, name="bool", property_type=PropertyType.Boolean + ) + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.EVENT, name="date", property_type=PropertyType.Datetime + ) + + _create_person( + distinct_ids=["person1"], + team=self.team, + properties={"email": "person1@example.com"}, + ) + _create_event( + event="event1", + distinct_id="person1", + properties={ + "$browser": "Chrome", + "date": datetime(2024, 1, 1).isoformat(), + }, + team=self.team, + ) + _create_event( + event="event1", + distinct_id="person1", + properties={ + "$browser": "Firefox", + "bool": True, + }, + team=self.team, + ) + + _create_person( + distinct_ids=["person2"], + properties={"email": "person2@example.com"}, + team=self.team, + ) + for i in range(10): + _create_event( + event="event1", + distinct_id=f"person2", + properties={"id": i}, + team=self.team, + ) + + def test_retrieve_entity_properties(self): + toolkit = TrendsAgentToolkit(self.team) + + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.PERSON, name="test", property_type="String" + ) + self.assertEqual( + toolkit.retrieve_entity_properties("person"), + "test
", + ) + + GroupTypeMapping.objects.create(team=self.team, group_type_index=0, group_type="group") + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.GROUP, group_type_index=0, name="test", property_type="Numeric" + ) + self.assertEqual( + toolkit.retrieve_entity_properties("group"), + "test
", + ) + + self.assertNotEqual( + toolkit.retrieve_entity_properties("session"), + "", + ) + self.assertIn( + "$session_duration", + toolkit.retrieve_entity_properties("session"), + ) + + def test_retrieve_entity_property_values(self): + toolkit = TrendsAgentToolkit(self.team) + self.assertEqual( + toolkit.retrieve_entity_property_values("session", "$session_duration"), + "30, 146, 2 and many more distinct values.", + ) + self.assertEqual( + toolkit.retrieve_entity_property_values("session", "nonsense"), + "The property nonsense does not exist in the taxonomy.", + ) + + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.PERSON, name="email", property_type=PropertyType.String + ) + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.PERSON, name="id", property_type=PropertyType.Numeric + ) + + for i in range(5): + id = f"person{i}" + with freeze_time(f"2024-01-01T{i}:00:00Z"): + _create_person( + distinct_ids=[id], + properties={"email": f"{id}@example.com", "id": i}, + team=self.team, + ) + with freeze_time(f"2024-01-02T00:00:00Z"): + _create_person( + distinct_ids=["person5"], + properties={"email": "person5@example.com", "id": 5}, + team=self.team, + ) + + self.assertEqual( + toolkit.retrieve_entity_property_values("person", "email"), + '"person5@example.com", "person4@example.com", "person3@example.com", "person2@example.com", "person1@example.com" and 1 more distinct value.', + ) + self.assertEqual( + toolkit.retrieve_entity_property_values("person", "id"), + "5, 4, 3, 2, 1 and 1 more distinct value.", + ) + + toolkit = TrendsAgentToolkit(self.team) + GroupTypeMapping.objects.create(team=self.team, group_type_index=0, group_type="proj") + GroupTypeMapping.objects.create(team=self.team, group_type_index=1, group_type="org") + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.GROUP, group_type_index=0, name="test", property_type="Numeric" + ) + PropertyDefinition.objects.create( + team=self.team, type=PropertyDefinition.Type.GROUP, group_type_index=1, name="test", property_type="String" + ) + + for i in range(7): + id = f"group{i}" + with freeze_time(f"2024-01-01T{i}:00:00Z"): + create_group( + group_type_index=0, + group_key=id, + properties={"test": i}, + team_id=self.team.pk, + ) + with freeze_time(f"2024-01-02T00:00:00Z"): + create_group( + group_type_index=1, + group_key="org", + properties={"test": "7"}, + team_id=self.team.pk, + ) + + self.assertEqual( + toolkit.retrieve_entity_property_values("proj", "test"), + "6, 5, 4, 3, 2 and 2 more distinct values.", + ) + self.assertEqual(toolkit.retrieve_entity_property_values("org", "test"), '"7"') + + def test_group_names(self): + GroupTypeMapping.objects.create(team=self.team, group_type_index=0, group_type="proj") + GroupTypeMapping.objects.create(team=self.team, group_type_index=1, group_type="org") + toolkit = TrendsAgentToolkit(self.team) + self.assertEqual(toolkit._entity_names, ["person", "session", "proj", "org"]) + + def test_empty_events(self): + toolkit = TrendsAgentToolkit(self.team) + self.assertEqual( + toolkit.retrieve_event_properties("test"), "Properties do not exist in the taxonomy for the event test." + ) + + _create_person( + distinct_ids=["person1"], + team=self.team, + properties={}, + ) + _create_event( + event="event1", + distinct_id="person1", + properties={}, + team=self.team, + ) + + toolkit = TrendsAgentToolkit(self.team) + self.assertEqual( + toolkit.retrieve_event_properties("event1"), + "Properties do not exist in the taxonomy for the event event1.", + ) + + def test_retrieve_event_properties(self): + self._create_taxonomy() + toolkit = TrendsAgentToolkit(self.team) + prompt = toolkit.retrieve_event_properties("event1") + + self.assertIn( + "id
", + prompt, + ) + self.assertIn( + "$browser
", + prompt, + ) + self.assertIn( + "date
", + prompt, + ) + self.assertIn( + "bool
", + prompt, + ) + + def test_retrieve_event_property_values(self): + self._create_taxonomy() + toolkit = TrendsAgentToolkit(self.team) + + self.assertIn('"Chrome"', toolkit.retrieve_event_property_values("event1", "$browser")) + self.assertIn('"Firefox"', toolkit.retrieve_event_property_values("event1", "$browser")) + self.assertEqual(toolkit.retrieve_event_property_values("event1", "bool"), "true") + self.assertEqual( + toolkit.retrieve_event_property_values("event1", "id"), + "9, 8, 7, 6, 5 and 5 more distinct values.", + ) + self.assertEqual( + toolkit.retrieve_event_property_values("event1", "date"), f'"{datetime(2024, 1, 1).isoformat()}"' + ) diff --git a/ee/hogai/trends/toolkit.py b/ee/hogai/trends/toolkit.py new file mode 100644 index 0000000000000..23421847e1085 --- /dev/null +++ b/ee/hogai/trends/toolkit.py @@ -0,0 +1,512 @@ +import json +import xml.etree.ElementTree as ET +from functools import cached_property +from textwrap import dedent +from typing import Any, Literal, Optional, TypedDict, Union + +from pydantic import BaseModel, Field, RootModel + +from ee.hogai.hardcoded_definitions import hardcoded_prop_defs +from posthog.hogql.database.schema.channel_type import POSSIBLE_CHANNEL_TYPES +from posthog.hogql_queries.ai.actors_property_taxonomy_query_runner import ActorsPropertyTaxonomyQueryRunner +from posthog.hogql_queries.ai.event_taxonomy_query_runner import EventTaxonomyQueryRunner +from posthog.hogql_queries.query_runner import ExecutionMode +from posthog.models.group_type_mapping import GroupTypeMapping +from posthog.models.property_definition import PropertyDefinition, PropertyType +from posthog.models.team.team import Team +from posthog.schema import ( + ActorsPropertyTaxonomyQuery, + CachedActorsPropertyTaxonomyQueryResponse, + CachedEventTaxonomyQueryResponse, + EventTaxonomyQuery, + ExperimentalAITrendsQuery, +) + + +class ToolkitTool(TypedDict): + name: str + signature: str + description: str + + +class RetrieveEntityPropertiesValuesArgsModel(BaseModel): + entity: str + property_name: str + + +class RetrieveEntityPropertiesValuesModel(BaseModel): + name: Literal["retrieve_entity_property_values"] + arguments: RetrieveEntityPropertiesValuesArgsModel + + +class RetrieveEventPropertiesValuesArgsModel(BaseModel): + event_name: str + property_name: str + + +class RetrieveEventPropertiesValuesModel(BaseModel): + name: Literal["retrieve_event_property_values"] + arguments: RetrieveEventPropertiesValuesArgsModel + + +class SingleArgumentTrendsAgentToolModel(BaseModel): + name: Literal[ + "retrieve_entity_properties", + "retrieve_event_properties", + "final_answer", + "handle_incorrect_response", + ] + arguments: str + + +class TrendsAgentToolModel( + RootModel[ + Union[ + SingleArgumentTrendsAgentToolModel, RetrieveEntityPropertiesValuesModel, RetrieveEventPropertiesValuesModel + ] + ] +): + root: Union[ + SingleArgumentTrendsAgentToolModel, RetrieveEntityPropertiesValuesModel, RetrieveEventPropertiesValuesModel + ] = Field(..., discriminator="name") + + +class TrendsAgentToolkit: + _team: Team + + def __init__(self, team: Team): + self._team = team + + @property + def groups(self): + return GroupTypeMapping.objects.filter(team=self._team).order_by("group_type_index") + + @cached_property + def _entity_names(self) -> list[str]: + """ + The schemas use `group_type_index` for groups complicating things for the agent. Instead, we use groups' names, + so the generation step will handle their indexes. Tools would need to support multiple arguments, or we would need + to create various tools for different group types. Since we don't use function calling here, we want to limit the + number of tools because non-function calling models can't handle many tools. + """ + entities = [ + "person", + "session", + *[group.group_type for group in self.groups], + ] + return entities + + @cached_property + def tools(self) -> list[ToolkitTool]: + """ + Our ReAct agent doesn't use function calling. Instead, it uses tools in natural language to decide next steps. The agent expects the following format: + + ``` + retrieve_entity_properties_tool(entity: "Literal['person', 'session', 'organization', 'instance', 'project']") - description. + ``` + + Events and other entities are intentionally separated for properties retrieval. Potentially, there can be different functions for each entity type. + """ + + stringified_entities = ", ".join([f"'{entity}'" for entity in self._entity_names]) + + tools: list[ToolkitTool] = [ + { + "name": tool["name"], + "signature": tool["signature"], + "description": dedent(tool["description"]), + } + for tool in [ + { + "name": "retrieve_event_properties", + "signature": "(event_name: str)", + "description": """ + Use this tool to retrieve property names of an event that the user has in their taxonomy. You will receive a list of properties, their value types and example values or a message that properties have not been found. + + - **Try other events** if the tool doesn't return any properties. + - **Prioritize properties that are directly related to the context or objective of the user's query.** + - **Avoid using ambiguous properties** unless their relevance is explicitly confirmed. + + Args: + event_name: The name of the event that you want to retrieve properties for. + """, + }, + { + "name": "retrieve_event_property_values", + "signature": "(event_name: str, property_name: str)", + "description": """ + Use this tool to retrieve property values for an event that the user has in their taxonomy. Adjust filters to these values. You will receive a list of property values or a message that property values have not been found. Some properties can have many values, so the output will be truncated. Use your judgement to find a proper value. + + Args: + event_name: The name of the event that you want to retrieve values for. + property_name: The name of the property that you want to retrieve values for. + """, + }, + { + "name": f"retrieve_entity_properties", + "signature": f"(entity: Literal[{stringified_entities}])", + "description": """ + Use this tool to retrieve property names for a property group (entity) that the user has in their taxonomy. You will receive a list of properties and their value types or a message that properties have not been found. + + - **Infer the property groups from the user's request.** + - **Try other entities** if the tool doesn't return any properties. + - **Prioritize properties that are directly related to the context or objective of the user's query.** + - **Avoid using ambiguous properties** unless their relevance is explicitly confirmed. + + Args: + entity: The type of the entity that you want to retrieve properties for. + """, + }, + { + "name": "retrieve_entity_property_values", + "signature": f"(entity: Literal[{stringified_entities}], property_name: str)", + "description": """ + Use this tool to retrieve property values for a property name that the user has in their taxonomy. Adjust filters to these values. You will receive a list of property values or a message that property values have not been found. Some properties can have many values, so the output will be truncated. Use your judgement to find a proper value. + + Args: + entity: The type of the entity that you want to retrieve properties for. + property_name: The name of the property that you want to retrieve values for. + """, + }, + { + "name": "final_answer", + "signature": "(final_response: str)", + "description": """ + Use this tool to provide the final answer to the user's question. + + Answer in the following format: + ``` + Events: + - event 1 + - math operation: total + - property filter 1: + - entity + - property name + - property type + - operator + - property value + - property filter 2... Repeat for each property filter. + - event 2 + - math operation: average by `property name`. + - property filter 1: + - entity + - property name + - property type + - operator + - property value + - property filter 2... Repeat for each property filter. + - Repeat for each event. + + (if a formula is used) + Formula: + `A/B`, where `A` is the first event and `B` is the second event. + + (if a breakdown is used) + Breakdown by: + - breakdown 1: + - entity + - property name + - Repeat for each breakdown. + ``` + + Args: + final_response: List all events, actions, and properties that you want to use to answer the question. + """, + }, + ] + ] + + return tools + + def render_text_description(self) -> str: + """ + Render the tool name and description in plain text. + + Returns: + The rendered text. + + Output will be in the format of: + + .. code-block:: markdown + + search: This tool is used for search + calculator: This tool is used for math + """ + descriptions = [] + for tool in self.tools: + description = f"{tool['name']}{tool['signature']} - {tool['description']}" + descriptions.append(description) + return "\n".join(descriptions) + + def _generate_properties_xml(self, children: list[tuple[str, str | None]]): + root = ET.Element("properties") + property_types = {property_type for _, property_type in children if property_type is not None} + property_type_to_tag = {property_type: ET.SubElement(root, property_type) for property_type in property_types} + + for name, property_type in children: + # Do not include properties that are ambiguous. + if property_type is None: + continue + + type_tag = property_type_to_tag[property_type] + ET.SubElement(type_tag, "name").text = name + # Add a line break between names. Doubtful that it does anything. + ET.SubElement(type_tag, "br") + + return ET.tostring(root, encoding="unicode") + + def retrieve_entity_properties(self, entity: str) -> str: + """ + Retrieve properties for an entitiy like person, session, or one of the groups. + """ + if entity not in ("person", "session", *[group.group_type for group in self.groups]): + return f"Entity {entity} does not exist in the taxonomy." + + if entity == "person": + qs = PropertyDefinition.objects.filter(team=self._team, type=PropertyDefinition.Type.PERSON).values_list( + "name", "property_type" + ) + props = list(qs) + elif entity == "session": + # Session properties are not in the DB. + props = [ + (prop_name, prop["type"]) + for prop_name, prop in hardcoded_prop_defs["session_properties"].items() + if prop.get("type") is not None + ] + else: + group_type_index = next( + (group.group_type_index for group in self.groups if group.group_type == entity), None + ) + if group_type_index is None: + return f"Group {entity} does not exist in the taxonomy." + qs = PropertyDefinition.objects.filter( + team=self._team, type=PropertyDefinition.Type.GROUP, group_type_index=group_type_index + ).values_list("name", "property_type") + props = list(qs) + + return self._generate_properties_xml(props) + + def retrieve_event_properties(self, event_name: str) -> str: + """ + Retrieve properties for an event. + """ + runner = EventTaxonomyQueryRunner(EventTaxonomyQuery(event=event_name), self._team) + response = runner.run(ExecutionMode.RECENT_CACHE_CALCULATE_BLOCKING_IF_STALE) + + if not isinstance(response, CachedEventTaxonomyQueryResponse): + return "Properties have not been found." + + if not response.results: + return f"Properties do not exist in the taxonomy for the event {event_name}." + + # Intersect properties with their types. + qs = PropertyDefinition.objects.filter( + team=self._team, type=PropertyDefinition.Type.EVENT, name__in=[item.property for item in response.results] + ) + property_to_type = {property_definition.name: property_definition.property_type for property_definition in qs} + + return self._generate_properties_xml( + [ + (item.property, property_to_type.get(item.property)) + for item in response.results + # Exclude properties that exist in the taxonomy, but don't have a type. + if item.property in property_to_type + ] + ) + + def _format_property_values( + self, sample_values: list, sample_count: Optional[int] = 0, format_as_string: bool = False + ) -> str: + if len(sample_values) == 0 or sample_count == 0: + return f"The property does not have any values in the taxonomy." + + # Add quotes to the String type, so the LLM can easily infer a type. + # Strings like "true" or "10" are interpreted as booleans or numbers without quotes, so the schema generation fails. + # Remove the floating point the value is an integer. + formatted_sample_values: list[str] = [] + for value in sample_values: + if format_as_string: + formatted_sample_values.append(f'"{value}"') + elif isinstance(value, float) and value.is_integer(): + formatted_sample_values.append(str(int(value))) + else: + formatted_sample_values.append(str(value)) + prop_values = ", ".join(formatted_sample_values) + + # If there wasn't an exact match with the user's search, we provide a hint that LLM can use an arbitrary value. + if sample_count is None: + return f"{prop_values} and many more distinct values." + elif sample_count > len(sample_values): + diff = sample_count - len(sample_values) + return f"{prop_values} and {diff} more distinct value{'' if diff == 1 else 's'}." + + return prop_values + + def retrieve_event_property_values(self, event_name: str, property_name: str) -> str: + try: + property_definition = PropertyDefinition.objects.get( + team=self._team, name=property_name, type=PropertyDefinition.Type.EVENT + ) + except PropertyDefinition.DoesNotExist: + return f"The property {property_name} does not exist in the taxonomy." + + runner = EventTaxonomyQueryRunner(EventTaxonomyQuery(event=event_name), self._team) + response = runner.run(ExecutionMode.RECENT_CACHE_CALCULATE_BLOCKING_IF_STALE) + + if not isinstance(response, CachedEventTaxonomyQueryResponse): + return f"The event {event_name} does not exist in the taxonomy." + + if not response.results: + return f"Property values for {property_name} do not exist in the taxonomy for the event {event_name}." + + prop = next((item for item in response.results if item.property == property_name), None) + if not prop: + return f"The property {property_name} does not exist in the taxonomy for the event {event_name}." + + return self._format_property_values( + prop.sample_values, + prop.sample_count, + format_as_string=property_definition.property_type in (PropertyType.String, PropertyType.Datetime), + ) + + def _retrieve_session_properties(self, property_name: str) -> str: + """ + Sessions properties example property values are hardcoded. + """ + if property_name not in hardcoded_prop_defs["session_properties"]: + return f"The property {property_name} does not exist in the taxonomy." + + if property_name == "$channel_type": + sample_values = POSSIBLE_CHANNEL_TYPES.copy() + sample_count = len(sample_values) + is_str = True + elif ( + property_name in hardcoded_prop_defs["session_properties"] + and "examples" in hardcoded_prop_defs["session_properties"][property_name] + ): + sample_values = hardcoded_prop_defs["session_properties"][property_name]["examples"] + sample_count = None + is_str = hardcoded_prop_defs["session_properties"][property_name]["type"] == PropertyType.String + else: + return f"Property values for {property_name} do not exist in the taxonomy for the session entity." + + return self._format_property_values(sample_values, sample_count, format_as_string=is_str) + + def retrieve_entity_property_values(self, entity: str, property_name: str) -> str: + if entity not in self._entity_names: + return f"The entity {entity} does not exist in the taxonomy. You must use one of the following: {', '.join(self._entity_names)}." + + if entity == "session": + return self._retrieve_session_properties(property_name) + + if entity == "person": + query = ActorsPropertyTaxonomyQuery(property=property_name) + else: + group_index = next((group.group_type_index for group in self.groups if group.group_type == entity), None) + if group_index is None: + return f"The entity {entity} does not exist in the taxonomy." + query = ActorsPropertyTaxonomyQuery(group_type_index=group_index, property=property_name) + + try: + if query.group_type_index is not None: + prop_type = PropertyDefinition.Type.GROUP + group_type_index = query.group_type_index + else: + prop_type = PropertyDefinition.Type.PERSON + group_type_index = None + + property_definition = PropertyDefinition.objects.get( + team=self._team, + name=property_name, + type=prop_type, + group_type_index=group_type_index, + ) + except PropertyDefinition.DoesNotExist: + return f"The property {property_name} does not exist in the taxonomy for the entity {entity}." + + response = ActorsPropertyTaxonomyQueryRunner(query, self._team).run( + ExecutionMode.RECENT_CACHE_CALCULATE_BLOCKING_IF_STALE + ) + + if not isinstance(response, CachedActorsPropertyTaxonomyQueryResponse): + return f"The entity {entity} does not exist in the taxonomy." + + if not response.results: + return f"Property values for {property_name} do not exist in the taxonomy for the entity {entity}." + + return self._format_property_values( + response.results.sample_values, + response.results.sample_count, + format_as_string=property_definition.property_type in (PropertyType.String, PropertyType.Datetime), + ) + + def handle_incorrect_response(self, response: str) -> str: + """ + No-op tool. Take a parsing error and return a response that the LLM can use to correct itself. + Used to control a number of retries. + """ + return response + + +class GenerateTrendTool: + def _replace_value_in_dict(self, item: Any, original_schema: Any): + if isinstance(item, list): + return [self._replace_value_in_dict(i, original_schema) for i in item] + elif isinstance(item, dict): + if list(item.keys()) == ["$ref"]: + definitions = item["$ref"][2:].split("/") + res = original_schema.copy() + for definition in definitions: + res = res[definition] + return res + else: + return {key: self._replace_value_in_dict(i, original_schema) for key, i in item.items()} + else: + return item + + def _flatten_schema(self): + schema = ExperimentalAITrendsQuery.model_json_schema() + + # Patch `numeric` types + schema["$defs"]["MathGroupTypeIndex"]["type"] = "number" + property_filters = ( + "EventPropertyFilter", + "PersonPropertyFilter", + "SessionPropertyFilter", + "FeaturePropertyFilter", + ) + + # Clean up the property filters + for key in property_filters: + property_schema = schema["$defs"][key] + property_schema["properties"]["key"]["description"] = ( + f"Use one of the properties the user has provided in the plan." + ) + + for _ in range(100): + if "$ref" not in json.dumps(schema): + break + schema = self._replace_value_in_dict(schema.copy(), schema.copy()) + del schema["$defs"] + return schema + + @cached_property + def schema(self): + return { + "name": "output_insight_schema", + "description": "Outputs the JSON schema of a product analytics insight", + "parameters": { + "type": "object", + "properties": { + "reasoning_steps": { + "type": "array", + "items": {"type": "string"}, + "description": "The reasoning steps leading to the final conclusion that will be shown to the user. Use 'you' if you want to refer to the user.", + }, + "answer": self._flatten_schema(), + }, + "additionalProperties": False, + "required": ["reasoning_steps", "answer"], + }, + } diff --git a/ee/hogai/trends/utils.py b/ee/hogai/trends/utils.py new file mode 100644 index 0000000000000..080f85f0256d0 --- /dev/null +++ b/ee/hogai/trends/utils.py @@ -0,0 +1,10 @@ +from typing import Optional + +from pydantic import BaseModel + +from posthog.schema import ExperimentalAITrendsQuery + + +class GenerateTrendOutputModel(BaseModel): + reasoning_steps: Optional[list[str]] = None + answer: Optional[ExperimentalAITrendsQuery] = None diff --git a/ee/hogai/trends_function.py b/ee/hogai/trends_function.py deleted file mode 100644 index 6f57b47506578..0000000000000 --- a/ee/hogai/trends_function.py +++ /dev/null @@ -1,71 +0,0 @@ -import json -from functools import cached_property -from typing import Any - -from ee.hogai.team_prompt import TeamPrompt -from posthog.models.property_definition import PropertyDefinition -from posthog.schema import ExperimentalAITrendsQuery - - -class TrendsFunction: - def _replace_value_in_dict(self, item: Any, original_schema: Any): - if isinstance(item, list): - return [self._replace_value_in_dict(i, original_schema) for i in item] - elif isinstance(item, dict): - if list(item.keys()) == ["$ref"]: - definitions = item["$ref"][2:].split("/") - res = original_schema.copy() - for definition in definitions: - res = res[definition] - return res - else: - return {key: self._replace_value_in_dict(i, original_schema) for key, i in item.items()} - else: - return item - - @cached_property - def _flat_schema(self): - schema = ExperimentalAITrendsQuery.model_json_schema() - - # Patch `numeric` types - schema["$defs"]["MathGroupTypeIndex"]["type"] = "number" - - # Clean up the property filters - for key, title in ( - ("EventPropertyFilter", PropertyDefinition.Type.EVENT.label), - ("PersonPropertyFilter", PropertyDefinition.Type.PERSON.label), - ("SessionPropertyFilter", PropertyDefinition.Type.SESSION.label), - ("FeaturePropertyFilter", "feature"), - ("CohortPropertyFilter", "cohort"), - ): - property_schema = schema["$defs"][key] - property_schema["properties"]["key"]["description"] = ( - f"Use one of the properties the user has provided in the <{TeamPrompt.get_properties_tag_name(title)}> tag." - ) - - for _ in range(100): - if "$ref" not in json.dumps(schema): - break - schema = self._replace_value_in_dict(schema.copy(), schema.copy()) - del schema["$defs"] - return schema - - def generate_function(self): - return { - "type": "function", - "function": { - "name": "output_insight_schema", - "description": "Outputs the JSON schema of a product analytics insight", - "parameters": { - "type": "object", - "properties": { - "reasoning_steps": { - "type": "array", - "items": {"type": "string"}, - "description": "The reasoning steps leading to the final conclusion that will be shown to the user. Use 'you' if you want to refer to the user.", - }, - "answer": self._flat_schema, - }, - }, - }, - } diff --git a/ee/hogai/utils.py b/ee/hogai/utils.py new file mode 100644 index 0000000000000..65de9303b3ffc --- /dev/null +++ b/ee/hogai/utils.py @@ -0,0 +1,52 @@ +import operator +from abc import ABC, abstractmethod +from collections.abc import Sequence +from enum import StrEnum +from typing import Annotated, Optional, TypedDict, Union + +from langchain_core.agents import AgentAction +from langchain_core.runnables import RunnableConfig +from langgraph.graph import END, START +from pydantic import BaseModel, Field + +from posthog.models.team.team import Team +from posthog.schema import AssistantMessage, HumanMessage, RootAssistantMessage, VisualizationMessage + +AssistantMessageUnion = Union[AssistantMessage, HumanMessage, VisualizationMessage] + + +class Conversation(BaseModel): + messages: list[RootAssistantMessage] = Field(..., min_length=1, max_length=20) + session_id: str + + +class AssistantState(TypedDict): + messages: Annotated[Sequence[AssistantMessageUnion], operator.add] + intermediate_steps: Optional[list[tuple[AgentAction, Optional[str]]]] + plan: Optional[str] + tool_argument: Optional[str] + + +class AssistantNodeName(StrEnum): + START = START + END = END + CREATE_TRENDS_PLAN = "create_trends_plan" + CREATE_TRENDS_PLAN_TOOLS = "create_trends_plan_tools" + GENERATE_TRENDS = "generate_trends_schema" + GENERATE_TRENDS_TOOLS = "generate_trends_tools" + + +class AssistantNode(ABC): + name: AssistantNodeName + _team: Team + + def __init__(self, team: Team): + self._team = team + + @abstractmethod + def run(cls, state: AssistantState, config: RunnableConfig): + raise NotImplementedError + + +def remove_line_breaks(line: str) -> str: + return line.replace("\n", " ") diff --git a/ee/settings.py b/ee/settings.py index 9844074a95631..64e3bfc5b8b3c 100644 --- a/ee/settings.py +++ b/ee/settings.py @@ -4,11 +4,10 @@ import os -from posthog.settings import AUTHENTICATION_BACKENDS, DEMO, SITE_URL, DEBUG +from posthog.settings import AUTHENTICATION_BACKENDS, DEBUG, DEMO, SITE_URL from posthog.settings.utils import get_from_env from posthog.utils import str_to_bool - # SSO AUTHENTICATION_BACKENDS = [ *AUTHENTICATION_BACKENDS, @@ -69,3 +68,8 @@ ) HOOK_HOG_FUNCTION_TEAMS = get_from_env("HOOK_HOG_FUNCTION_TEAMS", "", type_cast=str) + +# Assistant +LANGFUSE_PUBLIC_KEY = get_from_env("LANGFUSE_PUBLIC_KEY", "", type_cast=str) +LANGFUSE_SECRET_KEY = get_from_env("LANGFUSE_SECRET_KEY", "", type_cast=str) +LANGFUSE_HOST = get_from_env("LANGFUSE_HOST", "https://us.cloud.langfuse.com", type_cast=str) diff --git a/frontend/__snapshots__/scenes-app-insights--funnel-top-to-bottom-edit--dark.png b/frontend/__snapshots__/scenes-app-insights--funnel-top-to-bottom-edit--dark.png index ebceafa1ecce5d05c7a692f4768e772866ff4623..e86df67429be0984011cdc97f3381655a2918a87 100644 GIT binary patch literal 165780 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

rgk&%1U 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 literal 165779 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

Ic>)N{=QY9sP5#osEd{x_r&}b{rhj< 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ИHfrh$3Z3bAxz`D}&LBV3;BrRh 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 { export type AIPropertyFilter = | EventPropertyFilter | PersonPropertyFilter - // | ElementPropertyFilter | SessionPropertyFilter - | CohortPropertyFilter - // | RecordingPropertyFilter - // | LogEntryPropertyFilter - // | HogQLPropertyFilter - // | EmptyPropertyFilter - // | DataWarehousePropertyFilter - // | DataWarehousePersonPropertyFilter | GroupPropertyFilter | FeaturePropertyFilter @@ -2077,7 +2068,9 @@ export type EventTaxonomyQueryResponse = AnalyticsQueryResponseBase export interface ActorsPropertyTaxonomyResponse { - sample_values: string[] + // Values can be floats and integers. The comment below is to preserve the `integer` type. + // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents + sample_values: (string | number | boolean | integer)[] sample_count: integer } @@ -2090,3 +2083,28 @@ export interface ActorsPropertyTaxonomyQuery extends DataNode export type CachedActorsPropertyTaxonomyQueryResponse = CachedQueryResponse + +export enum AssistantMessageType { + Human = 'human', + Assistant = 'ai', + Visualization = 'ai/viz', +} + +export interface HumanMessage { + type: AssistantMessageType.Human + content: string +} + +export interface AssistantMessage { + type: AssistantMessageType.Assistant + content: string +} + +export interface VisualizationMessage { + type: AssistantMessageType.Visualization + plan?: string + reasoning_steps?: string[] | null + answer?: ExperimentalAITrendsQuery +} + +export type RootAssistantMessage = VisualizationMessage | AssistantMessage | HumanMessage diff --git a/frontend/src/scenes/max/Thread.tsx b/frontend/src/scenes/max/Thread.tsx index dabc0cae374ca..93e9f403e814f 100644 --- a/frontend/src/scenes/max/Thread.tsx +++ b/frontend/src/scenes/max/Thread.tsx @@ -6,13 +6,21 @@ import { BreakdownSummary, PropertiesSummary, SeriesSummary } from 'lib/componen import { TopHeading } from 'lib/components/Cards/InsightCard/TopHeading' import { IconOpenInNew } from 'lib/lemon-ui/icons' import posthog from 'posthog-js' -import React, { useRef, useState } from 'react' +import React, { useMemo, useRef, useState } from 'react' import { urls } from 'scenes/urls' import { Query } from '~/queries/Query/Query' -import { InsightQueryNode, InsightVizNode, NodeKind } from '~/queries/schema' +import { + AssistantMessageType, + HumanMessage, + InsightVizNode, + NodeKind, + TrendsQuery, + VisualizationMessage, +} from '~/queries/schema' -import { maxLogic, ThreadMessage, TrendGenerationResult } from './maxLogic' +import { maxLogic, MessageStatus, ThreadMessage } from './maxLogic' +import { isHumanMessage, isVisualizationMessage } from './utils' export function Thread(): JSX.Element | null { const { thread, threadLoading } = useValues(maxLogic) @@ -20,11 +28,11 @@ export function Thread(): JSX.Element | null { return (

{thread.map((message, index) => { - if (message.role === 'user' || typeof message.content === 'string') { + if (isHumanMessage(message)) { return ( {message.content || No text} @@ -32,16 +40,21 @@ export function Thread(): JSX.Element | null { ) } - return ( - - ) + if (isVisualizationMessage(message)) { + return ( + + ) + } + + return null })} {threadLoading && ( - +
Let me think… @@ -52,52 +65,59 @@ export function Thread(): JSX.Element | null { ) } -const Message = React.forwardRef< - HTMLDivElement, - React.PropsWithChildren<{ role: 'user' | 'assistant'; className?: string }> ->(function Message({ role, children, className }, ref): JSX.Element { - if (role === 'user') { +const Message = React.forwardRef>( + function Message({ type, children, className }, ref): JSX.Element { + if (type === AssistantMessageType.Human) { + return ( +
+ {children} +
+ ) + } + return ( -
+
{children}
) } - - return ( -
- {children} -
- ) -}) +) function Answer({ message, + status, previousMessage, }: { - message: ThreadMessage & { content: TrendGenerationResult } + message: VisualizationMessage + status?: MessageStatus previousMessage: ThreadMessage }): JSX.Element { - const query: InsightVizNode = { - kind: NodeKind.InsightVizNode, - source: message.content?.answer as InsightQueryNode, - showHeader: true, - } + const query = useMemo(() => { + if (message.answer) { + return { + kind: NodeKind.InsightVizNode, + source: message.answer as TrendsQuery, + showHeader: true, + } + } + + return null + }, [message]) return ( <> - {message.content?.reasoning_steps && ( - + {message.reasoning_steps && ( +
    - {message.content.reasoning_steps.map((step, index) => ( + {message.reasoning_steps.map((step, index) => (
  • {step}
  • ))}
)} - {message.status === 'completed' && message.content?.answer && ( + {status === 'completed' && query && ( <> - +
@@ -118,7 +138,9 @@ function Answer({
- + {isHumanMessage(previousMessage) && ( + + )} )} @@ -129,8 +151,8 @@ function AnswerActions({ message, previousMessage, }: { - message: ThreadMessage & { content: TrendGenerationResult } - previousMessage: ThreadMessage + message: VisualizationMessage + previousMessage: HumanMessage }): JSX.Element { const [rating, setRating] = useState<'good' | 'bad' | null>(null) const [feedback, setFeedback] = useState('') @@ -144,7 +166,7 @@ function AnswerActions({ setRating(newRating) posthog.capture('chat rating', { question: previousMessage.content, - answer: message.content, + answer: JSON.stringify(message.answer), answer_rating: rating, }) if (newRating === 'bad') { @@ -158,7 +180,7 @@ function AnswerActions({ } posthog.capture('chat feedback', { question: previousMessage.content, - answer: message.content, + answer: JSON.stringify(message.answer), feedback, }) setFeedbackInputStatus('submitted') @@ -188,7 +210,7 @@ function AnswerActions({
{feedbackInputStatus !== 'hidden' && ( { if (el && !hasScrolledFeedbackInputIntoView.current) { // When the feedback input is first rendered, scroll it into view diff --git a/frontend/src/scenes/max/__mocks__/chatResponse.json b/frontend/src/scenes/max/__mocks__/chatResponse.json index 8be5242f5b6a6..5fed25c08bfca 100644 --- a/frontend/src/scenes/max/__mocks__/chatResponse.json +++ b/frontend/src/scenes/max/__mocks__/chatResponse.json @@ -1,4 +1,6 @@ { + "type": "ai/viz", + "plan": "Test plan", "reasoning_steps": [ "The user's query is to identify the most popular pages.", "To determine the most popular pages, we should analyze the '$pageview' event as it tracks when a user loads or reloads a page.", diff --git a/frontend/src/scenes/max/maxLogic.ts b/frontend/src/scenes/max/maxLogic.ts index be0ca6e22130c..69d53bf956b0f 100644 --- a/frontend/src/scenes/max/maxLogic.ts +++ b/frontend/src/scenes/max/maxLogic.ts @@ -3,7 +3,7 @@ import { actions, kea, key, listeners, path, props, reducers, selectors } from ' import { loaders } from 'kea-loaders' import api from 'lib/api' -import { ExperimentalAITrendsQuery, NodeKind, SuggestedQuestionsQuery } from '~/queries/schema' +import { AssistantMessageType, NodeKind, RootAssistantMessage, SuggestedQuestionsQuery } from '~/queries/schema' import type { maxLogicType } from './maxLogicType' @@ -11,15 +11,10 @@ export interface MaxLogicProps { sessionId: string } -export interface TrendGenerationResult { - reasoning_steps?: string[] - answer?: ExperimentalAITrendsQuery -} +export type MessageStatus = 'loading' | 'completed' | 'error' -export interface ThreadMessage { - role: 'user' | 'assistant' - content?: string | TrendGenerationResult - status?: 'loading' | 'completed' | 'error' +export type ThreadMessage = RootAssistantMessage & { + status?: MessageStatus } export const maxLogic = kea([ @@ -114,16 +109,13 @@ export const maxLogic = kea([ actions.setVisibleSuggestions(allSuggestionsWithoutCurrentlyVisible.slice(0, 3)) }, askMax: async ({ prompt }) => { - actions.addMessage({ role: 'user', content: prompt }) + actions.addMessage({ type: AssistantMessageType.Human, content: prompt }) const newIndex = values.thread.length try { const response = await api.chat({ session_id: props.sessionId, - messages: values.thread.map(({ role, content }) => ({ - role, - content: typeof content === 'string' ? content : JSON.stringify(content), - })), + messages: values.thread.map(({ status, ...message }) => message), }) const reader = response.body?.getReader() const decoder = new TextDecoder() @@ -145,12 +137,11 @@ export const maxLogic = kea([ firstChunk = false if (parsedResponse) { - actions.addMessage({ role: 'assistant', content: parsedResponse, status: 'loading' }) + actions.addMessage({ ...parsedResponse, status: 'loading' }) } } else if (parsedResponse) { actions.replaceMessage(newIndex, { - role: 'assistant', - content: parsedResponse, + ...parsedResponse, status: 'loading', }) } @@ -172,10 +163,10 @@ export const maxLogic = kea([ * Parses the generation result from the API. Some generation chunks might be sent in batches. * @param response */ -function parseResponse(response: string, recursive = true): TrendGenerationResult | null { +function parseResponse(response: string, recursive = true): RootAssistantMessage | null { try { const parsed = JSON.parse(response) - return parsed as TrendGenerationResult + return parsed as RootAssistantMessage } catch { if (!recursive) { return null diff --git a/frontend/src/scenes/max/utils.ts b/frontend/src/scenes/max/utils.ts new file mode 100644 index 0000000000000..263eb2f521baf --- /dev/null +++ b/frontend/src/scenes/max/utils.ts @@ -0,0 +1,11 @@ +import { AssistantMessageType, HumanMessage, RootAssistantMessage, VisualizationMessage } from '~/queries/schema' + +export function isVisualizationMessage( + message: RootAssistantMessage | undefined | null +): message is VisualizationMessage { + return message?.type === AssistantMessageType.Visualization +} + +export function isHumanMessage(message: RootAssistantMessage | undefined | null): message is HumanMessage { + return message?.type === AssistantMessageType.Human +} diff --git a/mypy-baseline.txt b/mypy-baseline.txt index d1d7bf60c9154..6f5de8a4ccf38 100644 --- a/mypy-baseline.txt +++ b/mypy-baseline.txt @@ -73,10 +73,10 @@ posthog/models/subscription.py:0: error: Argument 2 to "SubscriptionResourceInfo posthog/models/exported_asset.py:0: error: Value of type variable "_StrOrPromiseT" of "slugify" cannot be "str | None" [type-var] posthog/models/action/action.py:0: error: Need type annotation for "events" [var-annotated] posthog/models/action/action.py:0: error: Argument 1 to "len" has incompatible type "str | None"; expected "Sized" [arg-type] -posthog/hogql/ast.py:0: error: Incompatible return value type (got "bool | None", expected "bool") [return-value] posthog/hogql/database/schema/numbers.py:0: error: Incompatible types in assignment (expression has type "dict[str, IntegerDatabaseField]", variable has type "dict[str, FieldOrTable]") [assignment] posthog/hogql/database/schema/numbers.py:0: note: "Dict" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance posthog/hogql/database/schema/numbers.py:0: note: Consider using "Mapping" instead, which is covariant in the value type +posthog/hogql/ast.py:0: error: Incompatible return value type (got "bool | None", expected "bool") [return-value] ee/models/license.py:0: error: Incompatible return value type (got "_T", expected "License | None") [return-value] ee/models/license.py:0: error: Cannot use a covariant type variable as a parameter [misc] ee/models/license.py:0: error: "_T" has no attribute "plan" [attr-defined] @@ -126,10 +126,10 @@ posthog/models/user.py:0: error: "User" has no attribute "social_auth" [attr-de posthog/models/plugin.py:0: error: Argument 1 to "extract_plugin_code" has incompatible type "bytes | memoryview | None"; expected "bytes" [arg-type] posthog/models/plugin.py:0: error: Name "timezone.datetime" is not defined [name-defined] posthog/models/plugin.py:0: error: Name "timezone.datetime" is not defined [name-defined] -posthog/models/organization_invite.py:0: error: Argument "level" to "join" of "User" has incompatible type "int"; expected "Level" [arg-type] posthog/models/person/person.py:0: error: "_T" has no attribute "_add_distinct_ids" [attr-defined] posthog/models/person/person.py:0: error: Argument "version" to "create_person" has incompatible type "int | None"; expected "int" [arg-type] posthog/models/person/person.py:0: error: Incompatible types in assignment (expression has type "list[Never]", variable has type "QuerySet[PersonDistinctId, str]") [assignment] +posthog/models/organization_invite.py:0: error: Argument "level" to "join" of "User" has incompatible type "int"; expected "Level" [arg-type] posthog/hogql_queries/legacy_compatibility/filter_to_query.py:0: error: Dict entry 4 has incompatible type "str": "Literal[0, 1, 2, 3, 4] | None"; expected "str": "str | None" [dict-item] posthog/hogql_queries/legacy_compatibility/filter_to_query.py:0: error: Item "None" of "Any | None" has no attribute "__iter__" (not iterable) [union-attr] posthog/hogql_queries/legacy_compatibility/filter_to_query.py:0: error: Argument 1 to "float" has incompatible type "Any | None"; expected "str | Buffer | SupportsFloat | SupportsIndex" [arg-type] @@ -227,7 +227,6 @@ posthog/hogql/transforms/in_cohort.py:0: error: Item "Expr" of "Expr | Any" has posthog/hogql/transforms/in_cohort.py:0: error: List item 0 has incompatible type "SelectQueryType | None"; expected "SelectQueryType" [list-item] posthog/hogql/transforms/in_cohort.py:0: error: List item 0 has incompatible type "SelectQueryType | None"; expected "SelectQueryType" [list-item] posthog/hogql/database/database.py:0: error: Argument "week_start_day" to "Database" has incompatible type "int | Any | None"; expected "WeekStartDay | None" [arg-type] -posthog/hogql/database/database.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/warehouse/models/datawarehouse_saved_query.py:0: error: Argument 1 to "create_hogql_database" has incompatible type "int | None"; expected "int" [arg-type] posthog/models/feature_flag/flag_matching.py:0: error: Statement is unreachable [unreachable] posthog/models/feature_flag/flag_matching.py:0: error: Value expression in dictionary comprehension has incompatible type "int"; expected type "Literal[0, 1, 2, 3, 4]" [misc] @@ -256,7 +255,13 @@ posthog/hogql/printer.py:0: error: Argument 1 to "_print_identifier" of "_Printe posthog/user_permissions.py:0: error: Incompatible return value type (got "int", expected "Level | None") [return-value] posthog/user_permissions.py:0: error: Incompatible return value type (got "int", expected "Level | None") [return-value] posthog/user_permissions.py:0: error: Incompatible return value type (got "int", expected "RestrictionLevel") [return-value] +posthog/tasks/update_survey_iteration.py:0: error: Incompatible types in assignment (expression has type "ForeignKey[Any, _ST] | Any", variable has type "FeatureFlag | Combinable | None") [assignment] +posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "filters" [union-attr] +posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "filters" [union-attr] +posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "save" [union-attr] posthog/permissions.py:0: error: Argument 2 to "feature_enabled" has incompatible type "str | None"; expected "str" [arg-type] +posthog/models/event/util.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "datetime") [assignment] +posthog/models/event/util.py:0: error: Module has no attribute "utc" [attr-defined] posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type "str | None"; expected "str" [arg-type] posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type "str | None"; expected "str" [arg-type] posthog/event_usage.py:0: error: Argument 1 to "alias" has incompatible type "str | None"; expected "str" [arg-type] @@ -269,12 +274,6 @@ posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type " posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type "str | None"; expected "str" [arg-type] posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type "str | None"; expected "str" [arg-type] posthog/event_usage.py:0: error: Argument 1 to "capture" has incompatible type "str | None"; expected "str" [arg-type] -posthog/tasks/update_survey_iteration.py:0: error: Incompatible types in assignment (expression has type "ForeignKey[Any, _ST] | Any", variable has type "FeatureFlag | Combinable | None") [assignment] -posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "filters" [union-attr] -posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "filters" [union-attr] -posthog/tasks/update_survey_iteration.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "save" [union-attr] -posthog/models/event/util.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "datetime") [assignment] -posthog/models/event/util.py:0: error: Module has no attribute "utc" [attr-defined] posthog/demo/matrix/taxonomy_inference.py:0: error: Name "timezone.datetime" is not defined [name-defined] posthog/demo/matrix/matrix.py:0: error: Name "timezone.datetime" is not defined [name-defined] posthog/demo/matrix/matrix.py:0: error: Name "timezone.datetime" is not defined [name-defined] @@ -381,6 +380,8 @@ posthog/api/feature_flag.py:0: error: Incompatible type for lookup 'pk': (got "s posthog/api/feature_flag.py:0: error: Argument 2 to "get_all_feature_flags" has incompatible type "str | None"; expected "str" [arg-type] posthog/hogql_queries/web_analytics/web_analytics_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/hogql_queries/web_analytics/web_analytics_query_runner.py:0: error: Argument 1 to "append" of "list" has incompatible type "EventPropertyFilter"; expected "Expr" [arg-type] +posthog/hogql_queries/insights/trends/trends_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] +posthog/hogql_queries/insights/trends/trends_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/hogql_queries/insights/stickiness_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "None" of "JoinExpr | None" has no attribute "sample" [union-attr] posthog/hogql_queries/insights/retention_query_runner.py:0: error: Unsupported operand types for - ("int" and "None") [operator] @@ -395,8 +396,6 @@ posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: "List" is inva posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: Consider using "Sequence" instead, which is covariant posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select_from" [union-attr] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "None" of "JoinExpr | Any | None" has no attribute "sample" [union-attr] -posthog/hogql_queries/insights/trends/trends_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] -posthog/hogql_queries/insights/trends/trends_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/hogql_queries/insights/funnels/funnels_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/api/survey.py:0: error: Incompatible types in assignment (expression has type "Any | Sequence[Any] | None", variable has type "Survey | None") [assignment] posthog/api/survey.py:0: error: Item "list[_ErrorFullDetails]" of "_FullDetailDict | list[_ErrorFullDetails] | dict[str, _ErrorFullDetails]" has no attribute "get" [union-attr] @@ -552,23 +551,6 @@ posthog/heatmaps/test/test_heatmaps_api.py:0: error: "HttpResponse" has no attri posthog/heatmaps/test/test_heatmaps_api.py:0: error: "HttpResponse" has no attribute "json" [attr-defined] posthog/api/uploaded_media.py:0: error: Argument 1 to "read_bytes" has incompatible type "str | None"; expected "str" [arg-type] posthog/api/uploaded_media.py:0: error: Argument 1 to "read_bytes" has incompatible type "str | None"; expected "str" [arg-type] -posthog/api/signup.py:0: error: Argument 1 to "create_user" of "UserManager" has incompatible type "str | None"; expected "str" [arg-type] -posthog/api/organization_member.py:0: error: "User" has no attribute "totpdevice_set" [attr-defined] -posthog/api/organization_member.py:0: error: "User" has no attribute "social_auth" [attr-defined] -posthog/api/organization_member.py:0: error: Signature of "update" incompatible with supertype "ModelSerializer" [override] -posthog/api/organization_member.py:0: note: Superclass: -posthog/api/organization_member.py:0: note: def update(self, instance: Any, validated_data: Any) -> Any -posthog/api/organization_member.py:0: note: Subclass: -posthog/api/organization_member.py:0: note: def update(self, updated_membership: Any, validated_data: Any, **kwargs: Any) -> Any -posthog/api/organization_member.py:0: error: Signature of "update" incompatible with supertype "BaseSerializer" [override] -posthog/api/organization_member.py:0: note: Superclass: -posthog/api/organization_member.py:0: note: def update(self, instance: Any, validated_data: Any) -> Any -posthog/api/organization_member.py:0: note: Subclass: -posthog/api/organization_member.py:0: note: def update(self, updated_membership: Any, validated_data: Any, **kwargs: Any) -> Any -posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] -posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] -posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] -posthog/api/notebook.py:0: error: Incompatible types in assignment (expression has type "int", variable has type "str | None") [assignment] posthog/api/test/test_utils.py:0: error: Incompatible types in assignment (expression has type "dict[str, str]", variable has type "QueryDict") [assignment] posthog/api/test/test_survey.py:0: error: Item "None" of "FeatureFlag | None" has no attribute "active" [union-attr] posthog/api/test/test_stickiness.py:0: error: Module has no attribute "utc" [attr-defined] @@ -590,6 +572,23 @@ posthog/api/test/test_personal_api_keys.py:0: error: Item "None" of "str | None" posthog/api/test/test_personal_api_keys.py:0: error: Item "None" of "str | None" has no attribute "startswith" [union-attr] posthog/api/test/test_person.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] posthog/api/test/test_organization_domain.py:0: error: Item "None" of "datetime | None" has no attribute "strftime" [union-attr] +posthog/api/signup.py:0: error: Argument 1 to "create_user" of "UserManager" has incompatible type "str | None"; expected "str" [arg-type] +posthog/api/organization_member.py:0: error: "User" has no attribute "totpdevice_set" [attr-defined] +posthog/api/organization_member.py:0: error: "User" has no attribute "social_auth" [attr-defined] +posthog/api/organization_member.py:0: error: Signature of "update" incompatible with supertype "ModelSerializer" [override] +posthog/api/organization_member.py:0: note: Superclass: +posthog/api/organization_member.py:0: note: def update(self, instance: Any, validated_data: Any) -> Any +posthog/api/organization_member.py:0: note: Subclass: +posthog/api/organization_member.py:0: note: def update(self, updated_membership: Any, validated_data: Any, **kwargs: Any) -> Any +posthog/api/organization_member.py:0: error: Signature of "update" incompatible with supertype "BaseSerializer" [override] +posthog/api/organization_member.py:0: note: Superclass: +posthog/api/organization_member.py:0: note: def update(self, instance: Any, validated_data: Any) -> Any +posthog/api/organization_member.py:0: note: Subclass: +posthog/api/organization_member.py:0: note: def update(self, updated_membership: Any, validated_data: Any, **kwargs: Any) -> Any +posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] +posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] +posthog/api/organization_feature_flag.py:0: error: Invalid index type "str | None" for "dict[str, int]"; expected type "str" [index] +posthog/api/notebook.py:0: error: Incompatible types in assignment (expression has type "int", variable has type "str | None") [assignment] posthog/warehouse/external_data_source/source.py:0: error: Incompatible types in assignment (expression has type "int", target has type "str") [assignment] posthog/warehouse/external_data_source/source.py:0: error: Incompatible types in assignment (expression has type "int", target has type "str") [assignment] posthog/warehouse/external_data_source/source.py:0: error: Incompatible types in assignment (expression has type "dict[str, Collection[str]]", variable has type "StripeSourcePayload") [assignment] @@ -690,6 +689,21 @@ posthog/hogql/test/test_parse_string_cpp.py:0: error: Unsupported dynamic base c posthog/hogql/database/test/test_view.py:0: error: Argument "dialect" to "print_ast" has incompatible type "str"; expected "Literal['hogql', 'clickhouse']" [arg-type] posthog/hogql/database/test/test_s3_table.py:0: error: Argument "dialect" to "print_ast" has incompatible type "str"; expected "Literal['hogql', 'clickhouse']" [arg-type] posthog/async_migrations/test/test_runner.py:0: error: Item "None" of "datetime | None" has no attribute "day" [union-attr] +posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] +posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] +posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "tiles" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "name" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "description" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "filters" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "tiles" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "name" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "description" [union-attr] +posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "filters" [union-attr] +posthog/api/test/dashboards/test_dashboard.py:0: error: Value of type variable "_S" of "assertAlmostEqual" of "TestCase" cannot be "datetime | None" [type-var] +posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] +posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] +posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] posthog/api/search.py:0: error: Argument "klass" to "class_queryset" has incompatible type "object"; expected "type[Model]" [arg-type] posthog/api/search.py:0: error: Argument "search_fields" to "class_queryset" has incompatible type "object"; expected "dict[str, str]" [arg-type] posthog/api/search.py:0: error: Argument "extra_fields" to "class_queryset" has incompatible type "object"; expected "dict[Any, Any] | None" [arg-type] @@ -713,21 +727,6 @@ posthog/api/property_definition.py:0: error: Incompatible types in assignment (e posthog/api/property_definition.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "organization" [union-attr] posthog/api/property_definition.py:0: error: Item "None" of "Organization | Any | None" has no attribute "is_feature_available" [union-attr] posthog/api/event.py:0: error: Argument 1 to has incompatible type "*tuple[str, ...]"; expected "type[BaseRenderer]" [arg-type] -posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] -posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] -posthog/api/test/test_insight.py:0: error: Argument "data" to "get" of "APIClient" has incompatible type "dict[str, object]"; expected "Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None" [arg-type] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "tiles" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "name" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "description" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "filters" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "tiles" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "name" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "description" [union-attr] -posthog/api/test/test_feature_flag.py:0: error: Item "None" of "Dashboard | None" has no attribute "filters" [union-attr] -posthog/api/test/dashboards/test_dashboard.py:0: error: Value of type variable "_S" of "assertAlmostEqual" of "TestCase" cannot be "datetime | None" [type-var] -posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] -posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] -posthog/api/test/dashboards/test_dashboard.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "timedelta" [attr-defined] posthog/admin/inlines/plugin_attachment_inline.py:0: error: Signature of "has_add_permission" incompatible with supertype "BaseModelAdmin" [override] posthog/admin/inlines/plugin_attachment_inline.py:0: note: Superclass: posthog/admin/inlines/plugin_attachment_inline.py:0: note: def has_add_permission(self, request: HttpRequest) -> bool @@ -767,10 +766,13 @@ posthog/temporal/tests/batch_exports/test_batch_exports.py:0: error: TypedDict k posthog/session_recordings/session_recording_api.py:0: error: Argument "team_id" to "get_realtime_snapshots" has incompatible type "int"; expected "str" [arg-type] posthog/session_recordings/session_recording_api.py:0: error: Value of type variable "SupportsRichComparisonT" of "sorted" cannot be "str | None" [type-var] posthog/session_recordings/session_recording_api.py:0: error: Argument 1 to "get" of "dict" has incompatible type "str | None"; expected "str" [arg-type] -posthog/queries/app_metrics/historical_exports.py:0: error: Argument 1 to "loads" has incompatible type "str | None"; expected "str | bytes | bytearray" [arg-type] posthog/queries/app_metrics/test/test_app_metrics.py:0: error: Argument 3 to "AppMetricsErrorDetailsQuery" has incompatible type "AppMetricsRequestSerializer"; expected "AppMetricsErrorsRequestSerializer" [arg-type] posthog/queries/app_metrics/test/test_app_metrics.py:0: error: Argument 3 to "AppMetricsErrorDetailsQuery" has incompatible type "AppMetricsRequestSerializer"; expected "AppMetricsErrorsRequestSerializer" [arg-type] posthog/queries/app_metrics/test/test_app_metrics.py:0: error: Argument 3 to "AppMetricsErrorDetailsQuery" has incompatible type "AppMetricsRequestSerializer"; expected "AppMetricsErrorsRequestSerializer" [arg-type] +posthog/queries/app_metrics/historical_exports.py:0: error: Argument 1 to "loads" has incompatible type "str | None"; expected "str | bytes | bytearray" [arg-type] +posthog/api/test/test_decide.py:0: error: Item "None" of "User | None" has no attribute "toolbar_mode" [union-attr] +posthog/api/test/test_decide.py:0: error: Item "None" of "User | None" has no attribute "save" [union-attr] +posthog/api/test/test_authentication.py:0: error: Module has no attribute "utc" [attr-defined] posthog/api/plugin.py:0: error: Item "None" of "Team | None" has no attribute "organization" [union-attr] posthog/api/plugin.py:0: error: Item "None" of "Team | None" has no attribute "id" [union-attr] posthog/api/plugin.py:0: error: Item "None" of "Team | None" has no attribute "organization" [union-attr] @@ -784,9 +786,6 @@ posthog/api/plugin.py:0: error: Incompatible type for "file_size" of "PluginAtta posthog/api/plugin.py:0: error: Item "None" of "IO[Any] | None" has no attribute "read" [union-attr] posthog/api/plugin.py:0: error: Item "None" of "Team | None" has no attribute "organization" [union-attr] posthog/api/plugin.py:0: error: Item "None" of "Team | None" has no attribute "id" [union-attr] -posthog/api/test/test_decide.py:0: error: Item "None" of "User | None" has no attribute "toolbar_mode" [union-attr] -posthog/api/test/test_decide.py:0: error: Item "None" of "User | None" has no attribute "save" [union-attr] -posthog/api/test/test_authentication.py:0: error: Module has no attribute "utc" [attr-defined] posthog/admin/admins/plugin_config_admin.py:0: error: Item "None" of "Team | None" has no attribute "name" [union-attr] posthog/temporal/tests/batch_exports/test_snowflake_batch_export_workflow.py:0: error: Need type annotation for "_execute_calls" (hint: "_execute_calls: list[] = ...") [var-annotated] posthog/temporal/tests/batch_exports/test_snowflake_batch_export_workflow.py:0: error: Need type annotation for "_execute_async_calls" (hint: "_execute_async_calls: list[] = ...") [var-annotated] @@ -799,7 +798,6 @@ posthog/temporal/data_imports/workflow_activities/import_data.py:0: error: Argum posthog/temporal/data_imports/workflow_activities/import_data.py:0: error: Argument "source_type" to "sql_source_for_type" has incompatible type "str"; expected "Type" [arg-type] posthog/migrations/0237_remove_timezone_from_teams.py:0: error: Argument 2 to "RunPython" has incompatible type "Callable[[Migration, Any], None]"; expected "_CodeCallable | None" [arg-type] posthog/migrations/0228_fix_tile_layouts.py:0: error: Argument 2 to "RunPython" has incompatible type "Callable[[Migration, Any], None]"; expected "_CodeCallable | None" [arg-type] -posthog/api/query.py:0: error: Statement is unreachable [unreachable] posthog/api/plugin_log_entry.py:0: error: Name "timezone.datetime" is not defined [name-defined] posthog/api/plugin_log_entry.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/api/plugin_log_entry.py:0: error: Name "timezone.datetime" is not defined [name-defined] @@ -820,18 +818,6 @@ posthog/api/test/batch_exports/conftest.py:0: error: Argument "activities" to "T posthog/temporal/tests/data_imports/test_end_to_end.py:0: error: Unused "type: ignore" comment [unused-ignore] posthog/api/test/test_team.py:0: error: "HttpResponse" has no attribute "json" [attr-defined] posthog/api/test/test_team.py:0: error: "HttpResponse" has no attribute "json" [attr-defined] -posthog/api/test/test_capture.py:0: error: Statement is unreachable [unreachable] -posthog/api/test/test_capture.py:0: error: Incompatible return value type (got "_MonkeyPatchedWSGIResponse", expected "HttpResponse") [return-value] -posthog/api/test/test_capture.py:0: error: Module has no attribute "utc" [attr-defined] -posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] -posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] -posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] -posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] posthog/test/test_middleware.py:0: error: Incompatible types in assignment (expression has type "_MonkeyPatchedWSGIResponse", variable has type "_MonkeyPatchedResponse") [assignment] posthog/management/commands/test/test_create_batch_export_from_app.py:0: error: Incompatible return value type (got "dict[str, Collection[str]]", expected "dict[str, str]") [return-value] posthog/management/commands/test/test_create_batch_export_from_app.py:0: error: Incompatible types in assignment (expression has type "dict[str, Collection[str]]", variable has type "dict[str, str]") [assignment] @@ -874,3 +860,16 @@ posthog/api/test/batch_exports/test_update.py:0: error: Value of type "BatchExpo posthog/api/test/batch_exports/test_update.py:0: error: Value of type "BatchExport" is not indexable [index] posthog/api/test/batch_exports/test_update.py:0: error: Value of type "BatchExport" is not indexable [index] posthog/api/test/batch_exports/test_pause.py:0: error: "batch_export_delete_schedule" does not return a value (it only ever returns None) [func-returns-value] +posthog/api/query.py:0: error: Statement is unreachable [unreachable] +posthog/api/test/test_capture.py:0: error: Statement is unreachable [unreachable] +posthog/api/test/test_capture.py:0: error: Incompatible return value type (got "_MonkeyPatchedWSGIResponse", expected "HttpResponse") [return-value] +posthog/api/test/test_capture.py:0: error: Module has no attribute "utc" [attr-defined] +posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] +posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] +posthog/api/test/test_capture.py:0: error: Unpacked dict entry 0 has incompatible type "Collection[str]"; expected "SupportsKeysAndGetItem[str, dict[Never, Never]]" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] +posthog/api/test/test_capture.py:0: error: Dict entry 0 has incompatible type "str": "float"; expected "str": "int" [dict-item] diff --git a/posthog/api/query.py b/posthog/api/query.py index 1d3bf3f67edda..d4d45ce66a270 100644 --- a/posthog/api/query.py +++ b/posthog/api/query.py @@ -1,4 +1,3 @@ -import json import re import uuid @@ -12,7 +11,8 @@ from rest_framework.response import Response from sentry_sdk import capture_exception, set_tag -from ee.hogai.generate_trends_agent import Conversation, GenerateTrendsAgent +from ee.hogai.assistant import Assistant +from ee.hogai.utils import Conversation from posthog.api.documentation import extend_schema from posthog.api.mixins import PydanticModelMixin from posthog.api.monitoring import Feature, monitor @@ -37,11 +37,11 @@ from posthog.rate_limit import ( AIBurstRateThrottle, AISustainedRateThrottle, - HogQLQueryThrottle, ClickHouseBurstRateThrottle, ClickHouseSustainedRateThrottle, + HogQLQueryThrottle, ) -from posthog.schema import QueryRequest, QueryResponseAlternative, QueryStatusResponse +from posthog.schema import HumanMessage, QueryRequest, QueryResponseAlternative, QueryStatusResponse class ServerSentEventRenderer(BaseRenderer): @@ -179,23 +179,21 @@ def draft_sql(self, request: Request, *args, **kwargs) -> Response: def chat(self, request: Request, *args, **kwargs): assert request.user is not None validated_body = Conversation.model_validate(request.data) - chain = GenerateTrendsAgent(self.team).bootstrap(validated_body.messages) + assistant = Assistant(self.team) def generate(): last_message = None - for message in chain.stream({"question": validated_body.messages[0].content}): - if message: - last_message = message[0].model_dump_json() - yield last_message - - if not last_message: - yield json.dumps({"reasoning_steps": ["Schema validation failed"]}) - - report_user_action( - request.user, # type: ignore - "chat with ai", - {"prompt": validated_body.messages[-1].content, "response": last_message}, - ) + for message in assistant.stream(validated_body): + last_message = message + yield last_message + + human_message = validated_body.messages[-1].root + if isinstance(human_message, HumanMessage): + report_user_action( + request.user, # type: ignore + "chat with ai", + {"prompt": human_message.content, "response": last_message}, + ) return StreamingHttpResponse(generate(), content_type=ServerSentEventRenderer.media_type) diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 6f47bd7322137..6ef31c6530176 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -97,6 +97,9 @@ '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet > SurveySerializer]: unable to resolve type hint for function "get_conditions". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/web_experiment.py: Warning [WebExperimentViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.web_experiment.WebExperiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: operationId "environments_app_metrics_historical_exports_retrieve" has collisions [(\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', diff --git a/posthog/celery.py b/posthog/celery.py index ac7f5c90138cf..f6c7aa9d14b7c 100644 --- a/posthog/celery.py +++ b/posthog/celery.py @@ -81,13 +81,12 @@ @setup_logging.connect def receiver_setup_logging(loglevel, logfile, format, colorize, **kwargs) -> None: - import logging + from logging import config as logging_config from posthog.settings import logs # following instructions from here https://django-structlog.readthedocs.io/en/latest/celery.html - # mypy thinks that there is no `logging.config` but there is ¯\_(ツ)_/¯ - logging.config.dictConfig(logs.LOGGING) # type: ignore + logging_config.dictConfig(logs.LOGGING) @receiver(signals.bind_extra_task_metadata) diff --git a/posthog/hogql/database/database.py b/posthog/hogql/database/database.py index e1e3fd26f8203..5f5bb9c1a8bbb 100644 --- a/posthog/hogql/database/database.py +++ b/posthog/hogql/database/database.py @@ -1,32 +1,32 @@ import dataclasses from collections.abc import Callable -from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, TypeAlias, cast, Union +from typing import TYPE_CHECKING, Any, ClassVar, Literal, Optional, TypeAlias, Union, cast from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from django.db.models import Q -from pydantic import ConfigDict, BaseModel +from pydantic import BaseModel, ConfigDict from sentry_sdk import capture_exception from posthog.hogql import ast from posthog.hogql.context import HogQLContext from posthog.hogql.database.models import ( + BooleanDatabaseField, + DatabaseField, + DateDatabaseField, + DateTimeDatabaseField, + ExpressionField, FieldOrTable, FieldTraverser, + FloatDatabaseField, + FunctionCallTable, + IntegerDatabaseField, + LazyJoin, SavedQuery, + StringArrayDatabaseField, StringDatabaseField, - DatabaseField, - IntegerDatabaseField, - DateTimeDatabaseField, - BooleanDatabaseField, StringJSONDatabaseField, - StringArrayDatabaseField, - LazyJoin, - VirtualTable, Table, - DateDatabaseField, - FloatDatabaseField, - FunctionCallTable, - ExpressionField, + VirtualTable, ) from posthog.hogql.database.schema.channel_type import create_initial_channel_type, create_initial_domain_type from posthog.hogql.database.schema.cohort_people import CohortPeople, RawCohortPeople @@ -34,9 +34,9 @@ from posthog.hogql.database.schema.groups import GroupsTable, RawGroupsTable from posthog.hogql.database.schema.heatmaps import HeatmapsTable from posthog.hogql.database.schema.log_entries import ( + BatchExportLogEntriesTable, LogEntriesTable, ReplayConsoleLogsLogEntriesTable, - BatchExportLogEntriesTable, ) from posthog.hogql.database.schema.numbers import NumbersTable from posthog.hogql.database.schema.person_distinct_id_overrides import ( @@ -60,8 +60,8 @@ ) from posthog.hogql.database.schema.sessions_v1 import RawSessionsTableV1, SessionsTableV1 from posthog.hogql.database.schema.sessions_v2 import ( - SessionsTableV2, RawSessionsTableV2, + SessionsTableV2, join_events_table_to_sessions_table_v2, ) from posthog.hogql.database.schema.static_cohort_people import StaticCohortPeople @@ -213,13 +213,13 @@ def _use_person_id_from_person_overrides(database: Database) -> None: def create_hogql_database( team_id: int, modifiers: Optional[HogQLQueryModifiers] = None, team_arg: Optional["Team"] = None ) -> Database: - from posthog.models import Team from posthog.hogql.database.s3_table import S3Table from posthog.hogql.query import create_default_modifiers_for_team + from posthog.models import Team from posthog.warehouse.models import ( - DataWarehouseTable, - DataWarehouseSavedQuery, DataWarehouseJoin, + DataWarehouseSavedQuery, + DataWarehouseTable, ) team = team_arg or Team.objects.get(pk=team_id) @@ -238,7 +238,7 @@ def create_hogql_database( elif modifiers.personsOnEventsMode == PersonsOnEventsMode.PERSON_ID_OVERRIDE_PROPERTIES_ON_EVENTS: _use_person_id_from_person_overrides(database) _use_person_properties_from_events(database) - database.events.fields["poe"].fields["id"] = database.events.fields["person_id"] + cast(VirtualTable, database.events.fields["poe"]).fields["id"] = database.events.fields["person_id"] elif modifiers.personsOnEventsMode == PersonsOnEventsMode.PERSON_ID_OVERRIDE_PROPERTIES_JOINED: _use_person_id_from_person_overrides(database) @@ -268,14 +268,14 @@ def create_hogql_database( join_table=sessions, join_function=join_replay_table_to_sessions_table_v2, ) - replay_events.fields["events"].join_table = events + cast(LazyJoin, replay_events.fields["events"]).join_table = events raw_replay_events = database.raw_session_replay_events raw_replay_events.fields["session"] = LazyJoin( from_field=["session_id"], join_table=sessions, join_function=join_replay_table_to_sessions_table_v2, ) - raw_replay_events.fields["events"].join_table = events + cast(LazyJoin, raw_replay_events.fields["events"]).join_table = events database.persons.fields["$virt_initial_referring_domain_type"] = create_initial_domain_type( "$virt_initial_referring_domain_type" diff --git a/posthog/hogql/database/test/test_s3_table.py b/posthog/hogql/database/test/test_s3_table.py index 7211f75a5f84c..7bc2f18506b99 100644 --- a/posthog/hogql/database/test/test_s3_table.py +++ b/posthog/hogql/database/test/test_s3_table.py @@ -2,20 +2,21 @@ from posthog.hogql.context import HogQLContext from posthog.hogql.database.database import create_hogql_database from posthog.hogql.database.s3_table import build_function_call +from posthog.hogql.database.test.tables import create_aapl_stock_s3_table +from posthog.hogql.errors import ExposedHogQLError from posthog.hogql.parser import parse_select from posthog.hogql.printer import print_ast from posthog.hogql.query import create_default_modifiers_for_team from posthog.test.base import BaseTest -from posthog.hogql.database.test.tables import create_aapl_stock_s3_table -from posthog.hogql.errors import ExposedHogQLError from posthog.warehouse.models.table import DataWarehouseTable class TestS3Table(BaseTest): def _init_database(self): self.database = create_hogql_database(self.team.pk) - self.database.aapl_stock = create_aapl_stock_s3_table() - self.database.aapl_stock_2 = create_aapl_stock_s3_table(name="aapl_stock_2") + self.database.add_warehouse_tables( + aapl_stock=create_aapl_stock_s3_table(), aapl_stock_2=create_aapl_stock_s3_table(name="aapl_stock_2") + ) self.context = HogQLContext( team_id=self.team.pk, enable_select_queries=True, diff --git a/posthog/hogql/database/test/test_view.py b/posthog/hogql/database/test/test_view.py index 747e80cc4e65f..26d0e6382bf7f 100644 --- a/posthog/hogql/database/test/test_view.py +++ b/posthog/hogql/database/test/test_view.py @@ -1,15 +1,15 @@ from posthog.hogql.context import HogQLContext from posthog.hogql.database.database import create_hogql_database -from posthog.hogql.parser import parse_select -from posthog.hogql.printer import print_ast -from posthog.hogql.query import create_default_modifiers_for_team -from posthog.test.base import BaseTest from posthog.hogql.database.test.tables import ( - create_aapl_stock_table_view, create_aapl_stock_s3_table, - create_nested_aapl_stock_view, create_aapl_stock_table_self_referencing, + create_aapl_stock_table_view, + create_nested_aapl_stock_view, ) +from posthog.hogql.parser import parse_select +from posthog.hogql.printer import print_ast +from posthog.hogql.query import create_default_modifiers_for_team +from posthog.test.base import BaseTest class TestView(BaseTest): @@ -17,10 +17,12 @@ class TestView(BaseTest): def _init_database(self): self.database = create_hogql_database(self.team.pk) - self.database.aapl_stock_view = create_aapl_stock_table_view() - self.database.aapl_stock = create_aapl_stock_s3_table() - self.database.aapl_stock_nested_view = create_nested_aapl_stock_view() - self.database.aapl_stock_self = create_aapl_stock_table_self_referencing() + self.database.add_views( + aapl_stock_view=create_aapl_stock_table_view(), aapl_stock_nested_view=create_nested_aapl_stock_view() + ) + self.database.add_warehouse_tables( + aapl_stock=create_aapl_stock_s3_table(), aapl_stock_self=create_aapl_stock_table_self_referencing() + ) self.context = HogQLContext( team_id=self.team.pk, enable_select_queries=True, diff --git a/posthog/hogql_queries/insights/trends/trends_query_runner.py b/posthog/hogql_queries/insights/trends/trends_query_runner.py index e6675a261553e..44cbf4cd5da0c 100644 --- a/posthog/hogql_queries/insights/trends/trends_query_runner.py +++ b/posthog/hogql_queries/insights/trends/trends_query_runner.py @@ -1073,7 +1073,7 @@ def _get_breakdown_items( return res_breakdown - def _is_other_breakdown(self, breakdown: BreakdownItem | list[BreakdownItem]) -> bool: + def _is_other_breakdown(self, breakdown: str | list[str]) -> bool: return ( breakdown == BREAKDOWN_OTHER_STRING_LABEL or isinstance(breakdown, list) diff --git a/posthog/schema.py b/posthog/schema.py index 8188cf8a0217e..3c7f04dd893ee 100644 --- a/posthog/schema.py +++ b/posthog/schema.py @@ -32,7 +32,7 @@ class ActorsPropertyTaxonomyResponse(BaseModel): extra="forbid", ) sample_count: int - sample_values: list[str] + sample_values: list[Union[str, float, bool, int]] class AggregationAxisFormat(StrEnum): @@ -63,6 +63,20 @@ class AlertState(StrEnum): SNOOZED = "Snoozed" +class AssistantMessage(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + content: str + type: Literal["ai"] = "ai" + + +class AssistantMessageType(StrEnum): + HUMAN = "human" + AI = "ai" + AI_VIZ = "ai/viz" + + class Kind(StrEnum): METHOD = "Method" FUNCTION = "Function" @@ -751,6 +765,14 @@ class HogQueryResponse(BaseModel): stdout: Optional[str] = None +class HumanMessage(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + content: str + type: Literal["human"] = "human" + + class Compare(StrEnum): CURRENT = "current" PREVIOUS = "previous" @@ -4972,7 +4994,6 @@ class AIActionsNode(BaseModel): EventPropertyFilter, PersonPropertyFilter, SessionPropertyFilter, - CohortPropertyFilter, GroupPropertyFilter, FeaturePropertyFilter, ] @@ -5000,7 +5021,6 @@ class AIActionsNode(BaseModel): EventPropertyFilter, PersonPropertyFilter, SessionPropertyFilter, - CohortPropertyFilter, GroupPropertyFilter, FeaturePropertyFilter, ] @@ -5021,7 +5041,6 @@ class AIEventsNode(BaseModel): EventPropertyFilter, PersonPropertyFilter, SessionPropertyFilter, - CohortPropertyFilter, GroupPropertyFilter, FeaturePropertyFilter, ] @@ -5049,7 +5068,6 @@ class AIEventsNode(BaseModel): EventPropertyFilter, PersonPropertyFilter, SessionPropertyFilter, - CohortPropertyFilter, GroupPropertyFilter, FeaturePropertyFilter, ] @@ -5181,7 +5199,6 @@ class ExperimentalAITrendsQuery(BaseModel): EventPropertyFilter, PersonPropertyFilter, SessionPropertyFilter, - CohortPropertyFilter, GroupPropertyFilter, FeaturePropertyFilter, ] @@ -5427,6 +5444,16 @@ class TrendsQuery(BaseModel): trendsFilter: Optional[TrendsFilter] = Field(default=None, description="Properties specific to the trends insight") +class VisualizationMessage(BaseModel): + model_config = ConfigDict( + extra="forbid", + ) + answer: Optional[ExperimentalAITrendsQuery] = None + plan: Optional[str] = None + reasoning_steps: Optional[list[str]] = None + type: Literal["ai/viz"] = "ai/viz" + + class ErrorTrackingQuery(BaseModel): model_config = ConfigDict( extra="forbid", @@ -5923,6 +5950,10 @@ class QueryResponseAlternative( ] +class RootAssistantMessage(RootModel[Union[VisualizationMessage, AssistantMessage, HumanMessage]]): + root: Union[VisualizationMessage, AssistantMessage, HumanMessage] + + class DatabaseSchemaQueryResponse(BaseModel): model_config = ConfigDict( extra="forbid", diff --git a/requirements-dev.in b/requirements-dev.in index f1158cbc54960..eab4262ae6d66 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -15,7 +15,7 @@ ruff~=0.6.1 mypy~=1.11.1 mypy-baseline~=0.7.0 mypy-extensions==1.0.0 -datamodel-code-generator==0.25.6 +datamodel-code-generator==0.26.1 djangorestframework-stubs~=3.14.5 django-stubs==5.0.4 Faker==17.5.0 diff --git a/requirements-dev.txt b/requirements-dev.txt index 72fe00092b60e..cd0caa1e8d154 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -10,7 +10,7 @@ aiosignal==1.2.0 # via # -c requirements.txt # aiohttp -annotated-types==0.5.0 +annotated-types==0.7.0 # via # -c requirements.txt # pydantic @@ -69,7 +69,7 @@ cryptography==39.0.2 # via # -c requirements.txt # types-paramiko -datamodel-code-generator==0.25.6 +datamodel-code-generator==0.26.1 # via -r requirements-dev.in django==4.2.15 # via @@ -113,7 +113,7 @@ genson==1.2.2 # via datamodel-code-generator icdiff==2.0.5 # via pytest-icdiff -idna==2.8 +idna==3.10 # via # -c requirements.txt # email-validator @@ -199,11 +199,11 @@ pycparser==2.20 # via # -c requirements.txt # cffi -pydantic==2.5.3 +pydantic==2.9.2 # via # -c requirements.txt # datamodel-code-generator -pydantic-core==2.14.6 +pydantic-core==2.23.4 # via # -c requirements.txt # pydantic diff --git a/requirements.in b/requirements.in index 45151b4d5d38c..619c6a06cdaaf 100644 --- a/requirements.in +++ b/requirements.in @@ -44,9 +44,11 @@ gunicorn==20.1.0 infi-clickhouse-orm@ git+https://github.com/PostHog/infi.clickhouse_orm@9578c79f29635ee2c1d01b7979e89adab8383de2 kafka-python==2.0.2 kombu==5.3.2 -langchain==0.2.15 -langchain-openai==0.1.23 -langsmith==0.1.106 +langchain==0.3.3 +langchain-openai==0.2.2 +langfuse==2.52.1 +langgraph==0.2.34 +langsmith==0.1.132 lzstring==1.0.4 natsort==8.4.0 nanoid==2.0.0 @@ -64,7 +66,7 @@ pymssql==2.3.0 PyMySQL==1.1.1 psycopg[binary]==3.1.20 pyarrow==17.0.0 -pydantic==2.5.3 +pydantic==2.9.2 pyjwt==2.4.0 pyodbc==5.1.0 python-dateutil>=2.8.2 @@ -100,8 +102,8 @@ mimesis==5.2.1 more-itertools==9.0.0 django-two-factor-auth==1.14.0 phonenumberslite==8.13.6 -openai==1.43.0 -tiktoken==0.7.0 +openai==1.51.2 +tiktoken==0.8.0 nh3==0.2.14 hogql-parser==1.0.45 zxcvbn==4.4.28 diff --git a/requirements.txt b/requirements.txt index b9fdf3b435d36..82798318498ef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,13 +21,14 @@ aiosignal==1.2.0 # via aiohttp amqp==5.1.1 # via kombu -annotated-types==0.5.0 +annotated-types==0.7.0 # via pydantic antlr4-python3-runtime==4.13.1 # via -r requirements.in -anyio==4.2.0 +anyio==4.6.2.post1 # via # httpx + # langfuse # openai asgiref==3.7.2 # via django @@ -48,7 +49,9 @@ attrs==23.2.0 # trio # zeep backoff==2.2.1 - # via posthoganalytics + # via + # langfuse + # posthoganalytics bcrypt==4.1.3 # via paramiko billiard==4.1.0 @@ -264,8 +267,6 @@ googleapis-common-protos==1.60.0 # via # google-api-core # grpcio-status -greenlet==3.1.1 - # via sqlalchemy grpcio==1.57.0 # via # google-api-core @@ -287,14 +288,16 @@ httpcore==1.0.2 # via httpx httpx==0.26.0 # via + # langfuse # langsmith # openai humanize==4.9.0 # via dlt -idna==2.8 +idna==3.10 # via # anyio # httpx + # langfuse # requests # snowflake-connector-python # trio @@ -336,18 +339,26 @@ kombu==5.3.2 # via # -r requirements.in # celery -langchain==0.2.15 +langchain==0.3.3 # via -r requirements.in -langchain-core==0.2.36 +langchain-core==0.3.10 # via # langchain # langchain-openai # langchain-text-splitters -langchain-openai==0.1.23 + # langgraph + # langgraph-checkpoint +langchain-openai==0.2.2 # via -r requirements.in -langchain-text-splitters==0.2.2 +langchain-text-splitters==0.3.0 # via langchain -langsmith==0.1.106 +langfuse==2.52.1 + # via -r requirements.in +langgraph==0.2.34 + # via -r requirements.in +langgraph-checkpoint==2.0.1 + # via langgraph +langsmith==0.1.132 # via # -r requirements.in # langchain @@ -373,6 +384,8 @@ more-itertools==9.0.0 # via # -r requirements.in # simple-salesforce +msgpack==1.1.0 + # via langgraph-checkpoint multidict==6.0.2 # via # aiohttp @@ -395,7 +408,7 @@ oauthlib==3.1.0 # via # requests-oauthlib # social-auth-core -openai==1.43.0 +openai==1.51.2 # via # -r requirements.in # langchain-openai @@ -415,6 +428,7 @@ packaging==24.1 # dlt # google-cloud-bigquery # langchain-core + # langfuse # snowflake-connector-python # sqlalchemy-bigquery # webdriver-manager @@ -480,14 +494,15 @@ pyasn1-modules==0.3.0 # via google-auth pycparser==2.20 # via cffi -pydantic==2.5.3 +pydantic==2.9.2 # via # -r requirements.in # langchain # langchain-core + # langfuse # langsmith # openai -pydantic-core==2.14.6 +pydantic-core==2.23.4 # via pydantic pyjwt==2.4.0 # via @@ -587,7 +602,9 @@ requests-file==2.1.0 requests-oauthlib==1.3.0 # via social-auth-core requests-toolbelt==1.0.0 - # via zeep + # via + # langsmith + # zeep requirements-parser==0.5.0 # via dlt retry==0.9.2 @@ -689,7 +706,7 @@ tenacity==8.2.3 # langchain-core threadpoolctl==3.3.0 # via scikit-learn -tiktoken==0.7.0 +tiktoken==0.8.0 # via # -r requirements.in # langchain-openai @@ -765,7 +782,9 @@ wheel==0.42.0 whitenoise==6.5.0 # via -r requirements.in wrapt==1.15.0 - # via aiobotocore + # via + # aiobotocore + # langfuse wsproto==1.2.0 # via trio-websocket xmlsec==1.3.13

J4im0EZtr#9Dx_1girJ0 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