Skip to main content

rig_core/providers/together/
completion.rs

1// ================================================================
2//! Together AI Completion Integration
3//! From [Together AI Reference](https://docs.together.ai/docs/chat-overview)
4// ================================================================
5
6use crate::providers::openai;
7
8use super::client::TogetherExt;
9
10// ================================================================
11// Together Completion Models
12// ================================================================
13
14pub const YI_34B_CHAT: &str = "zero-one-ai/Yi-34B-Chat";
15pub const OLMO_7B_INSTRUCT: &str = "allenai/OLMo-7B-Instruct";
16pub const CHRONOS_HERMES_13B: &str = "Austism/chronos-hermes-13b";
17pub const ML318BR: &str = "carson/ml318br";
18pub const DOLPHIN_2_5_MIXTRAL_8X7B: &str = "cognitivecomputations/dolphin-2.5-mixtral-8x7b";
19pub const DBRX_INSTRUCT: &str = "databricks/dbrx-instruct";
20pub const DEEPSEEK_LLM_67B_CHAT: &str = "deepseek-ai/deepseek-llm-67b-chat";
21pub const DEEPSEEK_CODER_33B_INSTRUCT: &str = "deepseek-ai/deepseek-coder-33b-instruct";
22pub const PLATYPUS2_70B_INSTRUCT: &str = "garage-bAInd/Platypus2-70B-instruct";
23pub const GEMMA_2_9B_IT: &str = "google/gemma-2-9b-it";
24pub const GEMMA_2B_IT: &str = "google/gemma-2b-it";
25pub const GEMMA_2_27B_IT: &str = "google/gemma-2-27b-it";
26pub const GEMMA_7B_IT: &str = "google/gemma-7b-it";
27pub const LLAMA_3_70B_INSTRUCT_GRADIENT_1048K: &str =
28    "gradientai/Llama-3-70B-Instruct-Gradient-1048k";
29pub const MYTHOMAX_L2_13B: &str = "Gryphe/MythoMax-L2-13b";
30pub const MYTHOMAX_L2_13B_LITE: &str = "Gryphe/MythoMax-L2-13b-Lite";
31pub const LLAVA_NEXT_MISTRAL_7B: &str = "llava-hf/llava-v1.6-mistral-7b-hf";
32pub const ZEPHYR_7B_BETA: &str = "HuggingFaceH4/zephyr-7b-beta";
33pub const KOALA_7B: &str = "togethercomputer/Koala-7B";
34pub const VICUNA_7B_V1_3: &str = "lmsys/vicuna-7b-v1.3";
35pub const VICUNA_13B_V1_5_16K: &str = "lmsys/vicuna-13b-v1.5-16k";
36pub const VICUNA_13B_V1_5: &str = "lmsys/vicuna-13b-v1.5";
37pub const VICUNA_13B_V1_3: &str = "lmsys/vicuna-13b-v1.3";
38pub const KOALA_13B: &str = "togethercomputer/Koala-13B";
39pub const VICUNA_7B_V1_5: &str = "lmsys/vicuna-7b-v1.5";
40pub const CODE_LLAMA_34B_INSTRUCT: &str = "codellama/CodeLlama-34b-Instruct-hf";
41pub const LLAMA_3_8B_CHAT_HF_INT4: &str = "togethercomputer/Llama-3-8b-chat-hf-int4";
42pub const LLAMA_3_2_90B_VISION_INSTRUCT_TURBO: &str =
43    "meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo";
44pub const LLAMA_3_2_11B_VISION_INSTRUCT_TURBO: &str =
45    "meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo";
46pub const LLAMA_3_2_3B_INSTRUCT_TURBO: &str = "meta-llama/Llama-3.2-3B-Instruct-Turbo";
47pub const LLAMA_3_8B_CHAT_HF_INT8: &str = "togethercomputer/Llama-3-8b-chat-hf-int8";
48pub const LLAMA_3_1_70B_INSTRUCT_TURBO: &str = "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo";
49pub const LLAMA_2_13B_CHAT: &str = "meta-llama/Llama-2-13b-chat-hf";
50pub const LLAMA_3_70B_INSTRUCT_LITE: &str = "meta-llama/Meta-Llama-3-70B-Instruct-Lite";
51pub const LLAMA_3_8B_CHAT_HF: &str = "meta-llama/Llama-3-8b-chat-hf";
52pub const LLAMA_3_70B_CHAT_HF: &str = "meta-llama/Llama-3-70b-chat-hf";
53pub const LLAMA_3_8B_INSTRUCT_TURBO: &str = "meta-llama/Meta-Llama-3-8B-Instruct-Turbo";
54pub const LLAMA_3_8B_INSTRUCT_LITE: &str = "meta-llama/Meta-Llama-3-8B-Instruct-Lite";
55pub const LLAMA_3_1_405B_INSTRUCT_LITE_PRO: &str =
56    "meta-llama/Meta-Llama-3.1-405B-Instruct-Lite-Pro";
57pub const LLAMA_2_7B_CHAT: &str = "meta-llama/Llama-2-7b-chat-hf";
58pub const LLAMA_3_1_405B_INSTRUCT_TURBO: &str = "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo";
59pub const LLAMA_VISION_FREE: &str = "meta-llama/Llama-Vision-Free";
60pub const LLAMA_3_70B_INSTRUCT_TURBO: &str = "meta-llama/Meta-Llama-3-70B-Instruct-Turbo";
61pub const LLAMA_3_1_8B_INSTRUCT_TURBO: &str = "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo";
62pub const CODE_LLAMA_7B_INSTRUCT_TOGETHER: &str = "togethercomputer/CodeLlama-7b-Instruct";
63pub const CODE_LLAMA_34B_INSTRUCT_TOGETHER: &str = "togethercomputer/CodeLlama-34b-Instruct";
64pub const CODE_LLAMA_13B_INSTRUCT: &str = "codellama/CodeLlama-13b-Instruct-hf";
65pub const CODE_LLAMA_13B_INSTRUCT_TOGETHER: &str = "togethercomputer/CodeLlama-13b-Instruct";
66pub const LLAMA_2_13B_CHAT_TOGETHER: &str = "togethercomputer/llama-2-13b-chat";
67pub const LLAMA_2_7B_CHAT_TOGETHER: &str = "togethercomputer/llama-2-7b-chat";
68pub const LLAMA_3_8B_INSTRUCT: &str = "meta-llama/Meta-Llama-3-8B-Instruct";
69pub const LLAMA_3_70B_INSTRUCT: &str = "meta-llama/Meta-Llama-3-70B-Instruct";
70pub const CODE_LLAMA_70B_INSTRUCT: &str = "codellama/CodeLlama-70b-Instruct-hf";
71pub const LLAMA_2_70B_CHAT_TOGETHER: &str = "togethercomputer/llama-2-70b-chat";
72pub const LLAMA_3_1_8B_INSTRUCT_REFERENCE: &str = "meta-llama/Meta-Llama-3.1-8B-Instruct-Reference";
73pub const LLAMA_3_1_70B_INSTRUCT_REFERENCE: &str =
74    "meta-llama/Meta-Llama-3.1-70B-Instruct-Reference";
75pub const WIZARDLM_2_8X22B: &str = "microsoft/WizardLM-2-8x22B";
76pub const MISTRAL_7B_INSTRUCT_V0_1: &str = "mistralai/Mistral-7B-Instruct-v0.1";
77pub const MISTRAL_7B_INSTRUCT_V0_2: &str = "mistralai/Mistral-7B-Instruct-v0.2";
78pub const MISTRAL_7B_INSTRUCT_V0_3: &str = "mistralai/Mistral-7B-Instruct-v0.3";
79pub const MIXTRAL_8X7B_INSTRUCT_V0_1: &str = "mistralai/Mixtral-8x7B-Instruct-v0.1";
80pub const MIXTRAL_8X22B_INSTRUCT_V0_1: &str = "mistralai/Mixtral-8x22B-Instruct-v0.1";
81pub const NOUS_HERMES_2_MIXTRAL_8X7B_DPO: &str = "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO";
82pub const NOUS_HERMES_LLAMA2_70B: &str = "NousResearch/Nous-Hermes-Llama2-70b";
83pub const NOUS_HERMES_2_MIXTRAL_8X7B_SFT: &str = "NousResearch/Nous-Hermes-2-Mixtral-8x7B-SFT";
84pub const NOUS_HERMES_LLAMA2_13B: &str = "NousResearch/Nous-Hermes-Llama2-13b";
85pub const NOUS_HERMES_2_MISTRAL_DPO: &str = "NousResearch/Nous-Hermes-2-Mistral-7B-DPO";
86pub const NOUS_HERMES_LLAMA2_7B: &str = "NousResearch/Nous-Hermes-llama-2-7b";
87pub const NOUS_CAPYBARA_V1_9: &str = "NousResearch/Nous-Capybara-7B-V1p9";
88pub const HERMES_2_THETA_LLAMA_3_70B: &str = "NousResearch/Hermes-2-Theta-Llama-3-70B";
89pub const OPENCHAT_3_5: &str = "openchat/openchat-3.5-1210";
90pub const OPENORCA_MISTRAL_7B_8K: &str = "Open-Orca/Mistral-7B-OpenOrca";
91pub const QWEN_2_72B_INSTRUCT: &str = "Qwen/Qwen2-72B-Instruct";
92pub const QWEN2_5_72B_INSTRUCT_TURBO: &str = "Qwen/Qwen2.5-72B-Instruct-Turbo";
93pub const QWEN2_5_7B_INSTRUCT_TURBO: &str = "Qwen/Qwen2.5-7B-Instruct-Turbo";
94pub const QWEN1_5_110B_CHAT: &str = "Qwen/Qwen1.5-110B-Chat";
95pub const QWEN1_5_72B_CHAT: &str = "Qwen/Qwen1.5-72B-Chat";
96pub const QWEN_2_1_5B_INSTRUCT: &str = "Qwen/Qwen2-1.5B-Instruct";
97pub const QWEN_2_7B_INSTRUCT: &str = "Qwen/Qwen2-7B-Instruct";
98pub const QWEN1_5_14B_CHAT: &str = "Qwen/Qwen1.5-14B-Chat";
99pub const QWEN1_5_1_8B_CHAT: &str = "Qwen/Qwen1.5-1.8B-Chat";
100pub const QWEN1_5_32B_CHAT: &str = "Qwen/Qwen1.5-32B-Chat";
101pub const QWEN1_5_7B_CHAT: &str = "Qwen/Qwen1.5-7B-Chat";
102pub const QWEN1_5_0_5B_CHAT: &str = "Qwen/Qwen1.5-0.5B-Chat";
103pub const QWEN1_5_4B_CHAT: &str = "Qwen/Qwen1.5-4B-Chat";
104pub const SNORKEL_MISTRAL_PAIRRM_DPO: &str = "snorkelai/Snorkel-Mistral-PairRM-DPO";
105pub const SNOWFLAKE_ARCTIC_INSTRUCT: &str = "Snowflake/snowflake-arctic-instruct";
106pub const ALPACA_7B: &str = "togethercomputer/alpaca-7b";
107pub const OPENHERMES_2_MISTRAL_7B: &str = "teknium/OpenHermes-2-Mistral-7B";
108pub const OPENHERMES_2_5_MISTRAL_7B: &str = "teknium/OpenHermes-2p5-Mistral-7B";
109pub const GUANACO_65B: &str = "togethercomputer/guanaco-65b";
110pub const GUANACO_13B: &str = "togethercomputer/guanaco-13b";
111pub const GUANACO_33B: &str = "togethercomputer/guanaco-33b";
112pub const GUANACO_7B: &str = "togethercomputer/guanaco-7b";
113pub const REMM_SLERP_L2_13B: &str = "Undi95/ReMM-SLERP-L2-13B";
114pub const TOPPY_M_7B: &str = "Undi95/Toppy-M-7B";
115pub const SOLAR_10_7B_INSTRUCT_V1: &str = "upstage/SOLAR-10.7B-Instruct-v1.0";
116pub const SOLAR_10_7B_INSTRUCT_V1_INT4: &str = "togethercomputer/SOLAR-10.7B-Instruct-v1.0-int4";
117pub const WIZARDLM_13B_V1_2: &str = "WizardLM/WizardLM-13B-V1.2";
118
119// =================================================================
120// Rig Implementation Types
121// =================================================================
122
123/// Together AI completion model, driven by the shared OpenAI Chat Completions path.
124pub type CompletionModel<H = reqwest::Client> =
125    openai::completion::GenericCompletionModel<TogetherExt, H>;
126
127#[cfg(test)]
128mod tests {
129    use crate::client::CompletionClient;
130    use crate::completion::{CompletionError, CompletionModel};
131    use crate::providers::openai::completion::{
132        CompletionRequest as OpenAICompletionRequest, OpenAIRequestParams,
133    };
134    use crate::test_utils::RecordingHttpClient;
135    use crate::{OneOrMany, message};
136
137    use super::super::client::Client;
138
139    #[tokio::test]
140    async fn completion_preserves_raw_provider_error_json_on_api_error_envelope() {
141        let body = r#"{"error":"model unavailable","code":"model_overloaded"}"#;
142        let http_client =
143            RecordingHttpClient::with_error_response(http::StatusCode::ACCEPTED, body);
144        let client = Client::builder()
145            .api_key("test-key")
146            .http_client(http_client)
147            .build()
148            .expect("build client");
149        let model = client.completion_model("meta-llama/Meta-Llama-3-70B-Instruct-Turbo");
150        let request = model.completion_request("hello").build();
151
152        let error = model
153            .completion(request)
154            .await
155            .expect_err("completion should fail with provider error envelope");
156
157        match &error {
158            CompletionError::ProviderResponse(stored) => {
159                assert_eq!(stored.body, body);
160                assert_eq!(stored.status, Some(http::StatusCode::ACCEPTED));
161                assert_eq!(error.provider_response_body(), Some(body));
162                assert_eq!(
163                    error.provider_response_status(),
164                    Some(http::StatusCode::ACCEPTED)
165                );
166                let json = error
167                    .provider_response_json()
168                    .expect("raw body should be valid JSON")
169                    .expect("parsed JSON should be present");
170                assert_eq!(json["code"], "model_overloaded");
171                assert_eq!(json["error"], "model unavailable");
172            }
173            other => panic!("expected ProviderResponse, got {other:?}"),
174        }
175    }
176
177    #[test]
178    fn together_request_conversion_errors_when_all_messages_are_filtered() {
179        let request = crate::completion::CompletionRequest {
180            preamble: None,
181            chat_history: OneOrMany::one(message::Message::Assistant {
182                id: None,
183                content: OneOrMany::one(message::AssistantContent::reasoning("hidden")),
184            }),
185            documents: vec![],
186            tools: vec![],
187            temperature: None,
188            max_tokens: None,
189            tool_choice: None,
190            additional_params: None,
191            model: None,
192            output_schema: None,
193        };
194
195        let result = OpenAICompletionRequest::try_from(OpenAIRequestParams {
196            model: "meta-llama/test-model".to_string(),
197            request,
198            strict_tools: false,
199            tool_result_array_content: false,
200            supports_response_format: false,
201            supports_tools: true,
202        });
203        assert!(matches!(result, Err(CompletionError::RequestError(_))));
204    }
205}