diff --git a/bespin/api.py b/bespin/api.py
index 5558ccd..dad9652 100644
--- a/bespin/api.py
+++ b/bespin/api.py
@@ -103,7 +103,7 @@ class BespinApi(object):
         return self._post_request('/job-file-stage-groups/', {})
 
     def dds_job_input_files_post(self, project_id, file_id, destination_path, sequence_group, sequence,
-                                 dds_user_credentials, stage_group_id):
+                                 dds_user_credentials, stage_group_id, size):
         data = {
             "project_id": project_id,
             "file_id": file_id,
@@ -111,7 +111,8 @@ class BespinApi(object):
             "sequence_group": sequence_group,
             "sequence": sequence,
             "dds_user_credentials": dds_user_credentials,
-            "stage_group": stage_group_id
+            "stage_group": stage_group_id,
+            "size": size,
         }
         return self._post_request('/dds-job-input-files/', data)
 
diff --git a/bespin/commands.py b/bespin/commands.py
index c8c1fb6..e30d252 100644
--- a/bespin/commands.py
+++ b/bespin/commands.py
@@ -288,8 +288,10 @@ class JobFile(object):
         dds_project_ids = set()
         sequence = 0
         for dds_file, path in self.get_dds_files_details():
+            file_size = dds_file.current_version['upload']['size']
             api.dds_job_input_files_post(dds_file.project_id, dds_file.id, path, 0, sequence,
-                                         dds_user_credential['id'], stage_group_id=stage_group['id'])
+                                         dds_user_credential['id'], stage_group_id=stage_group['id'],
+                                         size=file_size)
             sequence += 1
             dds_project_ids.add(dds_file.project_id)
         user_job_order_json = self.create_user_job_order_json()
diff --git a/bespin/dukeds.py b/bespin/dukeds.py
index 8753d3f..47816e2 100644
--- a/bespin/dukeds.py
+++ b/bespin/dukeds.py
@@ -8,6 +8,7 @@ INVALID_DUKEDS_FILE_PATH_MSG = "Invalid DukeDS file path ({})"
 DUKEDS_FILE_PATH_MISSING_PREFIX = INVALID_DUKEDS_FILE_PATH_MSG.format("missing prefix")
 DUKEDS_FILE_PATH_MISSING_SLASH = INVALID_DUKEDS_FILE_PATH_MSG.format("missing / between project and file path")
 
+
 class DDSFileUtil(object):
     def __init__(self):
         self.client = Client()

Jobs created appear to have 0-byte input files
I created job 46 in dev, with two files from data service. Viewing the job in the UI suggests the files are zero bytes (see screenshot).

![screen shot 2018-10-04 at 3 36 37 pm](https://user-images.githubusercontent.com/2752599/46498419-645f2880-c7eb-11e8-9f74-0d01c5638a50.png)

I logged into the VM and confirmed the files are downloading, so I expect this to work. Looks like the job created by bespin-cli does not include the input file's size.
diff --git a/bespin/test_api.py b/bespin/test_api.py
index 99ad636..30f1804 100644
--- a/bespin/test_api.py
+++ b/bespin/test_api.py
@@ -145,7 +145,8 @@ class BespinApiTestCase(TestCase):
         api = BespinApi(config=self.mock_config, user_agent_str=self.mock_user_agent_str)
         dds_input_file = api.dds_job_input_files_post(project_id='123', file_id='456', destination_path='data.txt',
                                                       sequence_group=1, sequence=2,
-                                                      dds_user_credentials=4, stage_group_id=5)
+                                                      dds_user_credentials=4, stage_group_id=5,
+                                                      size=1000)
 
         self.assertEqual(dds_input_file, 'dds-job-input-file1')
         expected_json = {
@@ -155,7 +156,8 @@ class BespinApiTestCase(TestCase):
             'sequence_group': 1,
             'sequence': 2,
             'dds_user_credentials': 4,
-            'stage_group': 5
+            'stage_group': 5,
+            'size': 1000,
         }
         mock_requests.post.assert_called_with('someurl/dds-job-input-files/', headers=self.expected_headers,
                                               json=expected_json)
diff --git a/bespin/test_commands.py b/bespin/test_commands.py
index 5bd78a8..486bf81 100644
--- a/bespin/test_commands.py
+++ b/bespin/test_commands.py
@@ -336,14 +336,15 @@ class JobFileTestCase(TestCase):
             'myint': 555
         })
         job_file.get_dds_files_details = Mock()
-        mock_file = Mock(project_id=666)
+        mock_file = Mock(project_id=666, current_version={'upload': {'size': 4002}})
         mock_file.id = 777
         job_file.get_dds_files_details.return_value = [[mock_file, 'somepath']]
 
         job_file.create_job(mock_api)
 
         mock_api.questionnaires_list.assert_called_with(tag='sometag')
-        mock_api.dds_job_input_files_post.assert_called_with(666, 777, 'somepath', 0, 0, 111, stage_group_id=333)
+        mock_api.dds_job_input_files_post.assert_called_with(666, 777, 'somepath', 0, 0, 111, stage_group_id=333,
+                                                             size=4002)
         json_payload = '{"myfile": {"class": "File", "path": "dds_project_somepath.txt"}, "myint": 555}'
         mock_api.job_answer_set_post.assert_called_with('myjob', '001', json_payload, 222, 333)
         mock_api.job_answer_set_create_job.assert_called_with(444)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest mock
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
azure-common==1.1.28
azure-core==1.32.0
azure-identity==1.21.0
azure-mgmt-core==1.5.0
azure-mgmt-storage==22.1.1
azure-storage-blob==12.25.1
azure-storage-file-datalake==12.20.0
-e git+https://github.com/Duke-GCB/bespin-cli.git@471cd4df56c852bee11fcb4725dc6b4e9053e08c#egg=bespin_cli
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
cryptography==44.0.2
DukeDSClient==4.0.0
exceptiongroup==1.2.2
future==1.0.0
idna==3.10
iniconfig==2.1.0
isodate==0.7.2
mock==5.2.0
msal==1.32.0
msal-extensions==1.3.1
msgraph-core==0.2.2
packaging==24.2
pluggy==1.5.0
pycparser==2.22
PyJWT==2.10.1
pytest==8.3.5
pytz==2025.2
PyYAML==6.0.2
requests==2.32.3
six==1.17.0
tabulate==0.9.0
tenacity==6.2.0
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.3.0

name: bespin-cli
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - azure-common==1.1.28
      - azure-core==1.32.0
      - azure-identity==1.21.0
      - azure-mgmt-core==1.5.0
      - azure-mgmt-storage==22.1.1
      - azure-storage-blob==12.25.1
      - azure-storage-file-datalake==12.20.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - cryptography==44.0.2
      - dukedsclient==4.0.0
      - exceptiongroup==1.2.2
      - future==1.0.0
      - idna==3.10
      - iniconfig==2.1.0
      - isodate==0.7.2
      - mock==5.2.0
      - msal==1.32.0
      - msal-extensions==1.3.1
      - msgraph-core==0.2.2
      - packaging==24.2
      - pluggy==1.5.0
      - pycparser==2.22
      - pyjwt==2.10.1
      - pytest==8.3.5
      - pytz==2025.2
      - pyyaml==6.0.2
      - requests==2.32.3
      - six==1.17.0
      - tabulate==0.9.0
      - tenacity==6.2.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.3.0
prefix: /opt/conda/envs/bespin-cli

bespin/test_api.py::BespinApiTestCase::test_dds_job_input_files_post bespin/test_commands.py::JobFileTestCase::test_create_job
bespin/test_commands.py::JobFileTestCase::test_yaml_str
bespin/test_api.py::BespinApiTestCase::test_authorize_job bespin/test_api.py::BespinApiTestCase::test_cancel_job bespin/test_api.py::BespinApiTestCase::test_dds_user_credentials_list bespin/test_api.py::BespinApiTestCase::test_delete_connection_error bespin/test_api.py::BespinApiTestCase::test_delete_job bespin/test_api.py::BespinApiTestCase::test_get_connection_error bespin/test_api.py::BespinApiTestCase::test_job_answer_set_create_job bespin/test_api.py::BespinApiTestCase::test_job_answer_set_post bespin/test_api.py::BespinApiTestCase::test_jobs_list bespin/test_api.py::BespinApiTestCase::test_post_connection_error bespin/test_api.py::BespinApiTestCase::test_questionnaire_get bespin/test_api.py::BespinApiTestCase::test_questionnaires_list bespin/test_api.py::BespinApiTestCase::test_restart_job bespin/test_api.py::BespinApiTestCase::test_stage_group_post bespin/test_api.py::BespinApiTestCase::test_start_job bespin/test_api.py::BespinApiTestCase::test_workflow_version_get bespin/test_api.py::BespinApiTestCase::test_workflow_versions_list bespin/test_api.py::BespinApiTestCase::test_workflows_list bespin/test_commands.py::CommandsTestCase::test_cancel_job bespin/test_commands.py::CommandsTestCase::test_create_job bespin/test_commands.py::CommandsTestCase::test_delete_job bespin/test_commands.py::CommandsTestCase::test_init_job bespin/test_commands.py::CommandsTestCase::test_jobs_list bespin/test_commands.py::CommandsTestCase::test_restart_job bespin/test_commands.py::CommandsTestCase::test_start_job_no_token bespin/test_commands.py::CommandsTestCase::test_start_job_with_token bespin/test_commands.py::CommandsTestCase::test_workflows_list_all_versions bespin/test_commands.py::CommandsTestCase::test_workflows_list_latest_versions bespin/test_commands.py::TableTestCase::test_str bespin/test_commands.py::WorkflowDetailsTestCase::test_get_column_data bespin/test_commands.py::WorkflowDetailsTestCase::test_ignores_workflows_without_versions_when_all bespin/test_commands.py::WorkflowDetailsTestCase::test_ignores_workflows_without_versions_when_latest bespin/test_commands.py::JobFileTestCase::test_create_user_job_order_json bespin/test_commands.py::JobFileTestCase::test_get_dds_files_details bespin/test_commands.py::JobFileLoaderTestCase::test_create_job_file bespin/test_commands.py::JobFileLoaderTestCase::test_validate_job_file_data_invalid_job_order_params bespin/test_commands.py::JobFileLoaderTestCase::test_validate_job_file_data_invalid_name_and_fund_code bespin/test_commands.py::JobFileLoaderTestCase::test_validate_job_file_data_ok bespin/test_commands.py::JobQuestionnaireTestCase::test_create_job_file_with_placeholders bespin/test_commands.py::JobQuestionnaireTestCase::test_create_placeholder_value bespin/test_commands.py::JobQuestionnaireTestCase::test_format_user_fields bespin/test_commands.py::JobOrderWalkerTestCase::test_format_file_path bespin/test_commands.py::JobOrderWalkerTestCase::test_walk bespin/test_commands.py::JobOrderPlaceholderCheckTestCase::test_walk bespin/test_commands.py::JobOrderFormatFilesTestCase::test_walk bespin/test_commands.py::JobOrderFileDetailsTestCase::test_walk bespin/test_commands.py::JobsListTestCase::test_column_names bespin/test_commands.py::JobsListTestCase::test_get_column_data bespin/test_commands.py::JobsListTestCase::test_get_elapsed_hours bespin/test_commands.py::JobsListTestCase::test_get_workflow_tag
bespin/api.py bespin/dukeds.py bespin/commands.py
bespin/api.py bespin/dukeds.py bespin/commands.py