跳转到内容

Baseten

贝森腾 #

基类:EventOpenAI

支持专用和模型API端点的Baseten LLM。

参数:

名称 类型 描述 默认
model_id str

Baseten 模型 ID(例如:"12a3b4c5")或模型名称(例如:"deepseek-ai/DeepSeek-V3-0324")。 当使用 model_apis=True 时,模型可用性会通过 API 进行动态验证, 如果 API 调用失败,则回退到静态验证。

required
model_apis bool

如果为 True(默认值),则使用模型 API 端点。如果为 False,则使用专用端点。

True
webhook_endpoint Optional[str]

用于异步操作的Webhook端点。如果提供,则使用异步API。

None
temperature float

用于生成的温度值

DEFAULT_TEMPERATURE
max_tokens int

生成的最大令牌数量

DEFAULT_NUM_OUTPUTS
additional_kwargs Optional[Dict[str, Any]]

API 的额外参数

None
max_retries int

最大重试次数

10
api_key Optional[str]

Baseten API 密钥

None
callback_manager Optional[CallbackManager]

用于日志记录的回调管理器

None
default_headers Optional[Dict[str, str]]

API请求的默认头部信息

None
system_prompt Optional[str]

聊天系统提示

None
messages_to_prompt Optional[Callable]

用于格式化消息以生成提示的函数

None
completion_to_prompt Optional[Callable]

用于格式化完成提示的函数

None
pydantic_program_mode PydanticProgramMode

Pydantic处理模式

DEFAULT
output_parser Optional[BaseOutputParser]

模型输出解析器

None

示例:

pip install llama-index-llms-baseten

from llama_index.llms.baseten import Baseten

# Using model apis endpoint (default behavior)
llm = Baseten(
    model_id="deepseek-ai/DeepSeek-V3-0324",
    api_key="YOUR_API_KEY",
    model_apis=True,  # Default
)
response = llm.complete("Hello, world!")

# Using dedicated endpoint (for custom deployed models)
llm = Baseten(
    model_id="YOUR_MODEL_ID",
    api_key="YOUR_API_KEY",
    model_apis=False,
)
response = llm.complete("Hello, world!")

# Asynchronous usage with webhook (dedicated endpoint only)
async_llm = Baseten(
    model_id="YOUR_MODEL_ID",
    api_key="YOUR_API_KEY",
    model_apis=False,  # Required for async operations
    webhook_endpoint="https://your-webhook.com/baseten-callback"
)
response = await async_llm.acomplete("Hello, world!")
request_id = response.text  # Track this ID for webhook response

# Get available models dynamically (Model APIs only)
llm = Baseten(model_id="deepseek-ai/DeepSeek-V3-0324", model_apis=True)
available = llm.available_models  # List[Model] - fetched dynamically
model_ids = [model.id for model in available]
print(f"Available models: {model_ids}")
workflows/handler.py 中的源代码llama_index/llms/baseten/base.py
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
class Baseten(OpenAI):
    """
    Baseten LLM with support for both dedicated and model apis endpoints.

    Args:
        model_id (str): The Baseten model ID (e.g., "12a3b4c5") or model name (e.g., "deepseek-ai/DeepSeek-V3-0324").
                       When using model_apis=True, model availability is validated dynamically against the API
                       with fallback to static validation if the API call fails.
        model_apis (bool): If True (default), uses the model apis endpoint. If False, uses the dedicated endpoint.
        webhook_endpoint (Optional[str]): Webhook endpoint for async operations. If provided, uses async API.
        temperature (float): The temperature to use for generation
        max_tokens (int): The maximum number of tokens to generate
        additional_kwargs (Optional[Dict[str, Any]]): Additional kwargs for the API
        max_retries (int): The maximum number of retries to make
        api_key (Optional[str]): The Baseten API key
        callback_manager (Optional[CallbackManager]): Callback manager for logging
        default_headers (Optional[Dict[str, str]]): Default headers for API requests
        system_prompt (Optional[str]): System prompt for chat
        messages_to_prompt (Optional[Callable]): Function to format messages to prompt
        completion_to_prompt (Optional[Callable]): Function to format completion prompt
        pydantic_program_mode (PydanticProgramMode): Mode for Pydantic handling
        output_parser (Optional[BaseOutputParser]): Parser for model outputs

    Examples:
        `pip install llama-index-llms-baseten`

        ```python
        from llama_index.llms.baseten import Baseten

        # Using model apis endpoint (default behavior)
        llm = Baseten(
            model_id="deepseek-ai/DeepSeek-V3-0324",
            api_key="YOUR_API_KEY",
            model_apis=True,  # Default
        )
        response = llm.complete("Hello, world!")

        # Using dedicated endpoint (for custom deployed models)
        llm = Baseten(
            model_id="YOUR_MODEL_ID",
            api_key="YOUR_API_KEY",
            model_apis=False,
        )
        response = llm.complete("Hello, world!")

        # Asynchronous usage with webhook (dedicated endpoint only)
        async_llm = Baseten(
            model_id="YOUR_MODEL_ID",
            api_key="YOUR_API_KEY",
            model_apis=False,  # Required for async operations
            webhook_endpoint="https://your-webhook.com/baseten-callback"
        )
        response = await async_llm.acomplete("Hello, world!")
        request_id = response.text  # Track this ID for webhook response

        # Get available models dynamically (Model APIs only)
        llm = Baseten(model_id="deepseek-ai/DeepSeek-V3-0324", model_apis=True)
        available = llm.available_models  # List[Model] - fetched dynamically
        model_ids = [model.id for model in available]
        print(f"Available models: {model_ids}")

        ```

    """

    webhook_endpoint: Optional[str] = Field(
        default=None, description="Webhook endpoint for async operations"
    )
    model_apis: bool = Field(
        default=True,
        description="Whether to use the model apis endpoint or the dedicated endpoint",
    )

    def __init__(
        self,
        model_id: str,
        model_apis: bool = True,
        webhook_endpoint: Optional[str] = None,
        temperature: float = DEFAULT_TEMPERATURE,
        max_tokens: int = DEFAULT_NUM_OUTPUTS,
        additional_kwargs: Optional[Dict[str, Any]] = None,
        max_retries: int = 10,
        api_key: Optional[str] = None,
        callback_manager: Optional[CallbackManager] = None,
        default_headers: Optional[Dict[str, str]] = None,
        system_prompt: Optional[str] = None,
        messages_to_prompt: Optional[Callable[[Sequence[ChatMessage]], str]] = None,
        completion_to_prompt: Optional[Callable[[str], str]] = None,
        pydantic_program_mode: PydanticProgramMode = PydanticProgramMode.DEFAULT,
        output_parser: Optional[BaseOutputParser] = None,
    ) -> None:
        additional_kwargs = additional_kwargs or {}
        callback_manager = callback_manager or CallbackManager([])

        # Validate model_id if using model apis endpoint
        if model_apis:
            # Use dynamic validation with fallback to static validation
            # We need to create a temporary client for validation
            api_key_temp = get_from_param_or_env("api_key", api_key, "BASETEN_API_KEY")

            # Import OpenAI here to avoid circular imports
            from openai import OpenAI as OpenAIClient

            temp_client = OpenAIClient(
                api_key=api_key_temp,
                base_url=MODEL_APIS_BASE,
            )
            validate_model_dynamic(temp_client, model_id)

        # Determine API base URL based on endpoint type
        if model_apis:
            api_base = MODEL_APIS_BASE
        else:
            api_base = DEFAULT_SYNC_API_BASE.format(model_id=model_id)

        api_key = get_from_param_or_env("api_key", api_key, "BASETEN_API_KEY")

        super().__init__(
            model=model_id,  # model_id is either the Baseten model ID or the specific model APIs slug, stored in OpenAI class
            temperature=temperature,
            max_tokens=max_tokens,
            api_base=api_base,
            api_key=api_key,
            additional_kwargs=additional_kwargs,
            max_retries=max_retries,
            callback_manager=callback_manager,
            default_headers=default_headers,
            system_prompt=system_prompt,
            messages_to_prompt=messages_to_prompt,
            completion_to_prompt=completion_to_prompt,
            pydantic_program_mode=pydantic_program_mode,
            output_parser=output_parser,
        )
        # Set webhook endpoint after parent initialization to avoid errors
        self.webhook_endpoint = webhook_endpoint
        self.model_apis = model_apis

    @property
    def available_models(self) -> List[Model]:
        """Get available models from Baseten Model APIs."""
        if not self.model_apis:
            # For dedicated deployments, return current model or empty list
            return [Model(id=self.model)] if hasattr(self, "model") else []

        # For Model APIs, fetch from the API dynamically
        return get_available_models_dynamic(self._get_client())

    @classmethod
    def class_name(cls) -> str:
        """Get class name."""
        return "Baseten_LLM"

    async def acomplete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
        """Async completion - requires webhook_endpoint for async API."""
        if not self.webhook_endpoint:
            raise ValueError(
                "webhook_endpoint must be provided for async operations with Baseten"
            )

        if self.model_apis:
            raise ValueError(
                "Async operations are not supported with model apis endpoints"
            )

        async with aiohttp.ClientSession() as session:
            headers = {"Authorization": f"Api-Key {self.api_key}"}
            payload = {
                "model_input": {
                    "prompt": prompt,
                    "temperature": self.temperature,
                    "max_tokens": self.max_tokens,
                    **kwargs,
                },
                "webhook_endpoint": self.webhook_endpoint,
            }

            async with session.post(
                DEFAULT_ASYNC_API_BASE.format(model_id=self.model),
                headers=headers,
                json=payload,
            ) as response:
                if response.status not in [200, 201]:
                    raise Exception(
                        f"Error from Baseten API: {await response.text()}, Response status: {response.status}"
                    )

                result = await response.json()
                request_id = result.get("request_id")

                return CompletionResponse(
                    text=request_id,  # Return request_id for tracking
                    raw=result,
                    additional_kwargs={"async_request": True},
                )

    @property
    def metadata(self) -> LLMMetadata:
        """Get LLM metadata."""
        return LLMMetadata(
            num_output=self.max_tokens,
            model_name=self.model,
            is_chat_model=True,  # Use chat completions for model APIs
        )

available_models property #

available_models: List[Model]

从 Baseten 模型 API 获取可用模型。

元数据 property #

metadata: LLMMetadata

获取LLM元数据。

class_name classmethod #

class_name() -> str

获取类名。

workflows/handler.py 中的源代码llama_index/llms/baseten/base.py
172
173
174
175
@classmethod
def class_name(cls) -> str:
    """Get class name."""
    return "Baseten_LLM"

完成 async #

acomplete(prompt: str, **kwargs: Any) -> CompletionResponse

异步完成 - 异步API需要webhook_endpoint参数。

workflows/handler.py 中的源代码llama_index/llms/baseten/base.py
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
async def acomplete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
    """Async completion - requires webhook_endpoint for async API."""
    if not self.webhook_endpoint:
        raise ValueError(
            "webhook_endpoint must be provided for async operations with Baseten"
        )

    if self.model_apis:
        raise ValueError(
            "Async operations are not supported with model apis endpoints"
        )

    async with aiohttp.ClientSession() as session:
        headers = {"Authorization": f"Api-Key {self.api_key}"}
        payload = {
            "model_input": {
                "prompt": prompt,
                "temperature": self.temperature,
                "max_tokens": self.max_tokens,
                **kwargs,
            },
            "webhook_endpoint": self.webhook_endpoint,
        }

        async with session.post(
            DEFAULT_ASYNC_API_BASE.format(model_id=self.model),
            headers=headers,
            json=payload,
        ) as response:
            if response.status not in [200, 201]:
                raise Exception(
                    f"Error from Baseten API: {await response.text()}, Response status: {response.status}"
                )

            result = await response.json()
            request_id = result.get("request_id")

            return CompletionResponse(
                text=request_id,  # Return request_id for tracking
                raw=result,
                additional_kwargs={"async_request": True},
            )

选项: 成员:- Baseten