forked from strands-agents/harness-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodel.py
More file actions
117 lines (91 loc) · 3.89 KB
/
Copy pathmodel.py
File metadata and controls
117 lines (91 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"""Abstract base class for Agent model providers."""
import abc
import logging
from collections.abc import AsyncGenerator, AsyncIterable
from dataclasses import dataclass
from typing import Any, Literal, TypeVar
from pydantic import BaseModel
from ..types.content import Messages, SystemContentBlock
from ..types.streaming import StreamEvent
from ..types.tools import ToolChoice, ToolSpec
logger = logging.getLogger(__name__)
T = TypeVar("T", bound=BaseModel)
@dataclass
class CacheConfig:
"""Configuration for prompt caching.
Attributes:
strategy: Caching strategy to use.
- "auto": Automatically detect model support and inject cachePoint to maximize cache coverage
- "anthropic": Inject cachePoint in Anthropic-compatible format without model support check
"""
strategy: Literal["auto", "anthropic"] = "auto"
class Model(abc.ABC):
"""Abstract base class for Agent model providers.
This class defines the interface for all model implementations in the Strands Agents SDK. It provides a
standardized way to configure and process requests for different AI model providers.
"""
@abc.abstractmethod
# pragma: no cover
def update_config(self, **model_config: Any) -> None:
"""Update the model configuration with the provided arguments.
Args:
**model_config: Configuration overrides.
"""
pass
@abc.abstractmethod
# pragma: no cover
def get_config(self) -> Any:
"""Return the model configuration.
Returns:
The model's configuration.
"""
pass
@abc.abstractmethod
# pragma: no cover
def structured_output(
self, output_model: type[T], prompt: Messages, system_prompt: str | None = None, **kwargs: Any
) -> AsyncGenerator[dict[str, T | Any], None]:
"""Get structured output from the model.
Args:
output_model: The output model to use for the agent.
prompt: The prompt messages to use for the agent.
system_prompt: System prompt to provide context to the model.
**kwargs: Additional keyword arguments for future extensibility.
Yields:
Model events with the last being the structured output.
Raises:
ValidationException: The response format from the model does not match the output_model
"""
pass
@abc.abstractmethod
# pragma: no cover
def stream(
self,
messages: Messages,
tool_specs: list[ToolSpec] | None = None,
system_prompt: str | None = None,
*,
tool_choice: ToolChoice | None = None,
system_prompt_content: list[SystemContentBlock] | None = None,
invocation_state: dict[str, Any] | None = None,
**kwargs: Any,
) -> AsyncIterable[StreamEvent]:
"""Stream conversation with the model.
This method handles the full lifecycle of conversing with the model:
1. Format the messages, tool specs, and configuration into a streaming request
2. Send the request to the model
3. Yield the formatted message chunks
Args:
messages: List of message objects to be processed by the model.
tool_specs: List of tool specifications to make available to the model.
system_prompt: System prompt to provide context to the model.
tool_choice: Selection strategy for tool invocation.
system_prompt_content: System prompt content blocks for advanced features like caching.
invocation_state: Caller-provided state/context that was passed to the agent when it was invoked.
**kwargs: Additional keyword arguments for future extensibility.
Yields:
Formatted message chunks from the model.
Raises:
ModelThrottledException: When the model service is throttling requests from the client.
"""
pass