agentleFS
Sign inSign up

code-review

langchain-ai/langchain-azure/.github/skills/code-review/SKILL.md

Reviews changes in the langchain-azure monorepo using package-specific knowledge of langchain-azure-ai, langchain-azure-compute, langchain-azure-cosmosdb, langchain-azure-postgresql, langchain-azure-storage, langchain-sqlserver, and langchain-azure-dynamic-sessions, together with the LangChain, LangGraph, Deep Agents, and Azure SDK contracts each package must satisfy. Use this skill whenever reviewing a pull request or diff, checking code for bugs or regressions, or assessing changes under libs/, samples/, or .github/ in this repository, including when the request is only to "review", "check", "look at", or "give feedback on" a change, and even when no package is named explicitly.

Skill145 starsChanged 20 days ago
---
name: code-review
description: >-
  Reviews changes in the langchain-azure monorepo using package-specific
  knowledge of langchain-azure-ai, langchain-azure-compute,
  langchain-azure-cosmosdb, langchain-azure-postgresql, langchain-azure-storage,
  langchain-sqlserver, and langchain-azure-dynamic-sessions, together with the
  LangChain, LangGraph, Deep Agents, and Azure SDK contracts each package must
  satisfy. Use this skill whenever reviewing a pull request or diff, checking
  code for bugs or regressions, or assessing changes under libs/, samples/, or
  .github/ in this repository, including when the request is only to "review",
  "check", "look at", or "give feedback on" a change, and even when no package
  is named explicitly.
license: MIT
---

# Reviewing langchain-azure changes

Every directory under `libs/` is a separately versioned, separately released
package with its own maintainers, dependency manager, conventions, and upstream
contracts. A finding is only useful if it is correct *for the package it lands
in*, so the first job in any review is to work out which package changed and
load that package's rules before judging anything.

## What to report

Report defects the change introduces: incorrect behavior, broken edge cases,
regressions in released public API, violations of an upstream contract
(LangChain, LangGraph, Deep Agents, Azure SDK), breakage on a supported Python
version, and security, credential-leak, data-loss, resource-leak, or
concurrency problems.

Stay silent about everything else. In particular, do not comment on formatting,
naming, or docstring wording that `ruff` and `mypy` already enforce; do not
restate what the diff does; do not raise pre-existing issues the change merely
touches; and do not suggest refactors that are not required for correctness.
Returning no comments on a correct change is a good review — never manufacture
findings to look thorough.

Copilot code review never sees `**/*.lock`, `**/*.svg`, `**/*.log`, or
`**/dist/**`, so `uv.lock` is invisible to you. Excluded files are also stripped
from the file list you receive, so you cannot tell a lockfile that was never
updated from one that was updated and hidden from you. Never write a finding
about lockfile contents *or* lockfile presence; instead, see the lockfile
gotcha below.

## Review workflow

1. **Identify the packages touched.** Group changed files by `libs/<package>/`.
   Treat each package as an independent review.
2. **Load the package's rules** from the routing table below, plus any
   `AGENTS.md` or `.github/copilot-instructions.md` along the changed path. The
   repository root `AGENTS.md` is already in your context; do not re-derive it.
3. **Read enough surrounding code** to know what the changed lines actually do:
   the function, its callers, its sync or async twin, and the nearest tests.
   Never review a hunk in isolation.
4. **Check the upstream contract** for the base class being implemented, using
   [ecosystem contracts](references/ecosystem-contracts.md) and
   [Azure SDK contracts](references/azure-sdk-contracts.md).
5. **Confirm each finding** before writing it. A finding must satisfy all four:
   the changed code causes it; a realistic supported input or code path reaches
   it; the consequence is concrete; and you can point at the specific lines. If
   any of these is missing, drop it.

## Package routing

Read the file for each package that changed. Skip the rest.

| Changed path | Package | Read |
|---|---|---|
| `libs/azure-ai/` | `langchain-azure-ai` | [azure-ai.md](references/azure-ai.md) |
| `libs/azure-compute/` | `langchain-azure-compute` | [azure-compute.md](references/azure-compute.md) |
| `libs/azure-cosmosdb/` | `langchain-azure-cosmosdb` | [azure-cosmosdb.md](references/azure-cosmosdb.md) |
| `libs/azure-postgresql/` | `langchain-azure-postgresql` | [azure-postgresql.md](references/azure-postgresql.md) |
| `libs/azure-storage/` | `langchain-azure-storage` | [azure-storage.md](references/azure-storage.md) |
| `libs/sqlserver/` | `langchain-sqlserver` | [sqlserver.md](references/sqlserver.md) |
| `libs/azure-dynamic-sessions/` | deprecated | [azure-dynamic-sessions.md](references/azure-dynamic-sessions.md) |
| `.github/`, `samples/`, root docs | repo infrastructure | [repo-infrastructure.md](references/repo-infrastructure.md) |

Also read [ecosystem contracts](references/ecosystem-contracts.md) when the
change implements or overrides a LangChain, LangGraph, or Deep Agents base
class, and [Azure SDK contracts](references/azure-sdk-contracts.md) when it
constructs an Azure client, handles credentials, or maps service errors.

## Repository gotchas

These are the mistakes that pass local review and break later. They are
specific to this repository and override any general instinct.

- **Never report a missing or stale `uv.lock`.** CI runs `uv lock --check` on
  every touched package and fails the PR if a lockfile is stale or absent, so
  this is already gated far more reliably than you can infer it. You cannot
  observe lockfiles: they are excluded from your view *and* omitted from the
  file list you receive. A reviewed-file count below the PR's total changed-file
  count (for example "30/37 files reviewed") means excluded files exist, and on
  a dependency change those are almost always the very `uv.lock` updates you
  would otherwise flag as missing. Absence of evidence here is not evidence of
  absence — stay silent and let CI decide.
- **Raising the minimum Python version is not a breaking change here.** The
  repository follows a Python support policy, and dropping an end-of-life
  interpreter changes no API or behavior on any still-supported version.
  `requires-python` makes older runtimes resolve to the previous release rather
  than install an incompatible one, so nothing breaks silently. These ship as
  patch releases; demanding a `**[Breaking change]:**` marker on one
  contradicts the version being shipped. Do not ask for that marker on a
  support-policy change — see
  [release-notes](../release-notes/SKILL.md) for the classification rules.
- **CI only runs Python 3.11 and 3.14, but the support range is 3.11–3.14.**
  A construct that breaks only on 3.12–3.13 passes CI. Reason about the whole
  range rather than trusting a green build.
- **`langchain-azure-compute` enforces 100% coverage** (`fail_under = 100`).
  A new uncovered branch there fails CI, so a new `if` or `except` without a
  test is a real finding in that package only.
- **`langchain-azure-ai` lazy imports must be updated in three places** — the
  `TYPE_CHECKING` import, `__all__`, and `_module_lookup`. Updating fewer makes
  the symbol import-time-invisible or `__all__`-inconsistent, and unit tests
  catch only some of these.
- **Deprecation decorators differ per package.** `azure-ai` and
  `azure-dynamic-sessions` use their own `_api.base` (`deprecated`,
  `experimental`); the other packages use `langchain_core._api` (`beta`,
  `deprecated`). Do not flag one package for using the other's convention.
- **New Azure client construction must stamp the package user agent.** Each
  package defines its own constant or helper (`USER_AGENT`, `_user_agent`,
  `get_user_agent`, `with_user_agent`). A new client path that omits it
  silently drops partner telemetry attribution.
- **`asyncio_mode = "auto"`** in every package: async tests need no
  `@pytest.mark.asyncio`. Do not ask for it.
- **`--strict-markers` and `--strict-config`** are set: a new `pytest.mark.*`
  must be registered in that package's `pyproject.toml` or collection fails.
- **`azure-cosmosdb`'s local instructions still describe `poetry`**, but its
  `Makefile` and CI use `uv run --frozen`. The `Makefile` is authoritative;
  do not flag correct `uv` usage there.
- **`azure-postgresql`'s local instructions ask for Sphinx-style docstrings**
  while its `ruff` config sets `pydocstyle` convention to `google`. Follow the
  style already used in the file being changed and raise no docstring-style
  findings in that package.
- **Unit tests must not touch the network.** `azure-ai` enforces this with
  `pytest-socket`; the same expectation applies everywhere. A new unit test that
  reaches a live service is a finding.

## Severity

Copilot code review labels comments High, Medium, or Low. Use that vocabulary.

- **High** — data loss, credential or secret exposure, a regression in released
  public API, or a failure most users of the changed path will hit.
- **Medium** — a real correctness, compatibility, or resource-handling defect
  on a narrower but supported path.
- **Low** — a genuine but minor defect worth fixing.

If a finding does not clear the Low bar, leave it out.

## Comment format

Keep each comment to the smallest useful line range and this shape:

> **[Severity] Short imperative title**
>
> What breaks, and the specific input or code path that triggers it. Which
> contract or package rule it violates. One concrete suggested fix, only when
> it is short and unambiguous.

Cite the contract by name (for example, "`VectorStore.get_by_ids` must not
raise for missing IDs") rather than linking to documentation, and prefer one
precise sentence over a paragraph of hedging.

Discussion

Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.

Posts are public.Sign in to post

No one has posted yet. Be the first.