diff --git a/agents-api/agents_api/activities/summarization.py b/agents-api/agents_api/activities/summarization.py index 581dcdb00..8a45927ee 100644 --- a/agents-api/agents_api/activities/summarization.py +++ b/agents-api/agents_api/activities/summarization.py @@ -1,23 +1,13 @@ #!/usr/bin/env python3 -import asyncio -from textwrap import dedent -from typing import Callable -from uuid import UUID import pandas as pd from temporalio import activity -# from agents_api.common.protocol.entries import Entry # from agents_api.models.entry.entries_summarization import ( # entries_summarization_query, # get_toplevel_entries_query, # ) -from agents_api.rec_sum.entities import get_entities -from agents_api.rec_sum.summarize import summarize_messages -from agents_api.rec_sum.trim import trim_messages - -from ..env import summarization_model_name # TODO: remove stubs diff --git a/agents-api/agents_api/activities/truncation.py b/agents-api/agents_api/activities/truncation.py index 353e4b570..7f381ac0f 100644 --- a/agents-api/agents_api/activities/truncation.py +++ b/agents-api/agents_api/activities/truncation.py @@ -2,9 +2,7 @@ from temporalio import activity -# from agents_api.autogen.openapi_model import Role -from agents_api.common.protocol.entries import Entry -from agents_api.models.entry.delete_entries import delete_entries +from agents_api.autogen.openapi_model import Entry # from agents_api.models.entry.entries_summarization import get_toplevel_entries_query @@ -13,8 +11,7 @@ def get_extra_entries(messages: list[Entry], token_count_threshold: int) -> list if not len(messages): return messages - result: list[UUID] = [] - token_cnt, offset = 0, 0 + _token_cnt, _offset = 0, 0 # if messages[0].role == Role.system: # token_cnt, offset = messages[0].token_count, 1 diff --git a/agents-api/agents_api/autogen/Entries.py b/agents-api/agents_api/autogen/Entries.py index b9921daa4..00070bd71 100644 --- a/agents-api/agents_api/autogen/Entries.py +++ b/agents-api/agents_api/autogen/Entries.py @@ -45,8 +45,8 @@ class BaseEntry(BaseModel): source: Literal[ "api_request", "api_response", "tool_response", "internal", "summarizer", "meta" ] - tokenizer: str | None = None - token_count: int | None = None + tokenizer: str + token_count: int timestamp: Annotated[float, Field(ge=0.0)] """ This is the time that this event refers to. diff --git a/agents-api/agents_api/autogen/openapi_model.py b/agents-api/agents_api/autogen/openapi_model.py index 16a57ac31..24640c46d 100644 --- a/agents-api/agents_api/autogen/openapi_model.py +++ b/agents-api/agents_api/autogen/openapi_model.py @@ -1,7 +1,9 @@ # ruff: noqa: F401, F403, F405 -from typing import Annotated, Generic, TypeVar +from typing import Annotated, Generic, Self, Type, TypeVar from uuid import UUID +from litellm.utils import _select_tokenizer as select_tokenizer +from litellm.utils import token_counter from pydantic import AwareDatetime, Field from pydantic_partial import create_partial_model @@ -34,7 +36,34 @@ "metadata", ) -ChatMLRole = BaseEntry.model_fields["role"].annotation +ChatMLRole = Literal[ + "user", + "assistant", + "system", + "function", + "function_response", + "function_call", + "auto", +] + +ChatMLContent = ( + list[ChatMLTextContentPart | ChatMLImageContentPart] + | Tool + | ChosenToolCall + | str + | ToolResponse + | list[ + list[ChatMLTextContentPart | ChatMLImageContentPart] + | Tool + | ChosenToolCall + | str + | ToolResponse + ] +) + +ChatMLSource = Literal[ + "api_request", "api_response", "tool_response", "internal", "summarizer", "meta" +] class CreateEntryRequest(BaseEntry): @@ -42,6 +71,32 @@ class CreateEntryRequest(BaseEntry): float, Field(ge=0.0, default_factory=lambda: utcnow().timestamp()) ] + @classmethod + def from_model_input( + cls: Type[Self], + model: str, + *, + role: ChatMLRole, + content: ChatMLContent, + name: str | None = None, + source: ChatMLSource, + **kwargs: dict, + ) -> Self: + tokenizer: dict = select_tokenizer(model=model) + token_count = token_counter( + model=model, messages=[{"role": role, "content": content, "name": name}] + ) + + return cls( + role=role, + content=content, + name=name, + source=source, + tokenizer=tokenizer["type"], + token_count=token_count, + **kwargs, + ) + def make_session( *, diff --git a/agents-api/agents_api/common/protocol/entries.py b/agents-api/agents_api/common/protocol/entries.py deleted file mode 100644 index 18d63f583..000000000 --- a/agents-api/agents_api/common/protocol/entries.py +++ /dev/null @@ -1,56 +0,0 @@ -import json -from typing import Literal -from uuid import UUID - -from pydantic import Field, computed_field - -from ...autogen.openapi_model import ( - ChatMLImageContentPart, - ChatMLTextContentPart, -) -from ...autogen.openapi_model import ( - Entry as BaseEntry, -) - -EntrySource = Literal["api_request", "api_response", "internal", "summarizer"] -Tokenizer = Literal["character_count"] - - -LOW_IMAGE_TOKEN_COUNT = 85 -HIGH_IMAGE_TOKEN_COUNT = 85 + 4 * 170 - - -class Entry(BaseEntry): - """Represents an entry in the system, encapsulating all necessary details such as ID, session ID, source, role, and content among others.""" - - session_id: UUID - token_count: int - tokenizer: str = Field(default="character_count") - - # TODO: Replace this with a proper implementation. - - # @computed_field - # @property - # def token_count(self) -> int: - # """Calculates the token count based on the content's character count. The tokenizer 'character_count' divides the length of the content by 3.5 to estimate the token count. Raises NotImplementedError for unknown tokenizers.""" - # if self.tokenizer == "character_count": - # content_length = 0 - # if isinstance(self.content, str): - # content_length = len(self.content) - # elif isinstance(self.content, dict): - # content_length = len(json.dumps(self.content)) - # elif isinstance(self.content, list): - # for part in self.content: - # if isinstance(part, ChatMLTextContentPart): - # content_length += len(part.text) - # elif isinstance(part, ChatMLImageContentPart): - # content_length += ( - # LOW_IMAGE_TOKEN_COUNT - # if part.image_url.detail == "low" - # else HIGH_IMAGE_TOKEN_COUNT - # ) - - # # Divide the content length by 3.5 to estimate token count based on character count. - # return int(content_length // 3.5) - - # raise NotImplementedError(f"Unknown tokenizer: {self.tokenizer}") diff --git a/agents-api/agents_api/routers/tasks/__init__.py b/agents-api/agents_api/routers/tasks/__init__.py index 8d67171c0..66621b34c 100644 --- a/agents-api/agents_api/routers/tasks/__init__.py +++ b/agents-api/agents_api/routers/tasks/__init__.py @@ -1,3 +1,4 @@ +# ruff: noqa: F401, F403, F405 from .create_task import create_task from .create_task_execution import create_task_execution from .get_execution_details import get_execution_details @@ -5,5 +6,5 @@ from .list_task_executions import list_task_executions from .list_tasks import list_tasks from .patch_execution import patch_execution -from .router import router # noqa: F401 +from .router import router from .update_execution import update_execution diff --git a/agents-api/agents_api/routers/tasks/get_execution_details.py b/agents-api/agents_api/routers/tasks/get_execution_details.py index 1377d7b22..6a9a01caa 100644 --- a/agents-api/agents_api/routers/tasks/get_execution_details.py +++ b/agents-api/agents_api/routers/tasks/get_execution_details.py @@ -1,5 +1,3 @@ -from uuid import uuid4 - from fastapi import HTTPException, status from pydantic import UUID4 diff --git a/agents-api/tests/test_chat_routes.py b/agents-api/tests/test_chat_routes.py index ccf91c89e..1e8065d9d 100644 --- a/agents-api/tests/test_chat_routes.py +++ b/agents-api/tests/test_chat_routes.py @@ -2,11 +2,12 @@ from ward import test -from agents_api.autogen.Sessions import CreateSessionRequest +from agents_api.autogen.openapi_model import ChatInput, CreateSessionRequest from agents_api.clients import embed, litellm +from agents_api.common.protocol.sessions import ChatContext +from agents_api.models.chat.gather_messages import gather_messages +from agents_api.models.chat.prepare_chat_context import prepare_chat_context from agents_api.models.session.create_session import create_session -from agents_api.models.session.prepare_chat_context import prepare_chat_context -from agents_api.routers.sessions.chat import get_messages from tests.fixtures import ( cozo_client, make_request, @@ -28,7 +29,7 @@ async def _( assert (await embed.embed())[0][0] == 1.0 -@test("chat: check that non-recall get_messages works") +@test("chat: check that non-recall gather_messages works") async def _( developer=test_developer, client=cozo_client, @@ -49,14 +50,13 @@ async def _( session_id = session.id - new_raw_messages = [{"role": "user", "content": "hello"}] + messages = [{"role": "user", "content": "hello"}] - past_messages, doc_references = await get_messages( + past_messages, doc_references = await gather_messages( developer=developer, session_id=session_id, - new_raw_messages=new_raw_messages, chat_context=chat_context, - recall=False, + chat_input=ChatInput(messages=messages, recall=False), ) assert isinstance(past_messages, list) @@ -68,7 +68,7 @@ async def _( embed.assert_not_called() -@test("chat: check that get_messages works") +@test("chat: check that gather_messages works") async def _( developer=test_developer, client=cozo_client, @@ -89,14 +89,13 @@ async def _( session_id = session.id - new_raw_messages = [{"role": "user", "content": "hello"}] + messages = [{"role": "user", "content": "hello"}] - past_messages, doc_references = await get_messages( + past_messages, doc_references = await gather_messages( developer=developer, session_id=session_id, - new_raw_messages=new_raw_messages, chat_context=chat_context, - recall=True, + chat_input=ChatInput(messages=messages, recall=True), ) assert isinstance(past_messages, list) @@ -136,3 +135,22 @@ async def _( # Check that both mocks were called at least once embed.assert_called() acompletion.assert_called() + + +@test("model: prepare chat context") +def _( + client=cozo_client, + developer_id=test_developer_id, + agent=test_agent, + session=test_session, + tool=test_tool, + user=test_user, +): + context = prepare_chat_context( + developer_id=developer_id, + session_id=session.id, + client=client, + ) + + assert isinstance(context, ChatContext) + assert len(context.toolsets) > 0 diff --git a/agents-api/tests/test_entry_queries.py b/agents-api/tests/test_entry_queries.py index ce8b6a00d..c6b7150b6 100644 --- a/agents-api/tests/test_entry_queries.py +++ b/agents-api/tests/test_entry_queries.py @@ -27,8 +27,8 @@ def _(client=cozo_client, developer_id=test_developer_id, session=test_session): Verifies that the entry can be successfully added using the create_entries function. """ - test_entry = CreateEntryRequest( - session_id=session.id, + test_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", source="internal", content="test entry content", @@ -50,8 +50,8 @@ def _(client=cozo_client, developer_id=test_developer_id, session=test_session): Verifies that the entry can be successfully added using the create_entries function. """ - test_entry = CreateEntryRequest( - session_id=session.id, + test_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", source="internal", content="test entry content", @@ -84,15 +84,15 @@ def _(client=cozo_client, developer_id=test_developer_id, session=test_session): Verifies that entries matching specific criteria can be successfully retrieved. """ - test_entry = CreateEntryRequest( - session_id=session.id, + test_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", source="api_request", content="test entry content", ) - internal_entry = CreateEntryRequest( - session_id=session.id, + internal_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", content="test entry content", source="internal", @@ -122,15 +122,15 @@ def _(client=cozo_client, developer_id=test_developer_id, session=test_session): Verifies that entries matching specific criteria can be successfully retrieved. """ - test_entry = CreateEntryRequest( - session_id=session.id, + test_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", source="api_request", content="test entry content", ) - internal_entry = CreateEntryRequest( - session_id=session.id, + internal_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", content="test entry content", source="internal", @@ -161,15 +161,15 @@ def _(client=cozo_client, developer_id=test_developer_id, session=test_session): Verifies that entries can be successfully deleted using the delete_entries function. """ - test_entry = CreateEntryRequest( - session_id=session.id, + test_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", source="api_request", content="test entry content", ) - internal_entry = CreateEntryRequest( - session_id=session.id, + internal_entry = CreateEntryRequest.from_model_input( + model=MODEL, role="user", content="internal entry content", source="internal", diff --git a/agents-api/tests/test_session_queries.py b/agents-api/tests/test_session_queries.py index 94b5bbbe4..7eae8485f 100644 --- a/agents-api/tests/test_session_queries.py +++ b/agents-api/tests/test_session_queries.py @@ -5,19 +5,16 @@ from agents_api.autogen.openapi_model import CreateOrUpdateSessionRequest, Session from agents_api.autogen.Sessions import CreateSessionRequest -from agents_api.common.protocol.sessions import ChatContext from agents_api.models.session.create_or_update_session import create_or_update_session from agents_api.models.session.create_session import create_session from agents_api.models.session.delete_session import delete_session from agents_api.models.session.get_session import get_session from agents_api.models.session.list_sessions import list_sessions -from agents_api.models.session.prepare_chat_context import prepare_chat_context from tests.fixtures import ( cozo_client, test_agent, test_developer_id, test_session, - test_tool, test_user, ) @@ -146,22 +143,3 @@ def _( assert result is not None assert isinstance(result, Session) assert result.id == session_id - - -@test("model: prepare chat context") -def _( - client=cozo_client, - developer_id=test_developer_id, - agent=test_agent, - session=test_session, - tool=test_tool, - user=test_user, -): - context = prepare_chat_context( - developer_id=developer_id, - session_id=session.id, - client=client, - ) - - assert isinstance(context, ChatContext) - assert len(context.toolsets) > 0 diff --git a/agents-api/tests/test_task_routes.py b/agents-api/tests/test_task_routes.py index b790240c4..9feb6f0df 100644 --- a/agents-api/tests/test_task_routes.py +++ b/agents-api/tests/test_task_routes.py @@ -1,5 +1,4 @@ # Tests for task routes -from uuid import uuid4 from ward import test @@ -52,149 +51,149 @@ def _(make_request=make_request, agent=test_agent): assert response.status_code == 201 -@test("route: create task execution") -def _(make_request=make_request): - task_id = str(uuid4()) - data = dict( - input={}, - metadata={}, - ) +# @test("route: create task execution") +# def _(make_request=make_request): +# task_id = str(uuid4()) +# data = dict( +# input={}, +# metadata={}, +# ) - response = make_request( - method="POST", - url=f"/tasks/{task_id}/executions", - json=data, - ) +# response = make_request( +# method="POST", +# url=f"/tasks/{task_id}/executions", +# json=data, +# ) - assert response.status_code == 201 +# assert response.status_code == 201 -@test("route: get execution not exists") -def _(make_request=make_request): - execution_id = str(uuid4()) +# @test("route: get execution not exists") +# def _(make_request=make_request): +# execution_id = str(uuid4()) - response = make_request( - method="GET", - url=f"/executions/{execution_id}", - ) +# response = make_request( +# method="GET", +# url=f"/executions/{execution_id}", +# ) - assert response.status_code == 404 +# assert response.status_code == 404 -@test("route: get execution exists") -def _(make_request=make_request): - execution_id = str(uuid4()) +# @test("route: get execution exists") +# def _(make_request=make_request): +# execution_id = str(uuid4()) - response = make_request( - method="GET", - url=f"/executions/{execution_id}", - ) +# response = make_request( +# method="GET", +# url=f"/executions/{execution_id}", +# ) - assert response.status_code == 200 +# assert response.status_code == 200 -@test("route: get task not exists") -def _(make_request=make_request): - data = dict( - name="test user", - main="test user about", - ) +# @test("route: get task not exists") +# def _(make_request=make_request): +# data = dict( +# name="test user", +# main="test user about", +# ) - response = make_request( - method="POST", - url="/tasks", - json=data, - ) +# response = make_request( +# method="POST", +# url="/tasks", +# json=data, +# ) - assert response.status_code == 201 +# assert response.status_code == 201 -@test("route: get task exists") -def _(make_request=make_request): - data = dict( - name="test user", - main="test user about", - ) +# @test("route: get task exists") +# def _(make_request=make_request): +# data = dict( +# name="test user", +# main="test user about", +# ) - response = make_request( - method="POST", - url="/tasks", - json=data, - ) +# response = make_request( +# method="POST", +# url="/tasks", +# json=data, +# ) - assert response.status_code == 201 +# assert response.status_code == 201 -@test("model: list execution transitions") -def _(make_request=make_request): - response = make_request( - method="GET", - url="/users", - ) +# @test("model: list execution transitions") +# def _(make_request=make_request): +# response = make_request( +# method="GET", +# url="/users", +# ) - assert response.status_code == 200 - response = response.json() - users = response["items"] +# assert response.status_code == 200 +# response = response.json() +# users = response["items"] - assert isinstance(users, list) - assert len(users) > 0 +# assert isinstance(users, list) +# assert len(users) > 0 -@test("model: list task executions") -def _(make_request=make_request): - response = make_request( - method="GET", - url="/users", - ) +# @test("model: list task executions") +# def _(make_request=make_request): +# response = make_request( +# method="GET", +# url="/users", +# ) - assert response.status_code == 200 - response = response.json() - users = response["items"] +# assert response.status_code == 200 +# response = response.json() +# users = response["items"] - assert isinstance(users, list) - assert len(users) > 0 +# assert isinstance(users, list) +# assert len(users) > 0 -@test("model: list tasks") -def _(make_request=make_request): - response = make_request( - method="GET", - url="/users", - ) +# @test("model: list tasks") +# def _(make_request=make_request): +# response = make_request( +# method="GET", +# url="/users", +# ) - assert response.status_code == 200 - response = response.json() - users = response["items"] +# assert response.status_code == 200 +# response = response.json() +# users = response["items"] - assert isinstance(users, list) - assert len(users) > 0 +# assert isinstance(users, list) +# assert len(users) > 0 -@test("model: patch execution") -def _(make_request=make_request): - response = make_request( - method="GET", - url="/users", - ) +# @test("model: patch execution") +# def _(make_request=make_request): +# response = make_request( +# method="GET", +# url="/users", +# ) - assert response.status_code == 200 - response = response.json() - users = response["items"] +# assert response.status_code == 200 +# response = response.json() +# users = response["items"] - assert isinstance(users, list) - assert len(users) > 0 +# assert isinstance(users, list) +# assert len(users) > 0 -@test("model: update execution") -def _(make_request=make_request): - response = make_request( - method="GET", - url="/users", - ) +# @test("model: update execution") +# def _(make_request=make_request): +# response = make_request( +# method="GET", +# url="/users", +# ) - assert response.status_code == 200 - response = response.json() - users = response["items"] +# assert response.status_code == 200 +# response = response.json() +# users = response["items"] - assert isinstance(users, list) - assert len(users) > 0 +# assert isinstance(users, list) +# assert len(users) > 0 diff --git a/sdks/python/julep/api/types/entries_base_entry.py b/sdks/python/julep/api/types/entries_base_entry.py index cd9a8158f..a12c99c1c 100644 --- a/sdks/python/julep/api/types/entries_base_entry.py +++ b/sdks/python/julep/api/types/entries_base_entry.py @@ -15,8 +15,8 @@ class EntriesBaseEntry(pydantic_v1.BaseModel): name: typing.Optional[str] = None content: EntriesBaseEntryContent source: EntriesBaseEntrySource - tokenizer: typing.Optional[str] = None - token_count: typing.Optional[int] = None + tokenizer: str + token_count: int timestamp: float = pydantic_v1.Field() """ This is the time that this event refers to. diff --git a/sdks/python/poetry.lock b/sdks/python/poetry.lock index 060ffa16f..fe5a1519d 100644 --- a/sdks/python/poetry.lock +++ b/sdks/python/poetry.lock @@ -848,21 +848,21 @@ test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "p [[package]] name = "importlib-resources" -version = "6.4.0" +version = "6.4.1" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "importlib_resources-6.4.1-py3-none-any.whl", hash = "sha256:8fbee7ba7376ca7c47ce8d31b96b93d8787349845f01ebdbee5ef90409035234"}, + {file = "importlib_resources-6.4.1.tar.gz", hash = "sha256:5ede8acf5d752abda46fb6922a4a6ab782b6d904dfd362bf2d8b857eee1759d9"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "ipykernel" @@ -2309,13 +2309,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.375" +version = "1.1.376" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.375-py3-none-any.whl", hash = "sha256:4c5e27eddeaee8b41cc3120736a1dda6ae120edf8523bb2446b6073a52f286e3"}, - {file = "pyright-1.1.375.tar.gz", hash = "sha256:7765557b0d6782b2fadabff455da2014476404c9e9214f49977a4e49dec19a0f"}, + {file = "pyright-1.1.376-py3-none-any.whl", hash = "sha256:0f2473b12c15c46b3207f0eec224c3cea2bdc07cd45dd4a037687cbbca0fbeff"}, + {file = "pyright-1.1.376.tar.gz", hash = "sha256:bffd63b197cd0810395bb3245c06b01f95a85ddf6bfa0e5644ed69c841e954dd"}, ] [package.dependencies] diff --git a/sdks/ts/src/api/models/Entries_BaseEntry.ts b/sdks/ts/src/api/models/Entries_BaseEntry.ts index e77df13c3..d397d851e 100644 --- a/sdks/ts/src/api/models/Entries_BaseEntry.ts +++ b/sdks/ts/src/api/models/Entries_BaseEntry.ts @@ -17,8 +17,8 @@ export type Entries_BaseEntry = { | "internal" | "summarizer" | "meta"; - tokenizer?: string; - token_count?: number; + tokenizer: string; + token_count: number; /** * This is the time that this event refers to. */ diff --git a/sdks/ts/src/api/schemas/$Entries_BaseEntry.ts b/sdks/ts/src/api/schemas/$Entries_BaseEntry.ts index 6aad5206a..bcdb7122e 100644 --- a/sdks/ts/src/api/schemas/$Entries_BaseEntry.ts +++ b/sdks/ts/src/api/schemas/$Entries_BaseEntry.ts @@ -37,9 +37,11 @@ export const $Entries_BaseEntry = { }, tokenizer: { type: "string", + isRequired: true, }, token_count: { type: "number", + isRequired: true, format: "uint16", }, timestamp: { diff --git a/typespec/entries/models.tsp b/typespec/entries/models.tsp index f9050b4f4..fba6803df 100644 --- a/typespec/entries/models.tsp +++ b/typespec/entries/models.tsp @@ -91,8 +91,8 @@ model BaseEntry { content: EntryContent | EntryContent[]; source: entrySource; - tokenizer?: string; - token_count?: uint16; + tokenizer: string; + token_count: uint16; /** This is the time that this event refers to. */ @minValue(0)