langchain-ai/deepagents · error · RuntimeError

The server criteria agent returned no complete proposal.

Error message

The server criteria agent returned no complete proposal.

What it means

During a goal-criteria update, a server-side LLM agent proposes the objective and criteria. `_update` parses the agent's result and, if no well-formed proposal can be extracted (empty criteria, near-miss JSON, or plain prose instead of the expected structure), it logs the raw result and raises this `RuntimeError`.

Source

Thrown at libs/code/deepagents_code/goal_rubric.py:1441

        Returns:
            State updates that persist the proposal and end the parent run.

        Raises:
            RuntimeError: If the nested agent returned no complete proposal.
            GoalStateSizeError: If the objective and criteria that will actually
                be applied exceed the combined notice budget.
        """
        proposal = _proposal_from_result(result)
        if proposal is None:
            # Log the raw nested output so repeated failures are diagnosable —
            # the RuntimeError message alone cannot say whether the model emitted
            # empty criteria, near-miss JSON, or prose.
            logger.warning(
                "Criteria agent returned no complete proposal; raw result: %s",
                _summarize_criteria_result(result),
            )
            msg = "The server criteria agent returned no complete proposal."
            raise RuntimeError(msg)
        proposed_objective, criteria = proposal
        objective = (
            request["objective"] if request["kind"] == "create" else proposed_objective
        )
        # `GoalProposal._fit_notice_budget` validated the objective the model
        # echoed back, but a `create` applies the user's original. The model is
        # told to preserve it verbatim and nothing enforces that. A paraphrase can
        # therefore fit the limit while the applied pair exceeds it. Validate what
        # is actually applied.
        try:
            validate_goal_application(objective, criteria)
        except GoalStateSizeError:
            # The raised message names only the combined total, which is opaque
            # to a user who typed an objective and never saw the criteria. Log
            # the parts so the split is recoverable from the logs.
            logger.warning(
                "Applied goal proposal exceeds the combined budget: objective "
                "%d chars (model proposed %d), criteria %d chars",

View on GitHub (pinned to a1af029e6e)

Solutions

  1. Retry the goal create/amend command — model output is non-deterministic and a retry usually yields a parseable proposal.
  2. Check the warning log line (`Criteria agent returned no complete proposal; raw result: ...`) to see what the model actually returned.
  3. Switch the criteria-agent to a stronger model configuration.
  4. Shorten the objective/criteria input (limits are 8000/12000 chars) to reduce truncation risk.
Defensive patterns

Strategy: retry

Validate before calling

import json
def looks_parseable(raw) -> bool:
    if not isinstance(raw, str) or not raw.strip():
        return False
    try:
        parsed = json.loads(raw)
    except (json.JSONDecodeError, TypeError):
        return False
    return isinstance(parsed, dict) and bool(parsed.get("criteria"))

Type guard

def is_complete_proposal(proposal) -> bool:
    return (
        isinstance(proposal, tuple)
        and len(proposal) == 2
        and all(isinstance(part, str) and part.strip() for part in proposal)
    )

Try / catch

from deepagents_code.goal_rubric import RuntimeError  # raised where?
try:
    apply_goal_rubric(request)
except RuntimeError as e:
    if "no complete proposal" in str(e):
        log.warning("criteria agent returned unparseable output, retrying")
        apply_goal_rubric(request)  # model output is non-deterministic

Prevention

When it happens

Trigger: The criteria agent's model returns malformed output: prose instead of the structured proposal, truncated JSON, an empty response, or a response missing the criteria — typically on weak/fast models, long inputs near the char limits, or rate-limit-degraded responses.

Common situations: Non-deterministic model failures during `/goal` create/amend flows; misconfigured criteria-agent model (unreliable provider, low-quality fallback model); network issues causing partial responses that the retry layer surfaced as garbage.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/81bd40ee9b973dcd. Report an issue: GitHub.