""" Translates calls from OpenAI's `/v1/completions` endpoint to TogetherAI's `/v1/completions` endpoint. Calls done in OpenAI/openai.py as TogetherAI is openai-compatible. Docs: https://docs.together.ai/reference/completions-1 """ from typing import List, Union, cast from litellm.llms.openai.completion.utils import is_tokens_or_list_of_tokens from litellm.types.llms.openai import ( AllMessageValues, AllPromptValues, OpenAITextCompletionUserMessage, ) from ...openai.completion.transformation import OpenAITextCompletionConfig from ...openai.completion.utils import _transform_prompt class TogetherAITextCompletionConfig(OpenAITextCompletionConfig): def _transform_prompt( self, messages: Union[List[AllMessageValues], List[OpenAITextCompletionUserMessage]], ) -> AllPromptValues: """ TogetherAI expects a string prompt. """ initial_prompt: AllPromptValues = _transform_prompt(messages) ## TOGETHER AI SPECIFIC VALIDATION ## if isinstance(initial_prompt, list) and is_tokens_or_list_of_tokens( value=initial_prompt ): raise ValueError("TogetherAI does not support integers as input") if ( isinstance(initial_prompt, list) and len(initial_prompt) == 1 and isinstance(initial_prompt[0], str) ): together_prompt = initial_prompt[0] elif isinstance(initial_prompt, list): raise ValueError("TogetherAI does not support multiple prompts.") else: together_prompt = cast(str, initial_prompt) return together_prompt def transform_text_completion_request( self, model: str, messages: Union[List[AllMessageValues], List[OpenAITextCompletionUserMessage]], optional_params: dict, headers: dict, ) -> dict: prompt = self._transform_prompt(messages) return { "model": model, "prompt": prompt, **optional_params, }