ollama-ruby 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +84 -0
- data/README.md +6 -3
- data/Rakefile +1 -1
- data/bin/ollama_chat +142 -56
- data/bin/ollama_cli +3 -3
- data/bin/ollama_update +2 -0
- data/lib/ollama/client.rb +0 -3
- data/lib/ollama/documents/cache/redis_cache.rb +11 -1
- data/lib/ollama/documents.rb +11 -5
- data/lib/ollama/image.rb +3 -1
- data/lib/ollama/utils/cache_fetcher.rb +3 -3
- data/lib/ollama/utils/chooser.rb +9 -3
- data/lib/ollama/utils/fetcher.rb +18 -8
- data/lib/ollama/utils/tags.rb +60 -6
- data/lib/ollama/utils/width.rb +5 -3
- data/lib/ollama/version.rb +1 -1
- data/lib/ollama.rb +4 -0
- data/ollama-ruby.gemspec +6 -6
- data/spec/ollama/image_spec.rb +5 -0
- data/spec/ollama/utils/cache_fetcher_spec.rb +4 -3
- data/spec/ollama/utils/tags_spec.rb +26 -2
- data/spec/ollama/utils/width_spec.rb +82 -0
- metadata +18 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bdf85f296b631c52b44984eee6a5e6d98c82a4cfc4a5764529f4d46b3bdaba7
|
4
|
+
data.tar.gz: 05e391e492f85f8c6fb1106d49ff4118c26a0922c5978156e2f1364aad82299d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a3f77296a526154ed46860a675515b864baa8c991933e76ceeb178b00037df844f20201ad200cb9df8d4fa105066fb40bb0248db3bb65c5bad81012ce3b7288
|
7
|
+
data.tar.gz: 1d25c9420fba86d992b77f29e4f4f57734dcbdaba864650f626af1c828262a9470f9c981da602335f8d3a03ef3cfc9773ad33d90d3e88a70a4d86be0518d762a
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,89 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 2024-10-03 v0.7.0
|
4
|
+
|
5
|
+
* **Refactor command line interface**
|
6
|
+
+ Moved case order
|
7
|
+
+ Renamed `/collection clear [tag]|change` to `/collection (clear|change)`
|
8
|
+
+ Improved help message, added /info
|
9
|
+
* **Update README.md**
|
10
|
+
+ Update README.md to reflect changed/added commands
|
11
|
+
* **Add support for reading PostScript**
|
12
|
+
+ Extracted `pdf_read` method to read PDF files using `PDF::Reader`
|
13
|
+
+ Added `ps_read` method to read PostScript files by converting them to PDF with Ghostscript and using `pdf_read`.
|
14
|
+
+ Updated `parse_source` method to handle PostScript files
|
15
|
+
* **Update read buffer size for tempfile writes**
|
16
|
+
+ Updated `tmp.write` to use a larger buffer size (**16KB**) in IO.popen block.
|
17
|
+
* **Refactor Collection Chooser and usages**
|
18
|
+
+ Added confirmation prompt before clearing collection
|
19
|
+
+ Improved collection chooser with `[EXIT]` and `[ALL]` options
|
20
|
+
+ Added `ask?` method for user input
|
21
|
+
* **Add prompt to choose method**
|
22
|
+
+ Added `prompt` parameter to `choose` method in `Ollama::Utils::Chooser`
|
23
|
+
+ Modified output formatting for selected entry in `choose` method
|
24
|
+
+ Updated `choose` method to handle cases better where no entry was chosen
|
25
|
+
* **Fix Redis cache expiration logic**
|
26
|
+
+ Update `set` method to delete key expiration time is less than 1 second.
|
27
|
+
* **Update dependencies and add source tracking**
|
28
|
+
- Remove `sorted_set` dependency from Rakefile
|
29
|
+
- Modify `Ollama::Documents` class to track source of tags
|
30
|
+
- Update `Ollama::Utils::Tags` class to include source in tag output and add methods for tracking source
|
31
|
+
- Update tests for `Ollama::Utils::Tags` class
|
32
|
+
* **Refactor width calculation and add tests for wrap and truncate methods.**
|
33
|
+
+ Extend `Term::ANSIColor` in `Ollama::Utils::Width`
|
34
|
+
+ Update `width` method to use ellipsis length when truncating text
|
35
|
+
+ Add tests for `wrap` and `truncate` methods with percentage and length arguments
|
36
|
+
* **Add attr_reader for data and update equality check**
|
37
|
+
+ Added `attr_reader :data` to Ollama::Image class
|
38
|
+
+ Updated `==` method in Ollama::Image class to use `other.data`
|
39
|
+
+ Added test case in `image_spec.rb` to verify equality of images
|
40
|
+
|
41
|
+
## 2024-09-30 v0.6.0
|
42
|
+
|
43
|
+
### Significant Changes
|
44
|
+
|
45
|
+
* **Added voice toggle and change functionality**:
|
46
|
+
+ Removed `-v` command line switch
|
47
|
+
+ Added new Switch class for voice output
|
48
|
+
+ Added new method `change_voice` to toggle or change voice output
|
49
|
+
+ Updated `info` method to display current voice output if enabled
|
50
|
+
+ Updated `display_chat_help` method to include /voice command
|
51
|
+
* **Added expiring cache support**:
|
52
|
+
+ Added `Ollama::Utils::CacheFetcher` class for caching HTTP responses
|
53
|
+
+ Modified `Ollama::Utils::Fetcher` to use the new cache class
|
54
|
+
+ Updated `ollama_chat` script to use the cache when fetching sources
|
55
|
+
+ Added specs for the new cache fetcher class
|
56
|
+
* **Added change system prompt feature**:
|
57
|
+
+ Added `/system` command to change system prompt
|
58
|
+
+ Implemented `set_system_prompt` and `change_system_prompt` methods in `bin/ollama_chat`
|
59
|
+
+ Updated help messages in `README.md`
|
60
|
+
|
61
|
+
### Other Changes
|
62
|
+
|
63
|
+
* **Updated dependencies**:
|
64
|
+
+ Updated version of `xdg` gem to **7.0**
|
65
|
+
+ Added `xdg` dependency to Rakefile
|
66
|
+
* **Refactored error handling**:
|
67
|
+
+ Warn message updated to include more context about the error
|
68
|
+
+ `warn` statement now mentions "while pulling model"
|
69
|
+
* **Updated chat commands and added clipboard functionality**:
|
70
|
+
+ Added `/copy` command to copy last response to clipboard
|
71
|
+
+ Implemented `copy_to_clipboard` method in `ollama_chat`
|
72
|
+
+ Updated chat help display to include new `/copy` command
|
73
|
+
* **Refactored Ollama::Utils::Fetcher**:
|
74
|
+
+ Made instance methods private and only exposed class methods
|
75
|
+
+ Added `expose` method to `Ollama::Utils::FetcherSpec` for testing
|
76
|
+
* **Added version command to ollama chat binary**:
|
77
|
+
+ Added `version` method to print Ollama version and exit
|
78
|
+
+ Updated `$opts` string in `ollama` script to include `-V` option for version command
|
79
|
+
+ Added call to `version` method when `-V` option is used
|
80
|
+
* **Updated system prompt display**:
|
81
|
+
+ Changed `Ollama::Utils::Width.wrap` to `Ollama::Utils::ANSIMarkdown.parse` in `show_system_prompt` method
|
82
|
+
* **Added system prompt configuration via search_ui for ? argument value**:
|
83
|
+
+ Added `show_system_prompt` method to print configured system prompt
|
84
|
+
+ Modified `info` method to include system prompt in output
|
85
|
+
+ Implemented option `-s ?` to choose or specify system prompt
|
86
|
+
|
3
87
|
## 2024-09-26 v0.5.0
|
4
88
|
|
5
89
|
### New Features
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ This a chat client, that can be used to connect to an ollama server and enter a
|
|
34
34
|
chat converstation with a LLM. It can be called with the following arguments:
|
35
35
|
|
36
36
|
```
|
37
|
-
ollama_chat [OPTIONS]
|
37
|
+
Usage: ollama_chat [OPTIONS]
|
38
38
|
|
39
39
|
-f CONFIG config file to read
|
40
40
|
-u URL the ollama base url, OLLAMA_URL
|
@@ -42,9 +42,10 @@ ollama_chat [OPTIONS]
|
|
42
42
|
-s SYSTEM the system prompt to use as a file, OLLAMA_CHAT_SYSTEM
|
43
43
|
-c CHAT a saved chat conversation to load
|
44
44
|
-C COLLECTION name of the collection used in this conversation
|
45
|
-
-D DOCUMENT load document and add to collection (multiple)
|
45
|
+
-D DOCUMENT load document and add to embeddings collection (multiple)
|
46
46
|
-M use (empty) MemoryCache for this chat session
|
47
47
|
-E disable embeddings for this chat session
|
48
|
+
-V display the current version number and quit
|
48
49
|
-h this help
|
49
50
|
```
|
50
51
|
|
@@ -157,6 +158,7 @@ The following commands can be given inside the chat, if prefixed by a `/`:
|
|
157
158
|
/paste to paste content
|
158
159
|
/markdown toggle markdown output
|
159
160
|
/stream toggle stream output
|
161
|
+
/location toggle location submission
|
160
162
|
/voice( change) toggle voice output or change the voice
|
161
163
|
/list [n] list the last n / all conversation exchanges
|
162
164
|
/clear clear the whole conversation
|
@@ -165,7 +167,8 @@ The following commands can be given inside the chat, if prefixed by a `/`:
|
|
165
167
|
/model change the model
|
166
168
|
/system change system prompt (clears conversation)
|
167
169
|
/regenerate the last answer message
|
168
|
-
/collection clear
|
170
|
+
/collection( clear|change) change (default) collection or clear
|
171
|
+
/info show information for current session
|
169
172
|
/import source import the source's content
|
170
173
|
/summarize [n] source summarize the source's content in n words
|
171
174
|
/embedding toggle embedding paused or not
|
data/Rakefile
CHANGED
@@ -32,7 +32,6 @@ GemHadar do
|
|
32
32
|
dependency 'redis', '~> 5.0'
|
33
33
|
dependency 'numo-narray', '~> 0.9'
|
34
34
|
dependency 'more_math', '~> 1.1'
|
35
|
-
dependency 'sorted_set', '~> 1.0'
|
36
35
|
dependency 'mime-types', '~> 3.0'
|
37
36
|
dependency 'reverse_markdown', '~> 2.0'
|
38
37
|
dependency 'complex_config', '~> 0.22'
|
@@ -42,6 +41,7 @@ GemHadar do
|
|
42
41
|
dependency 'logger', '~> 1.0'
|
43
42
|
dependency 'json', '~> 2.0'
|
44
43
|
dependency 'xdg', '~> 7.0'
|
44
|
+
dependency 'tins', '~> 1.34'
|
45
45
|
development_dependency 'all_images', '~> 0.4'
|
46
46
|
development_dependency 'rspec', '~> 3.2'
|
47
47
|
development_dependency 'webmock'
|
data/bin/ollama_chat
CHANGED
@@ -4,9 +4,6 @@ require 'ollama'
|
|
4
4
|
include Ollama
|
5
5
|
require 'term/ansicolor'
|
6
6
|
include Term::ANSIColor
|
7
|
-
require 'tins'
|
8
|
-
require 'tins/xt/full'
|
9
|
-
require 'tins/xt/hash_union'
|
10
7
|
include Tins::GO
|
11
8
|
require 'reline'
|
12
9
|
require 'reverse_markdown'
|
@@ -31,6 +28,11 @@ class OllamaChatConfig
|
|
31
28
|
name: <%= ENV.fetch('OLLAMA_CHAT_MODEL', 'llama3.1') %>
|
32
29
|
options:
|
33
30
|
num_ctx: 8192
|
31
|
+
location:
|
32
|
+
enabled: false
|
33
|
+
name: Berlin
|
34
|
+
decimal_degrees: [ 52.514127, 13.475211 ]
|
35
|
+
units: SI (International System of Units) # or USCS (United States Customary System)
|
34
36
|
prompts:
|
35
37
|
embed: "This source was now embedded: %{source}"
|
36
38
|
summarize: |
|
@@ -83,7 +85,7 @@ class OllamaChatConfig
|
|
83
85
|
if @filename == default_path && !retried
|
84
86
|
retried = true
|
85
87
|
mkdir_p File.dirname(default_path)
|
86
|
-
File.secure_write(default_path
|
88
|
+
File.secure_write(default_path, DEFAULT_CONFIG)
|
87
89
|
retry
|
88
90
|
else
|
89
91
|
raise
|
@@ -178,7 +180,7 @@ end
|
|
178
180
|
|
179
181
|
class Switch
|
180
182
|
def initialize(name, msg:, config: $config)
|
181
|
-
@value = !!config.send("#{name}?")
|
183
|
+
@value = [ false, true ].include?(config) ? config : !!config.send("#{name}?")
|
182
184
|
@msg = msg
|
183
185
|
end
|
184
186
|
|
@@ -259,9 +261,21 @@ def setup_switches
|
|
259
261
|
false => "Embedding is currently not performed.",
|
260
262
|
}
|
261
263
|
)
|
264
|
+
|
265
|
+
$location = Switch.new(
|
266
|
+
:location,
|
267
|
+
msg: {
|
268
|
+
true => "Location and localtime enabled.",
|
269
|
+
false => "Location and localtime disabled.",
|
270
|
+
},
|
271
|
+
config: $config.location.enabled
|
272
|
+
)
|
262
273
|
end
|
263
274
|
|
264
275
|
def search_web(query, n = nil)
|
276
|
+
if l = at_location
|
277
|
+
query += " #{at_location}"
|
278
|
+
end
|
265
279
|
n = n.to_i
|
266
280
|
n < 1 and n = 1
|
267
281
|
query = URI.encode_uri_component(query)
|
@@ -401,6 +415,32 @@ def parse_atom(source_io)
|
|
401
415
|
end
|
402
416
|
end
|
403
417
|
|
418
|
+
def pdf_read(io)
|
419
|
+
reader = PDF::Reader.new(io)
|
420
|
+
reader.pages.inject(+'') { |result, page| result << page.text }
|
421
|
+
end
|
422
|
+
|
423
|
+
def ps_read(io)
|
424
|
+
gs = `which gs`.chomp
|
425
|
+
if gs.present?
|
426
|
+
Tempfile.create do |tmp|
|
427
|
+
IO.popen("#{gs} -q -sDEVICE=pdfwrite -sOutputFile=#{tmp.path} -", 'wb') do |gs_io|
|
428
|
+
until io.eof?
|
429
|
+
buffer = io.read(1 << 17)
|
430
|
+
IO.select(nil, [ gs_io ], nil)
|
431
|
+
gs_io.write buffer
|
432
|
+
end
|
433
|
+
gs_io.close
|
434
|
+
File.open(tmp.path, 'rb') do |pdf|
|
435
|
+
pdf_read(pdf)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
else
|
440
|
+
STDERR.puts "Cannot convert #{io&.content_type} whith ghostscript, gs not in path."
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
404
444
|
def parse_source(source_io)
|
405
445
|
case source_io&.content_type
|
406
446
|
when 'text/html'
|
@@ -426,12 +466,11 @@ def parse_source(source_io)
|
|
426
466
|
parse_rss(source_io)
|
427
467
|
when 'application/atom+xml'
|
428
468
|
parse_atom(source_io)
|
429
|
-
when 'application/
|
430
|
-
source_io
|
469
|
+
when 'application/postscript'
|
470
|
+
ps_read(source_io)
|
431
471
|
when 'application/pdf'
|
432
|
-
|
433
|
-
|
434
|
-
when %r(\Atext/), nil
|
472
|
+
pdf_read(source_io)
|
473
|
+
when %r(\Aapplication/(json|ld\+json|x-ruby|x-perl|x-gawk|x-python|x-javascript|x-c?sh|x-dosexec|x-shellscript|x-tex|x-latex|x-lyx|x-bibtex)), %r(\Atext/), nil
|
435
474
|
source_io.read
|
436
475
|
else
|
437
476
|
STDERR.puts "Cannot embed #{source_io&.content_type} document."
|
@@ -478,7 +517,7 @@ def embed_source(source_io, source)
|
|
478
517
|
length: 10
|
479
518
|
)
|
480
519
|
end
|
481
|
-
$documents.add(inputs, source:
|
520
|
+
$documents.add(inputs, source:)
|
482
521
|
end
|
483
522
|
|
484
523
|
def add_image(images, source_io, source)
|
@@ -576,7 +615,7 @@ def parse_content(content, images)
|
|
576
615
|
content.scan(%r([.~]?/\S+|https?://\S+|#\S+)).each do |source|
|
577
616
|
case source
|
578
617
|
when /\A#(\S+)/
|
579
|
-
tags
|
618
|
+
tags.add($1, source:)
|
580
619
|
else
|
581
620
|
source = source.sub(/(["')]|\*+)\z/, '')
|
582
621
|
fetch_source(source) do |source_io|
|
@@ -598,29 +637,37 @@ def parse_content(content, images)
|
|
598
637
|
return content, (tags unless tags.empty?)
|
599
638
|
end
|
600
639
|
|
601
|
-
def choose_model(cli_model,
|
640
|
+
def choose_model(cli_model, current_model)
|
602
641
|
models = ollama.tags.models.map(&:name).sort
|
603
642
|
model = if cli_model == ''
|
604
|
-
Ollama::Utils::Chooser.choose(models) ||
|
643
|
+
Ollama::Utils::Chooser.choose(models) || current_model
|
605
644
|
else
|
606
|
-
cli_model ||
|
645
|
+
cli_model || current_model
|
607
646
|
end
|
608
647
|
ensure
|
609
648
|
puts green { "Connecting to #{model}@#{ollama.base_url} now…" }
|
610
649
|
end
|
611
650
|
|
612
|
-
def
|
613
|
-
|
651
|
+
def ask?(prompt:)
|
652
|
+
print prompt
|
653
|
+
STDIN.gets.chomp
|
654
|
+
end
|
655
|
+
|
656
|
+
def choose_collection(current_collection)
|
657
|
+
collections = [ current_collection ] + $documents.collections
|
614
658
|
collections = collections.compact.map(&:to_s).uniq.sort
|
615
|
-
collections.unshift('[NEW]')
|
616
|
-
collection = Ollama::Utils::Chooser.choose(collections) ||
|
617
|
-
|
618
|
-
|
619
|
-
|
659
|
+
collections.unshift('[EXIT]').unshift('[NEW]')
|
660
|
+
collection = Ollama::Utils::Chooser.choose(collections) || current_collection
|
661
|
+
case collection
|
662
|
+
when '[NEW]'
|
663
|
+
$documents.collection = ask?(prompt: "Enter name of the new collection: ")
|
664
|
+
when nil, '[EXIT]'
|
665
|
+
puts "Exiting chooser."
|
666
|
+
when /./
|
667
|
+
$documents.collection = collection
|
620
668
|
end
|
621
|
-
$documents.collection = collection
|
622
669
|
ensure
|
623
|
-
puts "
|
670
|
+
puts "Using collection #{bold{$documents.collection}}."
|
624
671
|
collection_stats
|
625
672
|
end
|
626
673
|
|
@@ -652,13 +699,25 @@ def show_system_prompt
|
|
652
699
|
EOT
|
653
700
|
end
|
654
701
|
|
702
|
+
def at_location
|
703
|
+
if $location.on?
|
704
|
+
location_name = $config.location.name
|
705
|
+
location_decimal_degrees = $config.location.decimal_degrees * ', '
|
706
|
+
localtime = Time.now.iso8601
|
707
|
+
units = $config.location.units
|
708
|
+
$config.prompts.location % {
|
709
|
+
location_name:, location_decimal_degrees:, localtime:, units:,
|
710
|
+
}
|
711
|
+
end.to_s
|
712
|
+
end
|
713
|
+
|
655
714
|
def set_system_prompt(messages, system)
|
656
715
|
$system = system
|
657
716
|
messages.clear
|
658
717
|
messages << Message.new(role: 'system', content: system)
|
659
718
|
end
|
660
719
|
|
661
|
-
def change_system_prompt(messages)
|
720
|
+
def change_system_prompt(messages, default)
|
662
721
|
prompts = $config.system_prompts.attribute_names.compact
|
663
722
|
chosen = Ollama::Utils::Chooser.choose(prompts)
|
664
723
|
system = if chosen
|
@@ -684,6 +743,7 @@ def info
|
|
684
743
|
puts "Documents database cache is #{$documents.nil? ? 'n/a' : bold{$documents.cache.class}}"
|
685
744
|
$markdown.show
|
686
745
|
$stream.show
|
746
|
+
$location.show
|
687
747
|
if $voice.on?
|
688
748
|
puts "Using voice #{bold{$current_voice}} to speak."
|
689
749
|
end
|
@@ -716,6 +776,7 @@ def display_chat_help
|
|
716
776
|
/paste to paste content
|
717
777
|
/markdown toggle markdown output
|
718
778
|
/stream toggle stream output
|
779
|
+
/location toggle location submission
|
719
780
|
/voice( change) toggle voice output or change the voice
|
720
781
|
/list [n] list the last n / all conversation exchanges
|
721
782
|
/clear clear the whole conversation
|
@@ -724,7 +785,8 @@ def display_chat_help
|
|
724
785
|
/model change the model
|
725
786
|
/system change system prompt (clears conversation)
|
726
787
|
/regenerate the last answer message
|
727
|
-
/collection clear
|
788
|
+
/collection( clear|change) change (default) collection or clear
|
789
|
+
/info show information for current session
|
728
790
|
/import source import the source's content
|
729
791
|
/summarize [n] source summarize the source's content in n words
|
730
792
|
/embedding toggle embedding paused or not
|
@@ -739,7 +801,7 @@ end
|
|
739
801
|
|
740
802
|
def usage
|
741
803
|
puts <<~EOT
|
742
|
-
#{File.basename($0)} [OPTIONS]
|
804
|
+
Usage: #{File.basename($0)} [OPTIONS]
|
743
805
|
|
744
806
|
-f CONFIG config file to read
|
745
807
|
-u URL the ollama base url, OLLAMA_URL
|
@@ -790,7 +852,7 @@ if $opts[?c]
|
|
790
852
|
else
|
791
853
|
default = $config.system_prompts.default? || model_system
|
792
854
|
if $opts[?s] == ??
|
793
|
-
change_system_prompt(messages)
|
855
|
+
change_system_prompt(messages, default)
|
794
856
|
else
|
795
857
|
system = Ollama::Utils::FileArgument.get_file_argument($opts[?s], default:)
|
796
858
|
system.present? and set_system_prompt(messages, system)
|
@@ -860,18 +922,21 @@ loop do
|
|
860
922
|
content = Reline.readline(input_prompt, true)&.chomp
|
861
923
|
|
862
924
|
case content
|
863
|
-
when %r(^/paste$)
|
864
|
-
puts bold { "Paste your content and then press C-d!" }
|
865
|
-
content = STDIN.read
|
866
925
|
when %r(^/copy$)
|
867
926
|
copy_to_clipboard(messages)
|
868
927
|
next
|
928
|
+
when %r(^/paste$)
|
929
|
+
puts bold { "Paste your content and then press C-d!" }
|
930
|
+
content = STDIN.read
|
869
931
|
when %r(^/markdown$)
|
870
932
|
$markdown.toggle
|
871
933
|
next
|
872
934
|
when %r(^/stream$)
|
873
935
|
$stream.toggle
|
874
936
|
next
|
937
|
+
when %r(^/location$)
|
938
|
+
$location.toggle
|
939
|
+
next
|
875
940
|
when %r(^/voice(?:\s+(change))?$)
|
876
941
|
if $1 == 'change'
|
877
942
|
change_voice
|
@@ -890,33 +955,14 @@ loop do
|
|
890
955
|
puts "Cleared messages."
|
891
956
|
next
|
892
957
|
when %r(^/clobber$)
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
case command
|
900
|
-
when 'clear'
|
901
|
-
tags = arg.present? ? arg.sub(/\A#*/, '') : nil
|
902
|
-
if tags
|
903
|
-
$documents.clear(tags:)
|
904
|
-
puts "Cleared tag ##{tags} from collection #{bold{collection}}."
|
905
|
-
else
|
906
|
-
$documents.clear
|
907
|
-
puts "Cleared collection #{bold{collection}}."
|
908
|
-
end
|
909
|
-
when 'change'
|
910
|
-
choose_collection(collection)
|
958
|
+
if ask?(prompt: 'Are you sure? (y/n) ') =~ /\Ay/i
|
959
|
+
clear_messages(messages)
|
960
|
+
$documents.clear
|
961
|
+
puts "Cleared messages and collection #{bold{$documents.collection}}."
|
962
|
+
else
|
963
|
+
puts 'Cancelled.'
|
911
964
|
end
|
912
965
|
next
|
913
|
-
when %r(^/system$)
|
914
|
-
change_system_prompt(messages)
|
915
|
-
info
|
916
|
-
next
|
917
|
-
when %r(/info)
|
918
|
-
info
|
919
|
-
next
|
920
966
|
when %r(^/pop(?:\s+(\d*))?$)
|
921
967
|
if messages.size > 1
|
922
968
|
n = $1.to_i.clamp(1, Float::INFINITY)
|
@@ -931,6 +977,10 @@ loop do
|
|
931
977
|
when %r(^/model$)
|
932
978
|
$model = choose_model('', $model)
|
933
979
|
next
|
980
|
+
when %r(^/system$)
|
981
|
+
change_system_prompt(messages, $system)
|
982
|
+
info
|
983
|
+
next
|
934
984
|
when %r(^/regenerate$)
|
935
985
|
if content = messages[-2]&.content
|
936
986
|
content.gsub!(/\nConsider these chunks for your answer.*\z/, '')
|
@@ -941,6 +991,38 @@ loop do
|
|
941
991
|
end
|
942
992
|
parse_content = false
|
943
993
|
content
|
994
|
+
when %r(^/collection(?:\s+(clear|change))?$)
|
995
|
+
case $1 || 'change'
|
996
|
+
when 'clear'
|
997
|
+
loop do
|
998
|
+
tags = $documents.tags.add('[EXIT]').add('[ALL]')
|
999
|
+
tag = Ollama::Utils::Chooser.choose(tags, prompt: 'Clear? %s')
|
1000
|
+
case tag
|
1001
|
+
when nil, '[EXIT]'
|
1002
|
+
puts "Exiting chooser."
|
1003
|
+
break
|
1004
|
+
when '[ALL]'
|
1005
|
+
if ask?(prompt: 'Are you sure? (y/n) ') =~ /\Ay/i
|
1006
|
+
$documents.clear
|
1007
|
+
puts "Cleared collection #{bold{$documents.collection}}."
|
1008
|
+
break
|
1009
|
+
else
|
1010
|
+
puts 'Cancelled.'
|
1011
|
+
sleep 3
|
1012
|
+
end
|
1013
|
+
when /./
|
1014
|
+
$documents.clear(tags: [ tag ])
|
1015
|
+
puts "Cleared tag #{tag} from collection #{bold{$documents.collection}}."
|
1016
|
+
sleep 3
|
1017
|
+
end
|
1018
|
+
end
|
1019
|
+
when 'change'
|
1020
|
+
choose_collection($documents.collection)
|
1021
|
+
end
|
1022
|
+
next
|
1023
|
+
when %r(/info)
|
1024
|
+
info
|
1025
|
+
next
|
944
1026
|
when %r(^/import\s+(.+))
|
945
1027
|
parse_content = false
|
946
1028
|
content = import($1) or next
|
@@ -1007,6 +1089,10 @@ loop do
|
|
1007
1089
|
end
|
1008
1090
|
end
|
1009
1091
|
|
1092
|
+
if location = at_location.full?
|
1093
|
+
content += " [#{location} – do not comment on this information, just consider it for eventual queries]"
|
1094
|
+
end
|
1095
|
+
|
1010
1096
|
messages << Message.new(role: 'user', content:, images: images.dup)
|
1011
1097
|
images.clear
|
1012
1098
|
handler = FollowChat.new(messages:, markdown: $markdown.on?, voice: ($current_voice if $voice.on?))
|
data/bin/ollama_cli
CHANGED
@@ -8,8 +8,8 @@ include Tins::GO
|
|
8
8
|
require 'json'
|
9
9
|
|
10
10
|
def usage
|
11
|
-
puts <<~
|
12
|
-
#{File.basename($0)} [OPTIONS]
|
11
|
+
puts <<~EOT
|
12
|
+
Usage: #{File.basename($0)} [OPTIONS]
|
13
13
|
|
14
14
|
-u URL the ollama base url, OLLAMA_URL
|
15
15
|
-m MODEL the ollama model to chat with, OLLAMA_MODEL
|
@@ -22,7 +22,7 @@ def usage
|
|
22
22
|
-S use streaming for generation
|
23
23
|
-h this help
|
24
24
|
|
25
|
-
|
25
|
+
EOT
|
26
26
|
exit 0
|
27
27
|
end
|
28
28
|
|
data/bin/ollama_update
CHANGED
@@ -14,4 +14,6 @@ ollama.tags.models.each do |model|
|
|
14
14
|
"Updating model #{bold {name}} (last modified at #{modified_at.iso8601}):"
|
15
15
|
)
|
16
16
|
ollama.pull(name:)
|
17
|
+
rescue Ollama::Errors::Error => e
|
18
|
+
infobar.puts "Caught #{e.class} for model #{bold { model.name }}: #{e} => Continuing."
|
17
19
|
end
|
data/lib/ollama/client.rb
CHANGED
@@ -23,7 +23,17 @@ class Ollama::Documents::RedisCache
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def []=(key, value)
|
26
|
-
|
26
|
+
set(key, value)
|
27
|
+
end
|
28
|
+
|
29
|
+
def set(key, value, ex: nil)
|
30
|
+
ex ||= @ex
|
31
|
+
if !ex.nil? && ex < 1
|
32
|
+
redis.del(pre(key))
|
33
|
+
else
|
34
|
+
redis.set(pre(key), JSON.generate(value), ex:)
|
35
|
+
end
|
36
|
+
value
|
27
37
|
end
|
28
38
|
|
29
39
|
def ttl(key)
|
data/lib/ollama/documents.rb
CHANGED
@@ -25,7 +25,7 @@ class Ollama::Documents
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def tags_set
|
28
|
-
Ollama::Utils::Tags.new(tags)
|
28
|
+
Ollama::Utils::Tags.new(tags, source:)
|
29
29
|
end
|
30
30
|
|
31
31
|
def ==(other)
|
@@ -57,8 +57,10 @@ class Ollama::Documents
|
|
57
57
|
|
58
58
|
def add(inputs, batch_size: 10, source: nil, tags: [])
|
59
59
|
inputs = Array(inputs)
|
60
|
-
tags
|
61
|
-
|
60
|
+
tags = Ollama::Utils::Tags.new(tags, source:)
|
61
|
+
if source
|
62
|
+
tags.add(File.basename(source).gsub(/\?.*/, ''), source:)
|
63
|
+
end
|
62
64
|
inputs.map! { |i|
|
63
65
|
text = i.respond_to?(:read) ? i.read : i.to_s
|
64
66
|
text
|
@@ -70,7 +72,7 @@ class Ollama::Documents
|
|
70
72
|
end
|
71
73
|
batches = inputs.each_slice(batch_size).
|
72
74
|
with_infobar(
|
73
|
-
label: "Add #{truncate(tags.to_s, percentage: 25)}",
|
75
|
+
label: "Add #{truncate(tags.to_s(link: false), percentage: 25)}",
|
74
76
|
total: inputs.size
|
75
77
|
)
|
76
78
|
batches.each do |batch|
|
@@ -159,7 +161,11 @@ class Ollama::Documents
|
|
159
161
|
end
|
160
162
|
|
161
163
|
def tags
|
162
|
-
@cache.
|
164
|
+
@cache.each_with_object(Ollama::Utils::Tags.new) do |(_, record), t|
|
165
|
+
record.tags.each do |tag|
|
166
|
+
t.add(tag, source: record.source)
|
167
|
+
end
|
168
|
+
end
|
163
169
|
end
|
164
170
|
|
165
171
|
private
|
data/lib/ollama/image.rb
CHANGED
@@ -7,6 +7,8 @@ class Ollama::Image
|
|
7
7
|
|
8
8
|
attr_accessor :path
|
9
9
|
|
10
|
+
attr_reader :data
|
11
|
+
|
10
12
|
class << self
|
11
13
|
def for_base64(data, path: nil)
|
12
14
|
obj = new(data)
|
@@ -31,7 +33,7 @@ class Ollama::Image
|
|
31
33
|
end
|
32
34
|
|
33
35
|
def ==(other)
|
34
|
-
@data == other
|
36
|
+
@data == other.data
|
35
37
|
end
|
36
38
|
|
37
39
|
def to_s
|
@@ -13,7 +13,7 @@ class Ollama::Utils::CacheFetcher
|
|
13
13
|
if body && content_type
|
14
14
|
io = StringIO.new(body)
|
15
15
|
io.rewind
|
16
|
-
io.extend(Ollama::Utils::Fetcher::
|
16
|
+
io.extend(Ollama::Utils::Fetcher::HeaderExtension)
|
17
17
|
io.content_type = content_type
|
18
18
|
block.(io)
|
19
19
|
end
|
@@ -25,8 +25,8 @@ class Ollama::Utils::CacheFetcher
|
|
25
25
|
body.empty? and return
|
26
26
|
content_type = io.content_type
|
27
27
|
content_type.nil? and return
|
28
|
-
@cache
|
29
|
-
@cache
|
28
|
+
@cache.set(key(:body, url), body, ex: io.ex)
|
29
|
+
@cache.set(key(:content_type, url), content_type.to_s, ex: io.ex)
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
data/lib/ollama/utils/chooser.rb
CHANGED
@@ -8,8 +8,9 @@ module Ollama::Utils::Chooser
|
|
8
8
|
|
9
9
|
module_function
|
10
10
|
|
11
|
-
def choose(entries)
|
11
|
+
def choose(entries, prompt: 'Search? %s')
|
12
12
|
entry = Search.new(
|
13
|
+
prompt:,
|
13
14
|
match: -> answer {
|
14
15
|
matcher = Amatch::PairDistance.new(answer.downcase)
|
15
16
|
matches = entries.map { |n| [ n, -matcher.similar(n.to_s.downcase) ] }.
|
@@ -19,7 +20,7 @@ module Ollama::Utils::Chooser
|
|
19
20
|
},
|
20
21
|
query: -> _answer, matches, selector {
|
21
22
|
matches.each_with_index.map { |m, i|
|
22
|
-
i == selector ? "#{blue{?⮕}} #{on_blue{m}}" : " #{m}"
|
23
|
+
i == selector ? "#{blue{?⮕}} #{on_blue{m}}" : " #{m.to_s}"
|
23
24
|
} * ?\n
|
24
25
|
},
|
25
26
|
found: -> _answer, matches, selector {
|
@@ -27,6 +28,11 @@ module Ollama::Utils::Chooser
|
|
27
28
|
},
|
28
29
|
output: STDOUT
|
29
30
|
).start
|
30
|
-
|
31
|
+
if entry
|
32
|
+
entry
|
33
|
+
else
|
34
|
+
print clear_screen, move_home
|
35
|
+
nil
|
36
|
+
end
|
31
37
|
end
|
32
38
|
end
|
data/lib/ollama/utils/fetcher.rb
CHANGED
@@ -6,9 +6,11 @@ require 'stringio'
|
|
6
6
|
require 'ollama/utils/cache_fetcher'
|
7
7
|
|
8
8
|
class Ollama::Utils::Fetcher
|
9
|
-
module
|
9
|
+
module HeaderExtension
|
10
10
|
attr_accessor :content_type
|
11
11
|
|
12
|
+
attr_accessor :ex
|
13
|
+
|
12
14
|
def self.failed
|
13
15
|
object = StringIO.new.extend(self)
|
14
16
|
object.content_type = MIME::Types['text/plain'].first
|
@@ -22,7 +24,7 @@ class Ollama::Utils::Fetcher
|
|
22
24
|
cache = options.delete(:cache) and
|
23
25
|
cache = Ollama::Utils::CacheFetcher.new(cache)
|
24
26
|
if result = cache&.get(url, &block)
|
25
|
-
infobar.puts "Getting #{url.inspect} from cache."
|
27
|
+
infobar.puts "Getting #{url.to_s.inspect} from cache."
|
26
28
|
return result
|
27
29
|
else
|
28
30
|
new(**options).send(:get, url) do |tmp|
|
@@ -39,7 +41,7 @@ class Ollama::Utils::Fetcher
|
|
39
41
|
def self.read(filename, &block)
|
40
42
|
if File.exist?(filename)
|
41
43
|
File.open(filename) do |file|
|
42
|
-
file.extend(Ollama::Utils::Fetcher::
|
44
|
+
file.extend(Ollama::Utils::Fetcher::HeaderExtension)
|
43
45
|
file.content_type = MIME::Types.type_for(filename).first
|
44
46
|
block.(file)
|
45
47
|
end
|
@@ -50,10 +52,10 @@ class Ollama::Utils::Fetcher
|
|
50
52
|
Tempfile.open do |tmp|
|
51
53
|
IO.popen(command) do |command|
|
52
54
|
until command.eof?
|
53
|
-
tmp.write command.read(
|
55
|
+
tmp.write command.read(1 << 14)
|
54
56
|
end
|
55
57
|
tmp.rewind
|
56
|
-
tmp.extend(Ollama::Utils::Fetcher::
|
58
|
+
tmp.extend(Ollama::Utils::Fetcher::HeaderExtension)
|
57
59
|
tmp.content_type = MIME::Types['text/plain'].first
|
58
60
|
block.(tmp)
|
59
61
|
end
|
@@ -63,7 +65,7 @@ class Ollama::Utils::Fetcher
|
|
63
65
|
if @debug && !e.is_a?(RuntimeError)
|
64
66
|
STDERR.puts "#{e.backtrace * ?\n}"
|
65
67
|
end
|
66
|
-
yield
|
68
|
+
yield HeaderExtension.failed
|
67
69
|
end
|
68
70
|
|
69
71
|
def initialize(debug: false, http_options: {})
|
@@ -110,7 +112,7 @@ class Ollama::Utils::Fetcher
|
|
110
112
|
if @debug && !e.is_a?(RuntimeError)
|
111
113
|
STDERR.puts "#{e.backtrace * ?\n}"
|
112
114
|
end
|
113
|
-
yield
|
115
|
+
yield HeaderExtension.failed
|
114
116
|
end
|
115
117
|
|
116
118
|
def headers
|
@@ -123,12 +125,20 @@ class Ollama::Utils::Fetcher
|
|
123
125
|
(Excon.defaults[:middlewares] + [ Excon::Middleware::RedirectFollower ]).uniq
|
124
126
|
end
|
125
127
|
|
128
|
+
private
|
129
|
+
|
126
130
|
def decorate_io(tmp, response)
|
127
131
|
tmp.rewind
|
128
|
-
tmp.extend(
|
132
|
+
tmp.extend(HeaderExtension)
|
129
133
|
if content_type = MIME::Types[response.headers['content-type']].first
|
130
134
|
tmp.content_type = content_type
|
131
135
|
end
|
136
|
+
if cache_control = response.headers['cache-control'] and
|
137
|
+
cache_control !~ /no-store|no-cache/ and
|
138
|
+
ex = cache_control[/s-maxage\s*=\s*(\d+)/, 1] || cache_control[/max-age\s*=\s*(\d+)/, 1]
|
139
|
+
then
|
140
|
+
tmp.ex = ex.to_i
|
141
|
+
end
|
132
142
|
end
|
133
143
|
|
134
144
|
def callback(tmp)
|
data/lib/ollama/utils/tags.rb
CHANGED
@@ -1,12 +1,66 @@
|
|
1
|
-
|
1
|
+
class Ollama::Utils::Tags
|
2
|
+
class Tag < String
|
3
|
+
include Term::ANSIColor
|
2
4
|
|
5
|
+
def initialize(tag, source: nil)
|
6
|
+
super(tag.to_s)
|
7
|
+
self.source = source
|
8
|
+
end
|
3
9
|
|
4
|
-
|
5
|
-
|
6
|
-
|
10
|
+
attr_accessor :source
|
11
|
+
|
12
|
+
alias_method :internal, :to_s
|
13
|
+
|
14
|
+
def to_s(link: true)
|
15
|
+
tag_string = start_with?(?#) ? super() : ?# + super()
|
16
|
+
my_source = source
|
17
|
+
if link && my_source
|
18
|
+
unless my_source =~ %r(\A(https?|file)://)
|
19
|
+
my_source = 'file://%s' % File.expand_path(my_source)
|
20
|
+
end
|
21
|
+
hyperlink(my_source) { tag_string }
|
22
|
+
else
|
23
|
+
tag_string
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(tags = [], source: nil)
|
29
|
+
@set = []
|
30
|
+
tags.each { |tag| add(tag, source:) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def add(tag, source: nil)
|
34
|
+
unless tag.is_a?(Tag)
|
35
|
+
tag = Tag.new(tag, source:)
|
36
|
+
end
|
37
|
+
index = @set.bsearch_index { _1 >= tag }
|
38
|
+
if index == nil
|
39
|
+
@set.push(tag)
|
40
|
+
elsif @set.at(index) != tag
|
41
|
+
@set.insert(index, tag)
|
42
|
+
end
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def empty?
|
47
|
+
@set.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def size
|
51
|
+
@set.size
|
52
|
+
end
|
53
|
+
|
54
|
+
def clear
|
55
|
+
@set.clear
|
56
|
+
end
|
57
|
+
|
58
|
+
def each(&block)
|
59
|
+
@set.each(&block)
|
7
60
|
end
|
61
|
+
include Enumerable
|
8
62
|
|
9
|
-
def to_s
|
10
|
-
map { |
|
63
|
+
def to_s(link: true)
|
64
|
+
@set.map { |tag| tag.to_s(link:) } * ' '
|
11
65
|
end
|
12
66
|
end
|
data/lib/ollama/utils/width.rb
CHANGED
@@ -2,6 +2,7 @@ require 'tins/terminal'
|
|
2
2
|
|
3
3
|
module Ollama::Utils::Width
|
4
4
|
include Term::ANSIColor
|
5
|
+
extend Term::ANSIColor
|
5
6
|
|
6
7
|
module_function
|
7
8
|
|
@@ -26,10 +27,11 @@ module Ollama::Utils::Width
|
|
26
27
|
percentage.nil? ^ length.nil? or
|
27
28
|
raise ArgumentError, "either pass percentage or length argument"
|
28
29
|
percentage and length ||= width(percentage:)
|
29
|
-
|
30
|
+
ellipsis_length = ellipsis.size
|
31
|
+
if length < ellipsis_length
|
30
32
|
+''
|
31
|
-
elsif text.size
|
32
|
-
text[0, length -
|
33
|
+
elsif text.size >= length + ellipsis_length
|
34
|
+
text[0, length - ellipsis_length] + ellipsis
|
33
35
|
else
|
34
36
|
text
|
35
37
|
end
|
data/lib/ollama/version.rb
CHANGED
data/lib/ollama.rb
CHANGED
data/ollama-ruby.gemspec
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: ollama-ruby 0.
|
2
|
+
# stub: ollama-ruby 0.7.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "ollama-ruby".freeze
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.7.0".freeze
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
11
|
-
s.date = "2024-
|
11
|
+
s.date = "2024-10-02"
|
12
12
|
s.description = "Library that allows interacting with the Ollama API".freeze
|
13
13
|
s.email = "flori@ping.de".freeze
|
14
14
|
s.executables = ["ollama_console".freeze, "ollama_chat".freeze, "ollama_update".freeze, "ollama_cli".freeze]
|
15
15
|
s.extra_rdoc_files = ["README.md".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/ansi_markdown.rb".freeze, "lib/ollama/utils/cache_fetcher.rb".freeze, "lib/ollama/utils/chooser.rb".freeze, "lib/ollama/utils/colorize_texts.rb".freeze, "lib/ollama/utils/fetcher.rb".freeze, "lib/ollama/utils/file_argument.rb".freeze, "lib/ollama/utils/math.rb".freeze, "lib/ollama/utils/tags.rb".freeze, "lib/ollama/utils/width.rb".freeze, "lib/ollama/version.rb".freeze]
|
16
|
-
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ollama_chat".freeze, "bin/ollama_cli".freeze, "bin/ollama_console".freeze, "bin/ollama_update".freeze, "config/redis.conf".freeze, "docker-compose.yml".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/ansi_markdown.rb".freeze, "lib/ollama/utils/cache_fetcher.rb".freeze, "lib/ollama/utils/chooser.rb".freeze, "lib/ollama/utils/colorize_texts.rb".freeze, "lib/ollama/utils/fetcher.rb".freeze, "lib/ollama/utils/file_argument.rb".freeze, "lib/ollama/utils/math.rb".freeze, "lib/ollama/utils/tags.rb".freeze, "lib/ollama/utils/width.rb".freeze, "lib/ollama/version.rb".freeze, "ollama-ruby.gemspec".freeze, "spec/assets/embeddings.json".freeze, "spec/assets/kitten.jpg".freeze, "spec/assets/prompt.txt".freeze, "spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/ansi_markdown_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tmp/.keep".freeze]
|
16
|
+
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ollama_chat".freeze, "bin/ollama_cli".freeze, "bin/ollama_console".freeze, "bin/ollama_update".freeze, "config/redis.conf".freeze, "docker-compose.yml".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/ansi_markdown.rb".freeze, "lib/ollama/utils/cache_fetcher.rb".freeze, "lib/ollama/utils/chooser.rb".freeze, "lib/ollama/utils/colorize_texts.rb".freeze, "lib/ollama/utils/fetcher.rb".freeze, "lib/ollama/utils/file_argument.rb".freeze, "lib/ollama/utils/math.rb".freeze, "lib/ollama/utils/tags.rb".freeze, "lib/ollama/utils/width.rb".freeze, "lib/ollama/version.rb".freeze, "ollama-ruby.gemspec".freeze, "spec/assets/embeddings.json".freeze, "spec/assets/kitten.jpg".freeze, "spec/assets/prompt.txt".freeze, "spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/ansi_markdown_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/ollama/utils/width_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tmp/.keep".freeze]
|
17
17
|
s.homepage = "https://github.com/flori/ollama-ruby".freeze
|
18
18
|
s.licenses = ["MIT".freeze]
|
19
19
|
s.rdoc_options = ["--title".freeze, "Ollama-ruby - Interacting with the Ollama API".freeze, "--main".freeze, "README.md".freeze]
|
20
20
|
s.required_ruby_version = Gem::Requirement.new("~> 3.1".freeze)
|
21
21
|
s.rubygems_version = "3.5.18".freeze
|
22
22
|
s.summary = "Interacting with the Ollama API".freeze
|
23
|
-
s.test_files = ["spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/ansi_markdown_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
23
|
+
s.test_files = ["spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/ansi_markdown_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/ollama/utils/width_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
24
24
|
|
25
25
|
s.specification_version = 4
|
26
26
|
|
@@ -38,7 +38,6 @@ Gem::Specification.new do |s|
|
|
38
38
|
s.add_runtime_dependency(%q<redis>.freeze, ["~> 5.0".freeze])
|
39
39
|
s.add_runtime_dependency(%q<numo-narray>.freeze, ["~> 0.9".freeze])
|
40
40
|
s.add_runtime_dependency(%q<more_math>.freeze, ["~> 1.1".freeze])
|
41
|
-
s.add_runtime_dependency(%q<sorted_set>.freeze, ["~> 1.0".freeze])
|
42
41
|
s.add_runtime_dependency(%q<mime-types>.freeze, ["~> 3.0".freeze])
|
43
42
|
s.add_runtime_dependency(%q<reverse_markdown>.freeze, ["~> 2.0".freeze])
|
44
43
|
s.add_runtime_dependency(%q<complex_config>.freeze, ["~> 0.22".freeze])
|
@@ -48,4 +47,5 @@ Gem::Specification.new do |s|
|
|
48
47
|
s.add_runtime_dependency(%q<logger>.freeze, ["~> 1.0".freeze])
|
49
48
|
s.add_runtime_dependency(%q<json>.freeze, ["~> 2.0".freeze])
|
50
49
|
s.add_runtime_dependency(%q<xdg>.freeze, ["~> 7.0".freeze])
|
50
|
+
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.34".freeze])
|
51
51
|
end
|
data/spec/ollama/image_spec.rb
CHANGED
@@ -9,6 +9,11 @@ RSpec.describe Ollama::Image do
|
|
9
9
|
expect(image).to be_a described_class
|
10
10
|
end
|
11
11
|
|
12
|
+
it 'can be equal or not' do
|
13
|
+
expect(image).not_to eq described_class.for_string('')
|
14
|
+
expect(image).to eq described_class.for_filename(asset('kitten.jpg'))
|
15
|
+
end
|
16
|
+
|
12
17
|
it 'cannot be created via .new' do
|
13
18
|
expect {
|
14
19
|
described_class.new('nix')
|
@@ -33,10 +33,11 @@ RSpec.describe Ollama::Utils::CacheFetcher do
|
|
33
33
|
|
34
34
|
it 'has #put' do
|
35
35
|
io = StringIO.new('world')
|
36
|
-
io.extend(Ollama::Utils::Fetcher::
|
36
|
+
io.extend(Ollama::Utils::Fetcher::HeaderExtension)
|
37
37
|
io.content_type = MIME::Types['text/plain'].first
|
38
|
-
|
39
|
-
expect(cache).to receive(:
|
38
|
+
io.ex = 666
|
39
|
+
expect(cache).to receive(:set).with('body-69ce405ab83f42dffa9fd22bbd47783f', 'world', ex: 666)
|
40
|
+
expect(cache).to receive(:set).with('content_type-69ce405ab83f42dffa9fd22bbd47783f', 'text/plain', ex: 666)
|
40
41
|
fetcher.put(url, io)
|
41
42
|
end
|
42
43
|
end
|
@@ -14,11 +14,35 @@ RSpec.describe Ollama::Utils::Tags do
|
|
14
14
|
tags = described_class.new([ 'foo' ])
|
15
15
|
tags.add 'bar'
|
16
16
|
expect(tags.to_a).to eq %w[ bar foo ]
|
17
|
-
|
18
|
-
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can increase in size' do
|
20
|
+
tags = described_class.new
|
21
|
+
expect { tags.add 'foo' }.to change { tags.size }.from(0).to(1)
|
22
|
+
expect { tags.add 'bar' }.to change { tags.size }.from(1).to(2)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can be cleared' do
|
26
|
+
tags = described_class.new([ 'foo', 'bar' ])
|
27
|
+
expect { tags.clear }.to change { tags.size }.from(2).to(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'tags can be empt' do
|
31
|
+
tags = described_class.new([ 'foo' ])
|
32
|
+
expect { tags.clear }.to change { tags.empty? }.from(false).to(true)
|
19
33
|
end
|
20
34
|
|
21
35
|
it 'can be output nicely' do
|
22
36
|
expect(described_class.new(%w[ foo bar ]).to_s).to eq '#bar #foo'
|
23
37
|
end
|
38
|
+
|
39
|
+
it 'can be output nicely with links to source' do
|
40
|
+
tags = described_class.new([ 'foo' ], source: 'https://foo.example.com')
|
41
|
+
tags.add 'bar', source: '/path/to/bar.html'
|
42
|
+
expect(tags.to_a).to eq %w[ bar foo ]
|
43
|
+
tags.all? { expect(_1).to be_a(Ollama::Utils::Tags::Tag) }
|
44
|
+
expect(tags.to_s).to eq(
|
45
|
+
"\e]8;;file:///path/to/bar.html\e\\#bar\e]8;;\e\\ \e]8;;https://foo.example.com\e\\#foo\e]8;;\e\\"
|
46
|
+
)
|
47
|
+
end
|
24
48
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Ollama::Utils::Width do
|
4
|
+
before do
|
5
|
+
allow(Tins::Terminal).to receive(:columns).and_return 80
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.width' do
|
9
|
+
it 'defaults to 100%' do
|
10
|
+
expect(described_class.width).to eq 80
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'can be to 80%' do
|
14
|
+
expect(described_class.width(percentage: 80)).to eq 64
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.wrap' do
|
19
|
+
it 'can wrap with percentage' do
|
20
|
+
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', percentage: 80)
|
21
|
+
expect(wrapped).to eq(
|
22
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA\n"\
|
23
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
24
|
+
)
|
25
|
+
expect(wrapped.size).to eq 109
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'can wrap with length' do
|
29
|
+
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', length: 64)
|
30
|
+
expect(wrapped).to eq(
|
31
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA\n"\
|
32
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
33
|
+
)
|
34
|
+
expect(wrapped.size).to eq 109
|
35
|
+
end
|
36
|
+
|
37
|
+
it "doesn't wrap with length 0" do
|
38
|
+
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', length: 0)
|
39
|
+
expect(wrapped).to eq(
|
40
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA "\
|
41
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '.truncate' do
|
47
|
+
it 'can truncate with percentage' do
|
48
|
+
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', percentage: 80)
|
49
|
+
expect(truncated).to eq(
|
50
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAA…"
|
51
|
+
)
|
52
|
+
expect(truncated.size).to eq 64
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'can truncate with length' do
|
56
|
+
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 64)
|
57
|
+
expect(truncated).to eq(
|
58
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAA…"
|
59
|
+
)
|
60
|
+
expect(truncated.size).to eq 64
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'cannot truncate if not necessary' do
|
64
|
+
text = [ ?A * 10 ] * 5 * ' '
|
65
|
+
truncated = described_class.truncate(text, length: 54)
|
66
|
+
expect(truncated).to eq text
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'can truncate with length 0' do
|
70
|
+
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 0)
|
71
|
+
expect(truncated).to be_empty
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'can truncate with ...' do
|
75
|
+
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 64, ellipsis: '...')
|
76
|
+
expect(truncated).to eq(
|
77
|
+
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAA..."
|
78
|
+
)
|
79
|
+
expect(truncated.size).to eq 64
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ollama-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|
@@ -206,20 +206,6 @@ dependencies:
|
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '1.1'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: sorted_set
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - "~>"
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '1.0'
|
216
|
-
type: :runtime
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - "~>"
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '1.0'
|
223
209
|
- !ruby/object:Gem::Dependency
|
224
210
|
name: mime-types
|
225
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -346,6 +332,20 @@ dependencies:
|
|
346
332
|
- - "~>"
|
347
333
|
- !ruby/object:Gem::Version
|
348
334
|
version: '7.0'
|
335
|
+
- !ruby/object:Gem::Dependency
|
336
|
+
name: tins
|
337
|
+
requirement: !ruby/object:Gem::Requirement
|
338
|
+
requirements:
|
339
|
+
- - "~>"
|
340
|
+
- !ruby/object:Gem::Version
|
341
|
+
version: '1.34'
|
342
|
+
type: :runtime
|
343
|
+
prerelease: false
|
344
|
+
version_requirements: !ruby/object:Gem::Requirement
|
345
|
+
requirements:
|
346
|
+
- - "~>"
|
347
|
+
- !ruby/object:Gem::Version
|
348
|
+
version: '1.34'
|
349
349
|
description: Library that allows interacting with the Ollama API
|
350
350
|
email: flori@ping.de
|
351
351
|
executables:
|
@@ -519,6 +519,7 @@ files:
|
|
519
519
|
- spec/ollama/utils/fetcher_spec.rb
|
520
520
|
- spec/ollama/utils/file_argument_spec.rb
|
521
521
|
- spec/ollama/utils/tags_spec.rb
|
522
|
+
- spec/ollama/utils/width_spec.rb
|
522
523
|
- spec/spec_helper.rb
|
523
524
|
- tmp/.keep
|
524
525
|
homepage: https://github.com/flori/ollama-ruby
|
@@ -587,4 +588,5 @@ test_files:
|
|
587
588
|
- spec/ollama/utils/fetcher_spec.rb
|
588
589
|
- spec/ollama/utils/file_argument_spec.rb
|
589
590
|
- spec/ollama/utils/tags_spec.rb
|
591
|
+
- spec/ollama/utils/width_spec.rb
|
590
592
|
- spec/spec_helper.rb
|