Artifact Interface Adapter
Purpose
Within the broader scope of Artifact Management, which provides interfaces and implementations for artifact storage and retrieval, the Artifact Interface Adapter plays a crucial role in bridging between the agent-level artifact access and the underlying artifact service implementations.
Specifically, this adapter addresses the need for agents to interact with artifacts (files, blobs) in a context-aware manner, embedding operational metadata such as application name, user ID, and session ID into every artifact service call. This contextualization is essential for multi-tenant environments, session-scoped artifact isolation, and consistent access control, without requiring agents to manage these details explicitly.
By implementing the agent.Artifacts interface, the adapter offers a standardized API for agents while delegating actual storage, retrieval, versioning, and listing operations to the configurable artifact.Service. This separation allows flexibility in switching artifact backends (e.g., in-memory, GCS) transparently to the agent.
Functionality
The adapter wraps an artifact.Service instance and enriches each call with context metadata (AppName, UserID, SessionID) to maintain scoping and traceability. It exposes four main methods:
Save(ctx, name, data): Saves artifact data under a given name, associating it with the current app, user, and session.Load(ctx, name): Loads the latest version of an artifact by name within the scoped context.LoadVersion(ctx, name, version): Loads a specific version of an artifact, enabling versioned access.List(ctx): Lists all artifact filenames visible within the current context.
Each method constructs the corresponding request for the underlying artifact.Service, passing along the contextual fields automatically, so the caller need only specify artifact-specific parameters.
For example, the Save method internally creates an artifact.SaveRequest including the adapter's AppName, UserID, and SessionID, then calls the service's Save method:
func (a *Artifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) {
return a.Service.Save(ctx, &artifact.SaveRequest{
AppName: a.AppName,
UserID: a.UserID,
SessionID: a.SessionID,
FileName: name,
Part: data,
})
}
This pattern ensures that artifact operations are always correctly scoped without burdening the agent or tool callers with repetitive context management.
Additionally, the adapter satisfies the agent.Artifacts interface, which means it can be injected seamlessly into agent implementations that expect this interface, allowing them to perform artifact operations in a consistent and context-aware manner.
Error Handling and Versioning
The adapter does not implement versioning logic itself but passes version parameters to the underlying service, which manages versions. The test coverage confirms that invalid artifact names or versions propagate errors appropriately, ensuring robust behavior.
Integration
The Artifact Interface Adapter integrates tightly with the parent Artifact Management topic and complements other subtopics like the In-Memory Artifact Service and Google Cloud Storage Service by providing a context-aware facade.
Agents and tools that use the
agent.Artifactsinterface rely on this adapter to connect to the configured artifact backend transparently.Within the agent's invocation context (such as during session handling in Session Management or during workflow execution in Agent Workflow Management), this adapter ensures that all artifact interactions are correctly scoped.
It bridges the gap between the agent framework's abstraction (
agent.Artifacts) and the lower-level artifact service interface (artifact.Service), enabling modularity and easier backend substitution.
This adapter also supports extensibility for custom context metadata by extending the adapter struct with additional fields if needed, without changing the service interface or agent code.
Relation to Other Topics
It enables tools like
loadartifactstoolto access artifacts with proper scoping.It supports the session-aware artifact persistence needed by session and runner components.
By delegating to
artifact.Service, it allows backend implementations likeIn-Memory Artifact ServiceorGoogle Cloud Storage Serviceto focus on storage logic without concern for agent context.
Diagram
classDiagram
class Artifacts {
- Service: artifact.Service
- AppName: string
- UserID: string
- SessionID: string
+ Save(ctx, name, data) SaveResponse
+ Load(ctx, name) LoadResponse
+ LoadVersion(ctx, name, version) LoadResponse
+ List(ctx) ListResponse
}
class artifact.Service {
<<interface>>
+ Save(ctx, req) SaveResponse
+ Load(ctx, req) LoadResponse
+ List(ctx, req) ListResponse
}
class agent.Artifacts {
<<interface>>
+ Save(ctx, name, data) SaveResponse
+ Load(ctx, name) LoadResponse
+ LoadVersion(ctx, name, version) LoadResponse
+ List(ctx) ListResponse
}
Artifacts ..|> agent.Artifacts
Artifacts --> artifact.Service : delegates calls
This class diagram illustrates that the Artifacts adapter implements the agent.Artifacts interface by delegating method calls to an underlying artifact.Service. It also maintains contextual fields (AppName, UserID, SessionID) used in every request.