Skip to content

Commit fee2e37

Browse files
committed
dependent/independent context implementation
Signed-off-by: Mandana Vaziri <[email protected]>
1 parent bcfabe8 commit fee2e37

File tree

12 files changed

+191
-92
lines changed

12 files changed

+191
-92
lines changed

examples/tutorial/independent.pdl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
description: Independent example -- hello * ( ' in French' + ' en Espanol') * Goodbye!
1+
description: Independent example -- hello * ( (' in French'*g) + (' en Espanol'*g)) * Goodbye! * g
22
text:
33
- hello
44
- context: independent
@@ -9,5 +9,5 @@ text:
99
- text:
1010
- " en Espanol!"
1111
- model: ollama_chat/granite3.2:2b
12-
- "Goodbye!"
12+
- "Which language did I use last?"
1313
- model: ollama_chat/granite3.2:2b

examples/tutorial/independent_docs.pdl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ text:
66
text:
77
- ${ doc1 }
88
- ${ doc2 }
9+
- Compare and contrast the above documents.
910
- model: ollama_chat/granite3.2:2b

src/pdl/pdl_ast.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from pydantic.json_schema import SkipJsonSchema
2626
from typing_extensions import TypeAliasType
2727

28+
from .pdl_context import DependentContext
2829
from .pdl_lazy import PdlDict, PdlLazy
2930

3031

@@ -41,7 +42,7 @@ def _ensure_lower(value):
4142

4243

4344
LazyMessage: TypeAlias = PdlLazy[dict[str, Any]]
44-
LazyMessages: TypeAlias = PdlLazy[list[dict[str, Any]]]
45+
LazyMessages: TypeAlias = DependentContext
4546

4647

4748
class BlockKind(StrEnum):

src/pdl/pdl_context.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from typing import Any
2+
from enum import StrEnum
3+
from .pdl_lazy import (
4+
PdlDict,
5+
PdlList,
6+
PdlLazy,
7+
)
8+
9+
class SerializeMode(StrEnum):
10+
LITELLM = "litellm"
11+
GRANITEIO = "graniteio"
12+
13+
class PDLContext():
14+
def serialize(self, mode: SerializeMode) -> list[dict[str, Any]]:
15+
return []
16+
17+
18+
class BaseMessage(PDLContext):
19+
message: PdlDict[str, Any]
20+
21+
def __init__(self, message: dict[str, Any]):
22+
if "role" not in message:
23+
assert False
24+
if "content" not in message:
25+
assert False
26+
self.message = PdlDict(message)
27+
28+
def serialize(self, mode: SerializeMode) -> list[dict[str, Any]]:
29+
result = self.message.result()
30+
return [result]
31+
32+
33+
34+
class IndependentContext(PDLContext):
35+
context: PdlList[PDLContext]
36+
37+
def __init__(self, context: PdlList[PDLContext]):
38+
self.context = context
39+
40+
41+
def serialize(self, mode: SerializeMode) -> list[dict[str, Any]]:
42+
result = self.context.result()
43+
contexts = [m.serialize(mode) for m in result]
44+
flat = [x for xs in contexts for x in xs]
45+
if mode == SerializeMode.GRANITEIO:
46+
return [{"independent": flat}]
47+
return flat
48+
49+
50+
class DependentContext(PDLContext):
51+
context: PdlList[PDLContext]
52+
53+
def __init__(self, context: PdlList[PDLContext]):
54+
self.context = context
55+
56+
def serialize(self, mode: SerializeMode) -> list[dict[str, Any]]:
57+
result = self.context.result()
58+
contexts = [m.serialize(mode) for m in result]
59+
return [x for xs in contexts for x in xs]
60+
61+
62+
def deserialize(context: list[dict[str, Any]]) -> DependentContext: # Only support dependent for now
63+
ret: DependentContext = DependentContext(PdlList([]))
64+
for message in context:
65+
if isinstance(message, dict):
66+
if "role" not in message:
67+
assert False
68+
if "content" not in message:
69+
assert False
70+
ret = DependentContext(PdlList([ret, BaseMessage(message)]))
71+
else:
72+
ret = DependentContext(PdlList([ret, message]))
73+
74+
return ret

0 commit comments

Comments
 (0)