161 lines
36 KiB
Python
161 lines
36 KiB
Python
# -*- coding: utf-8 -*-
|
|
# pylint: disable=line-too-long
|
|
# flake8: noqa: E501
|
|
"""The unittests for OpenAI token counter."""
|
|
import os
|
|
from unittest.async_case import IsolatedAsyncioTestCase
|
|
|
|
from agentscope.token import OpenAITokenCounter
|
|
|
|
|
|
class OpenAITokenCounterTest(IsolatedAsyncioTestCase):
|
|
"""The unittests for the OpenAI token counter."""
|
|
|
|
async def asyncSetUp(self) -> None:
|
|
"""Set up the test case."""
|
|
self.image_path = os.path.abspath("./image.png")
|
|
self.messages = [
|
|
{
|
|
"role": "system",
|
|
"name": "system",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "You're a helpful assistant.",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "user",
|
|
"name": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "What is the capital of France?",
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "data:image/png;base64,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",
|
|
},
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "assistant",
|
|
"name": "assistant",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "The capital of France is Paris.",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "user",
|
|
"name": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "What is the capital of Germany?",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "assistant",
|
|
"name": "assistant",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "The capital of Germany is Berlin.",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "user",
|
|
"name": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "What is the capital of Japan?",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "assistant",
|
|
"name": "assistant",
|
|
"content": None,
|
|
"tool_calls": [
|
|
{
|
|
"id": "1",
|
|
"type": "function",
|
|
"function": {
|
|
"name": "get_capital",
|
|
"arguments": '{"country": "Japan"}',
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"role": "tool",
|
|
"tool_call_id": "1",
|
|
"content": "The capital of Japan is Tokyo.",
|
|
},
|
|
{
|
|
"role": "assistant",
|
|
"name": "assistant",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "The capital of Japan is Tokyo.",
|
|
},
|
|
],
|
|
},
|
|
]
|
|
self.tools = [
|
|
{
|
|
"type": "function",
|
|
"function": {
|
|
"name": "get_location",
|
|
"description": "Get the location of the user",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
"city": {
|
|
"type": "string",
|
|
"description": "The city to get the location "
|
|
"for",
|
|
},
|
|
},
|
|
"required": ["city"],
|
|
},
|
|
},
|
|
},
|
|
]
|
|
|
|
async def test_openai_token_counter(self) -> None:
|
|
"""Test the OpenAI token counter."""
|
|
counter = OpenAITokenCounter(
|
|
model_name="gpt-4o-mini",
|
|
)
|
|
n_tokens = await counter.count(self.messages)
|
|
self.assertEqual(n_tokens, 2016)
|
|
|
|
n_tokens = await counter.count(self.messages, self.tools)
|
|
self.assertEqual(n_tokens, 2058)
|
|
|
|
counter = OpenAITokenCounter(
|
|
model_name="o3-mini",
|
|
)
|
|
n_tokens = await counter.count(self.messages)
|
|
self.assertEqual(n_tokens, 1796)
|
|
|
|
n_tokens = await counter.count(self.messages, self.tools)
|
|
self.assertEqual(n_tokens, 1841)
|