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
2 changes: 1 addition & 1 deletion kagglesdk/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "0.1.27"
__version__ = "0.1.28"

from kagglesdk.kaggle_client import KaggleClient
from kagglesdk.kaggle_creds import KaggleCredentials
Expand Down
25 changes: 25 additions & 0 deletions kagglesdk/benchmarks/types/benchmark_enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,23 @@ class BenchmarkTaskVersionCreationState(enum.Enum):
BENCHMARK_TASK_VERSION_CREATION_STATE_VALIDATION_FAILED = 6
BENCHMARK_TASK_VERSION_CREATION_STATE_NO_MODEL_SPECIFIED = 7

class BenchmarkTaskVersionSource(enum.Enum):
r"""
Where a BenchmarkTaskVersion was created from. Used for analytics and future
per-source policy hooks; sandbox tasks are listed alongside the existing
manual UNSPECIFIED flow without gating.
"""
BENCHMARK_TASK_VERSION_SOURCE_UNSPECIFIED = 0
EVAL_SANDBOX = 1
"""Created by the LIH 'Benchmark Sandbox: Discover What Works' flow."""
WEB = 2
r"""
Created via the kaggle.com web client (e.g. CreateBenchmarkTaskFromPrompt
or saving a benchmark task from a kernel session).
"""
CLI = 3
"""Created via the Kaggle CLI / public BenchmarkTasksApi handler."""

class Modality(enum.Enum):
"""Modality types supported by a benchmark model version."""
MODALITY_UNSPECIFIED = 0
Expand All @@ -41,4 +58,12 @@ class BenchmarkTaskRunState(enum.Enum):
BENCHMARK_TASK_RUN_STATE_RUNNING = 2
BENCHMARK_TASK_RUN_STATE_COMPLETED = 3
BENCHMARK_TASK_RUN_STATE_ERRORED = 4
BENCHMARK_TASK_RUN_STATE_SCORE_PENDING = 5
r"""
Indicates that scoring for the run is still pending.

For the initial implementation of CompsBench infra (go/compsbench-infra).
The session has completed running, but we're still awaiting a
score from the competitions scoring system.
"""

28 changes: 27 additions & 1 deletion kagglesdk/benchmarks/types/benchmark_tasks_api_service.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from datetime import datetime
from kagglesdk.benchmarks.types.benchmark_enums import BenchmarkTaskRunState, BenchmarkTaskVersionCreationState
from kagglesdk.benchmarks.types.benchmark_enums import BenchmarkTaskRunState, BenchmarkTaskVersionCreationState, BenchmarkTaskVersionSource
from kagglesdk.benchmarks.types.benchmark_task_run_service import BatchScheduleBenchmarkModelVersionResult
from kagglesdk.benchmarks.types.benchmark_types import BenchmarkTaskOptions
from kagglesdk.kaggle_object import *
Expand Down Expand Up @@ -124,6 +124,11 @@ class ApiBenchmarkTask(KaggleObject):
from CreateBenchmarkTask so callers can see what was attached, and
returned on reads so the CLI can display the currently-attached sources.
De-duplicated relative to the request input.
source (BenchmarkTaskVersionSource)
How this task version was produced (sandbox publish, CLI, notebook
editor, etc.). Mirrors BenchmarkTaskVersion.source from the internal
proto; carried through so API consumers can label sandbox-origin
tasks distinctly from manually authored ones.
"""

def __init__(self):
Expand All @@ -137,6 +142,7 @@ def __init__(self):
self._source_kernel_id = None
self._is_backing_notebook_published = None
self._options = None
self._source = BenchmarkTaskVersionSource.BENCHMARK_TASK_VERSION_SOURCE_UNSPECIFIED
self._freeze()

@property
Expand Down Expand Up @@ -290,6 +296,25 @@ def options(self, options: Optional[Optional['BenchmarkTaskOptions']]):
raise TypeError('options must be of type BenchmarkTaskOptions')
self._options = options

@property
def source(self) -> 'BenchmarkTaskVersionSource':
r"""
How this task version was produced (sandbox publish, CLI, notebook
editor, etc.). Mirrors BenchmarkTaskVersion.source from the internal
proto; carried through so API consumers can label sandbox-origin
tasks distinctly from manually authored ones.
"""
return self._source

@source.setter
def source(self, source: 'BenchmarkTaskVersionSource'):
if source is None:
del self.source
return
if not isinstance(source, BenchmarkTaskVersionSource):
raise TypeError('source must be of type BenchmarkTaskVersionSource')
self._source = source


class ApiBenchmarkTaskRun(KaggleObject):
r"""
Expand Down Expand Up @@ -1178,6 +1203,7 @@ def body_fields():
FieldMetadata("sourceKernelId", "source_kernel_id", "_source_kernel_id", int, None, PredefinedSerializer(), optional=True),
FieldMetadata("isBackingNotebookPublished", "is_backing_notebook_published", "_is_backing_notebook_published", bool, None, PredefinedSerializer(), optional=True),
FieldMetadata("options", "options", "_options", BenchmarkTaskOptions, None, KaggleObjectSerializer(), optional=True),
FieldMetadata("source", "source", "_source", BenchmarkTaskVersionSource, BenchmarkTaskVersionSource.BENCHMARK_TASK_VERSION_SOURCE_UNSPECIFIED, EnumSerializer()),
]

ApiBenchmarkTaskRun._fields = [
Expand Down
8 changes: 4 additions & 4 deletions kagglesdk/competitions/types/episode.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ class EpisodeType(enum.Enum):
"""This is deprecated / was never supported."""
EPISODE_TYPE_EXHIBITION = 3
r"""
Used exclusively for 'canary' episodes generated by GenerateEpisodesScheduledHandler
for Game Arena leaderboard competitions. These episodes do not affect leaderboard
scores and are used to validate agent behavior and provide coverage across
eligible submissions.
Used exclusively for 'canary' episodes generated by
GenerateEpisodesScheduledHandler for Game Arena leaderboard competitions.
These episodes do not affect leaderboard scores and are used to validate
agent behavior and provide coverage across eligible submissions.
"""
EPISODE_TYPE_VALIDATION = 4

22 changes: 22 additions & 0 deletions kagglesdk/discussions/types/writeup_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,9 @@ class WriteUp(KaggleObject):
saved_thumbnail_image_url (str)
Raw (un-fallback'd) saved thumbnail image URL from the DB. See
`saved_cover_image_url` for rationale.
doi (str)
A DataCite DOI reference identifier, if available.
e.g. '12.34567/KAGGLE/W/1234567'
"""

def __init__(self):
Expand Down Expand Up @@ -331,6 +334,7 @@ def __init__(self):
self._publish_time = None
self._saved_cover_image_url = ""
self._saved_thumbnail_image_url = ""
self._doi = None
self._freeze()

@property
Expand Down Expand Up @@ -731,6 +735,23 @@ def saved_thumbnail_image_url(self, saved_thumbnail_image_url: str):
raise TypeError('saved_thumbnail_image_url must be of type str')
self._saved_thumbnail_image_url = saved_thumbnail_image_url

@property
def doi(self) -> str:
r"""
A DataCite DOI reference identifier, if available.
e.g. '12.34567/KAGGLE/W/1234567'
"""
return self._doi or ""

@doi.setter
def doi(self, doi: Optional[str]):
if doi is None:
del self.doi
return
if not isinstance(doi, str):
raise TypeError('doi must be of type str')
self._doi = doi


class WriteUpImageInfo(KaggleObject):
r"""
Expand Down Expand Up @@ -1377,6 +1398,7 @@ def is_phone_verified(self, is_phone_verified: Optional[bool]):
FieldMetadata("publishTime", "publish_time", "_publish_time", datetime, None, DateTimeSerializer()),
FieldMetadata("savedCoverImageUrl", "saved_cover_image_url", "_saved_cover_image_url", str, "", PredefinedSerializer()),
FieldMetadata("savedThumbnailImageUrl", "saved_thumbnail_image_url", "_saved_thumbnail_image_url", str, "", PredefinedSerializer()),
FieldMetadata("doi", "doi", "_doi", str, None, PredefinedSerializer(), optional=True),
]

WriteUpImageInfo._fields = [
Expand Down
7 changes: 7 additions & 0 deletions kagglesdk/kaggle_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ def get_endpoint(env: KaggleEnv):
return _env_to_endpoint[env]


def get_web_endpoint(env: KaggleEnv):
# In PROD, the `api` subdomain is used which breaks link to detail pages.
if env == KaggleEnv.PROD:
return "https://kaggle.com"
return get_endpoint(env)


def get_env():
env = os.getenv("KAGGLE_API_ENVIRONMENT")
if env is None or env == "PROD":
Expand Down
12 changes: 4 additions & 8 deletions kagglesdk/kaggle_http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,10 @@ def _get_apikey_creds():
if not kaggle_json or not kaggle_json.strip():
return None

try:
"Be careful, since the file may be used for more than credential storage."
api_key_data = json.loads(kaggle_json)
username = api_key_data["username"]
api_key = api_key_data["key"]
return username, api_key
except KeyError as e:
return None
api_key_data = json.loads(kaggle_json)
username = api_key_data["username"]
api_key = api_key_data["key"]
return username, api_key


class KaggleHttpClient(object):
Expand Down
16 changes: 16 additions & 0 deletions kagglesdk/kernels/types/kernels_api_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -591,11 +591,13 @@ class ApiGetKernelRequest(KaggleObject):
Attributes:
user_name (str)
kernel_slug (str)
version_number (int)
"""

def __init__(self):
self._user_name = ""
self._kernel_slug = ""
self._version_number = None
self._freeze()

@property
Expand Down Expand Up @@ -624,6 +626,19 @@ def kernel_slug(self, kernel_slug: str):
raise TypeError('kernel_slug must be of type str')
self._kernel_slug = kernel_slug

@property
def version_number(self) -> int:
return self._version_number or 0

@version_number.setter
def version_number(self, version_number: Optional[int]):
if version_number is None:
del self.version_number
return
if not isinstance(version_number, int):
raise TypeError('version_number must be of type int')
self._version_number = version_number

def endpoint(self):
path = '/api/v1/kernels/pull'
return path.format_map(self.to_field_map(self))
Expand Down Expand Up @@ -2572,6 +2587,7 @@ def kernelId(self):
ApiGetKernelRequest._fields = [
FieldMetadata("userName", "user_name", "_user_name", str, "", PredefinedSerializer()),
FieldMetadata("kernelSlug", "kernel_slug", "_kernel_slug", str, "", PredefinedSerializer()),
FieldMetadata("versionNumber", "version_number", "_version_number", int, None, PredefinedSerializer(), optional=True),
]

ApiGetKernelResponse._fields = [
Expand Down
1 change: 1 addition & 0 deletions kagglesdk/security/types/security_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class KaggleResourceType(enum.Enum):
KAGGLE_RESOURCE_TYPE_TEAM_MERGE_REQUESTS = 322
KAGGLE_RESOURCE_TYPE_HACKATHON_WRITE_UPS = 324
KAGGLE_RESOURCE_TYPE_COMPETITION_METRIC_VERSIONS = 326
KAGGLE_RESOURCE_TYPE_HACKATHONS = 328
KAGGLE_RESOURCE_TYPE_DATASETS = 400
"""---------- Datasets ----------"""
KAGGLE_RESOURCE_TYPE_DATASET_VERSIONS = 404
Expand Down