Skip to content

Commit 0331cef

Browse files
congxiao-wxxclaude
andcommitted
feat: add AgentRequest.config property for automatic FC credential extraction
Users can now access request.config directly instead of manually calling Config.from_request_headers(request). Updated example to use the property. Change-Id: Ib2e4e7ace6cd043a2d3fe651c7fbd1bc25648cde Co-developed-by: Claude <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b86f6fa commit 0331cef

3 files changed

Lines changed: 47 additions & 6 deletions

File tree

agentrun/server/model.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
Iterator,
1515
List,
1616
Optional,
17-
TYPE_CHECKING,
1817
Union,
1918
)
2019

@@ -379,6 +378,20 @@ class AgentRequest(BaseModel):
379378
None, description="原始 HTTP 请求对象(Starlette Request)"
380379
)
381380

381+
@property
382+
def config(self):
383+
"""从请求头提取 FC 临时凭证构造 Config / Extract FC credentials from request headers
384+
385+
FC 平台在每次请求时通过 header 注入最新的 STS 临时凭证,
386+
可直接传给 KnowledgeBase、Sandbox 等资源类的 config 参数。
387+
388+
Returns:
389+
Config: 包含请求头中凭证信息的配置对象
390+
"""
391+
from ..utils.config import Config
392+
393+
return Config.from_request_headers(self)
394+
382395

383396
# ============================================================================
384397
# OpenAI 协议配置(前置声明)

examples/server_with_header_credentials.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,20 @@
2626
from agentrun.knowledgebase import KnowledgeBase
2727
from agentrun.server import AgentRequest, AgentRunServer
2828
from agentrun.server.model import ServerConfig
29-
from agentrun.utils.config import Config
3029
from agentrun.utils.log import logger
3130

3231
KNOWLEDGE_BASE_NAME = os.getenv("AGENTRUN_KNOWLEDGE_BASE", "my-knowledge-base")
3332

3433

3534
async def invoke_agent(request: AgentRequest):
36-
config = Config.from_request_headers(request)
37-
3835
user_query = request.messages[-1].content if request.messages else ""
3936
if not user_query:
4037
yield "请输入您的问题。"
4138
return
4239

4340
try:
44-
kb = KnowledgeBase.get_by_name(KNOWLEDGE_BASE_NAME, config=config)
45-
result = kb.retrieve(query=user_query, config=config)
41+
kb = KnowledgeBase.get_by_name(KNOWLEDGE_BASE_NAME, config=request.config)
42+
result = kb.retrieve(query=user_query, config=request.config)
4643

4744
nodes = result.get("nodes", result.get("data", []))
4845
if not nodes:

tests/e2e/test_header_credentials.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from agentrun.utils.config import Config
1313

1414

15+
16+
1517
def _make_client(invoke_agent):
1618
server = AgentRunServer(invoke_agent=invoke_agent)
1719
app = server.as_fastapi_app()
@@ -165,3 +167,32 @@ async def invoke_agent(request: AgentRequest):
165167
assert captured["ak"] == "header-ak"
166168
assert captured["sk"] == "header-sk"
167169
assert captured["token"] == "header-token"
170+
171+
def test_request_config_property(self):
172+
"""AgentRequest.config 属性直接返回从 header 提取的 Config"""
173+
captured = {}
174+
175+
async def invoke_agent(request: AgentRequest):
176+
config = request.config
177+
captured["ak"] = config.get_access_key_id()
178+
captured["sk"] = config.get_access_key_secret()
179+
captured["token"] = config.get_security_token()
180+
yield "ok"
181+
182+
client = _make_client(invoke_agent)
183+
response = client.post(
184+
"/openai/v1/chat/completions",
185+
json={
186+
"messages": [{"role": "user", "content": "test"}],
187+
"stream": True,
188+
},
189+
headers={
190+
"x-fc-access-key-id": "ak-prop-test",
191+
"x-fc-access-key-secret": "sk-prop-test",
192+
"x-fc-security-token": "token-prop-test",
193+
},
194+
)
195+
assert response.status_code == 200
196+
assert captured["ak"] == "ak-prop-test"
197+
assert captured["sk"] == "sk-prop-test"
198+
assert captured["token"] == "token-prop-test"

0 commit comments

Comments
 (0)