optimizely-opal.opal-tools-sdk 0.1.16.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.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/PKG-INFO +1 -1
  2. {optimizely_opal_opal_tools_sdk-0.1.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/opal_tools_sdk/proteus.py +561 -88
  3. {optimizely_opal_opal_tools_sdk-0.1.16.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.16.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.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/pyproject.toml +1 -1
  6. {optimizely_opal_opal_tools_sdk-0.1.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/setup.py +1 -1
  7. {optimizely_opal_opal_tools_sdk-0.1.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/README.md +0 -0
  8. {optimizely_opal_opal_tools_sdk-0.1.16.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.16.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.16.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.16.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.16.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.16.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.16.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.16.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.16.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.16.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.16.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.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/setup.cfg +0 -0
  20. {optimizely_opal_opal_tools_sdk-0.1.16.dev0 → optimizely_opal_opal_tools_sdk-0.1.18.dev0}/tests/test_integration.py +0 -0
  21. {optimizely_opal_opal_tools_sdk-0.1.16.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.16.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-07T00:35:26+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]):
@@ -35,46 +35,33 @@ class ProteusEventHandler2(BaseModel):
35
35
  message: str = Field(..., description='Message to send to LLM via sendNewMessage()')
36
36
 
37
37
 
38
- class ProteusEventHandler3(BaseModel):
39
- """
40
- Client-side component action - for downloading a URL
41
- """
42
-
43
- model_config = ConfigDict(
44
- extra='forbid',
45
- )
46
- action: Literal['download'] = Field(default='download', description='The action type')
47
- url: str = Field(..., description='URL to download')
48
-
49
-
50
- class ProteusEventHandler(
51
- RootModel[ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3]
52
- ):
53
- root: ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3 = Field(
54
- ...,
55
- description='Handler for user interactions - a server-side tool call, client-side message, or client-side component action',
56
- )
57
-
58
-
59
38
  class Series(BaseModel):
60
39
  model_config = ConfigDict(
61
40
  extra='forbid',
62
41
  )
63
- color: str | None = Field(default=None, description='Series color')
64
42
  dataKey: str = Field(..., description='Key in data records for this series')
65
- labelKey: str | None = Field(
66
- default=None,
67
- description='Key in data records for pre-formatted labels displayed above bars',
68
- )
69
43
  name: str | None = Field(default=None, description='Display name for legend')
70
44
 
71
45
 
46
+ class Format(BaseModel):
47
+ """
48
+ Formatter with options
49
+ """
50
+
51
+ options: dict[str, Any] | None = None
52
+ type: str
53
+
54
+
72
55
  class Column(BaseModel):
73
56
  model_config = ConfigDict(
74
57
  extra='forbid',
75
58
  )
76
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
+ )
77
63
  header: str = Field(..., description='Column header text')
64
+ size: float | None = Field(default=None, description='Column size')
78
65
 
79
66
 
80
67
  class Marks(BaseModel):
@@ -93,11 +80,30 @@ class Option(BaseModel):
93
80
  value: str = Field(..., description='Return a unique key for each item')
94
81
 
95
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
+
96
98
  class ProteusValue(BaseModel):
97
99
  model_config = ConfigDict(
98
100
  extra='forbid',
99
101
  )
100
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
+ )
101
107
  path: str = Field(
102
108
  ...,
103
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).",
@@ -1681,9 +1687,9 @@ class SprinklePropZ(
1681
1687
  )
1682
1688
 
1683
1689
 
1684
- class ProteusAtomicCondition1(BaseModel):
1690
+ class ProteusCondition1(BaseModel):
1685
1691
  """
1686
- 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.
1687
1693
  """
1688
1694
 
1689
1695
  model_config = ConfigDict(
@@ -1694,9 +1700,9 @@ class ProteusAtomicCondition1(BaseModel):
1694
1700
  )
1695
1701
 
1696
1702
 
1697
- class ProteusAtomicCondition2(BaseModel):
1703
+ class ProteusCondition2(BaseModel):
1698
1704
  """
1699
- 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.
1700
1706
  """
1701
1707
 
1702
1708
  model_config = ConfigDict(
@@ -1707,9 +1713,9 @@ class ProteusAtomicCondition2(BaseModel):
1707
1713
  )
1708
1714
 
1709
1715
 
1710
- class ProteusAtomicCondition3(BaseModel):
1716
+ class ProteusCondition3(BaseModel):
1711
1717
  """
1712
- 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.
1713
1719
  """
1714
1720
 
1715
1721
  model_config = ConfigDict(
@@ -1720,9 +1726,9 @@ class ProteusAtomicCondition3(BaseModel):
1720
1726
  )
1721
1727
 
1722
1728
 
1723
- class ProteusAtomicCondition4(BaseModel):
1729
+ class ProteusCondition4(BaseModel):
1724
1730
  """
1725
- 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.
1726
1732
  """
1727
1733
 
1728
1734
  model_config = ConfigDict(
@@ -1733,9 +1739,9 @@ class ProteusAtomicCondition4(BaseModel):
1733
1739
  )
1734
1740
 
1735
1741
 
1736
- class ProteusAtomicCondition5(BaseModel):
1742
+ class ProteusCondition5(BaseModel):
1737
1743
  """
1738
- 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.
1739
1745
  """
1740
1746
 
1741
1747
  model_config = ConfigDict(
@@ -1746,9 +1752,9 @@ class ProteusAtomicCondition5(BaseModel):
1746
1752
  )
1747
1753
 
1748
1754
 
1749
- class ProteusAtomicCondition6(BaseModel):
1755
+ class ProteusCondition6(BaseModel):
1750
1756
  """
1751
- 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.
1752
1758
  """
1753
1759
 
1754
1760
  model_config = ConfigDict(
@@ -1759,9 +1765,9 @@ class ProteusAtomicCondition6(BaseModel):
1759
1765
  )
1760
1766
 
1761
1767
 
1762
- class ProteusAtomicCondition7(BaseModel):
1768
+ class ProteusCondition7(BaseModel):
1763
1769
  """
1764
- 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.
1765
1771
  """
1766
1772
 
1767
1773
  model_config = ConfigDict(
@@ -1774,63 +1780,39 @@ class ProteusAtomicCondition7(BaseModel):
1774
1780
  )
1775
1781
 
1776
1782
 
1777
- class ProteusAtomicCondition(
1778
- RootModel[
1779
- ProteusAtomicCondition1
1780
- | ProteusAtomicCondition2
1781
- | ProteusAtomicCondition3
1782
- | ProteusAtomicCondition4
1783
- | ProteusAtomicCondition5
1784
- | ProteusAtomicCondition6
1785
- | ProteusAtomicCondition7
1786
- ]
1787
- ):
1788
- root: (
1789
- ProteusAtomicCondition1
1790
- | ProteusAtomicCondition2
1791
- | ProteusAtomicCondition3
1792
- | ProteusAtomicCondition4
1793
- | ProteusAtomicCondition5
1794
- | ProteusAtomicCondition6
1795
- | ProteusAtomicCondition7
1796
- ) = Field(
1797
- ...,
1798
- description='Simple comparison condition - single operator only (used in OR arrays to avoid recursion)',
1799
- )
1800
-
1783
+ class ProteusEventHandler3(BaseModel):
1784
+ """
1785
+ Client-side component action - for downloading a URL
1786
+ """
1801
1787
 
1802
- class Or(BaseModel):
1803
1788
  model_config = ConfigDict(
1804
1789
  extra='forbid',
1805
1790
  )
1806
- and_: list[ProteusAtomicCondition] = Field(
1791
+ action: Literal['download'] = Field(default='download', description='The action type')
1792
+ url: ProteusValue | str = Field(..., description='URL to download')
1793
+
1794
+
1795
+ class ProteusEventHandler(
1796
+ RootModel[ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3]
1797
+ ):
1798
+ root: ProteusEventHandler1 | ProteusEventHandler2 | ProteusEventHandler3 = Field(
1807
1799
  ...,
1808
- alias='and',
1809
- description='Logical AND - returns true if all conditions are true',
1810
- min_length=1,
1800
+ description='Handler for user interactions - a server-side tool call, client-side message, or client-side component action',
1811
1801
  )
1812
1802
 
1813
1803
 
1814
- class ProteusCondition1(BaseModel):
1804
+ class ProteusZip(BaseModel):
1815
1805
  """
1816
- Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.
1806
+ Zips multiple parallel arrays into an array of objects. Each key in 'sources' becomes a property in the resulting row objects.
1817
1807
  """
1818
1808
 
1819
1809
  model_config = ConfigDict(
1820
1810
  extra='forbid',
1821
1811
  )
1822
- or_: list[Or | ProteusAtomicCondition] = Field(
1823
- ...,
1824
- alias='or',
1825
- description='Logical OR - returns true if any condition is true',
1826
- min_length=1,
1827
- )
1828
-
1829
-
1830
- class ProteusCondition(RootModel[ProteusAtomicCondition | ProteusCondition1]):
1831
- root: ProteusAtomicCondition | ProteusCondition1 = 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='Condition for Show component. Can be a comparison operator, logical AND, or logical OR. Supports nesting.',
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.16.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.16-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.16-dev",
5
+ version="0.1.18-dev",
6
6
  packages=find_packages(),
7
7
  install_requires=[
8
8
  "fastapi>=0.100.0",