llmir 0.0.5__tar.gz → 0.0.7__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llmir
3
- Version: 0.0.5
3
+ Version: 0.0.7
4
4
  Summary: Core message and tool IR for LLM pipelines
5
5
  Author: Mathis Siebert
6
6
  Requires-Python: >=3.11
@@ -1,10 +1,10 @@
1
- from .chunks import AIChunk, AIChunkText, AIChunkFile, AIChunkImageURL, AIChunkToolCall
1
+ from .chunks import AIChunks, AIChunkText, AIChunkFile, AIChunkImageURL, AIChunkToolCall
2
2
  from .roles import AIRoles
3
3
  from .messages import AIMessages, AIMessage, AIMessageToolResponse
4
4
  from .tools import Tool
5
5
 
6
6
  __all__ = [
7
- "AIChunk",
7
+ "AIChunks",
8
8
  "AIChunkText",
9
9
  "AIChunkFile",
10
10
  "AIChunkImageURL",
@@ -0,0 +1,14 @@
1
+ from .openai import to_openai, OpenAIMessages, OpenAIMessage, OpenAIMessageToolResponse, OpenAIContents, OpenAITextContent, OpenAIImageURLContent, OpenAIImageURLURL, OpenAIToolCallContent, OpenAIToolCallFunction
2
+
3
+ __all__ = [
4
+ "to_openai",
5
+ "OpenAIMessages",
6
+ "OpenAIMessage",
7
+ "OpenAIMessageToolResponse",
8
+ "OpenAIContents",
9
+ "OpenAITextContent",
10
+ "OpenAIImageURLContent",
11
+ "OpenAIImageURLURL",
12
+ "OpenAIToolCallContent",
13
+ "OpenAIToolCallFunction",
14
+ ]
@@ -1,7 +1,7 @@
1
- from typing import TypedDict, Literal, Union
1
+ from typing import TypedDict, Literal
2
2
 
3
3
  from ..messages import AIMessages, AIMessageToolResponse
4
- from ..chunks import AIChunk, AIChunkText, AIChunkImageURL, AIChunkFile, AIChunkToolCall
4
+ from ..chunks import AIChunks, AIChunkText, AIChunkImageURL, AIChunkFile, AIChunkToolCall
5
5
  import base64
6
6
  import json
7
7
 
@@ -29,35 +29,58 @@ class OpenAIToolCallContent(TypedDict):
29
29
 
30
30
 
31
31
 
32
- OpenAIContent = Union[OpenAITextContent, OpenAIImageURLContent, OpenAIToolCallContent]
32
+ OpenAIContents = OpenAITextContent | OpenAIImageURLContent | OpenAIToolCallContent
33
33
 
34
34
 
35
35
  class OpenAIMessage(TypedDict):
36
36
  role: str
37
- content: list[OpenAIContent]
37
+ content: list[OpenAIContents]
38
38
 
39
- class OpenAIMessageToolResponse(OpenAIMessage):
39
+ class OpenAIMessageToolResponse(TypedDict):
40
+ role: Literal["tool"]
40
41
  tool_call_id: str
41
42
  name: str
43
+ content: str
42
44
 
43
45
 
44
- def to_openai(messages: list[AIMessages]) -> list[OpenAIMessage]:
46
+ OpenAIMessages = OpenAIMessage | OpenAIMessageToolResponse
47
+
48
+
49
+
50
+ def to_openai(messages: list[AIMessages]) -> list[OpenAIMessages]:
45
51
 
46
52
 
47
- result: list[OpenAIMessage] = []
53
+ result: list[OpenAIMessages] = []
48
54
  for message in messages:
49
55
  role = message.role.value
50
56
  if isinstance(message, AIMessageToolResponse):
57
+ assert(role == "tool")
58
+ text: str = ""
59
+ media_chunks: list[AIChunkFile | AIChunkImageURL] = []
60
+ for chunk in message.chunks:
61
+ if isinstance(chunk, AIChunkText):
62
+ text += chunk.text
63
+ elif isinstance(chunk, AIChunkImageURL) or isinstance(chunk, AIChunkFile):
64
+ media_chunks.append(chunk)
65
+ else:
66
+ raise Exception(f"Invalid chunk type for Tool Response: {chunk.type}")
51
67
  result.append(
52
68
  OpenAIMessageToolResponse(
53
69
  role=role,
54
70
  tool_call_id=message.id,
55
71
  name=message.name,
56
- content=[
57
- chunk_to_openai(chunk) for chunk in message.chunks
58
- ]
72
+ content=text,
59
73
  )
60
74
  )
75
+ if media_chunks:
76
+ result.append(
77
+ OpenAIMessage(
78
+ role="user", # Hacky, but what else to circumvent API limitations in a broadly compatible way?
79
+ content=[
80
+ chunk_to_openai(chunk) for chunk in media_chunks
81
+ ]
82
+ )
83
+ )
61
84
  else:
62
85
  result.append(OpenAIMessage(
63
86
  role= role,
@@ -68,7 +91,7 @@ def to_openai(messages: list[AIMessages]) -> list[OpenAIMessage]:
68
91
  return result
69
92
 
70
93
 
71
- def chunk_to_openai(chunk: AIChunk) -> OpenAIContent:
94
+ def chunk_to_openai(chunk: AIChunks) -> OpenAIContents:
72
95
 
73
96
  match chunk:
74
97
  case AIChunkText():
@@ -23,4 +23,4 @@ class AIChunkToolCall(RichReprMixin, BaseModel):
23
23
  arguments: dict[str, object]
24
24
 
25
25
 
26
- AIChunk = Union[AIChunkText, AIChunkFile, AIChunkImageURL, AIChunkToolCall]
26
+ AIChunks = Union[AIChunkText, AIChunkFile, AIChunkImageURL, AIChunkToolCall]
@@ -1,17 +1,17 @@
1
1
  from pydantic import BaseModel, Field
2
2
  from typing import Literal
3
- from .chunks import AIChunk
3
+ from .chunks import AIChunks
4
4
  from .roles import AIRoles
5
5
 
6
6
  class AIMessage(BaseModel):
7
7
 
8
8
  role: Literal[AIRoles.USER, AIRoles.MODEL, AIRoles.SYSTEM]
9
- chunks: list[AIChunk] = Field(default_factory=list[AIChunk])
9
+ chunks: list[AIChunks] = Field(default_factory=list[AIChunks])
10
10
 
11
11
  class AIMessageToolResponse(BaseModel):
12
12
 
13
13
  role: Literal[AIRoles.TOOL] = AIRoles.TOOL
14
- chunks: list[AIChunk] = Field(default_factory=list[AIChunk])
14
+ chunks: list[AIChunks] = Field(default_factory=list[AIChunks])
15
15
  id: str
16
16
  name: str
17
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llmir
3
- Version: 0.0.5
3
+ Version: 0.0.7
4
4
  Summary: Core message and tool IR for LLM pipelines
5
5
  Author: Mathis Siebert
6
6
  Requires-Python: >=3.11
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "llmir"
3
- version = "0.0.5"
3
+ version = "0.0.7"
4
4
  description = "Core message and tool IR for LLM pipelines"
5
5
  authors = [{ name="Mathis Siebert" }]
6
6
  requires-python = ">=3.11"
@@ -1,13 +0,0 @@
1
- from .openai import to_openai, OpenAIMessage, OpenAIMessageToolResponse, OpenAIContent, OpenAITextContent, OpenAIImageURLContent, OpenAIImageURLURL, OpenAIToolCallContent, OpenAIToolCallFunction
2
-
3
- __all__ = [
4
- "to_openai",
5
- "OpenAIMessage",
6
- "OpenAIMessageToolResponse",
7
- "OpenAIContent",
8
- "OpenAITextContent",
9
- "OpenAIImageURLContent",
10
- "OpenAIImageURLURL",
11
- "OpenAIToolCallContent",
12
- "OpenAIToolCallFunction",
13
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes