Skip to content

Commit 3446eb8

Browse files
Python: [BREAKING] update to v1.0.0 (#5062)
* updates to final deprecated pieces and versions * fix mypy * fix readme links
1 parent 5f06b68 commit 3446eb8

171 files changed

Lines changed: 2602 additions & 2414 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

python/.github/skills/python-package-management/SKILL.md

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,20 @@ def __getattr__(name: str) -> Any:
9797

9898
**Important:** Do not create a new package unless approved by the core team.
9999

100-
### Initial Release (Preview)
100+
Every new package starts as `alpha`.
101+
102+
### Alpha package checklist
101103

102104
1. Create directory under `packages/` (e.g., `packages/my-connector/`)
103105
2. Add the package to `tool.uv.sources` in root `pyproject.toml`
104-
3. Include samples inside the package (e.g., `packages/my-connector/samples/`)
105-
4. Do **NOT** add to `[all]` extra in `packages/core/pyproject.toml`
106-
5. Do **NOT** create lazy loading in core yet
106+
3. Set the package version to the alpha pattern: `1.0.0a<date>`
107+
4. Set the package classifier to `Development Status :: 3 - Alpha`
108+
5. Include samples inside the package (e.g., `packages/my-connector/samples/`)
109+
6. Do **NOT** add to `[all]` extra in `packages/core/pyproject.toml`
110+
7. Do **NOT** create lazy loading in core yet
111+
8. Add the package to `python/PACKAGE_STATUS.md` and keep that file updated when packages are added,
112+
removed, renamed, or promoted. If the package exposes individually staged APIs, keep the feature list
113+
there current too.
107114

108115
Recommended dependency workflow during connector implementation:
109116

@@ -116,17 +123,83 @@ Recommended dependency workflow during connector implementation:
116123
`uv run poe add-dependency-and-validate-bounds --package core --dependency "<dependency-spec>"`
117124
If compatibility checks are not in place yet, add the dependency first, then implement tests before running bound validation.
118125

119-
### Promotion to Stable
126+
### Promotion path
127+
128+
Promotion work is not isolated to the package being promoted. If a promotion changes dependency
129+
metadata for downstream packages, also update the dependent packages' own versions so they publish
130+
new metadata alongside the promoted dependency bounds.
131+
Apply the internal package dependency update rules from the versioning section below during
132+
promotions as well as standalone version update work.
133+
134+
#### Alpha -> Beta
135+
136+
Move a package to `beta` when it is stable enough to be part of the main install surface.
137+
138+
1. Update the package version to the beta pattern: `1.0.0b<date>`
139+
2. Update the classifier to `Development Status :: 4 - Beta`
140+
3. Add the package to `[all]` in `packages/core/pyproject.toml`
141+
4. Move samples to the root `samples/` tree and remove package-local samples
142+
5. Create or update the relevant lazy-loading namespace in core when the package belongs under one
143+
6. Update `python/PACKAGE_STATUS.md`
144+
145+
After `alpha`, there should be no samples left inside a package folder.
146+
147+
#### Beta -> RC
120148

121-
1. Move samples to root `samples/` folder
122-
2. Add to `[all]` extra in `packages/core/pyproject.toml`
123-
3. Create provider folder in `agent_framework/` with lazy loading `__init__.py`
149+
Move a package to `rc` when its API is close to the final released shape.
150+
151+
1. Update the package version to the release-candidate pattern: `1.0.0rc<number>`
152+
2. Keep the classifier at `Development Status :: 4 - Beta` because PyPI does not have a separate
153+
release-candidate classifier
154+
3. Keep the package in `core[all]`
155+
4. Keep samples only in the root `samples/` tree
156+
5. Update `python/PACKAGE_STATUS.md` to show the package as `rc`
157+
158+
#### RC -> Released
159+
160+
Move a package to `released` when it no longer carries a prerelease qualifier.
161+
162+
1. Update the package version to the stable pattern: `1.0.0`
163+
2. Update the classifier to `Development Status :: 5 - Production/Stable`
164+
3. Keep the package in `core[all]`
165+
4. Keep samples only in the root `samples/` tree
166+
5. Update `python/PACKAGE_STATUS.md` to show the package as `released`
167+
6. Update all `README.md` files that install that package with
168+
`pip install agent-framework-... --pre` so they use `pip install agent-framework-...` without
169+
the `--pre` suffix
124170

125171
## Versioning
126172

173+
### Internal package dependency updates
174+
175+
- If package A depends on package B within this repository, only update package A's dependency
176+
declaration when the work on package B actually affects package A.
177+
- If package A does not need anything from the package B change, leave package A's dependency
178+
declaration unchanged.
179+
- If package A does need something from the package B change, update package A's dependency
180+
declaration to the version or versioning scheme that matches what package A now requires.
181+
- If package B is promoted to a different lifecycle stage, update package A's dependency
182+
declaration to the new versioning scheme for package B even when the only change is the stage
183+
transition itself.
184+
- Use this guidance both for ordinary version updates and for package promotion work.
185+
127186
- All non-core packages declare a lower bound on `agent-framework-core`
128187
- When core version bumps with breaking changes, update the lower bound in all packages
129188
- Non-core packages version independently; only raise core bound when using new core APIs
189+
- If promoting a package changes a dependent package's published dependency metadata, bump the
190+
dependent package's own version in the correct lifecycle pattern for its current stage
191+
- Lifecycle version patterns:
192+
- `alpha`: `1.0.0a<date>`
193+
- `beta`: `1.0.0b<date>`
194+
- `rc`: `1.0.0rc<number>`
195+
- `released`: `1.0.0`
196+
- Keep the `Development Status` classifier in `pyproject.toml` aligned with the lifecycle stage:
197+
- `alpha` -> `Development Status :: 3 - Alpha`
198+
- `beta` -> `Development Status :: 4 - Beta`
199+
- `rc` -> `Development Status :: 4 - Beta`
200+
- `released` -> `Development Status :: 5 - Production/Stable`
201+
- See the PyPI classifier list for the available classifier values:
202+
`https://pypi.org/classifiers/`
130203

131204
## Installation Options
132205

@@ -144,6 +217,10 @@ When changing a package, check if its `AGENTS.md` needs updates:
144217
- Changing the package's purpose or architecture
145218
- Modifying import paths or usage patterns
146219

220+
Keep `python/PACKAGE_STATUS.md` updated when:
221+
- A package is added, removed, renamed, or promoted between lifecycle stages
222+
- A package starts or stops exposing individually staged experimental or release-candidate APIs
223+
147224
When a package adds, removes, or renames environment variables, update the related documentation in the same
148225
change:
149226
- The package's `README.md` for package-level configuration/env var guidance

python/PACKAGE_STATUS.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Python Package Status
2+
3+
This file tracks the current lifecycle state of the Python packages in this workspace. Some packages at later stages might have features within them that are not ready yet, these have feature stage decorators on the relevant APIs, and for `experimental` features warnings are raised. See the [Feature-level staged APIs](#feature-level-staged-apis) section below for details on which features are in which stage and where to find them.
4+
5+
Status is grouped into these buckets:
6+
7+
- `alpha` - initial release and early development packages that are not yet ready for general use
8+
- `beta` - prerelease packages that are not currently release candidates
9+
- `rc` - release candidate packages, these are close to ready for release but may still have some breaking changes before the final release
10+
- `released` - stable packages without a prerelease suffix, these are stable packages that should not have breaking changes between versions
11+
- `deprecated` - removed or deprecated packages that should not be used for new work
12+
13+
## Current packages
14+
15+
| Package | Path | State |
16+
| --- | --- | --- |
17+
| `agent-framework` | `python/` | `released` |
18+
| `agent-framework-a2a` | `python/packages/a2a` | `beta` |
19+
| `agent-framework-ag-ui` | `python/packages/ag-ui` | `beta` |
20+
| `agent-framework-anthropic` | `python/packages/anthropic` | `beta` |
21+
| `agent-framework-azure-ai-search` | `python/packages/azure-ai-search` | `beta` |
22+
| `agent-framework-azure-cosmos` | `python/packages/azure-cosmos` | `beta` |
23+
| `agent-framework-azurefunctions` | `python/packages/azurefunctions` | `beta` |
24+
| `agent-framework-bedrock` | `python/packages/bedrock` | `beta` |
25+
| `agent-framework-chatkit` | `python/packages/chatkit` | `beta` |
26+
| `agent-framework-claude` | `python/packages/claude` | `beta` |
27+
| `agent-framework-copilotstudio` | `python/packages/copilotstudio` | `beta` |
28+
| `agent-framework-core` | `python/packages/core` | `released` |
29+
| `agent-framework-declarative` | `python/packages/declarative` | `beta` |
30+
| `agent-framework-devui` | `python/packages/devui` | `beta` |
31+
| `agent-framework-durabletask` | `python/packages/durabletask` | `beta` |
32+
| `agent-framework-foundry` | `python/packages/foundry` | `released` |
33+
| `agent-framework-foundry-local` | `python/packages/foundry_local` | `beta` |
34+
| `agent-framework-github-copilot` | `python/packages/github_copilot` | `beta` |
35+
| `agent-framework-lab` | `python/packages/lab` | `beta` |
36+
| `agent-framework-mem0` | `python/packages/mem0` | `beta` |
37+
| `agent-framework-ollama` | `python/packages/ollama` | `beta` |
38+
| `agent-framework-openai` | `python/packages/openai` | `released` |
39+
| `agent-framework-orchestrations` | `python/packages/orchestrations` | `beta` |
40+
| `agent-framework-purview` | `python/packages/purview` | `beta` |
41+
| `agent-framework-redis` | `python/packages/redis` | `beta` |
42+
43+
## Deprecated / removed packages
44+
45+
| Package | Previous path | State | Notes |
46+
| --- | --- | --- | --- |
47+
| `agent-framework-azure-ai` | `python/packages/azure-ai` | `deprecated` | The client classes within the `azure-ai` package were renamed, sometimes changed, and moved to `agent-framework-foundry`. |
48+
49+
## Feature-level staged APIs
50+
51+
The following feature IDs have explicit feature-stage decorators on public APIs in the packages
52+
listed below.
53+
54+
### Experimental features
55+
56+
#### `EVALS`
57+
58+
- `agent-framework-core`: exported evaluation APIs from `agent_framework`, including
59+
`LocalEvaluator`, `evaluate_agent`, `evaluate_workflow`, and the related evaluation types and
60+
helper checks defined in `agent_framework/_evaluation.py`
61+
- `agent-framework-foundry`: `FoundryEvals`, `evaluate_traces`, and `evaluate_foundry_target`
62+
63+
#### `SKILLS`
64+
65+
- `agent-framework-core`: exported skills APIs from `agent_framework`, including `Skill`,
66+
`SkillResource`, `SkillScript`, `SkillScriptRunner`, and `SkillsProvider` from
67+
`agent_framework/_skills.py`
68+
69+
### Release-candidate features
70+
71+
There are currently no feature-level `rc` APIs.

python/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ We recommend two common installation paths depending on your use case.
99
If you are exploring or developing locally, install the entire framework with all sub-packages:
1010

1111
```bash
12-
pip install agent-framework --pre
12+
pip install agent-framework
1313
```
1414

15-
This installs the core and every integration package, making sure that all features are available without additional steps. The `--pre` flag is required while Agent Framework is in preview. This is the simplest way to get started.
15+
This installs the core and every integration package, making sure that all features are available without additional steps. This is the simplest way to get started.
1616

1717
### 2. Selective install
1818

@@ -22,19 +22,19 @@ If you only need specific integrations, you can install at a more granular level
2222
# Core only
2323
# includes Azure OpenAI and OpenAI support by default
2424
# also includes workflows and orchestrations
25-
pip install agent-framework-core --pre
25+
pip install agent-framework-core
2626

2727
# Core + Azure AI Foundry integration
28-
pip install agent-framework-foundry --pre
28+
pip install agent-framework-foundry
2929

30-
# Core + Microsoft Copilot Studio integration
30+
# Core + Microsoft Copilot Studio integration (preview package)
3131
pip install agent-framework-copilotstudio --pre
3232

3333
# Core + both Microsoft Copilot Studio and Azure AI Foundry integration
34-
pip install agent-framework-microsoft agent-framework-foundry --pre
34+
pip install --pre agent-framework-copilotstudio agent-framework-foundry
3535
```
3636

37-
This selective approach is useful when you know which integrations you need, and it is the recommended way to set up lightweight environments.
37+
This selective approach is useful when you know which integrations you need, and it is the recommended way to set up lightweight environments. Released packages such as `agent-framework`, `agent-framework-core`, and `agent-framework-foundry` no longer require `--pre`, while preview connectors such as `agent-framework-copilotstudio` still do.
3838

3939
Supported Platforms:
4040

python/packages/a2a/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description = "A2A integration for Microsoft Agent Framework."
44
authors = [{ name = "Microsoft", email = "af-support@microsoft.com"}]
55
readme = "README.md"
66
requires-python = ">=3.10"
7-
version = "1.0.0b260330"
7+
version = "1.0.0b260402"
88
license-files = ["LICENSE"]
99
urls.homepage = "https://aka.ms/agent-framework"
1010
urls.source = "https://github.com/microsoft/agent-framework/tree/main/python"
@@ -23,7 +23,7 @@ classifiers = [
2323
"Typing :: Typed",
2424
]
2525
dependencies = [
26-
"agent-framework-core>=1.0.0rc6",
26+
"agent-framework-core>=1.0.0,<2",
2727
"a2a-sdk>=0.3.5,<0.3.24",
2828
]
2929

python/packages/ag-ui/getting_started/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async def main():
4444
metadata = {"thread_id": thread_id} if thread_id else None
4545

4646
stream = client.get_response(
47-
[Message(role="user", text=message)],
47+
[Message(role="user", contents=[message])],
4848
stream=True,
4949
options={"metadata": metadata} if metadata else None,
5050
)

python/packages/ag-ui/getting_started/client_advanced.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ async def streaming_example(client: AGUIChatClient, thread_id: str | None = None
7373
print("Assistant: ", end="", flush=True)
7474

7575
stream = client.get_response(
76-
[Message(role="user", text="Tell me a short joke")],
76+
[Message(role="user", contents=["Tell me a short joke"])],
7777
stream=True,
7878
options={"metadata": metadata} if metadata else None,
7979
)
@@ -100,7 +100,7 @@ async def non_streaming_example(client: AGUIChatClient, thread_id: str | None =
100100

101101
print("\nUser: What is 2 + 2?\n")
102102

103-
response = await client.get_response([Message(role="user", text="What is 2 + 2?")], metadata=metadata)
103+
response = await client.get_response([Message(role="user", contents=["What is 2 + 2?"])], metadata=metadata)
104104

105105
print(f"Assistant: {response.text}")
106106

@@ -139,7 +139,9 @@ async def tool_example(client: AGUIChatClient, thread_id: str | None = None):
139139
print("(Server must be configured with matching tools to execute them)\n")
140140

141141
response = await client.get_response(
142-
[Message(role="user", text="What's the weather in Seattle?")], tools=[get_weather, calculate], metadata=metadata
142+
[Message(role="user", contents=["What's the weather in Seattle?"])],
143+
tools=[get_weather, calculate],
144+
metadata=metadata,
143145
)
144146

145147
print(f"Assistant: {response.text}")
@@ -174,15 +176,15 @@ async def conversation_example(client: AGUIChatClient):
174176

175177
# First turn
176178
print("User: My name is Alice\n")
177-
response1 = await client.get_response([Message(role="user", text="My name is Alice")])
179+
response1 = await client.get_response([Message(role="user", contents=["My name is Alice"])])
178180
print(f"Assistant: {response1.text}")
179181
thread_id = response1.additional_properties.get("thread_id")
180182
print(f"\n[Thread: {thread_id}]")
181183

182184
# Second turn - using same thread
183185
print("\nUser: What's my name?\n")
184186
response2 = await client.get_response(
185-
[Message(role="user", text="What's my name?")], options={"metadata": {"thread_id": thread_id}}
187+
[Message(role="user", contents=["What's my name?"])], options={"metadata": {"thread_id": thread_id}}
186188
)
187189
print(f"Assistant: {response2.text}")
188190

@@ -193,7 +195,7 @@ async def conversation_example(client: AGUIChatClient):
193195
# Third turn
194196
print("\nUser: Can you also tell me what 10 * 5 is?\n")
195197
response3 = await client.get_response(
196-
[Message(role="user", text="Can you also tell me what 10 * 5 is?")],
198+
[Message(role="user", contents=["Can you also tell me what 10 * 5 is?"])],
197199
options={"metadata": {"thread_id": thread_id}},
198200
tools=[calculate],
199201
)

python/packages/ag-ui/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "agent-framework-ag-ui"
3-
version = "1.0.0b260330"
3+
version = "1.0.0b260402"
44
description = "AG-UI protocol integration for Agent Framework"
55
readme = "README.md"
66
license-files = ["LICENSE"]
@@ -22,7 +22,7 @@ classifiers = [
2222
"Typing :: Typed",
2323
]
2424
dependencies = [
25-
"agent-framework-core>=1.0.0rc6",
25+
"agent-framework-core>=1.0.0,<2",
2626
"ag-ui-protocol==0.1.13",
2727
"fastapi>=0.115.0,<0.133.1",
2828
"uvicorn[standard]>=0.30.0,<0.42.0"

0 commit comments

Comments
 (0)