{"record":{"id":"359e8a688f3c6d34","repo":"microsoft/semantic-kernel","slug":"offset-must-be-greater-than-or-equal-to-0","errorCode":null,"errorMessage":"offset must be greater than or equal to 0.","messagePattern":"offset must be greater than or equal to 0\\.","errorType":"exception","errorClass":"ServiceInvalidRequestError","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/connectors/brave.py","lineNumber":250,"sourceCode":"                return BraveSearchResponse.model_validate_json(response.text)\n        except HTTPStatusError as ex:\n            logger.error(f\"Failed to get search results: {ex}\")\n            raise ServiceInvalidRequestError(\"Failed to get search results.\") from ex\n        except RequestError as ex:\n            logger.error(f\"Client error occurred: {ex}\")\n            raise ServiceInvalidRequestError(\"A client error occurred while getting search results.\") from ex\n        except Exception as ex:\n            logger.error(f\"An unexpected error occurred: {ex}\")\n            raise ServiceInvalidRequestError(\"An unexpected error occurred while getting search results.\") from ex\n\n    def _validate_options(self, options: SearchOptions) -> None:\n        if options.top <= 0:\n            raise ServiceInvalidRequestError(\"count value must be greater than 0.\")\n        if options.top >= 21:\n            raise ServiceInvalidRequestError(\"count value must be less than 21.\")\n\n        if options.skip < 0:\n            raise ServiceInvalidRequestError(\"offset must be greater than or equal to 0.\")\n        if options.skip > 9:\n            raise ServiceInvalidRequestError(\"offset must be less than 10.\")\n\n    def _get_url(self) -> str:\n        return DEFAULT_URL\n\n    def _parse_filter_lambda(self, filter_lambda: Callable | str) -> list[dict[str, str]]:\n        \"\"\"Parse a string lambda or string expression into a list of {field: value} dicts using AST.\"\"\"\n        expr = filter_lambda if isinstance(filter_lambda, str) else getsource(filter_lambda).strip()\n        tree = ast.parse(expr, mode=\"eval\")\n        node = tree.body\n        visitor = SearchLambdaVisitor(valid_parameters=QUERY_PARAMETERS)\n        visitor.visit(node)\n        return visitor.filters\n\n    def _build_request_parameters(self, query: str, options: SearchOptions) -> dict[str, str | int | bool]:\n        params: dict[str, str | int] = {\"q\": query or \"\", \"count\": options.top, \"offset\": options.skip}\n        if not options.filter:","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/connectors/brave.py#L232-L268","documentation":"A validation guard: the offset (skip) must be >= 0. Negative offsets are rejected client-side with ServiceInvalidRequestError before the request is sent. The check at brave.py:250-251 fires in _validate_options.","triggerScenarios":"Calling search() with skip < 0, e.g. from a pagination state that decremented below zero.","commonSituations":"A 'previous page' action that subtracts page size without clamping at zero, or an off-by-one in offset computation.","solutions":["Clamp skip to >= 0 before calling search (max(0, computed_offset)).","Guard pagination state so offset never goes negative.","Pass skip=0 explicitly for the first page."],"exampleFix":"// before\nresults = await connector.search(query, skip=-5)\n// after\nresults = await connector.search(query, skip=max(0, computed_offset))\n","handlingStrategy":"validation","validationCode":"if skip < 0:\n    raise ValueError(\"skip must be >= 0\")\nresults = await connector.search(query, skip=max(0, skip))","typeGuard":"def is_valid_skip(skip: int) -> bool:\n    return isinstance(skip, int) and 0 <= skip <= 9","tryCatchPattern":null,"preventionTips":["Clamp skip to [0, 9] before calling search.","Guard 'previous page' logic so offset never drops below zero."],"tags":["brave","validation","input","pagination"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}