chore(max): Upgrade /init web search (#38662)

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
Michael Matloka
2025-10-10 12:57:43 +02:00
committed by GitHub
parent 2675ccf673
commit e98ec4e501
5 changed files with 75 additions and 18 deletions

View File

@@ -401,6 +401,61 @@ Clash of Clans is a long-running, free-to-play mobile strategy game by Supercell
),
expected=SCRAPING_TERMINATION_MESSAGE, # Should fall back to enquiry flow AFTER scraping
),
# Case: Niche music app with multiple bundle IDs
EvalCase(
input=(
"Snare Music",
EventTaxonomyItem(
property="$app_namespace",
sample_values=["com.jackqcook.snare", "com.snaremusic.snare"],
sample_count=2,
),
),
expected="""
__Here's what I found on Snare (com.jackqcook.snare / com.snaremusic.snare):__
Snare (aka Snare Music) is a social music-discovery app that converts your listening habits into a feed, letting you follow others, react to their plays, post reviews, and engage over music.
#### Product features
- Connects with streaming platforms (Spotify / Apple Music) to import recent listening history.
- Live social feed: shows what friends are currently listening to (or recently listened) in a feed format.
- Reaction / engagement tools: users can react (likes, comments) to others' plays.
- Reviews / commentary: ability to write reviews on albums/tracks within the app.
- Discovery / recommendation features: suggestions (called “Snare Samples” or algorithmic picks) based on user activity.
- Social graph: following system (you follow friends / users) to tailor the feed.
- Basic version is free; updates indicate bug fixes, UI tweaks, algorithm improvements (e.g. “better algorithm for Snare Samples”)
#### User / customer segments
- Music enthusiasts who like to see what peers are listening to and discuss music.
- Early adopters of social / discovery tools in the music space.
- Playlist curators, tastemakers, influencers who want social reach or community feedback.
- Users dissatisfied with “cold” algorithmic recommendations and seeking more human-curated or socially filtered discovery.
#### Business model
- No public disclosures of paid features or pricing (as of available data).
- Likely freemium: core features free, with potential premium tier for enhanced discovery / analytics / filtering / no ads (though not confirmed).
- Monetization might include sponsorships, affiliate revenue (for streaming referrals), or future paid features for power users.
- No clear revenue metrics or public funding data found.
#### Technical details
- Website: snaremusic.app — “Discover, rate, and share your favorite albums. Connect with friends … join conversations about the tracks that move you.”
- App version history: latest version 1.1.0 for iOS at least; update notes mention bug fixes, minor improvements.
- Key flows / URL paths likely include:
- /login / connect (to Spotify / Apple Music)
- /feed (social feed of plays)
- /profile / settings
- /review / comment pages
- /discover / algorithmic suggestions
- Mobile first (iOS, possibly Android expectation in future).
- The app appears “new” / early stage (version numbering low, frequent iterative changes).
Brief history
- Developer / “Quentin Cook” is listed in app metadata.
- First public version around August 2025 (v1.0 in August).
- Update cycle is active (versions 1.0 → 1.0.6 → 1.1.0) with feature tweaks like better algorithms, UI changes.
- The domain / branding is “Snare — the app for music discovery.
""".strip(),
),
],
pytestconfig=pytestconfig,
)

View File

@@ -203,7 +203,7 @@ class MemoryInitializerNode(MemoryInitializerContextMixin, AssistantNode):
else:
prompt += ChatPromptTemplate.from_messages(
[("human", INITIALIZE_CORE_MEMORY_WITH_BUNDLE_IDS_USER_PROMPT)], template_format="mustache"
).partial(bundle_ids=",".join(retrieved_prop.sample_values))
).partial(bundle_ids=", ".join(retrieved_prop.sample_values))
chain = prompt | self._model() | StrOutputParser()
answer = chain.invoke({}, config=config)
@@ -232,7 +232,7 @@ class MemoryInitializerNode(MemoryInitializerContextMixin, AssistantNode):
},
user=self._user,
team=self._team,
).bind_tools([{"type": "web_search_preview"}]) # We should use web_search once LangChain supports it
).bind_tools([{"type": "web_search"}])
class MemoryInitializerInterruptNode(AssistantNode):

View File

@@ -27,7 +27,7 @@ Each section should be concise and use bullet points for clarity. Do not repeat
Spend the most time on product details.
IMPORTANT: DO NOT INCLUDE CITATION TOKENS. CITATION LINKS ARE PROHIBITED.
DO NOT OFFER THE USER ANY INSTRUCTIONS. AVOID FOLLOW-UP SUGGESTIONS AND PROPOSALS.
IMPORTANT: DO NOT OFFER THE USER ANY INSTRUCTIONS. DO NOT OFFER FOLLOW-UP SUGGESTIONS OR PROPOSALS.
If the given domain doesn't exist OR no relevant data was found, then answer a single sentence:
"{SCRAPING_TERMINATION_MESSAGE}"
@@ -36,11 +36,13 @@ Do NOT make speculative or assumptive statements, just output that sentence 1:1
""".strip()
INITIALIZE_CORE_MEMORY_WITH_DOMAINS_USER_PROMPT = """
Provide an analysis of my product based on the following domain(s): {{domains}}.
Provide an analysis of my product based on the following domain(s): {{{domains}}}.
Search them individually.
""".strip()
INITIALIZE_CORE_MEMORY_WITH_BUNDLE_IDS_USER_PROMPT = """
Provide an analysis of my product based on the following app bundle ID(s): {{#bundle_ids}}{{.}}{{^last}}, {{/last}}{{/bundle_ids}}
Provide an analysis of my product based on the following app bundle ID(s): {{{bundle_ids}}}
Search them individually.
""".strip()

View File

@@ -66,7 +66,7 @@ dependencies = [
"kombu==5.3.2",
"langchain==0.3.26",
"langchain-community==0.3.27",
"langchain-openai==0.3.32",
"langchain-openai==0.3.33",
"langgraph==0.4.10",
"lxml==5.2.1",
"lzstring==1.0.4",
@@ -78,7 +78,7 @@ dependencies = [
"natsort==8.4.0",
"nh3==0.2.14",
"numpy==1.26.4",
"openai==1.102.0",
"openai==1.109.1",
"openpyxl==3.1.2",
"orjson==3.10.15",
"pandas==2.2.0",

22
uv.lock generated
View File

@@ -2960,7 +2960,7 @@ wheels = [
[[package]]
name = "langchain-core"
version = "0.3.75"
version = "0.3.76"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "jsonpatch" },
@@ -2971,23 +2971,23 @@ dependencies = [
{ name = "tenacity" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/06/63/270b71a23e849984505ddc7c5c9fd3f4bd9cb14b1a484ee44c4e51c33cc2/langchain_core-0.3.75.tar.gz", hash = "sha256:ab0eb95a06ed6043f76162e6086b45037690cb70b7f090bd83b5ebb8a05b70ed", size = 570876, upload-time = "2025-08-26T15:24:12.246Z" }
sdist = { url = "https://files.pythonhosted.org/packages/4f/4d/5e2ea7754ee0a1f524c412801c6ba9ad49318ecb58b0d524903c3d9efe0a/langchain_core-0.3.76.tar.gz", hash = "sha256:71136a122dd1abae2c289c5809d035cf12b5f2bb682d8a4c1078cd94feae7419", size = 573568, upload-time = "2025-09-10T14:49:39.863Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fb/42/0d0221cce6f168f644d7d96cb6c87c4e42fc55d2941da7a36e970e3ab8ab/langchain_core-0.3.75-py3-none-any.whl", hash = "sha256:03ca1fadf955ee3c7d5806a841f4b3a37b816acea5e61a7e6ba1298c05eea7f5", size = 443986, upload-time = "2025-08-26T15:24:10.883Z" },
{ url = "https://files.pythonhosted.org/packages/77/b5/501c0ffcb09c734457ceaa86bc7b1dd37b6a261147bd653add03b838aacb/langchain_core-0.3.76-py3-none-any.whl", hash = "sha256:46e0eb48c7ac532432d51f8ca1ece1804c82afe9ae3dcf027b867edadf82b3ec", size = 447508, upload-time = "2025-09-10T14:49:38.179Z" },
]
[[package]]
name = "langchain-openai"
version = "0.3.32"
version = "0.3.33"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "langchain-core" },
{ name = "openai" },
{ name = "tiktoken" },
]
sdist = { url = "https://files.pythonhosted.org/packages/7e/19/167d9ad1b6bb75406c4acceda01ef0dc1101c7f629f74441fe8a787fb190/langchain_openai-0.3.32.tar.gz", hash = "sha256:782ad669bd1bdb964456d8882c5178717adcfceecb482cc20005f770e43d346d", size = 782982, upload-time = "2025-08-26T14:25:27.917Z" }
sdist = { url = "https://files.pythonhosted.org/packages/ff/66/4245ffe1fed8cd3812be9d228be50baa406cbb0ef5bd7cb1d98d82dcfe37/langchain_openai-0.3.33.tar.gz", hash = "sha256:2dec058332ea9e8977cd91df6515b95952e187ac7484f349c3fe91d936a92375", size = 784533, upload-time = "2025-09-10T16:03:12.965Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e6/3d/e22ee65fff79afe7bdfbd67844243eb279b440c882dad9e4262dcc87131f/langchain_openai-0.3.32-py3-none-any.whl", hash = "sha256:3354f76822f7cc76d8069831fe2a77f9bc7ff3b4f13af788bd94e4c6e853b400", size = 74531, upload-time = "2025-08-26T14:25:26.542Z" },
{ url = "https://files.pythonhosted.org/packages/67/31/af0486b7ad8a49f3c5c852ca2b3a7f6d8526cc71a405045dd959c36ec5db/langchain_openai-0.3.33-py3-none-any.whl", hash = "sha256:2d52aab6d2af61da9bb9470616ce782128f4be59df965caee3dece30ae6b2bc4", size = 74961, upload-time = "2025-09-10T16:03:11.732Z" },
]
[[package]]
@@ -3528,7 +3528,7 @@ wheels = [
[[package]]
name = "openai"
version = "1.102.0"
version = "1.109.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
@@ -3540,9 +3540,9 @@ dependencies = [
{ name = "tqdm" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/07/55/da5598ed5c6bdd9939633854049cddc5cbac0da938dfcfcb3c6b119c16c0/openai-1.102.0.tar.gz", hash = "sha256:2e0153bcd64a6523071e90211cbfca1f2bbc5ceedd0993ba932a5869f93b7fc9", size = 519027, upload-time = "2025-08-26T20:50:29.397Z" }
sdist = { url = "https://files.pythonhosted.org/packages/c6/a1/a303104dc55fc546a3f6914c842d3da471c64eec92043aef8f652eb6c524/openai-1.109.1.tar.gz", hash = "sha256:d173ed8dbca665892a6db099b4a2dfac624f94d20a93f46eb0b56aae940ed869", size = 564133, upload-time = "2025-09-24T13:00:53.075Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/bd/0d/c9e7016d82c53c5b5e23e2bad36daebb8921ed44f69c0a985c6529a35106/openai-1.102.0-py3-none-any.whl", hash = "sha256:d751a7e95e222b5325306362ad02a7aa96e1fab3ed05b5888ce1c7ca63451345", size = 812015, upload-time = "2025-08-26T20:50:27.219Z" },
{ url = "https://files.pythonhosted.org/packages/1d/2a/7dd3d207ec669cacc1f186fd856a0f61dbc255d24f6fdc1a6715d6051b0f/openai-1.109.1-py3-none-any.whl", hash = "sha256:6bcaf57086cf59159b8e27447e4e7dd019db5d29a438072fbd49c290c7e65315", size = 948627, upload-time = "2025-09-24T13:00:50.754Z" },
]
[[package]]
@@ -4435,7 +4435,7 @@ requires-dist = [
{ name = "kombu", specifier = "==5.3.2" },
{ name = "langchain", specifier = "==0.3.26" },
{ name = "langchain-community", specifier = "==0.3.27" },
{ name = "langchain-openai", specifier = "==0.3.32" },
{ name = "langchain-openai", specifier = "==0.3.33" },
{ name = "langchain-perplexity", specifier = ">=0.1.1" },
{ name = "langgraph", specifier = "==0.4.10" },
{ name = "linkedin-api-client", specifier = ">=0.3.0" },
@@ -4450,7 +4450,7 @@ requires-dist = [
{ name = "natsort", specifier = "==8.4.0" },
{ name = "nh3", specifier = "==0.2.14" },
{ name = "numpy", specifier = "==1.26.4" },
{ name = "openai", specifier = "==1.102.0" },
{ name = "openai", specifier = "==1.109.1" },
{ name = "openpyxl", specifier = "==3.1.2" },
{ name = "opentelemetry-exporter-otlp-proto-grpc", specifier = "==1.33.1" },
{ name = "opentelemetry-instrumentation-aiokafka", specifier = "==0.54b1" },