veadk-python 0.2.5__py3-none-any.whl → 0.2.7__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 veadk-python might be problematic. Click here for more details.
- veadk/agent.py +29 -22
- veadk/agent_builder.py +94 -0
- veadk/auth/__init__.py +13 -0
- veadk/auth/base_auth.py +22 -0
- veadk/auth/veauth/__init__.py +13 -0
- veadk/auth/veauth/apmplus_veauth.py +65 -0
- veadk/auth/veauth/ark_veauth.py +77 -0
- veadk/auth/veauth/base_veauth.py +50 -0
- veadk/auth/veauth/cozeloop_veauth.py +13 -0
- veadk/auth/veauth/prompt_pilot_veauth.py +60 -0
- veadk/auth/veauth/vesearch_veauth.py +62 -0
- veadk/cli/cli.py +2 -0
- veadk/cli/cli_deploy.py +5 -2
- veadk/cli/cli_init.py +25 -6
- veadk/cli/cli_pipeline.py +220 -0
- veadk/cli/cli_prompt.py +4 -4
- veadk/config.py +45 -81
- veadk/configs/__init__.py +13 -0
- veadk/configs/database_configs.py +83 -0
- veadk/configs/model_configs.py +42 -0
- veadk/configs/tool_configs.py +42 -0
- veadk/configs/tracing_configs.py +110 -0
- veadk/consts.py +32 -1
- veadk/database/database_adapter.py +256 -3
- veadk/database/kv/redis_database.py +47 -0
- veadk/database/local_database.py +23 -4
- veadk/database/relational/mysql_database.py +58 -0
- veadk/database/vector/opensearch_vector_database.py +6 -3
- veadk/database/viking/viking_database.py +272 -36
- veadk/integrations/ve_code_pipeline/__init__.py +13 -0
- veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +431 -0
- veadk/integrations/ve_cozeloop/__init__.py +13 -0
- veadk/integrations/ve_cozeloop/ve_cozeloop.py +96 -0
- veadk/integrations/ve_cr/__init__.py +13 -0
- veadk/integrations/ve_cr/ve_cr.py +220 -0
- veadk/integrations/ve_faas/template/cookiecutter.json +3 -2
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +2 -2
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +1 -1
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +24 -1
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -1
- veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +1 -12
- veadk/integrations/ve_faas/ve_faas.py +352 -35
- veadk/integrations/ve_faas/web_template/cookiecutter.json +17 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +41 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
- veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
- veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +6 -3
- veadk/integrations/ve_tls/__init__.py +13 -0
- veadk/integrations/ve_tls/utils.py +117 -0
- veadk/integrations/ve_tls/ve_tls.py +208 -0
- veadk/integrations/ve_tos/ve_tos.py +128 -73
- veadk/knowledgebase/knowledgebase.py +116 -20
- veadk/memory/long_term_memory.py +20 -21
- veadk/memory/short_term_memory_processor.py +9 -4
- veadk/runner.py +213 -223
- veadk/tools/builtin_tools/vesearch.py +2 -2
- veadk/tools/builtin_tools/video_generate.py +27 -20
- veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +5 -0
- veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +253 -129
- veadk/tracing/telemetry/attributes/extractors/types.py +15 -4
- veadk/tracing/telemetry/exporters/apmplus_exporter.py +158 -12
- veadk/tracing/telemetry/exporters/cozeloop_exporter.py +4 -9
- veadk/tracing/telemetry/exporters/tls_exporter.py +4 -10
- veadk/tracing/telemetry/opentelemetry_tracer.py +11 -5
- veadk/tracing/telemetry/telemetry.py +23 -5
- veadk/utils/logger.py +1 -1
- veadk/utils/misc.py +48 -0
- veadk/utils/volcengine_sign.py +6 -2
- veadk/version.py +1 -1
- {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/METADATA +2 -1
- veadk_python-0.2.7.dist-info/RECORD +172 -0
- veadk_python-0.2.5.dist-info/RECORD +0 -127
- /veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{{ cookiecutter.app_name|replace('-', '_') }} → {{ cookiecutter.app_name }}}/__init__.py +0 -0
- /veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{{ cookiecutter.app_name|replace('-', '_') }} → {{ cookiecutter.app_name }}}/agent.py +0 -0
- {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/WHEEL +0 -0
- {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/entry_points.txt +0 -0
- {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/licenses/LICENSE +0 -0
- {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/top_level.txt +0 -0
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from dataclasses import dataclass
|
|
15
16
|
from typing import Any
|
|
16
17
|
|
|
17
18
|
from google.adk.models.llm_request import LlmRequest
|
|
@@ -28,13 +29,100 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
|
28
29
|
from pydantic import BaseModel, Field
|
|
29
30
|
from typing_extensions import override
|
|
30
31
|
|
|
31
|
-
from veadk.config import
|
|
32
|
+
from veadk.config import settings
|
|
32
33
|
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
|
|
33
34
|
from veadk.utils.logger import get_logger
|
|
34
35
|
|
|
35
36
|
logger = get_logger(__name__)
|
|
36
37
|
|
|
37
38
|
|
|
39
|
+
_GEN_AI_CLIENT_OPERATION_DURATION_BUCKETS = [
|
|
40
|
+
0.01,
|
|
41
|
+
0.02,
|
|
42
|
+
0.04,
|
|
43
|
+
0.08,
|
|
44
|
+
0.16,
|
|
45
|
+
0.32,
|
|
46
|
+
0.64,
|
|
47
|
+
1.28,
|
|
48
|
+
2.56,
|
|
49
|
+
5.12,
|
|
50
|
+
10.24,
|
|
51
|
+
20.48,
|
|
52
|
+
40.96,
|
|
53
|
+
81.92,
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
_GEN_AI_SERVER_TIME_PER_OUTPUT_TOKEN_BUCKETS = [
|
|
57
|
+
0.01,
|
|
58
|
+
0.025,
|
|
59
|
+
0.05,
|
|
60
|
+
0.075,
|
|
61
|
+
0.1,
|
|
62
|
+
0.15,
|
|
63
|
+
0.2,
|
|
64
|
+
0.3,
|
|
65
|
+
0.4,
|
|
66
|
+
0.5,
|
|
67
|
+
0.75,
|
|
68
|
+
1.0,
|
|
69
|
+
2.5,
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
_GEN_AI_SERVER_TIME_TO_FIRST_TOKEN_BUCKETS = [
|
|
73
|
+
0.001,
|
|
74
|
+
0.005,
|
|
75
|
+
0.01,
|
|
76
|
+
0.02,
|
|
77
|
+
0.04,
|
|
78
|
+
0.06,
|
|
79
|
+
0.08,
|
|
80
|
+
0.1,
|
|
81
|
+
0.25,
|
|
82
|
+
0.5,
|
|
83
|
+
0.75,
|
|
84
|
+
1.0,
|
|
85
|
+
2.5,
|
|
86
|
+
5.0,
|
|
87
|
+
7.5,
|
|
88
|
+
10.0,
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
_GEN_AI_CLIENT_TOKEN_USAGE_BUCKETS = [
|
|
92
|
+
1,
|
|
93
|
+
4,
|
|
94
|
+
16,
|
|
95
|
+
64,
|
|
96
|
+
256,
|
|
97
|
+
1024,
|
|
98
|
+
4096,
|
|
99
|
+
16384,
|
|
100
|
+
65536,
|
|
101
|
+
262144,
|
|
102
|
+
1048576,
|
|
103
|
+
4194304,
|
|
104
|
+
16777216,
|
|
105
|
+
67108864,
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class Meters:
|
|
111
|
+
LLM_CHAT_COUNT = "gen_ai.chat.count"
|
|
112
|
+
LLM_TOKEN_USAGE = "gen_ai.client.token.usage"
|
|
113
|
+
LLM_OPERATION_DURATION = "gen_ai.client.operation.duration"
|
|
114
|
+
LLM_COMPLETIONS_EXCEPTIONS = "gen_ai.chat_completions.exceptions"
|
|
115
|
+
LLM_STREAMING_TIME_TO_FIRST_TOKEN = (
|
|
116
|
+
"gen_ai.chat_completions.streaming_time_to_first_token"
|
|
117
|
+
)
|
|
118
|
+
LLM_STREAMING_TIME_TO_GENERATE = (
|
|
119
|
+
"gen_ai.chat_completions.streaming_time_to_generate"
|
|
120
|
+
)
|
|
121
|
+
LLM_STREAMING_TIME_PER_OUTPUT_TOKEN = (
|
|
122
|
+
"gen_ai.chat_completions.streaming_time_per_output_token"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
38
126
|
class MeterUploader:
|
|
39
127
|
def __init__(
|
|
40
128
|
self, name: str, endpoint: str, headers: dict, resource_attributes: dict
|
|
@@ -65,14 +153,44 @@ class MeterUploader:
|
|
|
65
153
|
|
|
66
154
|
# create meter attributes
|
|
67
155
|
self.llm_invoke_counter = self.meter.create_counter(
|
|
68
|
-
name=
|
|
156
|
+
name=Meters.LLM_CHAT_COUNT,
|
|
69
157
|
description="Number of LLM invocations",
|
|
70
158
|
unit="count",
|
|
71
159
|
)
|
|
72
160
|
self.token_usage = self.meter.create_histogram(
|
|
73
|
-
name=
|
|
161
|
+
name=Meters.LLM_TOKEN_USAGE,
|
|
74
162
|
description="Token consumption of LLM invocations",
|
|
75
163
|
unit="count",
|
|
164
|
+
explicit_bucket_boundaries_advisory=_GEN_AI_CLIENT_TOKEN_USAGE_BUCKETS,
|
|
165
|
+
)
|
|
166
|
+
self.duration_histogram = self.meter.create_histogram(
|
|
167
|
+
name=Meters.LLM_OPERATION_DURATION,
|
|
168
|
+
unit="s",
|
|
169
|
+
description="GenAI operation duration",
|
|
170
|
+
explicit_bucket_boundaries_advisory=_GEN_AI_CLIENT_OPERATION_DURATION_BUCKETS,
|
|
171
|
+
)
|
|
172
|
+
self.chat_exception_counter = self.meter.create_counter(
|
|
173
|
+
name=Meters.LLM_COMPLETIONS_EXCEPTIONS,
|
|
174
|
+
unit="time",
|
|
175
|
+
description="Number of exceptions occurred during chat completions",
|
|
176
|
+
)
|
|
177
|
+
self.streaming_time_to_first_token = self.meter.create_histogram(
|
|
178
|
+
name=Meters.LLM_STREAMING_TIME_TO_FIRST_TOKEN,
|
|
179
|
+
unit="s",
|
|
180
|
+
description="Time to first token in streaming chat completions",
|
|
181
|
+
explicit_bucket_boundaries_advisory=_GEN_AI_SERVER_TIME_TO_FIRST_TOKEN_BUCKETS,
|
|
182
|
+
)
|
|
183
|
+
self.streaming_time_to_generate = self.meter.create_histogram(
|
|
184
|
+
name=Meters.LLM_STREAMING_TIME_TO_GENERATE,
|
|
185
|
+
unit="s",
|
|
186
|
+
description="Time between first token and completion in streaming chat completions",
|
|
187
|
+
explicit_bucket_boundaries_advisory=_GEN_AI_CLIENT_OPERATION_DURATION_BUCKETS,
|
|
188
|
+
)
|
|
189
|
+
self.streaming_time_per_output_token = self.meter.create_histogram(
|
|
190
|
+
name=Meters.LLM_STREAMING_TIME_PER_OUTPUT_TOKEN,
|
|
191
|
+
unit="s",
|
|
192
|
+
description="Time per output token in streaming chat completions",
|
|
193
|
+
explicit_bucket_boundaries_advisory=_GEN_AI_SERVER_TIME_PER_OUTPUT_TOKEN_BUCKETS,
|
|
76
194
|
)
|
|
77
195
|
|
|
78
196
|
def record(self, llm_request: LlmRequest, llm_response: LlmResponse) -> None:
|
|
@@ -99,22 +217,50 @@ class MeterUploader:
|
|
|
99
217
|
token_attributes = {**attributes, "gen_ai_token_type": "output"}
|
|
100
218
|
self.token_usage.record(output_token, attributes=token_attributes)
|
|
101
219
|
|
|
220
|
+
# TODO: Get llm duration
|
|
221
|
+
# duration = 5.0
|
|
222
|
+
# if self.duration_histogram:
|
|
223
|
+
# self.duration_histogram.record(duration, attributes=attributes)
|
|
224
|
+
|
|
225
|
+
# Get model request error
|
|
226
|
+
if llm_response.error_code and self.chat_exception_counter:
|
|
227
|
+
exception_attributes = {
|
|
228
|
+
**attributes,
|
|
229
|
+
"error_type": llm_response.error_message,
|
|
230
|
+
}
|
|
231
|
+
self.chat_exception_counter.add(1, exception_attributes)
|
|
232
|
+
|
|
233
|
+
# TODO: Get streaming time to first token
|
|
234
|
+
# time_to_frist_token = 0.1
|
|
235
|
+
# if self.streaming_time_to_first_token:
|
|
236
|
+
# self.streaming_time_to_first_token.record(
|
|
237
|
+
# time_to_frist_token, attributes=attributes
|
|
238
|
+
# )
|
|
239
|
+
|
|
240
|
+
# TODO: Get streaming time to generate
|
|
241
|
+
# time_to_generate = 1.0
|
|
242
|
+
# if self.streaming_time_to_generate:
|
|
243
|
+
# self.streaming_time_to_generate.record(
|
|
244
|
+
# time_to_generate, attributes=attributes
|
|
245
|
+
# )
|
|
246
|
+
|
|
247
|
+
# TODO: Get streaming time per output token
|
|
248
|
+
# time_per_output_token = 0.01
|
|
249
|
+
# if self.streaming_time_per_output_token:
|
|
250
|
+
# self.streaming_time_per_output_token.record(
|
|
251
|
+
# time_per_output_token, attributes=attributes
|
|
252
|
+
# )
|
|
253
|
+
|
|
102
254
|
|
|
103
255
|
class APMPlusExporterConfig(BaseModel):
|
|
104
256
|
endpoint: str = Field(
|
|
105
|
-
default_factory=lambda:
|
|
106
|
-
"OBSERVABILITY_OPENTELEMETRY_APMPLUS_ENDPOINT",
|
|
107
|
-
"http://apmplus-cn-beijing.volces.com:4317",
|
|
108
|
-
),
|
|
257
|
+
default_factory=lambda: settings.apmplus_config.otel_exporter_endpoint,
|
|
109
258
|
)
|
|
110
259
|
app_key: str = Field(
|
|
111
|
-
default_factory=lambda:
|
|
260
|
+
default_factory=lambda: settings.apmplus_config.otel_exporter_api_key,
|
|
112
261
|
)
|
|
113
262
|
service_name: str = Field(
|
|
114
|
-
default_factory=lambda:
|
|
115
|
-
"OBSERVABILITY_OPENTELEMETRY_APMPLUS_SERVICE_NAME",
|
|
116
|
-
"veadk_tracing_service",
|
|
117
|
-
),
|
|
263
|
+
default_factory=lambda: settings.apmplus_config.otel_exporter_service_name,
|
|
118
264
|
description="Service name shown in APMPlus frontend.",
|
|
119
265
|
)
|
|
120
266
|
|
|
@@ -19,7 +19,7 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
|
19
19
|
from pydantic import BaseModel, Field
|
|
20
20
|
from typing_extensions import override
|
|
21
21
|
|
|
22
|
-
from veadk.config import
|
|
22
|
+
from veadk.config import settings
|
|
23
23
|
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
|
|
24
24
|
from veadk.utils.logger import get_logger
|
|
25
25
|
|
|
@@ -28,18 +28,13 @@ logger = get_logger(__name__)
|
|
|
28
28
|
|
|
29
29
|
class CozeloopExporterConfig(BaseModel):
|
|
30
30
|
endpoint: str = Field(
|
|
31
|
-
default_factory=lambda:
|
|
32
|
-
"OBSERVABILITY_OPENTELEMETRY_COZELOOP_ENDPOINT",
|
|
33
|
-
"https://api.coze.cn/v1/loop/opentelemetry/v1/traces",
|
|
34
|
-
),
|
|
31
|
+
default_factory=lambda: settings.cozeloop_config.otel_exporter_endpoint,
|
|
35
32
|
)
|
|
36
33
|
space_id: str = Field(
|
|
37
|
-
default_factory=lambda:
|
|
38
|
-
"OBSERVABILITY_OPENTELEMETRY_COZELOOP_SERVICE_NAME"
|
|
39
|
-
),
|
|
34
|
+
default_factory=lambda: settings.cozeloop_config.otel_exporter_space_id,
|
|
40
35
|
)
|
|
41
36
|
token: str = Field(
|
|
42
|
-
default_factory=lambda:
|
|
37
|
+
default_factory=lambda: settings.cozeloop_config.otel_exporter_api_key,
|
|
43
38
|
)
|
|
44
39
|
|
|
45
40
|
|
|
@@ -19,7 +19,7 @@ from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
|
19
19
|
from pydantic import BaseModel, Field
|
|
20
20
|
from typing_extensions import override
|
|
21
21
|
|
|
22
|
-
from veadk.config import getenv
|
|
22
|
+
from veadk.config import getenv, settings
|
|
23
23
|
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
|
|
24
24
|
from veadk.utils.logger import get_logger
|
|
25
25
|
|
|
@@ -28,19 +28,13 @@ logger = get_logger(__name__)
|
|
|
28
28
|
|
|
29
29
|
class TLSExporterConfig(BaseModel):
|
|
30
30
|
endpoint: str = Field(
|
|
31
|
-
default_factory=lambda:
|
|
32
|
-
"OBSERVABILITY_OPENTELEMETRY_TLS_ENDPOINT",
|
|
33
|
-
"https://tls-cn-beijing.volces.com:4318/v1/traces",
|
|
34
|
-
),
|
|
31
|
+
default_factory=lambda: settings.tls_config.otel_exporter_endpoint,
|
|
35
32
|
)
|
|
36
33
|
region: str = Field(
|
|
37
|
-
default_factory=lambda:
|
|
38
|
-
"OBSERVABILITY_OPENTELEMETRY_TLS_REGION",
|
|
39
|
-
"cn-beijing",
|
|
40
|
-
),
|
|
34
|
+
default_factory=lambda: settings.tls_config.otel_exporter_region,
|
|
41
35
|
)
|
|
42
36
|
topic_id: str = Field(
|
|
43
|
-
default_factory=lambda:
|
|
37
|
+
default_factory=lambda: settings.tls_config.otel_exporter_topic_id,
|
|
44
38
|
)
|
|
45
39
|
access_key: str = Field(default_factory=lambda: getenv("VOLCENGINE_ACCESS_KEY"))
|
|
46
40
|
secret_key: str = Field(default_factory=lambda: getenv("VOLCENGINE_SECRET_KEY"))
|
|
@@ -30,9 +30,9 @@ from typing_extensions import override
|
|
|
30
30
|
from veadk.tracing.base_tracer import BaseTracer
|
|
31
31
|
from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter
|
|
32
32
|
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
|
|
33
|
-
from veadk.tracing.telemetry.exporters.inmemory_exporter import InMemoryExporter
|
|
34
33
|
from veadk.tracing.telemetry.exporters.inmemory_exporter import (
|
|
35
34
|
_INMEMORY_EXPORTER_INSTANCE,
|
|
35
|
+
InMemoryExporter,
|
|
36
36
|
)
|
|
37
37
|
from veadk.utils.logger import get_logger
|
|
38
38
|
from veadk.utils.patches import patch_google_adk_telemetry
|
|
@@ -58,6 +58,8 @@ class OpentelemetryTracer(BaseModel, BaseTracer):
|
|
|
58
58
|
description="The exporters to export spans.",
|
|
59
59
|
)
|
|
60
60
|
|
|
61
|
+
# Forbid InMemoryExporter in exporters list
|
|
62
|
+
# cause we need to set custom in-memory span processor by VeADK
|
|
61
63
|
@field_validator("exporters")
|
|
62
64
|
@classmethod
|
|
63
65
|
def forbid_inmemory_exporter(cls, v: list[BaseExporter]) -> list[BaseExporter]:
|
|
@@ -67,14 +69,18 @@ class OpentelemetryTracer(BaseModel, BaseTracer):
|
|
|
67
69
|
return v
|
|
68
70
|
|
|
69
71
|
def model_post_init(self, context: Any) -> None:
|
|
72
|
+
# Replace Google ADK tracing funcs
|
|
73
|
+
# `trace_call_llm` and `trace_tool_call`
|
|
70
74
|
patch_google_adk_telemetry()
|
|
71
|
-
self._init_global_tracer_provider()
|
|
72
|
-
|
|
73
|
-
# GoogleADKInstrumentor().instrument()
|
|
74
75
|
|
|
75
|
-
|
|
76
|
+
# We save internal processors for tracing data dump
|
|
76
77
|
self._processors = []
|
|
77
78
|
|
|
79
|
+
# Initialize global tracer provider to avoid VeFaaS global tracer
|
|
80
|
+
# provider conflicts
|
|
81
|
+
self._init_global_tracer_provider()
|
|
82
|
+
|
|
83
|
+
def _init_global_tracer_provider(self) -> None:
|
|
78
84
|
# set provider anyway, then get global provider
|
|
79
85
|
trace_api.set_tracer_provider(trace_sdk.TracerProvider())
|
|
80
86
|
global_tracer_provider: TracerProvider = trace_api.get_tracer_provider() # type: ignore
|
|
@@ -92,10 +92,16 @@ def _set_agent_input_attribute(
|
|
|
92
92
|
"gen_ai.user.message",
|
|
93
93
|
{
|
|
94
94
|
f"parts.{idx}.type": "image_url",
|
|
95
|
-
f"parts.{idx}.image_url.name":
|
|
96
|
-
"/"
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
f"parts.{idx}.image_url.name": (
|
|
96
|
+
part.inline_data.display_name.split("/")[-1]
|
|
97
|
+
if part.inline_data.display_name
|
|
98
|
+
else "<unknown_image_name>"
|
|
99
|
+
),
|
|
100
|
+
f"parts.{idx}.image_url.url": (
|
|
101
|
+
part.inline_data.display_name
|
|
102
|
+
if part.inline_data.display_name
|
|
103
|
+
else "<unknown_image_url>"
|
|
104
|
+
),
|
|
99
105
|
},
|
|
100
106
|
)
|
|
101
107
|
|
|
@@ -174,7 +180,10 @@ def set_common_attributes_on_tool_span(current_span: _Span) -> None:
|
|
|
174
180
|
if span.context.span_id == parent_span_id:
|
|
175
181
|
common_attributes = ATTRIBUTES.get("common", {})
|
|
176
182
|
for attr_name in common_attributes.keys():
|
|
177
|
-
|
|
183
|
+
if hasattr(span.attributes, attr_name):
|
|
184
|
+
current_span.set_attribute(attr_name, span.attributes[attr_name])
|
|
185
|
+
else:
|
|
186
|
+
logger.error(f"Parent span does not have attribute {attr_name}")
|
|
178
187
|
|
|
179
188
|
|
|
180
189
|
def trace_send_data(): ...
|
|
@@ -221,6 +230,15 @@ def trace_call_llm(
|
|
|
221
230
|
model_name=invocation_context.agent.model_name
|
|
222
231
|
if isinstance(invocation_context.agent, Agent)
|
|
223
232
|
else "",
|
|
233
|
+
call_type=(
|
|
234
|
+
span.context.trace_state.get("call_type", "")
|
|
235
|
+
if (
|
|
236
|
+
hasattr(span, "context")
|
|
237
|
+
and hasattr(span.context, "trace_state")
|
|
238
|
+
and hasattr(span.context.trace_state, "get")
|
|
239
|
+
)
|
|
240
|
+
else ""
|
|
241
|
+
),
|
|
224
242
|
)
|
|
225
243
|
|
|
226
244
|
llm_attributes_mapping = ATTRIBUTES.get("llm", {})
|
veadk/utils/logger.py
CHANGED
veadk/utils/misc.py
CHANGED
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
import importlib.util
|
|
16
16
|
import json
|
|
17
|
+
import os
|
|
17
18
|
import sys
|
|
18
19
|
import time
|
|
19
20
|
import types
|
|
20
21
|
from typing import Any, Dict, List, MutableMapping, Tuple
|
|
21
22
|
|
|
22
23
|
import requests
|
|
24
|
+
from yaml import safe_load
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
def read_file(file_path):
|
|
@@ -100,3 +102,49 @@ def safe_json_serialize(obj) -> str:
|
|
|
100
102
|
)
|
|
101
103
|
except (TypeError, OverflowError):
|
|
102
104
|
return "<not serializable>"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def getenv(
|
|
108
|
+
env_name: str, default_value: Any = "", allow_false_values: bool = False
|
|
109
|
+
) -> str:
|
|
110
|
+
"""
|
|
111
|
+
Get environment variable.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
env_name (str): The name of the environment variable.
|
|
115
|
+
default_value (str): The default value of the environment variable.
|
|
116
|
+
allow_false_values (bool, optional): Whether to allow the environment variable to be None or false values. Defaults to False.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
str: The value of the environment variable.
|
|
120
|
+
"""
|
|
121
|
+
value = os.getenv(env_name, default_value)
|
|
122
|
+
|
|
123
|
+
if allow_false_values:
|
|
124
|
+
return value
|
|
125
|
+
|
|
126
|
+
if value:
|
|
127
|
+
return value
|
|
128
|
+
else:
|
|
129
|
+
raise ValueError(
|
|
130
|
+
f"The environment variable `{env_name}` not exists. Please set this in your environment variable or config.yaml."
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def set_envs(config_yaml_path: str) -> tuple[dict, dict]:
|
|
135
|
+
with open(config_yaml_path, "r", encoding="utf-8") as yaml_file:
|
|
136
|
+
config_dict = safe_load(yaml_file)
|
|
137
|
+
|
|
138
|
+
flatten_config_dict = flatten_dict(config_dict)
|
|
139
|
+
|
|
140
|
+
veadk_environments = {}
|
|
141
|
+
for k, v in flatten_config_dict.items():
|
|
142
|
+
k = k.upper()
|
|
143
|
+
|
|
144
|
+
if k in os.environ:
|
|
145
|
+
veadk_environments[k] = os.environ[k]
|
|
146
|
+
continue
|
|
147
|
+
veadk_environments[k] = str(v)
|
|
148
|
+
os.environ[k] = str(v)
|
|
149
|
+
|
|
150
|
+
return config_dict, veadk_environments
|
veadk/utils/volcengine_sign.py
CHANGED
|
@@ -153,7 +153,10 @@ def request(method, date, query, header, ak, sk, action, body):
|
|
|
153
153
|
params=request_param["query"],
|
|
154
154
|
data=request_param["body"],
|
|
155
155
|
)
|
|
156
|
-
|
|
156
|
+
try:
|
|
157
|
+
return r.json()
|
|
158
|
+
except Exception:
|
|
159
|
+
raise ValueError(f"Error occurred. Bad response: {r}")
|
|
157
160
|
|
|
158
161
|
|
|
159
162
|
def ve_request(
|
|
@@ -166,6 +169,7 @@ def ve_request(
|
|
|
166
169
|
region: str,
|
|
167
170
|
host: str,
|
|
168
171
|
content_type: str = "application/json",
|
|
172
|
+
header: dict = {},
|
|
169
173
|
):
|
|
170
174
|
# response_body = request("Get", datetime.datetime.utcnow(), {}, {}, AK, SK, "ListUsers", None)
|
|
171
175
|
# print(response_body)
|
|
@@ -192,7 +196,7 @@ def ve_request(
|
|
|
192
196
|
|
|
193
197
|
try:
|
|
194
198
|
response_body = request(
|
|
195
|
-
"POST", now, {},
|
|
199
|
+
"POST", now, {}, header, AK, SK, action, json.dumps(request_body)
|
|
196
200
|
)
|
|
197
201
|
return response_body
|
|
198
202
|
except Exception as e:
|
veadk/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: veadk-python
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: Volcengine agent development kit, integrations with Volcengine cloud services.
|
|
5
5
|
Author-email: Yaozheng Fang <fangyozheng@gmail.com>, Guodong Li <cu.eric.lee@gmail.com>, Zhi Han <sliverydayday@gmail.com>, Meng Wang <mengwangwm@gmail.com>
|
|
6
6
|
License: Apache License
|
|
@@ -223,6 +223,7 @@ Requires-Dist: agent-pilot-sdk>=0.0.9
|
|
|
223
223
|
Requires-Dist: fastmcp>=2.11.3
|
|
224
224
|
Requires-Dist: cookiecutter>=2.6.0
|
|
225
225
|
Requires-Dist: opensearch-py==2.8.0
|
|
226
|
+
Requires-Dist: omegaconf>=2.3.0
|
|
226
227
|
Provides-Extra: database
|
|
227
228
|
Requires-Dist: redis>=6.2.0; extra == "database"
|
|
228
229
|
Requires-Dist: pymysql>=1.1.1; extra == "database"
|