From 581e581480ac98e0fed61eacc36e90a44e3b99fc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 03:38:35 +0000 Subject: [PATCH 1/5] chore(internal): avoid errors for isinstance checks on proxies --- src/contextual/_utils/_proxy.py | 5 ++++- tests/test_utils/test_proxy.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/contextual/_utils/_proxy.py b/src/contextual/_utils/_proxy.py index ffd883e9..0f239a33 100644 --- a/src/contextual/_utils/_proxy.py +++ b/src/contextual/_utils/_proxy.py @@ -46,7 +46,10 @@ def __dir__(self) -> Iterable[str]: @property # type: ignore @override def __class__(self) -> type: # pyright: ignore - proxied = self.__get_proxied__() + try: + proxied = self.__get_proxied__() + except Exception: + return type(self) if issubclass(type(proxied), LazyProxy): return type(proxied) return proxied.__class__ diff --git a/tests/test_utils/test_proxy.py b/tests/test_utils/test_proxy.py index 5584d77c..e5f42b96 100644 --- a/tests/test_utils/test_proxy.py +++ b/tests/test_utils/test_proxy.py @@ -21,3 +21,14 @@ def test_recursive_proxy() -> None: assert dir(proxy) == [] assert type(proxy).__name__ == "RecursiveLazyProxy" assert type(operator.attrgetter("name.foo.bar.baz")(proxy)).__name__ == "RecursiveLazyProxy" + + +def test_isinstance_does_not_error() -> None: + class AlwaysErrorProxy(LazyProxy[Any]): + @override + def __load__(self) -> Any: + raise RuntimeError("Mocking missing dependency") + + proxy = AlwaysErrorProxy() + assert not isinstance(proxy, dict) + assert isinstance(proxy, LazyProxy) From cb94e101a87b8abec57d46667fecef7a3079765f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 15:28:04 +0000 Subject: [PATCH 2/5] fix(tests): correct number examples --- tests/api_resources/agents/test_tune.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/api_resources/agents/test_tune.py b/tests/api_resources/agents/test_tune.py index 83f66694..c9dacef9 100644 --- a/tests/api_resources/agents/test_tune.py +++ b/tests/api_resources/agents/test_tune.py @@ -28,7 +28,7 @@ def test_method_create(self, client: ContextualAI) -> None: def test_method_create_with_all_params(self, client: ContextualAI) -> None: tune = client.agents.tune.create( agent_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", - hyperparams_learning_rate=0.001, + hyperparams_learning_rate=0.05, hyperparams_lora_alpha=8, hyperparams_lora_dropout=0, hyperparams_lora_rank=8, @@ -90,7 +90,7 @@ async def test_method_create(self, async_client: AsyncContextualAI) -> None: async def test_method_create_with_all_params(self, async_client: AsyncContextualAI) -> None: tune = await async_client.agents.tune.create( agent_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", - hyperparams_learning_rate=0.001, + hyperparams_learning_rate=0.05, hyperparams_lora_alpha=8, hyperparams_lora_dropout=0, hyperparams_lora_rank=8, From 109de24d9c76aaa1d90fff8dfc816e5cfbfab50a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 15:24:12 +0000 Subject: [PATCH 3/5] fix(package): support direct resource imports --- src/contextual/__init__.py | 5 +++++ src/contextual/_utils/_resources_proxy.py | 24 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/contextual/_utils/_resources_proxy.py diff --git a/src/contextual/__init__.py b/src/contextual/__init__.py index 01e5cb7f..c9d08958 100644 --- a/src/contextual/__init__.py +++ b/src/contextual/__init__.py @@ -1,5 +1,7 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +import typing as _t + from . import types from ._types import NOT_GIVEN, Omit, NoneType, NotGiven, Transport, ProxiesTypes from ._utils import file_from_path @@ -78,6 +80,9 @@ "DefaultAsyncHttpxClient", ] +if not _t.TYPE_CHECKING: + from ._utils._resources_proxy import resources as resources + _setup_logging() # Update the __module__ attribute for exported symbols so that diff --git a/src/contextual/_utils/_resources_proxy.py b/src/contextual/_utils/_resources_proxy.py new file mode 100644 index 00000000..a525fa9e --- /dev/null +++ b/src/contextual/_utils/_resources_proxy.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import Any +from typing_extensions import override + +from ._proxy import LazyProxy + + +class ResourcesProxy(LazyProxy[Any]): + """A proxy for the `contextual.resources` module. + + This is used so that we can lazily import `contextual.resources` only when + needed *and* so that users can just import `contextual` and reference `contextual.resources` + """ + + @override + def __load__(self) -> Any: + import importlib + + mod = importlib.import_module("contextual.resources") + return mod + + +resources = ResourcesProxy().__as_proxied__() From 656a0e19d78fe677a1a859bff114511acd58fa87 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 05:26:32 +0000 Subject: [PATCH 4/5] feat(api): update via SDK Studio --- .stats.yml | 4 +- src/contextual/resources/parse.py | 86 ++++++++++--------- src/contextual/types/parse_create_params.py | 25 +++--- .../types/parse_job_results_params.py | 4 +- .../types/parse_job_results_response.py | 68 ++++++++------- 5 files changed, 98 insertions(+), 89 deletions(-) diff --git a/.stats.yml b/.stats.yml index 525d18cd..aa7b0060 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 52 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/contextual-ai%2Fsunrise-17bdb8a33fb4fcade827bba868bd65cd30c64b1d09b4a6d83c3e37a8439ed37f.yml -openapi_spec_hash: bc325b52f3b20d8c56e0be5de88f2dc3 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/contextual-ai%2Fsunrise-8d75c58c83d13f67b6a125c3eb4639d213c91aec7dbb6e06f0cd5bdfc074d54e.yml +openapi_spec_hash: 47795284631814d0f8eb42f6a0d5a3b3 config_hash: 1ecef0ff4fd125bbc00eec65e3dd4798 diff --git a/src/contextual/resources/parse.py b/src/contextual/resources/parse.py index 4c80c491..24806cf9 100644 --- a/src/contextual/resources/parse.py +++ b/src/contextual/resources/parse.py @@ -65,39 +65,42 @@ def create( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, ) -> ParseCreateResponse: - """Parse a file into a structured Markdown representation. + """Parse a file into a structured Markdown and/or JSON. - The file size must be - less than 100MB and the number of pages must be less than 400. + Files must be less than + 100MB and 400 pages. We use LibreOffice to convert DOC(X) and PPT(X) files to + PDF, which may affect page count. + See our [blog post](https://contextual.ai/blog/document-parser-for-rag) and + [code examples](https://github.com/ContextualAI/examples/blob/main/03-standalone-api/04-parse/parse.ipynb). Email [parse-feedback@contextual.ai](mailto:parse-feedback@contextual.ai) with any feedback or questions. Args: raw_file: The file to be parsed. The file type must be PDF, DOC / DOCX, PPT / PPTX. - enable_document_hierarchy: Controls parsing heading levels (e.g. H1, H2, H3) at higher quality. Adds a - table of contents to the output with the structure of the entire parsed - document. Not permitted in 'basic' parsing_mode, or if page_range is not - continuous and/or does not start from page zero. + enable_document_hierarchy: Adds a table of contents to the output with the structure of the entire parsed + document. This feature is in beta. Controls parsing heading levels (e.g. H1, H2, + H3) at higher quality. Not permitted in `basic` parsing_mode, or if page_range + is not continuous and/or does not start from page zero. enable_split_tables: Controls whether tables are split into multiple tables by row with the headers propagated. Use for improving LLM comprehension of very large tables. Not - permitted in 'basic' parsing_mode. + permitted in `basic` parsing_mode. - figure_caption_mode: Controls how thorough figure captions are. 'concise' is short and minimizes - chances of hallucinations. 'detailed' is more thorough and can include - commentary. Not permitted in 'basic' parsing_mode. + figure_caption_mode: Controls how thorough figure captions are. `concise` is short and minimizes + chances of hallucinations. `detailed` is more thorough and can include + commentary; this mode is in beta. Not permitted in `basic` parsing_mode. max_split_table_cells: Threshold number of table cells beyond which large tables are split if - `enable_split_tables` is True. Not permitted in 'basic' parsing_mode. + `enable_split_tables` is True. Not permitted in `basic` parsing_mode. page_range: Optional string representing page range to be parsed. Format: comma-separated - indexes (0-based) e.g. '0,1,2,5,6' or ranges (inclusive of both ends) e.g. - '0-2,5,6' + indexes (0-based, e.g. `0,1,2,5,6`), or ranges inclusive of both ends (e.g. + `0-2,5,6`) - parse_mode: The settings to use for parsing. 'basic' is for simple, text-only documents. - 'standard' is for complex documents with images, complex hierarchy, and/or no + parse_mode: The settings to use for parsing. `basic` is for simple, text-only documents. + `standard` is for complex documents with images, complex hierarchy, and/or no natively encoded textual data (e.g. for scanned documents). extra_headers: Send extra headers @@ -156,11 +159,11 @@ def job_results( job_id: Unique ID of the parse job output_types: The desired output format(s) of the parsed file. Must be `markdown-document`, - `markdown-per-page`, and/or `blocks-per-page`. `markdown-document` parses the - whole document into a single concatenated markdown output. `markdown-per-page` - provides markdown output per page. `blocks-per-page` provides a structured JSON + `markdown-per-page`, and/or `blocks-per-page`. Specify multiple values to get + multiple formats in the response. `markdown-document` parses the whole document + into a single concatenated markdown output. `markdown-per-page` provides + markdown output per page. `blocks-per-page` provides a structured JSON representation of the content blocks on each page, sorted by reading order. - Specify multiple values to get multiple formats in the response. extra_headers: Send extra headers @@ -298,39 +301,42 @@ async def create( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, ) -> ParseCreateResponse: - """Parse a file into a structured Markdown representation. + """Parse a file into a structured Markdown and/or JSON. - The file size must be - less than 100MB and the number of pages must be less than 400. + Files must be less than + 100MB and 400 pages. We use LibreOffice to convert DOC(X) and PPT(X) files to + PDF, which may affect page count. + See our [blog post](https://contextual.ai/blog/document-parser-for-rag) and + [code examples](https://github.com/ContextualAI/examples/blob/main/03-standalone-api/04-parse/parse.ipynb). Email [parse-feedback@contextual.ai](mailto:parse-feedback@contextual.ai) with any feedback or questions. Args: raw_file: The file to be parsed. The file type must be PDF, DOC / DOCX, PPT / PPTX. - enable_document_hierarchy: Controls parsing heading levels (e.g. H1, H2, H3) at higher quality. Adds a - table of contents to the output with the structure of the entire parsed - document. Not permitted in 'basic' parsing_mode, or if page_range is not - continuous and/or does not start from page zero. + enable_document_hierarchy: Adds a table of contents to the output with the structure of the entire parsed + document. This feature is in beta. Controls parsing heading levels (e.g. H1, H2, + H3) at higher quality. Not permitted in `basic` parsing_mode, or if page_range + is not continuous and/or does not start from page zero. enable_split_tables: Controls whether tables are split into multiple tables by row with the headers propagated. Use for improving LLM comprehension of very large tables. Not - permitted in 'basic' parsing_mode. + permitted in `basic` parsing_mode. - figure_caption_mode: Controls how thorough figure captions are. 'concise' is short and minimizes - chances of hallucinations. 'detailed' is more thorough and can include - commentary. Not permitted in 'basic' parsing_mode. + figure_caption_mode: Controls how thorough figure captions are. `concise` is short and minimizes + chances of hallucinations. `detailed` is more thorough and can include + commentary; this mode is in beta. Not permitted in `basic` parsing_mode. max_split_table_cells: Threshold number of table cells beyond which large tables are split if - `enable_split_tables` is True. Not permitted in 'basic' parsing_mode. + `enable_split_tables` is True. Not permitted in `basic` parsing_mode. page_range: Optional string representing page range to be parsed. Format: comma-separated - indexes (0-based) e.g. '0,1,2,5,6' or ranges (inclusive of both ends) e.g. - '0-2,5,6' + indexes (0-based, e.g. `0,1,2,5,6`), or ranges inclusive of both ends (e.g. + `0-2,5,6`) - parse_mode: The settings to use for parsing. 'basic' is for simple, text-only documents. - 'standard' is for complex documents with images, complex hierarchy, and/or no + parse_mode: The settings to use for parsing. `basic` is for simple, text-only documents. + `standard` is for complex documents with images, complex hierarchy, and/or no natively encoded textual data (e.g. for scanned documents). extra_headers: Send extra headers @@ -389,11 +395,11 @@ async def job_results( job_id: Unique ID of the parse job output_types: The desired output format(s) of the parsed file. Must be `markdown-document`, - `markdown-per-page`, and/or `blocks-per-page`. `markdown-document` parses the - whole document into a single concatenated markdown output. `markdown-per-page` - provides markdown output per page. `blocks-per-page` provides a structured JSON + `markdown-per-page`, and/or `blocks-per-page`. Specify multiple values to get + multiple formats in the response. `markdown-document` parses the whole document + into a single concatenated markdown output. `markdown-per-page` provides + markdown output per page. `blocks-per-page` provides a structured JSON representation of the content blocks on each page, sorted by reading order. - Specify multiple values to get multiple formats in the response. extra_headers: Send extra headers diff --git a/src/contextual/types/parse_create_params.py b/src/contextual/types/parse_create_params.py index 714bcf34..84c33b07 100644 --- a/src/contextual/types/parse_create_params.py +++ b/src/contextual/types/parse_create_params.py @@ -14,44 +14,45 @@ class ParseCreateParams(TypedDict, total=False): """The file to be parsed. The file type must be PDF, DOC / DOCX, PPT / PPTX.""" enable_document_hierarchy: bool - """Controls parsing heading levels (e.g. - - H1, H2, H3) at higher quality. Adds a table of contents to the output with the - structure of the entire parsed document. Not permitted in 'basic' parsing_mode, - or if page_range is not continuous and/or does not start from page zero. + """ + Adds a table of contents to the output with the structure of the entire parsed + document. This feature is in beta. Controls parsing heading levels (e.g. H1, H2, + H3) at higher quality. Not permitted in `basic` parsing_mode, or if page_range + is not continuous and/or does not start from page zero. """ enable_split_tables: bool """ Controls whether tables are split into multiple tables by row with the headers propagated. Use for improving LLM comprehension of very large tables. Not - permitted in 'basic' parsing_mode. + permitted in `basic` parsing_mode. """ figure_caption_mode: Literal["concise", "detailed"] """Controls how thorough figure captions are. - 'concise' is short and minimizes chances of hallucinations. 'detailed' is more - thorough and can include commentary. Not permitted in 'basic' parsing_mode. + `concise` is short and minimizes chances of hallucinations. `detailed` is more + thorough and can include commentary; this mode is in beta. Not permitted in + `basic` parsing_mode. """ max_split_table_cells: int """ Threshold number of table cells beyond which large tables are split if - `enable_split_tables` is True. Not permitted in 'basic' parsing_mode. + `enable_split_tables` is True. Not permitted in `basic` parsing_mode. """ page_range: str """Optional string representing page range to be parsed. - Format: comma-separated indexes (0-based) e.g. '0,1,2,5,6' or ranges (inclusive - of both ends) e.g. '0-2,5,6' + Format: comma-separated indexes (0-based, e.g. `0,1,2,5,6`), or ranges inclusive + of both ends (e.g. `0-2,5,6`) """ parse_mode: Literal["basic", "standard"] """The settings to use for parsing. - 'basic' is for simple, text-only documents. 'standard' is for complex documents + `basic` is for simple, text-only documents. `standard` is for complex documents with images, complex hierarchy, and/or no natively encoded textual data (e.g. for scanned documents). """ diff --git a/src/contextual/types/parse_job_results_params.py b/src/contextual/types/parse_job_results_params.py index 33daa3c5..17f0ddf3 100644 --- a/src/contextual/types/parse_job_results_params.py +++ b/src/contextual/types/parse_job_results_params.py @@ -13,9 +13,9 @@ class ParseJobResultsParams(TypedDict, total=False): """The desired output format(s) of the parsed file. Must be `markdown-document`, `markdown-per-page`, and/or `blocks-per-page`. + Specify multiple values to get multiple formats in the response. `markdown-document` parses the whole document into a single concatenated markdown output. `markdown-per-page` provides markdown output per page. `blocks-per-page` provides a structured JSON representation of the content - blocks on each page, sorted by reading order. Specify multiple values to get - multiple formats in the response. + blocks on each page, sorted by reading order. """ diff --git a/src/contextual/types/parse_job_results_response.py b/src/contextual/types/parse_job_results_response.py index 2b3211b4..8d1565ea 100644 --- a/src/contextual/types/parse_job_results_response.py +++ b/src/contextual/types/parse_job_results_response.py @@ -7,16 +7,17 @@ __all__ = [ "ParseJobResultsResponse", + "DocumentMetadata", + "DocumentMetadataHierarchy", + "DocumentMetadataHierarchyBlock", + "DocumentMetadataHierarchyBlockBoundingBox", "Page", "PageBlock", "PageBlockBoundingBox", - "TableOfContents", - "TableOfContentsBlock", - "TableOfContentsBlockBoundingBox", ] -class PageBlockBoundingBox(BaseModel): +class DocumentMetadataHierarchyBlockBoundingBox(BaseModel): x0: float """The x-coordinate of the top-left corner of the bounding box""" @@ -30,11 +31,11 @@ class PageBlockBoundingBox(BaseModel): """The y-coordinate of the bottom-right corner of the bounding box""" -class PageBlock(BaseModel): +class DocumentMetadataHierarchyBlock(BaseModel): id: str """Unique ID of the block""" - bounding_box: PageBlockBoundingBox + bounding_box: DocumentMetadataHierarchyBlockBoundingBox """ The normalized bounding box of the block, as relative percentages of the page width and height @@ -73,24 +74,23 @@ class PageBlock(BaseModel): """ -class Page(BaseModel): - index: int - """The index of the parsed page (zero-indexed)""" - - blocks: Optional[List[PageBlock]] = None - """The parsed, structured blocks of this page. +class DocumentMetadataHierarchy(BaseModel): + blocks: Optional[List[DocumentMetadataHierarchyBlock]] = None + """Heading blocks which define the hierarchy of the document""" - Present if `blocks-per-page` was among the requested output types. - """ + table_of_contents: Optional[str] = None + """Markdown representation of the table of contents for this document""" - markdown: Optional[str] = None - """The parsed, structured Markdown of this page. - Present if `markdown-per-page` was among the requested output types. +class DocumentMetadata(BaseModel): + hierarchy: Optional[DocumentMetadataHierarchy] = None + """ + Hierarchy of the document, as both heading blocks and a markdown table of + contents """ -class TableOfContentsBlockBoundingBox(BaseModel): +class PageBlockBoundingBox(BaseModel): x0: float """The x-coordinate of the top-left corner of the bounding box""" @@ -104,11 +104,11 @@ class TableOfContentsBlockBoundingBox(BaseModel): """The y-coordinate of the bottom-right corner of the bounding box""" -class TableOfContentsBlock(BaseModel): +class PageBlock(BaseModel): id: str """Unique ID of the block""" - bounding_box: TableOfContentsBlockBoundingBox + bounding_box: PageBlockBoundingBox """ The normalized bounding box of the block, as relative percentages of the page width and height @@ -147,14 +147,20 @@ class TableOfContentsBlock(BaseModel): """ -class TableOfContents(BaseModel): - blocks: Optional[List[TableOfContentsBlock]] = None - """Heading blocks that define the hierarchy of the document""" +class Page(BaseModel): + index: int + """The index of the parsed page (zero-indexed)""" - markdown: Optional[str] = None + blocks: Optional[List[PageBlock]] = None + """The parsed, structured blocks of this page. + + Present if `blocks-per-page` was among the requested output types. """ - Markdown representation of the table of contents that can be pre-pended to the - markdown document. + + markdown: Optional[str] = None + """The parsed, structured Markdown of this page. + + Present if `markdown-per-page` was among the requested output types. """ @@ -165,6 +171,9 @@ class ParseJobResultsResponse(BaseModel): status: Literal["pending", "processing", "retrying", "completed", "failed", "cancelled"] """The current status of the parse job""" + document_metadata: Optional[DocumentMetadata] = None + """Document-level metadata parsed from the document""" + markdown_document: Optional[str] = None """The parsed, structured Markdown of the input file. @@ -176,10 +185,3 @@ class ParseJobResultsResponse(BaseModel): Per-page parse results, containing per-page Markdown (if `markdown-per-page` was requested) and/or per-page `ParsedBlock`s (if `blocks-per-page` was requested). """ - - table_of_contents: Optional[TableOfContents] = None - """The table of contents representing the document's heading hierarchy. - - Only present if `enable_document_hierarchy` was set to true in the parse - request. - """ From 4ef6e4a58535162dc5aaf362861a24aa18d1307a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 05:27:02 +0000 Subject: [PATCH 5/5] release: 0.7.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 19 +++++++++++++++++++ pyproject.toml | 2 +- src/contextual/_version.py | 2 +- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4208b5cb..1b77f506 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.6.0" + ".": "0.7.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 09892b01..a2efd9bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 0.7.0 (2025-05-13) + +Full Changelog: [v0.6.0...v0.7.0](https://github.com/ContextualAI/contextual-client-python/compare/v0.6.0...v0.7.0) + +### Features + +* **api:** update via SDK Studio ([656a0e1](https://github.com/ContextualAI/contextual-client-python/commit/656a0e19d78fe677a1a859bff114511acd58fa87)) + + +### Bug Fixes + +* **package:** support direct resource imports ([109de24](https://github.com/ContextualAI/contextual-client-python/commit/109de24d9c76aaa1d90fff8dfc816e5cfbfab50a)) +* **tests:** correct number examples ([cb94e10](https://github.com/ContextualAI/contextual-client-python/commit/cb94e101a87b8abec57d46667fecef7a3079765f)) + + +### Chores + +* **internal:** avoid errors for isinstance checks on proxies ([581e581](https://github.com/ContextualAI/contextual-client-python/commit/581e581480ac98e0fed61eacc36e90a44e3b99fc)) + ## 0.6.0 (2025-05-08) Full Changelog: [v0.5.1...v0.6.0](https://github.com/ContextualAI/contextual-client-python/compare/v0.5.1...v0.6.0) diff --git a/pyproject.toml b/pyproject.toml index dd86d924..9a3b763a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "contextual-client" -version = "0.6.0" +version = "0.7.0" description = "The official Python library for the Contextual AI API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/contextual/_version.py b/src/contextual/_version.py index 310e21a7..99bb927e 100644 --- a/src/contextual/_version.py +++ b/src/contextual/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "contextual" -__version__ = "0.6.0" # x-release-please-version +__version__ = "0.7.0" # x-release-please-version