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.

Files changed (94) hide show
  1. veadk/agent.py +29 -22
  2. veadk/agent_builder.py +94 -0
  3. veadk/auth/__init__.py +13 -0
  4. veadk/auth/base_auth.py +22 -0
  5. veadk/auth/veauth/__init__.py +13 -0
  6. veadk/auth/veauth/apmplus_veauth.py +65 -0
  7. veadk/auth/veauth/ark_veauth.py +77 -0
  8. veadk/auth/veauth/base_veauth.py +50 -0
  9. veadk/auth/veauth/cozeloop_veauth.py +13 -0
  10. veadk/auth/veauth/prompt_pilot_veauth.py +60 -0
  11. veadk/auth/veauth/vesearch_veauth.py +62 -0
  12. veadk/cli/cli.py +2 -0
  13. veadk/cli/cli_deploy.py +5 -2
  14. veadk/cli/cli_init.py +25 -6
  15. veadk/cli/cli_pipeline.py +220 -0
  16. veadk/cli/cli_prompt.py +4 -4
  17. veadk/config.py +45 -81
  18. veadk/configs/__init__.py +13 -0
  19. veadk/configs/database_configs.py +83 -0
  20. veadk/configs/model_configs.py +42 -0
  21. veadk/configs/tool_configs.py +42 -0
  22. veadk/configs/tracing_configs.py +110 -0
  23. veadk/consts.py +32 -1
  24. veadk/database/database_adapter.py +256 -3
  25. veadk/database/kv/redis_database.py +47 -0
  26. veadk/database/local_database.py +23 -4
  27. veadk/database/relational/mysql_database.py +58 -0
  28. veadk/database/vector/opensearch_vector_database.py +6 -3
  29. veadk/database/viking/viking_database.py +272 -36
  30. veadk/integrations/ve_code_pipeline/__init__.py +13 -0
  31. veadk/integrations/ve_code_pipeline/ve_code_pipeline.py +431 -0
  32. veadk/integrations/ve_cozeloop/__init__.py +13 -0
  33. veadk/integrations/ve_cozeloop/ve_cozeloop.py +96 -0
  34. veadk/integrations/ve_cr/__init__.py +13 -0
  35. veadk/integrations/ve_cr/ve_cr.py +220 -0
  36. veadk/integrations/ve_faas/template/cookiecutter.json +3 -2
  37. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/deploy.py +2 -2
  38. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/agent.py +1 -1
  39. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py +24 -1
  40. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/requirements.txt +3 -1
  41. veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/run.sh +1 -12
  42. veadk/integrations/ve_faas/ve_faas.py +352 -35
  43. veadk/integrations/ve_faas/web_template/cookiecutter.json +17 -0
  44. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/__init__.py +13 -0
  45. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/clean.py +23 -0
  46. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/config.yaml.example +2 -0
  47. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/deploy.py +41 -0
  48. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/Dockerfile +23 -0
  49. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/app.py +123 -0
  50. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/init_db.py +46 -0
  51. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/models.py +36 -0
  52. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/requirements.txt +4 -0
  53. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/run.sh +21 -0
  54. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/css/style.css +368 -0
  55. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/static/js/admin.js +0 -0
  56. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/dashboard.html +21 -0
  57. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/edit_post.html +24 -0
  58. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/login.html +21 -0
  59. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/admin/posts.html +53 -0
  60. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/base.html +45 -0
  61. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/index.html +29 -0
  62. veadk/integrations/ve_faas/web_template/{{cookiecutter.local_dir_name}}/src/templates/post.html +14 -0
  63. veadk/integrations/ve_prompt_pilot/ve_prompt_pilot.py +6 -3
  64. veadk/integrations/ve_tls/__init__.py +13 -0
  65. veadk/integrations/ve_tls/utils.py +117 -0
  66. veadk/integrations/ve_tls/ve_tls.py +208 -0
  67. veadk/integrations/ve_tos/ve_tos.py +128 -73
  68. veadk/knowledgebase/knowledgebase.py +116 -20
  69. veadk/memory/long_term_memory.py +20 -21
  70. veadk/memory/short_term_memory_processor.py +9 -4
  71. veadk/runner.py +213 -223
  72. veadk/tools/builtin_tools/vesearch.py +2 -2
  73. veadk/tools/builtin_tools/video_generate.py +27 -20
  74. veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py +5 -0
  75. veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py +253 -129
  76. veadk/tracing/telemetry/attributes/extractors/types.py +15 -4
  77. veadk/tracing/telemetry/exporters/apmplus_exporter.py +158 -12
  78. veadk/tracing/telemetry/exporters/cozeloop_exporter.py +4 -9
  79. veadk/tracing/telemetry/exporters/tls_exporter.py +4 -10
  80. veadk/tracing/telemetry/opentelemetry_tracer.py +11 -5
  81. veadk/tracing/telemetry/telemetry.py +23 -5
  82. veadk/utils/logger.py +1 -1
  83. veadk/utils/misc.py +48 -0
  84. veadk/utils/volcengine_sign.py +6 -2
  85. veadk/version.py +1 -1
  86. {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/METADATA +2 -1
  87. veadk_python-0.2.7.dist-info/RECORD +172 -0
  88. veadk_python-0.2.5.dist-info/RECORD +0 -127
  89. /veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{{ cookiecutter.app_name|replace('-', '_') }} → {{ cookiecutter.app_name }}}/__init__.py +0 -0
  90. /veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/{{{ cookiecutter.app_name|replace('-', '_') }} → {{ cookiecutter.app_name }}}/agent.py +0 -0
  91. {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/WHEEL +0 -0
  92. {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/entry_points.txt +0 -0
  93. {veadk_python-0.2.5.dist-info → veadk_python-0.2.7.dist-info}/licenses/LICENSE +0 -0
  94. {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 getenv
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="gen_ai.chat.count",
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="gen_ai.client.token.usage",
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: getenv(
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: getenv("OBSERVABILITY_OPENTELEMETRY_APMPLUS_API_KEY"),
260
+ default_factory=lambda: settings.apmplus_config.otel_exporter_api_key,
112
261
  )
113
262
  service_name: str = Field(
114
- default_factory=lambda: getenv(
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 getenv
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: getenv(
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: getenv(
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: getenv("OBSERVABILITY_OPENTELEMETRY_COZELOOP_API_KEY"),
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: getenv(
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: getenv(
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: getenv("OBSERVABILITY_OPENTELEMETRY_TLS_SERVICE_NAME"),
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
- def _init_global_tracer_provider(self) -> None:
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": part.inline_data.display_name.split(
96
- "/"
97
- )[-1],
98
- f"parts.{idx}.image_url.url": part.inline_data.display_name,
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
- current_span.set_attribute(attr_name, span.attributes[attr_name])
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
@@ -16,7 +16,7 @@ import sys
16
16
 
17
17
  from loguru import logger
18
18
 
19
- from veadk.config import getenv
19
+ from veadk.utils.misc import getenv
20
20
 
21
21
 
22
22
  def filter_log():
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
@@ -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
- return r.json()
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, {}, {}, AK, SK, action, json.dumps(request_body)
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
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- VERSION = "0.2.5"
15
+ VERSION = "0.2.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: veadk-python
3
- Version: 0.2.5
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"