mirror of
https://github.com/eigent-ai/eigent.git
synced 2026-05-24 05:26:42 +00:00
184 lines
5.8 KiB
Python
184 lines
5.8 KiB
Python
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ========= Copyright 2023-2026 @ CAMEL-AI.org. All Rights Reserved. =========
|
|
import time
|
|
from typing import Any, Dict, List, Optional, Type, Union
|
|
|
|
from openai import AsyncStream, Stream
|
|
from pydantic import BaseModel
|
|
|
|
from camel.messages import OpenAIMessage
|
|
from camel.models import BaseModelBackend
|
|
from camel.types import (
|
|
ChatCompletion,
|
|
ChatCompletionChunk,
|
|
ChatCompletionMessage,
|
|
Choice,
|
|
CompletionUsage,
|
|
ModelType,
|
|
)
|
|
from camel.utils import BaseTokenCounter
|
|
|
|
|
|
class StubTokenCounter(BaseTokenCounter):
|
|
def count_tokens_from_messages(self, messages: List[OpenAIMessage]) -> int:
|
|
r"""Token counting for STUB models, directly returning a constant.
|
|
|
|
Args:
|
|
messages (List[OpenAIMessage]): Message list with the chat history
|
|
in OpenAI API format.
|
|
|
|
Returns:
|
|
int: A constant to act as the number of the tokens in the
|
|
messages.
|
|
"""
|
|
return 10
|
|
|
|
def encode(self, text: str) -> List[int]:
|
|
r"""Encode text into token IDs for STUB models.
|
|
|
|
Args:
|
|
text (str): The text to encode.
|
|
|
|
Returns:
|
|
List[int]: List of token IDs.
|
|
"""
|
|
# For stub models, just return a list of 0s with length proportional
|
|
# to text length
|
|
return [0] * (len(text) // 4 + 1) # Simple approximation
|
|
|
|
def decode(self, token_ids: List[int]) -> str:
|
|
r"""Decode token IDs back to text for STUB models.
|
|
|
|
Args:
|
|
token_ids (List[int]): List of token IDs to decode.
|
|
|
|
Returns:
|
|
str: Decoded text.
|
|
"""
|
|
# For stub models, return a placeholder string
|
|
return "[Stub decoded text]"
|
|
|
|
|
|
class StubModel(BaseModelBackend):
|
|
r"""A dummy model used for unit tests."""
|
|
|
|
model_type = ModelType.STUB
|
|
|
|
def __init__(
|
|
self,
|
|
model_type: Union[ModelType, str],
|
|
model_config_dict: Optional[Dict[str, Any]] = None,
|
|
api_key: Optional[str] = None,
|
|
url: Optional[str] = None,
|
|
token_counter: Optional[BaseTokenCounter] = None,
|
|
timeout: Optional[float] = None,
|
|
max_retries: int = 3,
|
|
) -> None:
|
|
r"""All arguments are unused for the dummy model."""
|
|
super().__init__(
|
|
model_type,
|
|
model_config_dict,
|
|
api_key,
|
|
url,
|
|
token_counter,
|
|
timeout,
|
|
max_retries,
|
|
)
|
|
|
|
@property
|
|
def token_counter(self) -> BaseTokenCounter:
|
|
r"""Initialize the token counter for the model backend.
|
|
|
|
Returns:
|
|
BaseTokenCounter: The token counter following the model's
|
|
tokenization style.
|
|
"""
|
|
if not self._token_counter:
|
|
self._token_counter = StubTokenCounter()
|
|
return self._token_counter
|
|
|
|
async def _arun(
|
|
self,
|
|
messages: List[OpenAIMessage],
|
|
response_format: Optional[Type[BaseModel]] = None,
|
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
) -> Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
r"""Run fake inference by returning a fixed string.
|
|
All arguments are unused for the dummy model.
|
|
|
|
Returns:
|
|
Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]:
|
|
The response from the dummy model.
|
|
"""
|
|
ARBITRARY_STRING = "Lorem Ipsum"
|
|
response: ChatCompletion = ChatCompletion(
|
|
id="stub_model_id",
|
|
model="stub",
|
|
object="chat.completion",
|
|
created=int(time.time()),
|
|
choices=[
|
|
Choice(
|
|
finish_reason="stop",
|
|
index=0,
|
|
message=ChatCompletionMessage(
|
|
content=ARBITRARY_STRING,
|
|
role="assistant",
|
|
),
|
|
logprobs=None,
|
|
)
|
|
],
|
|
usage=CompletionUsage(
|
|
completion_tokens=10,
|
|
prompt_tokens=10,
|
|
total_tokens=20,
|
|
),
|
|
)
|
|
return response
|
|
|
|
def _run(
|
|
self,
|
|
messages: List[OpenAIMessage],
|
|
response_format: Optional[Type[BaseModel]] = None,
|
|
tools: Optional[List[Dict[str, Any]]] = None,
|
|
) -> Union[ChatCompletion, Stream[ChatCompletionChunk]]:
|
|
r"""Run fake inference by returning a fixed string.
|
|
All arguments are unused for the dummy model.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Response in the OpenAI API format.
|
|
"""
|
|
ARBITRARY_STRING = "Lorem Ipsum"
|
|
response: ChatCompletion = ChatCompletion(
|
|
id="stub_model_id",
|
|
model="stub",
|
|
object="chat.completion",
|
|
created=int(time.time()),
|
|
choices=[
|
|
Choice(
|
|
finish_reason="stop",
|
|
index=0,
|
|
message=ChatCompletionMessage(
|
|
content=ARBITRARY_STRING,
|
|
role="assistant",
|
|
),
|
|
logprobs=None,
|
|
)
|
|
],
|
|
usage=CompletionUsage(
|
|
completion_tokens=10,
|
|
prompt_tokens=10,
|
|
total_tokens=20,
|
|
),
|
|
)
|
|
return response
|