1818from collections .abc import Mapping , Sequence
1919from typing import TYPE_CHECKING , List , Optional , TypeVar , Union
2020
21- from pydantic import BaseModel , Field , ValidationError
22-
23- try :
24- from pydantic import ConfigDict
25-
26- _PYDANTIC_V2 = True
27- except ImportError :
28- ConfigDict = None
29- _PYDANTIC_V2 = False
21+ from pydantic import BaseModel , Field , StrictInt , StrictStr , ValidationError
3022
3123from opentelemetry .semconv ._incubating .attributes import (
3224 openai_attributes as OpenAIAttributes ,
3325)
3426
27+ _PYDANTIC_V2 = hasattr (BaseModel , "model_validate" )
28+
29+ if _PYDANTIC_V2 :
30+ from pydantic import ConfigDict
31+ else :
32+ ConfigDict = None
33+
3534if TYPE_CHECKING :
3635 from opentelemetry .util .genai .types import (
3736 InputMessage ,
@@ -71,51 +70,53 @@ class Config:
7170
7271
7372class _ResponseTextFormatModel (_ExtractorModel ):
74- type : Optional [str ] = None
73+ type : Optional [StrictStr ] = None
7574
7675
7776class _ResponseTextConfigModel (_ExtractorModel ):
7877 format : Optional [_ResponseTextFormatModel ] = None
7978
8079
8180class _ResponseInputContentModel (_ExtractorModel ):
82- text : Optional [str ] = None
81+ text : Optional [StrictStr ] = None
8382
8483
8584class _ResponseInputItemModel (_ExtractorModel ):
86- role : Optional [str ] = None
87- content : Optional [Union [str , List [_ResponseInputContentModel ]]] = None
85+ role : Optional [StrictStr ] = None
86+ content : Optional [Union [StrictStr , List [_ResponseInputContentModel ]]] = (
87+ None
88+ )
8889
8990
9091class _ResponsesRequestModel (_ExtractorModel ):
91- instructions : Optional [str ] = None
92- input : Optional [Union [str , List [_ResponseInputItemModel ]]] = None
92+ instructions : Optional [StrictStr ] = None
93+ input : Optional [Union [StrictStr , List [_ResponseInputItemModel ]]] = None
9394 text : Optional [_ResponseTextConfigModel ] = None
9495
9596
9697class _ResponseOutputContentModel (_ExtractorModel ):
97- type : Optional [str ] = None
98- text : Optional [str ] = None
99- refusal : Optional [str ] = None
98+ type : Optional [StrictStr ] = None
99+ text : Optional [StrictStr ] = None
100+ refusal : Optional [StrictStr ] = None
100101
101102
102103class _ResponseOutputItemModel (_ExtractorModel ):
103- type : Optional [str ] = None
104- role : Optional [str ] = None
105- status : Optional [str ] = None
104+ type : Optional [StrictStr ] = None
105+ role : Optional [StrictStr ] = None
106+ status : Optional [StrictStr ] = None
106107 content : List [_ResponseOutputContentModel ] = Field (default_factory = list )
107108
108109
109110class _UsageDetailsModel (_ExtractorModel ):
110- cached_tokens : Optional [int ] = None
111- cache_creation_input_tokens : Optional [int ] = None
111+ cached_tokens : Optional [StrictInt ] = None
112+ cache_creation_input_tokens : Optional [StrictInt ] = None
112113
113114
114115class _UsageModel (_ExtractorModel ):
115- input_tokens : Optional [int ] = None
116- output_tokens : Optional [int ] = None
117- prompt_tokens : Optional [int ] = None
118- completion_tokens : Optional [int ] = None
116+ input_tokens : Optional [StrictInt ] = None
117+ output_tokens : Optional [StrictInt ] = None
118+ prompt_tokens : Optional [StrictInt ] = None
119+ completion_tokens : Optional [StrictInt ] = None
119120 input_tokens_details : Optional [_UsageDetailsModel ] = None
120121 prompt_tokens_details : Optional [_UsageDetailsModel ] = None
121122
@@ -125,9 +126,9 @@ class _ResponsesResultModel(_ExtractorModel):
125126 # terminal message items available yet" so downstream extraction helpers
126127 # naturally return empty lists instead of raising.
127128 output : List [_ResponseOutputItemModel ] = Field (default_factory = list )
128- model : Optional [str ] = None
129- id : Optional [str ] = None
130- service_tier : Optional [str ] = None
129+ model : Optional [StrictStr ] = None
130+ id : Optional [StrictStr ] = None
131+ service_tier : Optional [StrictStr ] = None
131132 usage : Optional [_UsageModel ] = None
132133
133134
@@ -138,12 +139,19 @@ def _rebuild_model(model_type: type[BaseModel]) -> None:
138139 model_type .update_forward_refs (** globals ())
139140
140141
141- _rebuild_model (_ResponseTextConfigModel )
142- _rebuild_model (_ResponseInputItemModel )
143- _rebuild_model (_ResponsesRequestModel )
144- _rebuild_model (_ResponseOutputItemModel )
145- _rebuild_model (_UsageModel )
146- _rebuild_model (_ResponsesResultModel )
142+ for _model_type in (
143+ _ResponseTextFormatModel ,
144+ _ResponseTextConfigModel ,
145+ _ResponseInputContentModel ,
146+ _ResponseInputItemModel ,
147+ _ResponsesRequestModel ,
148+ _ResponseOutputContentModel ,
149+ _ResponseOutputItemModel ,
150+ _UsageDetailsModel ,
151+ _UsageModel ,
152+ _ResponsesResultModel ,
153+ ):
154+ _rebuild_model (_model_type )
147155
148156
149157def _validate_model (
0 commit comments