ruby_llm-providers-lms 0.1.0

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.flayignore +1 -0
  3. data/.github/workflows/ci.yml +32 -0
  4. data/.github/workflows/gitleaks.yml +22 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.overcommit.yml +31 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +29 -0
  9. data/Archspec.rb +14 -0
  10. data/LICENSE +21 -0
  11. data/README.md +87 -0
  12. data/lib/ruby_llm/providers/lms/models.rb +96 -0
  13. data/lib/ruby_llm/providers/lms.rb +55 -0
  14. data/models.json +603 -0
  15. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_openai_gpt_oss_20b_can_handle_a_multi_turn_conversation.yml +92 -0
  16. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_openai_gpt_oss_20b_can_have_a_basic_conversation.yml +45 -0
  17. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_openai_gpt_oss_20b_can_use_tools.yml +129 -0
  18. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_openai_gpt_oss_20b_returns_the_raw_response.yml +73 -0
  19. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_openai_gpt_oss_20b_supports_streaming_responses.yml +81 -0
  20. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_qwen3_0_6b_bible_assistant_can_have_a_basic_conversation.yml +73 -0
  21. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_qwen3_0_6b_bible_assistant_returns_structured_output.yml +73 -0
  22. data/spec/fixtures/vcr_cassettes/rubyllm_chat_lms_qwen3_0_6b_bible_assistant_returns_the_raw_response.yml +73 -0
  23. data/spec/fixtures/vcr_cassettes/rubyllm_embedding_lms_text_embedding_nomic_embed_text_v1_5_embeds_one_text.yml +828 -0
  24. data/spec/fixtures/vcr_cassettes/rubyllm_embedding_lms_text_embedding_nomic_embed_text_v1_5_embeds_several_texts.yml +2375 -0
  25. data/spec/ruby_llm/chat_schema_spec.rb +30 -0
  26. data/spec/ruby_llm/chat_spec.rb +35 -0
  27. data/spec/ruby_llm/chat_streaming_spec.rb +22 -0
  28. data/spec/ruby_llm/chat_tools_spec.rb +30 -0
  29. data/spec/ruby_llm/embedding_spec.rb +49 -0
  30. data/spec/ruby_llm/image_spec.rb +23 -0
  31. data/spec/ruby_llm/models_spec.rb +11 -0
  32. data/spec/ruby_llm/moderation_spec.rb +22 -0
  33. data/spec/ruby_llm/providers/lms_spec.rb +149 -0
  34. data/spec/ruby_llm/rerank_spec.rb +23 -0
  35. data/spec/ruby_llm/speech_spec.rb +25 -0
  36. data/spec/ruby_llm/video_spec.rb +27 -0
  37. data/spec/spec_helper.rb +26 -0
  38. data/spec/support/models.rb +29 -0
  39. data/spec/support/rubyllm_configuration.rb +14 -0
  40. data/spec/support/vcr_configuration.rb +16 -0
  41. metadata +99 -0
@@ -0,0 +1,45 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"What''s
9
+ 2 + 2?"}],"stream":false}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Content-Length:
31
+ - '623'
32
+ Etag:
33
+ - W/"26f-kDMLUbsR80Kkz1Ypkhx/iqdGgq8"
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:27:56 GMT
36
+ Connection:
37
+ - keep-alive
38
+ Keep-Alive:
39
+ - timeout=5
40
+ body:
41
+ encoding: ASCII-8BIT
42
+ string: !binary |-
43
+ ewogICJpZCI6ICJjaGF0Y21wbC10ZzNjczZlbXZ3OG95d3Q1Zjh6cDgiLAogICJvYmplY3QiOiAiY2hhdC5jb21wbGV0aW9uIiwKICAiY3JlYXRlZCI6IDE3ODkxNDc2NzYsCiAgIm1vZGVsIjogIm9wZW5haS9ncHQtb3NzLTIwYiIsCiAgImNob2ljZXMiOiBbCiAgICB7CiAgICAgICJpbmRleCI6IDAsCiAgICAgICJtZXNzYWdlIjogewogICAgICAgICJyb2xlIjogImFzc2lzdGFudCIsCiAgICAgICAgImNvbnRlbnQiOiAiMuKAryvigK8y4oCvPeKArzQuIiwKICAgICAgICAicmVhc29uaW5nIjogIlNpbXBsZSBtYXRoLiIsCiAgICAgICAgInRvb2xfY2FsbHMiOiBbXQogICAgICB9LAogICAgICAibG9ncHJvYnMiOiBudWxsLAogICAgICAiZmluaXNoX3JlYXNvbiI6ICJzdG9wIgogICAgfQogIF0sCiAgInVzYWdlIjogewogICAgInByb21wdF90b2tlbnMiOiA3NCwKICAgICJjb21wbGV0aW9uX3Rva2VucyI6IDIzLAogICAgInRvdGFsX3Rva2VucyI6IDk3LAogICAgImNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJyZWFzb25pbmdfdG9rZW5zIjogMwogICAgfQogIH0sCiAgInN0YXRzIjoge30sCiAgInN5c3RlbV9maW5nZXJwcmludCI6ICJvcGVuYWkvZ3B0LW9zcy0yMGIiCn0=
44
+ recorded_at: Fri, 11 Sep 2026 17:27:56 GMT
45
+ recorded_with: VCR 6.4.0
@@ -0,0 +1,129 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"What''s
9
+ the weather in Berlin? Use 52.5200, 13.4050."}],"stream":false,"tools":[{"type":"function","function":{"name":"","description":"Gets
10
+ current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude"},"longitude":{"type":"string","description":"Longitude"}},"required":["latitude","longitude"],"additionalProperties":false,"strict":true}}}]}'
11
+ headers:
12
+ User-Agent:
13
+ - Faraday v2.14.3
14
+ Authorization:
15
+ - Bearer <AUTH_TOKEN>
16
+ Content-Type:
17
+ - application/json
18
+ Accept-Encoding:
19
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
+ Accept:
21
+ - "*/*"
22
+ response:
23
+ status:
24
+ code: 200
25
+ message: OK
26
+ headers:
27
+ X-Powered-By:
28
+ - Express
29
+ Content-Type:
30
+ - application/json; charset=utf-8
31
+ Content-Length:
32
+ - '879'
33
+ Etag:
34
+ - W/"36f-cxGzH3DZRnQutMMM+dsgqVyBZjg"
35
+ Date:
36
+ - Fri, 11 Sep 2026 17:28:04 GMT
37
+ Connection:
38
+ - keep-alive
39
+ Keep-Alive:
40
+ - timeout=5
41
+ body:
42
+ encoding: UTF-8
43
+ string: |-
44
+ {
45
+ "id": "chatcmpl-80f0o9tdkt82gtn9t6q8ta",
46
+ "object": "chat.completion",
47
+ "created": 1789147683,
48
+ "model": "openai/gpt-oss-20b",
49
+ "choices": [
50
+ {
51
+ "index": 0,
52
+ "message": {
53
+ "role": "assistant",
54
+ "content": "",
55
+ "reasoning": "We need to call weather function.",
56
+ "tool_calls": [
57
+ {
58
+ "type": "function",
59
+ "id": "117069919",
60
+ "function": {
61
+ "name": "",
62
+ "arguments": "{\"latitude\":\"52.5200\",\"longitude\":\"13.4050\"}"
63
+ }
64
+ }
65
+ ]
66
+ },
67
+ "logprobs": null,
68
+ "finish_reason": "tool_calls"
69
+ }
70
+ ],
71
+ "usage": {
72
+ "prompt_tokens": 146,
73
+ "completion_tokens": 42,
74
+ "total_tokens": 188,
75
+ "completion_tokens_details": {
76
+ "reasoning_tokens": 7
77
+ }
78
+ },
79
+ "stats": {},
80
+ "system_fingerprint": "openai/gpt-oss-20b"
81
+ }
82
+ recorded_at: Fri, 11 Sep 2026 17:28:04 GMT
83
+ - request:
84
+ method: post
85
+ uri: "<LMS_API_BASE>/chat/completions"
86
+ body:
87
+ encoding: UTF-8
88
+ string: '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"What''s
89
+ the weather in Berlin? Use 52.5200, 13.4050."},{"role":"assistant","content":"","tool_calls":[{"id":"117069919","type":"function","function":{"name":"","arguments":"{\"latitude\":\"52.5200\",\"longitude\":\"13.4050\"}"}}],"reasoning":"We
90
+ need to call weather function.","reasoning_content":"We need to call weather
91
+ function."},{"role":"tool","content":"Current weather at 52.5200, 13.4050:
92
+ 15°C, Wind: 10 km/h","tool_call_id":"117069919"}],"stream":false,"tools":[{"type":"function","function":{"name":"","description":"Gets
93
+ current weather for a location","parameters":{"type":"object","properties":{"latitude":{"type":"string","description":"Latitude"},"longitude":{"type":"string","description":"Longitude"}},"required":["latitude","longitude"],"additionalProperties":false,"strict":true}}}]}'
94
+ headers:
95
+ User-Agent:
96
+ - Faraday v2.14.3
97
+ Authorization:
98
+ - Bearer <AUTH_TOKEN>
99
+ Content-Type:
100
+ - application/json
101
+ Accept-Encoding:
102
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
103
+ Accept:
104
+ - "*/*"
105
+ response:
106
+ status:
107
+ code: 200
108
+ message: OK
109
+ headers:
110
+ X-Powered-By:
111
+ - Express
112
+ Content-Type:
113
+ - application/json; charset=utf-8
114
+ Content-Length:
115
+ - '781'
116
+ Etag:
117
+ - W/"30d-lBARRVGlBGe9sqYIa3IIttf2Jg0"
118
+ Date:
119
+ - Fri, 11 Sep 2026 17:28:06 GMT
120
+ Connection:
121
+ - keep-alive
122
+ Keep-Alive:
123
+ - timeout=5
124
+ body:
125
+ encoding: ASCII-8BIT
126
+ string: !binary |-
127
+ ewogICJpZCI6ICJjaGF0Y21wbC1ud3NrZTh6ODhjdmQxazFrZHV6dSIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVhdGVkIjogMTc4OTE0NzY4NCwKICAibW9kZWwiOiAib3BlbmFpL2dwdC1vc3MtMjBiIiwKICAiY2hvaWNlcyI6IFsKICAgIHsKICAgICAgImluZGV4IjogMCwKICAgICAgIm1lc3NhZ2UiOiB7CiAgICAgICAgInJvbGUiOiAiYXNzaXN0YW50IiwKICAgICAgICAiY29udGVudCI6ICIqKkJlcmxpbiAoNTIuNTIwMOKAr04sIDEzLjQwNTDigK9FKSoqICBcbi0gKipUZW1wZXJhdHVyZToqKiB+MTXigK/CsEMgIFxuLSAqKldpbmQ6KiogfjEw4oCva20vaCAgXG5cblRoZSBmb3JlY2FzdCBpcyBtaWxkIHdpdGggY2xlYXIgc2tpZXMuIEVuam95IHlvdXIgZGF5ISIsCiAgICAgICAgInJlYXNvbmluZyI6ICJXZSBuZWVkIHRvIHJlc3BvbmQgd2l0aCB3ZWF0aGVyLiIsCiAgICAgICAgInRvb2xfY2FsbHMiOiBbXQogICAgICB9LAogICAgICAibG9ncHJvYnMiOiBudWxsLAogICAgICAiZmluaXNoX3JlYXNvbiI6ICJzdG9wIgogICAgfQogIF0sCiAgInVzYWdlIjogewogICAgInByb21wdF90b2tlbnMiOiAyMTMsCiAgICAiY29tcGxldGlvbl90b2tlbnMiOiA2NywKICAgICJ0b3RhbF90b2tlbnMiOiAyODAsCiAgICAiY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAgInJlYXNvbmluZ190b2tlbnMiOiA3CiAgICB9CiAgfSwKICAic3RhdHMiOiB7fSwKICAic3lzdGVtX2ZpbmdlcnByaW50IjogIm9wZW5haS9ncHQtb3NzLTIwYiIKfQ==
128
+ recorded_at: Fri, 11 Sep 2026 17:28:06 GMT
129
+ recorded_with: VCR 6.4.0
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"What
9
+ is the capital of France?"}],"stream":false}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Content-Length:
31
+ - '648'
32
+ Etag:
33
+ - W/"288-2+2eF5UFjDweyMb8HxN1pATbogM"
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:27:53 GMT
36
+ Connection:
37
+ - keep-alive
38
+ Keep-Alive:
39
+ - timeout=5
40
+ body:
41
+ encoding: UTF-8
42
+ string: |-
43
+ {
44
+ "id": "chatcmpl-sli6wgxdxqbgf872enruvr",
45
+ "object": "chat.completion",
46
+ "created": 1789147670,
47
+ "model": "openai/gpt-oss-20b",
48
+ "choices": [
49
+ {
50
+ "index": 0,
51
+ "message": {
52
+ "role": "assistant",
53
+ "content": "The capital of France is Paris.",
54
+ "reasoning": "Answer straightforward.",
55
+ "tool_calls": []
56
+ },
57
+ "logprobs": null,
58
+ "finish_reason": "stop"
59
+ }
60
+ ],
61
+ "usage": {
62
+ "prompt_tokens": 74,
63
+ "completion_tokens": 20,
64
+ "total_tokens": 94,
65
+ "completion_tokens_details": {
66
+ "reasoning_tokens": 3
67
+ }
68
+ },
69
+ "stats": {},
70
+ "system_fingerprint": "openai/gpt-oss-20b"
71
+ }
72
+ recorded_at: Fri, 11 Sep 2026 17:27:53 GMT
73
+ recorded_with: VCR 6.4.0
@@ -0,0 +1,81 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"openai/gpt-oss-20b","messages":[{"role":"user","content":"Count
9
+ from 1 to 3"}],"stream":true,"stream_options":{"include_usage":true}}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - text/event-stream
30
+ Cache-Control:
31
+ - no-cache
32
+ Connection:
33
+ - keep-alive
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:28:00 GMT
36
+ Transfer-Encoding:
37
+ - chunked
38
+ body:
39
+ encoding: UTF-8
40
+ string: |+
41
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"role":"assistant","reasoning":"User"},"logprobs":null,"finish_reason":null}]}
42
+
43
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" wants"},"logprobs":null,"finish_reason":null}]}
44
+
45
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" count"},"logprobs":null,"finish_reason":null}]}
46
+
47
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" 1"},"logprobs":null,"finish_reason":null}]}
48
+
49
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" to"},"logprobs":null,"finish_reason":null}]}
50
+
51
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" 3"},"logprobs":null,"finish_reason":null}]}
52
+
53
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":"."},"logprobs":null,"finish_reason":null}]}
54
+
55
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" Provide"},"logprobs":null,"finish_reason":null}]}
56
+
57
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":" sequence"},"logprobs":null,"finish_reason":null}]}
58
+
59
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"reasoning":"."},"logprobs":null,"finish_reason":null}]}
60
+
61
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":"1"},"logprobs":null,"finish_reason":null}]}
62
+
63
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}]}
64
+
65
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":" 2"},"logprobs":null,"finish_reason":null}]}
66
+
67
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}]}
68
+
69
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":" 3"},"logprobs":null,"finish_reason":null}]}
70
+
71
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{"content":""},"logprobs":null,"finish_reason":null}]}
72
+
73
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}]}
74
+
75
+ data: {"id":"chatcmpl-cvixai6ph3q3cdz9huvig6","object":"chat.completion.chunk","created":1789147680,"model":"openai/gpt-oss-20b","system_fingerprint":"openai/gpt-oss-20b","choices":[],"usage":{"prompt_tokens":74,"completion_tokens":29,"total_tokens":103,"completion_tokens_details":{"reasoning_tokens":12}}}
76
+
77
+ data: [DONE]
78
+
79
+ recorded_at: Fri, 11 Sep 2026 17:28:01 GMT
80
+ recorded_with: VCR 6.4.0
81
+ ...
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"qwen3-0.6b-bible-assistant","messages":[{"role":"user","content":"What''s
9
+ 2 + 2?"}],"stream":false}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Content-Length:
31
+ - '1584'
32
+ Etag:
33
+ - W/"630-uxTKlpT7zFB12JjOC6YqfjQu48o"
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:27:15 GMT
36
+ Connection:
37
+ - keep-alive
38
+ Keep-Alive:
39
+ - timeout=5
40
+ body:
41
+ encoding: UTF-8
42
+ string: |-
43
+ {
44
+ "id": "chatcmpl-4gslx40t72mvc15qpsyea",
45
+ "object": "chat.completion",
46
+ "created": 1789147635,
47
+ "model": "qwen3-0.6b-bible-assistant",
48
+ "choices": [
49
+ {
50
+ "index": 0,
51
+ "message": {
52
+ "role": "assistant",
53
+ "content": "{\"issue_question\": \"\", \"verse\": \"Matthew 11:30-34 - For this is good, and pleasing to God. But if you have anything to give, give it all; and if not, give to a friend, and to a neighbor in need. Whoever receives evil will be tempted again when he is about to receive it.\", \"explanation\": \"Matthew 11:30-34 teaches that generosity is good and pleasing to God, but the way you distribute your resources matters. It encourages giving everything (not being burdened) and giving to others in need while also considering relationships with friends. This shifts the focus from hoarding to serving others and sharing without fear of loss.\", \"guidance\": [\"Give all as possible options, even if it means helping someone else.\", \"Focus on supporting others rather than controlling resources.\", \"Be mindful of your limits; give what you cannot afford or have less confidence in.\", \"Set clear boundaries so you don't overextend yourself.\"], \"note\": \"\"}",
54
+ "reasoning_content": "",
55
+ "tool_calls": []
56
+ },
57
+ "logprobs": null,
58
+ "finish_reason": "stop"
59
+ }
60
+ ],
61
+ "usage": {
62
+ "prompt_tokens": 16,
63
+ "completion_tokens": 217,
64
+ "total_tokens": 233,
65
+ "completion_tokens_details": {
66
+ "reasoning_tokens": 0
67
+ }
68
+ },
69
+ "stats": {},
70
+ "system_fingerprint": "qwen3-0.6b-bible-assistant"
71
+ }
72
+ recorded_at: Fri, 11 Sep 2026 17:27:15 GMT
73
+ recorded_with: VCR 6.4.0
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"qwen3-0.6b-bible-assistant","messages":[{"role":"user","content":"Generate
9
+ a person named John who is 30 years old"}],"stream":false,"response_format":{"type":"json_schema","json_schema":{"name":"response","schema":{"type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer"}},"required":["name","age"],"additionalProperties":false},"strict":true}}}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Content-Length:
31
+ - '651'
32
+ Etag:
33
+ - W/"28b-lfratyRiXi0QpzlkqmrOxIv8YeU"
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:29:07 GMT
36
+ Connection:
37
+ - keep-alive
38
+ Keep-Alive:
39
+ - timeout=5
40
+ body:
41
+ encoding: UTF-8
42
+ string: |-
43
+ {
44
+ "id": "chatcmpl-84akgcg8nqgsycjy9uwqxh",
45
+ "object": "chat.completion",
46
+ "created": 1789147746,
47
+ "model": "qwen3-0.6b-bible-assistant",
48
+ "choices": [
49
+ {
50
+ "index": 0,
51
+ "message": {
52
+ "role": "assistant",
53
+ "content": "{\"name\": \"John\", \"age\": 30}",
54
+ "reasoning_content": "",
55
+ "tool_calls": []
56
+ },
57
+ "logprobs": null,
58
+ "finish_reason": "stop"
59
+ }
60
+ ],
61
+ "usage": {
62
+ "prompt_tokens": 20,
63
+ "completion_tokens": 18,
64
+ "total_tokens": 38,
65
+ "completion_tokens_details": {
66
+ "reasoning_tokens": 0
67
+ }
68
+ },
69
+ "stats": {},
70
+ "system_fingerprint": "qwen3-0.6b-bible-assistant"
71
+ }
72
+ recorded_at: Fri, 11 Sep 2026 17:29:07 GMT
73
+ recorded_with: VCR 6.4.0
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: "<LMS_API_BASE>/chat/completions"
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"model":"qwen3-0.6b-bible-assistant","messages":[{"role":"user","content":"What
9
+ is the capital of France?"}],"stream":false}'
10
+ headers:
11
+ User-Agent:
12
+ - Faraday v2.14.3
13
+ Authorization:
14
+ - Bearer <AUTH_TOKEN>
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ X-Powered-By:
27
+ - Express
28
+ Content-Type:
29
+ - application/json; charset=utf-8
30
+ Content-Length:
31
+ - '649'
32
+ Etag:
33
+ - W/"289-z0+P8ZlD0mrrOcJUeEGw9Sfrl2Q"
34
+ Date:
35
+ - Fri, 11 Sep 2026 17:27:15 GMT
36
+ Connection:
37
+ - keep-alive
38
+ Keep-Alive:
39
+ - timeout=5
40
+ body:
41
+ encoding: UTF-8
42
+ string: |-
43
+ {
44
+ "id": "chatcmpl-ajko3wpu2rrkmje2qrqcts",
45
+ "object": "chat.completion",
46
+ "created": 1789147635,
47
+ "model": "qwen3-0.6b-bible-assistant",
48
+ "choices": [
49
+ {
50
+ "index": 0,
51
+ "message": {
52
+ "role": "assistant",
53
+ "content": "The capital of France is Paris.",
54
+ "reasoning_content": "",
55
+ "tool_calls": []
56
+ },
57
+ "logprobs": null,
58
+ "finish_reason": "stop"
59
+ }
60
+ ],
61
+ "usage": {
62
+ "prompt_tokens": 15,
63
+ "completion_tokens": 12,
64
+ "total_tokens": 27,
65
+ "completion_tokens_details": {
66
+ "reasoning_tokens": 0
67
+ }
68
+ },
69
+ "stats": {},
70
+ "system_fingerprint": "qwen3-0.6b-bible-assistant"
71
+ }
72
+ recorded_at: Fri, 11 Sep 2026 17:27:15 GMT
73
+ recorded_with: VCR 6.4.0