adaptive-sdk 0.1.10__py3-none-any.whl → 0.1.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,7 +38,7 @@ from .describe_metric_admin import DescribeMetricAdmin, DescribeMetricAdminMetri
38
38
  from .describe_model import DescribeModel, DescribeModelModel, DescribeModelModelBackbone
39
39
  from .describe_model_admin import DescribeModelAdmin, DescribeModelAdminModel, DescribeModelAdminModelBackbone
40
40
  from .describe_use_case import DescribeUseCase, DescribeUseCaseUseCase
41
- from .enums import AbcampaignStatus, AuthProviderKind, BillingCycle, CompletionGroupBy, CompletionSource, ComputePoolCapability, DatasetKind, DatasetSource, DatasetStatus, DateBucketUnit, ExternalModelProviderName, FeedbackType, GraderTypeEnum, HarmonyStatus, JobArtifactKind, JobKind, JobStatus, JobStatusOutput, JudgeCapability, MetricAggregation, MetricKind, MetricScoringType, ModelCapabilityFilter, ModelOnline, ModelserviceStatus, OpenAIModel, PrebuiltCriteriaKey, Protocol, ProviderName, RemoteEnvStatus, SelectionTypeInput, SessionStatus, SortDirection, TimeseriesInterval, UnitPosition
41
+ from .enums import AbcampaignStatus, AuthProviderKind, BillingCycle, CompletionGroupBy, CompletionSource, ComputePoolCapability, DatasetKind, DatasetSource, DatasetStatus, DateBucketUnit, ExternalModelProviderName, FeedbackType, GraderTypeEnum, HarmonyStatus, JobArtifactKind, JobArtifactStatus, JobKind, JobStatus, JobStatusOutput, JudgeCapability, MetricAggregation, MetricKind, MetricScoringType, ModelCapabilityFilter, ModelOnline, ModelserviceStatus, OpenAIModel, PrebuiltCriteriaKey, Protocol, ProviderName, RemoteEnvStatus, SelectionTypeInput, SessionStatus, SortDirection, TimeseriesInterval, UnitPosition
42
42
  from .exceptions import GraphQLClientError, GraphQLClientGraphQLError, GraphQLClientGraphQLMultiError, GraphQLClientHttpError, GraphQLClientInvalidResponseError
43
43
  from .fragments import AbCampaignCreateData, AbCampaignDetailData, AbCampaignDetailDataMetric, AbCampaignDetailDataModels, AbCampaignDetailDataUseCase, AbCampaignReportData, AbCampaignReportDataVariants, AbCampaignReportDataVariantsComparisons, AbCampaignReportDataVariantsComparisonsVariant, AbCampaignReportDataVariantsInterval, AbCampaignReportDataVariantsVariant, CompletionComparisonFeedbackData, CompletionComparisonFeedbackDataModel, CompletionData, CompletionDataChatMessages, CompletionDataComparisonFeedbacks, CompletionDataComparisonFeedbacksMetric, CompletionDataComparisonFeedbacksOtherCompletion, CompletionDataComparisonFeedbacksPreferedCompletion, CompletionDataComparisonFeedbacksUsecase, CompletionDataDirectFeedbacks, CompletionDataDirectFeedbacksMetric, CompletionDataLabels, CompletionDataMetadata, CompletionDataMetadataUsage, CompletionDataModel, CustomRecipeData, CustomRecipeDataCreatedBy, CustomRecipeDataLabels, DatasetData, DatasetDataMetricsUsage, DatasetDataMetricsUsageMetric, GraderData, GraderDataGraderConfigCustomConfigOutput, GraderDataGraderConfigJudgeConfigOutput, GraderDataGraderConfigJudgeConfigOutputExamples, GraderDataGraderConfigJudgeConfigOutputExamplesInput, GraderDataGraderConfigJudgeConfigOutputModel, GraderDataGraderConfigPrebuiltConfigOutput, GraderDataGraderConfigPrebuiltConfigOutputModel, GraderDataGraderConfigPrebuiltConfigOutputPrebuiltCriteria, GraderDataGraderConfigRemoteConfigOutput, GraderDataMetric, GraderDataUseCase, HarmonyGroupData, HarmonyGroupDataComputePool, HarmonyGroupDataGpuAllocations, HarmonyGroupDataOnlineModels, JobData, JobDataCreatedBy, JobDataDetails, JobDataDetailsArtifacts, JobDataDetailsArtifactsByproductsDatasetByproducts, JobDataDetailsArtifactsByproductsEvaluationByproducts, JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResults, JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsMetric, JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsModelService, JobDataDetailsArtifactsByproductsModelByproducts, JobDataRecipe, JobDataStages, JobDataStagesInfoBatchInferenceJobStageOutput, JobDataStagesInfoEvalJobStageOutput, JobDataStagesInfoTrainingJobStageOutput, JobDataUseCase, JobStageOutputData, JobStageOutputDataInfoBatchInferenceJobStageOutput, JobStageOutputDataInfoEvalJobStageOutput, JobStageOutputDataInfoTrainingJobStageOutput, JudgeData, JudgeDataExamples, JudgeDataExamplesInput, JudgeDataMetric, JudgeDataModel, MetricData, MetricDataAdmin, MetricDataAdminUseCases, MetricWithContextData, ModelData, ModelDataAdmin, ModelDataAdminUseCases, ModelDataComputeConfig, ModelServiceData, ModelServiceDataModel, ModelServiceDataModelBackbone, RemoteEnvData, UseCaseData, UseCaseDataMetrics, UseCaseDataModelServices, UseCaseDataShares, UseCaseDataSharesRole, UseCaseDataSharesTeam, UserData, UserDataTeams, UserDataTeamsRole, UserDataTeamsTeam
44
44
  from .get_custom_recipe import GetCustomRecipe, GetCustomRecipeCustomRecipe
@@ -67,7 +67,7 @@ from .list_use_cases import ListUseCases, ListUseCasesUseCases
67
67
  from .list_users import ListUsers, ListUsersUsers
68
68
  from .load_dataset import LoadDataset, LoadDatasetCreateDataset
69
69
  from .lock_grader import LockGrader, LockGraderLockGrader
70
- from .me import Me, MeMe, MeMeApiKeys
70
+ from .me import Me, MeMe
71
71
  from .remove_remote_env import RemoveRemoteEnv
72
72
  from .remove_team_member import RemoveTeamMember, RemoveTeamMemberRemoveTeamMember
73
73
  from .resize_inference_partition import ResizeInferencePartition
@@ -81,4 +81,4 @@ from .update_judge import UpdateJudge, UpdateJudgeUpdateJudge
81
81
  from .update_model import UpdateModel, UpdateModelUpdateModelService
82
82
  from .update_model_compute_config import UpdateModelComputeConfig, UpdateModelComputeConfigUpdateModelComputeConfig
83
83
  from .update_user import UpdateUser, UpdateUserSetTeamMember, UpdateUserSetTeamMemberRole, UpdateUserSetTeamMemberTeam, UpdateUserSetTeamMemberUser
84
- __all__ = ['AbCampaignCreateData', 'AbCampaignDetailData', 'AbCampaignDetailDataMetric', 'AbCampaignDetailDataModels', 'AbCampaignDetailDataUseCase', 'AbCampaignFilter', 'AbCampaignReportData', 'AbCampaignReportDataVariants', 'AbCampaignReportDataVariantsComparisons', 'AbCampaignReportDataVariantsComparisonsVariant', 'AbCampaignReportDataVariantsInterval', 'AbCampaignReportDataVariantsVariant', 'AbcampaignCreate', 'AbcampaignStatus', 'AddExternalModel', 'AddExternalModelAddExternalModel', 'AddExternalModelInput', 'AddHFModel', 'AddHFModelImportHfModel', 'AddHFModelInput', 'AddModel', 'AddModelAddModel', 'AddModelAddModelBackbone', 'AddModelInput', 'AddRemoteEnv', 'AddRemoteEnvAddRemoteEnv', 'AnthropicProviderDataInput', 'ApiKeyCreate', 'ArtifactFilter', 'AsyncBaseClientOpenTelemetry', 'AsyncGQLClient', 'AttachModel', 'AttachModelToUseCase', 'AttachModelToUseCaseAttachModel', 'AuthProviderKind', 'BaseClientOpenTelemetry', 'BaseModel', 'BillingCycle', 'CancelABCampaign', 'CancelAllocationInput', 'CancelJob', 'CancelJobCancelJob', 'CapabilityFilter', 'CompletionComparisonFeedbackData', 'CompletionComparisonFeedbackDataModel', 'CompletionComparisonFilterInput', 'CompletionData', 'CompletionDataChatMessages', 'CompletionDataComparisonFeedbacks', 'CompletionDataComparisonFeedbacksMetric', 'CompletionDataComparisonFeedbacksOtherCompletion', 'CompletionDataComparisonFeedbacksPreferedCompletion', 'CompletionDataComparisonFeedbacksUsecase', 'CompletionDataDirectFeedbacks', 'CompletionDataDirectFeedbacksMetric', 'CompletionDataLabels', 'CompletionDataMetadata', 'CompletionDataMetadataUsage', 'CompletionDataModel', 'CompletionFeedbackFilterInput', 'CompletionGroupBy', 'CompletionLabelValue', 'CompletionSource', 'CompletionsByFilters', 'CompletionsById', 'ComputePoolCapability', 'CreateAbCampaign', 'CreateAbCampaignCreateAbCampaign', 'CreateCustomRecipe', 'CreateCustomRecipeCreateCustomRecipe', 'CreateDatasetFromMultipartUpload', 'CreateDatasetFromMultipartUploadCreateDatasetFromMultipartUpload', 'CreateGrader', 'CreateGraderCreateGrader', 'CreateJob', 'CreateJobCreateJob', 'CreateJudge', 'CreateJudgeCreateJudge', 'CreateMetric', 'CreateMetricCreateMetric', 'CreatePrebuiltJudge', 'CreatePrebuiltJudgeCreatePrebuiltJudge', 'CreateRecipeInput', 'CreateRole', 'CreateRoleCreateRole', 'CreateTeam', 'CreateTeamCreateTeam', 'CreateToolProviderInput', 'CreateUseCase', 'CreateUseCaseCreateUseCase', 'CreateUser', 'CreateUserCreateUser', 'CursorPageInput', 'CustomConfigInput', 'CustomRecipeData', 'CustomRecipeDataCreatedBy', 'CustomRecipeDataLabels', 'CustomRecipeFilterInput', 'DatasetCompletionQuery', 'DatasetCreate', 'DatasetCreateFromFilters', 'DatasetCreateFromMultipartUpload', 'DatasetData', 'DatasetDataMetricsUsage', 'DatasetDataMetricsUsageMetric', 'DatasetKind', 'DatasetSource', 'DatasetStatus', 'DatasetUploadProcessingStatus', 'DatasetUploadProcessingStatusDatasetUploadProcessingStatus', 'DatasetUploadProcessingStatusInput', 'DateBucketUnit', 'DeleteCustomRecipe', 'DeleteDataset', 'DeleteGrader', 'DeleteGraderDeleteGrader', 'DeleteJudge', 'DeleteJudgeDeleteJudge', 'DeleteUser', 'DeleteUserDeleteUser', 'DeployModel', 'DescribeAbCampaign', 'DescribeAbCampaignAbCampaign', 'DescribeAbCampaignAbCampaignReport', 'DescribeDataset', 'DescribeDatasetDataset', 'DescribeInteraction', 'DescribeInteractionCompletion', 'DescribeJob', 'DescribeJobJob', 'DescribeMetric', 'DescribeMetricAdmin', 'DescribeMetricAdminMetric', 'DescribeMetricMetric', 'DescribeModel', 'DescribeModelAdmin', 'DescribeModelAdminModel', 'DescribeModelAdminModelBackbone', 'DescribeModelModel', 'DescribeModelModelBackbone', 'DescribeUseCase', 'DescribeUseCaseUseCase', 'EmojiInput', 'ExternalModelProviderName', 'FeedbackAddInput', 'FeedbackFilterInput', 'FeedbackType', 'FeedbackUpdateInput', 'FromGroupsQuery', 'GQLClient', 'GetCustomRecipe', 'GetCustomRecipeCustomRecipe', 'GetGrader', 'GetGraderGrader', 'GetJudge', 'GetJudgeJudge', 'GlobalUsageFilterInput', 'GoogleProviderDataInput', 'GraderConfigInput', 'GraderCreateInput', 'GraderData', 'GraderDataGraderConfigCustomConfigOutput', 'GraderDataGraderConfigJudgeConfigOutput', 'GraderDataGraderConfigJudgeConfigOutputExamples', 'GraderDataGraderConfigJudgeConfigOutputExamplesInput', 'GraderDataGraderConfigJudgeConfigOutputModel', 'GraderDataGraderConfigPrebuiltConfigOutput', 'GraderDataGraderConfigPrebuiltConfigOutputModel', 'GraderDataGraderConfigPrebuiltConfigOutputPrebuiltCriteria', 'GraderDataGraderConfigRemoteConfigOutput', 'GraderDataMetric', 'GraderDataUseCase', 'GraderTypeEnum', 'GraderUpdateInput', 'GraphQLClientError', 'GraphQLClientGraphQLError', 'GraphQLClientGraphQLMultiError', 'GraphQLClientHttpError', 'GraphQLClientInvalidResponseError', 'GroupSelection', 'GroupSelectionQuery', 'HarmonyGroupData', 'HarmonyGroupDataComputePool', 'HarmonyGroupDataGpuAllocations', 'HarmonyGroupDataOnlineModels', 'HarmonyStatus', 'JobArtifactFilter', 'JobArtifactKind', 'JobData', 'JobDataCreatedBy', 'JobDataDetails', 'JobDataDetailsArtifacts', 'JobDataDetailsArtifactsByproductsDatasetByproducts', 'JobDataDetailsArtifactsByproductsEvaluationByproducts', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResults', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsMetric', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsModelService', 'JobDataDetailsArtifactsByproductsModelByproducts', 'JobDataRecipe', 'JobDataStages', 'JobDataStagesInfoBatchInferenceJobStageOutput', 'JobDataStagesInfoEvalJobStageOutput', 'JobDataStagesInfoTrainingJobStageOutput', 'JobDataUseCase', 'JobInput', 'JobKind', 'JobStageOutputData', 'JobStageOutputDataInfoBatchInferenceJobStageOutput', 'JobStageOutputDataInfoEvalJobStageOutput', 'JobStageOutputDataInfoTrainingJobStageOutput', 'JobStatus', 'JobStatusOutput', 'JudgeCapability', 'JudgeConfigInput', 'JudgeCreate', 'JudgeData', 'JudgeDataExamples', 'JudgeDataExamplesInput', 'JudgeDataMetric', 'JudgeDataModel', 'JudgeExampleInput', 'JudgeExampleInputTurnEntry', 'JudgeUpdate', 'LabelFilter', 'LabelInput', 'LinkMetric', 'LinkMetricLinkMetric', 'ListAbCampaigns', 'ListAbCampaignsAbCampaigns', 'ListCompletionsFilterInput', 'ListComputePools', 'ListComputePoolsComputePools', 'ListComputePoolsComputePoolsHarmonyGroups', 'ListCustomRecipes', 'ListCustomRecipesCustomRecipes', 'ListDatasets', 'ListDatasetsDatasets', 'ListGraders', 'ListGradersGraders', 'ListGroupedInteractions', 'ListGroupedInteractionsCompletionsGrouped', 'ListGroupedInteractionsCompletionsGroupedNodes', 'ListGroupedInteractionsCompletionsGroupedNodesCompletions', 'ListGroupedInteractionsCompletionsGroupedNodesCompletionsNodes', 'ListGroupedInteractionsCompletionsGroupedNodesDirectFeedbacksStats', 'ListGroupedInteractionsCompletionsGroupedNodesDirectFeedbacksStatsMetric', 'ListGroupedInteractionsCompletionsGroupedPageInfo', 'ListHarmonyGroups', 'ListHarmonyGroupsHarmonyGroups', 'ListInteractions', 'ListInteractionsCompletions', 'ListInteractionsCompletionsNodes', 'ListInteractionsCompletionsPageInfo', 'ListJobs', 'ListJobsFilterInput', 'ListJobsJobs', 'ListJobsJobsNodes', 'ListJobsJobsPageInfo', 'ListJudgeVersions', 'ListJudgeVersionsJudgeVersions', 'ListJudges', 'ListJudgesJudges', 'ListMetrics', 'ListMetricsMetrics', 'ListModels', 'ListModelsModels', 'ListModelsModelsBackbone', 'ListPermissions', 'ListRemoteEnvs', 'ListRemoteEnvsRemoteEnvs', 'ListRoles', 'ListRolesRoles', 'ListTeams', 'ListTeamsTeams', 'ListUseCases', 'ListUseCasesUseCases', 'ListUsers', 'ListUsersUsers', 'LoadDataset', 'LoadDatasetCreateDataset', 'LockGrader', 'LockGraderLockGrader', 'Me', 'MeMe', 'MeMeApiKeys', 'MetricAggregation', 'MetricCreate', 'MetricData', 'MetricDataAdmin', 'MetricDataAdminUseCases', 'MetricGetOrCreate', 'MetricKind', 'MetricLink', 'MetricScoringType', 'MetricTrendInput', 'MetricUnlink', 'MetricWithContextData', 'ModelCapabilityFilter', 'ModelComputeConfigInput', 'ModelData', 'ModelDataAdmin', 'ModelDataAdminUseCases', 'ModelDataComputeConfig', 'ModelFilter', 'ModelOnline', 'ModelPlacementInput', 'ModelProviderDataInput', 'ModelServiceData', 'ModelServiceDataModel', 'ModelServiceDataModelBackbone', 'ModelServiceDisconnect', 'ModelServiceFilter', 'ModelserviceStatus', 'OpenAIModel', 'OpenAIProviderDataInput', 'OrderPair', 'PrebuiltConfigInput', 'PrebuiltCriteriaKey', 'PrebuiltJudgeCreate', 'Protocol', 'ProviderName', 'RemoteConfigInput', 'RemoteEnvCreate', 'RemoteEnvData', 'RemoteEnvStatus', 'RemoveRemoteEnv', 'RemoveTeamMember', 'RemoveTeamMemberRemoveTeamMember', 'ResizeInferencePartition', 'ResizePartitionInput', 'RoleCreate', 'SampleConfig', 'SearchInput', 'SelectionTypeInput', 'SessionStatus', 'ShareUseCase', 'ShareUseCaseShareUseCase', 'SortDirection', 'SystemPromptTemplateCreate', 'SystemPromptTemplateUpdate', 'TeamCreate', 'TeamMemberRemove', 'TeamMemberSet', 'TerminateModel', 'TestRemoteEnv', 'TestRemoteEnvTestRemoteEnvRemoteEnvTestOffline', 'TestRemoteEnvTestRemoteEnvRemoteEnvTestOnline', 'TimeRange', 'TimeseriesInput', 'TimeseriesInterval', 'UnitConfigInput', 'UnitPosition', 'UnlinkMetric', 'UpdateCompletion', 'UpdateCustomRecipe', 'UpdateCustomRecipeUpdateCustomRecipe', 'UpdateGrader', 'UpdateGraderUpdateGrader', 'UpdateJudge', 'UpdateJudgeUpdateJudge', 'UpdateModel', 'UpdateModelComputeConfig', 'UpdateModelComputeConfigUpdateModelComputeConfig', 'UpdateModelService', 'UpdateModelUpdateModelService', 'UpdateRecipeInput', 'UpdateToolProviderInput', 'UpdateUser', 'UpdateUserSetTeamMember', 'UpdateUserSetTeamMemberRole', 'UpdateUserSetTeamMemberTeam', 'UpdateUserSetTeamMemberUser', 'Upload', 'UsageFilterInput', 'UsagePerUseCaseFilterInput', 'UseCaseCreate', 'UseCaseData', 'UseCaseDataMetrics', 'UseCaseDataModelServices', 'UseCaseDataShares', 'UseCaseDataSharesRole', 'UseCaseDataSharesTeam', 'UseCaseFilter', 'UseCaseMetadataInput', 'UseCaseSettingsInput', 'UseCaseShareInput', 'UseCaseShares', 'UseCaseUpdate', 'UserCreate', 'UserCreateTeamWithRole', 'UserData', 'UserDataTeams', 'UserDataTeamsRole', 'UserDataTeamsTeam', 'WidgetInput']
84
+ __all__ = ['AbCampaignCreateData', 'AbCampaignDetailData', 'AbCampaignDetailDataMetric', 'AbCampaignDetailDataModels', 'AbCampaignDetailDataUseCase', 'AbCampaignFilter', 'AbCampaignReportData', 'AbCampaignReportDataVariants', 'AbCampaignReportDataVariantsComparisons', 'AbCampaignReportDataVariantsComparisonsVariant', 'AbCampaignReportDataVariantsInterval', 'AbCampaignReportDataVariantsVariant', 'AbcampaignCreate', 'AbcampaignStatus', 'AddExternalModel', 'AddExternalModelAddExternalModel', 'AddExternalModelInput', 'AddHFModel', 'AddHFModelImportHfModel', 'AddHFModelInput', 'AddModel', 'AddModelAddModel', 'AddModelAddModelBackbone', 'AddModelInput', 'AddRemoteEnv', 'AddRemoteEnvAddRemoteEnv', 'AnthropicProviderDataInput', 'ApiKeyCreate', 'ArtifactFilter', 'AsyncBaseClientOpenTelemetry', 'AsyncGQLClient', 'AttachModel', 'AttachModelToUseCase', 'AttachModelToUseCaseAttachModel', 'AuthProviderKind', 'BaseClientOpenTelemetry', 'BaseModel', 'BillingCycle', 'CancelABCampaign', 'CancelAllocationInput', 'CancelJob', 'CancelJobCancelJob', 'CapabilityFilter', 'CompletionComparisonFeedbackData', 'CompletionComparisonFeedbackDataModel', 'CompletionComparisonFilterInput', 'CompletionData', 'CompletionDataChatMessages', 'CompletionDataComparisonFeedbacks', 'CompletionDataComparisonFeedbacksMetric', 'CompletionDataComparisonFeedbacksOtherCompletion', 'CompletionDataComparisonFeedbacksPreferedCompletion', 'CompletionDataComparisonFeedbacksUsecase', 'CompletionDataDirectFeedbacks', 'CompletionDataDirectFeedbacksMetric', 'CompletionDataLabels', 'CompletionDataMetadata', 'CompletionDataMetadataUsage', 'CompletionDataModel', 'CompletionFeedbackFilterInput', 'CompletionGroupBy', 'CompletionLabelValue', 'CompletionSource', 'CompletionsByFilters', 'CompletionsById', 'ComputePoolCapability', 'CreateAbCampaign', 'CreateAbCampaignCreateAbCampaign', 'CreateCustomRecipe', 'CreateCustomRecipeCreateCustomRecipe', 'CreateDatasetFromMultipartUpload', 'CreateDatasetFromMultipartUploadCreateDatasetFromMultipartUpload', 'CreateGrader', 'CreateGraderCreateGrader', 'CreateJob', 'CreateJobCreateJob', 'CreateJudge', 'CreateJudgeCreateJudge', 'CreateMetric', 'CreateMetricCreateMetric', 'CreatePrebuiltJudge', 'CreatePrebuiltJudgeCreatePrebuiltJudge', 'CreateRecipeInput', 'CreateRole', 'CreateRoleCreateRole', 'CreateTeam', 'CreateTeamCreateTeam', 'CreateToolProviderInput', 'CreateUseCase', 'CreateUseCaseCreateUseCase', 'CreateUser', 'CreateUserCreateUser', 'CursorPageInput', 'CustomConfigInput', 'CustomRecipeData', 'CustomRecipeDataCreatedBy', 'CustomRecipeDataLabels', 'CustomRecipeFilterInput', 'DatasetCompletionQuery', 'DatasetCreate', 'DatasetCreateFromFilters', 'DatasetCreateFromMultipartUpload', 'DatasetData', 'DatasetDataMetricsUsage', 'DatasetDataMetricsUsageMetric', 'DatasetKind', 'DatasetSource', 'DatasetStatus', 'DatasetUploadProcessingStatus', 'DatasetUploadProcessingStatusDatasetUploadProcessingStatus', 'DatasetUploadProcessingStatusInput', 'DateBucketUnit', 'DeleteCustomRecipe', 'DeleteDataset', 'DeleteGrader', 'DeleteGraderDeleteGrader', 'DeleteJudge', 'DeleteJudgeDeleteJudge', 'DeleteUser', 'DeleteUserDeleteUser', 'DeployModel', 'DescribeAbCampaign', 'DescribeAbCampaignAbCampaign', 'DescribeAbCampaignAbCampaignReport', 'DescribeDataset', 'DescribeDatasetDataset', 'DescribeInteraction', 'DescribeInteractionCompletion', 'DescribeJob', 'DescribeJobJob', 'DescribeMetric', 'DescribeMetricAdmin', 'DescribeMetricAdminMetric', 'DescribeMetricMetric', 'DescribeModel', 'DescribeModelAdmin', 'DescribeModelAdminModel', 'DescribeModelAdminModelBackbone', 'DescribeModelModel', 'DescribeModelModelBackbone', 'DescribeUseCase', 'DescribeUseCaseUseCase', 'EmojiInput', 'ExternalModelProviderName', 'FeedbackAddInput', 'FeedbackFilterInput', 'FeedbackType', 'FeedbackUpdateInput', 'FromGroupsQuery', 'GQLClient', 'GetCustomRecipe', 'GetCustomRecipeCustomRecipe', 'GetGrader', 'GetGraderGrader', 'GetJudge', 'GetJudgeJudge', 'GlobalUsageFilterInput', 'GoogleProviderDataInput', 'GraderConfigInput', 'GraderCreateInput', 'GraderData', 'GraderDataGraderConfigCustomConfigOutput', 'GraderDataGraderConfigJudgeConfigOutput', 'GraderDataGraderConfigJudgeConfigOutputExamples', 'GraderDataGraderConfigJudgeConfigOutputExamplesInput', 'GraderDataGraderConfigJudgeConfigOutputModel', 'GraderDataGraderConfigPrebuiltConfigOutput', 'GraderDataGraderConfigPrebuiltConfigOutputModel', 'GraderDataGraderConfigPrebuiltConfigOutputPrebuiltCriteria', 'GraderDataGraderConfigRemoteConfigOutput', 'GraderDataMetric', 'GraderDataUseCase', 'GraderTypeEnum', 'GraderUpdateInput', 'GraphQLClientError', 'GraphQLClientGraphQLError', 'GraphQLClientGraphQLMultiError', 'GraphQLClientHttpError', 'GraphQLClientInvalidResponseError', 'GroupSelection', 'GroupSelectionQuery', 'HarmonyGroupData', 'HarmonyGroupDataComputePool', 'HarmonyGroupDataGpuAllocations', 'HarmonyGroupDataOnlineModels', 'HarmonyStatus', 'JobArtifactFilter', 'JobArtifactKind', 'JobArtifactStatus', 'JobData', 'JobDataCreatedBy', 'JobDataDetails', 'JobDataDetailsArtifacts', 'JobDataDetailsArtifactsByproductsDatasetByproducts', 'JobDataDetailsArtifactsByproductsEvaluationByproducts', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResults', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsMetric', 'JobDataDetailsArtifactsByproductsEvaluationByproductsEvalResultsModelService', 'JobDataDetailsArtifactsByproductsModelByproducts', 'JobDataRecipe', 'JobDataStages', 'JobDataStagesInfoBatchInferenceJobStageOutput', 'JobDataStagesInfoEvalJobStageOutput', 'JobDataStagesInfoTrainingJobStageOutput', 'JobDataUseCase', 'JobInput', 'JobKind', 'JobStageOutputData', 'JobStageOutputDataInfoBatchInferenceJobStageOutput', 'JobStageOutputDataInfoEvalJobStageOutput', 'JobStageOutputDataInfoTrainingJobStageOutput', 'JobStatus', 'JobStatusOutput', 'JudgeCapability', 'JudgeConfigInput', 'JudgeCreate', 'JudgeData', 'JudgeDataExamples', 'JudgeDataExamplesInput', 'JudgeDataMetric', 'JudgeDataModel', 'JudgeExampleInput', 'JudgeExampleInputTurnEntry', 'JudgeUpdate', 'LabelFilter', 'LabelInput', 'LinkMetric', 'LinkMetricLinkMetric', 'ListAbCampaigns', 'ListAbCampaignsAbCampaigns', 'ListCompletionsFilterInput', 'ListComputePools', 'ListComputePoolsComputePools', 'ListComputePoolsComputePoolsHarmonyGroups', 'ListCustomRecipes', 'ListCustomRecipesCustomRecipes', 'ListDatasets', 'ListDatasetsDatasets', 'ListGraders', 'ListGradersGraders', 'ListGroupedInteractions', 'ListGroupedInteractionsCompletionsGrouped', 'ListGroupedInteractionsCompletionsGroupedNodes', 'ListGroupedInteractionsCompletionsGroupedNodesCompletions', 'ListGroupedInteractionsCompletionsGroupedNodesCompletionsNodes', 'ListGroupedInteractionsCompletionsGroupedNodesDirectFeedbacksStats', 'ListGroupedInteractionsCompletionsGroupedNodesDirectFeedbacksStatsMetric', 'ListGroupedInteractionsCompletionsGroupedPageInfo', 'ListHarmonyGroups', 'ListHarmonyGroupsHarmonyGroups', 'ListInteractions', 'ListInteractionsCompletions', 'ListInteractionsCompletionsNodes', 'ListInteractionsCompletionsPageInfo', 'ListJobs', 'ListJobsFilterInput', 'ListJobsJobs', 'ListJobsJobsNodes', 'ListJobsJobsPageInfo', 'ListJudgeVersions', 'ListJudgeVersionsJudgeVersions', 'ListJudges', 'ListJudgesJudges', 'ListMetrics', 'ListMetricsMetrics', 'ListModels', 'ListModelsModels', 'ListModelsModelsBackbone', 'ListPermissions', 'ListRemoteEnvs', 'ListRemoteEnvsRemoteEnvs', 'ListRoles', 'ListRolesRoles', 'ListTeams', 'ListTeamsTeams', 'ListUseCases', 'ListUseCasesUseCases', 'ListUsers', 'ListUsersUsers', 'LoadDataset', 'LoadDatasetCreateDataset', 'LockGrader', 'LockGraderLockGrader', 'Me', 'MeMe', 'MetricAggregation', 'MetricCreate', 'MetricData', 'MetricDataAdmin', 'MetricDataAdminUseCases', 'MetricGetOrCreate', 'MetricKind', 'MetricLink', 'MetricScoringType', 'MetricTrendInput', 'MetricUnlink', 'MetricWithContextData', 'ModelCapabilityFilter', 'ModelComputeConfigInput', 'ModelData', 'ModelDataAdmin', 'ModelDataAdminUseCases', 'ModelDataComputeConfig', 'ModelFilter', 'ModelOnline', 'ModelPlacementInput', 'ModelProviderDataInput', 'ModelServiceData', 'ModelServiceDataModel', 'ModelServiceDataModelBackbone', 'ModelServiceDisconnect', 'ModelServiceFilter', 'ModelserviceStatus', 'OpenAIModel', 'OpenAIProviderDataInput', 'OrderPair', 'PrebuiltConfigInput', 'PrebuiltCriteriaKey', 'PrebuiltJudgeCreate', 'Protocol', 'ProviderName', 'RemoteConfigInput', 'RemoteEnvCreate', 'RemoteEnvData', 'RemoteEnvStatus', 'RemoveRemoteEnv', 'RemoveTeamMember', 'RemoveTeamMemberRemoveTeamMember', 'ResizeInferencePartition', 'ResizePartitionInput', 'RoleCreate', 'SampleConfig', 'SearchInput', 'SelectionTypeInput', 'SessionStatus', 'ShareUseCase', 'ShareUseCaseShareUseCase', 'SortDirection', 'SystemPromptTemplateCreate', 'SystemPromptTemplateUpdate', 'TeamCreate', 'TeamMemberRemove', 'TeamMemberSet', 'TerminateModel', 'TestRemoteEnv', 'TestRemoteEnvTestRemoteEnvRemoteEnvTestOffline', 'TestRemoteEnvTestRemoteEnvRemoteEnvTestOnline', 'TimeRange', 'TimeseriesInput', 'TimeseriesInterval', 'UnitConfigInput', 'UnitPosition', 'UnlinkMetric', 'UpdateCompletion', 'UpdateCustomRecipe', 'UpdateCustomRecipeUpdateCustomRecipe', 'UpdateGrader', 'UpdateGraderUpdateGrader', 'UpdateJudge', 'UpdateJudgeUpdateJudge', 'UpdateModel', 'UpdateModelComputeConfig', 'UpdateModelComputeConfigUpdateModelComputeConfig', 'UpdateModelService', 'UpdateModelUpdateModelService', 'UpdateRecipeInput', 'UpdateToolProviderInput', 'UpdateUser', 'UpdateUserSetTeamMember', 'UpdateUserSetTeamMemberRole', 'UpdateUserSetTeamMemberTeam', 'UpdateUserSetTeamMemberUser', 'Upload', 'UsageFilterInput', 'UsagePerUseCaseFilterInput', 'UseCaseCreate', 'UseCaseData', 'UseCaseDataMetrics', 'UseCaseDataModelServices', 'UseCaseDataShares', 'UseCaseDataSharesRole', 'UseCaseDataSharesTeam', 'UseCaseFilter', 'UseCaseMetadataInput', 'UseCaseSettingsInput', 'UseCaseShareInput', 'UseCaseShares', 'UseCaseUpdate', 'UserCreate', 'UserCreateTeamWithRole', 'UserData', 'UserDataTeams', 'UserDataTeamsRole', 'UserDataTeamsTeam', 'WidgetInput']
@@ -486,7 +486,7 @@ class AsyncGQLClient(AsyncBaseClientOpenTelemetry):
486
486
  return ListUsers.model_validate(data)
487
487
 
488
488
  async def me(self, **kwargs: Any) -> Me:
489
- query = gql('\n query Me {\n me {\n ...UserData\n apiKeys {\n key\n createdAt\n }\n }\n }\n\n fragment UserData on User {\n id\n email\n name\n createdAt\n teams {\n team {\n id\n key\n name\n createdAt\n }\n role {\n id\n key\n name\n createdAt\n permissions\n }\n }\n }\n ')
489
+ query = gql('\n query Me {\n me {\n ...UserData\n }\n }\n\n fragment UserData on User {\n id\n email\n name\n createdAt\n teams {\n team {\n id\n key\n name\n createdAt\n }\n role {\n id\n key\n name\n createdAt\n permissions\n }\n }\n }\n ')
490
490
  variables: Dict[str, object] = {}
491
491
  response = await self.execute(query=query, operation_name='Me', variables=variables, **kwargs)
492
492
  data = self.get_data(response)
@@ -486,7 +486,7 @@ class GQLClient(BaseClientOpenTelemetry):
486
486
  return ListUsers.model_validate(data)
487
487
 
488
488
  def me(self, **kwargs: Any) -> Me:
489
- query = gql('\n query Me {\n me {\n ...UserData\n apiKeys {\n key\n createdAt\n }\n }\n }\n\n fragment UserData on User {\n id\n email\n name\n createdAt\n teams {\n team {\n id\n key\n name\n createdAt\n }\n role {\n id\n key\n name\n createdAt\n permissions\n }\n }\n }\n ')
489
+ query = gql('\n query Me {\n me {\n ...UserData\n }\n }\n\n fragment UserData on User {\n id\n email\n name\n createdAt\n teams {\n team {\n id\n key\n name\n createdAt\n }\n role {\n id\n key\n name\n createdAt\n permissions\n }\n }\n }\n ')
490
490
  variables: Dict[str, object] = {}
491
491
  response = self.execute(query=query, operation_name='Me', variables=variables, **kwargs)
492
492
  data = self.get_data(response)
@@ -587,6 +587,7 @@ class CustomRecipeFields(GraphQLField):
587
587
  id: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('id')
588
588
  key: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('key')
589
589
  name: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('name')
590
+ is_multifile: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('isMultifile')
590
591
  editable: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('editable')
591
592
  hidden: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('hidden')
592
593
  builtin: 'CustomRecipeGraphQLField' = CustomRecipeGraphQLField('builtin')
@@ -626,6 +627,8 @@ class CustomRecipeJobDetailsFields(GraphQLField):
626
627
  @classmethod
627
628
  def artifacts(cls) -> 'JobArtifactFields':
628
629
  return JobArtifactFields('artifacts')
630
+ num_gpus: 'CustomRecipeJobDetailsGraphQLField' = CustomRecipeJobDetailsGraphQLField('numGpus')
631
+ gpu_duration_ms: 'CustomRecipeJobDetailsGraphQLField' = CustomRecipeJobDetailsGraphQLField('gpuDurationMs')
629
632
 
630
633
  def fields(self, *subfields: Union[CustomRecipeJobDetailsGraphQLField, 'JobArtifactFields']) -> 'CustomRecipeJobDetailsFields':
631
634
  """Subfields should come from the CustomRecipeJobDetailsFields class"""
@@ -1056,6 +1059,7 @@ class JobArtifactFields(GraphQLField):
1056
1059
  job_id: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('jobId')
1057
1060
  name: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('name')
1058
1061
  kind: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('kind')
1062
+ status: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('status')
1059
1063
  uri: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('uri')
1060
1064
  metadata: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('metadata')
1061
1065
  created_at: 'JobArtifactGraphQLField' = JobArtifactGraphQLField('createdAt')
@@ -1417,15 +1421,15 @@ class ModelFields(GraphQLField):
1417
1421
  return MetricWithContextFields('metrics')
1418
1422
 
1419
1423
  @classmethod
1420
- def use_cases(cls, filter: UseCaseFilter, attached: bool) -> 'UseCaseFields':
1424
+ def use_cases(cls, filter: UseCaseFilter) -> 'UseCaseFields':
1421
1425
  """Return the list of UseCase which use this model"""
1422
- arguments: Dict[str, Dict[str, Any]] = {'filter': {'type': 'UseCaseFilter!', 'value': filter}, 'attached': {'type': 'Boolean!', 'value': attached}}
1426
+ arguments: Dict[str, Dict[str, Any]] = {'filter': {'type': 'UseCaseFilter!', 'value': filter}}
1423
1427
  cleared_arguments = {key: value for key, value in arguments.items() if value['value'] is not None}
1424
1428
  return UseCaseFields('useCases', arguments=cleared_arguments)
1425
1429
 
1426
1430
  @classmethod
1427
- def model_services(cls, filter: UseCaseFilter, attached: bool) -> 'ModelServiceFields':
1428
- arguments: Dict[str, Dict[str, Any]] = {'filter': {'type': 'UseCaseFilter!', 'value': filter}, 'attached': {'type': 'Boolean!', 'value': attached}}
1431
+ def model_services(cls, filter: UseCaseFilter) -> 'ModelServiceFields':
1432
+ arguments: Dict[str, Dict[str, Any]] = {'filter': {'type': 'UseCaseFilter!', 'value': filter}}
1429
1433
  cleared_arguments = {key: value for key, value in arguments.items() if value['value'] is not None}
1430
1434
  return ModelServiceFields('modelServices', arguments=cleared_arguments)
1431
1435
  provider_name: 'ModelGraphQLField' = ModelGraphQLField('providerName')
@@ -2193,11 +2197,7 @@ class UserFields(GraphQLField):
2193
2197
  def teams(cls) -> 'TeamWithroleFields':
2194
2198
  return TeamWithroleFields('teams')
2195
2199
 
2196
- @classmethod
2197
- def api_keys(cls) -> 'ApiKeyFields':
2198
- return ApiKeyFields('apiKeys')
2199
-
2200
- def fields(self, *subfields: Union[UserGraphQLField, 'ApiKeyFields', 'TeamWithroleFields']) -> 'UserFields':
2200
+ def fields(self, *subfields: Union[UserGraphQLField, 'TeamWithroleFields']) -> 'UserFields':
2201
2201
  """Subfields should come from the UserFields class"""
2202
2202
  self._subfields.extend(subfields)
2203
2203
  return self
@@ -94,6 +94,13 @@ class JobArtifactKind(str, Enum):
94
94
  DATASET = 'DATASET'
95
95
  MODEL = 'MODEL'
96
96
 
97
+ class JobArtifactStatus(str, Enum):
98
+ """@public"""
99
+ PENDING = 'PENDING'
100
+ PROCESSING = 'PROCESSING'
101
+ READY = 'READY'
102
+ ERROR = 'ERROR'
103
+
97
104
  class JobKind(str, Enum):
98
105
  """@public"""
99
106
  TRAINING = 'TRAINING'
@@ -50,6 +50,8 @@ class AnthropicProviderDataInput(BaseModel):
50
50
  class ApiKeyCreate(BaseModel):
51
51
  """@private"""
52
52
  user: str
53
+ expiration_for_previous_keys: Optional[int | str] = Field(alias='expirationForPreviousKeys', default=None)
54
+ 'If not provided, previous keys expire immediately'
53
55
 
54
56
  class ArtifactFilter(BaseModel):
55
57
  """@private"""
@@ -1,5 +1,4 @@
1
- from typing import List, Optional
2
- from pydantic import Field
1
+ from typing import Optional
3
2
  from .base_model import BaseModel
4
3
  from .fragments import UserData
5
4
 
@@ -9,11 +8,5 @@ class Me(BaseModel):
9
8
 
10
9
  class MeMe(UserData):
11
10
  """@public"""
12
- api_keys: List['MeMeApiKeys'] = Field(alias='apiKeys')
13
-
14
- class MeMeApiKeys(BaseModel):
15
- """@public"""
16
- key: str
17
- created_at: int = Field(alias='createdAt')
18
- Me.model_rebuild()
19
- MeMe.model_rebuild()
11
+ pass
12
+ Me.model_rebuild()
@@ -36,7 +36,7 @@ class ComputePools(SyncAPIResource, UseCaseResource):
36
36
  """
37
37
  cps = self.list()
38
38
  found_cp = False
39
- for cp in cps.compute_pools:
39
+ for cp in cps:
40
40
  if cp.key == compute_pool_key:
41
41
  selected_cp = cp
42
42
  found_cp = True
@@ -75,7 +75,7 @@ class AsyncComputePools(AsyncAPIResource, UseCaseResource):
75
75
  """
76
76
  cps = await self.list()
77
77
  found_cp = False
78
- for cp in cps.compute_pools:
78
+ for cp in cps:
79
79
  if cp.key == compute_pool_key:
80
80
  selected_cp = cp
81
81
  found_cp = True
@@ -68,12 +68,13 @@ class Jobs(SyncAPIResource, UseCaseResource): # type: ignore[misc]
68
68
  def run(
69
69
  self,
70
70
  recipe_key: str,
71
- args: dict[str, Any],
72
71
  num_gpus: int,
72
+ args: dict[str, Any] | None = None,
73
73
  name: str | None = None,
74
74
  use_case: str | None = None,
75
75
  compute_pool: str | None = None,
76
76
  ) -> JobDataPlus:
77
+ args = args or {}
77
78
  job_data = self._gql_client.create_job(
78
79
  input=JobInput(
79
80
  recipe=recipe_key,
@@ -139,12 +140,13 @@ class AsyncJobs(AsyncAPIResource, UseCaseResource): # type: ignore[misc]
139
140
  async def run(
140
141
  self,
141
142
  recipe_key: str,
142
- args: dict[str, Any],
143
143
  num_gpus: int,
144
+ args: dict[str, Any] | None = None,
144
145
  name: str | None = None,
145
146
  use_case: str | None = None,
146
147
  compute_pool: str | None = None,
147
148
  ) -> JobDataPlus:
149
+ args = args or {}
148
150
  job_data = (
149
151
  await self._gql_client.create_job(
150
152
  input=JobInput(
@@ -42,7 +42,8 @@ class Recipes(SyncAPIResource, UseCaseResource): # type: ignore[misc]
42
42
  def upload(
43
43
  self,
44
44
  path: str,
45
- recipe_key: str,
45
+ recipe_key: str | None = None,
46
+ entrypoint: str | None = None,
46
47
  name: str | None = None,
47
48
  description: str | None = None,
48
49
  labels: dict[str, str] | None = None,
@@ -50,8 +51,25 @@ class Recipes(SyncAPIResource, UseCaseResource): # type: ignore[misc]
50
51
  ) -> CustomRecipeData:
51
52
  """
52
53
  Upload a recipe from either a single Python file or a directory (path).
53
- If a directory is provided, it must contain a 'main.py' and will be zipped in-memory before upload.
54
+
55
+ Args:
56
+ path: Path to a Python file or directory containing the recipe
57
+ recipe_key: Optional unique key for the recipe. If not provided, inferred from:
58
+ - File name (without .py) if path is a file
59
+ - "dir_name/entrypoint_name" if path is a directory and custom entrypoint is specified
60
+ - Directory name if path is a directory and no custom entrypoint is specified
61
+ entrypoint: Optional relative path to the entrypoint file within a directory.
62
+ If specified, this file will be used as main.py. Cannot be used if
63
+ main.py already exists in the directory, or if path is a file.
64
+ name: Optional display name for the recipe
65
+ description: Optional description
66
+ labels: Optional key-value labels
67
+ use_case: Optional use case identifier
54
68
  """
69
+ p = Path(path)
70
+ if recipe_key is None:
71
+ recipe_key = _get_recipe_key(p, entrypoint=entrypoint)
72
+
55
73
  inferred_name = name or recipe_key
56
74
  label_inputs = [LabelInput(key=k, value=v) for k, v in labels.items()] if labels else None
57
75
  input = CreateRecipeInput(
@@ -60,10 +78,13 @@ class Recipes(SyncAPIResource, UseCaseResource): # type: ignore[misc]
60
78
  description=description,
61
79
  labels=label_inputs,
62
80
  )
63
- with _upload_from_path(path) as file_upload:
64
- return self._gql_client.create_custom_recipe(
81
+
82
+ with _upload_from_path(path, entrypoint=entrypoint) as file_upload:
83
+ new_recipe = self._gql_client.create_custom_recipe(
65
84
  use_case=self.use_case_key(use_case), input=input, file=file_upload
66
85
  ).create_custom_recipe
86
+ logger.info(f"New recipe created with key `{new_recipe.key}`")
87
+ return new_recipe
67
88
 
68
89
  def get(
69
90
  self,
@@ -160,12 +181,34 @@ class AsyncRecipes(AsyncAPIResource, UseCaseResource): # type: ignore[misc]
160
181
  async def upload(
161
182
  self,
162
183
  path: str,
163
- recipe_key: str,
184
+ recipe_key: str | None = None,
185
+ entrypoint: str | None = None,
164
186
  name: str | None = None,
165
187
  description: str | None = None,
166
188
  labels: Sequence[tuple[str, str]] | None = None,
167
189
  use_case: str | None = None,
168
190
  ) -> CustomRecipeData:
191
+ """
192
+ Upload a recipe from either a single Python file or a directory (path).
193
+
194
+ Args:
195
+ path: Path to a Python file or directory containing the recipe
196
+ recipe_key: Optional unique key for the recipe. If not provided, inferred from:
197
+ - File name (without .py) if path is a file
198
+ - "dir_name/entrypoint_name" if path is a directory and custom entrypoint is specified
199
+ - Directory name if path is a directory and no custom entrypoint is specified
200
+ entrypoint: Optional relative path to the entrypoint file within a directory.
201
+ If specified, this file will be used as main.py. Cannot be used if
202
+ main.py already exists in the directory, or if path is a file.
203
+ name: Optional display name for the recipe
204
+ description: Optional description
205
+ labels: Optional key-value labels
206
+ use_case: Optional use case identifier
207
+ """
208
+ p = Path(path)
209
+ if recipe_key is None:
210
+ recipe_key = _get_recipe_key(p, entrypoint=entrypoint)
211
+
169
212
  inferred_name = name or recipe_key
170
213
  label_inputs = [LabelInput(key=k, value=v) for k, v in labels] if labels else None
171
214
  input = CreateRecipeInput(
@@ -174,12 +217,14 @@ class AsyncRecipes(AsyncAPIResource, UseCaseResource): # type: ignore[misc]
174
217
  description=description,
175
218
  labels=label_inputs,
176
219
  )
177
- with _upload_from_path(path) as file_upload:
178
- return (
220
+ with _upload_from_path(path, entrypoint=entrypoint) as file_upload:
221
+ new_recipe = (
179
222
  await self._gql_client.create_custom_recipe(
180
223
  use_case=self.use_case_key(use_case), input=input, file=file_upload
181
224
  )
182
225
  ).create_custom_recipe
226
+ logger.info(f"New recipe create with key {new_recipe.key}")
227
+ return new_recipe
183
228
 
184
229
  async def get(
185
230
  self,
@@ -275,6 +320,21 @@ def _count_keys_recursively(data: Any) -> int:
275
320
  return count
276
321
 
277
322
 
323
+ def _get_recipe_key(path: Path, entrypoint: str | None = None) -> str:
324
+ if path.is_file():
325
+ recipe_key = path.stem
326
+ elif path.is_dir():
327
+ if entrypoint:
328
+ entrypoint_stem = Path(entrypoint).stem
329
+ recipe_key = f"{path.name}/{entrypoint_stem}"
330
+ else:
331
+ recipe_key = path.name
332
+ else:
333
+ raise ValueError(f"Path must be a Python file or directory: {path}")
334
+
335
+ return recipe_key
336
+
337
+
278
338
  def _validate_python_file(path: Path) -> None:
279
339
  """Validate that the path exists, is a file and has a .py extension."""
280
340
  if not path.exists():
@@ -285,40 +345,53 @@ def _validate_python_file(path: Path) -> None:
285
345
  raise ValueError(f"Expected a Python file with .py extension, got: {path}")
286
346
 
287
347
 
288
- def _validate_recipe_directory(dir_path: Path) -> None:
289
- """Validate that the directory exists and contains a main.py file."""
348
+ def _validate_recipe_directory(dir_path: Path, entrypoint: str | None = None) -> None:
290
349
  if not dir_path.exists():
291
350
  raise FileNotFoundError(f"Directory not found: {dir_path}")
292
351
  if not dir_path.is_dir():
293
352
  raise ValueError(f"Expected a directory path, got a file: {dir_path}")
353
+
294
354
  main_py = dir_path / "main.py"
295
- if not main_py.exists() or not main_py.is_file():
296
- raise FileNotFoundError(f"Directory must contain a 'main.py' file: {dir_path}")
355
+ main_py_exists = main_py.exists() and main_py.is_file()
356
+
357
+ if entrypoint:
358
+ if main_py_exists:
359
+ raise ValueError(
360
+ f"Cannot specify entrypoint when main.py already exists in directory: {dir_path}. "
361
+ f"Either remove/rename main.py or use it directly without specifying an entrypoint."
362
+ )
363
+ entrypoint_path = dir_path / entrypoint
364
+ if not entrypoint_path.exists() or not entrypoint_path.is_file():
365
+ raise FileNotFoundError(f"Specified entrypoint file not found: {entrypoint} in directory {dir_path}")
366
+ else:
367
+ if not main_py_exists:
368
+ raise FileNotFoundError(
369
+ f"Directory must contain a 'main.py' file, or in alternative you must specify an `entrypoint` file"
370
+ )
297
371
 
298
372
 
299
- def _zip_directory_to_bytes_io(dir_path: Path) -> io.BytesIO:
300
- """Zip the contents of a directory into an in-memory BytesIO buffer."""
373
+ def _zip_directory_to_bytes_io(dir_path: Path, entrypoint: str | None = None) -> io.BytesIO:
301
374
  buffer = io.BytesIO()
302
375
  with zipfile.ZipFile(buffer, mode="w", compression=zipfile.ZIP_DEFLATED) as zf:
303
376
  for root, _, files in os.walk(dir_path):
304
377
  for file_name in files:
305
378
  file_path = Path(root) / file_name
306
379
  arcname = file_path.relative_to(dir_path)
380
+ if entrypoint and arcname.as_posix() == entrypoint:
381
+ arcname = Path("main.py")
382
+
307
383
  zf.write(file_path, arcname.as_posix())
308
384
  buffer.seek(0)
309
385
  return buffer
310
386
 
311
387
 
312
388
  @contextmanager
313
- def _upload_from_path(path: str):
314
- """
315
- Context manager yielding an Upload object for a Python file or a directory.
316
-
317
- - If path is a .py file, validates and opens it for upload.
318
- - If path is a directory, validates it contains main.py, zips contents in-memory.
319
- """
389
+ def _upload_from_path(path: str, entrypoint: str | None = None):
320
390
  p = Path(path)
391
+
321
392
  if p.is_file():
393
+ if entrypoint:
394
+ raise ValueError(f"Entrypoint parameter is not supported for single file recipe uploads")
322
395
  _validate_python_file(p)
323
396
  filename = p.name
324
397
  content_type = mimetypes.guess_type(str(p))[0] or "application/octet-stream"
@@ -328,28 +401,13 @@ def _upload_from_path(path: str):
328
401
  finally:
329
402
  f.close()
330
403
  elif p.is_dir():
331
- _validate_recipe_directory(p)
332
- # Ensure __init__.py exists at the root of the directory before zipping
333
- created_init = False
334
- root_init = p / "__init__.py"
404
+ _validate_recipe_directory(p, entrypoint=entrypoint)
335
405
  zip_buffer = None
336
406
  try:
337
- if not root_init.exists():
338
- root_init.touch()
339
- created_init = True
340
- logger.info(f"Added __init__.py to your directory, as it is required for proper execution of recipe")
341
- zip_buffer = _zip_directory_to_bytes_io(p)
342
- finally:
343
- if created_init:
344
- try:
345
- root_init.unlink()
346
- logger.info(f"Cleaned up __init__.py from your directory")
347
- except Exception:
348
- logger.error(f"Failed to remove __init__.py from your directory")
349
- pass
350
- if zip_buffer is None:
351
- raise RuntimeError("Failed to create in-memory zip for directory upload")
352
-
407
+ zip_buffer = _zip_directory_to_bytes_io(p, entrypoint=entrypoint)
408
+ except Exception:
409
+ logger.error(f"Failed to create in-memory zip for directory upload.")
410
+ raise
353
411
  filename = f"{p.name}.zip"
354
412
  try:
355
413
  yield Upload(filename=filename, content=zip_buffer, content_type="application/zip")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adaptive-sdk
3
- Version: 0.1.10
3
+ Version: 0.1.12
4
4
  Summary: Python SDK for Adaptive Engine
5
5
  Author-email: Vincent Debergue <vincent@adaptive-ml.com>, Joao Moura <joao@adaptive-ml.com>, Yacine Bouraoui <yacine@adaptive-ml.com>
6
6
  Requires-Python: >=3.10
@@ -10,7 +10,7 @@ Requires-Dist: httpx-sse >= 0.4.0
10
10
  Requires-Dist: gql >= 3.5.0
11
11
  Requires-Dist: pydantic[email] >= 2.9.0
12
12
  Requires-Dist: pyhumps >= 3.8.0
13
- Requires-Dist: fastapi >= 0.121.1
13
+ Requires-Dist: fastapi >= 0.121.2
14
14
  Requires-Dist: uvicorn >= 0.34.0
15
15
  Requires-Dist: jsonschema==4.24.0
16
16
  Requires-Dist: websockets==15.0.1
@@ -13,20 +13,20 @@ adaptive_sdk/external/reward_client.py,sha256=TSVdi437McUkMModDQV6ZswduaDmmG1Bvk
13
13
  adaptive_sdk/external/reward_server.py,sha256=yT8vqAEIoaq8nFZYaku5IoK0_7fX9uX_dfF1CxcDKnA,7488
14
14
  adaptive_sdk/external/reward_types.py,sha256=aZmTolT0OjgObo-64zJkarUKOY4RdxHnsQt8AKAaq1w,1710
15
15
  adaptive_sdk/external/websocket_utils.py,sha256=QN-K1IRbqe1LdQTz6vXhVgn-R2SjOB80NjGD2w_LaAo,1284
16
- adaptive_sdk/graphql_client/__init__.py,sha256=gAbg4sm_anABglsmVQH_emoq5pCu_SvLUHfjVX4rxBE,21564
16
+ adaptive_sdk/graphql_client/__init__.py,sha256=Kdi29ZNGnz0uBvRqxY1WKJkmh-R5QEoQEOiQc2poPUo,21576
17
17
  adaptive_sdk/graphql_client/add_external_model.py,sha256=9VpQHlJMm5t_Ja_SX2MkYcSG1IQpem6mrdXMfNTa1oo,352
18
18
  adaptive_sdk/graphql_client/add_hf_model.py,sha256=aC2IcYftepe28Hi01Kg0w3A7bjKrStWasx6aXiqghJU,312
19
19
  adaptive_sdk/graphql_client/add_model.py,sha256=Uyhpxkziz1Pv2S7Q0wOaKGK4krjmEf2PeLK0yEs89Hs,461
20
20
  adaptive_sdk/graphql_client/add_remote_env.py,sha256=X94F94tnMzuX9TC_Ieowngw35gJxnKL2YST2sqEJ7CY,328
21
21
  adaptive_sdk/graphql_client/async_base_client_open_telemetry.py,sha256=XSRJGEcyfWnFjrDz4Un6xfQWOxr7jWto1vYjbYTQeo0,19761
22
- adaptive_sdk/graphql_client/async_client.py,sha256=hnEGHgc7StUSfNSmTIPQKTWUG7C8GktYqynhOZmRGTs,119145
22
+ adaptive_sdk/graphql_client/async_client.py,sha256=v84UFrgxoVqC0A-XbwQz4kLVBEtGsuGyVHWJFzio4Kc,119047
23
23
  adaptive_sdk/graphql_client/attach_model_to_use_case.py,sha256=WyERM4wxKrUS1u9VZ3FUasZu5AVSbRswzy9jmxssTFM,361
24
24
  adaptive_sdk/graphql_client/base_client_open_telemetry.py,sha256=IV96gRr5FuH-dWMU5PBvQhTwEsV7udsXU-Dyh-Mx-4k,9398
25
25
  adaptive_sdk/graphql_client/base_model.py,sha256=2xxKA4sIdlGPIezw06XP9bseSxBURU7nivgt_gL44iA,621
26
26
  adaptive_sdk/graphql_client/base_operation.py,sha256=aooq1M4r79cvMoganZ2RvQ3-v0io22fGLOVfl3UBqPQ,4635
27
27
  adaptive_sdk/graphql_client/cancel_ab_campaign.py,sha256=JAEpmedz0jOu90U3KR0PYCMAhf2_E6h6WOT30HSE91k,176
28
28
  adaptive_sdk/graphql_client/cancel_job.py,sha256=3ZLoqrULi1mp5A5i4rD-gXliKhD8038IPfvCNBg0dPs,291
29
- adaptive_sdk/graphql_client/client.py,sha256=rGq0Uy4iiO79-ufnegJFkUPPcK9PzKcD-bY95YPh3rw,118200
29
+ adaptive_sdk/graphql_client/client.py,sha256=XwV4lEzQThVK31hPBmqwO5ncGqdgM-lXnr-tBRisvO8,118102
30
30
  adaptive_sdk/graphql_client/create_ab_campaign.py,sha256=___2iFSGnWKkjXz_MfxKUxi1EoQcSBv9AX8S7YoUeVw,374
31
31
  adaptive_sdk/graphql_client/create_custom_recipe.py,sha256=eIVLDHbdFG2qWjoZBLC3Xs40Fjy6L-u6wrABV5ibUxo,382
32
32
  adaptive_sdk/graphql_client/create_dataset_from_multipart_upload.py,sha256=eoqOfEviCFww5ElTknknV0qOpFTJQmQ1BeGLsRQ5iHc,730
@@ -39,7 +39,7 @@ adaptive_sdk/graphql_client/create_role.py,sha256=6aTdNOZxavMyjkH-g01uYOZgpjYWcA
39
39
  adaptive_sdk/graphql_client/create_team.py,sha256=6Alt1ralE1-Xvp2wrEaLUHMW5RtiFqz2fIsUYE_2LbM,370
40
40
  adaptive_sdk/graphql_client/create_use_case.py,sha256=sekD76jWCo3zNCfMsBGhVYfNSIK4JPPBz9066BOt49g,332
41
41
  adaptive_sdk/graphql_client/create_user.py,sha256=gurD0kZgncXt1HBr7Oo5AkK5ubqFKpJvaR1rn506gHo,301
42
- adaptive_sdk/graphql_client/custom_fields.py,sha256=T461vWHgAhZdjk2fH7luhb5GuLA06dNnEg8D9x_8EcY,99817
42
+ adaptive_sdk/graphql_client/custom_fields.py,sha256=s77Stl8__yrPDAimCp2zoKefZdT6YxAwwN5atsfMw5Y,99937
43
43
  adaptive_sdk/graphql_client/custom_mutations.py,sha256=meo96-odIhk_NoFL_uDj78xguLOD-_DIYW2bj6ilvII,25341
44
44
  adaptive_sdk/graphql_client/custom_queries.py,sha256=dVMj82YFJg9wjcnZdmnCbEKEaLiL8QUgpCjr5ONuQAU,18242
45
45
  adaptive_sdk/graphql_client/custom_typing_fields.py,sha256=yT_a4kZOMIccqIm-sAG0zu70c-plQtQrZ6ynmfxjlDU,20786
@@ -59,13 +59,13 @@ adaptive_sdk/graphql_client/describe_metric_admin.py,sha256=_SKKwnFhZnbOTT97elEr
59
59
  adaptive_sdk/graphql_client/describe_model.py,sha256=UnsOnAyBjNsnkJaS4q5uwkSSvInHwRqUj3XqAoO0yO4,434
60
60
  adaptive_sdk/graphql_client/describe_model_admin.py,sha256=XUt_CBSMw1HRleUEWZn2snYt2BNSux_siqrVlwtqH-w,484
61
61
  adaptive_sdk/graphql_client/describe_use_case.py,sha256=WW0QkTmdfggN8YBUNGi8ShrP_fr2jXPR6Fer6jlQxu0,353
62
- adaptive_sdk/graphql_client/enums.py,sha256=SHZSmlL85LtwXJ32fOmto9N07mtAR6a3t4XbRrhGyuA,5108
62
+ adaptive_sdk/graphql_client/enums.py,sha256=dneXg7eIX_UzVNfdImhs_Z1JPulePP-zl_XqKk7Q1Qw,5257
63
63
  adaptive_sdk/graphql_client/exceptions.py,sha256=NiC6v-5S7aRDlvQTcHH3K5KvxWvk-c-PkIQQHkipTB8,2268
64
64
  adaptive_sdk/graphql_client/fragments.py,sha256=NMata4RWlGeR5rYJouo-PqRFGB2tN_9VBh3bBW6K8w4,22485
65
65
  adaptive_sdk/graphql_client/get_custom_recipe.py,sha256=7qxBZGQTqpc69k-NwzgFctaHWaRz0tHl7YlVSsEad6U,383
66
66
  adaptive_sdk/graphql_client/get_grader.py,sha256=kubHDBtUcq6mZtUR5_Of0QbjnGUPSYuavF3_xwmwbY8,233
67
67
  adaptive_sdk/graphql_client/get_judge.py,sha256=urEnHW3XfURi5GAFBPfbqzOZGQDxgsGRA6nZmUKmoMA,224
68
- adaptive_sdk/graphql_client/input_types.py,sha256=lFY7mKgDHHRNcXTsu_0QqTaG3wWTUoMw7sjlRWqGi88,20048
68
+ adaptive_sdk/graphql_client/input_types.py,sha256=BLT_xkluyu6O8w0wZGBgpZjgPsA_II02WAnk63UNpAA,20215
69
69
  adaptive_sdk/graphql_client/link_metric.py,sha256=EDH67ckBzzc6MYIGfsmgZRBnjqxLsCGwFUaFMXPEsBY,327
70
70
  adaptive_sdk/graphql_client/list_ab_campaigns.py,sha256=SIbU6I2OQkNHt0Gw6YStoiiwJHUk2rfXnpoGLzrFjxc,379
71
71
  adaptive_sdk/graphql_client/list_compute_pools.py,sha256=4Qli5Foxm3jztbUAL5gbwqtcrElwwlC4LGJMOMBI6Cc,782
@@ -88,7 +88,7 @@ adaptive_sdk/graphql_client/list_use_cases.py,sha256=fbEicXAKDTgsBwBVwtd68hMEPk-
88
88
  adaptive_sdk/graphql_client/list_users.py,sha256=9LCNz49jqxrUapHyOdnzs-ZtU1xsejqoXUmE8vsr-qY,256
89
89
  adaptive_sdk/graphql_client/load_dataset.py,sha256=P_h3wPTT4E5mbgJoR5jX1_5GhDLIJsA6lmYPT27VxY8,323
90
90
  adaptive_sdk/graphql_client/lock_grader.py,sha256=cCISIKjFaSakf-tr4oEWebieT5yrpvGxdS_R_E4iww8,305
91
- adaptive_sdk/graphql_client/me.py,sha256=0I4fqW8wtO-jQSsSym_dtWggdbEa3m71wH955-AswwI,440
91
+ adaptive_sdk/graphql_client/me.py,sha256=oR_m5QRalokWb9lZYSNgDzOBcNLuAgBIXZh7zfBerqw,227
92
92
  adaptive_sdk/graphql_client/remove_remote_env.py,sha256=lmEwudWc6bkU1ev2g9_QEOgkJT_n7n9P5wGm5AV2MY8,173
93
93
  adaptive_sdk/graphql_client/remove_team_member.py,sha256=H75WLcB4bM0yctfmmzztxSAzxvbOwWmkVZhO5DUuh1g,350
94
94
  adaptive_sdk/graphql_client/resize_inference_partition.py,sha256=osrAGQGYCFjAyfkftkxYW4Wv2VzMq_oW8i0x3_B8aKg,200
@@ -110,16 +110,16 @@ adaptive_sdk/resources/__init__.py,sha256=-cHNzI-hg1u-GGe-fVvV_L4JOgat2zJuKnC3E2
110
110
  adaptive_sdk/resources/abtests.py,sha256=9PCPjxuWwY9ec88ewnq54gkoELq5U5iaBmHhzLCAsFU,7698
111
111
  adaptive_sdk/resources/base_resource.py,sha256=D9adWSFxiDB7chVstDuBu1jcuXkE71UQJexnWENpC4A,1497
112
112
  adaptive_sdk/resources/chat.py,sha256=k-jh_IZfKwqoWNN2P5BhAM3P_f5HLybVZp35pUadwso,11954
113
- adaptive_sdk/resources/compute_pools.py,sha256=v9Igu7HnEOIfGhDuwl2cSzDQaxc4FNsgXjufFWtoAhc,3469
113
+ adaptive_sdk/resources/compute_pools.py,sha256=_c_eDkXyqKm53ZcfL91EtcuitYqd7ds_3Uz4PUY-TLw,3441
114
114
  adaptive_sdk/resources/datasets.py,sha256=sgGP2BwhaezaGei8xXoH0aKHyZFc64ZvIllxFUKNTd8,13648
115
115
  adaptive_sdk/resources/embeddings.py,sha256=-ov_EChHU6PJJOJRtDlCo4sYyr9hwyvRjnBhub8QNFg,3922
116
116
  adaptive_sdk/resources/feedback.py,sha256=lujqwFIhxi6iovL8JWL05Kr-gkzR4QEwUXZbTx33raA,14116
117
117
  adaptive_sdk/resources/graders.py,sha256=ekQQ5fqmLZpZHeLr6iUm6m45wDevoDJdj3mG-axR-m8,29014
118
118
  adaptive_sdk/resources/interactions.py,sha256=9A0aKyfE5dhMj-rj6NOiF7kxAl89SXksFsRJXXjPGK8,10810
119
- adaptive_sdk/resources/jobs.py,sha256=dN19HgOvGEq9O5hhgDZlWhi15noXo4qHLT_fd-qjrAU,5318
119
+ adaptive_sdk/resources/jobs.py,sha256=3ueoHp_58ELIAWfRfiAp51Jt7hazMmbfngaep2wnPn8,5398
120
120
  adaptive_sdk/resources/models.py,sha256=f64QQndni3ETRaBICDUyP2Aka9R5Z_RKEyxqZcsv3p0,18314
121
121
  adaptive_sdk/resources/permissions.py,sha256=ckO-oacWkvgcwXBK5iW_8qaK-g0SHXpEEy1qZy5lrB0,1053
122
- adaptive_sdk/resources/recipes.py,sha256=f4Q_noEAjx-LGkgzLOU6UtgFTK75cQu0cYBakNjUCv0,13224
122
+ adaptive_sdk/resources/recipes.py,sha256=ookHUdWpBv2w1RmkmQgxAs7E2VGK9dyb28FOK1sD9eE,15991
123
123
  adaptive_sdk/resources/roles.py,sha256=fD1F5Gd3ddkATsU2aFj7japTJVZngVgqt6TXskBQEOA,2218
124
124
  adaptive_sdk/resources/teams.py,sha256=KItuOfqKKyFSRFoEAF7rAXb8nbIqRkwRxjEbACjeEoY,1476
125
125
  adaptive_sdk/resources/use_cases.py,sha256=a_Ls3kbYgByJMlOYM_UGi4MTiW4wU7m057budrgfEE0,9014
@@ -127,6 +127,6 @@ adaptive_sdk/resources/users.py,sha256=SoGWwdDCdhK4KjYOcAws-ZWlW7Edii7D3Vxfdu-NZ
127
127
  adaptive_sdk/rest/__init__.py,sha256=P9uhkOoc9cgUkJ5MBoV5soPgQWSkvPrTwHzPGX7i5tY,610
128
128
  adaptive_sdk/rest/base_model.py,sha256=P06TNhnqXa6JEje_B_94vAa5zqPYIVxMZAp6aZ4d80U,516
129
129
  adaptive_sdk/rest/rest_types.py,sha256=aSN7901_1goByBEl7Ka6onU2ia-_RhlmtH9suFkWkic,8859
130
- adaptive_sdk-0.1.10.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
131
- adaptive_sdk-0.1.10.dist-info/METADATA,sha256=I37LRW4IFFOwkSmVuEAh103DMmy9G8E1YUyJfjFaoQo,1447
132
- adaptive_sdk-0.1.10.dist-info/RECORD,,
130
+ adaptive_sdk-0.1.12.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
131
+ adaptive_sdk-0.1.12.dist-info/METADATA,sha256=XMmkasZbLbFIG-tmV-OtbSwt-Tgj4xjgRcFSeYBkhBw,1447
132
+ adaptive_sdk-0.1.12.dist-info/RECORD,,