This folder contains 2 scripts which leverage the Claude Agents SDK to automatically populate the data of the AI Deadlines web app.
First create a keys.env file at the root of the repository which contains the following environment variables:
ANTHROPIC_API_KEY=
GITHUB_PAT=
EXA_API_KEY=In case you want to leverage MiniMax 2.1 instead of Claude, get your API key from https://platform.minimax.io/ and add the following:
ANTHROPIC_BASE_URL=https://api.minimax.io/anthropicNext, the agent can be run like so on a conference of choice:
uv run --env-file keys.env -m agents.agent --conference_name neuripsThe agent will automatically fetch relevant information from the web using the Exa MCP server to populate the data at src/data/conferences and open a pull request.
To automatically let the AI agents populate deadlines data, we leverage Modal's serverless infrastructure.
- Install Modal:
uv add modal - Authenticate:
uv run modal setup - Create the required secrets:
uv run modal secret create anthropic ANTHROPIC_API_KEY=<your-api-key>
uv run modal secret create github-token GH_TOKEN=<token-with-repo-and-pr-scope>
uv run modal secret create exa EXA_API_KEY=<your-key>Note: The
GH_TOKENneeds thereposcope (for cloning, pushing, and creating pull requests).
uv run modal run agents/modal_agent.py --conference-name neuripsBy default (no flags), the script processes all conferences in parallel — each in its own Modal container:
uv run modal run agents/modal_agent.pyYou can also be explicit:
uv run modal run agents/modal_agent.py --all-conferencesTo test with a limited number of conferences, use the --limit flag:
uv run modal run agents/modal_agent.py --limit 3To deploy the agent so it runs automatically every week (Sunday at midnight UTC):
uv run modal deploy agents/modal_agent.pyThe structure looks as follows:
flowchart LR
A1["Retrieval Agent 1"] --> V["Aggregation Agent\n(majority vote)"]
A2["Retrieval Agent 2"] --> V
A3["Retrieval Agent 3"] --> V
V -->|"selected result"| B["Verification Agent"]
B -->|"structured output: reasoning + verdict"| C{verdict?}
C -->|true| D["PR Agent"]
C -->|false| E["Return: no PR"]
D -->|"structured output: PR result"| F["Return result"]