dify_llm 1.9.1 → 1.14.1

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 (170) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -8
  3. data/lib/generators/ruby_llm/agent/agent_generator.rb +36 -0
  4. data/lib/generators/ruby_llm/agent/templates/agent.rb.tt +6 -0
  5. data/lib/generators/ruby_llm/agent/templates/instructions.txt.erb.tt +0 -0
  6. data/lib/generators/ruby_llm/chat_ui/chat_ui_generator.rb +110 -41
  7. data/lib/generators/ruby_llm/chat_ui/templates/controllers/chats_controller.rb.tt +14 -15
  8. data/lib/generators/ruby_llm/chat_ui/templates/controllers/messages_controller.rb.tt +8 -11
  9. data/lib/generators/ruby_llm/chat_ui/templates/controllers/models_controller.rb.tt +2 -2
  10. data/lib/generators/ruby_llm/chat_ui/templates/helpers/messages_helper.rb.tt +25 -0
  11. data/lib/generators/ruby_llm/chat_ui/templates/jobs/chat_response_job.rb.tt +2 -2
  12. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/chats/_chat.html.erb.tt +16 -0
  13. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/chats/_form.html.erb.tt +31 -0
  14. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/chats/index.html.erb.tt +31 -0
  15. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/chats/new.html.erb.tt +9 -0
  16. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/chats/show.html.erb.tt +27 -0
  17. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_assistant.html.erb.tt +14 -0
  18. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_content.html.erb.tt +1 -0
  19. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_error.html.erb.tt +13 -0
  20. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_form.html.erb.tt +23 -0
  21. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_system.html.erb.tt +10 -0
  22. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_tool.html.erb.tt +2 -0
  23. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_tool_calls.html.erb.tt +4 -0
  24. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/_user.html.erb.tt +14 -0
  25. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/tool_calls/_default.html.erb.tt +13 -0
  26. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/messages/tool_results/_default.html.erb.tt +21 -0
  27. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/models/_model.html.erb.tt +17 -0
  28. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/models/index.html.erb.tt +40 -0
  29. data/lib/generators/ruby_llm/chat_ui/templates/tailwind/views/models/show.html.erb.tt +27 -0
  30. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/_chat.html.erb.tt +2 -2
  31. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/_form.html.erb.tt +2 -2
  32. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/index.html.erb.tt +19 -7
  33. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/new.html.erb.tt +1 -1
  34. data/lib/generators/ruby_llm/chat_ui/templates/views/chats/show.html.erb.tt +5 -3
  35. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_assistant.html.erb.tt +9 -0
  36. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_content.html.erb.tt +1 -1
  37. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_error.html.erb.tt +8 -0
  38. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_form.html.erb.tt +1 -1
  39. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_system.html.erb.tt +6 -0
  40. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_tool.html.erb.tt +2 -0
  41. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_tool_calls.html.erb.tt +4 -7
  42. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_user.html.erb.tt +9 -0
  43. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/create.turbo_stream.erb.tt +5 -7
  44. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/tool_calls/_default.html.erb.tt +8 -0
  45. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/tool_results/_default.html.erb.tt +16 -0
  46. data/lib/generators/ruby_llm/chat_ui/templates/views/models/_model.html.erb.tt +11 -12
  47. data/lib/generators/ruby_llm/chat_ui/templates/views/models/index.html.erb.tt +27 -17
  48. data/lib/generators/ruby_llm/chat_ui/templates/views/models/show.html.erb.tt +3 -4
  49. data/lib/generators/ruby_llm/generator_helpers.rb +37 -17
  50. data/lib/generators/ruby_llm/install/install_generator.rb +22 -18
  51. data/lib/generators/ruby_llm/install/templates/create_chats_migration.rb.tt +1 -1
  52. data/lib/generators/ruby_llm/install/templates/create_messages_migration.rb.tt +4 -1
  53. data/lib/generators/ruby_llm/install/templates/create_models_migration.rb.tt +4 -10
  54. data/lib/generators/ruby_llm/install/templates/create_tool_calls_migration.rb.tt +2 -1
  55. data/lib/generators/ruby_llm/install/templates/initializer.rb.tt +2 -2
  56. data/lib/generators/ruby_llm/schema/schema_generator.rb +26 -0
  57. data/lib/generators/ruby_llm/schema/templates/schema.rb.tt +2 -0
  58. data/lib/generators/ruby_llm/tool/templates/tool.rb.tt +9 -0
  59. data/lib/generators/ruby_llm/tool/templates/tool_call.html.erb.tt +13 -0
  60. data/lib/generators/ruby_llm/tool/templates/tool_result.html.erb.tt +13 -0
  61. data/lib/generators/ruby_llm/tool/tool_generator.rb +96 -0
  62. data/lib/generators/ruby_llm/upgrade_to_v1_10/templates/add_v1_10_message_columns.rb.tt +19 -0
  63. data/lib/generators/ruby_llm/upgrade_to_v1_10/upgrade_to_v1_10_generator.rb +50 -0
  64. data/lib/generators/ruby_llm/upgrade_to_v1_14/templates/add_v1_14_tool_call_columns.rb.tt +7 -0
  65. data/lib/generators/ruby_llm/upgrade_to_v1_14/upgrade_to_v1_14_generator.rb +49 -0
  66. data/lib/generators/ruby_llm/upgrade_to_v1_7/templates/migration.rb.tt +1 -1
  67. data/lib/generators/ruby_llm/upgrade_to_v1_7/upgrade_to_v1_7_generator.rb +2 -4
  68. data/lib/generators/ruby_llm/upgrade_to_v1_9/upgrade_to_v1_9_generator.rb +1 -1
  69. data/lib/ruby_llm/active_record/acts_as.rb +10 -4
  70. data/lib/ruby_llm/active_record/acts_as_legacy.rb +132 -27
  71. data/lib/ruby_llm/active_record/chat_methods.rb +132 -28
  72. data/lib/ruby_llm/active_record/message_methods.rb +58 -8
  73. data/lib/ruby_llm/active_record/model_methods.rb +1 -1
  74. data/lib/ruby_llm/active_record/payload_helpers.rb +26 -0
  75. data/lib/ruby_llm/active_record/tool_call_methods.rb +15 -0
  76. data/lib/ruby_llm/agent.rb +365 -0
  77. data/lib/ruby_llm/aliases.json +199 -62
  78. data/lib/ruby_llm/attachment.rb +15 -4
  79. data/lib/ruby_llm/chat.rb +150 -22
  80. data/lib/ruby_llm/configuration.rb +65 -65
  81. data/lib/ruby_llm/connection.rb +11 -7
  82. data/lib/ruby_llm/content.rb +6 -2
  83. data/lib/ruby_llm/error.rb +37 -1
  84. data/lib/ruby_llm/message.rb +43 -15
  85. data/lib/ruby_llm/model/info.rb +15 -13
  86. data/lib/ruby_llm/models.json +37560 -14094
  87. data/lib/ruby_llm/models.rb +321 -38
  88. data/lib/ruby_llm/models_schema.json +2 -2
  89. data/lib/ruby_llm/provider.rb +26 -4
  90. data/lib/ruby_llm/providers/anthropic/capabilities.rb +5 -119
  91. data/lib/ruby_llm/providers/anthropic/chat.rb +149 -17
  92. data/lib/ruby_llm/providers/anthropic/media.rb +2 -2
  93. data/lib/ruby_llm/providers/anthropic/models.rb +3 -9
  94. data/lib/ruby_llm/providers/anthropic/streaming.rb +25 -1
  95. data/lib/ruby_llm/providers/anthropic/tools.rb +20 -0
  96. data/lib/ruby_llm/providers/anthropic.rb +5 -1
  97. data/lib/ruby_llm/providers/azure/chat.rb +29 -0
  98. data/lib/ruby_llm/providers/azure/embeddings.rb +24 -0
  99. data/lib/ruby_llm/providers/azure/media.rb +45 -0
  100. data/lib/ruby_llm/providers/azure/models.rb +14 -0
  101. data/lib/ruby_llm/providers/azure.rb +148 -0
  102. data/lib/ruby_llm/providers/bedrock/auth.rb +122 -0
  103. data/lib/ruby_llm/providers/bedrock/chat.rb +357 -28
  104. data/lib/ruby_llm/providers/bedrock/media.rb +62 -33
  105. data/lib/ruby_llm/providers/bedrock/models.rb +107 -62
  106. data/lib/ruby_llm/providers/bedrock/streaming.rb +309 -8
  107. data/lib/ruby_llm/providers/bedrock.rb +69 -52
  108. data/lib/ruby_llm/providers/deepseek/capabilities.rb +4 -114
  109. data/lib/ruby_llm/providers/deepseek.rb +5 -1
  110. data/lib/ruby_llm/providers/dify/chat.rb +82 -7
  111. data/lib/ruby_llm/providers/dify/media.rb +2 -2
  112. data/lib/ruby_llm/providers/dify/streaming.rb +26 -4
  113. data/lib/ruby_llm/providers/dify.rb +4 -0
  114. data/lib/ruby_llm/providers/gemini/capabilities.rb +45 -207
  115. data/lib/ruby_llm/providers/gemini/chat.rb +88 -6
  116. data/lib/ruby_llm/providers/gemini/images.rb +1 -1
  117. data/lib/ruby_llm/providers/gemini/models.rb +2 -4
  118. data/lib/ruby_llm/providers/gemini/streaming.rb +34 -2
  119. data/lib/ruby_llm/providers/gemini/tools.rb +35 -3
  120. data/lib/ruby_llm/providers/gemini.rb +4 -0
  121. data/lib/ruby_llm/providers/gpustack/capabilities.rb +20 -0
  122. data/lib/ruby_llm/providers/gpustack/chat.rb +1 -1
  123. data/lib/ruby_llm/providers/gpustack.rb +8 -0
  124. data/lib/ruby_llm/providers/mistral/capabilities.rb +8 -0
  125. data/lib/ruby_llm/providers/mistral/chat.rb +59 -1
  126. data/lib/ruby_llm/providers/mistral.rb +4 -0
  127. data/lib/ruby_llm/providers/ollama/capabilities.rb +20 -0
  128. data/lib/ruby_llm/providers/ollama/chat.rb +1 -1
  129. data/lib/ruby_llm/providers/ollama.rb +11 -1
  130. data/lib/ruby_llm/providers/openai/capabilities.rb +96 -192
  131. data/lib/ruby_llm/providers/openai/chat.rb +101 -7
  132. data/lib/ruby_llm/providers/openai/media.rb +5 -2
  133. data/lib/ruby_llm/providers/openai/models.rb +2 -4
  134. data/lib/ruby_llm/providers/openai/streaming.rb +11 -3
  135. data/lib/ruby_llm/providers/openai/temperature.rb +28 -0
  136. data/lib/ruby_llm/providers/openai/tools.rb +27 -2
  137. data/lib/ruby_llm/providers/openai.rb +11 -1
  138. data/lib/ruby_llm/providers/openrouter/chat.rb +168 -0
  139. data/lib/ruby_llm/providers/openrouter/images.rb +69 -0
  140. data/lib/ruby_llm/providers/openrouter/streaming.rb +74 -0
  141. data/lib/ruby_llm/providers/openrouter.rb +37 -1
  142. data/lib/ruby_llm/providers/perplexity/capabilities.rb +34 -99
  143. data/lib/ruby_llm/providers/perplexity/models.rb +12 -14
  144. data/lib/ruby_llm/providers/perplexity.rb +4 -0
  145. data/lib/ruby_llm/providers/vertexai/models.rb +1 -1
  146. data/lib/ruby_llm/providers/vertexai.rb +23 -7
  147. data/lib/ruby_llm/providers/xai/chat.rb +15 -0
  148. data/lib/ruby_llm/providers/xai/models.rb +75 -0
  149. data/lib/ruby_llm/providers/xai.rb +32 -0
  150. data/lib/ruby_llm/stream_accumulator.rb +120 -18
  151. data/lib/ruby_llm/streaming.rb +82 -60
  152. data/lib/ruby_llm/thinking.rb +49 -0
  153. data/lib/ruby_llm/tokens.rb +47 -0
  154. data/lib/ruby_llm/tool.rb +49 -4
  155. data/lib/ruby_llm/tool_call.rb +6 -3
  156. data/lib/ruby_llm/version.rb +1 -1
  157. data/lib/ruby_llm.rb +14 -8
  158. data/lib/tasks/models.rake +62 -23
  159. data/lib/tasks/release.rake +1 -1
  160. data/lib/tasks/ruby_llm.rake +9 -1
  161. data/lib/tasks/vcr.rake +33 -1
  162. metadata +67 -16
  163. data/lib/generators/ruby_llm/chat_ui/templates/views/messages/_message.html.erb.tt +0 -13
  164. data/lib/ruby_llm/providers/bedrock/capabilities.rb +0 -167
  165. data/lib/ruby_llm/providers/bedrock/signing.rb +0 -831
  166. data/lib/ruby_llm/providers/bedrock/streaming/base.rb +0 -51
  167. data/lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb +0 -71
  168. data/lib/ruby_llm/providers/bedrock/streaming/message_processing.rb +0 -67
  169. data/lib/ruby_llm/providers/bedrock/streaming/payload_processing.rb +0 -80
  170. data/lib/ruby_llm/providers/bedrock/streaming/prelude_handling.rb +0 -78
@@ -1,8 +1,4 @@
1
1
  {
2
- "chatgpt-4o": {
3
- "openai": "chatgpt-4o-latest",
4
- "openrouter": "openai/chatgpt-4o-latest"
5
- },
6
2
  "claude-3-5-haiku": {
7
3
  "anthropic": "claude-3-5-haiku-20241022",
8
4
  "openrouter": "anthropic/claude-3.5-haiku",
@@ -11,10 +7,15 @@
11
7
  "claude-3-5-haiku-latest": {
12
8
  "anthropic": "claude-3-5-haiku-latest"
13
9
  },
10
+ "claude-3-5-sonnet": {
11
+ "anthropic": "claude-3-5-sonnet-20241022",
12
+ "openrouter": "anthropic/claude-3.5-sonnet",
13
+ "bedrock": "anthropic.claude-3-5-sonnet-20241022-v2:0"
14
+ },
14
15
  "claude-3-7-sonnet": {
15
16
  "anthropic": "claude-3-7-sonnet-20250219",
16
17
  "openrouter": "anthropic/claude-3.7-sonnet",
17
- "bedrock": "us.anthropic.claude-3-7-sonnet-20250219-v1:0"
18
+ "bedrock": "anthropic.claude-3-7-sonnet-20250219-v1:0"
18
19
  },
19
20
  "claude-3-7-sonnet-latest": {
20
21
  "anthropic": "claude-3-7-sonnet-latest"
@@ -25,22 +26,22 @@
25
26
  "bedrock": "anthropic.claude-3-haiku-20240307-v1:0:200k"
26
27
  },
27
28
  "claude-3-opus": {
28
- "anthropic": "claude-3-opus-20240229",
29
- "openrouter": "anthropic/claude-3-opus",
30
- "bedrock": "anthropic.claude-3-opus-20240229-v1:0:200k"
29
+ "anthropic": "claude-3-opus-20240229"
31
30
  },
32
31
  "claude-3-sonnet": {
33
- "bedrock": "anthropic.claude-3-sonnet-20240229-v1:0"
32
+ "anthropic": "claude-3-sonnet-20240229",
33
+ "bedrock": "anthropic.claude-3-sonnet-20240229-v1:0:200k"
34
34
  },
35
35
  "claude-haiku-4-5": {
36
36
  "anthropic": "claude-haiku-4-5-20251001",
37
37
  "openrouter": "anthropic/claude-haiku-4.5",
38
- "bedrock": "us.anthropic.claude-haiku-4-5-20251001-v1:0"
38
+ "bedrock": "anthropic.claude-haiku-4-5-20251001-v1:0",
39
+ "azure": "claude-haiku-4-5-20251001"
39
40
  },
40
41
  "claude-opus-4": {
41
42
  "anthropic": "claude-opus-4-20250514",
42
43
  "openrouter": "anthropic/claude-opus-4",
43
- "bedrock": "us.anthropic.claude-opus-4-1-20250805-v1:0"
44
+ "bedrock": "anthropic.claude-opus-4-1-20250805-v1:0"
44
45
  },
45
46
  "claude-opus-4-0": {
46
47
  "anthropic": "claude-opus-4-0"
@@ -48,12 +49,25 @@
48
49
  "claude-opus-4-1": {
49
50
  "anthropic": "claude-opus-4-1-20250805",
50
51
  "openrouter": "anthropic/claude-opus-4.1",
51
- "bedrock": "us.anthropic.claude-opus-4-1-20250805-v1:0"
52
+ "bedrock": "anthropic.claude-opus-4-1-20250805-v1:0",
53
+ "azure": "claude-opus-4-1-20250805"
54
+ },
55
+ "claude-opus-4-5": {
56
+ "anthropic": "claude-opus-4-5-20251101",
57
+ "openrouter": "anthropic/claude-opus-4.5",
58
+ "bedrock": "anthropic.claude-opus-4-5-20251101-v1:0",
59
+ "azure": "claude-opus-4-5-20251101"
60
+ },
61
+ "claude-opus-4-6": {
62
+ "anthropic": "claude-opus-4-6",
63
+ "openrouter": "anthropic/claude-opus-4.6",
64
+ "bedrock": "anthropic.claude-opus-4-6-v1",
65
+ "azure": "claude-opus-4-6"
52
66
  },
53
67
  "claude-sonnet-4": {
54
68
  "anthropic": "claude-sonnet-4-20250514",
55
69
  "openrouter": "anthropic/claude-sonnet-4",
56
- "bedrock": "us.anthropic.claude-sonnet-4-20250514-v1:0"
70
+ "bedrock": "anthropic.claude-sonnet-4-20250514-v1:0"
57
71
  },
58
72
  "claude-sonnet-4-0": {
59
73
  "anthropic": "claude-sonnet-4-0"
@@ -61,12 +75,31 @@
61
75
  "claude-sonnet-4-5": {
62
76
  "anthropic": "claude-sonnet-4-5-20250929",
63
77
  "openrouter": "anthropic/claude-sonnet-4.5",
64
- "bedrock": "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
78
+ "bedrock": "anthropic.claude-sonnet-4-5-20250929-v1:0",
79
+ "azure": "claude-sonnet-4-5-20250929"
80
+ },
81
+ "claude-sonnet-4-6": {
82
+ "anthropic": "claude-sonnet-4-6",
83
+ "openrouter": "anthropic/claude-sonnet-4.6",
84
+ "bedrock": "anthropic.claude-sonnet-4-6",
85
+ "azure": "claude-sonnet-4-6"
65
86
  },
66
87
  "deepseek-chat": {
67
88
  "deepseek": "deepseek-chat",
68
89
  "openrouter": "deepseek/deepseek-chat"
69
90
  },
91
+ "gemini-1.5-flash": {
92
+ "gemini": "gemini-1.5-flash",
93
+ "vertexai": "gemini-1.5-flash"
94
+ },
95
+ "gemini-1.5-flash-8b": {
96
+ "gemini": "gemini-1.5-flash-8b",
97
+ "vertexai": "gemini-1.5-flash-8b"
98
+ },
99
+ "gemini-1.5-pro": {
100
+ "gemini": "gemini-1.5-pro",
101
+ "vertexai": "gemini-1.5-pro"
102
+ },
70
103
  "gemini-2.0-flash": {
71
104
  "gemini": "gemini-2.0-flash",
72
105
  "vertexai": "gemini-2.0-flash"
@@ -76,9 +109,9 @@
76
109
  "openrouter": "google/gemini-2.0-flash-001",
77
110
  "vertexai": "gemini-2.0-flash-001"
78
111
  },
79
- "gemini-2.0-flash-exp": {
80
- "gemini": "gemini-2.0-flash-exp",
81
- "vertexai": "gemini-2.0-flash-exp"
112
+ "gemini-2.0-flash-lite": {
113
+ "gemini": "gemini-2.0-flash-lite",
114
+ "vertexai": "gemini-2.0-flash-lite"
82
115
  },
83
116
  "gemini-2.0-flash-lite-001": {
84
117
  "gemini": "gemini-2.0-flash-lite-001",
@@ -94,10 +127,6 @@
94
127
  "gemini": "gemini-2.5-flash-image",
95
128
  "openrouter": "google/gemini-2.5-flash-image"
96
129
  },
97
- "gemini-2.5-flash-image-preview": {
98
- "gemini": "gemini-2.5-flash-image-preview",
99
- "openrouter": "google/gemini-2.5-flash-image-preview"
100
- },
101
130
  "gemini-2.5-flash-lite": {
102
131
  "gemini": "gemini-2.5-flash-lite",
103
132
  "openrouter": "google/gemini-2.5-flash-lite",
@@ -105,15 +134,25 @@
105
134
  },
106
135
  "gemini-2.5-flash-lite-preview-06-17": {
107
136
  "gemini": "gemini-2.5-flash-lite-preview-06-17",
108
- "openrouter": "google/gemini-2.5-flash-lite-preview-06-17"
137
+ "vertexai": "gemini-2.5-flash-lite-preview-06-17"
109
138
  },
110
139
  "gemini-2.5-flash-lite-preview-09-2025": {
111
140
  "gemini": "gemini-2.5-flash-lite-preview-09-2025",
112
- "openrouter": "google/gemini-2.5-flash-lite-preview-09-2025"
141
+ "openrouter": "google/gemini-2.5-flash-lite-preview-09-2025",
142
+ "vertexai": "gemini-2.5-flash-lite-preview-09-2025"
143
+ },
144
+ "gemini-2.5-flash-preview-04-17": {
145
+ "gemini": "gemini-2.5-flash-preview-04-17",
146
+ "vertexai": "gemini-2.5-flash-preview-04-17"
147
+ },
148
+ "gemini-2.5-flash-preview-05-20": {
149
+ "gemini": "gemini-2.5-flash-preview-05-20",
150
+ "vertexai": "gemini-2.5-flash-preview-05-20"
113
151
  },
114
152
  "gemini-2.5-flash-preview-09-2025": {
115
153
  "gemini": "gemini-2.5-flash-preview-09-2025",
116
- "openrouter": "google/gemini-2.5-flash-preview-09-2025"
154
+ "openrouter": "google/gemini-2.5-flash-preview-09-2025",
155
+ "vertexai": "gemini-2.5-flash-preview-09-2025"
117
156
  },
118
157
  "gemini-2.5-pro": {
119
158
  "gemini": "gemini-2.5-pro",
@@ -122,15 +161,59 @@
122
161
  },
123
162
  "gemini-2.5-pro-preview-05-06": {
124
163
  "gemini": "gemini-2.5-pro-preview-05-06",
125
- "openrouter": "google/gemini-2.5-pro-preview-05-06"
164
+ "openrouter": "google/gemini-2.5-pro-preview-05-06",
165
+ "vertexai": "gemini-2.5-pro-preview-05-06"
166
+ },
167
+ "gemini-2.5-pro-preview-06-05": {
168
+ "gemini": "gemini-2.5-pro-preview-06-05",
169
+ "openrouter": "google/gemini-2.5-pro-preview-06-05",
170
+ "vertexai": "gemini-2.5-pro-preview-06-05"
171
+ },
172
+ "gemini-3-flash-preview": {
173
+ "gemini": "gemini-3-flash-preview",
174
+ "openrouter": "google/gemini-3-flash-preview",
175
+ "vertexai": "gemini-3-flash-preview"
176
+ },
177
+ "gemini-3-pro-image-preview": {
178
+ "gemini": "gemini-3-pro-image-preview",
179
+ "openrouter": "google/gemini-3-pro-image-preview"
180
+ },
181
+ "gemini-3-pro-preview": {
182
+ "gemini": "gemini-3-pro-preview",
183
+ "openrouter": "google/gemini-3-pro-preview",
184
+ "vertexai": "gemini-3-pro-preview"
185
+ },
186
+ "gemini-3.1-flash-image-preview": {
187
+ "gemini": "gemini-3.1-flash-image-preview",
188
+ "openrouter": "google/gemini-3.1-flash-image-preview",
189
+ "vertexai": "gemini-3.1-flash-image-preview"
190
+ },
191
+ "gemini-3.1-flash-lite-preview": {
192
+ "gemini": "gemini-3.1-flash-lite-preview",
193
+ "openrouter": "google/gemini-3.1-flash-lite-preview",
194
+ "vertexai": "gemini-3.1-flash-lite-preview"
195
+ },
196
+ "gemini-3.1-pro-preview": {
197
+ "gemini": "gemini-3.1-pro-preview",
198
+ "openrouter": "google/gemini-3.1-pro-preview",
199
+ "vertexai": "gemini-3.1-pro-preview"
200
+ },
201
+ "gemini-3.1-pro-preview-customtools": {
202
+ "gemini": "gemini-3.1-pro-preview-customtools",
203
+ "openrouter": "google/gemini-3.1-pro-preview-customtools",
204
+ "vertexai": "gemini-3.1-pro-preview-customtools"
126
205
  },
127
206
  "gemini-embedding-001": {
128
207
  "gemini": "gemini-embedding-001",
129
208
  "vertexai": "gemini-embedding-001"
130
209
  },
131
- "gemini-exp-1206": {
132
- "gemini": "gemini-exp-1206",
133
- "vertexai": "gemini-exp-1206"
210
+ "gemini-flash": {
211
+ "gemini": "gemini-flash-latest",
212
+ "vertexai": "gemini-flash-latest"
213
+ },
214
+ "gemini-flash-lite": {
215
+ "gemini": "gemini-flash-lite-latest",
216
+ "vertexai": "gemini-flash-lite-latest"
134
217
  },
135
218
  "gemma-3-12b-it": {
136
219
  "gemini": "gemma-3-12b-it",
@@ -162,47 +245,47 @@
162
245
  },
163
246
  "gpt-4": {
164
247
  "openai": "gpt-4",
165
- "openrouter": "openai/gpt-4"
166
- },
167
- "gpt-4-1106-preview": {
168
- "openai": "gpt-4-1106-preview",
169
- "openrouter": "openai/gpt-4-1106-preview"
248
+ "openrouter": "openai/gpt-4",
249
+ "azure": "gpt-4"
170
250
  },
171
251
  "gpt-4-turbo": {
172
252
  "openai": "gpt-4-turbo",
173
253
  "openrouter": "openai/gpt-4-turbo"
174
254
  },
175
- "gpt-4-turbo-preview": {
176
- "openai": "gpt-4-turbo-preview",
177
- "openrouter": "openai/gpt-4-turbo-preview"
178
- },
179
255
  "gpt-4.1": {
180
256
  "openai": "gpt-4.1",
181
- "openrouter": "openai/gpt-4.1"
257
+ "openrouter": "openai/gpt-4.1",
258
+ "azure": "gpt-4.1"
182
259
  },
183
260
  "gpt-4.1-mini": {
184
261
  "openai": "gpt-4.1-mini",
185
- "openrouter": "openai/gpt-4.1-mini"
262
+ "openrouter": "openai/gpt-4.1-mini",
263
+ "azure": "gpt-4.1-mini"
186
264
  },
187
265
  "gpt-4.1-nano": {
188
266
  "openai": "gpt-4.1-nano",
189
- "openrouter": "openai/gpt-4.1-nano"
267
+ "openrouter": "openai/gpt-4.1-nano",
268
+ "azure": "gpt-4.1-nano"
190
269
  },
191
270
  "gpt-4o": {
192
271
  "openai": "gpt-4o",
193
- "openrouter": "openai/gpt-4o"
272
+ "openrouter": "openai/gpt-4o",
273
+ "azure": "gpt-4o"
194
274
  },
195
275
  "gpt-4o-2024-05-13": {
196
276
  "openai": "gpt-4o-2024-05-13",
197
- "openrouter": "openai/gpt-4o-2024-05-13"
277
+ "openrouter": "openai/gpt-4o-2024-05-13",
278
+ "azure": "gpt-4o-2024-05-13"
198
279
  },
199
280
  "gpt-4o-2024-08-06": {
200
281
  "openai": "gpt-4o-2024-08-06",
201
- "openrouter": "openai/gpt-4o-2024-08-06"
282
+ "openrouter": "openai/gpt-4o-2024-08-06",
283
+ "azure": "gpt-4o-2024-08-06"
202
284
  },
203
285
  "gpt-4o-2024-11-20": {
204
286
  "openai": "gpt-4o-2024-11-20",
205
- "openrouter": "openai/gpt-4o-2024-11-20"
287
+ "openrouter": "openai/gpt-4o-2024-11-20",
288
+ "azure": "gpt-4o-2024-11-20"
206
289
  },
207
290
  "gpt-4o-audio-preview": {
208
291
  "openai": "gpt-4o-audio-preview",
@@ -210,11 +293,13 @@
210
293
  },
211
294
  "gpt-4o-mini": {
212
295
  "openai": "gpt-4o-mini",
213
- "openrouter": "openai/gpt-4o-mini"
296
+ "openrouter": "openai/gpt-4o-mini",
297
+ "azure": "gpt-4o-mini"
214
298
  },
215
299
  "gpt-4o-mini-2024-07-18": {
216
300
  "openai": "gpt-4o-mini-2024-07-18",
217
- "openrouter": "openai/gpt-4o-mini-2024-07-18"
301
+ "openrouter": "openai/gpt-4o-mini-2024-07-18",
302
+ "azure": "gpt-4o-mini-2024-07-18"
218
303
  },
219
304
  "gpt-4o-mini-search-preview": {
220
305
  "openai": "gpt-4o-mini-search-preview",
@@ -244,17 +329,70 @@
244
329
  "openai": "gpt-5-pro",
245
330
  "openrouter": "openai/gpt-5-pro"
246
331
  },
247
- "gpt-oss-120b": {
248
- "openai": "gpt-oss-120b",
249
- "openrouter": "openai/gpt-oss-120b"
332
+ "gpt-5.1": {
333
+ "openai": "gpt-5.1",
334
+ "openrouter": "openai/gpt-5.1",
335
+ "azure": "gpt-5.1"
250
336
  },
251
- "gpt-oss-20b": {
252
- "openai": "gpt-oss-20b",
253
- "openrouter": "openai/gpt-oss-20b"
337
+ "gpt-5.1-codex": {
338
+ "openai": "gpt-5.1-codex",
339
+ "openrouter": "openai/gpt-5.1-codex"
254
340
  },
255
- "imagen-4.0-generate-001": {
256
- "gemini": "imagen-4.0-generate-001",
257
- "vertexai": "imagen-4.0-generate-001"
341
+ "gpt-5.1-codex-max": {
342
+ "openai": "gpt-5.1-codex-max",
343
+ "openrouter": "openai/gpt-5.1-codex-max"
344
+ },
345
+ "gpt-5.1-codex-mini": {
346
+ "openai": "gpt-5.1-codex-mini",
347
+ "openrouter": "openai/gpt-5.1-codex-mini"
348
+ },
349
+ "gpt-5.2": {
350
+ "openai": "gpt-5.2",
351
+ "openrouter": "openai/gpt-5.2"
352
+ },
353
+ "gpt-5.2-codex": {
354
+ "openai": "gpt-5.2-codex",
355
+ "openrouter": "openai/gpt-5.2-codex"
356
+ },
357
+ "gpt-5.2-pro": {
358
+ "openai": "gpt-5.2-pro",
359
+ "openrouter": "openai/gpt-5.2-pro"
360
+ },
361
+ "gpt-5.3-codex": {
362
+ "openai": "gpt-5.3-codex",
363
+ "openrouter": "openai/gpt-5.3-codex"
364
+ },
365
+ "gpt-5.4": {
366
+ "openai": "gpt-5.4",
367
+ "openrouter": "openai/gpt-5.4"
368
+ },
369
+ "gpt-5.4-mini": {
370
+ "openai": "gpt-5.4-mini",
371
+ "openrouter": "openai/gpt-5.4-mini"
372
+ },
373
+ "gpt-5.4-nano": {
374
+ "openai": "gpt-5.4-nano",
375
+ "openrouter": "openai/gpt-5.4-nano"
376
+ },
377
+ "gpt-5.4-pro": {
378
+ "openai": "gpt-5.4-pro",
379
+ "openrouter": "openai/gpt-5.4-pro"
380
+ },
381
+ "gpt-audio": {
382
+ "openai": "gpt-audio",
383
+ "openrouter": "openai/gpt-audio"
384
+ },
385
+ "gpt-audio-mini": {
386
+ "openai": "gpt-audio-mini",
387
+ "openrouter": "openai/gpt-audio-mini"
388
+ },
389
+ "lyria-3-clip-preview": {
390
+ "gemini": "lyria-3-clip-preview",
391
+ "openrouter": "google/lyria-3-clip-preview"
392
+ },
393
+ "lyria-3-pro-preview": {
394
+ "gemini": "lyria-3-pro-preview",
395
+ "openrouter": "google/lyria-3-pro-preview"
258
396
  },
259
397
  "o1": {
260
398
  "openai": "o1",
@@ -262,7 +400,8 @@
262
400
  },
263
401
  "o1-pro": {
264
402
  "openai": "o1-pro",
265
- "openrouter": "openai/o1-pro"
403
+ "openrouter": "openai/o1-pro",
404
+ "azure": "o1-pro"
266
405
  },
267
406
  "o3": {
268
407
  "openai": "o3",
@@ -274,7 +413,8 @@
274
413
  },
275
414
  "o3-mini": {
276
415
  "openai": "o3-mini",
277
- "openrouter": "openai/o3-mini"
416
+ "openrouter": "openai/o3-mini",
417
+ "azure": "o3-mini"
278
418
  },
279
419
  "o3-pro": {
280
420
  "openai": "o3-pro",
@@ -282,14 +422,11 @@
282
422
  },
283
423
  "o4-mini": {
284
424
  "openai": "o4-mini",
285
- "openrouter": "openai/o4-mini"
425
+ "openrouter": "openai/o4-mini",
426
+ "azure": "o4-mini"
286
427
  },
287
428
  "o4-mini-deep-research": {
288
429
  "openai": "o4-mini-deep-research",
289
430
  "openrouter": "openai/o4-mini-deep-research"
290
- },
291
- "text-embedding-004": {
292
- "gemini": "text-embedding-004",
293
- "vertexai": "text-embedding-004"
294
431
  }
295
432
  }
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pathname'
4
+ require 'uri'
5
+
3
6
  module RubyLLM
4
7
  # A class representing a file attachment.
5
8
  class Attachment
@@ -18,7 +21,11 @@ module RubyLLM
18
21
  end
19
22
 
20
23
  def path?
21
- @source.is_a?(Pathname) || (@source.is_a?(String) && !url?)
24
+ return true if @source.is_a?(Pathname)
25
+ return false unless @source.is_a?(String)
26
+ return false if url? || uuid?
27
+
28
+ true
22
29
  end
23
30
 
24
31
  def io_like?
@@ -34,7 +41,9 @@ module RubyLLM
34
41
  end
35
42
 
36
43
  def uuid?
37
- @source.is_a?(String) && @source.match?(/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/i)
44
+ return false unless @source.is_a?(String)
45
+
46
+ @source.match?(/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/i)
38
47
  end
39
48
 
40
49
  def content
@@ -139,7 +148,7 @@ module RubyLLM
139
148
  end
140
149
 
141
150
  def load_content_from_path
142
- @content = File.read(@source)
151
+ @content = File.binread(@source)
143
152
  end
144
153
 
145
154
  def load_content_from_io
@@ -166,7 +175,7 @@ module RubyLLM
166
175
  if url?
167
176
  URI(@source)
168
177
  elsif uuid?
169
- @upload_file_id = @source
178
+ @upload_file_id = @source
170
179
  elsif path?
171
180
  Pathname.new(@source)
172
181
  else
@@ -175,6 +184,8 @@ module RubyLLM
175
184
  end
176
185
 
177
186
  def source_filename
187
+ return 'attachment' unless @upload_file_id.nil?
188
+
178
189
  if url?
179
190
  File.basename(@source.path).to_s
180
191
  elsif path?