Skip to content

Commit e9426ed

Browse files
authored
Merge branch 'volcengine:main' into main
2 parents 2351d9b + 297d296 commit e9426ed

23 files changed

+477
-352
lines changed

.gitleaks.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@ description = "Empty environment variables with KEY pattern"
7373
regex = '''os\.environ\[".*?KEY"\]\s*=\s*".+"'''
7474

7575
[allowlist]
76-
paths = ["requirements.txt"]
76+
paths = ["requirements.txt", "tests"]

docs/content/6.memory/3.long-term-memory.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ navigation:
77

88
## 使用方法
99

10-
VeADK 的长期记忆通常存储在数据库中,通过如下方式定义一个长期记忆:
10+
VeADK 的长期记忆通常存储在数据库中,你需要在初始化长期记忆时定义 `index` 来指定后端索引名称。通过如下方式定义一个长期记忆:
1111

1212
```python
1313
from veadk.memory.long_term_memory import LongTermMemory
1414

15-
# 由于长期记忆需要构建索引,因此你必须在初始化长期记忆时定义 `app_name` 以及 `user_id`
16-
long_term_memory = LongTermMemory(app_name="my_app_name", user_id="user_id")
15+
#
16+
long_term_memory = LongTermMemory(index="my_index")
1717
```
1818

1919
通过如下例子说明长期记忆:
@@ -32,7 +32,7 @@ user_id = "temp_user"
3232
teaching_session_id = "teaching_session"
3333
student_session_id = "student_session"
3434

35-
long_term_memory = LongTermMemory(backend="local", app_name=app_name, user_id=user_id)
35+
long_term_memory = LongTermMemory(backend="local", index=app_name)
3636

3737
agent = Agent(long_term_memory=long_term_memory)
3838

@@ -90,8 +90,4 @@ print(response)
9090
::field{name="app_name" type="string"}
9191
Agent 应用名称,用于多应用区分。默认空字符串。
9292
::
93-
94-
::field{name="user_id" type="string"}
95-
Agent 用户 ID,用于区分不同用户的长期记忆。默认空字符串。
96-
::
9793
::

docs/content/7.knowledgebase/1.knowledgebase.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ navigation:
99

1010
VeADK 基于 Llama-index 作为知识库的主要处理入口。开发者可上传文本、文件、目录,我们会为您进行自动切片。
1111

12-
创建知识库时,您必须要提供您的 `app_name`(将会用来自动构建索引名称),或指定一个知识库的索引
12+
创建知识库时,您必须要提供您的知识库后端索引名称 `index`,或指定 `app_name` 来作为索引名称
1313

1414
```python
1515
from veadk.knowledgebase import KnowledgeBase

tests/test_agent.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import os
1516
from unittest.mock import Mock, patch
1617

1718
from google.adk.agents.llm_agent import LlmAgent
@@ -33,11 +34,10 @@
3334

3435

3536
def test_agent():
36-
knowledgebase = KnowledgeBase(
37-
index="test_index",
38-
backend="local",
39-
backend_config={"embedding_config": {"api_key": "test"}},
40-
)
37+
os.environ["MODEL_EMBEDDING_API_KEY"] = "mocked_api_key"
38+
39+
knowledgebase = KnowledgeBase(index="test_index", backend="local")
40+
4141
long_term_memory = LongTermMemory(backend="local")
4242
tracer = OpentelemetryTracer()
4343

@@ -69,8 +69,6 @@ def test_agent():
6969

7070
assert agent.knowledgebase == knowledgebase
7171
assert agent.knowledgebase.backend == "local" # type: ignore
72-
assert load_knowledgebase_tool.knowledgebase == agent.knowledgebase
73-
assert load_knowledgebase_tool.load_knowledgebase_tool in agent.tools
7472

7573
assert agent.long_term_memory.backend == "local" # type: ignore
7674
assert load_memory in agent.tools

tests/test_knowledgebase.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import os
1516

1617
import pytest
1718

@@ -21,11 +22,9 @@
2122

2223
@pytest.mark.asyncio
2324
async def test_knowledgebase():
25+
os.environ["MODEL_EMBEDDING_API_KEY"] = "mocked_api_key"
26+
2427
app_name = "kb_test_app"
25-
kb = KnowledgeBase(
26-
backend="local",
27-
app_name=app_name,
28-
backend_config={"embedding_config": {"api_key": "test"}},
29-
)
28+
kb = KnowledgeBase(backend="local", app_name=app_name)
3029

3130
assert isinstance(kb._backend, InMemoryKnowledgeBackend)

tests/test_long_term_memory.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,20 @@
1313
# limitations under the License.
1414

1515

16+
import os
17+
1618
import pytest
1719
from google.adk.tools import load_memory
1820

1921
from veadk.agent import Agent
2022
from veadk.memory.long_term_memory import LongTermMemory
2123

22-
app_name = "test_ltm"
23-
user_id = "test_user"
24-
2524

2625
@pytest.mark.asyncio
2726
async def test_long_term_memory():
28-
long_term_memory = LongTermMemory(
29-
backend="local",
30-
# app_name=app_name,
31-
# user_id=user_id,
32-
)
27+
os.environ["MODEL_EMBEDDING_API_KEY"] = "mocked_api_key"
28+
long_term_memory = LongTermMemory(backend="local")
29+
3330
agent = Agent(
3431
name="all_name",
3532
model_name="test_model_name",
@@ -43,7 +40,8 @@ async def test_long_term_memory():
4340

4441
assert load_memory in agent.tools, "load_memory tool not found in agent tools"
4542

46-
assert not agent.long_term_memory._backend
43+
assert agent.long_term_memory
44+
assert agent.long_term_memory._backend
4745

4846
# assert agent.long_term_memory._backend.index == build_long_term_memory_index(
4947
# app_name, user_id

tests/test_runner.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import os
16+
1517
from google.genai import types
1618

1719
from veadk.agent import Agent
1820
from veadk.memory.long_term_memory import LongTermMemory
1921
from veadk.memory.short_term_memory import ShortTermMemory
20-
from veadk.runner import Runner
21-
2222

2323
# Import the standalone function instead of accessing as class method
24-
from veadk.runner import _convert_messages
24+
from veadk.runner import Runner, _convert_messages
2525

2626

2727
def _test_convert_messages(runner):
@@ -67,6 +67,8 @@ def _test_convert_messages(runner):
6767

6868
def test_runner():
6969
"""Test Runner class initialization and core properties"""
70+
os.environ["MODEL_EMBEDDING_API_KEY"] = "mocked_api_key"
71+
7072
short_term_memory = ShortTermMemory()
7173
long_term_memory = LongTermMemory(backend="local")
7274
agent = Agent(

veadk/agent.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,14 @@ def model_post_init(self, __context: Any) -> None:
133133
)
134134

135135
if self.knowledgebase:
136-
from veadk.tools import load_knowledgebase_tool
136+
from veadk.tools.builtin_tools.load_knowledgebase import (
137+
LoadKnowledgebaseTool,
138+
)
137139

138-
load_knowledgebase_tool.knowledgebase = self.knowledgebase
139-
self.tools.append(load_knowledgebase_tool.load_knowledgebase_tool)
140+
load_knowledgebase_tool = LoadKnowledgebaseTool(
141+
knowledgebase=self.knowledgebase
142+
)
143+
self.tools.append(load_knowledgebase_tool)
140144

141145
if self.long_term_memory is not None:
142146
from google.adk.tools import load_memory

veadk/auth/veauth/ark_veauth.py

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,64 +14,56 @@
1414

1515
import os
1616

17-
from typing_extensions import override
18-
19-
from veadk.auth.veauth.base_veauth import BaseVeAuth
17+
from veadk.auth.veauth.utils import get_credential_from_vefaas_iam
2018
from veadk.utils.logger import get_logger
2119
from veadk.utils.volcengine_sign import ve_request
2220

2321
logger = get_logger(__name__)
2422

2523

26-
class ARKVeAuth(BaseVeAuth):
27-
def __init__(
28-
self,
29-
access_key: str = os.getenv("VOLCENGINE_ACCESS_KEY", ""),
30-
secret_key: str = os.getenv("VOLCENGINE_SECRET_KEY", ""),
31-
) -> None:
32-
super().__init__(access_key, secret_key)
24+
def get_ark_token(region: str = "cn-beijing") -> str:
25+
logger.info("Fetching ARK token...")
3326

34-
self._token: str = ""
27+
access_key = os.getenv("VOLCENGINE_ACCESS_KEY")
28+
secret_key = os.getenv("VOLCENGINE_SECRET_KEY")
29+
session_token = ""
3530

36-
@override
37-
def _fetch_token(self) -> None:
38-
logger.info("Fetching ARK token...")
39-
# list api keys
40-
first_api_key_id = ""
41-
res = ve_request(
42-
request_body={"ProjectName": "default", "Filter": {}},
43-
action="ListApiKeys",
44-
ak=self.access_key,
45-
sk=self.secret_key,
46-
service="ark",
47-
version="2024-01-01",
48-
region="cn-beijing",
49-
host="open.volcengineapi.com",
50-
)
51-
try:
52-
first_api_key_id = res["Result"]["Items"][0]["Id"]
53-
except KeyError:
54-
raise ValueError(f"Failed to get ARK api key list: {res}")
31+
if not (access_key and secret_key):
32+
# try to get from vefaas iam
33+
cred = get_credential_from_vefaas_iam()
34+
access_key = cred.access_key_id
35+
secret_key = cred.secret_access_key
36+
session_token = cred.session_token
5537

56-
# get raw api key
57-
res = ve_request(
58-
request_body={"Id": first_api_key_id},
59-
action="GetRawApiKey",
60-
ak=self.access_key,
61-
sk=self.secret_key,
62-
service="ark",
63-
version="2024-01-01",
64-
region="cn-beijing",
65-
host="open.volcengineapi.com",
66-
)
67-
try:
68-
self._token = res["Result"]["ApiKey"]
69-
except KeyError:
70-
raise ValueError(f"Failed to get ARK api key: {res}")
38+
res = ve_request(
39+
request_body={"ProjectName": "default", "Filter": {}},
40+
header={"X-Security-Token": session_token},
41+
action="ListApiKeys",
42+
ak=access_key,
43+
sk=secret_key,
44+
service="ark",
45+
version="2024-01-01",
46+
region=region,
47+
host="open.volcengineapi.com",
48+
)
49+
try:
50+
first_api_key_id = res["Result"]["Items"][0]["Id"]
51+
except KeyError:
52+
raise ValueError(f"Failed to get ARK api key list: {res}")
7153

72-
@property
73-
def token(self) -> str:
74-
if self._token:
75-
return self._token
76-
self._fetch_token()
77-
return self._token
54+
# get raw api key
55+
res = ve_request(
56+
request_body={"Id": first_api_key_id},
57+
header={"X-Security-Token": session_token},
58+
action="GetRawApiKey",
59+
ak=access_key,
60+
sk=secret_key,
61+
service="ark",
62+
version="2024-01-01",
63+
region=region,
64+
host="open.volcengineapi.com",
65+
)
66+
try:
67+
return res["Result"]["ApiKey"]
68+
except KeyError:
69+
raise ValueError(f"Failed to get ARK api key: {res}")

veadk/auth/veauth/utils.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
import json
16+
from pathlib import Path
17+
18+
from pydantic import BaseModel
19+
20+
from veadk.consts import VEFAAS_IAM_CRIDENTIAL_PATH
21+
from veadk.utils.logger import get_logger
22+
23+
logger = get_logger(__name__)
24+
25+
26+
class VeIAMCredential(BaseModel):
27+
access_key_id: str
28+
secret_access_key: str
29+
session_token: str
30+
31+
32+
def get_credential_from_vefaas_iam() -> VeIAMCredential:
33+
"""Get credential from VeFaaS IAM file"""
34+
logger.info(
35+
f"Get Volcegnine access key or secret key from environment variables failed, try to get from VeFaaS IAM file (path={VEFAAS_IAM_CRIDENTIAL_PATH})."
36+
)
37+
38+
path = Path(VEFAAS_IAM_CRIDENTIAL_PATH)
39+
40+
if not path.exists():
41+
logger.error(
42+
f"Get Volcegnine access key or secret key from environment variables failed, and VeFaaS IAM file (path={VEFAAS_IAM_CRIDENTIAL_PATH}) not exists. Please check your configuration."
43+
)
44+
raise FileNotFoundError(
45+
f"Get Volcegnine access key or secret key from environment variables failed, and VeFaaS IAM file (path={VEFAAS_IAM_CRIDENTIAL_PATH}) not exists. Please check your configuration."
46+
)
47+
48+
with open(VEFAAS_IAM_CRIDENTIAL_PATH, "r") as f:
49+
cred_dict = json.load(f)
50+
access_key = cred_dict["access_key_id"]
51+
secret_key = cred_dict["secret_access_key"]
52+
session_token = cred_dict["session_token"]
53+
return VeIAMCredential(
54+
access_key_id=access_key,
55+
secret_access_key=secret_key,
56+
session_token=session_token,
57+
)

0 commit comments

Comments
 (0)