together 2.0.0a11__tar.gz → 2.0.0a12__tar.gz
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.
- together-2.0.0a12/.release-please-manifest.json +3 -0
- {together-2.0.0a11 → together-2.0.0a12}/CHANGELOG.md +25 -0
- {together-2.0.0a11 → together-2.0.0a12}/LICENSE +1 -1
- {together-2.0.0a11 → together-2.0.0a12}/PKG-INFO +3 -3
- {together-2.0.0a11 → together-2.0.0a12}/README.md +2 -2
- {together-2.0.0a11 → together-2.0.0a12}/pyproject.toml +1 -1
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_base_client.py +1 -1
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_version.py +1 -1
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/fine_tuning.py +14 -6
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/utils.py +5 -13
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/constants.py +6 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/resources/fine_tuning.py +15 -1
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/types/fine_tuning.py +17 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/utils/files.py +187 -29
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/fine_tuning.py +25 -17
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/finetune_response.py +11 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_cli_utils.py +21 -57
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_files_checks.py +106 -0
- {together-2.0.0a11 → together-2.0.0a12}/uv.lock +1 -1
- together-2.0.0a11/.release-please-manifest.json +0 -3
- {together-2.0.0a11 → together-2.0.0a12}/.gitignore +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/CONTRIBUTING.md +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/SECURITY.md +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/api.md +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/bin/check-release-environment +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/bin/publish-pypi +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/.keep +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/coqa-small.jsonl +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/coqa.jsonl +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/embedding.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/file-upload.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/fine_tuning.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/image.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/examples/streaming.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/release-please-config.json +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/requirements-dev.lock +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_client.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_compat.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_constants.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_exceptions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_qs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_resource.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_streaming.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_types.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_compat.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_datetime_parse.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_logs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_proxy.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_reflection.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_resources_proxy.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_streams.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_sync.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_transform.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_typing.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/_utils/_utils.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/.keep +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/endpoints.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/evals.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/api/models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/cli/cli.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/resources/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/resources/files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/types/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/types/error.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/utils/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/utils/_log.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/utils/serializer.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/lib/utils/tools.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/py.typed +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/audio.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/speech.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/transcriptions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/translations.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/audio/voices.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/batches.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/chat/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/chat/chat.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/chat/completions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/code_interpreter/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/code_interpreter/code_interpreter.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/code_interpreter/sessions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/completions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/embeddings.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/endpoints.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/evals.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/hardware.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/images.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/jobs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/rerank.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/resources/videos.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/speech_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/transcription_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/transcription_create_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/translation_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/translation_create_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio/voice_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/audio_speech_stream_chunk.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/autoscaling.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/autoscaling_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/batch_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/batch_create_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/batch_job.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/batch_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_chunk.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_structured_message_image_url_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_structured_message_text_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_structured_message_video_url_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_usage.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/chat_completion_warning.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/chat/completion_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/code_interpreter/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/code_interpreter/session_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/code_interpreter_execute_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/completion.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/completion_chunk.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/completion_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/dedicated_endpoint.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/embedding.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/embedding_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/endpoint_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/endpoint_list_avzones_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/endpoint_list_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/endpoint_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/endpoint_update_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/eval_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/eval_create_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/eval_list_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/eval_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/eval_status_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/evaluation_job.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/execute_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/file_delete_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/file_list.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/file_purpose.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/file_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/file_type.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_cancel_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_content_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_delete_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_delete_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_estimate_price_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_estimate_price_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_list_checkpoints_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_list_events_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/fine_tuning_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/finetune_event.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/finetune_event_type.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/hardware_list_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/hardware_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/image_data_b64.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/image_data_url.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/image_file.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/image_generate_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/job_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/job_retrieve_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/log_probs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/model_list_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/model_list_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/model_object.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/model_upload_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/model_upload_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/rerank_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/rerank_create_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/tool_choice.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/tool_choice_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/tools_param.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/training_method_dpo.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/training_method_sft.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/video_create_params.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/src/together/types/video_job.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/audio/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/audio/test_speech.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/audio/test_transcriptions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/audio/test_translations.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/audio/test_voices.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/chat/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/chat/test_completions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/code_interpreter/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/code_interpreter/test_sessions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_batches.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_code_interpreter.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_completions.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_embeddings.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_endpoints.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_evals.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_fine_tuning.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_hardware.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_images.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_jobs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_rerank.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/api_resources/test_videos.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/conftest.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/constants.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/resources/__init__.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/resources/generate_hyperparameters.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/resources/test_completion.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/resources/test_completion_stream.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/integration/resources/test_files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/sample_file.txt +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_client.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_deepcopy.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_extract_files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_files.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_models.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_qs.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_required_args.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_response.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_streaming.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_transform.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_utils/test_datetime_parse.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_utils/test_proxy.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/test_utils/test_typing.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_async_client.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_client.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_code_interpreter.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_files_resource.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_fine_tuning_resources.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_imports.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_multipart_upload_manager.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_preference_openai.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/unit/test_video_url.py +0 -0
- {together-2.0.0a11 → together-2.0.0a12}/tests/utils.py +0 -0
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.0-alpha.12 (2026-01-05)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v2.0.0-alpha.11...v2.0.0-alpha.12](https://github.com/togethercomputer/together-py/compare/v2.0.0-alpha.11...v2.0.0-alpha.12)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* Support VLM finetuning ([e4428b3](https://github.com/togethercomputer/together-py/commit/e4428b3c86080286643b0e287ff02ac6b8cd3864))
|
|
10
|
+
* VLM Support update ([97c74a3](https://github.com/togethercomputer/together-py/commit/97c74a38da1ea0a7717b0172f5cd65bb85bcaee4))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* use async_to_httpx_files in patch method ([dc293e6](https://github.com/togethercomputer/together-py/commit/dc293e68b49cce5b0c8437e94152e369bb09b625))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* **internal:** add `--fix` argument to lint script ([c29463d](https://github.com/togethercomputer/together-py/commit/c29463dbe8a18fa02bf436ae4cbdd6b59644e641))
|
|
21
|
+
* **internal:** codegen related update ([f7499fc](https://github.com/togethercomputer/together-py/commit/f7499fcd931834fcd16210cd25e14dc5b328fb0e))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Documentation
|
|
25
|
+
|
|
26
|
+
* add more examples ([a048344](https://github.com/togethercomputer/together-py/commit/a048344c0daeeab4d7fefd41d3554bde860dd9d5))
|
|
27
|
+
|
|
3
28
|
## 2.0.0-alpha.11 (2025-12-16)
|
|
4
29
|
|
|
5
30
|
Full Changelog: [v2.0.0-alpha.10...v2.0.0-alpha.11](https://github.com/togethercomputer/together-py/compare/v2.0.0-alpha.10...v2.0.0-alpha.11)
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright
|
|
189
|
+
Copyright 2026 Together
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: together
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0a12
|
|
4
4
|
Summary: The official Python library for the together API
|
|
5
5
|
Project-URL: Homepage, https://github.com/togethercomputer/together-py
|
|
6
6
|
Project-URL: Repository, https://github.com/togethercomputer/together-py
|
|
@@ -183,7 +183,7 @@ stream = client.chat.completions.create(
|
|
|
183
183
|
messages=[
|
|
184
184
|
{
|
|
185
185
|
"role": "user",
|
|
186
|
-
"content": "Say this is a test",
|
|
186
|
+
"content": "Say this is a test!",
|
|
187
187
|
}
|
|
188
188
|
],
|
|
189
189
|
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
|
|
@@ -204,7 +204,7 @@ stream = await client.chat.completions.create(
|
|
|
204
204
|
messages=[
|
|
205
205
|
{
|
|
206
206
|
"role": "user",
|
|
207
|
-
"content": "Say this is a test",
|
|
207
|
+
"content": "Say this is a test!",
|
|
208
208
|
}
|
|
209
209
|
],
|
|
210
210
|
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
|
|
@@ -137,7 +137,7 @@ stream = client.chat.completions.create(
|
|
|
137
137
|
messages=[
|
|
138
138
|
{
|
|
139
139
|
"role": "user",
|
|
140
|
-
"content": "Say this is a test",
|
|
140
|
+
"content": "Say this is a test!",
|
|
141
141
|
}
|
|
142
142
|
],
|
|
143
143
|
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
|
|
@@ -158,7 +158,7 @@ stream = await client.chat.completions.create(
|
|
|
158
158
|
messages=[
|
|
159
159
|
{
|
|
160
160
|
"role": "user",
|
|
161
|
-
"content": "Say this is a test",
|
|
161
|
+
"content": "Say this is a test!",
|
|
162
162
|
}
|
|
163
163
|
],
|
|
164
164
|
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
|
|
@@ -1774,7 +1774,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
|
|
|
1774
1774
|
options: RequestOptions = {},
|
|
1775
1775
|
) -> ResponseT:
|
|
1776
1776
|
opts = FinalRequestOptions.construct(
|
|
1777
|
-
method="patch", url=path, json_data=body, files=
|
|
1777
|
+
method="patch", url=path, json_data=body, files=await async_to_httpx_files(files), **options
|
|
1778
1778
|
)
|
|
1779
1779
|
return await self.request(cast_to, opts)
|
|
1780
1780
|
|
|
@@ -176,6 +176,12 @@ def fine_tuning(ctx: click.Context) -> None:
|
|
|
176
176
|
help="Whether to mask the user messages in conversational data or prompts in instruction data. "
|
|
177
177
|
"`auto` will automatically determine whether to mask the inputs based on the data format.",
|
|
178
178
|
)
|
|
179
|
+
@click.option(
|
|
180
|
+
"--train-vision",
|
|
181
|
+
type=bool,
|
|
182
|
+
default=False,
|
|
183
|
+
help="Whether to train the vision encoder. Only supported for multimodal models.",
|
|
184
|
+
)
|
|
179
185
|
@click.option(
|
|
180
186
|
"--from-checkpoint",
|
|
181
187
|
type=str,
|
|
@@ -231,6 +237,7 @@ def create(
|
|
|
231
237
|
lora_dropout: float | None,
|
|
232
238
|
lora_alpha: float | None,
|
|
233
239
|
lora_trainable_modules: str | None,
|
|
240
|
+
train_vision: bool,
|
|
234
241
|
suffix: str | None,
|
|
235
242
|
wandb_api_key: str | None,
|
|
236
243
|
wandb_base_url: str | None,
|
|
@@ -272,6 +279,7 @@ def create(
|
|
|
272
279
|
lora_dropout=lora_dropout,
|
|
273
280
|
lora_alpha=lora_alpha,
|
|
274
281
|
lora_trainable_modules=lora_trainable_modules,
|
|
282
|
+
train_vision=train_vision,
|
|
275
283
|
suffix=suffix,
|
|
276
284
|
wandb_api_key=wandb_api_key,
|
|
277
285
|
wandb_base_url=wandb_base_url,
|
|
@@ -363,6 +371,10 @@ def create(
|
|
|
363
371
|
simpo_gamma=simpo_gamma or 0,
|
|
364
372
|
)
|
|
365
373
|
|
|
374
|
+
if model_limits.supports_vision:
|
|
375
|
+
# Don't show price estimation for multimodal models yet
|
|
376
|
+
confirm = True
|
|
377
|
+
|
|
366
378
|
finetune_price_estimation_result = client.fine_tuning.estimate_price(
|
|
367
379
|
training_file=training_file,
|
|
368
380
|
validation_file=validation_file,
|
|
@@ -426,9 +438,7 @@ def list(ctx: click.Context) -> None:
|
|
|
426
438
|
"Price": f"""${
|
|
427
439
|
finetune_price_to_dollars(float(str(i.total_price)))
|
|
428
440
|
}""", # convert to string for mypy typing
|
|
429
|
-
"Progress": generate_progress_bar(
|
|
430
|
-
i, datetime.now().astimezone(), use_rich=False
|
|
431
|
-
),
|
|
441
|
+
"Progress": generate_progress_bar(i, datetime.now().astimezone(), use_rich=False),
|
|
432
442
|
}
|
|
433
443
|
)
|
|
434
444
|
table = tabulate(display_list, headers="keys", tablefmt="grid", showindex=True)
|
|
@@ -449,9 +459,7 @@ def retrieve(ctx: click.Context, fine_tune_id: str) -> None:
|
|
|
449
459
|
response.events = None
|
|
450
460
|
|
|
451
461
|
rprint(JSON.from_data(response.model_json_schema()))
|
|
452
|
-
progress_text = generate_progress_bar(
|
|
453
|
-
response, datetime.now().astimezone(), use_rich=True
|
|
454
|
-
)
|
|
462
|
+
progress_text = generate_progress_bar(response, datetime.now().astimezone(), use_rich=True)
|
|
455
463
|
prefix = f"Status: [bold]{response.status}[/bold],"
|
|
456
464
|
rprint(f"{prefix} {progress_text}")
|
|
457
465
|
|
|
@@ -28,9 +28,7 @@ class AutoIntParamType(click.ParamType):
|
|
|
28
28
|
return int(value)
|
|
29
29
|
except ValueError:
|
|
30
30
|
self.fail(
|
|
31
|
-
_("{value!r} is not a valid {number_type}.").format(
|
|
32
|
-
value=value, number_type=self.name
|
|
33
|
-
),
|
|
31
|
+
_("{value!r} is not a valid {number_type}.").format(value=value, number_type=self.name),
|
|
34
32
|
param,
|
|
35
33
|
ctx,
|
|
36
34
|
)
|
|
@@ -39,7 +37,7 @@ class AutoIntParamType(click.ParamType):
|
|
|
39
37
|
class BooleanWithAutoParamType(click.ParamType):
|
|
40
38
|
name = "boolean_or_auto"
|
|
41
39
|
|
|
42
|
-
def convert(
|
|
40
|
+
def convert( # pyright: ignore[reportImplicitOverride]
|
|
43
41
|
self, value: str, param: click.Parameter | None, ctx: click.Context | None
|
|
44
42
|
) -> bool | Literal["auto"] | None:
|
|
45
43
|
if value == "auto":
|
|
@@ -48,9 +46,7 @@ class BooleanWithAutoParamType(click.ParamType):
|
|
|
48
46
|
return bool(value)
|
|
49
47
|
except ValueError:
|
|
50
48
|
self.fail(
|
|
51
|
-
_("{value!r} is not a valid {type}.").format(
|
|
52
|
-
value=value, type=self.name
|
|
53
|
-
),
|
|
49
|
+
_("{value!r} is not a valid {type}.").format(value=value, type=self.name),
|
|
54
50
|
param,
|
|
55
51
|
ctx,
|
|
56
52
|
)
|
|
@@ -119,17 +115,13 @@ def generate_progress_bar(
|
|
|
119
115
|
return progress
|
|
120
116
|
|
|
121
117
|
elapsed_time = (current_time - update_at).total_seconds()
|
|
122
|
-
ratio_filled = min(
|
|
123
|
-
elapsed_time / finetune_job.progress.seconds_remaining, 1.0
|
|
124
|
-
)
|
|
118
|
+
ratio_filled = min(elapsed_time / finetune_job.progress.seconds_remaining, 1.0)
|
|
125
119
|
percentage = ratio_filled * 100
|
|
126
120
|
filled = math.ceil(ratio_filled * _PROGRESS_BAR_WIDTH)
|
|
127
121
|
bar = "█" * filled + "░" * (_PROGRESS_BAR_WIDTH - filled)
|
|
128
122
|
time_left = "N/A"
|
|
129
123
|
if finetune_job.progress.seconds_remaining > elapsed_time:
|
|
130
|
-
time_left = _human_readable_time(
|
|
131
|
-
finetune_job.progress.seconds_remaining - elapsed_time
|
|
132
|
-
)
|
|
124
|
+
time_left = _human_readable_time(finetune_job.progress.seconds_remaining - elapsed_time)
|
|
133
125
|
time_text = f"{time_left} left"
|
|
134
126
|
progress = f"Progress: {bar} [bold]{percentage:>3.0f}%[/bold] [yellow]{time_text}[/yellow]"
|
|
135
127
|
|
|
@@ -37,6 +37,12 @@ NUM_BYTES_IN_GB = 2**30
|
|
|
37
37
|
# maximum number of GB sized files we support finetuning for
|
|
38
38
|
MAX_FILE_SIZE_GB = 50.1
|
|
39
39
|
|
|
40
|
+
# Multimodal limits
|
|
41
|
+
MAX_IMAGES_PER_EXAMPLE = 10
|
|
42
|
+
MAX_IMAGE_BYTES = 10 * 1024 * 1024 # 10MB
|
|
43
|
+
# Max length = Header length + base64 factor (4/3) * image bytes
|
|
44
|
+
MAX_BASE64_IMAGE_LENGTH = len("data:image/jpeg;base64,") + 4 * MAX_IMAGE_BYTES // 3
|
|
45
|
+
|
|
40
46
|
# expected columns for Parquet files
|
|
41
47
|
PARQUET_EXPECTED_COLUMNS = ["input_ids", "attention_mask", "labels"]
|
|
42
48
|
|
|
@@ -22,6 +22,7 @@ from together.lib.types.fine_tuning import (
|
|
|
22
22
|
CosineLRSchedulerArgs,
|
|
23
23
|
LinearLRSchedulerArgs,
|
|
24
24
|
FinetuneTrainingLimits,
|
|
25
|
+
FinetuneMultimodalParams,
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
AVAILABLE_TRAINING_METHODS = {
|
|
@@ -51,6 +52,7 @@ def create_finetune_request(
|
|
|
51
52
|
lora_dropout: float | None = 0,
|
|
52
53
|
lora_alpha: float | None = None,
|
|
53
54
|
lora_trainable_modules: str | None = "all-linear",
|
|
55
|
+
train_vision: bool = False,
|
|
54
56
|
suffix: str | None = None,
|
|
55
57
|
wandb_api_key: str | None = None,
|
|
56
58
|
wandb_base_url: str | None = None,
|
|
@@ -207,6 +209,13 @@ def create_finetune_request(
|
|
|
207
209
|
simpo_gamma=simpo_gamma,
|
|
208
210
|
)
|
|
209
211
|
|
|
212
|
+
if model_limits.supports_vision:
|
|
213
|
+
multimodal_params = FinetuneMultimodalParams(train_vision=train_vision)
|
|
214
|
+
elif not model_limits.supports_vision and train_vision:
|
|
215
|
+
raise ValueError(f"Vision encoder training is not supported for the non-multimodal model `{model}`")
|
|
216
|
+
else:
|
|
217
|
+
multimodal_params = None
|
|
218
|
+
|
|
210
219
|
finetune_request = FinetuneRequest(
|
|
211
220
|
model=model,
|
|
212
221
|
training_file=training_file,
|
|
@@ -227,6 +236,7 @@ def create_finetune_request(
|
|
|
227
236
|
wandb_project_name=wandb_project_name,
|
|
228
237
|
wandb_name=wandb_name,
|
|
229
238
|
training_method=training_method_cls, # pyright: ignore[reportPossiblyUnboundVariable]
|
|
239
|
+
multimodal_params=multimodal_params,
|
|
230
240
|
from_checkpoint=from_checkpoint,
|
|
231
241
|
from_hf_model=from_hf_model,
|
|
232
242
|
hf_model_revision=hf_model_revision,
|
|
@@ -238,7 +248,10 @@ def create_finetune_request(
|
|
|
238
248
|
|
|
239
249
|
return finetune_request, training_type_pe, training_method_pe
|
|
240
250
|
|
|
241
|
-
|
|
251
|
+
|
|
252
|
+
def create_price_estimation_params(
|
|
253
|
+
finetune_request: FinetuneRequest,
|
|
254
|
+
) -> tuple[pe_params.TrainingType, pe_params.TrainingMethod]:
|
|
242
255
|
training_type_cls: pe_params.TrainingType
|
|
243
256
|
if isinstance(finetune_request.training_type, FullTrainingType):
|
|
244
257
|
training_type_cls = pe_params.TrainingTypeFullTrainingType(
|
|
@@ -275,6 +288,7 @@ def create_price_estimation_params(finetune_request: FinetuneRequest) -> tuple[p
|
|
|
275
288
|
|
|
276
289
|
return training_type_cls, training_method_cls
|
|
277
290
|
|
|
291
|
+
|
|
278
292
|
def get_model_limits(client: Together, model: str) -> FinetuneTrainingLimits:
|
|
279
293
|
"""
|
|
280
294
|
Requests training limits for a specific model
|
|
@@ -189,6 +189,7 @@ class TrainingMethodUnknown(BaseModel):
|
|
|
189
189
|
|
|
190
190
|
method: str
|
|
191
191
|
|
|
192
|
+
|
|
192
193
|
TrainingMethod: TypeAlias = Union[
|
|
193
194
|
TrainingMethodSFT,
|
|
194
195
|
TrainingMethodDPO,
|
|
@@ -202,6 +203,7 @@ class FinetuneTrainingLimits(BaseModel):
|
|
|
202
203
|
min_learning_rate: float
|
|
203
204
|
full_training: Optional[FinetuneFullTrainingLimits] = None
|
|
204
205
|
lora_training: Optional[FinetuneLoraTrainingLimits] = None
|
|
206
|
+
supports_vision: bool = False
|
|
205
207
|
|
|
206
208
|
|
|
207
209
|
class LinearLRSchedulerArgs(BaseModel):
|
|
@@ -249,6 +251,7 @@ class EmptyLRScheduler(BaseModel):
|
|
|
249
251
|
lr_scheduler_type: Literal[""]
|
|
250
252
|
lr_scheduler_args: None = None
|
|
251
253
|
|
|
254
|
+
|
|
252
255
|
class UnknownLRScheduler(BaseModel):
|
|
253
256
|
"""
|
|
254
257
|
Unknown learning rate scheduler
|
|
@@ -268,6 +271,14 @@ FinetuneLRScheduler: TypeAlias = Union[
|
|
|
268
271
|
]
|
|
269
272
|
|
|
270
273
|
|
|
274
|
+
class FinetuneMultimodalParams(BaseModel):
|
|
275
|
+
"""
|
|
276
|
+
Multimodal parameters
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
train_vision: bool = False
|
|
280
|
+
|
|
281
|
+
|
|
271
282
|
class FinetuneProgress(BaseModel):
|
|
272
283
|
"""
|
|
273
284
|
Fine-tune job progress
|
|
@@ -303,6 +314,9 @@ class FinetuneResponse(BaseModel):
|
|
|
303
314
|
from_checkpoint: Optional[str] = None
|
|
304
315
|
"""Checkpoint used to continue training"""
|
|
305
316
|
|
|
317
|
+
multimodal_params: Optional[FinetuneMultimodalParams] = None
|
|
318
|
+
"""Multimodal parameters"""
|
|
319
|
+
|
|
306
320
|
from_hf_model: Optional[str] = None
|
|
307
321
|
"""Hugging Face Hub repo to start training from"""
|
|
308
322
|
|
|
@@ -467,6 +481,9 @@ class FinetuneRequest(BaseModel):
|
|
|
467
481
|
training_method: TrainingMethod = Field(default_factory=TrainingMethodSFT)
|
|
468
482
|
# from step
|
|
469
483
|
from_checkpoint: Union[str, None] = None
|
|
484
|
+
# multimodal parameters
|
|
485
|
+
multimodal_params: Union[FinetuneMultimodalParams, None] = None
|
|
486
|
+
# hugging face related fields
|
|
470
487
|
from_hf_model: Union[str, None] = None
|
|
471
488
|
hf_model_revision: Union[str, None] = None
|
|
472
489
|
# hf related fields
|