mistralai 1.4.0__tar.gz → 1.5.0__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.
Files changed (292) hide show
  1. {mistralai-1.4.0 → mistralai-1.5.0}/PKG-INFO +33 -1
  2. {mistralai-1.4.0 → mistralai-1.5.0}/README-PYPI.md +32 -0
  3. {mistralai-1.4.0 → mistralai-1.5.0}/pyproject.toml +1 -1
  4. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_version.py +3 -3
  5. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/chat.py +82 -0
  6. mistralai-1.5.0/src/mistralai/extra/README.md +56 -0
  7. mistralai-1.5.0/src/mistralai/extra/__init__.py +5 -0
  8. mistralai-1.5.0/src/mistralai/extra/struct_chat.py +41 -0
  9. mistralai-1.5.0/src/mistralai/extra/tests/__init__.py +0 -0
  10. mistralai-1.5.0/src/mistralai/extra/tests/test_struct_chat.py +103 -0
  11. mistralai-1.5.0/src/mistralai/extra/tests/test_utils.py +162 -0
  12. mistralai-1.5.0/src/mistralai/extra/utils/__init__.py +3 -0
  13. mistralai-1.5.0/src/mistralai/extra/utils/_pydantic_helper.py +20 -0
  14. mistralai-1.5.0/src/mistralai/extra/utils/response_format.py +24 -0
  15. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/httpclient.py +50 -0
  16. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/__init__.py +3 -0
  17. mistralai-1.5.0/src/mistralai/models/jsonschema.py +55 -0
  18. mistralai-1.5.0/src/mistralai/models/responseformat.py +52 -0
  19. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/responseformats.py +1 -1
  20. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/sdk.py +11 -2
  21. mistralai-1.4.0/src/mistralai/models/responseformat.py +0 -17
  22. {mistralai-1.4.0 → mistralai-1.5.0}/LICENSE +0 -0
  23. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/__init__.py +0 -0
  24. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_hooks/__init__.py +0 -0
  25. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_hooks/custom_user_agent.py +0 -0
  26. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_hooks/registration.py +0 -0
  27. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_hooks/sdkhooks.py +0 -0
  28. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_hooks/types.py +0 -0
  29. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/_version.py +0 -0
  30. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/basesdk.py +0 -0
  31. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/chat.py +0 -0
  32. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/httpclient.py +0 -0
  33. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/__init__.py +0 -0
  34. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/assistantmessage.py +0 -0
  35. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/chatcompletionchoice.py +0 -0
  36. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/chatcompletionrequest.py +0 -0
  37. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/chatcompletionresponse.py +0 -0
  38. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/chatcompletionstreamrequest.py +0 -0
  39. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/completionchunk.py +0 -0
  40. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/completionevent.py +0 -0
  41. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/completionresponsestreamchoice.py +0 -0
  42. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/contentchunk.py +0 -0
  43. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/deltamessage.py +0 -0
  44. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/function.py +0 -0
  45. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/functioncall.py +0 -0
  46. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/functionname.py +0 -0
  47. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/httpvalidationerror.py +0 -0
  48. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/referencechunk.py +0 -0
  49. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/responseformat.py +0 -0
  50. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/responseformats.py +0 -0
  51. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/sdkerror.py +0 -0
  52. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/security.py +0 -0
  53. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/systemmessage.py +0 -0
  54. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/textchunk.py +0 -0
  55. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/tool.py +0 -0
  56. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/toolcall.py +0 -0
  57. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/toolchoice.py +0 -0
  58. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/toolchoiceenum.py +0 -0
  59. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/toolmessage.py +0 -0
  60. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/tooltypes.py +0 -0
  61. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/usageinfo.py +0 -0
  62. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/usermessage.py +0 -0
  63. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/models/validationerror.py +0 -0
  64. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/py.typed +0 -0
  65. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/sdk.py +0 -0
  66. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/sdkconfiguration.py +0 -0
  67. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/types/__init__.py +0 -0
  68. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/types/basemodel.py +0 -0
  69. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/__init__.py +0 -0
  70. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/annotations.py +0 -0
  71. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/enums.py +0 -0
  72. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/eventstreaming.py +0 -0
  73. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/forms.py +0 -0
  74. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/headers.py +0 -0
  75. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/logger.py +0 -0
  76. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/metadata.py +0 -0
  77. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/queryparams.py +0 -0
  78. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/requestbodies.py +0 -0
  79. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/retries.py +0 -0
  80. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/security.py +0 -0
  81. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/serializers.py +0 -0
  82. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/url.py +0 -0
  83. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_azure/src/mistralai_azure/utils/values.py +0 -0
  84. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/__init__.py +0 -0
  85. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_hooks/__init__.py +0 -0
  86. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_hooks/custom_user_agent.py +0 -0
  87. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_hooks/registration.py +0 -0
  88. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_hooks/sdkhooks.py +0 -0
  89. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_hooks/types.py +0 -0
  90. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/_version.py +0 -0
  91. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/basesdk.py +0 -0
  92. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/chat.py +0 -0
  93. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/fim.py +0 -0
  94. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/httpclient.py +0 -0
  95. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/__init__.py +0 -0
  96. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/assistantmessage.py +0 -0
  97. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/chatcompletionchoice.py +0 -0
  98. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/chatcompletionrequest.py +0 -0
  99. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/chatcompletionresponse.py +0 -0
  100. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/chatcompletionstreamrequest.py +0 -0
  101. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/completionchunk.py +0 -0
  102. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/completionevent.py +0 -0
  103. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/completionresponsestreamchoice.py +0 -0
  104. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/contentchunk.py +0 -0
  105. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/deltamessage.py +0 -0
  106. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/fimcompletionrequest.py +0 -0
  107. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/fimcompletionresponse.py +0 -0
  108. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/fimcompletionstreamrequest.py +0 -0
  109. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/function.py +0 -0
  110. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/functioncall.py +0 -0
  111. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/functionname.py +0 -0
  112. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/httpvalidationerror.py +0 -0
  113. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/referencechunk.py +0 -0
  114. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/responseformat.py +0 -0
  115. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/responseformats.py +0 -0
  116. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/sdkerror.py +0 -0
  117. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/security.py +0 -0
  118. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/systemmessage.py +0 -0
  119. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/textchunk.py +0 -0
  120. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/tool.py +0 -0
  121. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/toolcall.py +0 -0
  122. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/toolchoice.py +0 -0
  123. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/toolchoiceenum.py +0 -0
  124. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/toolmessage.py +0 -0
  125. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/tooltypes.py +0 -0
  126. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/usageinfo.py +0 -0
  127. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/usermessage.py +0 -0
  128. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/models/validationerror.py +0 -0
  129. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/py.typed +0 -0
  130. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/sdk.py +0 -0
  131. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/sdkconfiguration.py +0 -0
  132. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/types/__init__.py +0 -0
  133. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/types/basemodel.py +0 -0
  134. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/__init__.py +0 -0
  135. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/annotations.py +0 -0
  136. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/enums.py +0 -0
  137. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/eventstreaming.py +0 -0
  138. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/forms.py +0 -0
  139. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/headers.py +0 -0
  140. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/logger.py +0 -0
  141. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/metadata.py +0 -0
  142. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/queryparams.py +0 -0
  143. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/requestbodies.py +0 -0
  144. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/retries.py +0 -0
  145. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/security.py +0 -0
  146. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/serializers.py +0 -0
  147. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/url.py +0 -0
  148. {mistralai-1.4.0 → mistralai-1.5.0}/packages/mistralai_gcp/src/mistralai_gcp/utils/values.py +0 -0
  149. {mistralai-1.4.0 → mistralai-1.5.0}/py.typed +0 -0
  150. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/__init__.py +0 -0
  151. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/__init__.py +0 -0
  152. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/custom_user_agent.py +0 -0
  153. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/deprecation_warning.py +0 -0
  154. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/registration.py +0 -0
  155. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/sdkhooks.py +0 -0
  156. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/_hooks/types.py +0 -0
  157. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/agents.py +0 -0
  158. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/async_client.py +0 -0
  159. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/basesdk.py +0 -0
  160. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/batch.py +0 -0
  161. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/classifiers.py +0 -0
  162. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/client.py +0 -0
  163. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/embeddings.py +0 -0
  164. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/files.py +0 -0
  165. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/fim.py +0 -0
  166. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/fine_tuning.py +0 -0
  167. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/jobs.py +0 -0
  168. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/mistral_jobs.py +0 -0
  169. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/agentscompletionrequest.py +0 -0
  170. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/agentscompletionstreamrequest.py +0 -0
  171. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/apiendpoint.py +0 -0
  172. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/archiveftmodelout.py +0 -0
  173. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/assistantmessage.py +0 -0
  174. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/basemodelcard.py +0 -0
  175. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/batcherror.py +0 -0
  176. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/batchjobin.py +0 -0
  177. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/batchjobout.py +0 -0
  178. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/batchjobsout.py +0 -0
  179. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/batchjobstatus.py +0 -0
  180. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/chatclassificationrequest.py +0 -0
  181. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/chatcompletionchoice.py +0 -0
  182. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/chatcompletionrequest.py +0 -0
  183. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/chatcompletionresponse.py +0 -0
  184. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/chatcompletionstreamrequest.py +0 -0
  185. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/checkpointout.py +0 -0
  186. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/classificationobject.py +0 -0
  187. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/classificationrequest.py +0 -0
  188. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/classificationresponse.py +0 -0
  189. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/completionchunk.py +0 -0
  190. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/completionevent.py +0 -0
  191. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/completionresponsestreamchoice.py +0 -0
  192. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/contentchunk.py +0 -0
  193. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/delete_model_v1_models_model_id_deleteop.py +0 -0
  194. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/deletefileout.py +0 -0
  195. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/deletemodelout.py +0 -0
  196. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/deltamessage.py +0 -0
  197. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/detailedjobout.py +0 -0
  198. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/embeddingrequest.py +0 -0
  199. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/embeddingresponse.py +0 -0
  200. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/embeddingresponsedata.py +0 -0
  201. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/eventout.py +0 -0
  202. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/filepurpose.py +0 -0
  203. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_delete_fileop.py +0 -0
  204. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_download_fileop.py +0 -0
  205. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_get_signed_urlop.py +0 -0
  206. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_list_filesop.py +0 -0
  207. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_retrieve_fileop.py +0 -0
  208. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/files_api_routes_upload_fileop.py +0 -0
  209. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/fileschema.py +0 -0
  210. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/filesignedurl.py +0 -0
  211. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/fimcompletionrequest.py +0 -0
  212. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/fimcompletionresponse.py +0 -0
  213. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/fimcompletionstreamrequest.py +0 -0
  214. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/ftmodelcapabilitiesout.py +0 -0
  215. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/ftmodelcard.py +0 -0
  216. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/ftmodelout.py +0 -0
  217. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/function.py +0 -0
  218. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/functioncall.py +0 -0
  219. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/functionname.py +0 -0
  220. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/githubrepositoryin.py +0 -0
  221. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/githubrepositoryout.py +0 -0
  222. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/httpvalidationerror.py +0 -0
  223. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/imageurl.py +0 -0
  224. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/imageurlchunk.py +0 -0
  225. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobin.py +0 -0
  226. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobmetadataout.py +0 -0
  227. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobout.py +0 -0
  228. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_batch_cancel_batch_jobop.py +0 -0
  229. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_batch_get_batch_jobop.py +0 -0
  230. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_batch_get_batch_jobsop.py +0 -0
  231. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_archive_fine_tuned_modelop.py +0 -0
  232. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_cancel_fine_tuning_jobop.py +0 -0
  233. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_create_fine_tuning_jobop.py +0 -0
  234. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_get_fine_tuning_jobop.py +0 -0
  235. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_get_fine_tuning_jobsop.py +0 -0
  236. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_start_fine_tuning_jobop.py +0 -0
  237. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_unarchive_fine_tuned_modelop.py +0 -0
  238. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobs_api_routes_fine_tuning_update_fine_tuned_modelop.py +0 -0
  239. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/jobsout.py +0 -0
  240. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/legacyjobmetadataout.py +0 -0
  241. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/listfilesout.py +0 -0
  242. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/metricout.py +0 -0
  243. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/modelcapabilities.py +0 -0
  244. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/modellist.py +0 -0
  245. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/prediction.py +0 -0
  246. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/referencechunk.py +0 -0
  247. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/retrieve_model_v1_models_model_id_getop.py +0 -0
  248. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/retrievefileout.py +0 -0
  249. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/sampletype.py +0 -0
  250. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/sdkerror.py +0 -0
  251. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/security.py +0 -0
  252. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/source.py +0 -0
  253. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/systemmessage.py +0 -0
  254. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/textchunk.py +0 -0
  255. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/tool.py +0 -0
  256. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/toolcall.py +0 -0
  257. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/toolchoice.py +0 -0
  258. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/toolchoiceenum.py +0 -0
  259. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/toolmessage.py +0 -0
  260. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/tooltypes.py +0 -0
  261. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/trainingfile.py +0 -0
  262. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/trainingparameters.py +0 -0
  263. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/trainingparametersin.py +0 -0
  264. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/unarchiveftmodelout.py +0 -0
  265. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/updateftmodelin.py +0 -0
  266. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/uploadfileout.py +0 -0
  267. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/usageinfo.py +0 -0
  268. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/usermessage.py +0 -0
  269. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/validationerror.py +0 -0
  270. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/wandbintegration.py +0 -0
  271. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models/wandbintegrationout.py +0 -0
  272. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/models_.py +0 -0
  273. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/py.typed +0 -0
  274. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/sdkconfiguration.py +0 -0
  275. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/types/__init__.py +0 -0
  276. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/types/basemodel.py +0 -0
  277. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/__init__.py +0 -0
  278. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/annotations.py +0 -0
  279. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/enums.py +0 -0
  280. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/eventstreaming.py +0 -0
  281. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/forms.py +0 -0
  282. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/headers.py +0 -0
  283. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/logger.py +0 -0
  284. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/metadata.py +0 -0
  285. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/queryparams.py +0 -0
  286. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/requestbodies.py +0 -0
  287. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/retries.py +0 -0
  288. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/security.py +0 -0
  289. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/serializers.py +0 -0
  290. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/url.py +0 -0
  291. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/utils/values.py +0 -0
  292. {mistralai-1.4.0 → mistralai-1.5.0}/src/mistralai/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mistralai
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: Python Client SDK for the Mistral AI API.
5
5
  Author: Mistral
6
6
  Requires-Python: >=3.8
@@ -67,6 +67,7 @@ Mistral AI API: Our Chat Completion and Embeddings APIs specification. Create yo
67
67
  * [Server Selection](https://github.com/mistralai/client-python/blob/master/#server-selection)
68
68
  * [Custom HTTP Client](https://github.com/mistralai/client-python/blob/master/#custom-http-client)
69
69
  * [Authentication](https://github.com/mistralai/client-python/blob/master/#authentication)
70
+ * [Resource Management](https://github.com/mistralai/client-python/blob/master/#resource-management)
70
71
  * [Debugging](https://github.com/mistralai/client-python/blob/master/#debugging)
71
72
  * [IDE Support](https://github.com/mistralai/client-python/blob/master/#ide-support)
72
73
  * [Development](https://github.com/mistralai/client-python/blob/master/#development)
@@ -77,6 +78,11 @@ Mistral AI API: Our Chat Completion and Embeddings APIs specification. Create yo
77
78
  <!-- Start SDK Installation [installation] -->
78
79
  ## SDK Installation
79
80
 
81
+ > [!NOTE]
82
+ > **Python version upgrade policy**
83
+ >
84
+ > Once a Python version reaches its [official end of life date](https://devguide.python.org/versions/), a 3-month grace period is provided for users to upgrade. Following this grace period, the minimum python version supported in the SDK will be updated.
85
+
80
86
  The SDK can be installed with either *pip* or *poetry* package managers.
81
87
 
82
88
  ### PIP
@@ -779,6 +785,32 @@ with Mistral(
779
785
  ```
780
786
  <!-- End Authentication [security] -->
781
787
 
788
+ <!-- Start Resource Management [resource-management] -->
789
+ ## Resource Management
790
+
791
+ The `Mistral` class implements the context manager protocol and registers a finalizer function to close the underlying sync and async HTTPX clients it uses under the hood. This will close HTTP connections, release memory and free up other resources held by the SDK. In short-lived Python programs and notebooks that make a few SDK method calls, resource management may not be a concern. However, in longer-lived programs, it is beneficial to create a single SDK instance via a [context manager][context-manager] and reuse it across the application.
792
+
793
+ [context-manager]: https://docs.python.org/3/reference/datamodel.html#context-managers
794
+
795
+ ```python
796
+ from mistralai import Mistral
797
+ import os
798
+ def main():
799
+ with Mistral(
800
+ api_key=os.getenv("MISTRAL_API_KEY", ""),
801
+ ) as mistral:
802
+ # Rest of application here...
803
+
804
+
805
+ # Or when using async:
806
+ async def amain():
807
+ async with Mistral(
808
+ api_key=os.getenv("MISTRAL_API_KEY", ""),
809
+ ) as mistral:
810
+ # Rest of application here...
811
+ ```
812
+ <!-- End Resource Management [resource-management] -->
813
+
782
814
  <!-- Start Debugging [debug] -->
783
815
  ## Debugging
784
816
 
@@ -42,6 +42,7 @@ Mistral AI API: Our Chat Completion and Embeddings APIs specification. Create yo
42
42
  * [Server Selection](https://github.com/mistralai/client-python/blob/master/#server-selection)
43
43
  * [Custom HTTP Client](https://github.com/mistralai/client-python/blob/master/#custom-http-client)
44
44
  * [Authentication](https://github.com/mistralai/client-python/blob/master/#authentication)
45
+ * [Resource Management](https://github.com/mistralai/client-python/blob/master/#resource-management)
45
46
  * [Debugging](https://github.com/mistralai/client-python/blob/master/#debugging)
46
47
  * [IDE Support](https://github.com/mistralai/client-python/blob/master/#ide-support)
47
48
  * [Development](https://github.com/mistralai/client-python/blob/master/#development)
@@ -52,6 +53,11 @@ Mistral AI API: Our Chat Completion and Embeddings APIs specification. Create yo
52
53
  <!-- Start SDK Installation [installation] -->
53
54
  ## SDK Installation
54
55
 
56
+ > [!NOTE]
57
+ > **Python version upgrade policy**
58
+ >
59
+ > Once a Python version reaches its [official end of life date](https://devguide.python.org/versions/), a 3-month grace period is provided for users to upgrade. Following this grace period, the minimum python version supported in the SDK will be updated.
60
+
55
61
  The SDK can be installed with either *pip* or *poetry* package managers.
56
62
 
57
63
  ### PIP
@@ -754,6 +760,32 @@ with Mistral(
754
760
  ```
755
761
  <!-- End Authentication [security] -->
756
762
 
763
+ <!-- Start Resource Management [resource-management] -->
764
+ ## Resource Management
765
+
766
+ The `Mistral` class implements the context manager protocol and registers a finalizer function to close the underlying sync and async HTTPX clients it uses under the hood. This will close HTTP connections, release memory and free up other resources held by the SDK. In short-lived Python programs and notebooks that make a few SDK method calls, resource management may not be a concern. However, in longer-lived programs, it is beneficial to create a single SDK instance via a [context manager][context-manager] and reuse it across the application.
767
+
768
+ [context-manager]: https://docs.python.org/3/reference/datamodel.html#context-managers
769
+
770
+ ```python
771
+ from mistralai import Mistral
772
+ import os
773
+ def main():
774
+ with Mistral(
775
+ api_key=os.getenv("MISTRAL_API_KEY", ""),
776
+ ) as mistral:
777
+ # Rest of application here...
778
+
779
+
780
+ # Or when using async:
781
+ async def amain():
782
+ async with Mistral(
783
+ api_key=os.getenv("MISTRAL_API_KEY", ""),
784
+ ) as mistral:
785
+ # Rest of application here...
786
+ ```
787
+ <!-- End Resource Management [resource-management] -->
788
+
757
789
  <!-- Start Debugging [debug] -->
758
790
  ## Debugging
759
791
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "mistralai"
3
- version = "1.4.0"
3
+ version = "1.5.0"
4
4
  description = "Python Client SDK for the Mistral AI API."
5
5
  authors = ["Mistral"]
6
6
  readme = "README-PYPI.md"
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "mistralai"
6
- __version__: str = "1.4.0"
6
+ __version__: str = "1.5.0"
7
7
  __openapi_doc_version__: str = "0.0.2"
8
- __gen_version__: str = "2.493.32"
9
- __user_agent__: str = "speakeasy-sdk/python 1.4.0 2.493.32 0.0.2 mistralai"
8
+ __gen_version__: str = "2.497.0"
9
+ __user_agent__: str = "speakeasy-sdk/python 1.5.0 2.497.0 0.0.2 mistralai"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -7,10 +7,92 @@ from mistralai.types import Nullable, OptionalNullable, UNSET
7
7
  from mistralai.utils import eventstreaming, get_security_from_env
8
8
  from typing import Any, List, Mapping, Optional, Union
9
9
 
10
+ # region imports
11
+ from typing import Type
12
+ from mistralai.extra import (
13
+ convert_to_parsed_chat_completion_response,
14
+ response_format_from_pydantic_model,
15
+ CustomPydanticModel,
16
+ ParsedChatCompletionResponse,
17
+ )
18
+ # endregion imports
19
+
10
20
 
11
21
  class Chat(BaseSDK):
12
22
  r"""Chat Completion API."""
13
23
 
24
+ # region sdk-class-body
25
+ # Custom .parse methods for the Structure Outputs Feature.
26
+
27
+ def parse(
28
+ self, response_format: Type[CustomPydanticModel], **kwargs: Any
29
+ ) -> ParsedChatCompletionResponse[CustomPydanticModel]:
30
+ """
31
+ Parse the response using the provided response format.
32
+ :param Type[CustomPydanticModel] response_format: The Pydantic model to parse the response into
33
+ :param Any **kwargs Additional keyword arguments to pass to the .complete method
34
+ :return: The parsed response
35
+ """
36
+ # Convert the input Pydantic Model to a strict JSON ready to be passed to chat.complete
37
+ json_response_format = response_format_from_pydantic_model(response_format)
38
+ # Run the inference
39
+ response = self.complete(**kwargs, response_format=json_response_format)
40
+ # Parse response back to the input pydantic model
41
+ parsed_response = convert_to_parsed_chat_completion_response(
42
+ response, response_format
43
+ )
44
+ return parsed_response
45
+
46
+ async def parse_async(
47
+ self, response_format: Type[CustomPydanticModel], **kwargs
48
+ ) -> ParsedChatCompletionResponse[CustomPydanticModel]:
49
+ """
50
+ Asynchronously parse the response using the provided response format.
51
+ :param Type[CustomPydanticModel] response_format: The Pydantic model to parse the response into
52
+ :param Any **kwargs Additional keyword arguments to pass to the .complete method
53
+ :return: The parsed response
54
+ """
55
+ json_response_format = response_format_from_pydantic_model(response_format)
56
+ response = await self.complete_async( # pylint: disable=E1125
57
+ **kwargs, response_format=json_response_format
58
+ )
59
+ parsed_response = convert_to_parsed_chat_completion_response(
60
+ response, response_format
61
+ )
62
+ return parsed_response
63
+
64
+ def parse_stream(
65
+ self, response_format: Type[CustomPydanticModel], **kwargs
66
+ ) -> eventstreaming.EventStream[models.CompletionEvent]:
67
+ """
68
+ Parse the response using the provided response format.
69
+ For now the response will be in JSON format not in the input Pydantic model.
70
+ :param Type[CustomPydanticModel] response_format: The Pydantic model to parse the response into
71
+ :param Any **kwargs Additional keyword arguments to pass to the .stream method
72
+ :return: The JSON parsed response
73
+ """
74
+ json_response_format = response_format_from_pydantic_model(response_format)
75
+ response = self.stream(**kwargs, response_format=json_response_format)
76
+ return response
77
+
78
+ async def parse_stream_async(
79
+ self, response_format: Type[CustomPydanticModel], **kwargs
80
+ ) -> eventstreaming.EventStreamAsync[models.CompletionEvent]:
81
+ """
82
+ Asynchronously parse the response using the provided response format.
83
+ For now the response will be in JSON format not in the input Pydantic model.
84
+ :param Type[CustomPydanticModel] response_format: The Pydantic model to parse the response into
85
+ :param Any **kwargs Additional keyword arguments to pass to the .stream method
86
+ :return: The JSON parsed response
87
+ """
88
+ json_response_format = response_format_from_pydantic_model(response_format)
89
+ response = await self.stream_async( # pylint: disable=E1125
90
+ **kwargs, response_format=json_response_format
91
+ )
92
+ return response
93
+
94
+ # endregion sdk-class-body
95
+
14
96
  def complete(
15
97
  self,
16
98
  *,
@@ -0,0 +1,56 @@
1
+ ## Context
2
+
3
+ The extra package contains the custom logic which is too complex to be generated by Speakeasy from the OpenAPI specs. It was introduced to add the Structured Outputs feature.
4
+
5
+ ## Development / Contributing
6
+
7
+ To add custom code in the SDK, you need to use [Speakeasy custom code regions](https://www.speakeasy.com/docs/customize/code/code-regions/overview) as below.
8
+
9
+ ### Runbook of SDK customization
10
+
11
+ 1. Add the code you want to import in the `src/mistralai/extra/` package. To have it importable from the SDK, you need to add it in the `__init__.py` file:
12
+ ```python
13
+ from .my_custom_file import my_custom_function
14
+
15
+ __all__ = ["my_custom_function"]
16
+ ```
17
+
18
+ 2. Add a new custom code region in the SDK files, e.g in `src/mistralai/chat.py`:
19
+ ```python
20
+ # region imports
21
+ from typing import Type
22
+ from mistralai.extra import my_custom_function
23
+ # endregion imports
24
+
25
+ class Chat(BaseSDK):
26
+ r"""Chat Completion API."""
27
+
28
+ # region sdk-class-body
29
+ def my_custom_method(self, param: str) -> Type[some_type]:
30
+ output = my_custom_function(param1)
31
+ return output
32
+ # endregion sdk-class-body
33
+ ```
34
+
35
+ 3. Now build the SDK with the custom code:
36
+ ```bash
37
+ rm -rf dist; poetry build; python3 -m pip install ~/client-python/dist/mistralai-1.4.1-py3-none-any.whl --force-reinstall
38
+ ```
39
+
40
+ 4. And now you should be able to call the custom method:
41
+ ```python
42
+ import os
43
+ from mistralai import Mistral
44
+
45
+ api_key = os.environ["MISTRAL_API_KEY"]
46
+ client = Mistral(api_key=api_key)
47
+
48
+ client.chat.my_custom_method(param="test")
49
+ ```
50
+
51
+ ### Run the unit tests
52
+
53
+ To run the unit tests for the `extra` package, you can run the following command from the root of the repository:
54
+ ```bash
55
+ python3.12 -m unittest discover -s src/mistralai/extra/tests -t src
56
+ ```
@@ -0,0 +1,5 @@
1
+ from .struct_chat import ParsedChatCompletionResponse, convert_to_parsed_chat_completion_response
2
+ from .utils import response_format_from_pydantic_model
3
+ from .utils.response_format import CustomPydanticModel
4
+
5
+ __all__ = ["convert_to_parsed_chat_completion_response", "response_format_from_pydantic_model", "CustomPydanticModel", "ParsedChatCompletionResponse"]
@@ -0,0 +1,41 @@
1
+ from ..models import ChatCompletionResponse, ChatCompletionChoice, AssistantMessage
2
+ from .utils.response_format import CustomPydanticModel, pydantic_model_from_json
3
+ from typing import List, Optional, Type, Generic
4
+ from pydantic import BaseModel
5
+ import json
6
+
7
+ class ParsedAssistantMessage(AssistantMessage, Generic[CustomPydanticModel]):
8
+ parsed: Optional[CustomPydanticModel]
9
+
10
+ class ParsedChatCompletionChoice(ChatCompletionChoice, Generic[CustomPydanticModel]):
11
+ message: Optional[ParsedAssistantMessage[CustomPydanticModel]] # type: ignore
12
+
13
+ class ParsedChatCompletionResponse(ChatCompletionResponse, Generic[CustomPydanticModel]):
14
+ choices: Optional[List[ParsedChatCompletionChoice[CustomPydanticModel]]] # type: ignore
15
+
16
+ def convert_to_parsed_chat_completion_response(response: ChatCompletionResponse, response_format: Type[BaseModel]) -> ParsedChatCompletionResponse:
17
+ parsed_choices = []
18
+
19
+ if response.choices:
20
+ for choice in response.choices:
21
+ if choice.message:
22
+ parsed_message: ParsedAssistantMessage = ParsedAssistantMessage(
23
+ **choice.message.model_dump(),
24
+ parsed=None
25
+ )
26
+ if isinstance(parsed_message.content, str):
27
+ parsed_message.parsed = pydantic_model_from_json(json.loads(parsed_message.content), response_format)
28
+ elif parsed_message.content is None:
29
+ parsed_message.parsed = None
30
+ else:
31
+ raise TypeError(f"Unexpected type for message.content: {type(parsed_message.content)}")
32
+ choice_dict = choice.model_dump()
33
+ choice_dict["message"] = parsed_message
34
+ parsed_choice: ParsedChatCompletionChoice = ParsedChatCompletionChoice(**choice_dict)
35
+ parsed_choices.append(parsed_choice)
36
+ else:
37
+ parsed_choice = ParsedChatCompletionChoice(**choice.model_dump())
38
+ parsed_choices.append(parsed_choice)
39
+ response_dict = response.model_dump()
40
+ response_dict["choices"] = parsed_choices
41
+ return ParsedChatCompletionResponse(**response_dict)
File without changes
@@ -0,0 +1,103 @@
1
+ import unittest
2
+ from ..struct_chat import (
3
+ convert_to_parsed_chat_completion_response,
4
+ ParsedChatCompletionResponse,
5
+ ParsedChatCompletionChoice,
6
+ ParsedAssistantMessage,
7
+ )
8
+ from ...models import (
9
+ ChatCompletionResponse,
10
+ UsageInfo,
11
+ ChatCompletionChoice,
12
+ AssistantMessage,
13
+ )
14
+ from pydantic import BaseModel
15
+
16
+
17
+ class Explanation(BaseModel):
18
+ explanation: str
19
+ output: str
20
+
21
+
22
+ class MathDemonstration(BaseModel):
23
+ steps: list[Explanation]
24
+ final_answer: str
25
+
26
+
27
+ mock_cc_response = ChatCompletionResponse(
28
+ id="c0271b2098954c6094231703875ca0bc",
29
+ object="chat.completion",
30
+ model="mistral-large-latest",
31
+ usage=UsageInfo(prompt_tokens=75, completion_tokens=220, total_tokens=295),
32
+ created=1737727558,
33
+ choices=[
34
+ ChatCompletionChoice(
35
+ index=0,
36
+ message=AssistantMessage(
37
+ content='{\n "final_answer": "x = -4",\n "steps": [\n {\n "explanation": "Start with the given equation.",\n "output": "8x + 7 = -23"\n },\n {\n "explanation": "Subtract 7 from both sides to isolate the term with x.",\n "output": "8x = -23 - 7"\n },\n {\n "explanation": "Simplify the right side of the equation.",\n "output": "8x = -30"\n },\n {\n "explanation": "Divide both sides by 8 to solve for x.",\n "output": "x = -30 / 8"\n },\n {\n "explanation": "Simplify the fraction to get the final answer.",\n "output": "x = -4"\n }\n ]\n}',
38
+ tool_calls=None,
39
+ prefix=False,
40
+ role="assistant",
41
+ ),
42
+ finish_reason="stop",
43
+ )
44
+ ],
45
+ )
46
+
47
+
48
+ expected_response = ParsedChatCompletionResponse(
49
+ choices=[
50
+ ParsedChatCompletionChoice(
51
+ index=0,
52
+ message=ParsedAssistantMessage(
53
+ content='{\n "final_answer": "x = -4",\n "steps": [\n {\n "explanation": "Start with the given equation.",\n "output": "8x + 7 = -23"\n },\n {\n "explanation": "Subtract 7 from both sides to isolate the term with x.",\n "output": "8x = -23 - 7"\n },\n {\n "explanation": "Simplify the right side of the equation.",\n "output": "8x = -30"\n },\n {\n "explanation": "Divide both sides by 8 to solve for x.",\n "output": "x = -30 / 8"\n },\n {\n "explanation": "Simplify the fraction to get the final answer.",\n "output": "x = -4"\n }\n ]\n}',
54
+ tool_calls=None,
55
+ prefix=False,
56
+ role="assistant",
57
+ parsed=MathDemonstration(
58
+ steps=[
59
+ Explanation(
60
+ explanation="Start with the given equation.",
61
+ output="8x + 7 = -23",
62
+ ),
63
+ Explanation(
64
+ explanation="Subtract 7 from both sides to isolate the term with x.",
65
+ output="8x = -23 - 7",
66
+ ),
67
+ Explanation(
68
+ explanation="Simplify the right side of the equation.",
69
+ output="8x = -30",
70
+ ),
71
+ Explanation(
72
+ explanation="Divide both sides by 8 to solve for x.",
73
+ output="x = -30 / 8",
74
+ ),
75
+ Explanation(
76
+ explanation="Simplify the fraction to get the final answer.",
77
+ output="x = -4",
78
+ ),
79
+ ],
80
+ final_answer="x = -4",
81
+ ),
82
+ ),
83
+ finish_reason="stop",
84
+ )
85
+ ],
86
+ created=1737727558,
87
+ id="c0271b2098954c6094231703875ca0bc",
88
+ model="mistral-large-latest",
89
+ object="chat.completion",
90
+ usage=UsageInfo(prompt_tokens=75, completion_tokens=220, total_tokens=295),
91
+ )
92
+
93
+
94
+ class TestConvertToParsedChatCompletionResponse(unittest.TestCase):
95
+ def test_convert_to_parsed_chat_completion_response(self):
96
+ output = convert_to_parsed_chat_completion_response(
97
+ mock_cc_response, MathDemonstration
98
+ )
99
+ self.assertEqual(output, expected_response)
100
+
101
+
102
+ if __name__ == "__main__":
103
+ unittest.main()
@@ -0,0 +1,162 @@
1
+ from ..utils.response_format import (
2
+ pydantic_model_from_json,
3
+ response_format_from_pydantic_model,
4
+ rec_strict_json_schema,
5
+ )
6
+ from pydantic import BaseModel, ValidationError
7
+
8
+ from ...models import ResponseFormat, JSONSchema
9
+ from ...types.basemodel import Unset
10
+
11
+ import unittest
12
+
13
+
14
+ class Student(BaseModel):
15
+ name: str
16
+ age: int
17
+
18
+
19
+ class Explanation(BaseModel):
20
+ explanation: str
21
+ output: str
22
+
23
+
24
+ class MathDemonstration(BaseModel):
25
+ steps: list[Explanation]
26
+ final_answer: str
27
+
28
+
29
+ mathdemo_schema = {
30
+ "$defs": {
31
+ "Explanation": {
32
+ "properties": {
33
+ "explanation": {"title": "Explanation", "type": "string"},
34
+ "output": {"title": "Output", "type": "string"},
35
+ },
36
+ "required": ["explanation", "output"],
37
+ "title": "Explanation",
38
+ "type": "object",
39
+ }
40
+ },
41
+ "properties": {
42
+ "steps": {
43
+ "items": {"$ref": "#/$defs/Explanation"},
44
+ "title": "Steps",
45
+ "type": "array",
46
+ },
47
+ "final_answer": {"title": "Final Answer", "type": "string"},
48
+ },
49
+ "required": ["steps", "final_answer"],
50
+ "title": "MathDemonstration",
51
+ "type": "object",
52
+ }
53
+
54
+ mathdemo_strict_schema = mathdemo_schema.copy()
55
+ mathdemo_strict_schema["$defs"]["Explanation"]["additionalProperties"] = False # type: ignore
56
+ mathdemo_strict_schema["additionalProperties"] = False
57
+
58
+ mathdemo_response_format = ResponseFormat(
59
+ type="json_schema",
60
+ json_schema=JSONSchema(
61
+ name="MathDemonstration",
62
+ schema_definition=mathdemo_strict_schema,
63
+ description=Unset(),
64
+ strict=True,
65
+ ),
66
+ )
67
+
68
+
69
+ class TestResponseFormat(unittest.TestCase):
70
+ def test_pydantic_model_from_json(self):
71
+ missing_json_data = {"name": "Jean Dupont"}
72
+ good_json_data = {"name": "Jean Dupont", "age": 25}
73
+ extra_json_data = {
74
+ "name": "Jean Dupont",
75
+ "age": 25,
76
+ "extra_field": "extra_value",
77
+ }
78
+ complex_json_data = {
79
+ "final_answer": "x = -4",
80
+ "steps": [
81
+ {
82
+ "explanation": "Start with the given equation.",
83
+ "output": "8x + 7 = -23",
84
+ },
85
+ {
86
+ "explanation": "Subtract 7 from both sides to isolate the term with x.",
87
+ "output": "8x = -23 - 7",
88
+ },
89
+ {
90
+ "explanation": "Simplify the right side of the equation.",
91
+ "output": "8x = -30",
92
+ },
93
+ {
94
+ "explanation": "Divide both sides by 8 to solve for x.",
95
+ "output": "x = -30 / 8",
96
+ },
97
+ {
98
+ "explanation": "Simplify the fraction to get the final answer.",
99
+ "output": "x = -4",
100
+ },
101
+ ],
102
+ }
103
+
104
+ self.assertEqual(
105
+ pydantic_model_from_json(good_json_data, Student),
106
+ Student(name="Jean Dupont", age=25),
107
+ )
108
+ self.assertEqual(
109
+ pydantic_model_from_json(extra_json_data, Student),
110
+ Student(name="Jean Dupont", age=25),
111
+ )
112
+ self.assertEqual(
113
+ pydantic_model_from_json(complex_json_data, MathDemonstration),
114
+ MathDemonstration(
115
+ steps=[
116
+ Explanation(
117
+ explanation="Start with the given equation.",
118
+ output="8x + 7 = -23",
119
+ ),
120
+ Explanation(
121
+ explanation="Subtract 7 from both sides to isolate the term with x.",
122
+ output="8x = -23 - 7",
123
+ ),
124
+ Explanation(
125
+ explanation="Simplify the right side of the equation.",
126
+ output="8x = -30",
127
+ ),
128
+ Explanation(
129
+ explanation="Divide both sides by 8 to solve for x.",
130
+ output="x = -30 / 8",
131
+ ),
132
+ Explanation(
133
+ explanation="Simplify the fraction to get the final answer.",
134
+ output="x = -4",
135
+ ),
136
+ ],
137
+ final_answer="x = -4",
138
+ ),
139
+ )
140
+
141
+ # Check it raises a validation error
142
+ with self.assertRaises(ValidationError):
143
+ pydantic_model_from_json(missing_json_data, Student) # type: ignore
144
+
145
+ def test_response_format_from_pydantic_model(self):
146
+ self.assertEqual(
147
+ response_format_from_pydantic_model(MathDemonstration),
148
+ mathdemo_response_format,
149
+ )
150
+
151
+ def test_rec_strict_json_schema(self):
152
+ invalid_schema = mathdemo_schema | {"wrong_value": 1}
153
+ self.assertEqual(
154
+ rec_strict_json_schema(mathdemo_schema), mathdemo_strict_schema
155
+ )
156
+
157
+ with self.assertRaises(ValueError):
158
+ rec_strict_json_schema(invalid_schema)
159
+
160
+
161
+ if __name__ == "__main__":
162
+ unittest.main()
@@ -0,0 +1,3 @@
1
+ from .response_format import response_format_from_pydantic_model
2
+
3
+ __all__ = ["response_format_from_pydantic_model"]
@@ -0,0 +1,20 @@
1
+ from typing import Any
2
+
3
+ def rec_strict_json_schema(schema_node: Any) -> Any:
4
+ """
5
+ Recursively set the additionalProperties property to False for all objects in the JSON Schema.
6
+ This makes the JSON Schema strict (i.e. no additional properties are allowed).
7
+ """
8
+ if isinstance(schema_node, (str, bool)):
9
+ return schema_node
10
+ if isinstance(schema_node, dict):
11
+ if "type" in schema_node and schema_node["type"] == "object":
12
+ schema_node["additionalProperties"] = False
13
+ for key, value in schema_node.items():
14
+ schema_node[key] = rec_strict_json_schema(value)
15
+ elif isinstance(schema_node, list):
16
+ for i, value in enumerate(schema_node):
17
+ schema_node[i] = rec_strict_json_schema(value)
18
+ else:
19
+ raise ValueError(f"Unexpected type: {schema_node}")
20
+ return schema_node
@@ -0,0 +1,24 @@
1
+ from pydantic import BaseModel
2
+ from typing import TypeVar, Any, Type
3
+ from ...models import JSONSchema, ResponseFormat
4
+ from ._pydantic_helper import rec_strict_json_schema
5
+
6
+ CustomPydanticModel = TypeVar("CustomPydanticModel", bound=BaseModel)
7
+
8
+
9
+ def response_format_from_pydantic_model(
10
+ model: type[CustomPydanticModel],
11
+ ) -> ResponseFormat:
12
+ """Generate a strict JSON schema from a pydantic model."""
13
+ model_schema = rec_strict_json_schema(model.model_json_schema())
14
+ json_schema = JSONSchema.model_validate(
15
+ {"name": model.__name__, "schema": model_schema, "strict": True}
16
+ )
17
+ return ResponseFormat(type="json_schema", json_schema=json_schema)
18
+
19
+
20
+ def pydantic_model_from_json(
21
+ json_data: dict[str, Any], pydantic_model: Type[CustomPydanticModel]
22
+ ) -> CustomPydanticModel:
23
+ """Parse a JSON schema into a pydantic model."""
24
+ return pydantic_model.model_validate(json_data)