optimizely-opal.opal-tools-sdk 0.1.17.dev0__tar.gz → 0.1.19.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.19.dev0}/PKG-INFO +1 -1
  2. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.dev0}/opal_tools_sdk/proteus.py +530 -84
  3. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.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.19.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.19.dev0}/pyproject.toml +1 -1
  6. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.dev0}/setup.py +1 -1
  7. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.dev0}/README.md +0 -0
  8. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.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.19.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.19.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.19.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.19.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.19.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.19.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.19.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.19.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.19.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.19.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.19.dev0}/setup.cfg +0 -0
  20. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.dev0}/tests/test_integration.py +0 -0
  21. {optimizely_opal_opal_tools_sdk-0.1.17.dev0 → optimizely_opal_opal_tools_sdk-0.1.19.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.19.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-17T21:59:22+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):
@@ -1924,6 +1971,14 @@ class ProteusImage(BaseModel):
1924
1971
  src: ProteusValue | str | None = Field(default=None, description='The image source URL')
1925
1972
 
1926
1973
 
1974
+ class ProteusQuestion(BaseModel):
1975
+ model_config = ConfigDict(
1976
+ extra='forbid',
1977
+ )
1978
+ field_type: Literal['Question'] = Field(default='Question', alias='$type')
1979
+ questions: ProteusValue = Field(..., description='Array of questions data')
1980
+
1981
+
1927
1982
  class ProteusRange(BaseModel):
1928
1983
  model_config = ConfigDict(
1929
1984
  extra='forbid',
@@ -2190,6 +2245,9 @@ class ProteusTextarea(BaseModel):
2190
2245
  pt: SprinklePropPt | None = None
2191
2246
  px: SprinklePropPx | None = None
2192
2247
  py: SprinklePropPy | None = None
2248
+ required: bool | ProteusValue | None = Field(
2249
+ default=None, description='Whether selecting this input is required.'
2250
+ )
2193
2251
  resize: Literal['none'] | Literal['auto'] | Literal['vertical'] | ProteusValue | None = Field(
2194
2252
  default=None, description='Control whether resizing mode is manual, automatic, or disabled.'
2195
2253
  )
@@ -2279,6 +2337,38 @@ class ProteusTime(BaseModel):
2279
2337
  z: SprinklePropZ | None = None
2280
2338
 
2281
2339
 
2340
+ class ProteusCondition8(BaseModel):
2341
+ """
2342
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
2343
+ """
2344
+
2345
+ model_config = ConfigDict(
2346
+ extra='forbid',
2347
+ )
2348
+ and_: list[ProteusCondition] = Field(
2349
+ ...,
2350
+ alias='and',
2351
+ description='Logical AND - returns true if all conditions are true',
2352
+ min_length=1,
2353
+ )
2354
+
2355
+
2356
+ class ProteusCondition9(BaseModel):
2357
+ """
2358
+ Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
2359
+ """
2360
+
2361
+ model_config = ConfigDict(
2362
+ extra='forbid',
2363
+ )
2364
+ or_: list[ProteusCondition] = Field(
2365
+ ...,
2366
+ alias='or',
2367
+ description='Logical OR - returns true if any condition is true',
2368
+ min_length=1,
2369
+ )
2370
+
2371
+
2282
2372
  class ProteusDocument(BaseModel):
2283
2373
  model_config = ConfigDict(
2284
2374
  extra='forbid',
@@ -2389,6 +2479,93 @@ class ProteusAction(BaseModel):
2389
2479
  )
2390
2480
 
2391
2481
 
2482
+ class ProteusAvatar(BaseModel):
2483
+ model_config = ConfigDict(
2484
+ extra='forbid',
2485
+ )
2486
+ field_type: Literal['Avatar'] = Field(default='Avatar', alias='$type')
2487
+ alignItems: SprinklePropAlignItems | None = None
2488
+ alignSelf: SprinklePropAlignSelf | None = None
2489
+ animation: SprinklePropAnimation | None = None
2490
+ backgroundImage: SprinklePropBackgroundImage | None = None
2491
+ bg: SprinklePropBg | None = None
2492
+ border: SprinklePropBorder | None = None
2493
+ borderB: SprinklePropBorderB | None = None
2494
+ borderColor: SprinklePropBorderColor | None = None
2495
+ borderL: SprinklePropBorderL | None = None
2496
+ borderR: SprinklePropBorderR | None = None
2497
+ borderT: SprinklePropBorderT | None = None
2498
+ children: ProteusNode | None = None
2499
+ color: SprinklePropColor | None = None
2500
+ colorScheme: Literal['purple'] | Literal['neutral'] | ProteusValue | None = Field(
2501
+ default=None, description='Control the avatar fallback background and text colors.'
2502
+ )
2503
+ cursor: SprinklePropCursor | None = None
2504
+ display: SprinklePropDisplay | None = None
2505
+ fallback: Literal['opal'] | Literal['team'] | Literal['user'] | ProteusValue | None = Field(
2506
+ default=None, description='The fallback icon to display when no name or image is given.'
2507
+ )
2508
+ flex: SprinklePropFlex | None = None
2509
+ flexDirection: SprinklePropFlexDirection | None = None
2510
+ flexWrap: SprinklePropFlexWrap | None = None
2511
+ fontFamily: SprinklePropFontFamily | None = None
2512
+ fontSize: SprinklePropFontSize | None = None
2513
+ fontWeight: SprinklePropFontWeight | None = None
2514
+ gap: SprinklePropGap | None = None
2515
+ gridColumn: SprinklePropGridColumn | None = None
2516
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2517
+ h: SprinklePropH | None = None
2518
+ justifyContent: SprinklePropJustifyContent | None = None
2519
+ justifyItems: SprinklePropJustifyItems | None = None
2520
+ m: SprinklePropM | None = None
2521
+ maxH: SprinklePropMaxH | None = None
2522
+ maxW: SprinklePropMaxW | None = None
2523
+ mb: SprinklePropMb | None = None
2524
+ ml: SprinklePropMl | None = None
2525
+ mr: SprinklePropMr | None = None
2526
+ mt: SprinklePropMt | None = None
2527
+ mx: SprinklePropMx | None = None
2528
+ my: SprinklePropMy | None = None
2529
+ name: str | ProteusValue | None = Field(
2530
+ default=None, description='Use name to generate initials to show inside the avatar.'
2531
+ )
2532
+ objectFit: SprinklePropObjectFit | None = None
2533
+ overflow: SprinklePropOverflow | None = None
2534
+ overflowX: SprinklePropOverflowX | None = None
2535
+ overflowY: SprinklePropOverflowY | None = None
2536
+ p: SprinklePropP | None = None
2537
+ pb: SprinklePropPb | None = None
2538
+ pl: SprinklePropPl | None = None
2539
+ placeItems: SprinklePropPlaceItems | None = None
2540
+ pointerEvents: SprinklePropPointerEvents | None = None
2541
+ pr: SprinklePropPr | None = None
2542
+ pt: SprinklePropPt | None = None
2543
+ px: SprinklePropPx | None = None
2544
+ py: SprinklePropPy | None = None
2545
+ rounded: SprinklePropRounded | None = None
2546
+ shadow: SprinklePropShadow | None = None
2547
+ size: (
2548
+ Literal['xs']
2549
+ | Literal['sm']
2550
+ | Literal['md']
2551
+ | Literal['lg']
2552
+ | Literal['xl']
2553
+ | Literal['3xl']
2554
+ | Literal['2xs']
2555
+ | ProteusValue
2556
+ | None
2557
+ ) = Field(default=None, description='Control the size of the avatar.')
2558
+ src: str | ProteusValue | None = Field(
2559
+ default=None, description='Render the image inside the avatar.'
2560
+ )
2561
+ textAlign: SprinklePropTextAlign | None = None
2562
+ textTransform: SprinklePropTextTransform | None = None
2563
+ transition: SprinklePropTransition | None = None
2564
+ w: SprinklePropW | None = None
2565
+ whiteSpace: SprinklePropWhiteSpace | None = None
2566
+ z: SprinklePropZ | None = None
2567
+
2568
+
2392
2569
  class ProteusBadge(BaseModel):
2393
2570
  model_config = ConfigDict(
2394
2571
  extra='forbid',
@@ -2534,6 +2711,211 @@ class ProteusCancelAction(BaseModel):
2534
2711
  )
2535
2712
 
2536
2713
 
2714
+ class ProteusCard(BaseModel):
2715
+ model_config = ConfigDict(
2716
+ extra='forbid',
2717
+ )
2718
+ field_type: Literal['Card'] = Field(default='Card', alias='$type')
2719
+ alignItems: SprinklePropAlignItems | None = None
2720
+ alignSelf: SprinklePropAlignSelf | None = None
2721
+ animation: SprinklePropAnimation | None = None
2722
+ backgroundImage: SprinklePropBackgroundImage | None = None
2723
+ bg: SprinklePropBg | None = None
2724
+ border: SprinklePropBorder | None = None
2725
+ borderB: SprinklePropBorderB | None = None
2726
+ borderColor: SprinklePropBorderColor | None = None
2727
+ borderL: SprinklePropBorderL | None = None
2728
+ borderR: SprinklePropBorderR | None = None
2729
+ borderT: SprinklePropBorderT | None = None
2730
+ children: ProteusNode | None = None
2731
+ color: SprinklePropColor | None = None
2732
+ cursor: SprinklePropCursor | None = None
2733
+ display: SprinklePropDisplay | None = None
2734
+ flex: SprinklePropFlex | None = None
2735
+ flexDirection: SprinklePropFlexDirection | None = None
2736
+ flexWrap: SprinklePropFlexWrap | None = None
2737
+ fontFamily: SprinklePropFontFamily | None = None
2738
+ fontSize: SprinklePropFontSize | None = None
2739
+ fontWeight: SprinklePropFontWeight | None = None
2740
+ gap: SprinklePropGap | None = None
2741
+ gridColumn: SprinklePropGridColumn | None = None
2742
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2743
+ h: SprinklePropH | None = None
2744
+ justifyContent: SprinklePropJustifyContent | None = None
2745
+ justifyItems: SprinklePropJustifyItems | None = None
2746
+ m: SprinklePropM | None = None
2747
+ maxH: SprinklePropMaxH | None = None
2748
+ maxW: SprinklePropMaxW | None = None
2749
+ mb: SprinklePropMb | None = None
2750
+ ml: SprinklePropMl | None = None
2751
+ mr: SprinklePropMr | None = None
2752
+ mt: SprinklePropMt | None = None
2753
+ mx: SprinklePropMx | None = None
2754
+ my: SprinklePropMy | None = None
2755
+ objectFit: SprinklePropObjectFit | None = None
2756
+ overflow: SprinklePropOverflow | None = None
2757
+ overflowX: SprinklePropOverflowX | None = None
2758
+ overflowY: SprinklePropOverflowY | None = None
2759
+ p: SprinklePropP | None = None
2760
+ pb: SprinklePropPb | None = None
2761
+ pl: SprinklePropPl | None = None
2762
+ placeItems: SprinklePropPlaceItems | None = None
2763
+ pointerEvents: SprinklePropPointerEvents | None = None
2764
+ pr: SprinklePropPr | None = None
2765
+ pt: SprinklePropPt | None = None
2766
+ px: SprinklePropPx | None = None
2767
+ py: SprinklePropPy | None = None
2768
+ rounded: SprinklePropRounded | None = None
2769
+ shadow: SprinklePropShadow | None = None
2770
+ size: SprinklePropSize | None = None
2771
+ textAlign: SprinklePropTextAlign | None = None
2772
+ textTransform: SprinklePropTextTransform | None = None
2773
+ transition: SprinklePropTransition | None = None
2774
+ w: SprinklePropW | None = None
2775
+ whiteSpace: SprinklePropWhiteSpace | None = None
2776
+ z: SprinklePropZ | None = None
2777
+
2778
+
2779
+ class ProteusCardHeader(BaseModel):
2780
+ model_config = ConfigDict(
2781
+ extra='forbid',
2782
+ )
2783
+ field_type: Literal['CardHeader'] = Field(default='CardHeader', alias='$type')
2784
+ addonAfter: ProteusNode | None = Field(
2785
+ default=None, description='Display content inside the header after `children`.'
2786
+ )
2787
+ addonBefore: ProteusNode | None = Field(
2788
+ default=None, description='Display content inside the header before `children`.'
2789
+ )
2790
+ alignItems: SprinklePropAlignItems | None = None
2791
+ alignSelf: SprinklePropAlignSelf | None = None
2792
+ animation: SprinklePropAnimation | None = None
2793
+ backgroundImage: SprinklePropBackgroundImage | None = None
2794
+ bg: SprinklePropBg | None = None
2795
+ border: SprinklePropBorder | None = None
2796
+ borderB: SprinklePropBorderB | None = None
2797
+ borderColor: SprinklePropBorderColor | None = None
2798
+ borderL: SprinklePropBorderL | None = None
2799
+ borderR: SprinklePropBorderR | None = None
2800
+ borderT: SprinklePropBorderT | None = None
2801
+ children: ProteusNode | None = None
2802
+ color: SprinklePropColor | None = None
2803
+ cursor: SprinklePropCursor | None = None
2804
+ description: ProteusNode | None = Field(
2805
+ default=None, description='Add secondary text after the primary title.'
2806
+ )
2807
+ display: SprinklePropDisplay | None = None
2808
+ flex: SprinklePropFlex | None = None
2809
+ flexDirection: SprinklePropFlexDirection | None = None
2810
+ flexWrap: SprinklePropFlexWrap | None = None
2811
+ fontFamily: SprinklePropFontFamily | None = None
2812
+ fontSize: SprinklePropFontSize | None = None
2813
+ fontWeight: SprinklePropFontWeight | None = None
2814
+ gap: SprinklePropGap | None = None
2815
+ gridColumn: SprinklePropGridColumn | None = None
2816
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2817
+ h: SprinklePropH | None = None
2818
+ justifyContent: SprinklePropJustifyContent | None = None
2819
+ justifyItems: SprinklePropJustifyItems | None = None
2820
+ m: SprinklePropM | None = None
2821
+ maxH: SprinklePropMaxH | None = None
2822
+ maxW: SprinklePropMaxW | None = None
2823
+ mb: SprinklePropMb | None = None
2824
+ ml: SprinklePropMl | None = None
2825
+ mr: SprinklePropMr | None = None
2826
+ mt: SprinklePropMt | None = None
2827
+ mx: SprinklePropMx | None = None
2828
+ my: SprinklePropMy | None = None
2829
+ objectFit: SprinklePropObjectFit | None = None
2830
+ overflow: SprinklePropOverflow | None = None
2831
+ overflowX: SprinklePropOverflowX | None = None
2832
+ overflowY: SprinklePropOverflowY | None = None
2833
+ p: SprinklePropP | None = None
2834
+ pb: SprinklePropPb | None = None
2835
+ pl: SprinklePropPl | None = None
2836
+ placeItems: SprinklePropPlaceItems | None = None
2837
+ pointerEvents: SprinklePropPointerEvents | None = None
2838
+ pr: SprinklePropPr | None = None
2839
+ pt: SprinklePropPt | None = None
2840
+ px: SprinklePropPx | None = None
2841
+ py: SprinklePropPy | None = None
2842
+ rounded: SprinklePropRounded | None = None
2843
+ shadow: SprinklePropShadow | None = None
2844
+ size: SprinklePropSize | None = None
2845
+ textAlign: SprinklePropTextAlign | None = None
2846
+ textTransform: SprinklePropTextTransform | None = None
2847
+ transition: SprinklePropTransition | None = None
2848
+ w: SprinklePropW | None = None
2849
+ whiteSpace: SprinklePropWhiteSpace | None = None
2850
+ z: SprinklePropZ | None = None
2851
+
2852
+
2853
+ class ProteusCardLink(BaseModel):
2854
+ model_config = ConfigDict(
2855
+ extra='forbid',
2856
+ )
2857
+ field_type: Literal['CardLink'] = Field(default='CardLink', alias='$type')
2858
+ alignItems: SprinklePropAlignItems | None = None
2859
+ alignSelf: SprinklePropAlignSelf | None = None
2860
+ animation: SprinklePropAnimation | None = None
2861
+ backgroundImage: SprinklePropBackgroundImage | None = None
2862
+ bg: SprinklePropBg | None = None
2863
+ border: SprinklePropBorder | None = None
2864
+ borderB: SprinklePropBorderB | None = None
2865
+ borderColor: SprinklePropBorderColor | None = None
2866
+ borderL: SprinklePropBorderL | None = None
2867
+ borderR: SprinklePropBorderR | None = None
2868
+ borderT: SprinklePropBorderT | None = None
2869
+ children: ProteusNode | None = None
2870
+ color: SprinklePropColor | None = None
2871
+ cursor: SprinklePropCursor | None = None
2872
+ display: SprinklePropDisplay | None = None
2873
+ flex: SprinklePropFlex | None = None
2874
+ flexDirection: SprinklePropFlexDirection | None = None
2875
+ flexWrap: SprinklePropFlexWrap | None = None
2876
+ fontFamily: SprinklePropFontFamily | None = None
2877
+ fontSize: SprinklePropFontSize | None = None
2878
+ fontWeight: SprinklePropFontWeight | None = None
2879
+ gap: SprinklePropGap | None = None
2880
+ gridColumn: SprinklePropGridColumn | None = None
2881
+ gridTemplateColumns: SprinklePropGridTemplateColumns | None = None
2882
+ h: SprinklePropH | None = None
2883
+ href: str | ProteusValue | None = Field(default=None, description='The link href.')
2884
+ justifyContent: SprinklePropJustifyContent | None = None
2885
+ justifyItems: SprinklePropJustifyItems | None = None
2886
+ m: SprinklePropM | None = None
2887
+ maxH: SprinklePropMaxH | None = None
2888
+ maxW: SprinklePropMaxW | None = None
2889
+ mb: SprinklePropMb | None = None
2890
+ ml: SprinklePropMl | None = None
2891
+ mr: SprinklePropMr | None = None
2892
+ mt: SprinklePropMt | None = None
2893
+ mx: SprinklePropMx | None = None
2894
+ my: SprinklePropMy | None = None
2895
+ objectFit: SprinklePropObjectFit | None = None
2896
+ overflow: SprinklePropOverflow | None = None
2897
+ overflowX: SprinklePropOverflowX | None = None
2898
+ overflowY: SprinklePropOverflowY | None = None
2899
+ p: SprinklePropP | None = None
2900
+ pb: SprinklePropPb | None = None
2901
+ pl: SprinklePropPl | None = None
2902
+ placeItems: SprinklePropPlaceItems | None = None
2903
+ pointerEvents: SprinklePropPointerEvents | None = None
2904
+ pr: SprinklePropPr | None = None
2905
+ pt: SprinklePropPt | None = None
2906
+ px: SprinklePropPx | None = None
2907
+ py: SprinklePropPy | None = None
2908
+ rounded: SprinklePropRounded | None = None
2909
+ shadow: SprinklePropShadow | None = None
2910
+ size: SprinklePropSize | None = None
2911
+ textAlign: SprinklePropTextAlign | None = None
2912
+ textTransform: SprinklePropTextTransform | None = None
2913
+ transition: SprinklePropTransition | None = None
2914
+ w: SprinklePropW | None = None
2915
+ whiteSpace: SprinklePropWhiteSpace | None = None
2916
+ z: SprinklePropZ | None = None
2917
+
2918
+
2537
2919
  class ProteusField(BaseModel):
2538
2920
  model_config = ConfigDict(
2539
2921
  extra='forbid',
@@ -2832,6 +3214,9 @@ class ProteusInput(BaseModel):
2832
3214
  pt: SprinklePropPt | None = None
2833
3215
  px: SprinklePropPx | None = None
2834
3216
  py: SprinklePropPy | None = None
3217
+ required: bool | ProteusValue | None = Field(
3218
+ default=None, description='Whether selecting this input is required.'
3219
+ )
2835
3220
  rounded: SprinklePropRounded | None = None
2836
3221
  shadow: SprinklePropShadow | None = None
2837
3222
  textAlign: SprinklePropTextAlign | None = None
@@ -2947,6 +3332,10 @@ class ProteusMap(BaseModel):
2947
3332
  path: str = Field(
2948
3333
  ..., description="JSON pointer path to the source array in the data (e.g., '/results')"
2949
3334
  )
3335
+ separator: ProteusNode | None = Field(
3336
+ default=None,
3337
+ description='Optional separator to render between items. Can be a string or a ProteusNode for more complex separators.',
3338
+ )
2950
3339
 
2951
3340
 
2952
3341
  class ProteusSelect(BaseModel):
@@ -2959,6 +3348,9 @@ class ProteusSelect(BaseModel):
2959
3348
  default=None, description='The name of the inner select element.'
2960
3349
  )
2961
3350
  options: list[Option] = Field(..., description='The select items/options we want to render.')
3351
+ required: bool | ProteusValue | None = Field(
3352
+ default=None, description='Whether the select value is required.'
3353
+ )
2962
3354
 
2963
3355
 
2964
3356
  class ProteusSelectTrigger(BaseModel):
@@ -3110,20 +3502,55 @@ class ProteusText(BaseModel):
3110
3502
  z: SprinklePropZ | None = None
3111
3503
 
3112
3504
 
3505
+ class ProteusCondition(
3506
+ RootModel[
3507
+ ProteusCondition1
3508
+ | ProteusCondition2
3509
+ | ProteusCondition3
3510
+ | ProteusCondition4
3511
+ | ProteusCondition5
3512
+ | ProteusCondition6
3513
+ | ProteusCondition7
3514
+ | ProteusCondition8
3515
+ | ProteusCondition9
3516
+ ]
3517
+ ):
3518
+ root: (
3519
+ ProteusCondition1
3520
+ | ProteusCondition2
3521
+ | ProteusCondition3
3522
+ | ProteusCondition4
3523
+ | ProteusCondition5
3524
+ | ProteusCondition6
3525
+ | ProteusCondition7
3526
+ | ProteusCondition8
3527
+ | ProteusCondition9
3528
+ ) = Field(
3529
+ ...,
3530
+ description='Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.',
3531
+ )
3532
+
3533
+
3113
3534
  class ProteusElement(
3114
3535
  RootModel[
3115
3536
  ProteusAction
3537
+ | ProteusAvatar
3116
3538
  | ProteusBadge
3117
3539
  | ProteusCancelAction
3540
+ | ProteusCard
3541
+ | ProteusCardHeader
3542
+ | ProteusCardLink
3118
3543
  | ProteusChart
3119
3544
  | ProteusDataTable
3120
3545
  | ProteusField
3121
3546
  | ProteusGroup
3122
3547
  | ProteusHeading
3548
+ | ProteusIconCalendar
3123
3549
  | ProteusImage
3124
3550
  | ProteusInput
3125
3551
  | ProteusLink
3126
3552
  | ProteusMap
3553
+ | ProteusQuestion
3127
3554
  | ProteusRange
3128
3555
  | ProteusSelect
3129
3556
  | ProteusSelectContent
@@ -3138,17 +3565,23 @@ class ProteusElement(
3138
3565
  ):
3139
3566
  root: (
3140
3567
  ProteusAction
3568
+ | ProteusAvatar
3141
3569
  | ProteusBadge
3142
3570
  | ProteusCancelAction
3571
+ | ProteusCard
3572
+ | ProteusCardHeader
3573
+ | ProteusCardLink
3143
3574
  | ProteusChart
3144
3575
  | ProteusDataTable
3145
3576
  | ProteusField
3146
3577
  | ProteusGroup
3147
3578
  | ProteusHeading
3579
+ | ProteusIconCalendar
3148
3580
  | ProteusImage
3149
3581
  | ProteusInput
3150
3582
  | ProteusLink
3151
3583
  | ProteusMap
3584
+ | ProteusQuestion
3152
3585
  | ProteusRange
3153
3586
  | ProteusSelect
3154
3587
  | ProteusSelectContent
@@ -3188,10 +3621,16 @@ class ProteusNode(
3188
3621
  )
3189
3622
 
3190
3623
 
3624
+ ProteusCondition8.model_rebuild()
3625
+ ProteusCondition9.model_rebuild()
3191
3626
  ProteusDocument.model_rebuild()
3192
3627
  ProteusAction.model_rebuild()
3628
+ ProteusAvatar.model_rebuild()
3193
3629
  ProteusBadge.model_rebuild()
3194
3630
  ProteusCancelAction.model_rebuild()
3631
+ ProteusCard.model_rebuild()
3632
+ ProteusCardHeader.model_rebuild()
3633
+ ProteusCardLink.model_rebuild()
3195
3634
  ProteusField.model_rebuild()
3196
3635
  ProteusGroup.model_rebuild()
3197
3636
  ProteusHeading.model_rebuild()
@@ -3217,18 +3656,24 @@ class UI:
3217
3656
  MIME_TYPE = "application/vnd.opal.proteus+json"
3218
3657
 
3219
3658
  Action = ProteusAction
3659
+ Avatar = ProteusAvatar
3220
3660
  Badge = ProteusBadge
3221
3661
  CancelAction = ProteusCancelAction
3662
+ Card = ProteusCard
3663
+ CardHeader = ProteusCardHeader
3664
+ CardLink = ProteusCardLink
3222
3665
  Chart = ProteusChart
3223
3666
  DataTable = ProteusDataTable
3224
3667
  Document = ProteusDocument
3225
3668
  Field = ProteusField
3226
3669
  Group = ProteusGroup
3227
3670
  Heading = ProteusHeading
3671
+ IconCalendar = ProteusIconCalendar
3228
3672
  Image = ProteusImage
3229
3673
  Input = ProteusInput
3230
3674
  Link = ProteusLink
3231
3675
  Map = ProteusMap
3676
+ Question = ProteusQuestion
3232
3677
  Range = ProteusRange
3233
3678
  Select = ProteusSelect
3234
3679
  SelectContent = ProteusSelectContent
@@ -3239,3 +3684,4 @@ class UI:
3239
3684
  Textarea = ProteusTextarea
3240
3685
  Time = ProteusTime
3241
3686
  Value = ProteusValue
3687
+ 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.19.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.19-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.19-dev",
6
6
  packages=find_packages(),
7
7
  install_requires=[
8
8
  "fastapi>=0.100.0",