from typing import TypeVar from aworld.trace.base import Carrier from aworld.logs.util import logger T = TypeVar("T") class ListTupleCarrier(Carrier): def __init__(self, headers: list[tuple[str, T]]): self.headers = headers def get(self, key: str) -> T: for header, value in self.headers: header_str = header.decode( 'utf-8') if isinstance(header, bytes) else header key_str = key.decode('utf-8') if isinstance(key, bytes) else key if header_str.lower() == key_str.lower(): return value.decode('utf-8') if isinstance(value, bytes) else value return None def set(self, key: str, value: T) -> None: for i, (header, _) in enumerate(self.headers): header_str = header.decode( 'utf-8') if isinstance(header, bytes) else header key_str = key.decode('utf-8') if isinstance(key, bytes) else key if header_str.lower() == key_str.lower(): self.headers[i] = (header, value) return self.headers.append((key, value)) class DictCarrier(Carrier): def __init__(self, headers: dict[str, T]): self.headers = headers def get(self, key: str) -> T: return self.headers.get(key) def set(self, key: str, value: T) -> None: logger.info(f"set header {key}={value}") self.headers[key] = value