optimizely-opal.opal-tools-sdk 0.1.17.dev0__tar.gz → 0.1.18.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/PKG-INFO +1 -1
  2. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/proteus.py +557 -84
  3. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/service.py +2 -0
  4. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/optimizely_opal.opal_tools_sdk.egg-info/PKG-INFO +1 -1
  5. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/pyproject.toml +1 -1
  6. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/setup.py +1 -1
  7. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/README.md +0 -0
  8. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/__init__.py +0 -0
  9. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/_registry.py +0 -0
  10. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/auth.py +0 -0
  11. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/decorators.py +0 -0
  12. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/logging.py +0 -0
  13. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/models.py +0 -0
  14. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/ui.py +0 -0
  15. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/optimizely_opal.opal_tools_sdk.egg-info/SOURCES.txt +0 -0
  16. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/optimizely_opal.opal_tools_sdk.egg-info/dependency_links.txt +0 -0
  17. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/optimizely_opal.opal_tools_sdk.egg-info/requires.txt +0 -0
  18. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/optimizely_opal.opal_tools_sdk.egg-info/top_level.txt +0 -0
  19. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/setup.cfg +0 -0
  20. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/tests/test_integration.py +0 -0
  21. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/tests/test_proteus.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: optimizely-opal.opal-tools-sdk
3
- Version: 0.1.17.dev0
3
+ Version: 0.1.18.dev0
4
4
  Summary: SDK for creating Opal-compatible tools services
5
5
  Home-page: https://github.com/optimizely/opal-tools-sdk
6
6
  Author: Optimizely
@@ -1,12 +1,12 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: proteus-document-spec.json
3
- # timestamp: 2026-03-07T14:54:32+00:00
3
+ # timestamp: 2026-03-12T17:59:00+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
7
  from typing import Any, Literal
8
8
 
9
- from pydantic import BaseModel, ConfigDict, Field, RootModel
9
+ from pydantic import BaseModel, ConfigDict, Field, RootModel, constr
10
10
 
11
11
 
12
12
  class OpalProteusDocumentSpecification(RootModel[Any]):
@@ -39,21 +39,29 @@ class Series(BaseModel):
39
39
  model_config = ConfigDict(
40
40
  extra='forbid',
41
41
  )
42
- color: str | None = Field(default=None, description='Series color')
43
42
  dataKey: str = Field(..., description='Key in data records for this series')
44
- labelKey: str | None = Field(
45
- default=None,
46
- description='Key in data records for pre-formatted labels displayed above bars',
47
- )
48
43
  name: str | None = Field(default=None, description='Display name for legend')
49
44
 
50
45
 
46
+ class Format(BaseModel):
47
+ """
48
+ Formatter with options
49
+ """
50
+
51
+ options: dict[str, Any] | None = None
52
+ type: str
53
+
54
+
51
55
  class Column(BaseModel):
52
56
  model_config = ConfigDict(
53
57
  extra='forbid',
54
58
  )
55
59
  accessorKey: str = Field(..., description='Key in data objects')
60
+ format: str | Format | None = Field(
61
+ default=None, description="Format to apply to cell values (e.g. 'Number', 'DateTime')"
62
+ )
56
63
  header: str = Field(..., description='Column header text')
64
+ size: float | None = Field(default=None, description='Column size')
57
65
 
58
66
 
59
67
  class Marks(BaseModel):
@@ -72,11 +80,30 @@ class Option(BaseModel):
72
80
  value: str = Field(..., description='Return a unique key for each item')
73
81
 
74
82
 
83
+ class Formatter(BaseModel):
84
+ """
85
+ Formatter with custom Intl options. 'type' selects the formatter, 'options' are passed to the Intl constructor.
86
+ """
87
+
88
+ model_config = ConfigDict(
89
+ extra='forbid',
90
+ )
91
+ options: dict[str, Any] | None = Field(
92
+ default=None,
93
+ description='Options passed to the Intl formatter constructor (e.g., Intl.DateTimeFormatOptions or Intl.NumberFormatOptions)',
94
+ )
95
+ type: Literal['DateTime', 'Number'] = Field(..., description='Formatter type')
96
+
97
+
75
98
  class ProteusValue(BaseModel):
76
99
  model_config = ConfigDict(
77
100
  extra='forbid',
78
101
  )
79
102
  field_type: Literal['Value'] = Field(default='Value', alias='$type')
103
+ formatter: Literal['DateTime', 'Number'] | Formatter | None = Field(
104
+ default=None,
105
+ description='Optional formatter to apply to the resolved value. Can be a string shorthand or an object with type and options for Intl formatters.',
106
+ )
80
107
  path: str = Field(
81
108
  ...,
82
109
  description="Path to a value in the data. Absolute paths start with '/' and resolve from the root (e.g., '/title', '/options/0/label'). Inside a Map template, paths without a leading '/' are relative to the current item (e.g., 'title' resolves to each item's 'title' field).",
@@ -1660,9 +1687,9 @@ class SprinklePropZ(
1660
1687
  )
1661
1688
 
1662
1689
 
1663
- class ProteusAtomicCondition1(BaseModel):
1690
+ class ProteusCondition1(BaseModel):
1664
1691
  """
1665
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1692
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1666
1693
  """
1667
1694
 
1668
1695
  model_config = ConfigDict(
@@ -1673,9 +1700,9 @@ class ProteusAtomicCondition1(BaseModel):
1673
1700
  )
1674
1701
 
1675
1702
 
1676
- class ProteusAtomicCondition2(BaseModel):
1703
+ class ProteusCondition2(BaseModel):
1677
1704
  """
1678
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1705
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1679
1706
  """
1680
1707
 
1681
1708
  model_config = ConfigDict(
@@ -1686,9 +1713,9 @@ class ProteusAtomicCondition2(BaseModel):
1686
1713
  )
1687
1714
 
1688
1715
 
1689
- class ProteusAtomicCondition3(BaseModel):
1716
+ class ProteusCondition3(BaseModel):
1690
1717
  """
1691
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1718
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1692
1719
  """
1693
1720
 
1694
1721
  model_config = ConfigDict(
@@ -1699,9 +1726,9 @@ class ProteusAtomicCondition3(BaseModel):
1699
1726
  )
1700
1727
 
1701
1728
 
1702
- class ProteusAtomicCondition4(BaseModel):
1729
+ class ProteusCondition4(BaseModel):
1703
1730
  """
1704
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1731
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1705
1732
  """
1706
1733
 
1707
1734
  model_config = ConfigDict(
@@ -1712,9 +1739,9 @@ class ProteusAtomicCondition4(BaseModel):
1712
1739
  )
1713
1740
 
1714
1741
 
1715
- class ProteusAtomicCondition5(BaseModel):
1742
+ class ProteusCondition5(BaseModel):
1716
1743
  """
1717
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1744
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1718
1745
  """
1719
1746
 
1720
1747
  model_config = ConfigDict(
@@ -1725,9 +1752,9 @@ class ProteusAtomicCondition5(BaseModel):
1725
1752
  )
1726
1753
 
1727
1754
 
1728
- class ProteusAtomicCondition6(BaseModel):
1755
+ class ProteusCondition6(BaseModel):
1729
1756
  """
1730
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1757
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1731
1758
  """
1732
1759
 
1733
1760
  model_config = ConfigDict(
@@ -1738,9 +1765,9 @@ class ProteusAtomicCondition6(BaseModel):
1738
1765
  )
1739
1766
 
1740
1767
 
1741
- class ProteusAtomicCondition7(BaseModel):
1768
+ class ProteusCondition7(BaseModel):
1742
1769
  """
1743
- Simple comparison condition - single operator only (used in OR arrays to avoid recursion)
1770
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1744
1771
  """
1745
1772
 
1746
1773
  model_config = ConfigDict(
@@ -1753,84 +1780,39 @@ class ProteusAtomicCondition7(BaseModel):
1753
1780
  )
1754
1781
 
1755
1782
 
1756
- class ProteusAtomicCondition(
1757
- RootModel[
1758
- ProteusAtomicCondition1
1759
- | ProteusAtomicCondition2
1760
- | ProteusAtomicCondition3
1761
- | ProteusAtomicCondition4
1762
- | ProteusAtomicCondition5
1763
- | ProteusAtomicCondition6
1764
- | ProteusAtomicCondition7
1765
- ]
1766
- ):
1767
- root: (
1768
- ProteusAtomicCondition1
1769
- | ProteusAtomicCondition2
1770
- | ProteusAtomicCondition3
1771
- | ProteusAtomicCondition4
1772
- | ProteusAtomicCondition5
1773
- | ProteusAtomicCondition6
1774
- | ProteusAtomicCondition7
1775
- ) = Field(
1776
- ...,
1777
- description='Simple comparison condition - single operator only (used in OR arrays to avoid recursion)',
1778
- )
1779
-
1780
-
1781
- class Or(BaseModel):
1782
- model_config = ConfigDict(
1783
- extra='forbid',
1784
- )
1785
- and_: list[ProteusAtomicCondition] = Field(
1786
- ...,
1787
- alias='and',
1788
- description='Logical AND - returns true if all conditions are true',
1789
- min_length=1,
1790
- )
1791
-
1792
-
1793
- class ProteusCondition1(BaseModel):
1783
+ class ProteusEventHandler3(BaseModel):
1794
1784
  """
1795
- Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1785
+ Client-side component action - for downloading a URL
1796
1786
  """
1797
1787
 
1798
1788
  model_config = ConfigDict(
1799
1789
  extra='forbid',
1800
1790
  )
1801
- or_: list[Or | ProteusAtomicCondition] = Field(
1802
- ...,
1803
- alias='or',
1804
- description='Logical OR - returns true if any condition is true',
1805
- min_length=1,
1806
- )
1791
+ action: Literal['download'] = Field(default='download', description='The action type')
1792
+ url: ProteusValue | str = Field(..., description='URL to download')
1807
1793
 
1808
1794
 
1809
- class ProteusCondition(RootModel[ProteusAtomicCondition | ProteusCondition1]):
1810
- root: ProteusAtomicCondition | ProteusCondition1 = Field(
1795
+ class ProteusEventHandler(
1796
+ RootModel[ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3]
1797
+ ):
1798
+ root: ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3 = Field(
1811
1799
  ...,
1812
- description='Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.',
1800
+ description='Handler for user interactions - a server-side tool call, client-side message, or client-side component action',
1813
1801
  )
1814
1802
 
1815
1803
 
1816
- class ProteusEventHandler3(BaseModel):
1804
+ class ProteusZip(BaseModel):
1817
1805
  """
1818
- Client-side component action - for downloading a URL
1806
+ Zips multiple parallel arrays into an array of objects. Each key in 'sources' becomes a property in the resulting row objects.
1819
1807
  """
1820
1808
 
1821
1809
  model_config = ConfigDict(
1822
1810
  extra='forbid',
1823
1811
  )
1824
- action: Literal['download'] = Field(default='download', description='The action type')
1825
- url: ProteusValue | str = Field(..., description='URL to download')
1826
-
1827
-
1828
- class ProteusEventHandler(
1829
- RootModel[ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3]
1830
- ):
1831
- root: ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3 = Field(
1812
+ field_type: Literal['Zip'] = Field(default='Zip', alias='$type')
1813
+ sources: dict[constr(pattern=r'.*'), ProteusValue | list[Any]] = Field(
1832
1814
  ...,
1833
- description='Handler for user interactions - a server-side tool call, client-side message, or client-side component action',
1815
+ description='Map of output property names to array sources. Each source should resolve to an array of the same length.',
1834
1816
  )
1835
1817
 
1836
1818
 
@@ -1839,11 +1821,12 @@ class ProteusChart(BaseModel):
1839
1821
  extra='forbid',
1840
1822
  )
1841
1823
  field_type: Literal['Chart'] = Field(default='Chart', alias='$type')
1842
- data: list[dict[str, Any]] | ProteusValue | None = Field(
1843
- default=None, description='Chart data records, either inline or a ProteusValue reference'
1824
+ data: list[dict[str, Any]] | ProteusValue | ProteusZip | None = Field(
1825
+ default=None,
1826
+ description='Chart data records, either inline, a ProteusValue reference, or a ProteusZip transformation',
1844
1827
  )
1845
1828
  series: list[Series] | None = Field(default=None, description='Data series configuration')
1846
- type: Literal['bar'] = Field(default='bar', description='Chart type')
1829
+ type: Literal['bar', 'line'] | None = Field(default=None, description='Chart type')
1847
1830
  xAxisKey: str | None = Field(default=None, description='Key in data records for x-axis labels')
1848
1831
 
1849
1832
 
@@ -1853,7 +1836,71 @@ class ProteusDataTable(BaseModel):
1853
1836
  )
1854
1837
  field_type: Literal['DataTable'] = Field(default='DataTable', alias='$type')
1855
1838
  columns: list[Column] | None = Field(default=None, description='Column definitions')
1856
- data: list[dict[str, Any]] | ProteusValue | None = None
1839
+ data: list[dict[str, Any]] | ProteusValue | ProteusZip | None = None
1840
+
1841
+
1842
+ class ProteusIconCalendar(BaseModel):
1843
+ model_config = ConfigDict(
1844
+ extra='forbid',
1845
+ )
1846
+ field_type: Literal['IconCalendar'] = Field(default='IconCalendar', alias='$type')
1847
+ alignItems: SprinklePropAlignItems | None = None
1848
+ alignSelf: SprinklePropAlignSelf | None = None
1849
+ animation: SprinklePropAnimation | None = None
1850
+ backgroundImage: SprinklePropBackgroundImage | None = None
1851
+ bg: SprinklePropBg | None = None
1852
+ border: SprinklePropBorder | None = None
1853
+ borderB: SprinklePropBorderB | None = None
1854
+ borderColor: SprinklePropBorderColor | None = None
1855
+ borderL: SprinklePropBorderL | None = None
1856
+ borderR: SprinklePropBorderR | None = None
1857
+ borderT: SprinklePropBorderT | None = None
1858
+ color: SprinklePropColor | None = None
1859
+ cursor: SprinklePropCursor | None = None
1860
+ display: SprinklePropDisplay | None = None
1861
+ flex: SprinklePropFlex | None = None
1862
+ flexDirection: SprinklePropFlexDirection | None = None
1863
+ flexWrap: SprinklePropFlexWrap | None = None
1864
+ fontFamily: SprinklePropFontFamily | None = None
1865
+ fontSize: SprinklePropFontSize | None = None
1866
+ fontWeight: SprinklePropFontWeight | None = None
1867
+ gap: SprinklePropGap | None = None
1868
+ gridColumn: SprinklePropGridColumn | None = None
1869
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
1870
+ h: SprinklePropH | None = None
1871
+ justifyContent: SprinklePropJustifyContent | None = None
1872
+ justifyItems: SprinklePropJustifyItems | None = None
1873
+ m: SprinklePropM | None = None
1874
+ maxH: SprinklePropMaxH | None = None
1875
+ maxW: SprinklePropMaxW | None = None
1876
+ mb: SprinklePropMb | None = None
1877
+ ml: SprinklePropMl | None = None
1878
+ mr: SprinklePropMr | None = None
1879
+ mt: SprinklePropMt | None = None
1880
+ mx: SprinklePropMx | None = None
1881
+ my: SprinklePropMy | None = None
1882
+ objectFit: SprinklePropObjectFit | None = None
1883
+ overflow: SprinklePropOverflow | None = None
1884
+ overflowX: SprinklePropOverflowX | None = None
1885
+ overflowY: SprinklePropOverflowY | None = None
1886
+ p: SprinklePropP | None = None
1887
+ pb: SprinklePropPb | None = None
1888
+ pl: SprinklePropPl | None = None
1889
+ placeItems: SprinklePropPlaceItems | None = None
1890
+ pointerEvents: SprinklePropPointerEvents | None = None
1891
+ pr: SprinklePropPr | None = None
1892
+ pt: SprinklePropPt | None = None
1893
+ px: SprinklePropPx | None = None
1894
+ py: SprinklePropPy | None = None
1895
+ rounded: SprinklePropRounded | None = None
1896
+ shadow: SprinklePropShadow | None = None
1897
+ size: SprinklePropSize | None = None
1898
+ textAlign: SprinklePropTextAlign | None = None
1899
+ textTransform: SprinklePropTextTransform | None = None
1900
+ transition: SprinklePropTransition | None = None
1901
+ w: SprinklePropW | None = None
1902
+ whiteSpace: SprinklePropWhiteSpace | None = None
1903
+ z: SprinklePropZ | None = None
1857
1904
 
1858
1905
 
1859
1906
  class ProteusImage(BaseModel):
@@ -2190,6 +2237,9 @@ class ProteusTextarea(BaseModel):
2190
2237
  pt: SprinklePropPt | None = None
2191
2238
  px: SprinklePropPx | None = None
2192
2239
  py: SprinklePropPy | None = None
2240
+ required: bool | ProteusValue | None = Field(
2241
+ default=None, description='Whether selecting this input is required.'
2242
+ )
2193
2243
  resize: Literal['none'] | Literal['auto'] | Literal['vertical'] | ProteusValue | None = Field(
2194
2244
  default=None, description='Control whether resizing mode is manual, automatic, or disabled.'
2195
2245
  )
@@ -2279,6 +2329,38 @@ class ProteusTime(BaseModel):
2279
2329
  z: SprinklePropZ | None = None
2280
2330
 
2281
2331
 
2332
+ class ProteusCondition8(BaseModel):
2333
+ """
2334
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
2335
+ """
2336
+
2337
+ model_config = ConfigDict(
2338
+ extra='forbid',
2339
+ )
2340
+ and_: list[ProteusCondition] = Field(
2341
+ ...,
2342
+ alias='and',
2343
+ description='Logical AND - returns true if all conditions are true',
2344
+ min_length=1,
2345
+ )
2346
+
2347
+
2348
+ class ProteusCondition9(BaseModel):
2349
+ """
2350
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
2351
+ """
2352
+
2353
+ model_config = ConfigDict(
2354
+ extra='forbid',
2355
+ )
2356
+ or_: list[ProteusCondition] = Field(
2357
+ ...,
2358
+ alias='or',
2359
+ description='Logical OR - returns true if any condition is true',
2360
+ min_length=1,
2361
+ )
2362
+
2363
+
2282
2364
  class ProteusDocument(BaseModel):
2283
2365
  model_config = ConfigDict(
2284
2366
  extra='forbid',
@@ -2389,6 +2471,93 @@ class ProteusAction(BaseModel):
2389
2471
  )
2390
2472
 
2391
2473
 
2474
+ class ProteusAvatar(BaseModel):
2475
+ model_config = ConfigDict(
2476
+ extra='forbid',
2477
+ )
2478
+ field_type: Literal['Avatar'] = Field(default='Avatar', alias='$type')
2479
+ alignItems: SprinklePropAlignItems | None = None
2480
+ alignSelf: SprinklePropAlignSelf | None = None
2481
+ animation: SprinklePropAnimation | None = None
2482
+ backgroundImage: SprinklePropBackgroundImage | None = None
2483
+ bg: SprinklePropBg | None = None
2484
+ border: SprinklePropBorder | None = None
2485
+ borderB: SprinklePropBorderB | None = None
2486
+ borderColor: SprinklePropBorderColor | None = None
2487
+ borderL: SprinklePropBorderL | None = None
2488
+ borderR: SprinklePropBorderR | None = None
2489
+ borderT: SprinklePropBorderT | None = None
2490
+ children: ProteusNode | None = None
2491
+ color: SprinklePropColor | None = None
2492
+ colorScheme: Literal['purple'] | Literal['neutral'] | ProteusValue | None = Field(
2493
+ default=None, description='Control the avatar fallback background and text colors.'
2494
+ )
2495
+ cursor: SprinklePropCursor | None = None
2496
+ display: SprinklePropDisplay | None = None
2497
+ fallback: Literal['opal'] | Literal['team'] | Literal['user'] | ProteusValue | None = Field(
2498
+ default=None, description='The fallback icon to display when no name or image is given.'
2499
+ )
2500
+ flex: SprinklePropFlex | None = None
2501
+ flexDirection: SprinklePropFlexDirection | None = None
2502
+ flexWrap: SprinklePropFlexWrap | None = None
2503
+ fontFamily: SprinklePropFontFamily | None = None
2504
+ fontSize: SprinklePropFontSize | None = None
2505
+ fontWeight: SprinklePropFontWeight | None = None
2506
+ gap: SprinklePropGap | None = None
2507
+ gridColumn: SprinklePropGridColumn | None = None
2508
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2509
+ h: SprinklePropH | None = None
2510
+ justifyContent: SprinklePropJustifyContent | None = None
2511
+ justifyItems: SprinklePropJustifyItems | None = None
2512
+ m: SprinklePropM | None = None
2513
+ maxH: SprinklePropMaxH | None = None
2514
+ maxW: SprinklePropMaxW | None = None
2515
+ mb: SprinklePropMb | None = None
2516
+ ml: SprinklePropMl | None = None
2517
+ mr: SprinklePropMr | None = None
2518
+ mt: SprinklePropMt | None = None
2519
+ mx: SprinklePropMx | None = None
2520
+ my: SprinklePropMy | None = None
2521
+ name: str | ProteusValue | None = Field(
2522
+ default=None, description='Use name to generate initials to show inside the avatar.'
2523
+ )
2524
+ objectFit: SprinklePropObjectFit | None = None
2525
+ overflow: SprinklePropOverflow | None = None
2526
+ overflowX: SprinklePropOverflowX | None = None
2527
+ overflowY: SprinklePropOverflowY | None = None
2528
+ p: SprinklePropP | None = None
2529
+ pb: SprinklePropPb | None = None
2530
+ pl: SprinklePropPl | None = None
2531
+ placeItems: SprinklePropPlaceItems | None = None
2532
+ pointerEvents: SprinklePropPointerEvents | None = None
2533
+ pr: SprinklePropPr | None = None
2534
+ pt: SprinklePropPt | None = None
2535
+ px: SprinklePropPx | None = None
2536
+ py: SprinklePropPy | None = None
2537
+ rounded: SprinklePropRounded | None = None
2538
+ shadow: SprinklePropShadow | None = None
2539
+ size: (
2540
+ Literal['xs']
2541
+ | Literal['sm']
2542
+ | Literal['md']
2543
+ | Literal['lg']
2544
+ | Literal['xl']
2545
+ | Literal['3xl']
2546
+ | Literal['2xs']
2547
+ | ProteusValue
2548
+ | None
2549
+ ) = Field(default=None, description='Control the size of the avatar.')
2550
+ src: str | ProteusValue | None = Field(
2551
+ default=None, description='Render the image inside the avatar.'
2552
+ )
2553
+ textAlign: SprinklePropTextAlign | None = None
2554
+ textTransform: SprinklePropTextTransform | None = None
2555
+ transition: SprinklePropTransition | None = None
2556
+ w: SprinklePropW | None = None
2557
+ whiteSpace: SprinklePropWhiteSpace | None = None
2558
+ z: SprinklePropZ | None = None
2559
+
2560
+
2392
2561
  class ProteusBadge(BaseModel):
2393
2562
  model_config = ConfigDict(
2394
2563
  extra='forbid',
@@ -2534,6 +2703,241 @@ class ProteusCancelAction(BaseModel):
2534
2703
  )
2535
2704
 
2536
2705
 
2706
+ class ProteusCard(BaseModel):
2707
+ model_config = ConfigDict(
2708
+ extra='forbid',
2709
+ )
2710
+ field_type: Literal['Card'] = Field(default='Card', alias='$type')
2711
+ alignItems: SprinklePropAlignItems | None = None
2712
+ alignSelf: SprinklePropAlignSelf | None = None
2713
+ animation: SprinklePropAnimation | None = None
2714
+ backgroundImage: SprinklePropBackgroundImage | None = None
2715
+ bg: SprinklePropBg | None = None
2716
+ border: SprinklePropBorder | None = None
2717
+ borderB: SprinklePropBorderB | None = None
2718
+ borderColor: SprinklePropBorderColor | None = None
2719
+ borderL: SprinklePropBorderL | None = None
2720
+ borderR: SprinklePropBorderR | None = None
2721
+ borderT: SprinklePropBorderT | None = None
2722
+ children: ProteusNode | None = None
2723
+ color: SprinklePropColor | None = None
2724
+ cursor: SprinklePropCursor | None = None
2725
+ display: SprinklePropDisplay | None = None
2726
+ flex: SprinklePropFlex | None = None
2727
+ flexDirection: SprinklePropFlexDirection | None = None
2728
+ flexWrap: SprinklePropFlexWrap | None = None
2729
+ fontFamily: SprinklePropFontFamily | None = None
2730
+ fontSize: SprinklePropFontSize | None = None
2731
+ fontWeight: SprinklePropFontWeight | None = None
2732
+ gap: SprinklePropGap | None = None
2733
+ gridColumn: SprinklePropGridColumn | None = None
2734
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2735
+ h: SprinklePropH | None = None
2736
+ justifyContent: SprinklePropJustifyContent | None = None
2737
+ justifyItems: SprinklePropJustifyItems | None = None
2738
+ m: SprinklePropM | None = None
2739
+ maxH: SprinklePropMaxH | None = None
2740
+ maxW: SprinklePropMaxW | None = None
2741
+ mb: SprinklePropMb | None = None
2742
+ ml: SprinklePropMl | None = None
2743
+ mr: SprinklePropMr | None = None
2744
+ mt: SprinklePropMt | None = None
2745
+ mx: SprinklePropMx | None = None
2746
+ my: SprinklePropMy | None = None
2747
+ objectFit: SprinklePropObjectFit | None = None
2748
+ overflow: SprinklePropOverflow | None = None
2749
+ overflowX: SprinklePropOverflowX | None = None
2750
+ overflowY: SprinklePropOverflowY | None = None
2751
+ p: SprinklePropP | None = None
2752
+ pb: SprinklePropPb | None = None
2753
+ pl: SprinklePropPl | None = None
2754
+ placeItems: SprinklePropPlaceItems | None = None
2755
+ pointerEvents: SprinklePropPointerEvents | None = None
2756
+ pr: SprinklePropPr | None = None
2757
+ pt: SprinklePropPt | None = None
2758
+ px: SprinklePropPx | None = None
2759
+ py: SprinklePropPy | None = None
2760
+ rounded: SprinklePropRounded | None = None
2761
+ shadow: SprinklePropShadow | None = None
2762
+ size: SprinklePropSize | None = None
2763
+ textAlign: SprinklePropTextAlign | None = None
2764
+ textTransform: SprinklePropTextTransform | None = None
2765
+ transition: SprinklePropTransition | None = None
2766
+ w: SprinklePropW | None = None
2767
+ whiteSpace: SprinklePropWhiteSpace | None = None
2768
+ z: SprinklePropZ | None = None
2769
+
2770
+
2771
+ class ProteusCardHeader(BaseModel):
2772
+ model_config = ConfigDict(
2773
+ extra='forbid',
2774
+ )
2775
+ field_type: Literal['CardHeader'] = Field(default='CardHeader', alias='$type')
2776
+ addonAfter: ProteusNode | None = Field(
2777
+ default=None, description='Display content inside the header after `children`.'
2778
+ )
2779
+ addonBefore: ProteusNode | None = Field(
2780
+ default=None, description='Display content inside the header before `children`.'
2781
+ )
2782
+ alignItems: SprinklePropAlignItems | None = None
2783
+ alignSelf: SprinklePropAlignSelf | None = None
2784
+ animation: SprinklePropAnimation | None = None
2785
+ backgroundImage: SprinklePropBackgroundImage | None = None
2786
+ bg: SprinklePropBg | None = None
2787
+ border: SprinklePropBorder | None = None
2788
+ borderB: SprinklePropBorderB | None = None
2789
+ borderColor: SprinklePropBorderColor | None = None
2790
+ borderL: SprinklePropBorderL | None = None
2791
+ borderR: SprinklePropBorderR | None = None
2792
+ borderT: SprinklePropBorderT | None = None
2793
+ children: ProteusNode | None = None
2794
+ color: SprinklePropColor | None = None
2795
+ cursor: SprinklePropCursor | None = None
2796
+ description: ProteusNode | None = Field(
2797
+ default=None, description='Add secondary text after the primary title.'
2798
+ )
2799
+ display: SprinklePropDisplay | None = None
2800
+ flex: SprinklePropFlex | None = None
2801
+ flexDirection: SprinklePropFlexDirection | None = None
2802
+ flexWrap: SprinklePropFlexWrap | None = None
2803
+ fontFamily: SprinklePropFontFamily | None = None
2804
+ fontSize: SprinklePropFontSize | None = None
2805
+ fontWeight: SprinklePropFontWeight | None = None
2806
+ gap: SprinklePropGap | None = None
2807
+ gridColumn: SprinklePropGridColumn | None = None
2808
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2809
+ h: SprinklePropH | None = None
2810
+ justifyContent: SprinklePropJustifyContent | None = None
2811
+ justifyItems: SprinklePropJustifyItems | None = None
2812
+ m: SprinklePropM | None = None
2813
+ maxH: SprinklePropMaxH | None = None
2814
+ maxW: SprinklePropMaxW | None = None
2815
+ mb: SprinklePropMb | None = None
2816
+ ml: SprinklePropMl | None = None
2817
+ mr: SprinklePropMr | None = None
2818
+ mt: SprinklePropMt | None = None
2819
+ mx: SprinklePropMx | None = None
2820
+ my: SprinklePropMy | None = None
2821
+ objectFit: SprinklePropObjectFit | None = None
2822
+ overflow: SprinklePropOverflow | None = None
2823
+ overflowX: SprinklePropOverflowX | None = None
2824
+ overflowY: SprinklePropOverflowY | None = None
2825
+ p: SprinklePropP | None = None
2826
+ pb: SprinklePropPb | None = None
2827
+ pl: SprinklePropPl | None = None
2828
+ placeItems: SprinklePropPlaceItems | None = None
2829
+ pointerEvents: SprinklePropPointerEvents | None = None
2830
+ pr: SprinklePropPr | None = None
2831
+ pt: SprinklePropPt | None = None
2832
+ px: SprinklePropPx | None = None
2833
+ py: SprinklePropPy | None = None
2834
+ rounded: SprinklePropRounded | None = None
2835
+ shadow: SprinklePropShadow | None = None
2836
+ size: SprinklePropSize | None = None
2837
+ textAlign: SprinklePropTextAlign | None = None
2838
+ textTransform: SprinklePropTextTransform | None = None
2839
+ transition: SprinklePropTransition | None = None
2840
+ w: SprinklePropW | None = None
2841
+ whiteSpace: SprinklePropWhiteSpace | None = None
2842
+ z: SprinklePropZ | None = None
2843
+
2844
+
2845
+ class ProteusCardLink(BaseModel):
2846
+ model_config = ConfigDict(
2847
+ extra='forbid',
2848
+ )
2849
+ field_type: Literal['CardLink'] = Field(default='CardLink', alias='$type')
2850
+ alignItems: SprinklePropAlignItems | None = None
2851
+ alignSelf: SprinklePropAlignSelf | None = None
2852
+ animation: SprinklePropAnimation | None = None
2853
+ backgroundImage: SprinklePropBackgroundImage | None = None
2854
+ bg: SprinklePropBg | None = None
2855
+ border: SprinklePropBorder | None = None
2856
+ borderB: SprinklePropBorderB | None = None
2857
+ borderColor: SprinklePropBorderColor | None = None
2858
+ borderL: SprinklePropBorderL | None = None
2859
+ borderR: SprinklePropBorderR | None = None
2860
+ borderT: SprinklePropBorderT | None = None
2861
+ children: ProteusNode | None = None
2862
+ color: SprinklePropColor | None = None
2863
+ cursor: SprinklePropCursor | None = None
2864
+ display: SprinklePropDisplay | None = None
2865
+ flex: SprinklePropFlex | None = None
2866
+ flexDirection: SprinklePropFlexDirection | None = None
2867
+ flexWrap: SprinklePropFlexWrap | None = None
2868
+ fontFamily: SprinklePropFontFamily | None = None
2869
+ fontSize: SprinklePropFontSize | None = None
2870
+ fontWeight: SprinklePropFontWeight | None = None
2871
+ gap: SprinklePropGap | None = None
2872
+ gridColumn: SprinklePropGridColumn | None = None
2873
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2874
+ h: SprinklePropH | None = None
2875
+ href: str | ProteusValue | None = Field(default=None, description='The link href.')
2876
+ justifyContent: SprinklePropJustifyContent | None = None
2877
+ justifyItems: SprinklePropJustifyItems | None = None
2878
+ m: SprinklePropM | None = None
2879
+ maxH: SprinklePropMaxH | None = None
2880
+ maxW: SprinklePropMaxW | None = None
2881
+ mb: SprinklePropMb | None = None
2882
+ ml: SprinklePropMl | None = None
2883
+ mr: SprinklePropMr | None = None
2884
+ mt: SprinklePropMt | None = None
2885
+ mx: SprinklePropMx | None = None
2886
+ my: SprinklePropMy | None = None
2887
+ objectFit: SprinklePropObjectFit | None = None
2888
+ overflow: SprinklePropOverflow | None = None
2889
+ overflowX: SprinklePropOverflowX | None = None
2890
+ overflowY: SprinklePropOverflowY | None = None
2891
+ p: SprinklePropP | None = None
2892
+ pb: SprinklePropPb | None = None
2893
+ pl: SprinklePropPl | None = None
2894
+ placeItems: SprinklePropPlaceItems | None = None
2895
+ pointerEvents: SprinklePropPointerEvents | None = None
2896
+ pr: SprinklePropPr | None = None
2897
+ pt: SprinklePropPt | None = None
2898
+ px: SprinklePropPx | None = None
2899
+ py: SprinklePropPy | None = None
2900
+ rounded: SprinklePropRounded | None = None
2901
+ shadow: SprinklePropShadow | None = None
2902
+ size: SprinklePropSize | None = None
2903
+ textAlign: SprinklePropTextAlign | None = None
2904
+ textTransform: SprinklePropTextTransform | None = None
2905
+ transition: SprinklePropTransition | None = None
2906
+ w: SprinklePropW | None = None
2907
+ whiteSpace: SprinklePropWhiteSpace | None = None
2908
+ z: SprinklePropZ | None = None
2909
+
2910
+
2911
+ class ProteusChoice(BaseModel):
2912
+ model_config = ConfigDict(
2913
+ extra='forbid',
2914
+ )
2915
+ field_type: Literal['Choice'] = Field(default='Choice', alias='$type')
2916
+ addonBefore: ProteusNode | None = Field(
2917
+ default=None, description='Content to display before the choice text (e.g., numbered badge)'
2918
+ )
2919
+ children: ProteusNode | None = Field(default=None, description='Title/label of the choice')
2920
+ description: ProteusNode | None = Field(
2921
+ default=None, description='Secondary description text shown below the title'
2922
+ )
2923
+ onClick: ProteusEventHandler | None = Field(
2924
+ default=None, description='Action triggered when choice is selected'
2925
+ )
2926
+ required: bool | None = Field(
2927
+ default=None, description='Whether selecting this choice is required to proceed'
2928
+ )
2929
+ value: str | None = Field(default=None, description='Value associated with this choice')
2930
+
2931
+
2932
+ class ProteusChoiceGroup(BaseModel):
2933
+ model_config = ConfigDict(
2934
+ extra='forbid',
2935
+ )
2936
+ field_type: Literal['ChoiceGroup'] = Field(default='ChoiceGroup', alias='$type')
2937
+ children: ProteusNode | None = Field(default=None, description='Choice elements to render')
2938
+ name: str | None = Field(default=None, description='Data field name for the selected value')
2939
+
2940
+
2537
2941
  class ProteusField(BaseModel):
2538
2942
  model_config = ConfigDict(
2539
2943
  extra='forbid',
@@ -2832,6 +3236,9 @@ class ProteusInput(BaseModel):
2832
3236
  pt: SprinklePropPt | None = None
2833
3237
  px: SprinklePropPx | None = None
2834
3238
  py: SprinklePropPy | None = None
3239
+ required: bool | ProteusValue | None = Field(
3240
+ default=None, description='Whether selecting this input is required.'
3241
+ )
2835
3242
  rounded: SprinklePropRounded | None = None
2836
3243
  shadow: SprinklePropShadow | None = None
2837
3244
  textAlign: SprinklePropTextAlign | None = None
@@ -2947,6 +3354,10 @@ class ProteusMap(BaseModel):
2947
3354
  path: str = Field(
2948
3355
  ..., description="JSON pointer path to the source array in the data (e.g., '/results')"
2949
3356
  )
3357
+ separator: ProteusNode | None = Field(
3358
+ default=None,
3359
+ description='Optional separator to render between items. Can be a string or a ProteusNode for more complex separators.',
3360
+ )
2950
3361
 
2951
3362
 
2952
3363
  class ProteusSelect(BaseModel):
@@ -2959,6 +3370,9 @@ class ProteusSelect(BaseModel):
2959
3370
  default=None, description='The name of the inner select element.'
2960
3371
  )
2961
3372
  options: list[Option] = Field(..., description='The select items/options we want to render.')
3373
+ required: bool | ProteusValue | None = Field(
3374
+ default=None, description='Whether the select value is required.'
3375
+ )
2962
3376
 
2963
3377
 
2964
3378
  class ProteusSelectTrigger(BaseModel):
@@ -3110,16 +3524,52 @@ class ProteusText(BaseModel):
3110
3524
  z: SprinklePropZ | None = None
3111
3525
 
3112
3526
 
3527
+ class ProteusCondition(
3528
+ RootModel[
3529
+ ProteusCondition1
3530
+ | ProteusCondition2
3531
+ | ProteusCondition3
3532
+ | ProteusCondition4
3533
+ | ProteusCondition5
3534
+ | ProteusCondition6
3535
+ | ProteusCondition7
3536
+ | ProteusCondition8
3537
+ | ProteusCondition9
3538
+ ]
3539
+ ):
3540
+ root: (
3541
+ ProteusCondition1
3542
+ | ProteusCondition2
3543
+ | ProteusCondition3
3544
+ | ProteusCondition4
3545
+ | ProteusCondition5
3546
+ | ProteusCondition6
3547
+ | ProteusCondition7
3548
+ | ProteusCondition8
3549
+ | ProteusCondition9
3550
+ ) = Field(
3551
+ ...,
3552
+ description='Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.',
3553
+ )
3554
+
3555
+
3113
3556
  class ProteusElement(
3114
3557
  RootModel[
3115
3558
  ProteusAction
3559
+ | ProteusAvatar
3116
3560
  | ProteusBadge
3117
3561
  | ProteusCancelAction
3562
+ | ProteusCard
3563
+ | ProteusCardHeader
3564
+ | ProteusCardLink
3118
3565
  | ProteusChart
3566
+ | ProteusChoice
3567
+ | ProteusChoiceGroup
3119
3568
  | ProteusDataTable
3120
3569
  | ProteusField
3121
3570
  | ProteusGroup
3122
3571
  | ProteusHeading
3572
+ | ProteusIconCalendar
3123
3573
  | ProteusImage
3124
3574
  | ProteusInput
3125
3575
  | ProteusLink
@@ -3138,13 +3588,20 @@ class ProteusElement(
3138
3588
  ):
3139
3589
  root: (
3140
3590
  ProteusAction
3591
+ | ProteusAvatar
3141
3592
  | ProteusBadge
3142
3593
  | ProteusCancelAction
3594
+ | ProteusCard
3595
+ | ProteusCardHeader
3596
+ | ProteusCardLink
3143
3597
  | ProteusChart
3598
+ | ProteusChoice
3599
+ | ProteusChoiceGroup
3144
3600
  | ProteusDataTable
3145
3601
  | ProteusField
3146
3602
  | ProteusGroup
3147
3603
  | ProteusHeading
3604
+ | ProteusIconCalendar
3148
3605
  | ProteusImage
3149
3606
  | ProteusInput
3150
3607
  | ProteusLink
@@ -3188,10 +3645,18 @@ class ProteusNode(
3188
3645
  )
3189
3646
 
3190
3647
 
3648
+ ProteusCondition8.model_rebuild()
3649
+ ProteusCondition9.model_rebuild()
3191
3650
  ProteusDocument.model_rebuild()
3192
3651
  ProteusAction.model_rebuild()
3652
+ ProteusAvatar.model_rebuild()
3193
3653
  ProteusBadge.model_rebuild()
3194
3654
  ProteusCancelAction.model_rebuild()
3655
+ ProteusCard.model_rebuild()
3656
+ ProteusCardHeader.model_rebuild()
3657
+ ProteusCardLink.model_rebuild()
3658
+ ProteusChoice.model_rebuild()
3659
+ ProteusChoiceGroup.model_rebuild()
3195
3660
  ProteusField.model_rebuild()
3196
3661
  ProteusGroup.model_rebuild()
3197
3662
  ProteusHeading.model_rebuild()
@@ -3217,14 +3682,21 @@ class UI:
3217
3682
  MIME_TYPE = "application/vnd.opal.proteus+json"
3218
3683
 
3219
3684
  Action = ProteusAction
3685
+ Avatar = ProteusAvatar
3220
3686
  Badge = ProteusBadge
3221
3687
  CancelAction = ProteusCancelAction
3688
+ Card = ProteusCard
3689
+ CardHeader = ProteusCardHeader
3690
+ CardLink = ProteusCardLink
3222
3691
  Chart = ProteusChart
3692
+ Choice = ProteusChoice
3693
+ ChoiceGroup = ProteusChoiceGroup
3223
3694
  DataTable = ProteusDataTable
3224
3695
  Document = ProteusDocument
3225
3696
  Field = ProteusField
3226
3697
  Group = ProteusGroup
3227
3698
  Heading = ProteusHeading
3699
+ IconCalendar = ProteusIconCalendar
3228
3700
  Image = ProteusImage
3229
3701
  Input = ProteusInput
3230
3702
  Link = ProteusLink
@@ -3239,3 +3711,4 @@ class UI:
3239
3711
  Textarea = ProteusTextarea
3240
3712
  Time = ProteusTime
3241
3713
  Value = ProteusValue
3714
+ Zip = ProteusZip
@@ -227,6 +227,8 @@ class ToolsService:
227
227
  except ValidationError as e:
228
228
  logger.warning(f"Invalid parameters predicted by LLM for tool {name}: {str(e)}")
229
229
  raise HTTPException(status_code=400, detail=str(e))
230
+ except HTTPException:
231
+ raise
230
232
  except Exception as e:
231
233
  import traceback
232
234
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: optimizely-opal.opal-tools-sdk
3
- Version: 0.1.17.dev0
3
+ Version: 0.1.18.dev0
4
4
  Summary: SDK for creating Opal-compatible tools services
5
5
  Home-page: https://github.com/optimizely/opal-tools-sdk
6
6
  Author: Optimizely
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "optimizely-opal.opal-tools-sdk"
7
- version = "0.1.17-dev"
7
+ version = "0.1.18-dev"
8
8
  description = "SDK for creating Opal-compatible tools services"
9
9
  authors = [{ name = "Optimizely", email = "opal-team@optimizely.com" }]
10
10
  readme = "README.md"
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="optimizely-opal.opal-tools-sdk",
5
- version="0.1.17-dev",
5
+ version="0.1.18-dev",
6
6
  packages=find_packages(),
7
7
  install_requires=[
8
8
  "fastapi>=0.100.0",