@elizaos/python 2.0.0-alpha.27 → 2.0.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/elizaos/advanced_capabilities/actions/add_contact.py +4 -3
  2. package/elizaos/advanced_capabilities/actions/follow_room.py +2 -2
  3. package/elizaos/advanced_capabilities/actions/image_generation.py +2 -2
  4. package/elizaos/advanced_capabilities/actions/mute_room.py +2 -2
  5. package/elizaos/advanced_capabilities/actions/remove_contact.py +2 -2
  6. package/elizaos/advanced_capabilities/actions/roles.py +5 -4
  7. package/elizaos/advanced_capabilities/actions/search_contacts.py +3 -3
  8. package/elizaos/advanced_capabilities/actions/send_message.py +2 -2
  9. package/elizaos/advanced_capabilities/actions/settings.py +2 -2
  10. package/elizaos/advanced_capabilities/actions/unfollow_room.py +2 -2
  11. package/elizaos/advanced_capabilities/actions/unmute_room.py +2 -2
  12. package/elizaos/advanced_capabilities/actions/update_contact.py +2 -2
  13. package/elizaos/advanced_capabilities/actions/update_entity.py +2 -2
  14. package/elizaos/advanced_capabilities/providers/knowledge.py +8 -9
  15. package/elizaos/advanced_capabilities/services/rolodex.py +2 -2
  16. package/elizaos/advanced_memory/actions/reset_session.py +143 -11
  17. package/elizaos/advanced_memory/memory_service.py +54 -10
  18. package/elizaos/advanced_memory/plugin.py +2 -1
  19. package/elizaos/advanced_memory/types.py +2 -2
  20. package/elizaos/advanced_planning/actions/schedule_follow_up.py +2 -2
  21. package/elizaos/basic_capabilities/providers/contacts.py +1 -1
  22. package/elizaos/basic_capabilities/providers/follow_ups.py +1 -1
  23. package/elizaos/basic_capabilities/providers/knowledge.py +8 -9
  24. package/elizaos/basic_capabilities/providers/recent_messages.py +5 -0
  25. package/elizaos/basic_capabilities/providers/relationships.py +19 -13
  26. package/elizaos/basic_capabilities/services/embedding.py +10 -7
  27. package/elizaos/basic_capabilities/services/task.py +3 -3
  28. package/elizaos/bootstrap/actions/__init__.py +3 -0
  29. package/elizaos/bootstrap/actions/reset_session.py +3 -0
  30. package/elizaos/bootstrap/actions/roles.py +5 -4
  31. package/elizaos/bootstrap/providers/knowledge.py +8 -9
  32. package/elizaos/bootstrap/providers/recent_messages.py +5 -0
  33. package/elizaos/bootstrap/providers/relationships.py +19 -13
  34. package/elizaos/bootstrap/services/embedding.py +53 -10
  35. package/elizaos/bootstrap/services/rolodex.py +2 -2
  36. package/elizaos/bootstrap/services/task.py +3 -3
  37. package/elizaos/media/mime.py +2 -2
  38. package/elizaos/runtime.py +10 -9
  39. package/elizaos/services/hook_service.py +3 -3
  40. package/elizaos/types/generated/eliza/v1/agent_pb2.py +4 -4
  41. package/elizaos/types/generated/eliza/v1/components_pb2.py +4 -4
  42. package/elizaos/types/generated/eliza/v1/database_pb2.py +4 -4
  43. package/elizaos/types/generated/eliza/v1/environment_pb2.py +4 -4
  44. package/elizaos/types/generated/eliza/v1/events_pb2.py +4 -4
  45. package/elizaos/types/generated/eliza/v1/ipc_pb2.py +4 -4
  46. package/elizaos/types/generated/eliza/v1/knowledge_pb2.py +4 -4
  47. package/elizaos/types/generated/eliza/v1/memory_pb2.py +4 -4
  48. package/elizaos/types/generated/eliza/v1/message_service_pb2.py +4 -4
  49. package/elizaos/types/generated/eliza/v1/messaging_pb2.py +4 -4
  50. package/elizaos/types/generated/eliza/v1/model_pb2.py +4 -4
  51. package/elizaos/types/generated/eliza/v1/payment_pb2.py +4 -4
  52. package/elizaos/types/generated/eliza/v1/plugin_pb2.py +4 -4
  53. package/elizaos/types/generated/eliza/v1/primitives_pb2.py +4 -4
  54. package/elizaos/types/generated/eliza/v1/prompts_pb2.py +4 -4
  55. package/elizaos/types/generated/eliza/v1/service_interfaces_pb2.py +4 -4
  56. package/elizaos/types/generated/eliza/v1/service_pb2.py +4 -4
  57. package/elizaos/types/generated/eliza/v1/settings_pb2.py +4 -4
  58. package/elizaos/types/generated/eliza/v1/state_pb2.py +4 -4
  59. package/elizaos/types/generated/eliza/v1/task_pb2.py +4 -4
  60. package/elizaos/types/generated/eliza/v1/tee_pb2.py +4 -4
  61. package/elizaos/types/generated/eliza/v1/testing_pb2.py +4 -4
  62. package/elizaos/types/model.py +3 -3
  63. package/elizaos/types/primitives.py +3 -3
  64. package/elizaos/types/runtime.py +12 -2
  65. package/elizaos/types/state.py +2 -2
  66. package/elizaos/utils/streaming.py +3 -3
  67. package/package.json +3 -3
  68. package/pyproject.toml +1 -2
  69. package/requirements-dev.lock +2 -2
  70. package/requirements.in +1 -2
  71. package/requirements.lock +2 -2
  72. package/tests/test_history_compaction.py +104 -0
  73. package/tests/test_memory_bounds.py +115 -0
  74. package/tests/test_validation.py +1 -1
  75. package/uv.lock +10 -10
package/pyproject.toml CHANGED
@@ -25,7 +25,7 @@ classifiers = [
25
25
  dependencies = [
26
26
  "pydantic>=2.12.5",
27
27
  "pydantic-settings>=2.12.0",
28
- "protobuf>=5.29.0",
28
+ "protobuf>=7.34.0",
29
29
  "uuid6>=2024.1.12",
30
30
  "aiohttp>=3.13.3",
31
31
  "cryptography>=42.0.0",
@@ -140,4 +140,3 @@ known-first-party = ["elizaos"]
140
140
  line-length = 100
141
141
  target-version = ["py311"]
142
142
  exclude = "elizaos/types/generated/"
143
-
@@ -1,5 +1,5 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.13
2
+ # This file is autogenerated by pip-compile with Python 3.14
3
3
  # by the following command:
4
4
  #
5
5
  # pip-compile --output-file=requirements-dev.lock requirements-dev.in
@@ -71,7 +71,7 @@ propcache==0.4.1
71
71
  # via
72
72
  # aiohttp
73
73
  # yarl
74
- protobuf==6.33.4
74
+ protobuf==7.34.0
75
75
  # via -r requirements.in
76
76
  psutil==7.2.1
77
77
  # via pytest-xprocess
package/requirements.in CHANGED
@@ -1,9 +1,8 @@
1
1
  pydantic>=2.12.5
2
2
  pydantic-settings>=2.12.0
3
- protobuf>=5.29.0
3
+ protobuf>=7.34.0
4
4
  uuid6>=2024.1.12
5
5
  aiohttp>=3.13.3
6
6
  cryptography>=42.0.0
7
7
  structlog>=25.5.0
8
8
  typing-extensions>=4.9.0
9
-
package/requirements.lock CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # This file is autogenerated by pip-compile with Python 3.13
2
+ # This file is autogenerated by pip-compile with Python 3.14
3
3
  # by the following command:
4
4
  #
5
5
  # pip-compile --output-file=requirements.lock requirements.in
@@ -32,7 +32,7 @@ propcache==0.4.1
32
32
  # via
33
33
  # aiohttp
34
34
  # yarl
35
- protobuf==6.33.4
35
+ protobuf==7.34.0
36
36
  # via -r requirements.in
37
37
  pycparser==2.23
38
38
  # via cffi
@@ -0,0 +1,104 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from types import SimpleNamespace
5
+ from unittest.mock import AsyncMock
6
+
7
+ import pytest
8
+
9
+ from elizaos.advanced_memory.actions.reset_session import (
10
+ reset_session_action as advanced_reset_session_action,
11
+ )
12
+ from elizaos.basic_capabilities.providers.recent_messages import (
13
+ recent_messages_provider as basic_recent_messages_provider,
14
+ )
15
+ from elizaos.bootstrap.actions.reset_session import (
16
+ reset_session_action as bootstrap_reset_session_action,
17
+ )
18
+ from elizaos.bootstrap.providers.recent_messages import (
19
+ recent_messages_provider as bootstrap_recent_messages_provider,
20
+ )
21
+ from elizaos.types import Content, Memory, as_uuid
22
+
23
+
24
+ @dataclass
25
+ class FakeRoom:
26
+ id: object
27
+ world_id: object | None
28
+ metadata: dict[str, object]
29
+
30
+
31
+ class FakeRuntime:
32
+ def __init__(self, room: FakeRoom, *, role: str = "OWNER") -> None:
33
+ self.room = room
34
+ self.updated_room: FakeRoom | None = None
35
+ self.get_room = AsyncMock(return_value=room)
36
+ self.update_room = AsyncMock(side_effect=self._update_room)
37
+ self.get_memories = AsyncMock(return_value=[])
38
+ self.get_entity = AsyncMock(return_value=SimpleNamespace(name="User"))
39
+ self.agent_id = as_uuid("91000000-0000-0000-0000-000000000001")
40
+ self.character = SimpleNamespace(name="CompactionAgent")
41
+ self.get_world = AsyncMock(
42
+ return_value=SimpleNamespace(
43
+ metadata={"roles": {"91000000-0000-0000-0000-000000000002": role}}
44
+ )
45
+ )
46
+
47
+ async def _update_room(self, room: FakeRoom) -> None:
48
+ self.updated_room = room
49
+ self.room = room
50
+
51
+
52
+ def _message() -> Memory:
53
+ return Memory(
54
+ id=as_uuid("91000000-0000-0000-0000-000000000010"),
55
+ entity_id=as_uuid("91000000-0000-0000-0000-000000000002"),
56
+ room_id=as_uuid("91000000-0000-0000-0000-000000000003"),
57
+ content=Content(text="start over", source="test"),
58
+ )
59
+
60
+
61
+ @pytest.mark.asyncio
62
+ @pytest.mark.parametrize(
63
+ "action_under_test",
64
+ [bootstrap_reset_session_action, advanced_reset_session_action],
65
+ )
66
+ async def test_reset_session_action_updates_room_metadata(action_under_test: object) -> None:
67
+ room = FakeRoom(
68
+ id=as_uuid("91000000-0000-0000-0000-000000000003"),
69
+ world_id=as_uuid("91000000-0000-0000-0000-000000000004"),
70
+ metadata={
71
+ "lastCompactionAt": 1000,
72
+ "compactionHistory": [{"timestamp": 1000, "triggeredBy": "old", "reason": "manual"}],
73
+ },
74
+ )
75
+ runtime = FakeRuntime(room)
76
+
77
+ result = await action_under_test.handler(runtime, _message(), None, None, None, None)
78
+
79
+ assert result.success is True
80
+ assert runtime.updated_room is not None
81
+ assert runtime.updated_room.metadata["lastCompactionAt"] >= 1000
82
+ assert len(runtime.updated_room.metadata["compactionHistory"]) == 2
83
+ assert result.values["previousCompactionAt"] == 1000
84
+
85
+
86
+ @pytest.mark.asyncio
87
+ @pytest.mark.parametrize(
88
+ "provider_under_test",
89
+ [bootstrap_recent_messages_provider, basic_recent_messages_provider],
90
+ )
91
+ async def test_recent_messages_provider_uses_last_compaction_boundary(
92
+ provider_under_test: object,
93
+ ) -> None:
94
+ room = FakeRoom(
95
+ id=as_uuid("91000000-0000-0000-0000-000000000003"),
96
+ world_id=None,
97
+ metadata={"lastCompactionAt": 4242},
98
+ )
99
+ runtime = FakeRuntime(room)
100
+
101
+ result = await provider_under_test.get(runtime, _message(), None)
102
+
103
+ assert result.values["roomId"] == str(_message().room_id)
104
+ assert runtime.get_memories.await_args.kwargs["start"] == 4242
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ import uuid
4
+ from types import SimpleNamespace
5
+ from unittest.mock import AsyncMock, MagicMock
6
+
7
+ import pytest
8
+
9
+ from elizaos.advanced_memory.memory_service import MemoryService
10
+ from elizaos.advanced_memory.types import LongTermMemoryCategory
11
+ from elizaos.basic_capabilities.services.embedding import (
12
+ EmbeddingService as BasicEmbeddingService,
13
+ )
14
+ from elizaos.bootstrap.services.embedding import (
15
+ EmbeddingService as BootstrapEmbeddingService,
16
+ )
17
+ from elizaos.types import ModelType
18
+
19
+
20
+ def _mock_runtime() -> MagicMock:
21
+ runtime = MagicMock()
22
+ runtime.agent_id = uuid.uuid4()
23
+ runtime.logger = MagicMock()
24
+
25
+ async def use_model(model_type, **_kwargs):
26
+ if model_type == ModelType.TEXT_EMBEDDING:
27
+ return [0.1, 0.2, 0.3]
28
+ return "ok"
29
+
30
+ runtime.use_model = AsyncMock(side_effect=use_model)
31
+ return runtime
32
+
33
+
34
+ @pytest.mark.asyncio
35
+ async def test_embedding_services_use_lru_eviction() -> None:
36
+ for service_cls in (BasicEmbeddingService, BootstrapEmbeddingService):
37
+ runtime = _mock_runtime()
38
+ service = service_cls()
39
+ service._runtime = runtime
40
+ service.set_max_cache_size(2)
41
+
42
+ await service.embed("a")
43
+ await service.embed("b")
44
+ await service.embed("a")
45
+ await service.embed("c")
46
+
47
+ assert list(service._cache.keys()) == ["a", "c"]
48
+
49
+
50
+ @pytest.mark.asyncio
51
+ async def test_bootstrap_embedding_queue_deduplicates_and_clears_on_stop() -> None:
52
+ service = BootstrapEmbeddingService()
53
+ service._runtime = _mock_runtime()
54
+
55
+ payload = SimpleNamespace(extra={"memory": {"id": "memory-1"}})
56
+
57
+ await service._handle_embedding_request(payload)
58
+ await service._handle_embedding_request(payload)
59
+
60
+ assert service._queue.qsize() == 1
61
+ assert service._pending_payload_keys == {"memory-1"}
62
+
63
+ await service.stop()
64
+
65
+ assert service._queue.qsize() == 0
66
+ assert service._pending_payload_keys == set()
67
+
68
+
69
+ @pytest.mark.asyncio
70
+ async def test_advanced_memory_fallback_storage_is_bounded() -> None:
71
+ service = MemoryService(runtime=None)
72
+ agent_id = uuid.uuid4()
73
+
74
+ for index in range(service._MAX_LOCAL_SESSION_SUMMARIES + 25):
75
+ await service.store_session_summary(
76
+ agent_id=agent_id,
77
+ room_id=uuid.uuid4(),
78
+ summary=f"summary-{index}",
79
+ message_count=index,
80
+ last_message_offset=index,
81
+ )
82
+
83
+ assert len(service._session_summaries) == service._MAX_LOCAL_SESSION_SUMMARIES
84
+
85
+ for index in range(service._MAX_LOCAL_EXTRACTION_CHECKPOINTS + 25):
86
+ await service.set_last_extraction_checkpoint(uuid.uuid4(), uuid.uuid4(), index)
87
+
88
+ assert len(service._extraction_checkpoints) == service._MAX_LOCAL_EXTRACTION_CHECKPOINTS
89
+
90
+ for _ in range(service._MAX_LOCAL_LONG_TERM_ENTITIES + 25):
91
+ entity_id = uuid.uuid4()
92
+ await service.store_long_term_memory(
93
+ agent_id=agent_id,
94
+ entity_id=entity_id,
95
+ category=LongTermMemoryCategory.SEMANTIC,
96
+ content=f"entity-{entity_id}",
97
+ confidence=0.9,
98
+ )
99
+
100
+ assert len(service._long_term) == service._MAX_LOCAL_LONG_TERM_ENTITIES
101
+
102
+ hot_entity_id = uuid.uuid4()
103
+ for index in range(service._MAX_LOCAL_LONG_TERM_PER_ENTITY + 25):
104
+ await service.store_long_term_memory(
105
+ agent_id=agent_id,
106
+ entity_id=hot_entity_id,
107
+ category=LongTermMemoryCategory.SEMANTIC,
108
+ content=f"fact-{index}",
109
+ confidence=float(index),
110
+ )
111
+
112
+ retained = service._long_term[str(hot_entity_id)]
113
+ assert len(retained) == service._MAX_LOCAL_LONG_TERM_PER_ENTITY
114
+ assert retained[0].content == "fact-25"
115
+ assert retained[-1].content == f"fact-{service._MAX_LOCAL_LONG_TERM_PER_ENTITY + 24}"
@@ -128,7 +128,7 @@ def test_validate_action_regex():
128
128
 
129
129
  # Unicode characters
130
130
  msg = create_mock_memory("Transfer 100 €")
131
- assert not validate_action_regex(msg, [], r"transfer \d+ €") # case sensitive
131
+ assert not validate_action_regex(msg, [], r"transfer \d+ €") # case sensitive
132
132
  assert validate_action_regex(msg, [], r"(?i)transfer \d+ €")
133
133
 
134
134
  # Special characters
package/uv.lock CHANGED
@@ -485,7 +485,7 @@ requires-dist = [
485
485
  { name = "isort", marker = "extra == 'dev'", specifier = ">=5.13.0" },
486
486
  { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.19.1" },
487
487
  { name = "pip-tools", marker = "extra == 'dev'", specifier = ">=7.4.1" },
488
- { name = "protobuf", specifier = ">=5.29.0" },
488
+ { name = "protobuf", specifier = ">=7.34.0" },
489
489
  { name = "pydantic", specifier = ">=2.12.5" },
490
490
  { name = "pydantic-settings", specifier = ">=2.12.0" },
491
491
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0.2" },
@@ -1022,17 +1022,17 @@ wheels = [
1022
1022
 
1023
1023
  [[package]]
1024
1024
  name = "protobuf"
1025
- version = "6.33.5"
1025
+ version = "7.34.0"
1026
1026
  source = { registry = "https://pypi.org/simple" }
1027
- sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" }
1027
+ sdist = { url = "https://files.pythonhosted.org/packages/f2/00/04a2ab36b70a52d0356852979e08b44edde0435f2115dc66e25f2100f3ab/protobuf-7.34.0.tar.gz", hash = "sha256:3871a3df67c710aaf7bb8d214cc997342e63ceebd940c8c7fc65c9b3d697591a", size = 454726, upload-time = "2026-02-27T00:30:25.421Z" }
1028
1028
  wheels = [
1029
- { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" },
1030
- { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" },
1031
- { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" },
1032
- { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" },
1033
- { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" },
1034
- { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" },
1035
- { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" },
1029
+ { url = "https://files.pythonhosted.org/packages/13/c4/6322ab5c8f279c4c358bc14eb8aefc0550b97222a39f04eb3c1af7a830fa/protobuf-7.34.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e329966799f2c271d5e05e236459fe1cbfdb8755aaa3b0914fa60947ddea408", size = 429248, upload-time = "2026-02-27T00:30:14.924Z" },
1030
+ { url = "https://files.pythonhosted.org/packages/45/99/b029bbbc61e8937545da5b79aa405ab2d9cf307a728f8c9459ad60d7a481/protobuf-7.34.0-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:9d7a5005fb96f3c1e64f397f91500b0eb371b28da81296ae73a6b08a5b76cdd6", size = 325753, upload-time = "2026-02-27T00:30:17.247Z" },
1031
+ { url = "https://files.pythonhosted.org/packages/cc/79/09f02671eb75b251c5550a1c48e7b3d4b0623efd7c95a15a50f6f9fc1e2e/protobuf-7.34.0-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:4a72a8ec94e7a9f7ef7fe818ed26d073305f347f8b3b5ba31e22f81fd85fca02", size = 340200, upload-time = "2026-02-27T00:30:18.672Z" },
1032
+ { url = "https://files.pythonhosted.org/packages/b5/57/89727baef7578897af5ed166735ceb315819f1c184da8c3441271dbcfde7/protobuf-7.34.0-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:964cf977e07f479c0697964e83deda72bcbc75c3badab506fb061b352d991b01", size = 324268, upload-time = "2026-02-27T00:30:20.088Z" },
1033
+ { url = "https://files.pythonhosted.org/packages/1f/3e/38ff2ddee5cc946f575c9d8cc822e34bde205cf61acf8099ad88ef19d7d2/protobuf-7.34.0-cp310-abi3-win32.whl", hash = "sha256:f791ec509707a1d91bd02e07df157e75e4fb9fbdad12a81b7396201ec244e2e3", size = 426628, upload-time = "2026-02-27T00:30:21.555Z" },
1034
+ { url = "https://files.pythonhosted.org/packages/cb/71/7c32eaf34a61a1bae1b62a2ac4ffe09b8d1bb0cf93ad505f42040023db89/protobuf-7.34.0-cp310-abi3-win_amd64.whl", hash = "sha256:9f9079f1dde4e32342ecbd1c118d76367090d4aaa19da78230c38101c5b3dd40", size = 437901, upload-time = "2026-02-27T00:30:22.836Z" },
1035
+ { url = "https://files.pythonhosted.org/packages/a4/e7/14dc9366696dcb53a413449881743426ed289d687bcf3d5aee4726c32ebb/protobuf-7.34.0-py3-none-any.whl", hash = "sha256:e3b914dd77fa33fa06ab2baa97937746ab25695f389869afdf03e81f34e45dc7", size = 170716, upload-time = "2026-02-27T00:30:23.994Z" },
1036
1036
  ]
1037
1037
 
1038
1038
  [[package]]