fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
import hashlib
|
|
from typing import Any, Dict, Optional
|
|
|
|
|
|
def get_session_id_from_a2a_params(params: Dict[str, Any]) -> Optional[str]:
|
|
message = params.get("message", {})
|
|
if isinstance(message, dict):
|
|
return message.get("contextId")
|
|
return getattr(message, "contextId", None)
|
|
|
|
|
|
def scope_session_to_principal(session_id: str, principal: Optional[str]) -> str:
|
|
"""
|
|
Bind a client-supplied A2A contextId to the authenticated principal.
|
|
|
|
Without this, two distinct keys authorized for the same LangFlow agent could
|
|
set the same contextId and read/append to each other's LangFlow memory. The
|
|
principal is hashed (it is already a hashed token) so the raw value is never
|
|
sent to the LangFlow backend, while the original contextId is kept as a
|
|
suffix for operator-side correlation.
|
|
"""
|
|
if not principal:
|
|
return session_id
|
|
principal_prefix = hashlib.sha256(principal.encode("utf-8")).hexdigest()[:16]
|
|
return f"{principal_prefix}-{session_id}"
|
|
|
|
|
|
def merge_a2a_session_into_litellm_params(
|
|
litellm_params: Dict[str, Any],
|
|
params: Dict[str, Any],
|
|
principal: Optional[str] = None,
|
|
) -> Dict[str, Any]:
|
|
merged = dict(litellm_params)
|
|
session_id = get_session_id_from_a2a_params(params)
|
|
if session_id and "session_id" not in merged:
|
|
merged["session_id"] = scope_session_to_principal(session_id, principal)
|
|
return merged
|