Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions docs/kernels.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,3 +319,72 @@ kaggle kernels delete $KAGGLE_DEVELOPER/exercise-delete --yes
**Purpose:**

This command permanently removes one of your kernels from Kaggle. Use with caution.

## `kaggle kernels topics list`

Lists discussion topics for a kernel.

**Usage:**

```bash
kaggle kernels topics list <KERNEL> [options]
```

**Arguments:**

* `<KERNEL>`: Kernel ref in format `<owner>/<kernel-slug>` (e.g., `owner/kernel-slug`).

**Options:**

* `--sort-by <SORT_BY>`: Sort order. Valid options: `hot`, `top`, `new`, `recent`, `active`, `relevance`.
* `-s, --search <SEARCH_TERM>`: Search query to filter topics.
* `--page-size <PAGE_SIZE>`: Number of items per page.
* `--page-token <PAGE_TOKEN>`: Page token for pagination.
* `-v, --csv`: Print results in CSV format.
* `-q, --quiet`: Suppress verbose output.

**Example:**

List recent topics for the `owner/kernel-slug` kernel:

```bash
kaggle kernels topics list owner/kernel-slug --sort-by recent
```

**Purpose:**

This command lets you browse discussion topics for a specific kernel.

## `kaggle kernels topics show`

Displays a kernel discussion topic with all comments in tree form.

**Usage:**

```bash
kaggle kernels topics show <TOPIC_REF> [options]
```

**Arguments:**

* `<TOPIC_REF>`: A topic reference, which can be:
* `<kernel>/<topic-id>` (e.g., `owner/kernel-slug/12345`)

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.

Should we explain here that is /?

* `<kernel> <topic-id>` (two separate arguments, where `<topic-id>` is passed as second argument)
* `<topic-id>` (bare numeric ID)

**Options:**

* `--page-size <PAGE_SIZE>`: Number of comments to show per page.
* `--page-token <PAGE_TOKEN>`: Page token for comment pagination.
* `-v, --csv`: Print results in CSV format.
* `-q, --quiet`: Suppress verbose output.

**Example:**

```bash
kaggle kernels topics show owner/kernel-slug/12345
```

**Purpose:**

This command displays a full discussion topic along with all of its comments rendered in an indented tree structure.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ keywords = ["Kaggle", "API"]
requires-python = ">= 3.11"
dependencies = [
"bleach",
"kagglesdk >= 0.1.27, < 1.0", # sync with kagglehub
"kagglesdk >= 0.1.30, < 1.0", # sync with kagglehub
"python-slugify",
"requests",
"python-dateutil",
Expand Down
77 changes: 77 additions & 0 deletions src/kaggle/api/kaggle_api_extended.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@
ApiListCommentsRequest,
ApiListCommentsResponse,
ApiListDatasetTopicsRequest,
ApiListKernelTopicsRequest,
ApiListForumsRequest,
ApiListForumsResponse,
ApiListModelTopicsRequest,
Expand Down Expand Up @@ -2495,6 +2496,45 @@ def dataset_list_topics(
request.search_query = search
return kaggle.discussions.discussion_api_client.list_dataset_topics(request)

def kernel_list_topics(
self,
kernel: str,
sort_by: Optional[str] = None,
page_size: Optional[int] = None,
page_token: Optional[str] = None,
search: Optional[str] = None,
):
"""List discussion topics for a kernel.

Args:
kernel (str): Kernel slug (e.g. 'owner/kernel-slug').
sort_by (Optional[str]): Sort order; one of valid_forum_topic_sort_by.
page_size (Optional[int]): Number of results per page.
page_token (Optional[str]): Page token for pagination.
search (Optional[str]): Search query to filter topics.

Returns:
ApiListTopicsResponse: response with topics, total_count, and next_page_token.
"""
owner_slug, kernel_slug, _ = self.parse_kernel_string(kernel)
with self.build_kaggle_client() as kaggle:
request = ApiListKernelTopicsRequest()
request.owner_slug = owner_slug
request.kernel_slug = kernel_slug
if sort_by:
if sort_by not in self.valid_forum_topic_sort_by:
raise ValueError(
"Invalid sort_by specified. Valid options are " + str(self.valid_forum_topic_sort_by)
)
request.sort_by = TopicListSortBy["TOPIC_LIST_SORT_BY_" + sort_by.upper()]
if page_size is not None:
request.page_size = page_size
if page_token:
request.page_token = page_token
if search:
request.search_query = search
return kaggle.discussions.discussion_api_client.list_kernel_topics(request)

def model_list_topics(
self,
model: str,
Expand Down Expand Up @@ -2833,6 +2873,43 @@ def dataset_list_topics_cli(
else:
print("No topics found")

def kernel_list_topics_cli(
self,
entity_ref=None,
sort_by=None,
page_size=None,
page_token=None,
search=None,
csv_display=False,
quiet=False,
):
"""CLI wrapper that lists discussion topics for a kernel.

Args:
entity_ref (str): Kernel slug (e.g. 'owner/kernel-slug').
"""
if entity_ref is None:
raise ValueError("No kernel specified")

response = self.kernel_list_topics(
kernel=entity_ref,
sort_by=sort_by,
page_size=page_size,
page_token=page_token,
search=search,
)
topics = response.topics
if topics:
fields = self.forum_topic_fields
if csv_display:
self.print_csv(topics, fields)
else:
self.print_table(topics, fields)
if not quiet and response.next_page_token:
print(f"Next page token: {response.next_page_token}")
else:
print("No topics found")

def model_list_topics_cli(
self,
entity_ref=None,
Expand Down
75 changes: 74 additions & 1 deletion src/kaggle/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,63 @@ def parse_kernels(subparsers) -> None:
parser_kernels_delete._action_groups.append(parser_kernels_delete_optional)
parser_kernels_delete.set_defaults(func=api.kernels_delete_cli)

shared_topics = _get_shared_topics_parser()

# Kernels discussion topics
parser_kernels_topics = subparsers_kernels.add_parser(
"topics",
formatter_class=argparse.RawTextHelpFormatter,
help=Help.command_kernels_topics,
parents=[shared_topics],
)
subparsers_kernels_topics = parser_kernels_topics.add_subparsers(title="commands", dest="command")
subparsers_kernels_topics.choices = Help.entity_topics_choices

# Default action: list topics (when no subcommand given)
parser_kernels_topics.set_defaults(func=api.kernel_list_topics_cli)

# Kernels topics list (explicit)
parser_kernels_topics_list = subparsers_kernels_topics.add_parser(
"list",
formatter_class=argparse.RawTextHelpFormatter,
help=Help.command_kernels_topics,
parents=[shared_topics],
)
parser_kernels_topics_list_optional = parser_kernels_topics_list._action_groups.pop()
parser_kernels_topics_list_optional.add_argument(
"entity_ref", metavar="kernel", nargs="?", default=None, help=Help.param_kernel
)
parser_kernels_topics_list_optional.add_argument(
"--sort-by",
dest="sort_by",
required=False,
help="Sort order. One of: " + ", ".join(KaggleApi.valid_forum_topic_sort_by),
)
parser_kernels_topics_list_optional.add_argument(
"-s", "--search", dest="search", required=False, help=Help.param_search
)
parser_kernels_topics_list._action_groups.append(parser_kernels_topics_list_optional)
parser_kernels_topics_list.set_defaults(func=api.kernel_list_topics_cli)

# Kernels topics show
parser_kernels_topics_show = subparsers_kernels_topics.add_parser(
"show",
formatter_class=argparse.RawTextHelpFormatter,
help=Help.command_entity_topics_show,
parents=[shared_topics],
)
parser_kernels_topics_show_optional = parser_kernels_topics_show._action_groups.pop()
parser_kernels_topics_show_optional.add_argument("topic_ref", help=Help.param_topic_ref)
parser_kernels_topics_show_optional.add_argument(
"topic_id_arg",
nargs="?",
default=None,
type=int,
help="Topic ID (when using two-arg form: <kernel> <topic-id>)",
)
parser_kernels_topics_show._action_groups.append(parser_kernels_topics_show_optional)
parser_kernels_topics_show.set_defaults(func=api.forums_topic_show_cli)


def parse_models(subparsers) -> None:
parser_models = subparsers.add_parser(
Expand Down Expand Up @@ -1892,7 +1949,20 @@ class Help(object):
"delete",
"topics",
]
kernels_choices = ["list", "files", "get", "init", "push", "pull", "output", "status", "logs", "update", "delete"]
kernels_choices = [
"list",
"files",
"get",
"init",
"push",
"pull",
"output",
"status",
"logs",
"update",
"delete",
"topics",
]
models_choices = [
"instances",
"i",
Expand Down Expand Up @@ -1941,6 +2011,8 @@ class Help(object):
+ "}"
+ "\nkernels {"
+ ", ".join(kernels_choices)
+ "}\nkernels topics {"
+ ", ".join(entity_topics_choices)
+ "}\nmodels {"
+ ", ".join(models_choices)
+ "}\nmodels topics {"
Expand Down Expand Up @@ -2025,6 +2097,7 @@ class Help(object):
command_kernels_status = "Display the status of the latest kernel run"
command_kernels_logs = "Print the execution logs from the latest kernel run"
command_kernels_delete = "Delete a kernel"
command_kernels_topics = "List discussion topics for a kernel"

# Models commands
command_models_files = "List model files"
Expand Down
Loading
Loading