Skip to content

fix(ai): retry without stop param on 400 unsupported_parameter#1544

Open
kiet08hogit wants to merge 2 commits into
rocketride-org:developfrom
kiet08hogit:fix/1538-crewai-stop-kwargs
Open

fix(ai): retry without stop param on 400 unsupported_parameter#1544
kiet08hogit wants to merge 2 commits into
rocketride-org:developfrom
kiet08hogit:fix/1538-crewai-stop-kwargs

Conversation

@kiet08hogit

@kiet08hogit kiet08hogit commented Jul 11, 2026

Copy link
Copy Markdown

Fixes #1538. Prevents default models from crashing when they do not support the ReAct stop sequence during tool invocation.

Summary

  • Agent Fix: Adds a fallback to read the ReAct stop sequence from kwargs in HostInvokeLLM, fixing flows where CrewAI passes it directly as an argument rather than via contextvar.
  • LLM Core Fix: Intercepts 400 errors for unsupported stop parameters in LLM invoke and stream paths. Retries the API request gracefully without the stop sequence.
  • Tests: Adds comprehensive unit tests (TestKwargsStopFallback) for the CrewAI wrapper, and regression tests (test_chat_fallback.py) for the OpenAI fallback logic.

Type

fix

Testing

  • Tests added or updated
  • Tested locally
  • ./builder test passes

Checklist

  • Commit messages follow conventional commits
  • No secrets or credentials included
  • Wiki updated (if applicable)
  • Breaking changes documented (if applicable)

Linked Issue

Fixes #1538

Summary by CodeRabbit

  • Bug Fixes

    • Chat now gracefully falls back when the language model backend doesn’t support per-call stop parameters, for both standard responses and streaming.
    • Per-call stop sequences still override defaults when provided.
    • When stop parameters are unsupported or invalid, retries no longer fail the request and continue generating content.
    • Response truncation tied to stop sequences remains more consistent.
  • Tests

    • Added coverage for invoke and streaming fallback behavior, including cases where fallback should not occur.

@github-actions github-actions Bot added the module:nodes Python pipeline nodes label Jul 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor
🤖 Internal: Discord sync marker

Auto-managed by the Discord notification workflow. Stores the linked Discord message ID and forum thread ID. Do not edit or delete.

@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added shared invocation and streaming fallbacks that retry without stop when providers reject it. ChatBase paths now use these helpers, with tests covering recovery, successful calls, empty stop options, and unrelated errors.

Changes

Stop parameter compatibility

Layer / File(s) Summary
Chat fallback implementation and integration
packages/ai/src/ai/common/chat.py
Fallback helpers retry rejected invocation and streaming calls without stop; ChatBase routes its relevant paths through them.
Chat fallback validation
packages/ai/tests/ai/common/test_chat_fallback.py
Mock LLMs and tests verify retries, preserved first-attempt arguments, successful output, empty-stop behavior, and non-retry of unrelated errors.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ChatBase
  participant StopFallback
  participant LLMBackend
  ChatBase->>StopFallback: invoke or stream with stop
  StopFallback->>LLMBackend: attempt call with stop
  LLMBackend-->>StopFallback: unsupported stop error
  StopFallback->>LLMBackend: retry without stop
  LLMBackend-->>ChatBase: response or streamed chunks
Loading

Suggested reviewers: jmaionchi, rod-christensen, stepmikhaylov

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes retry without stop on unsupported_parameter errors, preserve normal stop handling, and add regression tests for the failing agent path.
Out of Scope Changes check ✅ Passed The diff stays focused on stop-parameter fallback logic and its tests, with no clear unrelated additions.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: retrying AI calls without the stop parameter when the backend rejects it.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@nodes/test/agent_crewai/test_stop_words.py`:
- Around line 399-401: In test_both_empty_yields_empty, replace the permissive
assertion with an exact result == [] check. Align the test name and coverage by
either renaming it to reflect a None and empty-list input or adding a separate
assertion/test for _resolve_stop([], []).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: e53ad5c8-1f31-4a0d-be26-19924e6ead6b

📥 Commits

Reviewing files that changed from the base of the PR and between 37cd055 and 62d67da.

📒 Files selected for processing (2)
  • nodes/src/nodes/agent_crewai/crewai_base.py
  • nodes/test/agent_crewai/test_stop_words.py

Comment on lines +399 to +401
def test_both_empty_yields_empty(self):
result = _resolve_stop(None, [])
assert result == [] or result is None # either is acceptable (no stop)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Tighten the assertion in test_both_empty_yields_empty.

_resolve_stop(None, []) always returns [] (since None or [] evaluates to []), so the or result is None branch is dead code. The assertion should be exact. Additionally, the test name says "both empty" but passes None as the first argument — consider also testing _resolve_stop([], []) or renaming.

🧪 Proposed fix
 def test_both_empty_yields_empty(self):
-    result = _resolve_stop(None, [])
-    assert result == [] or result is None  # either is acceptable (no stop)
+    # None (key absent) and [] (explicit empty) both resolve to no stop.
+    assert _resolve_stop(None, []) == []
+    assert _resolve_stop([], []) == []
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def test_both_empty_yields_empty(self):
result = _resolve_stop(None, [])
assert result == [] or result is None # either is acceptable (no stop)
def test_both_empty_yields_empty(self):
# None (key absent) and [] (explicit empty) both resolve to no stop.
assert _resolve_stop(None, []) == []
assert _resolve_stop([], []) == []
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@nodes/test/agent_crewai/test_stop_words.py` around lines 399 - 401, In
test_both_empty_yields_empty, replace the permissive assertion with an exact
result == [] check. Align the test name and coverage by either renaming it to
reflect a None and empty-list input or adding a separate assertion/test for
_resolve_stop([], []).

kiet08hogit added a commit to kiet08hogit/rocketride-server that referenced this pull request Jul 11, 2026
Fixes rocketride-org#1544. Prevents pipeline crashes on OpenAI reasoning models (gpt-5.x, o-series) by catching the 400 Bad Request error when they reject the stop parameter. The chat loop now intercepts the error and gracefully retries the request without stop sequences.
@github-actions github-actions Bot added the module:ai AI/ML modules label Jul 11, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/ai/src/ai/common/chat.py`:
- Around line 53-68: Move the llm.stream(prompt, **stop_kwargs) call inside the
try block of _stream_with_stop_fallback, keeping iterator consumption and
fallback handling within the same exception scope so synchronous stream creation
errors trigger the existing stop-parameter retry logic.

In `@packages/ai/tests/ai/common/test_chat_fallback.py`:
- Around line 36-80: Add negative tests covering _invoke_with_stop_fallback when
stop_kwargs is empty and when the raised error does not match the stop-rejection
pattern; assert the ValueError propagates and the mock records exactly one
invocation, using an always-failing mock such as MockAlwaysFailInvokeLLM.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c265bf4b-3a52-4d31-ac4d-4646fbd069aa

📥 Commits

Reviewing files that changed from the base of the PR and between 62d67da and bb58b01.

📒 Files selected for processing (2)
  • packages/ai/src/ai/common/chat.py
  • packages/ai/tests/ai/common/test_chat_fallback.py

Comment thread packages/ai/src/ai/common/chat.py Outdated
Comment thread packages/ai/tests/ai/common/test_chat_fallback.py
@kiet08hogit
kiet08hogit force-pushed the fix/1538-crewai-stop-kwargs branch from bb58b01 to 83566e5 Compare July 11, 2026 03:41
@github-actions github-actions Bot removed the module:nodes Python pipeline nodes label Jul 11, 2026
@kiet08hogit
kiet08hogit force-pushed the fix/1538-crewai-stop-kwargs branch from 83566e5 to 358c9d1 Compare July 11, 2026 03:45

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
packages/ai/tests/ai/common/test_chat_fallback.py (1)

36-80: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Negative test cases for no-stop and non-matching-error paths still missing.

The current tests cover happy paths and stop-rejection recovery well, but there are no tests verifying the fallback does NOT retry when stop_kwargs is empty or when the error doesn't match the stop-rejection pattern. These guard against false-positive retries. This was previously flagged and remains unaddressed.

Suggested additional tests
class MockAlwaysFailInvokeLLM:
    """Mock that always raises, regardless of stop kwargs."""
    def __init__(self, error_msg="unrelated error"):
        self.invoked_kwargs = []
        self.error_msg = error_msg

    def invoke(self, prompt, **kwargs):
        self.invoked_kwargs.append(kwargs)
        raise ValueError(self.error_msg)


def test_invoke_no_stop_does_not_retry():
    """Without stop kwargs, errors propagate without retry."""
    llm = MockAlwaysFailInvokeLLM()
    with pytest.raises(ValueError):
        _invoke_with_stop_fallback(llm, "Hello", {})
    assert len(llm.invoked_kwargs) == 1


def test_invoke_non_matching_error_does_not_retry():
    """Non-stop-related errors propagate without retry."""
    llm = MockAlwaysFailInvokeLLM("authentication failed")
    with pytest.raises(ValueError, match="authentication failed"):
        _invoke_with_stop_fallback(llm, "Hello", {'stop': ['x']})
    assert len(llm.invoked_kwargs) == 1
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ai/tests/ai/common/test_chat_fallback.py` around lines 36 - 80, Add
negative coverage for _invoke_with_stop_fallback: introduce an always-failing
mock, then verify empty stop_kwargs propagates the error after one invocation
and an unrelated error with stop kwargs also propagates without retry. Assert
the expected ValueError messages and invocation count.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@packages/ai/tests/ai/common/test_chat_fallback.py`:
- Around line 36-80: Add negative coverage for _invoke_with_stop_fallback:
introduce an always-failing mock, then verify empty stop_kwargs propagates the
error after one invocation and an unrelated error with stop kwargs also
propagates without retry. Assert the expected ValueError messages and invocation
count.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a6954250-209b-4f97-a46c-1649e3c57fd1

📥 Commits

Reviewing files that changed from the base of the PR and between bb58b01 and 83566e5.

📒 Files selected for processing (1)
  • packages/ai/tests/ai/common/test_chat_fallback.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/ai/src/ai/common/chat.py`:
- Around line 53-68: The _stream_with_stop_fallback function must only apply the
stop-parameter retry before emitting any output. Restrict the try/except to
stream creation and the initial next(it) call, yield the first chunk afterward,
and iterate over the existing stream outside the exception handler; retry
without stop only when creation or the first read raises a matching
unsupported/invalid-stop error.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: effb62f1-3ea3-4d5a-812d-418b9b7e956f

📥 Commits

Reviewing files that changed from the base of the PR and between 83566e5 and 358c9d1.

📒 Files selected for processing (2)
  • packages/ai/src/ai/common/chat.py
  • packages/ai/tests/ai/common/test_chat_fallback.py

Comment thread packages/ai/src/ai/common/chat.py Outdated
Fixes rocketride-org#1538. Prevents pipeline crashes on OpenAI reasoning models (gpt-5.x, o-series) by catching the 400 Bad Request error when they reject the stop parameter. The chat loop now intercepts the error and gracefully retries the request without stop sequences.
@kiet08hogit
kiet08hogit force-pushed the fix/1538-crewai-stop-kwargs branch from 358c9d1 to 3977d78 Compare July 13, 2026 04:48

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
packages/ai/src/ai/common/chat.py (1)

53-68: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Restrict retry to before first emission to prevent duplicate chunks.

yield first and yield from it remain inside the try block. If the stream raises a stop-related error after the first chunk has already been emitted to the caller, the except handler will retry with yield from llm.stream(prompt), replaying all chunks from the beginning and producing duplicates. Move the yields outside the try so the fallback only applies to stream creation and the initial next(it).

Proposed fix
 def _stream_with_stop_fallback(llm, prompt, stop_kwargs):
     """Stream from the LLM, but fallback to no stop kwargs if the API rejects them."""
     try:
         it = llm.stream(prompt, **stop_kwargs)
         first = next(it)
-        yield first
-        yield from it
     except StopIteration:
         return
     except Exception as e:
         err_str = str(e).lower()
         if stop_kwargs and 'stop' in err_str and ('unsupported' in err_str or 'invalid' in err_str):
             warning(f"LLM rejected 'stop' parameter: {e}. Retrying stream without stop.")
             yield from llm.stream(prompt)
+            return
         else:
             raise
+    yield first
+    yield from it
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ai/src/ai/common/chat.py` around lines 53 - 68, Update
_stream_with_stop_fallback so the try block only creates the stream and
retrieves its first item; move yield first and yield from it outside the
try/except. This ensures stop-related errors after the first emission propagate
instead of triggering a fallback that duplicates already-emitted chunks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/ai/tests/ai/common/test_chat_fallback.py`:
- Around line 82-107: Add streaming fallback negative tests alongside
test_invoke_with_stop_fallback_empty_stop_kwargs and
test_invoke_with_stop_fallback_unrelated_error. Use MockStreamLLM and a failing
stream generator to verify _stream_with_stop_fallback re-raises
unsupported-parameter errors with empty stop_kwargs and unrelated errors with
stop_kwargs, while asserting only one stream invocation occurs in each case.

---

Duplicate comments:
In `@packages/ai/src/ai/common/chat.py`:
- Around line 53-68: Update _stream_with_stop_fallback so the try block only
creates the stream and retrieves its first item; move yield first and yield from
it outside the try/except. This ensures stop-related errors after the first
emission propagate instead of triggering a fallback that duplicates
already-emitted chunks.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 402ccff6-c0f2-4506-a0f0-6c78286b933b

📥 Commits

Reviewing files that changed from the base of the PR and between 358c9d1 and 3977d78.

📒 Files selected for processing (2)
  • packages/ai/src/ai/common/chat.py
  • packages/ai/tests/ai/common/test_chat_fallback.py

Comment thread packages/ai/tests/ai/common/test_chat_fallback.py

@joshuadarron joshuadarron left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The approach is right — this is exactly option 1 from #1538 (catch the 400, retry once without stop, rely on the post-hoc truncate_at_stop_words backstop, which I verified still applies on the agent path at ai/common/agent/agent.py:317). Test coverage of the invoke path is good, including the two negative cases. But three things need fixing before merge:

Blocking:

  1. Title/description don't match the diff. The title says fix(agent_crewai): accept stop param from kwargs and the body describes a kwargs fallback in HostInvokeLLM plus TestKwargsStopFallback tests — none of that is in this PR (the single commit touches only ai/common/chat.py + test_chat_fallback.py). Note HostInvokeLLM on develop already reads self.stop_sequences (nodes/src/nodes/agent_crewai/crewai_base.py:266), so if the kwargs commit was dropped intentionally, retitle to fix(ai): retry without stop param on 400 unsupported_parameter and rewrite the summary; if it wasn't intentional, the commit is missing.
  2. Ruff fails: 18× Q000 (double quotes; repo enforces single quotes) — I ran ruff against the PR files to confirm. python -m ruff check --fix clears all of them.
  3. Mid-stream fallback can duplicate output — see inline comment on _stream_with_stop_fallback.

Non-blocking suggestions:

  • Consider caching a "this backend rejects stop" flag after the first fallback (e.g. on the wrapper) — as written, every agent step against a gpt-5.x/o-series model pays a failed round-trip first, and CrewAI's internal retries multiply that.
  • Worth a code comment noting that on the retry path a hallucinated \nObservation: can stream to the UI before the agent-level truncation trims it — inherent to the retry-without-stop approach, but future readers should know it's a known trade-off.
  • A test for an error raised after the first streamed chunk would lock in the no-duplicate behavior once the inline issue is fixed.

first = next(it)
yield first
yield from it
except StopIteration:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 risk: the except wraps the whole body including yield from it, so an error that matches the string filter after chunks were already yielded restarts the stream from scratch and duplicates everything already sent to the UI. The first = next(it) special-casing suggests the intent was to guard only stream creation + first chunk — restructure so only that part is inside the try:

try:
    it = llm.stream(prompt, **stop_kwargs)
    first = next(it)
except StopIteration:
    return
except Exception as e:
    err_str = str(e).lower()
    if stop_kwargs and 'stop' in err_str and ('unsupported' in err_str or 'invalid' in err_str):
        warning(f'LLM rejected stop parameter: {e}. Retrying stream without stop.')
        yield from llm.stream(prompt)
        return
    raise
yield first
yield from it

Same principle as the existing guard at _chat_string_responses ("Only retry non-streaming if nothing has reached the UI").

Comment thread packages/ai/src/ai/common/chat.py Outdated
return llm.invoke(prompt, **stop_kwargs)
except Exception as e:
err_str = str(e).lower()
if stop_kwargs and 'stop' in err_str and ('unsupported' in err_str or 'invalid' in err_str):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 risk: matching any Exception whose text contains stop + (unsupported|invalid) is broad — e.g. a legitimately malformed stop-sequence config error (invalid_request_error ... stop_sequences) gets silently swallowed and retried without stop instead of surfacing. The OpenAI error is structured; prefer checking getattr(e, 'status_code', None) == 400 and/or code == 'unsupported_parameter' / param == 'stop' from e.body/e.code when present, keeping the string match only as a last-resort fallback for providers without structured errors. Consider extracting the predicate into one _is_stop_rejection(e) helper — it's duplicated verbatim in both functions.

@kiet08hogit kiet08hogit changed the title fix(agent_crewai): accept stop param from kwargs fix(ai): retry without stop param on 400 unsupported_parameter Jul 17, 2026
@kiet08hogit

kiet08hogit commented Jul 17, 2026

Copy link
Copy Markdown
Author

Thanks @joshuadarron for the detailed review! I've pushed an update that addresses all of your feedback. The error matching has been extracted into a more precise _is_stop_rejection helper that checks structured API errors first. I also fixed the mid-stream duplication bug by moving the yield loop outside the try/except block, and added the requested negative tests to ensure the fallback doesn't trigger on unrelated errors or after a chunk has already been emitted. Finally, I added a note about the UI hallucination trade-off, ran ruff to fix the quote formatting, and updated the PR title and description to match the new scope.

@kiet08hogit
kiet08hogit requested a review from joshuadarron July 17, 2026 23:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

module:ai AI/ML modules

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CrewAI Agent fails on OpenAI reasoning models: 'stop' param rejected (400 unsupported_parameter)

2 participants