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