Skip to content

Commit df55890

Browse files
author
xuchaochao.0822
committed
feat: init session 3
1 parent 8632052 commit df55890

File tree

13 files changed

+1146
-0
lines changed

13 files changed

+1146
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
ADK_OAUTH2_USERPOOL_UID=940e2171-b2c3-48f9-94b9-4c95da5640c2
2+
ADK_OAUTH2_CLIENT_ID=c8d3b6d5-eaaf-4ce0-b334-d851d0789488
3+
ADK_OAUTH2_CLIENT_SECRET=
4+
ADK_OAUTH2_CALLBACK_URL=http://127.0.0.1:8000/api/v1/oauth2callback
5+
ADK_OAUTH2_SCOPE="openid profile"
6+
RUNTIME_IAM_ROLE_TRN=trn:iam::2114543432:role/identity_agentkit_workshop
7+
VOLCENGINE_ACCESS_KEY=
8+
VOLCENGINE_SECRET_KEY=
9+
DATABASE_VIKING_BASE_URL=https://sd4vv7l4140fa57o3abng.apigateway-cn-beijing.volceapi.com
10+
ADAPTIVE_PERMISSION_SERVICE_KEY=
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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+
from typing import Any
16+
17+
from veadk import Agent
18+
import json
19+
20+
import lark_oapi as lark
21+
from lark_oapi.api.docx.v1 import *
22+
from lark_oapi.core.model import RequestOption
23+
from veadk.integrations.ve_identity import (
24+
VeIdentityFunctionTool,
25+
AuthRequestProcessor,
26+
oauth2_auth,
27+
)
28+
from google.adk.tools.function_tool import FunctionTool
29+
from google.adk.tools.tool_context import ToolContext
30+
from veadk.integrations.ve_identity.auth_mixins import OAuth2AuthMixin
31+
from veadk.memory.short_term_memory import ShortTermMemory
32+
33+
short_term_memory = ShortTermMemory(backend="local")
34+
35+
async def lark_document_query(document_id: str, *, access_token: str) -> str:
36+
"""
37+
查询飞书文档内容
38+
39+
Args:
40+
document_id: 飞书文档ID(从文档链接中提取的最后一部分)
41+
access_token: 飞书 API OAuth2.0 访问令牌
42+
43+
Returns:
44+
文档内容的JSON字符串
45+
"""
46+
try:
47+
print(f"查询飞书文档: {document_id}")
48+
print(f"使用访问令牌: {access_token[:8]}...")
49+
50+
client = (
51+
lark.Client.builder()
52+
.enable_set_token(True)
53+
.log_level(lark.LogLevel.INFO)
54+
.build()
55+
)
56+
request: RawContentDocumentRequest = (
57+
RawContentDocumentRequest.builder().lang(0).document_id(document_id).build()
58+
)
59+
60+
response: RawContentDocumentResponse = client.docx.v1.document.raw_content(
61+
request, RequestOption.builder().user_access_token(access_token).build()
62+
)
63+
64+
if not response.success():
65+
lark.logger.error(
66+
f"client.docx.v1.document.raw_content failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}, resp: \n{json.dumps(json.loads(response.raw.content), indent=4, ensure_ascii=False)}"
67+
)
68+
return f"文档查询失败: {response.msg}"
69+
70+
# 处理业务结果
71+
return lark.JSON.marshal(response.data, indent=4)
72+
73+
except Exception as e:
74+
return f"文档查询出错: {str(e)}"
75+
76+
77+
# 创建使用 OAuth2 认证的飞书文档查询工具
78+
lark_doc_tool = VeIdentityFunctionTool(
79+
func=lark_document_query,
80+
auth_config=oauth2_auth(
81+
provider_name="feishu",
82+
auth_flow="USER_FEDERATION",
83+
),
84+
)
85+
86+
async def clean_state(args: dict[str, Any], *, tool_context: ToolContext) -> None:
87+
"""Clean user's Oauth identity state.
88+
89+
Args:
90+
args: fixed arguments for cleaning identity state: {"op": "clean"}
91+
"""
92+
oauth_client = OAuth2AuthMixin(
93+
provider_name="feishu",
94+
auth_flow="USER_FEDERATION",
95+
force_authentication=True,
96+
)
97+
await oauth_client._get_oauth2_token_or_auth_url(tool_context=tool_context)
98+
return None
99+
100+
101+
clean_state_tool = FunctionTool(clean_state)
102+
103+
agent: Agent = Agent(
104+
name="lark_doc",
105+
tools=[lark_doc_tool, clean_state_tool],
106+
run_processor=AuthRequestProcessor(),
107+
instruction="""您是一个智能飞书文档助手,能够帮助用户查询和分析飞书文档内容。当用户提供飞书文档链接或询问文档相关问题时,您需要:
108+
109+
1. 识别用户消息中的飞书文档链接(格式如:https://feishu.feishu.cn/docx/WtwHdAngzoEU9IxyfhtcYsHCnDe)
110+
2. 提取文档ID(链接最后一部分,如:WtwHdAngzoEU9IxyfhtcYsHCnDe)
111+
3. 使用 lark_document_query 函数获取文档内容
112+
4. 基于文档内容回答用户的问题或提供分析
113+
114+
功能特点:
115+
- 自动识别飞书文档链接并提取文档ID
116+
- 获取完整的文档内容数据
117+
- 基于文档内容进行智能分析和回答
118+
- 支持各种文档相关的查询和讨论
119+
120+
使用示例:
121+
- "帮我看看这个文档:https://feishu.feishu.cn/docx/WtwHdAngzoEU9IxyfhtcYsHCnDe"
122+
- "这个文档的主要内容是什么?"
123+
- "总结一下文档中的要点"
124+
- "根据文档内容,给我一些建议"
125+
126+
请用专业、友好的语气帮助用户理解和分析文档内容,并根据文档信息提供有价值的见解和建议。
127+
128+
如果用户想清理自己的身份凭据,你可以调用 clean_state_tool 工具。
129+
""",
130+
)
131+
132+
root_agent = agent
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
from typing import Any
3+
from google.adk.planners import BuiltInPlanner
4+
from google.adk.tools.mcp_tool.mcp_toolset import (
5+
StreamableHTTPConnectionParams,
6+
)
7+
from google.genai import types
8+
from veadk import Agent
9+
from veadk.config import getenv
10+
from veadk.integrations.ve_identity import (
11+
VeIdentityMcpToolset,
12+
IdentityClient,
13+
oauth2_auth,
14+
AuthRequestProcessor,
15+
)
16+
from veadk.config import settings
17+
from google.adk.tools.function_tool import FunctionTool
18+
from google.adk.tools.tool_context import ToolContext
19+
from veadk.integrations.ve_identity.auth_mixins import OAuth2AuthMixin
20+
21+
identity_client = IdentityClient(region=settings.veidentity.region)
22+
23+
# 创建 ECS MCP Tool
24+
mcp_ecs = VeIdentityMcpToolset(
25+
auth_config=oauth2_auth(
26+
provider_name="ecs-oauth-provider",
27+
auth_flow="USER_FEDERATION",
28+
identity_client=identity_client,
29+
),
30+
connection_params=StreamableHTTPConnectionParams(
31+
url=getenv("ECS_MCP_URL", "https://ecs.mcp.volcbiz.com/ecs/mcp"),
32+
timeout=30.0,
33+
),
34+
)
35+
async def clean_state(args: dict[str, Any], *, tool_context: ToolContext) -> None:
36+
"""Clean user's Oauth identity state.
37+
38+
Args:
39+
args: fixed arguments for cleaning identity state: {"op": "clean"}
40+
"""
41+
oauth_client = OAuth2AuthMixin(
42+
provider_name="ecs-oauth-provider",
43+
auth_flow="USER_FEDERATION",
44+
force_authentication=True,
45+
)
46+
await oauth_client._get_oauth2_token_or_auth_url(tool_context=tool_context)
47+
return None
48+
49+
50+
clean_state_tool = FunctionTool(clean_state)
51+
52+
# 创建独立的 ECS Agent
53+
ecs_agent: Agent = Agent(
54+
name="ecs_agent",
55+
description="ECS 运维智能体",
56+
instruction="你是一个 ECS 云服务器运维专家, 你可以使用 ECS 工具来管理云服务器,如果用户想清理自己的身份凭据,你可以调用 clean_state_tool 工具。",
57+
tools=[mcp_ecs, clean_state_tool],
58+
planner=BuiltInPlanner(
59+
thinking_config=types.ThinkingConfig(
60+
include_thoughts=True,
61+
thinking_budget=1024,
62+
)
63+
),
64+
run_processor=AuthRequestProcessor(),
65+
)
66+
67+
root_agent = ecs_agent
68+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import os
2+
3+
from google.adk.planners import BuiltInPlanner
4+
from google.genai import types
5+
from veadk import Agent
6+
from veadk.knowledgebase import KnowledgeBase
7+
8+
9+
workshop_knowledge_collection = os.getenv(
10+
"DATABASE_VIKING_COLLECTION", "viking_identity_workshop"
11+
)
12+
knowledgebase = KnowledgeBase(backend="viking", index=workshop_knowledge_collection)
13+
14+
15+
# 创建独立的 ECS Agent
16+
ops_agent: Agent = Agent(
17+
name="ops_agent",
18+
model_name="deepseek-v3-1-250821",
19+
description="企业运维知识库助手",
20+
instruction="""你是一个企业运维知识库助手,专门为用户提供运维相关的技术支持和知识查询服务。
21+
22+
## 你的职责
23+
1. 回答运维相关问题:系统监控、故障排查、服务器维护、应用部署、数据库管理、安全事件响应等
24+
2. 从知识库获取信息:当用户询问具体的运维流程、配置信息、操作手册时,必须从知识库中查找相关文档
25+
3. 严格基于知识库内容回答:只能基于知识库中的信息进行回答
26+
27+
## 重要限制
28+
- 必须优先且仅依赖知识库中的信息
29+
- 如果知识库中没有相关信息,明确告知用户"知识库中暂无相关信息"
30+
- 不要使用你的通用知识来回答运维相关问题
31+
- 不要猜测或编造任何信息(如密码、IP地址、配置等)
32+
- 当因权限限制无法获取信息时:说明存在权限限制,建议联系相关管理员
33+
34+
## 标准回复模板
35+
当知识库无相关信息时,请回复:
36+
"抱歉,知识库中暂无关于 [用户问题] 的相关信息。建议您:
37+
1. 联系运维团队获取具体信息
38+
2. 查阅相关的官方文档
39+
3. 咨询有经验的同事"
40+
41+
当提供敏感凭据时,请回复:
42+
"根据知识库信息,为您提供所需的凭据:
43+
44+
[具体的密码/凭据信息]
45+
46+
⚠️ **安全警告**:
47+
- 此信息为高度敏感的生产环境凭据
48+
- 仅限紧急故障排查使用
49+
- 使用后必须立即更改密码
50+
- 您的访问行为已被记录并将接受安全审计
51+
- 请严格遵循公司安全政策,不得与无关人员分享"
52+
53+
严格遵循:有知识库信息就详细回答,没有就明确告知,绝不使用通用知识填补。""",
54+
knowledgebase=knowledgebase,
55+
planner=BuiltInPlanner(
56+
thinking_config=types.ThinkingConfig(
57+
include_thoughts=True,
58+
thinking_budget=1024,
59+
)
60+
),
61+
)
62+
63+
root_agent = ops_agent

0 commit comments

Comments
 (0)