Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions EAIP_Technical_Specification.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<eaip:TechnicalSpecification
xmlns:eaip="urn:eaip:spec:v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:eaip:spec:v1 EAIP_Technical_Specification.xsd"
version="1.0.0">

<eaip:Metadata>
<eaip:Title>Enterprise AI Agent Interoperability Protocol (EAIP) Technical Specification</eaip:Title>
<eaip:ProtocolName>EAIP</eaip:ProtocolName>
<eaip:Version>1.0.0</eaip:Version>
<eaip:Status>DRAFT</eaip:Status>
<eaip:LastUpdated>2026-05-29</eaip:LastUpdated>
</eaip:Metadata>

<eaip:Section id="standardization">
<eaip:Title>Necessity of Standardization</eaip:Title>
<eaip:Content>
The rapid proliferation of autonomous AI agents within enterprise environments has led to a fragmented ecosystem. Without a standardized protocol, inter-agent collaboration is hindered by incompatible communication patterns, inconsistent identity management, and opaque state handling. EAIP addresses these challenges by providing a common framework for discovery, authentication, and task delegation, ensuring seamless interoperability across diverse agentic systems.
</eaip:Content>
</eaip:Section>

<eaip:Section id="architecture">
<eaip:Title>API Architecture</eaip:Title>
<eaip:Content>
EAIP mandates the use of gRPC over HTTP/2 as the primary transport mechanism. This choice is driven by the need for high-performance, bidirectional streaming, and strong contract enforcement via Protocol Buffers. gRPC enables efficient task handoff and real-time feedback loops between agents. While REST and WebSockets were considered, gRPC's support for strictly typed interfaces and multiplexed streams makes it the optimal choice for complex agent-to-agent interactions.
</eaip:Content>
<eaip:Subsection id="grpc_config">
<eaip:Title>gRPC Configuration</eaip:Title>
<eaip:Content>
Agents MUST implement services using proto3 definitions. All service methods SHOULD support deadline propagation to ensure system-wide responsiveness.
</eaip:Content>
</eaip:Subsection>
</eaip:Section>

<eaip:Section id="iam">
<eaip:Title>IAM for Autonomous Agents</eaip:Title>
<eaip:Content>
Security in EAIP is built on the SPIFFE (Secure Production Identity Framework for Everyone) standard. Each agent is assigned a SPIFFE ID, which is used to issue short-lived, cryptographically verifiable SVIDs (SPIFFE Verifiable Identity Documents). SPIRE is recommended as the control plane for attesting agent workloads and managing the SVID lifecycle. Mutual TLS (mTLS) using X.509 SVIDs is the required method for securing agent-to-agent communication.
</eaip:Content>
</eaip:Section>

<eaip:Section id="state_management">
<eaip:Title>State &amp; Error Management</eaip:Title>
<eaip:Content>
EAIP introduces the Recursive Context Envelope (RCE) for managing distributed agent state. The RCE is a nested data structure that accompanies every request, capturing the lineage of the task, current execution context, and accumulated error metadata. This allows agents to maintain a shared understanding of multi-step processes without relying on a centralized database for transient state. Errors are propagated up the RCE chain, enabling sophisticated recovery and backtracking strategies.
</eaip:Content>
</eaip:Section>

<eaip:ReferenceArchitecture>
<eaip:Description>
The following sequence diagram illustrates the standard EAIP flow for SVID acquisition, agent lookup, and task execution with RCE state management.
</eaip:Description>
<eaip:Diagram format="mermaid"><![CDATA[
sequenceDiagram
participant Caller as Caller Agent
participant SPIRE as SPIRE Server
participant Registry as Agent Registry
participant Target as Target Agent
participant RCE_Store as RCE Store

Caller->>SPIRE: Request SVID
SPIRE-->>Caller: X.509 SVID
Caller->>Registry: Lookup Target (capabilities)
Registry-->>Caller: Target Endpoint
Caller->>RCE_Store: Init Envelope (RCE depth-0 root)
Caller->>Target: HandoffRequest (gRPC/HTTP/2, SVID, RCE root)
Target->>RCE_Store: Read Context
Target->>Caller: TaskStream (gRPC bidi, HTTP/2)
Target->>RCE_Store: Update Context (append child RCE)
Target->>Caller: TaskComplete
]]></eaip:Diagram>
</eaip:ReferenceArchitecture>

</eaip:TechnicalSpecification>
75 changes: 75 additions & 0 deletions EAIP_Technical_Specification.xsd
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:eaip:spec:v1"
xmlns:eaip="urn:eaip:spec:v1"
elementFormDefault="qualified">

<xs:element name="TechnicalSpecification">
<xs:complexType>
<xs:sequence>
<xs:element name="Metadata" type="eaip:MetadataType"/>
<xs:element name="Section" type="eaip:SectionType" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="ReferenceArchitecture" type="eaip:ReferenceArchitectureType"/>
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>

<xs:complexType name="MetadataType">
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="ProtocolName" type="xs:string"/>
<xs:element name="Version" type="xs:string"/>
<xs:element name="Status" type="eaip:StatusType"/>
<xs:element name="LastUpdated" type="xs:date"/>
</xs:sequence>
</xs:complexType>

<xs:simpleType name="StatusType">
<xs:restriction base="xs:string">
<xs:enumeration value="DRAFT"/>
<xs:enumeration value="FINALIZED"/>
<xs:enumeration value="DEPRECATED"/>
<xs:enumeration value="OBSOLETE"/>
</xs:restriction>
</xs:simpleType>

<xs:complexType name="SectionType">
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Content" type="xs:string"/>
<xs:element name="Subsection" type="eaip:SubsectionType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>

<xs:complexType name="SubsectionType">
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Content" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>

<xs:complexType name="ReferenceArchitectureType">
<xs:sequence>
<xs:element name="Description" type="xs:string"/>
<xs:element name="Diagram" type="eaip:DiagramType"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="DiagramType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="format" type="eaip:DiagramFormatType" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

<xs:simpleType name="DiagramFormatType">
<xs:restriction base="xs:string">
<xs:enumeration value="mermaid"/>
</xs:restriction>
</xs:simpleType>

</xs:schema>
Binary file added __pycache__/main.cpython-312.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3 changes: 3 additions & 0 deletions pipeline_2026-05-29_18-23-13_889624.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
2026-05-29 18:23:13.925 | INFO | main:<module>:23 - Application startup
2026-05-29 18:23:29.683 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:23:30.156 | INFO | main:__init__:73 - CV model loaded successfully.
12 changes: 12 additions & 0 deletions pipeline_2026-05-29_18-25-55_544530.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
2026-05-29 18:25:55.555 | INFO | main:<module>:23 - Application startup
2026-05-29 18:25:56.900 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:25:56.965 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:07.257 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:08.071 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:08.130 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:09.584 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:10.647 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:10.708 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:12.233 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:13.095 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:13.246 | INFO | main:__init__:73 - CV model loaded successfully.
9 changes: 9 additions & 0 deletions pipeline_2026-05-29_18-26-07_247345.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
2026-05-29 18:26:07.257 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:08.071 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:08.130 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:09.584 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:10.647 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:10.708 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:12.233 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:13.095 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:13.246 | INFO | main:__init__:73 - CV model loaded successfully.
6 changes: 6 additions & 0 deletions pipeline_2026-05-29_18-26-09_575874.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
2026-05-29 18:26:09.584 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:10.647 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:10.708 | INFO | main:__init__:73 - CV model loaded successfully.
2026-05-29 18:26:12.233 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:13.095 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:13.246 | INFO | main:__init__:73 - CV model loaded successfully.
3 changes: 3 additions & 0 deletions pipeline_2026-05-29_18-26-12_224333.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
2026-05-29 18:26:12.233 | INFO | main:<module>:23 - Application startup
2026-05-29 18:26:13.095 | INFO | main:__init__:56 - NLP model loaded successfully.
2026-05-29 18:26:13.246 | INFO | main:__init__:73 - CV model loaded successfully.
2 changes: 1 addition & 1 deletion test_cv_module.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import unittest
from PIL import Image
from cv_module import CVModule
from main import CVModule

class TestCVModule(unittest.TestCase):
def setUp(self):
Expand Down
2 changes: 1 addition & 1 deletion test_nlp_module.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import unittest
from nlp_module import NLPModule
from main import NLPModule

class TestNLPModule(unittest.TestCase):
def setUp(self):
Expand Down
2 changes: 1 addition & 1 deletion test_speech_processor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import unittest
from io import BytesIO
from fastapi import UploadFile
from speech_processor import SpeechProcessor
from main import SpeechProcessor

class TestSpeechProcessor(unittest.TestCase):
def setUp(self):
Expand All @@ -17,7 +17,7 @@

def test_text_to_speech(self):
text = "Hello world!"
result = self.speech_processor.text_to_speech(text)

Check failure on line 20 in test_speech_processor.py

View check run for this annotation

Codeac.io / Codeac Code Quality

assignment-from-no-return

Assigning result of a function call, where the function has no return
self.assertIsNone(result) # Text-to-speech returns None

def test_text_to_speech_empty_text(self):
Expand Down
Loading