optimizely-opal.opal-tools-sdk 0.1.5.dev0__py3-none-any.whl → 0.1.7.dev0__py3-none-any.whl

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.

Potentially problematic release.


This version of optimizely-opal.opal-tools-sdk might be problematic. Click here for more details.

opal_tools_sdk/models.py CHANGED
@@ -112,6 +112,8 @@ class IslandConfig(BaseModel):
112
112
 
113
113
  fields: list[Field]
114
114
  actions: list[Action]
115
+ type: Optional[str] = None
116
+ icon: Optional[str] = None
115
117
 
116
118
 
117
119
  class IslandResponse(BaseModel):
opal_tools_sdk/service.py CHANGED
@@ -1,15 +1,16 @@
1
- from typing import Dict, List, Any, Callable, Type, Optional, get_type_hints
1
+ from typing import Dict, List, Any, Callable, Optional, get_type_hints
2
2
  import inspect
3
3
  import logging
4
- from fastapi import FastAPI, APIRouter, Depends, Header, HTTPException, Request
4
+ from fastapi import FastAPI, APIRouter, HTTPException, Request
5
5
  from fastapi.routing import APIRoute
6
- from pydantic import BaseModel, create_model
6
+ from pydantic import BaseModel, ValidationError
7
7
 
8
- from .models import Function, Parameter, ParameterType, AuthRequirement
8
+ from .models import Function, Parameter, AuthRequirement
9
9
  from . import _registry
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
13
+
13
14
  class ToolsService:
14
15
  """Main class for managing Opal tools."""
15
16
 
@@ -33,15 +34,12 @@ class ToolsService:
33
34
  routes = []
34
35
  for route in app.routes:
35
36
  if isinstance(route, APIRoute):
36
- routes.append({
37
- "path": route.path,
38
- "name": route.name,
39
- "methods": route.methods
40
- })
37
+ routes.append({"path": route.path, "name": route.name, "methods": route.methods})
41
38
  return {"routes": routes}
42
39
 
43
40
  def _init_routes(self) -> None:
44
41
  """Initialize the discovery endpoint."""
42
+
45
43
  @self.router.get("/discovery")
46
44
  async def discovery() -> Dict[str, Any]:
47
45
  """Return the discovery information for this tools service."""
@@ -66,21 +64,23 @@ class ToolsService:
66
64
  # Auth requirements should always be a list
67
65
  if isinstance(handler.__auth_requirements__, list):
68
66
  for req in handler.__auth_requirements__:
69
- auth_requirements.append(AuthRequirement(
70
- provider=req.get("provider", ""),
71
- scope_bundle=req.get("scope_bundle", ""),
72
- required=req.get("required", True)
73
- ))
67
+ auth_requirements.append(
68
+ AuthRequirement(
69
+ provider=req.get("provider", ""), scope_bundle=req.get("scope_bundle", ""), required=req.get("required", True)
70
+ )
71
+ )
74
72
 
75
73
  return auth_requirements
76
74
 
77
- def register_tool(self,
78
- name: str,
79
- description: str,
80
- handler: Callable,
81
- parameters: List[Parameter],
82
- endpoint: str,
83
- auth_requirements: Optional[List[AuthRequirement]] = None) -> None:
75
+ def register_tool(
76
+ self,
77
+ name: str,
78
+ description: str,
79
+ handler: Callable,
80
+ parameters: List[Parameter],
81
+ endpoint: str,
82
+ auth_requirements: Optional[List[AuthRequirement]] = None,
83
+ ) -> None:
84
84
  """Register a tool function.
85
85
 
86
86
  Args:
@@ -101,11 +101,7 @@ class ToolsService:
101
101
  final_auth_requirements = auth_requirements if auth_requirements else handler_auth_requirements
102
102
 
103
103
  function = Function(
104
- name=name,
105
- description=description,
106
- parameters=parameters,
107
- endpoint=endpoint,
108
- auth_requirements=final_auth_requirements
104
+ name=name, description=description, parameters=parameters, endpoint=endpoint, auth_requirements=final_auth_requirements
109
105
  )
110
106
 
111
107
  self.functions.append(function)
@@ -144,7 +140,6 @@ class ToolsService:
144
140
  param_name = list(sig.parameters.keys())[0]
145
141
  param_type = get_type_hints(handler).get(param_name)
146
142
 
147
-
148
143
  args = []
149
144
  kwargs = {}
150
145
  if param_type:
@@ -168,8 +163,12 @@ class ToolsService:
168
163
 
169
164
  logger.info(f"Tool {name} returned: {result}")
170
165
  return result
166
+ except ValidationError as e:
167
+ logger.warning(f"Invalid parameters predicted by LLM for tool {name}: {str(e)}")
168
+ raise HTTPException(status_code=400, detail=str(e))
171
169
  except Exception as e:
172
170
  import traceback
171
+
173
172
  logger.error(f"Error in tool {name}: {str(e)}")
174
173
  logger.error(traceback.format_exc())
175
174
  raise HTTPException(status_code=500, detail=str(e))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: optimizely-opal.opal-tools-sdk
3
- Version: 0.1.5.dev0
3
+ Version: 0.1.7.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
@@ -223,6 +223,8 @@ Actions represent buttons or operations:
223
223
  Contains the complete island configuration:
224
224
  - `fields`: List of IslandConfig.Field objects
225
225
  - `actions`: List of IslandConfig.Action objects
226
+ - `type`: Island type for UI rendering (optional, default: `None`)
227
+ - `icon`: Icon to display in the island (optional, default: `None`)
226
228
 
227
229
  #### IslandResponse
228
230
  The response wrapper for islands:
@@ -3,9 +3,9 @@ opal_tools_sdk/_registry.py,sha256=YE3eD4kcS09QDe4RccBYAzXPo9znEU7fblrsB-g3o-Y,6
3
3
  opal_tools_sdk/auth.py,sha256=9aMiZv6n6_iu7hQA0sKg4hgNr5DzYFFuP0SWUoZf_Vw,1520
4
4
  opal_tools_sdk/decorators.py,sha256=iHal7RElOSCWjqKHIK-Hc4GKOsjuGyUg0_lsQKVQShg,5315
5
5
  opal_tools_sdk/logging.py,sha256=krvkhdql2GWh0aCWj5gfqyn5plsyLJ773WzIirK7tkU,1325
6
- opal_tools_sdk/models.py,sha256=YESFXdIPIFoVqP6OXtswXzHQ1tYMFVSnb8rFVe9cFj4,3403
7
- opal_tools_sdk/service.py,sha256=wVYe40zEZc1ynIkvowD9APU8BFHQ5fdy3j8qlsdZB1U,6965
8
- optimizely_opal_opal_tools_sdk-0.1.5.dev0.dist-info/METADATA,sha256=KS830xd4wFliLcbfJBuWSxj49pIH_AfajJJOrm_UG0Q,8085
9
- optimizely_opal_opal_tools_sdk-0.1.5.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
- optimizely_opal_opal_tools_sdk-0.1.5.dev0.dist-info/top_level.txt,sha256=nCJ5PxF0rgoV6yNJvvuUaZPx4D3EWkl7gpu-6xafH1E,15
11
- optimizely_opal_opal_tools_sdk-0.1.5.dev0.dist-info/RECORD,,
6
+ opal_tools_sdk/models.py,sha256=RAm1rIVVMZvAJX_eK-CewRdpyZZuNTbxyaDMfF-LAg4,3465
7
+ opal_tools_sdk/service.py,sha256=a5ZC-J1GF5y1-FdWCXdilCy7p5hG63MTTn6frBBCo4Y,6939
8
+ optimizely_opal_opal_tools_sdk-0.1.7.dev0.dist-info/METADATA,sha256=st5HKE4gdHY-YVl6IfnDCEQ7W6SgJbdNYXni7VXuRNI,8220
9
+ optimizely_opal_opal_tools_sdk-0.1.7.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
+ optimizely_opal_opal_tools_sdk-0.1.7.dev0.dist-info/top_level.txt,sha256=nCJ5PxF0rgoV6yNJvvuUaZPx4D3EWkl7gpu-6xafH1E,15
11
+ optimizely_opal_opal_tools_sdk-0.1.7.dev0.dist-info/RECORD,,