Restores the two-banner sponsor section before Run one now, with
Vorflux in spot 1 and Become a Sponsor in spot 2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove pathlib==1.0.1 from ai_tic_tac_toe_agent/requirements.txt. This is the
abandoned 2012 backport of the stdlib module that can shadow and break Python's
built-in pathlib on modern Python. The code already uses `from pathlib import
Path` (stdlib), so the package is unnecessary.
Migrate PyPDF2 to pypdf in two projects (ai_recruitment_agent_team and
rag_chain). PyPDF2 is deprecated and had a ReDoS vulnerability (CVE-2023-36810).
The maintained successor is pypdf, which the rest of the repo already uses in
10+ other projects. The PdfReader API is identical:
- import PyPDF2 -> import pypdf
- PyPDF2.PdfReader -> pypdf.PdfReader
Files changed:
- ai_tic_tac_toe_agent/requirements.txt: removed pathlib==1.0.1
- ai_recruitment_agent_team/requirements.txt: PyPDF2==3.0.1 -> pypdf>=4.0.0
- ai_recruitment_agent_team/ai_recruitment_agent_team.py: import and usage
- ai_recruitment_agent_team/README.md: updated tech stack mention
- rag_chain/requirements.txt: PyPDF2 -> pypdf>=4.0.0
Replaces advisor_skill.png with advisor_skill.jpeg (1504x704,
527K vs 1.6M) and points the README at the new file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
New diagram shows the Gemini 3.7 Flash worker tier. Image is
committed alongside the skill and referenced relatively instead
of via a github user-attachments URL.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bumps the default worker model from gemini-3.5-flash to
gemini-3.7-flash across the skill docs, the agy CLI dispatch
snippet, and the bare Gemini API fallback endpoint.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Committed lockfiles (package-lock.json, uv.lock, pnpm-lock.yaml, and
others) are kept for reproducible installs but flagged linguist-generated
so GitHub collapses them in diffs and excludes them from language stats.
This keeps PRs that ship lockfiles small and reviewable without dropping
reproducibility.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0174eaH6iN7hAo2BGWKXjd3S
Addresses maintainer review on #871: embeds a demo GIF of the real
upload -> extract -> expand -> chat flow, documents why gpt-4o is the
shipped default (prompted-JSON extraction, not function-calling tuned,
so OPENAI_MODEL swaps should work), and bumps langgraph-api past its
EOL 0.9.0 pin.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- corrective_rag: route .pdf URLs to PyPDFLoader (WebBaseLoader was running an
HTML parser over the default arXiv PDF and embedding decoded garbage); and only
ingest when the source changes — Streamlit re-runs the script on every question,
so it was deleting the collection and re-embedding the whole document each time.
- agentic_rag_math_agent: KB gate was 'similarity > 0.', which passes for almost
any query (cosine sim of OpenAI embeddings is ~always >0), so an arbitrary KB
answer was served as authoritative with 'do not recalculate'. Require >= 0.80.
- knowledge_graph_rag_citations: semantic_search did Neo4j CONTAINS on the whole
question, which never matches an entity; tokenize and match any term
case-insensitively.
- ai_blog_search: create the Qdrant collection before constructing
QdrantVectorStore (which validates and 404s on a fresh instance).
All four compile-check clean.
Co-authored-by: thejesh23 <thejesh23@users.noreply.github.com>
- ai_consultant_agent: wrap tools with @functools.wraps so ADK's
inspect.signature() sees the real parameters. A bare *args/**kwargs wrapper is
declared to Gemini with zero params, so every consultant tool call failed with
a missing-argument error.
- ai_customer_support_agent: set mem0 config version 'v1.1'. mem0 defaults to
v1.0, whose search()/get_all() return a bare list, so 'results' in memories was
always False and no past interaction was ever fed to the model.
- ai_agent_governance: an ALLOW PolicyResult with is_terminal=True short-circuited
evaluation before the approval rule, so delete_file ran WITHOUT approval whenever
its path was allow-listed. Don't let an explicit allow end evaluation; a later
deny/approval rule now wins. Verified: delete_file -> REQUIRE_APPROVAL (was ALLOW),
read_file still ALLOW, execute_shell still REQUIRE_APPROVAL.
Co-authored-by: thejesh23 <thejesh23@users.noreply.github.com>
- ai_travel_planner_agent_team/client (plan/page.tsx): the 'Number of children'
NumberInput had min={1} while the form default is 0, so once incremented it
could never return to 0 and submitted children:1. Set min={0} (adults/rooms
stay min={1}).
- multimodal_video_moment_finder/frontend (app/page.tsx): jumpToMoment seeked
after a fixed 100ms setTimeout; on a cross-video jump the new <video src>
hasn't loaded yet, so the seek is clamped and playback starts at 0. Seek on the
new file's 'loadeddata' event when switching videos.
- ai_negotiation_battle_simulator/frontend (src/app/page.tsx): the poll
setInterval was a local var cleared only on a terminal status, with no useEffect
cleanup, so it kept fetching/setState after unmount and polled forever if the
run never terminated. Own the handle in a ref and clear it on unmount.
- ai_music_generator_agent + chat_arxiv_llama3: drop Agent(show_tool_calls=True);
agno 2.x removed the parameter, so both crash with TypeError on startup
(chat_arxiv_llama3 at import; sibling chat_arxiv.py already omits it).
- cursor_ai_experiments/multi_agent_researcher: Crew(verbose=2) -> verbose=True;
current CrewAI's verbose is a strict pydantic bool, so 2 raises ValidationError
and the crew never runs.
- toonify_token_optimization/{toonify_app,toonify_demo}: guard
tiktoken.encoding_for_model with try/except KeyError -> cl100k_base; selecting a
claude-3-* model (offered in the UI) otherwise crashes the token-count tab.
- ai_data_visualisation_agent: uploaded_file.seek(0) before uploading to the
sandbox; pd.read_csv had already consumed the stream to EOF, so a 0-byte file
was uploaded and every analysis read an empty dataset.
- ai_data_analysis_agent: remove the manual '"' -> '""' replacement; csv.QUOTE_ALL
already escapes quotes, so the two together double-escaped every quoted cell.
Verified round-trip: 'He said "hi"' now preserved (was 'He said ""hi""').
All seven files compile-check clean.
- multi_agent_trust_layer: DelegationScope.narrow() intersected allowed_actions
sets, and allows_action() treated an EMPTY set as 'all allowed'. So a
sub-delegation whose scope didn't overlap the parent's collapsed to an empty
set and thus permitted EVERYTHING (privilege escalation). Use None as the
'all allowed' sentinel; an empty intersection now permits nothing. Verified:
parent{web_search,summarize}.narrow(child{read_document}) -> allows delete_file
False (was True).
- ai_domain_deep_research_agent: 'Compile Final Report' was nested inside the
'Start Research' button block, so clicking it reran the script with Start
Research False and the button was never rendered — the report was unreachable.
Hoist it out, gate on st.session_state.question_answers.
- ai_home_renovation_agent/tools.py + multimodal_uiux_feedback_agent_team/tools.py:
the asset version counter was clobbered by save_artifact()'s return value (ADK's
per-filename revision), so repeated generations for one asset collided on the
same filename and overwrote each other. Keep the version from
get_next_version_number; don't rebind it.
All four files compile-check clean.
- x_post_extractor.py: the display-name selector was hardcoded to match 'Henrik',
so user_display_name/user_profile_pic_url were NULL for every other author (and
the avatar selector was pinned to one account's data-testid). Use generic
selectors (first profile anchor without '@'; UserAvatar-Container- prefix).
- social_media_service.get_engagement_stats: AVG()/MAX() over zero matching rows
return NULL while COUNT(*)=0, so the 'if not result' guard never fires and
summing None raised HTTP 500 on any empty date range / fresh install. Coalesce
the aggregates to 0.
- x_scraper.crawl_x_profile: the pending sentiment-analysis queue was flushed only
on KeyboardInterrupt, so a partial final batch on a normal exit was dropped
(posts left with NULL sentiment forever) and the connection leaked. Flush after
the loop on every exit path.
All three compile-check clean.
- Make stdlib-shadowing and abandoned-backport mutually exclusive so a
name that is both (e.g. pathlib, dataclasses) yields one root-cause
finding instead of two or three.
- Skip conflicting-constraints between same-package entries carrying
differing non-python_version markers (e.g. platform_system Linux vs
Darwin), which are idiomatic platform splits, not conflicts.
- Soften the SKILL.md/README pitch to what the tool actually does
(surface-level direct-manifest footguns), not diagnosing failed resolves.
recruitment_agent_team pinned both phidata and agno; drop the stray
phidata line. teaching_agent_team still pinned composio-phidata and
imported composio_phidata, left over from the repo-wide Phidata->Agno
migration; switch to composio-agno (same Action/ComposioToolSet API).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- release_radar_agent/radar.py: _extract_version returned matches[-1], the
exclusive upper bound of a version range (e.g. '>=1.10.0,<2.0.0' -> '2.0.0'),
so build_release_candidates saw no delta and suppressed every alert. Use
matches[0] (the pinned/lower bound). Exact pins/tags give a single match, so
the 5 shipped unit tests still pass.
- customer_support_voice_agent.py: the Text-to-Speech Agent is invoked via
Runner.run (chat endpoint) but was built with model='gpt-4o-mini-tts', a
speech-only model, so every query errored. Use 'gpt-4o' (matching the sibling
voice_rag_openaisdk app); the real speech call at line 288 keeps gpt-4o-mini-tts.
Fixes#1019
Co-authored-by: thejesh23 <thejesh23@users.noreply.github.com>
- utils/crawl_url.py: match 'og:' (not 'ogg:') so OpenGraph metadata is
captured; no page emits property='ogg:...', so metadata['og'] was always {}.
- tools/browser_crawler.py: both failure branches now return 'original_url'
(snake_case, matching the success path and every caller). Previously a single
failed URL raised KeyError('original_url') in the caller's dict comprehension
and lost the whole scrape batch instead of just that URL.
Fixes#1017
Co-authored-by: thejesh23 <thejesh23@users.noreply.github.com>