diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 46b9b6b..3b005e5 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.1.0-alpha.9"
+ ".": "0.1.0-alpha.10"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index ab6c4a2..1eef7bb 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 20
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-945f9da9e9a4c4008834deef63e4346c0076e020eed3d3c98c249095033c1ac5.yml
-openapi_spec_hash: 522a44f6cb0677435fe2ac7693848ad7
-config_hash: 6c8822d278ba83456e5eed6d774ca230
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-15eeb028f79b9a065b4e54a6ea6a58631e9bd5004f97820f0c79d18e3f8bac84.yml
+openapi_spec_hash: 38c8bacb6c8e4c46852a3e81e3fb9fda
+config_hash: 348a85e725de595ca05a61f4333794ac
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 972ec89..8413cff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.1.0-alpha.10 (2025-07-06)
+
+Full Changelog: [v0.1.0-alpha.9...v0.1.0-alpha.10](https://github.com/sst/opencode-sdk-python/compare/v0.1.0-alpha.9...v0.1.0-alpha.10)
+
+### Features
+
+* **api:** manual updates ([fdab2a9](https://github.com/sst/opencode-sdk-python/commit/fdab2a9ee5b71d90b1c18c00f67e40247efae0e4))
+
## 0.1.0-alpha.9 (2025-07-05)
Full Changelog: [v0.1.0-alpha.8...v0.1.0-alpha.9](https://github.com/sst/opencode-sdk-python/compare/v0.1.0-alpha.8...v0.1.0-alpha.9)
diff --git a/api.md b/api.md
index 3d16f35..5d726d0 100644
--- a/api.md
+++ b/api.md
@@ -83,18 +83,19 @@ Types:
```python
from opencode_ai.types import (
+ AssistantMessage,
+ AssistantMessagePart,
FilePart,
Message,
- MessagePart,
- ReasoningPart,
Session,
- SourceURLPart,
StepStartPart,
TextPart,
- ToolCall,
- ToolInvocationPart,
- ToolPartialCall,
- ToolResult,
+ ToolPart,
+ ToolStateCompleted,
+ ToolStateError,
+ ToolStatePending,
+ ToolStateRunning,
+ UserMessagePart,
SessionListResponse,
SessionDeleteResponse,
SessionAbortResponse,
@@ -110,7 +111,7 @@ Methods:
- client.session.list() -> SessionListResponse
- client.session.delete(id) -> SessionDeleteResponse
- client.session.abort(id) -> SessionAbortResponse
-- client.session.chat(id, \*\*params) -> Message
+- client.session.chat(id, \*\*params) -> AssistantMessage
- client.session.init(id, \*\*params) -> SessionInitResponse
- client.session.messages(id) -> SessionMessagesResponse
- client.session.share(id) -> Session
diff --git a/pyproject.toml b/pyproject.toml
index df2fd2b..ab91c38 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "opencode-ai"
-version = "0.1.0-alpha.9"
+version = "0.1.0-alpha.10"
description = "The official Python library for the opencode API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/opencode_ai/_version.py b/src/opencode_ai/_version.py
index 3a7cd0d..0061474 100644
--- a/src/opencode_ai/_version.py
+++ b/src/opencode_ai/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "opencode_ai"
-__version__ = "0.1.0-alpha.9" # x-release-please-version
+__version__ = "0.1.0-alpha.10" # x-release-please-version
diff --git a/src/opencode_ai/resources/session.py b/src/opencode_ai/resources/session.py
index 2434b31..5c6286d 100644
--- a/src/opencode_ai/resources/session.py
+++ b/src/opencode_ai/resources/session.py
@@ -18,13 +18,13 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
-from ..types.message import Message
from ..types.session import Session
-from ..types.message_part_param import MessagePartParam
+from ..types.assistant_message import AssistantMessage
from ..types.session_init_response import SessionInitResponse
from ..types.session_list_response import SessionListResponse
from ..types.session_abort_response import SessionAbortResponse
from ..types.session_delete_response import SessionDeleteResponse
+from ..types.user_message_part_param import UserMessagePartParam
from ..types.session_messages_response import SessionMessagesResponse
from ..types.session_summarize_response import SessionSummarizeResponse
@@ -160,7 +160,7 @@ def chat(
id: str,
*,
model_id: str,
- parts: Iterable[MessagePartParam],
+ parts: Iterable[UserMessagePartParam],
provider_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -168,7 +168,7 @@ def chat(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
- ) -> Message:
+ ) -> AssistantMessage:
"""
Create and send a new message to a session
@@ -198,7 +198,7 @@ def chat(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=Message,
+ cast_to=AssistantMessage,
)
def init(
@@ -520,7 +520,7 @@ async def chat(
id: str,
*,
model_id: str,
- parts: Iterable[MessagePartParam],
+ parts: Iterable[UserMessagePartParam],
provider_id: str,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -528,7 +528,7 @@ async def chat(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
- ) -> Message:
+ ) -> AssistantMessage:
"""
Create and send a new message to a session
@@ -558,7 +558,7 @@ async def chat(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- cast_to=Message,
+ cast_to=AssistantMessage,
)
async def init(
diff --git a/src/opencode_ai/types/__init__.py b/src/opencode_ai/types/__init__.py
index edf0bf8..6c2ca47 100644
--- a/src/opencode_ai/types/__init__.py
+++ b/src/opencode_ai/types/__init__.py
@@ -13,43 +13,37 @@
from .file_part import FilePart as FilePart
from .mcp_local import McpLocal as McpLocal
from .text_part import TextPart as TextPart
-from .tool_call import ToolCall as ToolCall
+from .tool_part import ToolPart as ToolPart
from .mcp_remote import McpRemote as McpRemote
-from .tool_result import ToolResult as ToolResult
-from .message_part import MessagePart as MessagePart
-from .reasoning_part import ReasoningPart as ReasoningPart
from .file_part_param import FilePartParam as FilePartParam
-from .source_url_part import SourceURLPart as SourceURLPart
from .step_start_part import StepStartPart as StepStartPart
from .text_part_param import TextPartParam as TextPartParam
-from .tool_call_param import ToolCallParam as ToolCallParam
from .file_read_params import FileReadParams as FileReadParams
from .find_text_params import FindTextParams as FindTextParams
+from .tool_state_error import ToolStateError as ToolStateError
from .app_init_response import AppInitResponse as AppInitResponse
+from .assistant_message import AssistantMessage as AssistantMessage
from .find_files_params import FindFilesParams as FindFilesParams
-from .tool_partial_call import ToolPartialCall as ToolPartialCall
-from .tool_result_param import ToolResultParam as ToolResultParam
+from .user_message_part import UserMessagePart as UserMessagePart
from .file_read_response import FileReadResponse as FileReadResponse
from .find_text_response import FindTextResponse as FindTextResponse
-from .message_part_param import MessagePartParam as MessagePartParam
+from .tool_state_pending import ToolStatePending as ToolStatePending
+from .tool_state_running import ToolStateRunning as ToolStateRunning
from .event_list_response import EventListResponse as EventListResponse
from .find_files_response import FindFilesResponse as FindFilesResponse
from .find_symbols_params import FindSymbolsParams as FindSymbolsParams
from .session_chat_params import SessionChatParams as SessionChatParams
from .session_init_params import SessionInitParams as SessionInitParams
from .file_status_response import FileStatusResponse as FileStatusResponse
-from .reasoning_part_param import ReasoningPartParam as ReasoningPartParam
-from .tool_invocation_part import ToolInvocationPart as ToolInvocationPart
+from .tool_state_completed import ToolStateCompleted as ToolStateCompleted
from .find_symbols_response import FindSymbolsResponse as FindSymbolsResponse
from .session_init_response import SessionInitResponse as SessionInitResponse
from .session_list_response import SessionListResponse as SessionListResponse
-from .source_url_part_param import SourceURLPartParam as SourceURLPartParam
-from .step_start_part_param import StepStartPartParam as StepStartPartParam
+from .assistant_message_part import AssistantMessagePart as AssistantMessagePart
from .session_abort_response import SessionAbortResponse as SessionAbortResponse
from .session_delete_response import SessionDeleteResponse as SessionDeleteResponse
-from .tool_partial_call_param import ToolPartialCallParam as ToolPartialCallParam
+from .user_message_part_param import UserMessagePartParam as UserMessagePartParam
from .session_summarize_params import SessionSummarizeParams as SessionSummarizeParams
from .config_providers_response import ConfigProvidersResponse as ConfigProvidersResponse
from .session_messages_response import SessionMessagesResponse as SessionMessagesResponse
from .session_summarize_response import SessionSummarizeResponse as SessionSummarizeResponse
-from .tool_invocation_part_param import ToolInvocationPartParam as ToolInvocationPartParam
diff --git a/src/opencode_ai/types/assistant_message.py b/src/opencode_ai/types/assistant_message.py
new file mode 100644
index 0000000..a391913
--- /dev/null
+++ b/src/opencode_ai/types/assistant_message.py
@@ -0,0 +1,81 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Union, Optional
+from typing_extensions import Literal, Annotated, TypeAlias
+
+from pydantic import Field as FieldInfo
+
+from .._utils import PropertyInfo
+from .._models import BaseModel
+from .shared.unknown_error import UnknownError
+from .assistant_message_part import AssistantMessagePart
+from .shared.provider_auth_error import ProviderAuthError
+
+__all__ = ["AssistantMessage", "Path", "Time", "Tokens", "TokensCache", "Error", "ErrorMessageOutputLengthError"]
+
+
+class Path(BaseModel):
+ cwd: str
+
+ root: str
+
+
+class Time(BaseModel):
+ created: float
+
+ completed: Optional[float] = None
+
+
+class TokensCache(BaseModel):
+ read: float
+
+ write: float
+
+
+class Tokens(BaseModel):
+ cache: TokensCache
+
+ input: float
+
+ output: float
+
+ reasoning: float
+
+
+class ErrorMessageOutputLengthError(BaseModel):
+ data: object
+
+ name: Literal["MessageOutputLengthError"]
+
+
+Error: TypeAlias = Annotated[
+ Union[ProviderAuthError, UnknownError, ErrorMessageOutputLengthError], PropertyInfo(discriminator="name")
+]
+
+
+class AssistantMessage(BaseModel):
+ id: str
+
+ cost: float
+
+ api_model_id: str = FieldInfo(alias="modelID")
+
+ parts: List[AssistantMessagePart]
+
+ path: Path
+
+ provider_id: str = FieldInfo(alias="providerID")
+
+ role: Literal["assistant"]
+
+ session_id: str = FieldInfo(alias="sessionID")
+
+ system: List[str]
+
+ time: Time
+
+ tokens: Tokens
+
+ error: Optional[Error] = None
+
+ summary: Optional[bool] = None
diff --git a/src/opencode_ai/types/assistant_message_part.py b/src/opencode_ai/types/assistant_message_part.py
new file mode 100644
index 0000000..5ebccf4
--- /dev/null
+++ b/src/opencode_ai/types/assistant_message_part.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Annotated, TypeAlias
+
+from .._utils import PropertyInfo
+from .text_part import TextPart
+from .tool_part import ToolPart
+from .step_start_part import StepStartPart
+
+__all__ = ["AssistantMessagePart"]
+
+AssistantMessagePart: TypeAlias = Annotated[
+ Union[TextPart, ToolPart, StepStartPart], PropertyInfo(discriminator="type")
+]
diff --git a/src/opencode_ai/types/event_list_response.py b/src/opencode_ai/types/event_list_response.py
index caecaad..9ddd786 100644
--- a/src/opencode_ai/types/event_list_response.py
+++ b/src/opencode_ai/types/event_list_response.py
@@ -9,8 +9,8 @@
from .message import Message
from .session import Session
from .._models import BaseModel
-from .message_part import MessagePart
from .shared.unknown_error import UnknownError
+from .assistant_message_part import AssistantMessagePart
from .shared.provider_auth_error import ProviderAuthError
__all__ = [
@@ -22,10 +22,10 @@
"EventPermissionUpdatedPropertiesTime",
"EventFileEdited",
"EventFileEditedProperties",
- "EventStorageWrite",
- "EventStorageWriteProperties",
"EventInstallationUpdated",
"EventInstallationUpdatedProperties",
+ "EventStorageWrite",
+ "EventStorageWriteProperties",
"EventMessageUpdated",
"EventMessageUpdatedProperties",
"EventMessageRemoved",
@@ -91,6 +91,16 @@ class EventFileEdited(BaseModel):
type: Literal["file.edited"]
+class EventInstallationUpdatedProperties(BaseModel):
+ version: str
+
+
+class EventInstallationUpdated(BaseModel):
+ properties: EventInstallationUpdatedProperties
+
+ type: Literal["installation.updated"]
+
+
class EventStorageWriteProperties(BaseModel):
key: str
@@ -103,16 +113,6 @@ class EventStorageWrite(BaseModel):
type: Literal["storage.write"]
-class EventInstallationUpdatedProperties(BaseModel):
- version: str
-
-
-class EventInstallationUpdated(BaseModel):
- properties: EventInstallationUpdatedProperties
-
- type: Literal["installation.updated"]
-
-
class EventMessageUpdatedProperties(BaseModel):
info: Message
@@ -138,7 +138,7 @@ class EventMessageRemoved(BaseModel):
class EventMessagePartUpdatedProperties(BaseModel):
message_id: str = FieldInfo(alias="messageID")
- part: MessagePart
+ part: AssistantMessagePart
session_id: str = FieldInfo(alias="sessionID")
@@ -218,8 +218,8 @@ class EventFileWatcherUpdated(BaseModel):
EventLspClientDiagnostics,
EventPermissionUpdated,
EventFileEdited,
- EventStorageWrite,
EventInstallationUpdated,
+ EventStorageWrite,
EventMessageUpdated,
EventMessageRemoved,
EventMessagePartUpdated,
diff --git a/src/opencode_ai/types/file_part.py b/src/opencode_ai/types/file_part.py
index 50a46bb..af7bfa2 100644
--- a/src/opencode_ai/types/file_part.py
+++ b/src/opencode_ai/types/file_part.py
@@ -3,15 +3,13 @@
from typing import Optional
from typing_extensions import Literal
-from pydantic import Field as FieldInfo
-
from .._models import BaseModel
__all__ = ["FilePart"]
class FilePart(BaseModel):
- media_type: str = FieldInfo(alias="mediaType")
+ mime: str
type: Literal["file"]
diff --git a/src/opencode_ai/types/file_part_param.py b/src/opencode_ai/types/file_part_param.py
index 0416dce..ac4229e 100644
--- a/src/opencode_ai/types/file_part_param.py
+++ b/src/opencode_ai/types/file_part_param.py
@@ -2,15 +2,13 @@
from __future__ import annotations
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
+from typing_extensions import Literal, Required, TypedDict
__all__ = ["FilePartParam"]
class FilePartParam(TypedDict, total=False):
- media_type: Required[Annotated[str, PropertyInfo(alias="mediaType")]]
+ mime: Required[str]
type: Required[Literal["file"]]
diff --git a/src/opencode_ai/types/message.py b/src/opencode_ai/types/message.py
index d9810ff..30be928 100644
--- a/src/opencode_ai/types/message.py
+++ b/src/opencode_ai/types/message.py
@@ -1,125 +1,32 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import TYPE_CHECKING, Dict, List, Union, Optional
+from typing import List, Union
from typing_extensions import Literal, Annotated, TypeAlias
from pydantic import Field as FieldInfo
from .._utils import PropertyInfo
from .._models import BaseModel
-from .message_part import MessagePart
-from .shared.unknown_error import UnknownError
-from .shared.provider_auth_error import ProviderAuthError
+from .assistant_message import AssistantMessage
+from .user_message_part import UserMessagePart
-__all__ = [
- "Message",
- "Metadata",
- "MetadataTime",
- "MetadataTool",
- "MetadataToolTime",
- "MetadataAssistant",
- "MetadataAssistantPath",
- "MetadataAssistantTokens",
- "MetadataAssistantTokensCache",
- "MetadataError",
- "MetadataErrorMessageOutputLengthError",
-]
+__all__ = ["Message", "UserMessage", "UserMessageTime"]
-class MetadataTime(BaseModel):
+class UserMessageTime(BaseModel):
created: float
- completed: Optional[float] = None
-
-
-class MetadataToolTime(BaseModel):
- end: float
-
- start: float
-
-
-class MetadataTool(BaseModel):
- time: MetadataToolTime
-
- title: str
-
- snapshot: Optional[str] = None
-
- if TYPE_CHECKING:
- # Stub to indicate that arbitrary properties are accepted.
- # To access properties that are not valid identifiers you can use `getattr`, e.g.
- # `getattr(obj, '$type')`
- def __getattr__(self, attr: str) -> object: ...
-
-
-class MetadataAssistantPath(BaseModel):
- cwd: str
-
- root: str
-
-
-class MetadataAssistantTokensCache(BaseModel):
- read: float
-
- write: float
-
-
-class MetadataAssistantTokens(BaseModel):
- cache: MetadataAssistantTokensCache
-
- input: float
-
- output: float
-
- reasoning: float
-
-
-class MetadataAssistant(BaseModel):
- cost: float
-
- api_model_id: str = FieldInfo(alias="modelID")
-
- path: MetadataAssistantPath
-
- provider_id: str = FieldInfo(alias="providerID")
-
- system: List[str]
-
- tokens: MetadataAssistantTokens
-
- summary: Optional[bool] = None
-
-
-class MetadataErrorMessageOutputLengthError(BaseModel):
- data: object
-
- name: Literal["MessageOutputLengthError"]
+class UserMessage(BaseModel):
+ id: str
-MetadataError: TypeAlias = Annotated[
- Union[ProviderAuthError, UnknownError, MetadataErrorMessageOutputLengthError], PropertyInfo(discriminator="name")
-]
+ parts: List[UserMessagePart]
+ role: Literal["user"]
-class Metadata(BaseModel):
session_id: str = FieldInfo(alias="sessionID")
- time: MetadataTime
-
- tool: Dict[str, MetadataTool]
-
- assistant: Optional[MetadataAssistant] = None
-
- error: Optional[MetadataError] = None
-
- snapshot: Optional[str] = None
-
-
-class Message(BaseModel):
- id: str
-
- metadata: Metadata
+ time: UserMessageTime
- parts: List[MessagePart]
- role: Literal["user", "assistant"]
+Message: TypeAlias = Annotated[Union[UserMessage, AssistantMessage], PropertyInfo(discriminator="role")]
diff --git a/src/opencode_ai/types/message_part.py b/src/opencode_ai/types/message_part.py
deleted file mode 100644
index 0261530..0000000
--- a/src/opencode_ai/types/message_part.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Union
-from typing_extensions import Annotated, TypeAlias
-
-from .._utils import PropertyInfo
-from .file_part import FilePart
-from .text_part import TextPart
-from .reasoning_part import ReasoningPart
-from .source_url_part import SourceURLPart
-from .step_start_part import StepStartPart
-from .tool_invocation_part import ToolInvocationPart
-
-__all__ = ["MessagePart"]
-
-MessagePart: TypeAlias = Annotated[
- Union[TextPart, ReasoningPart, ToolInvocationPart, SourceURLPart, FilePart, StepStartPart],
- PropertyInfo(discriminator="type"),
-]
diff --git a/src/opencode_ai/types/message_part_param.py b/src/opencode_ai/types/message_part_param.py
deleted file mode 100644
index 636025e..0000000
--- a/src/opencode_ai/types/message_part_param.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-from typing_extensions import TypeAlias
-
-from .file_part_param import FilePartParam
-from .text_part_param import TextPartParam
-from .reasoning_part_param import ReasoningPartParam
-from .source_url_part_param import SourceURLPartParam
-from .step_start_part_param import StepStartPartParam
-from .tool_invocation_part_param import ToolInvocationPartParam
-
-__all__ = ["MessagePartParam"]
-
-MessagePartParam: TypeAlias = Union[
- TextPartParam, ReasoningPartParam, ToolInvocationPartParam, SourceURLPartParam, FilePartParam, StepStartPartParam
-]
diff --git a/src/opencode_ai/types/reasoning_part.py b/src/opencode_ai/types/reasoning_part.py
deleted file mode 100644
index f8826c4..0000000
--- a/src/opencode_ai/types/reasoning_part.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Dict, Optional
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["ReasoningPart"]
-
-
-class ReasoningPart(BaseModel):
- text: str
-
- type: Literal["reasoning"]
-
- provider_metadata: Optional[Dict[str, object]] = FieldInfo(alias="providerMetadata", default=None)
diff --git a/src/opencode_ai/types/reasoning_part_param.py b/src/opencode_ai/types/reasoning_part_param.py
deleted file mode 100644
index 68ee769..0000000
--- a/src/opencode_ai/types/reasoning_part_param.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Dict
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["ReasoningPartParam"]
-
-
-class ReasoningPartParam(TypedDict, total=False):
- text: Required[str]
-
- type: Required[Literal["reasoning"]]
-
- provider_metadata: Annotated[Dict[str, object], PropertyInfo(alias="providerMetadata")]
diff --git a/src/opencode_ai/types/session_chat_params.py b/src/opencode_ai/types/session_chat_params.py
index ab9cc4a..e1d6780 100644
--- a/src/opencode_ai/types/session_chat_params.py
+++ b/src/opencode_ai/types/session_chat_params.py
@@ -6,7 +6,7 @@
from typing_extensions import Required, Annotated, TypedDict
from .._utils import PropertyInfo
-from .message_part_param import MessagePartParam
+from .user_message_part_param import UserMessagePartParam
__all__ = ["SessionChatParams"]
@@ -14,6 +14,6 @@
class SessionChatParams(TypedDict, total=False):
model_id: Required[Annotated[str, PropertyInfo(alias="modelID")]]
- parts: Required[Iterable[MessagePartParam]]
+ parts: Required[Iterable[UserMessagePartParam]]
provider_id: Required[Annotated[str, PropertyInfo(alias="providerID")]]
diff --git a/src/opencode_ai/types/source_url_part.py b/src/opencode_ai/types/source_url_part.py
deleted file mode 100644
index ce6b305..0000000
--- a/src/opencode_ai/types/source_url_part.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Dict, Optional
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["SourceURLPart"]
-
-
-class SourceURLPart(BaseModel):
- source_id: str = FieldInfo(alias="sourceId")
-
- type: Literal["source-url"]
-
- url: str
-
- provider_metadata: Optional[Dict[str, object]] = FieldInfo(alias="providerMetadata", default=None)
-
- title: Optional[str] = None
diff --git a/src/opencode_ai/types/source_url_part_param.py b/src/opencode_ai/types/source_url_part_param.py
deleted file mode 100644
index 81d0fd8..0000000
--- a/src/opencode_ai/types/source_url_part_param.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Dict
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["SourceURLPartParam"]
-
-
-class SourceURLPartParam(TypedDict, total=False):
- source_id: Required[Annotated[str, PropertyInfo(alias="sourceId")]]
-
- type: Required[Literal["source-url"]]
-
- url: Required[str]
-
- provider_metadata: Annotated[Dict[str, object], PropertyInfo(alias="providerMetadata")]
-
- title: str
diff --git a/src/opencode_ai/types/step_start_part_param.py b/src/opencode_ai/types/step_start_part_param.py
deleted file mode 100644
index bcd3666..0000000
--- a/src/opencode_ai/types/step_start_part_param.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, TypedDict
-
-__all__ = ["StepStartPartParam"]
-
-
-class StepStartPartParam(TypedDict, total=False):
- type: Required[Literal["step-start"]]
diff --git a/src/opencode_ai/types/tool_call.py b/src/opencode_ai/types/tool_call.py
deleted file mode 100644
index 88d0869..0000000
--- a/src/opencode_ai/types/tool_call.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["ToolCall"]
-
-
-class ToolCall(BaseModel):
- state: Literal["call"]
-
- tool_call_id: str = FieldInfo(alias="toolCallId")
-
- tool_name: str = FieldInfo(alias="toolName")
-
- args: Optional[object] = None
-
- step: Optional[float] = None
diff --git a/src/opencode_ai/types/tool_call_param.py b/src/opencode_ai/types/tool_call_param.py
deleted file mode 100644
index 065f511..0000000
--- a/src/opencode_ai/types/tool_call_param.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["ToolCallParam"]
-
-
-class ToolCallParam(TypedDict, total=False):
- state: Required[Literal["call"]]
-
- tool_call_id: Required[Annotated[str, PropertyInfo(alias="toolCallId")]]
-
- tool_name: Required[Annotated[str, PropertyInfo(alias="toolName")]]
-
- args: object
-
- step: float
diff --git a/src/opencode_ai/types/tool_invocation_part.py b/src/opencode_ai/types/tool_invocation_part.py
deleted file mode 100644
index 7d63622..0000000
--- a/src/opencode_ai/types/tool_invocation_part.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Union
-from typing_extensions import Literal, Annotated, TypeAlias
-
-from pydantic import Field as FieldInfo
-
-from .._utils import PropertyInfo
-from .._models import BaseModel
-from .tool_call import ToolCall
-from .tool_result import ToolResult
-from .tool_partial_call import ToolPartialCall
-
-__all__ = ["ToolInvocationPart", "ToolInvocation"]
-
-ToolInvocation: TypeAlias = Annotated[Union[ToolCall, ToolPartialCall, ToolResult], PropertyInfo(discriminator="state")]
-
-
-class ToolInvocationPart(BaseModel):
- tool_invocation: ToolInvocation = FieldInfo(alias="toolInvocation")
-
- type: Literal["tool-invocation"]
diff --git a/src/opencode_ai/types/tool_invocation_part_param.py b/src/opencode_ai/types/tool_invocation_part_param.py
deleted file mode 100644
index d19221e..0000000
--- a/src/opencode_ai/types/tool_invocation_part_param.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-from typing_extensions import Literal, Required, Annotated, TypeAlias, TypedDict
-
-from .._utils import PropertyInfo
-from .tool_call_param import ToolCallParam
-from .tool_result_param import ToolResultParam
-from .tool_partial_call_param import ToolPartialCallParam
-
-__all__ = ["ToolInvocationPartParam", "ToolInvocation"]
-
-ToolInvocation: TypeAlias = Union[ToolCallParam, ToolPartialCallParam, ToolResultParam]
-
-
-class ToolInvocationPartParam(TypedDict, total=False):
- tool_invocation: Required[Annotated[ToolInvocation, PropertyInfo(alias="toolInvocation")]]
-
- type: Required[Literal["tool-invocation"]]
diff --git a/src/opencode_ai/types/tool_part.py b/src/opencode_ai/types/tool_part.py
new file mode 100644
index 0000000..cf5015d
--- /dev/null
+++ b/src/opencode_ai/types/tool_part.py
@@ -0,0 +1,27 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Literal, Annotated, TypeAlias
+
+from .._utils import PropertyInfo
+from .._models import BaseModel
+from .tool_state_error import ToolStateError
+from .tool_state_pending import ToolStatePending
+from .tool_state_running import ToolStateRunning
+from .tool_state_completed import ToolStateCompleted
+
+__all__ = ["ToolPart", "State"]
+
+State: TypeAlias = Annotated[
+ Union[ToolStatePending, ToolStateRunning, ToolStateCompleted, ToolStateError], PropertyInfo(discriminator="status")
+]
+
+
+class ToolPart(BaseModel):
+ id: str
+
+ state: State
+
+ tool: str
+
+ type: Literal["tool"]
diff --git a/src/opencode_ai/types/tool_partial_call.py b/src/opencode_ai/types/tool_partial_call.py
deleted file mode 100644
index 67a3601..0000000
--- a/src/opencode_ai/types/tool_partial_call.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["ToolPartialCall"]
-
-
-class ToolPartialCall(BaseModel):
- state: Literal["partial-call"]
-
- tool_call_id: str = FieldInfo(alias="toolCallId")
-
- tool_name: str = FieldInfo(alias="toolName")
-
- args: Optional[object] = None
-
- step: Optional[float] = None
diff --git a/src/opencode_ai/types/tool_partial_call_param.py b/src/opencode_ai/types/tool_partial_call_param.py
deleted file mode 100644
index 0a64fe6..0000000
--- a/src/opencode_ai/types/tool_partial_call_param.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["ToolPartialCallParam"]
-
-
-class ToolPartialCallParam(TypedDict, total=False):
- state: Required[Literal["partial-call"]]
-
- tool_call_id: Required[Annotated[str, PropertyInfo(alias="toolCallId")]]
-
- tool_name: Required[Annotated[str, PropertyInfo(alias="toolName")]]
-
- args: object
-
- step: float
diff --git a/src/opencode_ai/types/tool_result.py b/src/opencode_ai/types/tool_result.py
deleted file mode 100644
index 3ffee82..0000000
--- a/src/opencode_ai/types/tool_result.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from typing_extensions import Literal
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["ToolResult"]
-
-
-class ToolResult(BaseModel):
- result: str
-
- state: Literal["result"]
-
- tool_call_id: str = FieldInfo(alias="toolCallId")
-
- tool_name: str = FieldInfo(alias="toolName")
-
- args: Optional[object] = None
-
- step: Optional[float] = None
diff --git a/src/opencode_ai/types/tool_result_param.py b/src/opencode_ai/types/tool_result_param.py
deleted file mode 100644
index 249e95c..0000000
--- a/src/opencode_ai/types/tool_result_param.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-
-__all__ = ["ToolResultParam"]
-
-
-class ToolResultParam(TypedDict, total=False):
- result: Required[str]
-
- state: Required[Literal["result"]]
-
- tool_call_id: Required[Annotated[str, PropertyInfo(alias="toolCallId")]]
-
- tool_name: Required[Annotated[str, PropertyInfo(alias="toolName")]]
-
- args: object
-
- step: float
diff --git a/src/opencode_ai/types/tool_state_completed.py b/src/opencode_ai/types/tool_state_completed.py
new file mode 100644
index 0000000..6c9eb63
--- /dev/null
+++ b/src/opencode_ai/types/tool_state_completed.py
@@ -0,0 +1,28 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Dict, Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["ToolStateCompleted", "Time"]
+
+
+class Time(BaseModel):
+ end: float
+
+ start: float
+
+
+class ToolStateCompleted(BaseModel):
+ metadata: Dict[str, object]
+
+ output: str
+
+ status: Literal["completed"]
+
+ time: Time
+
+ title: str
+
+ input: Optional[object] = None
diff --git a/src/opencode_ai/types/tool_state_error.py b/src/opencode_ai/types/tool_state_error.py
new file mode 100644
index 0000000..1e8eced
--- /dev/null
+++ b/src/opencode_ai/types/tool_state_error.py
@@ -0,0 +1,24 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["ToolStateError", "Time"]
+
+
+class Time(BaseModel):
+ end: float
+
+ start: float
+
+
+class ToolStateError(BaseModel):
+ error: str
+
+ status: Literal["error"]
+
+ time: Time
+
+ input: Optional[object] = None
diff --git a/src/opencode_ai/types/tool_state_pending.py b/src/opencode_ai/types/tool_state_pending.py
new file mode 100644
index 0000000..c678c92
--- /dev/null
+++ b/src/opencode_ai/types/tool_state_pending.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["ToolStatePending"]
+
+
+class ToolStatePending(BaseModel):
+ status: Literal["pending"]
diff --git a/src/opencode_ai/types/tool_state_running.py b/src/opencode_ai/types/tool_state_running.py
new file mode 100644
index 0000000..87e2e8d
--- /dev/null
+++ b/src/opencode_ai/types/tool_state_running.py
@@ -0,0 +1,24 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Dict, Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["ToolStateRunning", "Time"]
+
+
+class Time(BaseModel):
+ start: float
+
+
+class ToolStateRunning(BaseModel):
+ status: Literal["running"]
+
+ time: Time
+
+ input: Optional[object] = None
+
+ metadata: Optional[Dict[str, object]] = None
+
+ title: Optional[str] = None
diff --git a/src/opencode_ai/types/user_message_part.py b/src/opencode_ai/types/user_message_part.py
new file mode 100644
index 0000000..000d6c4
--- /dev/null
+++ b/src/opencode_ai/types/user_message_part.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Annotated, TypeAlias
+
+from .._utils import PropertyInfo
+from .file_part import FilePart
+from .text_part import TextPart
+
+__all__ = ["UserMessagePart"]
+
+UserMessagePart: TypeAlias = Annotated[Union[TextPart, FilePart], PropertyInfo(discriminator="type")]
diff --git a/src/opencode_ai/types/user_message_part_param.py b/src/opencode_ai/types/user_message_part_param.py
new file mode 100644
index 0000000..f516c35
--- /dev/null
+++ b/src/opencode_ai/types/user_message_part_param.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import TypeAlias
+
+from .file_part_param import FilePartParam
+from .text_part_param import TextPartParam
+
+__all__ = ["UserMessagePartParam"]
+
+UserMessagePartParam: TypeAlias = Union[TextPartParam, FilePartParam]
diff --git a/tests/api_resources/test_session.py b/tests/api_resources/test_session.py
index 01e920c..0993082 100644
--- a/tests/api_resources/test_session.py
+++ b/tests/api_resources/test_session.py
@@ -10,8 +10,8 @@
from opencode_ai import Opencode, AsyncOpencode
from tests.utils import assert_matches_type
from opencode_ai.types import (
- Message,
Session,
+ AssistantMessage,
SessionInitResponse,
SessionListResponse,
SessionAbortResponse,
@@ -180,7 +180,7 @@ def test_method_chat(self, client: Opencode) -> None:
],
provider_id="providerID",
)
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
@pytest.mark.skip()
@parametrize
@@ -200,7 +200,7 @@ def test_raw_response_chat(self, client: Opencode) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
session = response.parse()
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
@pytest.mark.skip()
@parametrize
@@ -220,7 +220,7 @@ def test_streaming_response_chat(self, client: Opencode) -> None:
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
session = response.parse()
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -626,7 +626,7 @@ async def test_method_chat(self, async_client: AsyncOpencode) -> None:
],
provider_id="providerID",
)
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
@pytest.mark.skip()
@parametrize
@@ -646,7 +646,7 @@ async def test_raw_response_chat(self, async_client: AsyncOpencode) -> None:
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
session = await response.parse()
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
@pytest.mark.skip()
@parametrize
@@ -666,7 +666,7 @@ async def test_streaming_response_chat(self, async_client: AsyncOpencode) -> Non
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
session = await response.parse()
- assert_matches_type(Message, session, path=["response"])
+ assert_matches_type(AssistantMessage, session, path=["response"])
assert cast(Any, response.is_closed) is True