mistral 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01bc1534430ff8a86dafca215d434c999337163910c2b67c5a7198bbc4ade7c3
4
- data.tar.gz: d97eda8d0b53118de9998dca31041ec14a1e357b7052a6083d4f172408192ebf
3
+ metadata.gz: d9d2632f2ddb13e1ebe7e1e286eef43e577598bfe3f918a8961efda0fd471b84
4
+ data.tar.gz: 150463bfd7ec228c3d8bbae83a3e1277d1907324e10649ebe236868486e91c47
5
5
  SHA512:
6
- metadata.gz: 46f9cb65643ff7b805a2fe94181d7d8af3e27afc42ae001d9a6a6a4ef660ae79461508c793734cf46bcf14e470ec2f2e21c480e12d567f2e0c224c6cd3639f62
7
- data.tar.gz: a68462d1daf574b786d325ece5f5519d9b3bada3081b1a150eb088e6bdb036b6f455a46a5e516ed6b4f6a79b294e400c21240c0a210181279c5eab16575756e9
6
+ metadata.gz: d10df680e7ad04178dea6a386539404659836ce4df94fa991a45bc3a00837802c251923ea9bb58a5118e96b4dd2b44dfce171c55588a8c704bb886627144b4ee
7
+ data.tar.gz: 709d9ccaf6ed76d8c56d513f5c08ff3610eafe2662430f9f71ff6984f0ec83b3ec37daa0cf7d04efcdd2b8f5ad41e6af17ea6a62a6d593abb07f97542bf64cdd
data/.env.example CHANGED
@@ -1,3 +1,3 @@
1
1
  # Get this from https://console.mistral.ai/api-keys/
2
2
  MISTRAL_API_KEY=
3
- LOG_LEVEL=ERROR
3
+ MISTRAL_LOG_LEVEL=ERROR
data/CHANGELOG.md CHANGED
@@ -5,8 +5,26 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.1/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.0] - 2024-05-23
9
+
10
+ ### Added
11
+
12
+ - We now support tool_call_id for tool messages. This will be mandatory in the future but you can start using right
13
+ away to improve the model performance during function calling (especially multiple).
14
+ Ports [mistralai/client-python#93](https://github.com/mistralai/client-python/pull/93)
15
+
16
+ ### Changed
17
+
18
+ - Renamed `LOG_LEVEL` to `MISTRAL_LOG_LEVEL`. This is not a direct port of the Python client because Python has a
19
+ global logger in the `logging` module, but Ruby doesn't.
20
+ Ports [mistralai/client-python#86](https://github.com/mistralai/client-python/pull/86)
21
+ - Get API key at client initialization. Ports
22
+ [mistralai/client-python#57](https://github.com/mistralai/client-python/pull/57)
23
+
8
24
  ## [0.1.0] - 2024-05-04
9
25
 
10
- - Initial release. Feature parity with `v0.1.8` of the [client-python](https://github.com/mistralai/client-python)
26
+ - Initial release. Feature parity with `v0.1.8` of the
27
+ [mistralai/client-python](https://github.com/mistralai/client-python)
11
28
 
12
- [0.1.0]: https://github.com/wilsonsilva/nostr/compare/28e7c9...v0.1.0
29
+ [0.2.0]: https://github.com/wilsonsilva/mistral/compare/v0.1.0...v0.2.0
30
+ [0.1.0]: https://github.com/wilsonsilva/mistral/compare/28e7c9...v0.1.0
@@ -175,10 +175,21 @@ This code resides in `lib/http/features/line_iterable_body.rb`.
175
175
  ## Testing
176
176
 
177
177
  The Ruby gem aims for 1:1 parity with the Python client. As such, it uses `Minitest` (similar to Python's `pytest`).
178
- However, testing was simplified by using and `webmock` for stubbing requests, instead of implementing 100% test
178
+ However, testing was simplified by using `webmock` for stubbing requests, instead of implementing 100% test
179
179
  coverage and using RSpec, which is usually what I do.
180
180
 
181
181
  ## Examples
182
182
 
183
183
  The `function_calling.rb` example omits the unnecessary `n_rows = data['transaction_id'].length` line present in
184
184
  the Python version.
185
+
186
+ ## Logging
187
+
188
+ Python has a global logger:
189
+
190
+ ```python
191
+ self._logger = logging.getLogger(__name__)
192
+ ```
193
+
194
+ Ruby doesn't. Thus, in order to allow users to customize the logging level, they can set the environment variable
195
+ `MISTRAL_LOG_LEVEL` to `DEBUG`, `INFO`, `WARN`, `ERROR` or `FATAL`.
@@ -73,7 +73,7 @@ tools = [
73
73
  ]
74
74
 
75
75
  api_key = ENV.fetch('MISTRAL_API_KEY')
76
- model = 'mistral-large-latest'
76
+ model = 'mistral-small-latest'
77
77
 
78
78
  client = Mistral::Client.new(api_key: api_key)
79
79
 
@@ -97,7 +97,9 @@ puts "calling function_name: #{function_name}, with function_params: #{function_
97
97
  function_result = names_to_functions[function_name].call(function_params['transaction_id'])
98
98
 
99
99
  messages << response.choices[0].message
100
- messages << Mistral::ChatMessage.new(role: 'tool', name: function_name, content: function_result)
100
+ messages << Mistral::ChatMessage.new(
101
+ role: 'tool', name: function_name, content: function_result, tool_call_id: tool_call.id
102
+ )
101
103
 
102
104
  response = client.chat(model: model, messages: messages, tools: tools)
103
105
 
@@ -6,7 +6,7 @@ module Mistral
6
6
  # Synchronous wrapper around the async client
7
7
  class Client < ClientBase
8
8
  def initialize(
9
- api_key: ENV['MISTRAL_API_KEY'],
9
+ api_key: nil,
10
10
  endpoint: ENDPOINT,
11
11
  max_retries: 5,
12
12
  timeout: 120
@@ -5,11 +5,15 @@ module Mistral
5
5
  attr_reader :endpoint, :api_key, :max_retries, :timeout
6
6
 
7
7
  def initialize(endpoint:, api_key: nil, max_retries: 5, timeout: 120)
8
- @endpoint = endpoint
9
- @api_key = api_key
10
8
  @max_retries = max_retries
11
9
  @timeout = timeout
12
10
 
11
+ api_key = ENV['MISTRAL_API_KEY'] if api_key.nil?
12
+
13
+ raise Error, 'API key not provided. Please set MISTRAL_API_KEY environment variable.' if api_key.nil?
14
+
15
+ @api_key = api_key
16
+ @endpoint = endpoint
13
17
  @logger = config_logger
14
18
 
15
19
  # For azure endpoints, we default to the mistral model
@@ -115,7 +119,7 @@ module Mistral
115
119
 
116
120
  def config_logger
117
121
  Logger.new($stdout).tap do |logger|
118
- logger.level = ENV.fetch('LOG_LEVEL', 'ERROR')
122
+ logger.level = ENV.fetch('MISTRAL_LOG_LEVEL', 'ERROR')
119
123
 
120
124
  logger.formatter = proc do |severity, datetime, progname, msg|
121
125
  "#{datetime.strftime("%Y-%m-%d %H:%M:%S")} #{severity} #{progname}: #{msg}\n"
@@ -43,6 +43,7 @@ module Mistral
43
43
  attribute :content, Types::Strict::Array.of(Types::Strict::String) | Types::Strict::String
44
44
  attribute? :name, Types::String.optional
45
45
  attribute? :tool_calls, Types::Strict::Array.of(ToolCall).optional
46
+ attribute? :tool_call_id, Types::String.optional
46
47
  end
47
48
 
48
49
  class DeltaMessage < Dry::Struct
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mistral
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mistral
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Silva
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-04 00:00:00.000000000 Z
11
+ date: 2024-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -108,7 +108,8 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.23'
111
- description: You can use the Mistral Ruby client to interact with the Mistral AI API.
111
+ description: A 1:1 Ruby port of the official Mistral Python client, with feature and
112
+ API parity.
112
113
  email:
113
114
  - wilson.dsigns@gmail.com
114
115
  executables: []