Spaces:
Sleeping
Sleeping
Commit
·
665cc97
1
Parent(s):
c1ae600
feat: enhance architecture and developer documentation for clarity and detail
Browse files- Updated ARCHITECTURE.md to provide a comprehensive overview of the multi-agent system, including detailed descriptions of core components and execution flow.
- Expanded DEVELOPER.md to include setup instructions, coding standards, error handling, and testing strategies, improving guidance for developers.
- Enhanced README.md with detailed features, installation steps, configuration options, and usage examples, ensuring better user understanding of the system.
- Added cost tracking and error handling details to documentation, emphasizing the system's robustness and reliability.
- Improved logging and debugging information in app.py for better monitoring of costs and execution details.
- ARCHITECTURE.md +327 -126
- CHANGELOG.md +290 -0
- DEVELOPER.md +507 -242
- README.md +251 -1
- logs/di_content/di_content_20250617_120600_tables.html +1441 -0
- logs/di_content/di_content_20250617_121947_tables.html +1441 -0
- logs/di_content/di_content_20250617_125833_tables.html +1441 -0
- src/agents/__pycache__/field_mapper_agent.cpython-312.pyc +0 -0
- src/agents/unique_indices_combinator.py +3 -0
- src/agents/unique_indices_loop_agent.py +200 -0
- src/app.py +9 -0
- src/config/__pycache__/settings.cpython-312.pyc +0 -0
- src/config/settings.py +6 -0
- src/orchestrator/__pycache__/executor.cpython-312.pyc +0 -0
- src/orchestrator/__pycache__/planner.cpython-312.pyc +0 -0
- src/orchestrator/executor.py +31 -1
- src/orchestrator/planner.py +1 -0
- src/services/__pycache__/llm_client.cpython-312.pyc +0 -0
- src/services/llm_client.py +105 -53
- test_cost_tracking.py +142 -0
- test_retry.py +83 -0
ARCHITECTURE.md
CHANGED
@@ -1,143 +1,344 @@
|
|
1 |
-
# Architecture
|
2 |
|
3 |
-
## System
|
4 |
|
5 |
-
The
|
6 |
|
7 |
-
|
8 |
|
9 |
-
|
10 |
-
- Generates execution plans using Azure OpenAI
|
11 |
-
- Determines the sequence of operations
|
12 |
-
- Manages task dependencies
|
13 |
|
14 |
-
|
15 |
-
- Executes the generated plan
|
16 |
-
- Manages agent execution flow
|
17 |
-
- Handles context and result management
|
18 |
-
- Coordinates parallel agent execution
|
19 |
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
-
##
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
```
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
2. **Field Extraction Process**
|
53 |
-
- Document type inference
|
54 |
-
- User profile determination
|
55 |
-
- Content processing:
|
56 |
-
- Text content analysis
|
57 |
-
- Table structure analysis
|
58 |
-
- Value extraction and validation
|
59 |
-
|
60 |
-
3. **Context Building**
|
61 |
-
- Document metadata
|
62 |
-
- Field descriptions
|
63 |
-
- User context
|
64 |
-
- Execution history
|
65 |
-
- Combined text and table content
|
66 |
-
|
67 |
-
## Key Features
|
68 |
-
|
69 |
-
### Document Type Inference
|
70 |
-
The system automatically infers document type and user profile:
|
71 |
```python
|
72 |
-
|
73 |
-
"
|
74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
```
|
76 |
|
77 |
-
###
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
-
|
134 |
-
|
135 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
|
137 |
## Deployment
|
138 |
-
- Streamlit app deployment
|
139 |
-
- Environment configuration
|
140 |
-
- API key management
|
141 |
-
- Logging setup
|
142 |
|
143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Architecture Documentation
|
2 |
|
3 |
+
## System Overview
|
4 |
|
5 |
+
The Deep-Research PDF Field Extractor is a multi-agent system designed to extract structured data from biotech-related PDFs. The system uses Azure Document Intelligence for document processing and Azure OpenAI for intelligent field extraction.
|
6 |
|
7 |
+
## Core Architecture
|
8 |
|
9 |
+
### Multi-Agent Design
|
|
|
|
|
|
|
10 |
|
11 |
+
The system follows a multi-agent architecture where each agent has a specific responsibility:
|
|
|
|
|
|
|
|
|
12 |
|
13 |
+
```
|
14 |
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
15 |
+
│ PDFAgent │ │ TableAgent │ │ IndexAgent │
|
16 |
+
│ │ │ │ │ │
|
17 |
+
│ • PDF Text │───▶│ • Table │───▶│ • Semantic │
|
18 |
+
│ Extraction │ │ Processing │ │ Indexing │
|
19 |
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
20 |
+
│
|
21 |
+
▼
|
22 |
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
23 |
+
│UniqueIndices │ │UniqueIndices │ │FieldMapper │
|
24 |
+
│Combinator │ │LoopAgent │ │Agent │
|
25 |
+
│ │ │ │ │ │
|
26 |
+
│ • Extract │───▶│ • Loop through │ │ • Extract │
|
27 |
+
│ combinations │ │ combinations │ │ individual │
|
28 |
+
│ │ │ • Add fields │ │ fields │
|
29 |
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
30 |
+
```
|
31 |
+
|
32 |
+
### Execution Flow
|
33 |
+
|
34 |
+
#### Original Strategy Flow
|
35 |
+
```
|
36 |
+
1. PDFAgent → Extract text from PDF
|
37 |
+
2. TableAgent → Process tables with Azure DI
|
38 |
+
3. IndexAgent → Create semantic search index
|
39 |
+
4. ForEachField → Iterate through fields
|
40 |
+
5. FieldMapperAgent → Extract each field value
|
41 |
+
```
|
42 |
+
|
43 |
+
#### Unique Indices Strategy Flow
|
44 |
+
```
|
45 |
+
1. PDFAgent → Extract text from PDF
|
46 |
+
2. TableAgent → Process tables with Azure DI
|
47 |
+
3. UniqueIndicesCombinator → Extract unique combinations
|
48 |
+
4. UniqueIndicesLoopAgent → Extract additional fields for each combination
|
49 |
+
```
|
50 |
+
|
51 |
+
## Agent Details
|
52 |
+
|
53 |
+
### PDFAgent
|
54 |
+
- **Purpose**: Extract text content from PDF files
|
55 |
+
- **Technology**: PyMuPDF (fitz)
|
56 |
+
- **Output**: Raw text content
|
57 |
+
- **Error Handling**: Graceful handling of corrupted PDFs
|
58 |
+
|
59 |
+
### TableAgent
|
60 |
+
- **Purpose**: Process tables using Azure Document Intelligence
|
61 |
+
- **Technology**: Azure DI Layout Analysis
|
62 |
+
- **Features**:
|
63 |
+
- Table structure preservation
|
64 |
+
- Rowspan/colspan handling
|
65 |
+
- HTML table generation for debugging
|
66 |
+
- **Output**: Processed table data
|
67 |
+
|
68 |
+
### UniqueIndicesCombinator
|
69 |
+
- **Purpose**: Extract unique combinations of specified indices
|
70 |
+
- **Input**: Document text, unique indices descriptions
|
71 |
+
- **LLM Prompt**: Structured prompt for combination extraction
|
72 |
+
- **Output**: JSON array of unique combinations
|
73 |
+
- **Cost Tracking**: Tracks input/output tokens
|
74 |
+
|
75 |
+
### UniqueIndicesLoopAgent
|
76 |
+
- **Purpose**: Extract additional fields for each unique combination
|
77 |
+
- **Input**: Unique combinations, field descriptions
|
78 |
+
- **Process**: Loops through each combination
|
79 |
+
- **LLM Calls**: One call per combination
|
80 |
+
- **Error Handling**: Continues with partial failures
|
81 |
+
- **Output**: Complete data with all fields
|
82 |
+
|
83 |
+
### FieldMapperAgent
|
84 |
+
- **Purpose**: Extract individual field values
|
85 |
+
- **Strategies**:
|
86 |
+
- Page-by-page analysis
|
87 |
+
- Semantic search fallback
|
88 |
+
- Unique indices strategy
|
89 |
+
- **Features**: Context-aware extraction
|
90 |
+
- **Output**: Field values with confidence scores
|
91 |
+
|
92 |
+
### IndexAgent
|
93 |
+
- **Purpose**: Create semantic search indices
|
94 |
+
- **Technology**: Azure OpenAI Embeddings
|
95 |
+
- **Features**: Chunk-based indexing
|
96 |
+
- **Output**: Searchable document index
|
97 |
|
98 |
+
## Services
|
99 |
|
100 |
+
### LLMClient
|
101 |
+
```python
|
102 |
+
class LLMClient:
|
103 |
+
def __init__(self, settings):
|
104 |
+
# Azure OpenAI configuration
|
105 |
+
self._deployment = settings.AZURE_OPENAI_DEPLOYMENT
|
106 |
+
self._max_retries = settings.LLM_MAX_RETRIES
|
107 |
+
self._base_delay = settings.LLM_BASE_DELAY
|
108 |
+
|
109 |
+
def responses(self, prompt, **kwargs):
|
110 |
+
# Retry logic with exponential backoff
|
111 |
+
# Cost tracking integration
|
112 |
+
# Error handling
|
113 |
+
```
|
114 |
+
|
115 |
+
**Key Features:**
|
116 |
+
- Retry logic with exponential backoff
|
117 |
+
- Cost tracking integration
|
118 |
+
- Error classification (retryable vs non-retryable)
|
119 |
+
- Jitter to prevent thundering herd
|
120 |
+
|
121 |
+
### CostTracker
|
122 |
+
```python
|
123 |
+
class CostTracker:
|
124 |
+
def __init__(self):
|
125 |
+
self.llm_calls: List[LLMCall] = []
|
126 |
+
self.current_file_costs = {}
|
127 |
+
self.total_costs = {}
|
128 |
+
|
129 |
+
def add_llm_tokens(self, input_tokens, output_tokens, description):
|
130 |
+
# Track individual LLM calls
|
131 |
+
# Calculate costs
|
132 |
+
# Store detailed information
|
133 |
+
```
|
134 |
|
135 |
+
**Key Features:**
|
136 |
+
- Individual call tracking
|
137 |
+
- Cost calculation based on Azure pricing
|
138 |
+
- Detailed breakdown by operation
|
139 |
+
- Session and total cost tracking
|
140 |
+
|
141 |
+
### AzureDIService
|
142 |
+
```python
|
143 |
+
class AzureDIService:
|
144 |
+
def extract_tables(self, pdf_bytes):
|
145 |
+
# Azure DI Layout Analysis
|
146 |
+
# Table structure preservation
|
147 |
+
# HTML debugging output
|
148 |
```
|
149 |
|
150 |
+
**Key Features:**
|
151 |
+
- Layout analysis for complex documents
|
152 |
+
- Table structure preservation
|
153 |
+
- Debug output generation
|
154 |
+
- Error handling for DI operations
|
155 |
+
|
156 |
+
## Data Flow
|
157 |
+
|
158 |
+
### Context Management
|
159 |
+
The system uses a context dictionary to pass data between agents:
|
160 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
```python
|
162 |
+
ctx = {
|
163 |
+
"pdf_file": pdf_file,
|
164 |
+
"text": extracted_text,
|
165 |
+
"fields": field_list,
|
166 |
+
"unique_indices": unique_indices,
|
167 |
+
"field_descriptions": field_descriptions,
|
168 |
+
"cost_tracker": cost_tracker,
|
169 |
+
"results": [],
|
170 |
+
"strategy": strategy
|
171 |
+
}
|
172 |
```
|
173 |
|
174 |
+
### Result Processing
|
175 |
+
Results are processed through multiple stages:
|
176 |
+
|
177 |
+
1. **Raw Extraction**: LLM responses in JSON format
|
178 |
+
2. **Validation**: JSON parsing and structure validation
|
179 |
+
3. **Flattening**: Convert to tabular format
|
180 |
+
4. **DataFrame**: Final structured output
|
181 |
+
|
182 |
+
## Error Handling Strategy
|
183 |
+
|
184 |
+
### Retry Logic
|
185 |
+
```python
|
186 |
+
def _should_retry(self, exception) -> bool:
|
187 |
+
# Retry on 5xx errors
|
188 |
+
if hasattr(exception, 'status_code'):
|
189 |
+
return exception.status_code >= 500
|
190 |
+
# Retry on connection errors
|
191 |
+
return any(error in str(exception) for error in ['Timeout', 'Connection'])
|
192 |
+
```
|
193 |
+
|
194 |
+
### Graceful Degradation
|
195 |
+
- Continue processing with partial failures
|
196 |
+
- Return null values for failed extractions
|
197 |
+
- Log detailed error information
|
198 |
+
- Maintain cost tracking during failures
|
199 |
+
|
200 |
+
### Error Classification
|
201 |
+
- **Retryable**: 503, 500, connection timeouts
|
202 |
+
- **Non-retryable**: 400, 401, validation errors
|
203 |
+
- **Fatal**: Configuration errors, missing dependencies
|
204 |
+
|
205 |
+
## Performance Considerations
|
206 |
+
|
207 |
+
### Optimization Strategies
|
208 |
+
1. **Parallel Processing**: Independent field extraction
|
209 |
+
2. **Caching**: Session state for field descriptions
|
210 |
+
3. **Batching**: Group similar operations
|
211 |
+
4. **Early Termination**: Stop on critical failures
|
212 |
+
|
213 |
+
### Resource Management
|
214 |
+
- **Memory**: Efficient text processing
|
215 |
+
- **API Limits**: Respect Azure rate limits
|
216 |
+
- **Cost Control**: Detailed tracking and alerts
|
217 |
+
- **Timeout Handling**: Configurable timeouts
|
218 |
+
|
219 |
+
## Security
|
220 |
+
|
221 |
+
### Data Protection
|
222 |
+
- No persistent storage of sensitive data
|
223 |
+
- Secure API key management
|
224 |
+
- Session-based data handling
|
225 |
+
- Log sanitization
|
226 |
+
|
227 |
+
### Access Control
|
228 |
+
- Environment variable configuration
|
229 |
+
- API key validation
|
230 |
+
- Error message sanitization
|
231 |
+
|
232 |
+
## Monitoring and Observability
|
233 |
+
|
234 |
+
### Logging Strategy
|
235 |
+
```python
|
236 |
+
# Structured logging with levels
|
237 |
+
logger.info(f"Processing {len(combinations)} combinations")
|
238 |
+
logger.debug(f"LLM response: {response[:200]}...")
|
239 |
+
logger.error(f"Failed to extract field: {field}")
|
240 |
+
```
|
241 |
+
|
242 |
+
### Metrics Collection
|
243 |
+
- LLM call counts and durations
|
244 |
+
- Token usage and costs
|
245 |
+
- Success/failure rates
|
246 |
+
- Processing times
|
247 |
+
|
248 |
+
### Debug Information
|
249 |
+
- Detailed execution traces
|
250 |
+
- Cost breakdown tables
|
251 |
+
- Error context and stack traces
|
252 |
+
- Performance metrics
|
253 |
+
|
254 |
+
## Configuration Management
|
255 |
+
|
256 |
+
### Settings Structure
|
257 |
+
```python
|
258 |
+
class Settings(BaseSettings):
|
259 |
+
# Azure OpenAI
|
260 |
+
AZURE_OPENAI_ENDPOINT: str
|
261 |
+
AZURE_OPENAI_API_KEY: str
|
262 |
+
AZURE_OPENAI_DEPLOYMENT: str
|
263 |
+
|
264 |
+
# Azure Document Intelligence
|
265 |
+
AZURE_DI_ENDPOINT: str
|
266 |
+
AZURE_DI_KEY: str
|
267 |
+
|
268 |
+
# Retry Configuration
|
269 |
+
LLM_MAX_RETRIES: int = 5
|
270 |
+
LLM_BASE_DELAY: float = 1.0
|
271 |
+
LLM_MAX_DELAY: float = 60.0
|
272 |
+
```
|
273 |
+
|
274 |
+
### Environment Variables
|
275 |
+
- `.env` file support
|
276 |
+
- Environment variable override
|
277 |
+
- Validation and defaults
|
278 |
+
- Secure key management
|
279 |
+
|
280 |
+
## Testing Strategy
|
281 |
+
|
282 |
+
### Unit Tests
|
283 |
+
- Individual agent testing
|
284 |
+
- Service layer testing
|
285 |
+
- Mock external dependencies
|
286 |
+
- Cost tracking validation
|
287 |
+
|
288 |
+
### Integration Tests
|
289 |
+
- End-to-end workflows
|
290 |
+
- Error scenario testing
|
291 |
+
- Performance benchmarking
|
292 |
+
- Cost accuracy validation
|
293 |
+
|
294 |
+
### Test Coverage
|
295 |
+
- Core functionality: 90%+
|
296 |
+
- Error handling: 100%
|
297 |
+
- Cost tracking: 100%
|
298 |
+
- Retry logic: 100%
|
299 |
|
300 |
## Deployment
|
|
|
|
|
|
|
|
|
301 |
|
302 |
+
### Requirements
|
303 |
+
- Python 3.9+
|
304 |
+
- Azure OpenAI access
|
305 |
+
- Azure Document Intelligence access
|
306 |
+
- Streamlit for UI
|
307 |
+
|
308 |
+
### Dependencies
|
309 |
+
```
|
310 |
+
azure-ai-documentintelligence
|
311 |
+
openai
|
312 |
+
streamlit
|
313 |
+
pandas
|
314 |
+
pymupdf
|
315 |
+
pydantic-settings
|
316 |
+
```
|
317 |
+
|
318 |
+
### Environment Setup
|
319 |
+
1. Install dependencies
|
320 |
+
2. Configure environment variables
|
321 |
+
3. Set up Azure resources
|
322 |
+
4. Test connectivity
|
323 |
+
5. Deploy application
|
324 |
+
|
325 |
+
## Future Enhancements
|
326 |
+
|
327 |
+
### Planned Features
|
328 |
+
- **Batch Processing**: Multiple document processing
|
329 |
+
- **Custom Models**: Domain-specific extraction
|
330 |
+
- **Advanced Caching**: Redis-based caching
|
331 |
+
- **API Endpoints**: REST API for integration
|
332 |
+
- **Real-time Processing**: Streaming document processing
|
333 |
+
|
334 |
+
### Scalability Improvements
|
335 |
+
- **Microservices**: Agent separation
|
336 |
+
- **Queue System**: Asynchronous processing
|
337 |
+
- **Load Balancing**: Multiple instances
|
338 |
+
- **Database Integration**: Persistent storage
|
339 |
+
|
340 |
+
### Performance Optimizations
|
341 |
+
- **Vector Search**: Enhanced semantic search
|
342 |
+
- **Model Optimization**: Smaller, faster models
|
343 |
+
- **Parallel Processing**: Multi-threaded extraction
|
344 |
+
- **Memory Optimization**: Efficient data structures
|
CHANGELOG.md
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Changelog
|
2 |
+
|
3 |
+
All notable changes to the Deep-Research PDF Field Extractor project will be documented in this file.
|
4 |
+
|
5 |
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6 |
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7 |
+
|
8 |
+
## [Unreleased]
|
9 |
+
|
10 |
+
### Added
|
11 |
+
- Comprehensive cost tracking for all LLM calls
|
12 |
+
- Retry logic with exponential backoff for Azure OpenAI API calls
|
13 |
+
- Unique Indices Strategy for document processing
|
14 |
+
- UniqueIndicesCombinator agent for extracting unique combinations
|
15 |
+
- UniqueIndicesLoopAgent for processing combinations with additional fields
|
16 |
+
- Enhanced field descriptions with format, examples, and possible values
|
17 |
+
- Detailed cost breakdown tables in the UI
|
18 |
+
- Graceful degradation for partial failures
|
19 |
+
- Test scripts for retry logic and cost tracking validation
|
20 |
+
|
21 |
+
### Changed
|
22 |
+
- Updated FieldMapperAgent to support multiple extraction strategies
|
23 |
+
- Enhanced LLM prompts with detailed field descriptions
|
24 |
+
- Improved error handling with better classification
|
25 |
+
- Updated UI to support strategy selection and field description tables
|
26 |
+
- Modified executor to handle unique indices strategy workflow
|
27 |
+
- Enhanced logging with cost tracking information
|
28 |
+
|
29 |
+
### Fixed
|
30 |
+
- Cost tracking context not being passed to agents
|
31 |
+
- UI issues with redundant labels and spacing
|
32 |
+
- Peptide sequence extraction errors
|
33 |
+
- 503 Service Unavailable error handling
|
34 |
+
- Context management in agents
|
35 |
+
|
36 |
+
## [1.0.0] - 2024-01-XX
|
37 |
+
|
38 |
+
### Added
|
39 |
+
- Multi-agent architecture for PDF field extraction
|
40 |
+
- Azure Document Intelligence integration
|
41 |
+
- Azure OpenAI integration for intelligent extraction
|
42 |
+
- Streamlit-based user interface
|
43 |
+
- PDF text and table extraction capabilities
|
44 |
+
- Semantic search for improved field mapping
|
45 |
+
- Document context inference
|
46 |
+
- Field description support
|
47 |
+
- Execution trace monitoring
|
48 |
+
- Result export functionality
|
49 |
+
|
50 |
+
### Features
|
51 |
+
- **PDFAgent**: Extracts text from PDF files using PyMuPDF
|
52 |
+
- **TableAgent**: Processes tables using Azure Document Intelligence
|
53 |
+
- **FieldMapperAgent**: Maps fields to values using LLM-based extraction
|
54 |
+
- **IndexAgent**: Creates semantic search indices
|
55 |
+
- **Planner**: Generates execution plans using Azure OpenAI
|
56 |
+
- **Executor**: Orchestrates agent execution and manages context
|
57 |
+
|
58 |
+
### Technical Implementation
|
59 |
+
- Base agent class for consistent agent implementation
|
60 |
+
- Context management system for data passing between agents
|
61 |
+
- Error handling and logging infrastructure
|
62 |
+
- Configuration management with environment variables
|
63 |
+
- Session state management for UI persistence
|
64 |
+
|
65 |
+
## [0.9.0] - 2024-01-XX
|
66 |
+
|
67 |
+
### Added
|
68 |
+
- Initial project structure
|
69 |
+
- Basic PDF processing capabilities
|
70 |
+
- Azure service integrations
|
71 |
+
- Streamlit application framework
|
72 |
+
|
73 |
+
### Features
|
74 |
+
- PDF text extraction
|
75 |
+
- Basic field mapping
|
76 |
+
- Simple UI interface
|
77 |
+
- Azure OpenAI integration
|
78 |
+
|
79 |
+
## [0.8.0] - 2024-01-XX
|
80 |
+
|
81 |
+
### Added
|
82 |
+
- Project initialization
|
83 |
+
- Basic architecture design
|
84 |
+
- Development environment setup
|
85 |
+
- Documentation structure
|
86 |
+
|
87 |
+
---
|
88 |
+
|
89 |
+
## Detailed Changes
|
90 |
+
|
91 |
+
### Cost Tracking Implementation
|
92 |
+
|
93 |
+
**Added:**
|
94 |
+
- `CostTracker` class for comprehensive API usage monitoring
|
95 |
+
- Individual LLM call tracking with descriptions
|
96 |
+
- Token usage monitoring (input and output)
|
97 |
+
- Cost calculation based on Azure OpenAI pricing
|
98 |
+
- Detailed cost breakdown tables
|
99 |
+
- Session and total cost tracking
|
100 |
+
|
101 |
+
**Files Modified:**
|
102 |
+
- `src/services/cost_tracker.py` - New cost tracking service
|
103 |
+
- `src/services/llm_client.py` - Integrated cost tracking
|
104 |
+
- `src/agents/field_mapper_agent.py` - Added cost tracking context
|
105 |
+
- `src/agents/unique_indices_combinator.py` - Added cost tracking context
|
106 |
+
- `src/agents/unique_indices_loop_agent.py` - Added cost tracking context
|
107 |
+
- `src/orchestrator/executor.py` - Reset cost tracker for new files
|
108 |
+
- `src/app.py` - Display cost information in UI
|
109 |
+
|
110 |
+
### Retry Logic Implementation
|
111 |
+
|
112 |
+
**Added:**
|
113 |
+
- Exponential backoff with jitter for retry attempts
|
114 |
+
- Configurable retry parameters via environment variables
|
115 |
+
- Error classification (retryable vs non-retryable)
|
116 |
+
- Graceful handling of transient failures
|
117 |
+
|
118 |
+
**Configuration:**
|
119 |
+
- `LLM_MAX_RETRIES`: Maximum retry attempts (default: 5)
|
120 |
+
- `LLM_BASE_DELAY`: Base delay for exponential backoff (default: 1.0s)
|
121 |
+
- `LLM_MAX_DELAY`: Maximum delay cap (default: 60.0s)
|
122 |
+
|
123 |
+
**Files Modified:**
|
124 |
+
- `src/services/llm_client.py` - Added retry logic
|
125 |
+
- `test_retry.py` - Test script for retry functionality
|
126 |
+
|
127 |
+
### Unique Indices Strategy
|
128 |
+
|
129 |
+
**Added:**
|
130 |
+
- `UniqueIndicesCombinator` agent for extracting unique combinations
|
131 |
+
- `UniqueIndicesLoopAgent` agent for processing combinations
|
132 |
+
- Strategy selection in UI
|
133 |
+
- Enhanced field descriptions for unique indices
|
134 |
+
|
135 |
+
**Workflow:**
|
136 |
+
1. Extract unique combinations of specified indices
|
137 |
+
2. Loop through each combination to extract additional fields
|
138 |
+
3. Return complete data structure
|
139 |
+
|
140 |
+
**Files Added:**
|
141 |
+
- `src/agents/unique_indices_combinator.py`
|
142 |
+
- `src/agents/unique_indices_loop_agent.py`
|
143 |
+
|
144 |
+
**Files Modified:**
|
145 |
+
- `src/orchestrator/planner.py` - Added unique indices strategy
|
146 |
+
- `src/orchestrator/executor.py` - Added new agents to tools
|
147 |
+
- `src/app.py` - Added strategy selection and UI components
|
148 |
+
|
149 |
+
### Enhanced Field Descriptions
|
150 |
+
|
151 |
+
**Added:**
|
152 |
+
- Table-based field description interface
|
153 |
+
- Support for format, examples, and possible values
|
154 |
+
- Session state management for descriptions
|
155 |
+
- Enhanced LLM prompts with detailed field information
|
156 |
+
|
157 |
+
**UI Improvements:**
|
158 |
+
- Editable tables for field descriptions
|
159 |
+
- Add/remove row functionality
|
160 |
+
- Persistent session state
|
161 |
+
- Better layout and spacing
|
162 |
+
|
163 |
+
**Files Modified:**
|
164 |
+
- `src/app.py` - Enhanced UI with field description tables
|
165 |
+
- `src/agents/field_mapper_agent.py` - Enhanced prompts
|
166 |
+
- `src/agents/unique_indices_combinator.py` - Enhanced prompts
|
167 |
+
- `src/agents/unique_indices_loop_agent.py` - Enhanced prompts
|
168 |
+
|
169 |
+
### Error Handling Improvements
|
170 |
+
|
171 |
+
**Added:**
|
172 |
+
- Graceful degradation for partial failures
|
173 |
+
- Better error classification and handling
|
174 |
+
- Detailed error logging and reporting
|
175 |
+
- Cost tracking during failures
|
176 |
+
|
177 |
+
**Error Types Handled:**
|
178 |
+
- 503 Service Unavailable (retryable)
|
179 |
+
- 500 Internal Server Error (retryable)
|
180 |
+
- Connection timeouts (retryable)
|
181 |
+
- Network errors (retryable)
|
182 |
+
- 400 Bad Request (non-retryable)
|
183 |
+
- 401 Unauthorized (non-retryable)
|
184 |
+
|
185 |
+
### Testing Infrastructure
|
186 |
+
|
187 |
+
**Added:**
|
188 |
+
- `test_cost_tracking.py` - Validates cost tracking functionality
|
189 |
+
- `test_retry.py` - Tests retry logic with simulated failures
|
190 |
+
- Mock-based testing for external dependencies
|
191 |
+
- Comprehensive test coverage for new features
|
192 |
+
|
193 |
+
### Documentation Updates
|
194 |
+
|
195 |
+
**Added:**
|
196 |
+
- Comprehensive README.md with all new features
|
197 |
+
- Detailed ARCHITECTURE.md with technical implementation
|
198 |
+
- Developer-focused DEVELOPER.md with coding standards
|
199 |
+
- CHANGELOG.md for version tracking
|
200 |
+
|
201 |
+
**Documentation Coverage:**
|
202 |
+
- Installation and setup instructions
|
203 |
+
- Configuration management
|
204 |
+
- API usage and examples
|
205 |
+
- Troubleshooting guides
|
206 |
+
- Development guidelines
|
207 |
+
|
208 |
+
### Performance Optimizations
|
209 |
+
|
210 |
+
**Added:**
|
211 |
+
- Efficient context management
|
212 |
+
- Optimized LLM prompt design
|
213 |
+
- Better memory usage patterns
|
214 |
+
- Improved error recovery
|
215 |
+
|
216 |
+
**Monitoring:**
|
217 |
+
- Real-time cost tracking
|
218 |
+
- Performance metrics
|
219 |
+
- Detailed logging
|
220 |
+
- Debug information
|
221 |
+
|
222 |
+
---
|
223 |
+
|
224 |
+
## Migration Guide
|
225 |
+
|
226 |
+
### From Version 0.9.0 to 1.0.0
|
227 |
+
|
228 |
+
1. **Update Environment Variables:**
|
229 |
+
```bash
|
230 |
+
# Add new retry configuration
|
231 |
+
LLM_MAX_RETRIES=5
|
232 |
+
LLM_BASE_DELAY=1.0
|
233 |
+
LLM_MAX_DELAY=60.0
|
234 |
+
```
|
235 |
+
|
236 |
+
2. **Update Dependencies:**
|
237 |
+
```bash
|
238 |
+
pip install -r requirements.txt
|
239 |
+
```
|
240 |
+
|
241 |
+
3. **New Features:**
|
242 |
+
- Cost tracking is now enabled by default
|
243 |
+
- Retry logic handles transient failures automatically
|
244 |
+
- Unique indices strategy available in UI
|
245 |
+
- Enhanced field descriptions with tables
|
246 |
+
|
247 |
+
### Breaking Changes
|
248 |
+
|
249 |
+
- None in this release - all changes are backward compatible
|
250 |
+
|
251 |
+
### Deprecations
|
252 |
+
|
253 |
+
- None in this release
|
254 |
+
|
255 |
+
---
|
256 |
+
|
257 |
+
## Future Roadmap
|
258 |
+
|
259 |
+
### Planned Features (Next Release)
|
260 |
+
- Batch processing for multiple documents
|
261 |
+
- Custom model support for domain-specific extraction
|
262 |
+
- Advanced caching with Redis
|
263 |
+
- REST API endpoints for integration
|
264 |
+
- Real-time streaming document processing
|
265 |
+
|
266 |
+
### Performance Improvements
|
267 |
+
- Vector search enhancements
|
268 |
+
- Model optimization for faster processing
|
269 |
+
- Parallel processing capabilities
|
270 |
+
- Memory optimization improvements
|
271 |
+
|
272 |
+
### Scalability Enhancements
|
273 |
+
- Microservices architecture
|
274 |
+
- Queue-based asynchronous processing
|
275 |
+
- Load balancing support
|
276 |
+
- Database integration for persistent storage
|
277 |
+
|
278 |
+
---
|
279 |
+
|
280 |
+
## Contributing
|
281 |
+
|
282 |
+
For information on contributing to this project, please see the [Contributing Guide](CONTRIBUTING.md) and [Developer Documentation](DEVELOPER.md).
|
283 |
+
|
284 |
+
## Support
|
285 |
+
|
286 |
+
For support and questions, please refer to:
|
287 |
+
- [README.md](README.md) - General documentation
|
288 |
+
- [ARCHITECTURE.md](ARCHITECTURE.md) - Technical architecture
|
289 |
+
- [DEVELOPER.md](DEVELOPER.md) - Development guidelines
|
290 |
+
- [Issues](https://github.com/your-repo/issues) - Bug reports and feature requests
|
DEVELOPER.md
CHANGED
@@ -1,291 +1,556 @@
|
|
1 |
-
#
|
2 |
|
3 |
-
##
|
4 |
|
5 |
-
|
|
|
|
|
|
|
|
|
6 |
|
7 |
-
###
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
24 |
-
### Supporting Components
|
25 |
```
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
```
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
|
48 |
-
|
|
|
|
|
49 |
|
50 |
-
|
|
|
|
|
|
|
51 |
|
52 |
-
###
|
53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
|
|
|
55 |
```python
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
"pdf_meta": plan.get("pdf_meta", {}),
|
64 |
-
}
|
65 |
```
|
66 |
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
-
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
```python
|
78 |
-
|
79 |
-
|
80 |
-
self.prompt_template = self._load_prompt("planner")
|
81 |
-
self.llm = LLMClient(settings)
|
82 |
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
```
|
92 |
|
93 |
-
|
94 |
-
```
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
}
|
105 |
-
]
|
106 |
}
|
|
|
|
|
|
|
|
|
107 |
```
|
108 |
|
109 |
-
|
110 |
-
The core document processing is handled by Azure Document Intelligence:
|
111 |
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
endpoint=endpoint,
|
117 |
-
credential=AzureKeyCredential(key)
|
118 |
-
)
|
119 |
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
|
128 |
-
|
129 |
-
text_content = result.content if hasattr(result, "content") else ""
|
130 |
-
tables = self._extract_tables(result) if hasattr(result, "tables") else []
|
131 |
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
```
|
137 |
|
138 |
-
|
139 |
-
The field mapping process is implemented through a dedicated class:
|
140 |
|
|
|
141 |
```python
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
```
|
156 |
|
157 |
-
##
|
|
|
|
|
|
|
|
|
158 |
|
159 |
-
|
|
|
|
|
|
|
|
|
160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
```python
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
**kwargs,
|
180 |
-
)
|
181 |
-
# Extract the text content from the response
|
182 |
-
if hasattr(resp, "output") and isinstance(resp.output, list):
|
183 |
-
for message in resp.output:
|
184 |
-
if hasattr(message, "content") and isinstance(message.content, list):
|
185 |
-
for content in message.content:
|
186 |
-
if hasattr(content, "text"):
|
187 |
-
return content.text
|
188 |
-
return str(resp)
|
189 |
```
|
190 |
|
191 |
-
|
192 |
-
1. **Responses API**: Uses Azure OpenAI's Responses API for structured interactions
|
193 |
-
2. **Tool Support**: Optional tools parameter for function calling
|
194 |
-
3. **Flexible Response Handling**: Multiple fallback methods for response extraction
|
195 |
-
4. **Azure Integration**: Configured for Azure OpenAI endpoints
|
196 |
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
|
203 |
-
|
|
|
|
|
|
|
|
|
204 |
|
205 |
-
|
|
|
|
|
|
|
206 |
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
|
|
|
|
|
|
|
|
|
|
226 |
```
|
227 |
|
228 |
-
2. **
|
229 |
-
```
|
230 |
-
|
231 |
-
value = self.llm.responses(prompt, temperature=0.0)
|
232 |
-
# Process and validate value
|
233 |
-
except Exception as e:
|
234 |
-
self.logger.error(f"Error extracting field value: {str(e)}", exc_info=True)
|
235 |
-
return None
|
236 |
```
|
237 |
|
238 |
-
3. **
|
239 |
-
```
|
240 |
-
|
241 |
-
for step in plan["steps"]:
|
242 |
-
self._execute_step(step, ctx, depth=0)
|
243 |
-
except Exception as e:
|
244 |
-
self.logger.error(f"Error during execution: {str(e)}")
|
245 |
-
self.logger.error(traceback.format_exc())
|
246 |
-
# Don't re-raise, let the UI show the partial results
|
247 |
```
|
248 |
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
4.
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Developer Documentation
|
2 |
|
3 |
+
## Development Setup
|
4 |
|
5 |
+
### Prerequisites
|
6 |
+
- Python 3.9 or higher
|
7 |
+
- Git
|
8 |
+
- Azure OpenAI account
|
9 |
+
- Azure Document Intelligence account
|
10 |
|
11 |
+
### Local Development Environment
|
12 |
+
|
13 |
+
1. **Clone the repository**
|
14 |
+
```bash
|
15 |
+
git clone <repository-url>
|
16 |
+
cd doctorecord
|
17 |
+
```
|
18 |
+
|
19 |
+
2. **Create virtual environment**
|
20 |
+
```bash
|
21 |
+
python -m venv venv
|
22 |
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
23 |
+
```
|
24 |
+
|
25 |
+
3. **Install dependencies**
|
26 |
+
```bash
|
27 |
+
pip install -r requirements.txt
|
28 |
+
```
|
29 |
+
|
30 |
+
4. **Set up environment variables**
|
31 |
+
```bash
|
32 |
+
cp .env.example .env
|
33 |
+
# Edit .env with your Azure credentials
|
34 |
+
```
|
35 |
+
|
36 |
+
5. **Run the application**
|
37 |
+
```bash
|
38 |
+
streamlit run src/app.py
|
39 |
+
```
|
40 |
+
|
41 |
+
## Project Structure
|
42 |
|
|
|
43 |
```
|
44 |
+
doctorecord/
|
45 |
+
├── src/
|
46 |
+
│ ├── agents/ # Agent implementations
|
47 |
+
│ │ ├── base_agent.py # Base agent class
|
48 |
+
│ │ ├── pdf_agent.py # PDF text extraction
|
49 |
+
│ │ ├── table_agent.py # Table processing
|
50 |
+
│ │ ├── field_mapper_agent.py # Field extraction
|
51 |
+
│ │ ├── unique_indices_combinator.py # Unique combinations
|
52 |
+
│ │ └── unique_indices_loop_agent.py # Loop processing
|
53 |
+
│ ├── services/ # Service layer
|
54 |
+
│ │ ├── llm_client.py # Azure OpenAI client
|
55 |
+
│ │ ├── azure_di_service.py # Document Intelligence
|
56 |
+
│ │ ├── cost_tracker.py # Cost tracking
|
57 |
+
│ │ └── embedding_client.py # Semantic search
|
58 |
+
│ ├── orchestrator/ # Orchestration layer
|
59 |
+
│ │ ├── planner.py # Plan generation
|
60 |
+
│ │ └── executor.py # Plan execution
|
61 |
+
│ ├── config/ # Configuration
|
62 |
+
│ │ └── settings.py # Settings management
|
63 |
+
│ └── app.py # Streamlit application
|
64 |
+
├── tests/ # Test files
|
65 |
+
├── logs/ # Log files
|
66 |
+
├── requirements.txt # Python dependencies
|
67 |
+
└── README.md # Project documentation
|
68 |
```
|
69 |
|
70 |
+
## Coding Standards
|
71 |
+
|
72 |
+
### Python Style Guide
|
73 |
+
- Follow PEP 8 style guidelines
|
74 |
+
- Use type hints for function parameters and return values
|
75 |
+
- Maximum line length: 88 characters (Black formatter)
|
76 |
+
- Use descriptive variable and function names
|
77 |
+
|
78 |
+
### Code Organization
|
79 |
+
```python
|
80 |
+
# Standard imports
|
81 |
+
import logging
|
82 |
+
from typing import Dict, Any, Optional, List
|
83 |
|
84 |
+
# Third-party imports
|
85 |
+
import pandas as pd
|
86 |
+
from azure.ai.documentintelligence import DocumentIntelligenceClient
|
87 |
|
88 |
+
# Local imports
|
89 |
+
from .base_agent import BaseAgent
|
90 |
+
from services.llm_client import LLMClient
|
91 |
+
```
|
92 |
|
93 |
+
### Logging Standards
|
94 |
+
```python
|
95 |
+
class MyAgent(BaseAgent):
|
96 |
+
def __init__(self):
|
97 |
+
self.logger = logging.getLogger(__name__)
|
98 |
+
|
99 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
100 |
+
self.logger.info("Starting execution")
|
101 |
+
self.logger.debug(f"Context keys: {list(ctx.keys())}")
|
102 |
+
|
103 |
+
try:
|
104 |
+
# Implementation
|
105 |
+
self.logger.info("Execution completed successfully")
|
106 |
+
return result
|
107 |
+
except Exception as e:
|
108 |
+
self.logger.error(f"Execution failed: {str(e)}", exc_info=True)
|
109 |
+
return None
|
110 |
+
```
|
111 |
|
112 |
+
### Error Handling
|
113 |
```python
|
114 |
+
def safe_execution(self, operation):
|
115 |
+
try:
|
116 |
+
return operation()
|
117 |
+
except Exception as e:
|
118 |
+
self.logger.error(f"Operation failed: {str(e)}", exc_info=True)
|
119 |
+
# Return appropriate fallback or re-raise
|
120 |
+
raise
|
|
|
|
|
121 |
```
|
122 |
|
123 |
+
## Agent Development
|
124 |
+
|
125 |
+
### Creating a New Agent
|
126 |
+
|
127 |
+
1. **Inherit from BaseAgent**
|
128 |
+
```python
|
129 |
+
from .base_agent import BaseAgent
|
130 |
+
|
131 |
+
class MyNewAgent(BaseAgent):
|
132 |
+
def __init__(self):
|
133 |
+
super().__init__()
|
134 |
+
self.logger = logging.getLogger(__name__)
|
135 |
+
```
|
136 |
+
|
137 |
+
2. **Implement the execute method**
|
138 |
+
```python
|
139 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
140 |
+
"""
|
141 |
+
Execute the agent's main functionality.
|
142 |
+
|
143 |
+
Args:
|
144 |
+
ctx: Context dictionary containing input data
|
145 |
+
|
146 |
+
Returns:
|
147 |
+
Result string or None if failed
|
148 |
+
"""
|
149 |
+
self.logger.info("Starting MyNewAgent execution")
|
150 |
+
|
151 |
+
# Store context for use in helper methods
|
152 |
+
self.ctx = ctx
|
153 |
+
|
154 |
+
# Implementation here
|
155 |
+
result = self._process_data(ctx)
|
156 |
+
|
157 |
+
return result
|
158 |
+
```
|
159 |
+
|
160 |
+
3. **Add to executor**
|
161 |
+
```python
|
162 |
+
# In src/orchestrator/executor.py
|
163 |
+
from agents.my_new_agent import MyNewAgent
|
164 |
+
|
165 |
+
class Executor:
|
166 |
+
def __init__(self, settings, cost_tracker=None):
|
167 |
+
self.tools = {
|
168 |
+
# ... existing tools
|
169 |
+
"MyNewAgent": MyNewAgent(),
|
170 |
+
}
|
171 |
+
```
|
172 |
+
|
173 |
+
### Agent Best Practices
|
174 |
+
|
175 |
+
1. **Context Management**
|
176 |
+
```python
|
177 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
178 |
+
# Store context for helper methods
|
179 |
+
self.ctx = ctx
|
180 |
+
|
181 |
+
# Access context data
|
182 |
+
text = ctx.get("text", "")
|
183 |
+
fields = ctx.get("fields", [])
|
184 |
+
```
|
185 |
|
186 |
+
2. **Cost Tracking Integration**
|
187 |
+
```python
|
188 |
+
def _call_llm(self, prompt: str, description: str) -> str:
|
189 |
+
# Get cost tracker from context
|
190 |
+
cost_tracker = self.ctx.get("cost_tracker") if hasattr(self, 'ctx') else None
|
191 |
+
|
192 |
+
result = self.llm.responses(
|
193 |
+
prompt, temperature=0.0,
|
194 |
+
ctx={"cost_tracker": cost_tracker} if cost_tracker else None,
|
195 |
+
description=description
|
196 |
+
)
|
197 |
+
|
198 |
+
return result
|
199 |
+
```
|
200 |
|
201 |
+
3. **Error Handling**
|
202 |
+
```python
|
203 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
204 |
+
try:
|
205 |
+
# Implementation
|
206 |
+
return result
|
207 |
+
except Exception as e:
|
208 |
+
self.logger.error(f"Agent execution failed: {str(e)}", exc_info=True)
|
209 |
+
return None
|
210 |
+
```
|
211 |
+
|
212 |
+
## Service Development
|
213 |
+
|
214 |
+
### LLM Client Usage
|
215 |
```python
|
216 |
+
from services.llm_client import LLMClient
|
217 |
+
from config.settings import settings
|
|
|
|
|
218 |
|
219 |
+
class MyAgent(BaseAgent):
|
220 |
+
def __init__(self):
|
221 |
+
self.llm = LLMClient(settings)
|
222 |
+
|
223 |
+
def _extract_data(self, text: str) -> str:
|
224 |
+
prompt = f"Extract data from: {text}"
|
225 |
+
|
226 |
+
# Get cost tracker from context
|
227 |
+
cost_tracker = self.ctx.get("cost_tracker") if hasattr(self, 'ctx') else None
|
228 |
+
|
229 |
+
result = self.llm.responses(
|
230 |
+
prompt, temperature=0.0,
|
231 |
+
ctx={"cost_tracker": cost_tracker} if cost_tracker else None,
|
232 |
+
description="Data Extraction"
|
233 |
+
)
|
234 |
+
|
235 |
+
return result
|
236 |
```
|
237 |
|
238 |
+
### Cost Tracking Integration
|
239 |
+
```python
|
240 |
+
from services.cost_tracker import CostTracker
|
241 |
+
|
242 |
+
# In executor or main application
|
243 |
+
cost_tracker = CostTracker()
|
244 |
+
|
245 |
+
# Pass to agents via context
|
246 |
+
ctx = {
|
247 |
+
"cost_tracker": cost_tracker,
|
248 |
+
# ... other context data
|
|
|
|
|
249 |
}
|
250 |
+
|
251 |
+
# Track costs
|
252 |
+
costs = cost_tracker.calculate_current_file_costs()
|
253 |
+
print(f"Total cost: ${costs['openai']['total_cost']:.4f}")
|
254 |
```
|
255 |
|
256 |
+
## Testing
|
|
|
257 |
|
258 |
+
### Running Tests
|
259 |
+
```bash
|
260 |
+
# Run all tests
|
261 |
+
python -m pytest tests/
|
|
|
|
|
|
|
262 |
|
263 |
+
# Run specific test file
|
264 |
+
python -m pytest tests/test_cost_tracking.py
|
265 |
+
|
266 |
+
# Run with coverage
|
267 |
+
python -m pytest --cov=src tests/
|
268 |
+
```
|
269 |
+
|
270 |
+
### Writing Tests
|
271 |
+
```python
|
272 |
+
import pytest
|
273 |
+
from unittest.mock import Mock, patch
|
274 |
+
from src.agents.my_agent import MyAgent
|
275 |
+
|
276 |
+
def test_my_agent_execution():
|
277 |
+
"""Test MyAgent execution with mock data."""
|
278 |
+
agent = MyAgent()
|
279 |
+
|
280 |
+
# Mock context
|
281 |
+
ctx = {
|
282 |
+
"text": "Test document content",
|
283 |
+
"fields": ["field1", "field2"],
|
284 |
+
"cost_tracker": Mock()
|
285 |
+
}
|
286 |
+
|
287 |
+
# Mock LLM response
|
288 |
+
with patch.object(agent.llm, 'responses') as mock_llm:
|
289 |
+
mock_llm.return_value = '{"field1": "value1", "field2": "value2"}'
|
290 |
|
291 |
+
result = agent.execute(ctx)
|
|
|
|
|
292 |
|
293 |
+
assert result is not None
|
294 |
+
assert "field1" in result
|
295 |
+
assert "field2" in result
|
296 |
+
```
|
297 |
+
|
298 |
+
### Test Structure
|
299 |
+
```
|
300 |
+
tests/
|
301 |
+
├── test_agents/ # Agent tests
|
302 |
+
│ ├── test_field_mapper_agent.py
|
303 |
+
│ └── test_unique_indices_combinator.py
|
304 |
+
├── test_services/ # Service tests
|
305 |
+
│ ├── test_llm_client.py
|
306 |
+
│ └── test_cost_tracker.py
|
307 |
+
├── test_orchestrator/ # Orchestrator tests
|
308 |
+
│ ├── test_planner.py
|
309 |
+
│ └── test_executor.py
|
310 |
+
└── integration/ # Integration tests
|
311 |
+
└── test_end_to_end.py
|
312 |
```
|
313 |
|
314 |
+
## Configuration Management
|
|
|
315 |
|
316 |
+
### Settings Structure
|
317 |
```python
|
318 |
+
# src/config/settings.py
|
319 |
+
from pydantic_settings import BaseSettings
|
320 |
+
|
321 |
+
class Settings(BaseSettings):
|
322 |
+
# Azure OpenAI
|
323 |
+
AZURE_OPENAI_ENDPOINT: str
|
324 |
+
AZURE_OPENAI_API_KEY: str
|
325 |
+
AZURE_OPENAI_DEPLOYMENT: str
|
326 |
+
AZURE_OPENAI_API_VERSION: str = "2025-03-01-preview"
|
327 |
+
|
328 |
+
# Azure Document Intelligence
|
329 |
+
AZURE_DI_ENDPOINT: str
|
330 |
+
AZURE_DI_KEY: str
|
331 |
+
|
332 |
+
# Retry Configuration
|
333 |
+
LLM_MAX_RETRIES: int = 5
|
334 |
+
LLM_BASE_DELAY: float = 1.0
|
335 |
+
LLM_MAX_DELAY: float = 60.0
|
336 |
+
|
337 |
+
class Config:
|
338 |
+
env_file = ".env"
|
339 |
+
```
|
340 |
|
341 |
+
### Environment Variables
|
342 |
+
```bash
|
343 |
+
# .env file
|
344 |
+
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
|
345 |
+
AZURE_OPENAI_API_KEY=your-api-key
|
346 |
+
AZURE_OPENAI_DEPLOYMENT=your-deployment-name
|
347 |
+
AZURE_DI_ENDPOINT=https://your-resource.cognitiveservices.azure.com/
|
348 |
+
AZURE_DI_KEY=your-di-key
|
349 |
```
|
350 |
|
351 |
+
## Debugging
|
352 |
+
|
353 |
+
### Logging Configuration
|
354 |
+
```python
|
355 |
+
import logging
|
356 |
|
357 |
+
# Configure logging
|
358 |
+
logging.basicConfig(
|
359 |
+
level=logging.INFO,
|
360 |
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
361 |
+
)
|
362 |
|
363 |
+
# Set specific logger levels
|
364 |
+
logging.getLogger('azure').setLevel(logging.WARNING)
|
365 |
+
logging.getLogger('openai').setLevel(logging.WARNING)
|
366 |
+
```
|
367 |
+
|
368 |
+
### Debug Mode
|
369 |
```python
|
370 |
+
# Enable debug logging
|
371 |
+
logging.getLogger().setLevel(logging.DEBUG)
|
372 |
+
|
373 |
+
# In agents
|
374 |
+
self.logger.debug(f"Processing data: {data[:200]}...")
|
375 |
+
```
|
376 |
+
|
377 |
+
### Cost Tracking Debug
|
378 |
+
```python
|
379 |
+
# Check cost tracker state
|
380 |
+
print(f"LLM calls: {len(cost_tracker.llm_calls)}")
|
381 |
+
print(f"Input tokens: {cost_tracker.llm_input_tokens}")
|
382 |
+
print(f"Output tokens: {cost_tracker.llm_output_tokens}")
|
383 |
+
|
384 |
+
# Get detailed costs
|
385 |
+
costs_df = cost_tracker.get_detailed_costs_table()
|
386 |
+
print(costs_df)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
387 |
```
|
388 |
|
389 |
+
## Performance Optimization
|
|
|
|
|
|
|
|
|
390 |
|
391 |
+
### Memory Management
|
392 |
+
```python
|
393 |
+
# Process large documents in chunks
|
394 |
+
def process_large_document(self, text: str, chunk_size: int = 10000):
|
395 |
+
chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
|
396 |
+
|
397 |
+
results = []
|
398 |
+
for chunk in chunks:
|
399 |
+
result = self._process_chunk(chunk)
|
400 |
+
results.append(result)
|
401 |
+
|
402 |
+
return self._combine_results(results)
|
403 |
+
```
|
404 |
|
405 |
+
### Caching
|
406 |
+
```python
|
407 |
+
# Use session state for caching
|
408 |
+
if 'processed_data' not in st.session_state:
|
409 |
+
st.session_state.processed_data = {}
|
410 |
|
411 |
+
# Check cache before processing
|
412 |
+
if key in st.session_state.processed_data:
|
413 |
+
return st.session_state.processed_data[key]
|
414 |
+
```
|
415 |
|
416 |
+
### Batch Processing
|
417 |
+
```python
|
418 |
+
# Process multiple items efficiently
|
419 |
+
def process_batch(self, items: List[str]) -> List[str]:
|
420 |
+
results = []
|
421 |
+
for item in items:
|
422 |
+
try:
|
423 |
+
result = self._process_item(item)
|
424 |
+
results.append(result)
|
425 |
+
except Exception as e:
|
426 |
+
self.logger.error(f"Failed to process item: {str(e)}")
|
427 |
+
results.append(None)
|
428 |
+
|
429 |
+
return results
|
430 |
+
```
|
431 |
+
|
432 |
+
## Deployment
|
433 |
+
|
434 |
+
### Production Setup
|
435 |
+
1. **Environment Configuration**
|
436 |
+
```bash
|
437 |
+
# Set production environment variables
|
438 |
+
export AZURE_OPENAI_ENDPOINT=...
|
439 |
+
export AZURE_OPENAI_API_KEY=...
|
440 |
```
|
441 |
|
442 |
+
2. **Dependencies**
|
443 |
+
```bash
|
444 |
+
pip install -r requirements.txt
|
|
|
|
|
|
|
|
|
|
|
445 |
```
|
446 |
|
447 |
+
3. **Run Application**
|
448 |
+
```bash
|
449 |
+
streamlit run src/app.py --server.port 8501
|
|
|
|
|
|
|
|
|
|
|
|
|
450 |
```
|
451 |
|
452 |
+
### Docker Deployment
|
453 |
+
```dockerfile
|
454 |
+
FROM python:3.9-slim
|
455 |
+
|
456 |
+
WORKDIR /app
|
457 |
+
COPY requirements.txt .
|
458 |
+
RUN pip install -r requirements.txt
|
459 |
+
|
460 |
+
COPY src/ ./src/
|
461 |
+
COPY .env .
|
462 |
+
|
463 |
+
EXPOSE 8501
|
464 |
+
CMD ["streamlit", "run", "src/app.py", "--server.port=8501"]
|
465 |
+
```
|
466 |
+
|
467 |
+
## Contributing
|
468 |
+
|
469 |
+
### Development Workflow
|
470 |
+
1. Create feature branch: `git checkout -b feature/new-feature`
|
471 |
+
2. Make changes following coding standards
|
472 |
+
3. Add tests for new functionality
|
473 |
+
4. Run tests: `python -m pytest tests/`
|
474 |
+
5. Update documentation
|
475 |
+
6. Submit pull request
|
476 |
+
|
477 |
+
### Code Review Checklist
|
478 |
+
- [ ] Code follows style guidelines
|
479 |
+
- [ ] Tests are included and passing
|
480 |
+
- [ ] Documentation is updated
|
481 |
+
- [ ] Error handling is implemented
|
482 |
+
- [ ] Cost tracking is integrated
|
483 |
+
- [ ] Logging is appropriate
|
484 |
+
|
485 |
+
### Release Process
|
486 |
+
1. Update version in `__init__.py`
|
487 |
+
2. Update CHANGELOG.md
|
488 |
+
3. Create release tag
|
489 |
+
4. Deploy to production
|
490 |
+
5. Update documentation
|
491 |
+
|
492 |
+
## Troubleshooting
|
493 |
+
|
494 |
+
### Common Issues
|
495 |
+
|
496 |
+
**Azure OpenAI Connection Errors**
|
497 |
+
```python
|
498 |
+
# Check configuration
|
499 |
+
print(f"Endpoint: {settings.AZURE_OPENAI_ENDPOINT}")
|
500 |
+
print(f"Deployment: {settings.AZURE_OPENAI_DEPLOYMENT}")
|
501 |
+
print(f"API Version: {settings.AZURE_OPENAI_API_VERSION}")
|
502 |
+
```
|
503 |
+
|
504 |
+
**Cost Tracking Issues**
|
505 |
+
```python
|
506 |
+
# Verify cost tracker is passed correctly
|
507 |
+
if 'cost_tracker' not in ctx:
|
508 |
+
self.logger.warning("No cost tracker in context")
|
509 |
+
|
510 |
+
# Check if agents store context
|
511 |
+
if not hasattr(self, 'ctx'):
|
512 |
+
self.logger.warning("Agent doesn't store context")
|
513 |
+
```
|
514 |
+
|
515 |
+
**Memory Issues**
|
516 |
+
```python
|
517 |
+
# Monitor memory usage
|
518 |
+
import psutil
|
519 |
+
process = psutil.Process()
|
520 |
+
print(f"Memory usage: {process.memory_info().rss / 1024 / 1024:.2f} MB")
|
521 |
+
```
|
522 |
+
|
523 |
+
### Debug Tools
|
524 |
+
- **Log Analysis**: Check logs for error patterns
|
525 |
+
- **Cost Monitoring**: Track API usage and costs
|
526 |
+
- **Performance Profiling**: Monitor execution times
|
527 |
+
- **Memory Profiling**: Track memory usage
|
528 |
+
|
529 |
+
## API Reference
|
530 |
+
|
531 |
+
### Agent Base Class
|
532 |
+
```python
|
533 |
+
class BaseAgent:
|
534 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
535 |
+
"""Execute the agent's main functionality."""
|
536 |
+
raise NotImplementedError
|
537 |
+
```
|
538 |
+
|
539 |
+
### LLM Client
|
540 |
+
```python
|
541 |
+
class LLMClient:
|
542 |
+
def responses(self, prompt: str, **kwargs) -> str:
|
543 |
+
"""Send prompt to Azure OpenAI and return response."""
|
544 |
+
```
|
545 |
+
|
546 |
+
### Cost Tracker
|
547 |
+
```python
|
548 |
+
class CostTracker:
|
549 |
+
def add_llm_tokens(self, input_tokens: int, output_tokens: int, description: str):
|
550 |
+
"""Track LLM token usage and costs."""
|
551 |
+
|
552 |
+
def calculate_current_file_costs(self) -> Dict[str, Any]:
|
553 |
+
"""Calculate costs for current file processing."""
|
554 |
+
```
|
555 |
+
|
556 |
+
For more detailed information, refer to the inline documentation in the source code.
|
README.md
CHANGED
@@ -20,7 +20,257 @@ forums](https://discuss.streamlit.io).
|
|
20 |
|
21 |
# Deep-Research PDF Field Extractor
|
22 |
|
23 |
-
A
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
## Overview
|
26 |
The PDF Field Extractor helps you extract specific information from PDF documents. It can extract any fields you specify, such as dates, names, values, locations, and more. The tool is particularly useful for converting unstructured PDF data into structured, analyzable formats.
|
|
|
20 |
|
21 |
# Deep-Research PDF Field Extractor
|
22 |
|
23 |
+
A multi-agent system for extracting structured data from biotech-related PDFs using Azure Document Intelligence and Azure OpenAI.
|
24 |
+
|
25 |
+
## Features
|
26 |
+
|
27 |
+
- **Multi-Agent Architecture**: Uses specialized agents for different extraction tasks
|
28 |
+
- **Azure Integration**: Leverages Azure Document Intelligence and Azure OpenAI
|
29 |
+
- **Flexible Extraction Strategies**: Supports both original and unique indices strategies
|
30 |
+
- **Robust Error Handling**: Implements retry logic with exponential backoff
|
31 |
+
- **Comprehensive Cost Tracking**: Monitors API usage and costs for all LLM calls
|
32 |
+
- **Streamlit UI**: User-friendly interface for document processing
|
33 |
+
- **Graceful Degradation**: Continues processing even with partial failures
|
34 |
+
|
35 |
+
## Installation
|
36 |
+
|
37 |
+
1. Clone the repository
|
38 |
+
2. Install dependencies: `pip install -r requirements.txt`
|
39 |
+
3. Set up environment variables (see Configuration section)
|
40 |
+
4. Run the application: `streamlit run src/app.py`
|
41 |
+
|
42 |
+
## Configuration
|
43 |
+
|
44 |
+
### Environment Variables
|
45 |
+
|
46 |
+
Create a `.env` file with the following variables:
|
47 |
+
|
48 |
+
```env
|
49 |
+
# Azure OpenAI
|
50 |
+
AZURE_OPENAI_ENDPOINT=your_endpoint
|
51 |
+
AZURE_OPENAI_API_KEY=your_api_key
|
52 |
+
AZURE_OPENAI_DEPLOYMENT=your_deployment_name
|
53 |
+
AZURE_OPENAI_API_VERSION=2025-03-01-preview
|
54 |
+
|
55 |
+
# Azure Document Intelligence
|
56 |
+
AZURE_DI_ENDPOINT=your_di_endpoint
|
57 |
+
AZURE_DI_KEY=your_di_key
|
58 |
+
|
59 |
+
# Retry Configuration (Optional)
|
60 |
+
LLM_MAX_RETRIES=5
|
61 |
+
LLM_BASE_DELAY=1.0
|
62 |
+
LLM_MAX_DELAY=60.0
|
63 |
+
```
|
64 |
+
|
65 |
+
### Retry Configuration
|
66 |
+
|
67 |
+
The system implements robust retry logic to handle transient service errors:
|
68 |
+
|
69 |
+
- **LLM_MAX_RETRIES**: Maximum number of retry attempts (default: 5)
|
70 |
+
- **LLM_BASE_DELAY**: Base delay in seconds for exponential backoff (default: 1.0)
|
71 |
+
- **LLM_MAX_DELAY**: Maximum delay in seconds (default: 60.0)
|
72 |
+
|
73 |
+
The retry logic automatically handles:
|
74 |
+
- 503 Service Unavailable errors
|
75 |
+
- 500 Internal Server Error
|
76 |
+
- Connection timeouts
|
77 |
+
- Network errors
|
78 |
+
|
79 |
+
Retries use exponential backoff with jitter to prevent thundering herd problems.
|
80 |
+
|
81 |
+
## Usage
|
82 |
+
|
83 |
+
### Original Strategy
|
84 |
+
Processes documents page by page, extracting fields individually using semantic search and LLM-based extraction.
|
85 |
+
|
86 |
+
**Workflow:**
|
87 |
+
```
|
88 |
+
PDFAgent → TableAgent → ForEachField → FieldMapperAgent
|
89 |
+
```
|
90 |
+
|
91 |
+
### Unique Indices Strategy
|
92 |
+
Extracts data based on unique combinations of specified indices, then loops through each combination to extract additional fields.
|
93 |
+
|
94 |
+
**Workflow:**
|
95 |
+
```
|
96 |
+
PDFAgent → TableAgent → UniqueIndicesCombinator → UniqueIndicesLoopAgent
|
97 |
+
```
|
98 |
+
|
99 |
+
**Step-by-step process:**
|
100 |
+
1. **PDFAgent**: Extracts text from PDF files
|
101 |
+
2. **TableAgent**: Processes tables using Azure Document Intelligence
|
102 |
+
3. **UniqueIndicesCombinator**: Extracts unique combinations of specified indices (e.g., Protein Lot, Peptide, Timepoint, Modification)
|
103 |
+
4. **UniqueIndicesLoopAgent**: Loops through each combination to extract additional fields (e.g., Chain, Percentage, Seq Loc)
|
104 |
+
|
105 |
+
**Example Output:**
|
106 |
+
```json
|
107 |
+
[
|
108 |
+
{
|
109 |
+
"Protein Lot": "P066_L14_H31_0-hulgG-LALAPG-FJB",
|
110 |
+
"Peptide": "PLTFGAGTK",
|
111 |
+
"Timepoint": "0w",
|
112 |
+
"Modification": "Clipping",
|
113 |
+
"Chain": "Heavy",
|
114 |
+
"Percentage": "90.0",
|
115 |
+
"Seq Loc": "HC(1-31)"
|
116 |
+
},
|
117 |
+
{
|
118 |
+
"Protein Lot": "P066_L14_H31_0-hulgG-LALAPG-FJB",
|
119 |
+
"Peptide": "PLTFGAGTK",
|
120 |
+
"Timepoint": "4w",
|
121 |
+
"Modification": "Clipping",
|
122 |
+
"Chain": "Heavy",
|
123 |
+
"Percentage": "85.0",
|
124 |
+
"Seq Loc": "HC(1-31)"
|
125 |
+
}
|
126 |
+
]
|
127 |
+
```
|
128 |
+
|
129 |
+
## Architecture
|
130 |
+
|
131 |
+
### Agents
|
132 |
+
|
133 |
+
- **PDFAgent**: Extracts text from PDF files using PyMuPDF
|
134 |
+
- **TableAgent**: Processes tables using Azure Document Intelligence with layout analysis
|
135 |
+
- **UniqueIndicesCombinator**: Extracts unique combinations of specified indices from documents
|
136 |
+
- **UniqueIndicesLoopAgent**: Loops through combinations to extract additional field values
|
137 |
+
- **FieldMapperAgent**: Maps individual fields to values using LLM-based extraction
|
138 |
+
- **IndexAgent**: Creates semantic search indices for improved field extraction
|
139 |
+
|
140 |
+
### Services
|
141 |
+
|
142 |
+
- **LLMClient**: Azure OpenAI wrapper with retry logic and cost tracking
|
143 |
+
- **AzureDIService**: Azure Document Intelligence integration with table processing
|
144 |
+
- **CostTracker**: Comprehensive API usage and cost monitoring
|
145 |
+
- **EmbeddingClient**: Semantic search capabilities
|
146 |
+
|
147 |
+
### Data Flow
|
148 |
+
|
149 |
+
1. **Document Processing**: PDF text and table extraction
|
150 |
+
2. **Strategy Selection**: Choose between original or unique indices approach
|
151 |
+
3. **Field Extraction**: LLM-based extraction with detailed field descriptions
|
152 |
+
4. **Cost Tracking**: Monitor all API usage and calculate costs
|
153 |
+
5. **Result Processing**: Convert to structured format (DataFrame/CSV)
|
154 |
+
|
155 |
+
## Cost Tracking
|
156 |
+
|
157 |
+
The system provides comprehensive cost tracking for all operations:
|
158 |
+
|
159 |
+
### LLM Costs
|
160 |
+
- **Input Tokens**: Tracked for each LLM call with descriptions
|
161 |
+
- **Output Tokens**: Tracked for each LLM call with descriptions
|
162 |
+
- **Cost Calculation**: Based on Azure OpenAI pricing
|
163 |
+
- **Detailed Breakdown**: Individual call costs in the UI
|
164 |
+
|
165 |
+
### Document Intelligence Costs
|
166 |
+
- **Pages Processed**: Tracked per operation
|
167 |
+
- **Operation Types**: Layout analysis, custom models, etc.
|
168 |
+
- **Cost Calculation**: Based on Azure DI pricing
|
169 |
+
|
170 |
+
### Cost Display
|
171 |
+
- **Real-time Updates**: Costs shown during execution
|
172 |
+
- **Detailed Table**: Breakdown of all LLM calls
|
173 |
+
- **Total Summary**: Combined costs for the entire operation
|
174 |
+
|
175 |
+
## Error Handling
|
176 |
+
|
177 |
+
The system implements comprehensive error handling:
|
178 |
+
|
179 |
+
1. **Retry Logic**: Automatic retries for transient errors with exponential backoff
|
180 |
+
2. **Graceful Degradation**: Continues processing even if some combinations fail
|
181 |
+
3. **Partial Results**: Returns data for successful extractions with null values for failures
|
182 |
+
4. **Detailed Logging**: Comprehensive logging for debugging and monitoring
|
183 |
+
5. **Cost Tracking**: Monitors API usage even during failures
|
184 |
+
|
185 |
+
### Error Types Handled
|
186 |
+
- ✅ **503 Service Unavailable** (Azure service overload)
|
187 |
+
- ✅ **500 Internal Server Error** (Server-side issues)
|
188 |
+
- ✅ **Connection timeouts** (Network issues)
|
189 |
+
- ✅ **Network errors** (Infrastructure problems)
|
190 |
+
- ❌ **400 Bad Request** (Client errors - not retried)
|
191 |
+
- ❌ **401 Unauthorized** (Authentication errors - not retried)
|
192 |
+
|
193 |
+
## Field Descriptions
|
194 |
+
|
195 |
+
The system supports detailed field descriptions to improve extraction accuracy:
|
196 |
+
|
197 |
+
### Field Description Format
|
198 |
+
```json
|
199 |
+
{
|
200 |
+
"field_name": {
|
201 |
+
"description": "Detailed description of the field",
|
202 |
+
"format": "Expected format (String, Float, etc.)",
|
203 |
+
"examples": "Example values",
|
204 |
+
"possible_values": "Comma-separated list of possible values"
|
205 |
+
}
|
206 |
+
}
|
207 |
+
```
|
208 |
+
|
209 |
+
### UI Support
|
210 |
+
- **Editable Tables**: Add, edit, and remove field descriptions
|
211 |
+
- **Session State**: Persists descriptions during the session
|
212 |
+
- **Validation**: Ensures proper format and structure
|
213 |
+
|
214 |
+
## Testing
|
215 |
+
|
216 |
+
The system includes comprehensive test suites:
|
217 |
+
|
218 |
+
### Test Scripts
|
219 |
+
- **test_retry.py**: Verifies retry logic with simulated failures
|
220 |
+
- **test_cost_tracking.py**: Validates cost tracking functionality
|
221 |
+
|
222 |
+
### Running Tests
|
223 |
+
```bash
|
224 |
+
python test_retry.py
|
225 |
+
python test_cost_tracking.py
|
226 |
+
```
|
227 |
+
|
228 |
+
## Performance
|
229 |
+
|
230 |
+
### Optimization Features
|
231 |
+
- **Retry Logic**: Handles transient failures automatically
|
232 |
+
- **Cost Optimization**: Detailed tracking to monitor usage
|
233 |
+
- **Graceful Degradation**: Continues with partial results
|
234 |
+
- **Caching**: Session state for field descriptions
|
235 |
+
|
236 |
+
### Expected Performance
|
237 |
+
- **Small Documents**: 30-60 seconds
|
238 |
+
- **Large Documents**: 2-5 minutes
|
239 |
+
- **Cost Efficiency**: ~$0.01-0.10 per document (depending on size)
|
240 |
+
|
241 |
+
## Contributing
|
242 |
+
|
243 |
+
1. Fork the repository
|
244 |
+
2. Create a feature branch
|
245 |
+
3. Make your changes
|
246 |
+
4. Add tests if applicable
|
247 |
+
5. Submit a pull request
|
248 |
+
|
249 |
+
## Troubleshooting
|
250 |
+
|
251 |
+
### Common Issues
|
252 |
+
|
253 |
+
**503 Service Unavailable Errors**
|
254 |
+
- The system automatically retries with exponential backoff
|
255 |
+
- Check Azure service status if persistent
|
256 |
+
- Adjust retry configuration if needed
|
257 |
+
|
258 |
+
**Cost Tracking Shows Zero**
|
259 |
+
- Ensure cost tracker is properly initialized
|
260 |
+
- Check that agents are passing context correctly
|
261 |
+
- Verify LLM calls are being made
|
262 |
+
|
263 |
+
**Partial Results**
|
264 |
+
- Some combinations may fail due to document structure
|
265 |
+
- Check execution logs for specific failures
|
266 |
+
- Results include null values for failed extractions
|
267 |
+
|
268 |
+
### Debug Mode
|
269 |
+
Enable detailed logging by setting log level to DEBUG in the application.
|
270 |
+
|
271 |
+
## License
|
272 |
+
|
273 |
+
[Add your license information here]
|
274 |
|
275 |
## Overview
|
276 |
The PDF Field Extractor helps you extract specific information from PDF documents. It can extract any fields you specify, such as dates, names, values, locations, and more. The tool is particularly useful for converting unstructured PDF data into structured, analyzable formats.
|
logs/di_content/di_content_20250617_120600_tables.html
ADDED
@@ -0,0 +1,1441 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Azure DI Tables</title>
|
5 |
+
<style>
|
6 |
+
body { font-family: Arial, sans-serif; margin: 20px; }
|
7 |
+
.table-container { margin-bottom: 40px; }
|
8 |
+
h2 { color: #333; }
|
9 |
+
table { border-collapse: collapse; width: 100%; margin-bottom: 10px; }
|
10 |
+
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
11 |
+
th { background-color: #f5f5f5; }
|
12 |
+
hr { border: none; border-top: 2px solid #ccc; margin: 20px 0; }
|
13 |
+
</style>
|
14 |
+
</head>
|
15 |
+
<body>
|
16 |
+
<h1>Azure Document Intelligence Tables</h1>
|
17 |
+
|
18 |
+
<div class="table-container">
|
19 |
+
<h2>Table 1</h2>
|
20 |
+
<table border="1">
|
21 |
+
<tr>
|
22 |
+
<td>l Sales quote:</td>
|
23 |
+
<td>SQ20202722</td>
|
24 |
+
</tr>
|
25 |
+
<tr>
|
26 |
+
<td>l Project code:</td>
|
27 |
+
<td>P3016</td>
|
28 |
+
</tr>
|
29 |
+
<tr>
|
30 |
+
<td>l LNB number:</td>
|
31 |
+
<td>2023.050</td>
|
32 |
+
</tr>
|
33 |
+
<tr>
|
34 |
+
<td>l Project responsible:</td>
|
35 |
+
<td>Nathan Cardon</td>
|
36 |
+
</tr>
|
37 |
+
<tr>
|
38 |
+
<td>l Report name:</td>
|
39 |
+
<td>P3016_R11_v00</td>
|
40 |
+
</tr>
|
41 |
+
</table>
|
42 |
+
<hr>
|
43 |
+
</div>
|
44 |
+
|
45 |
+
<div class="table-container">
|
46 |
+
<h2>Table 2</h2>
|
47 |
+
<table border="1">
|
48 |
+
<tr>
|
49 |
+
<td>Test sample ID client</td>
|
50 |
+
<td>Test sample ID RIC</td>
|
51 |
+
<td>Protein concentration (mg/ML)</td>
|
52 |
+
</tr>
|
53 |
+
<tr>
|
54 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
55 |
+
<td>aFH0.7_T0</td>
|
56 |
+
<td>1.0</td>
|
57 |
+
</tr>
|
58 |
+
<tr>
|
59 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
60 |
+
<td>aFH.07_T4W</td>
|
61 |
+
<td>1.0</td>
|
62 |
+
</tr>
|
63 |
+
<tr>
|
64 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
65 |
+
<td>FHR-1.3B4_T0</td>
|
66 |
+
<td>1.0</td>
|
67 |
+
</tr>
|
68 |
+
<tr>
|
69 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
70 |
+
<td>FHR-1.3B4_T4W</td>
|
71 |
+
<td>1.0</td>
|
72 |
+
</tr>
|
73 |
+
<tr>
|
74 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
75 |
+
<td>L5_H12_T0</td>
|
76 |
+
<td>1.0</td>
|
77 |
+
</tr>
|
78 |
+
<tr>
|
79 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
80 |
+
<td>L5_H12_T4W</td>
|
81 |
+
<td>1.0</td>
|
82 |
+
</tr>
|
83 |
+
<tr>
|
84 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
85 |
+
<td>L5_H31_T0</td>
|
86 |
+
<td>1.0</td>
|
87 |
+
</tr>
|
88 |
+
<tr>
|
89 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
90 |
+
<td>L5_H31_T4W</td>
|
91 |
+
<td>1.0</td>
|
92 |
+
</tr>
|
93 |
+
<tr>
|
94 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
95 |
+
<td>L14_H12_T0</td>
|
96 |
+
<td>1.0</td>
|
97 |
+
</tr>
|
98 |
+
<tr>
|
99 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
100 |
+
<td>L14_H12_T4W</td>
|
101 |
+
<td>1.0</td>
|
102 |
+
</tr>
|
103 |
+
<tr>
|
104 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
105 |
+
<td>L14_H31_T0</td>
|
106 |
+
<td>1.0</td>
|
107 |
+
</tr>
|
108 |
+
<tr>
|
109 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
110 |
+
<td>L14-H31_T4W</td>
|
111 |
+
<td>1.0</td>
|
112 |
+
</tr>
|
113 |
+
</table>
|
114 |
+
<hr>
|
115 |
+
</div>
|
116 |
+
|
117 |
+
<div class="table-container">
|
118 |
+
<h2>Table 3</h2>
|
119 |
+
<table border="1">
|
120 |
+
<tr>
|
121 |
+
<td></td>
|
122 |
+
<td>aFH.07_T0</td>
|
123 |
+
<td>aFH.07_T4W</td>
|
124 |
+
</tr>
|
125 |
+
<tr>
|
126 |
+
<td>G0-GlcNAc</td>
|
127 |
+
<td>5.0%</td>
|
128 |
+
<td>4.5%</td>
|
129 |
+
</tr>
|
130 |
+
<tr>
|
131 |
+
<td>Man5</td>
|
132 |
+
<td>56.1%</td>
|
133 |
+
<td>56.3%</td>
|
134 |
+
</tr>
|
135 |
+
<tr>
|
136 |
+
<td>Man6</td>
|
137 |
+
<td>17.6%</td>
|
138 |
+
<td>17.4%</td>
|
139 |
+
</tr>
|
140 |
+
<tr>
|
141 |
+
<td>Man7</td>
|
142 |
+
<td>20.7%</td>
|
143 |
+
<td>21.6%</td>
|
144 |
+
</tr>
|
145 |
+
<tr>
|
146 |
+
<td>Man8</td>
|
147 |
+
<td>0.6%</td>
|
148 |
+
<td>0.2%</td>
|
149 |
+
</tr>
|
150 |
+
</table>
|
151 |
+
<hr>
|
152 |
+
</div>
|
153 |
+
|
154 |
+
<div class="table-container">
|
155 |
+
<h2>Table 4</h2>
|
156 |
+
<table border="1">
|
157 |
+
<tr>
|
158 |
+
<td></td>
|
159 |
+
<td>aFH.07_T0</td>
|
160 |
+
<td>aFH.07_T4W</td>
|
161 |
+
</tr>
|
162 |
+
<tr>
|
163 |
+
<td>Unknown peak</td>
|
164 |
+
<td>0.6%</td>
|
165 |
+
<td>1.3%</td>
|
166 |
+
</tr>
|
167 |
+
<tr>
|
168 |
+
<td>HC [G0F/G0] - 2*GlcNAc</td>
|
169 |
+
<td>1.5%</td>
|
170 |
+
<td>2.0%</td>
|
171 |
+
</tr>
|
172 |
+
<tr>
|
173 |
+
<td>HC [Man5-Man5]</td>
|
174 |
+
<td>16.7%</td>
|
175 |
+
<td>16.5%</td>
|
176 |
+
</tr>
|
177 |
+
<tr>
|
178 |
+
<td>HC [G0F-Man5]</td>
|
179 |
+
<td>10.9%</td>
|
180 |
+
<td>11.9%</td>
|
181 |
+
</tr>
|
182 |
+
<tr>
|
183 |
+
<td>HC [G0F/G0] - GlcNAc</td>
|
184 |
+
<td>16.5%</td>
|
185 |
+
<td>17.2%</td>
|
186 |
+
</tr>
|
187 |
+
<tr>
|
188 |
+
<td>HC [G0F/G0]</td>
|
189 |
+
<td>6.5%</td>
|
190 |
+
<td>6.0%</td>
|
191 |
+
</tr>
|
192 |
+
<tr>
|
193 |
+
<td>HC [G0F/G0F]</td>
|
194 |
+
<td>35.5%</td>
|
195 |
+
<td>33.8%</td>
|
196 |
+
</tr>
|
197 |
+
<tr>
|
198 |
+
<td>HC [G0F/G1F]</td>
|
199 |
+
<td>6.5%</td>
|
200 |
+
<td>5.9%</td>
|
201 |
+
</tr>
|
202 |
+
<tr>
|
203 |
+
<td>HC [G1F/G1F] or HC [G0F/G2F]</td>
|
204 |
+
<td>5.0%</td>
|
205 |
+
<td>4.8%</td>
|
206 |
+
</tr>
|
207 |
+
<tr>
|
208 |
+
<td>HC [G1F/G2F]</td>
|
209 |
+
<td>0.3%</td>
|
210 |
+
<td>0.6%</td>
|
211 |
+
</tr>
|
212 |
+
</table>
|
213 |
+
<hr>
|
214 |
+
</div>
|
215 |
+
|
216 |
+
<div class="table-container">
|
217 |
+
<h2>Table 5</h2>
|
218 |
+
<table border="1">
|
219 |
+
<tr>
|
220 |
+
<td>Sequence</td>
|
221 |
+
<td>Sequence location</td>
|
222 |
+
<td>Modification</td>
|
223 |
+
<td>Relative abundance</td>
|
224 |
+
<td>Relative abundance</td>
|
225 |
+
</tr>
|
226 |
+
<tr>
|
227 |
+
<td>Sequence</td>
|
228 |
+
<td>Sequence location</td>
|
229 |
+
<td>Modification</td>
|
230 |
+
<td>aFH.07_T0</td>
|
231 |
+
<td>aFH.07_T4W</td>
|
232 |
+
</tr>
|
233 |
+
<tr>
|
234 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
235 |
+
<td>LC (001-018)</td>
|
236 |
+
<td>pyroQ</td>
|
237 |
+
<td>86.8%</td>
|
238 |
+
<td>99.7%</td>
|
239 |
+
</tr>
|
240 |
+
<tr>
|
241 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
242 |
+
<td>LC (001-018)</td>
|
243 |
+
<td></td>
|
244 |
+
<td>13.2%</td>
|
245 |
+
<td>0.3%</td>
|
246 |
+
</tr>
|
247 |
+
<tr>
|
248 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
249 |
+
<td>HC (001-031)</td>
|
250 |
+
<td>pyroQ</td>
|
251 |
+
<td>90.0%</td>
|
252 |
+
<td>100.0%</td>
|
253 |
+
</tr>
|
254 |
+
<tr>
|
255 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
256 |
+
<td>HC (001-031)</td>
|
257 |
+
<td></td>
|
258 |
+
<td>10.0%</td>
|
259 |
+
<td>n.d</td>
|
260 |
+
</tr>
|
261 |
+
</table>
|
262 |
+
<hr>
|
263 |
+
</div>
|
264 |
+
|
265 |
+
<div class="table-container">
|
266 |
+
<h2>Table 6</h2>
|
267 |
+
<table border="1">
|
268 |
+
<tr>
|
269 |
+
<td>Sequence</td>
|
270 |
+
<td>Sequence location</td>
|
271 |
+
<td>Modification</td>
|
272 |
+
<td>Relative abundance</td>
|
273 |
+
<td>Relative abundance</td>
|
274 |
+
</tr>
|
275 |
+
<tr>
|
276 |
+
<td>Sequence</td>
|
277 |
+
<td>Sequence location</td>
|
278 |
+
<td>Modification</td>
|
279 |
+
<td>aFH.07_T0</td>
|
280 |
+
<td>aFH.07_T4W</td>
|
281 |
+
</tr>
|
282 |
+
<tr>
|
283 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
284 |
+
<td>LC (31-60)</td>
|
285 |
+
<td>Oxidation [+16 Da]</td>
|
286 |
+
<td>0.9%</td>
|
287 |
+
<td>1.0%</td>
|
288 |
+
</tr>
|
289 |
+
<tr>
|
290 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
291 |
+
<td>LC (31-60)</td>
|
292 |
+
<td></td>
|
293 |
+
<td>99.1%</td>
|
294 |
+
<td>99.0%</td>
|
295 |
+
</tr>
|
296 |
+
</table>
|
297 |
+
<hr>
|
298 |
+
</div>
|
299 |
+
|
300 |
+
<div class="table-container">
|
301 |
+
<h2>Table 7</h2>
|
302 |
+
<table border="1">
|
303 |
+
<tr>
|
304 |
+
<td>Sequence</td>
|
305 |
+
<td>Sequence location</td>
|
306 |
+
<td>Modification</td>
|
307 |
+
<td>Relative abundance</td>
|
308 |
+
<td>Relative abundance</td>
|
309 |
+
</tr>
|
310 |
+
<tr>
|
311 |
+
<td>Sequence</td>
|
312 |
+
<td>Sequence location</td>
|
313 |
+
<td>Modification</td>
|
314 |
+
<td>aFH.07_T0</td>
|
315 |
+
<td>aFH.07_T4W</td>
|
316 |
+
</tr>
|
317 |
+
<tr>
|
318 |
+
<td>LNINKDNSK</td>
|
319 |
+
<td>HC (72-75)</td>
|
320 |
+
<td></td>
|
321 |
+
<td>99.5%</td>
|
322 |
+
<td>98.9%</td>
|
323 |
+
</tr>
|
324 |
+
<tr>
|
325 |
+
<td>LNINKDNSK</td>
|
326 |
+
<td>HC (72-75)</td>
|
327 |
+
<td>Deamidation</td>
|
328 |
+
<td>0.5%</td>
|
329 |
+
<td>1.1%</td>
|
330 |
+
</tr>
|
331 |
+
</table>
|
332 |
+
<hr>
|
333 |
+
</div>
|
334 |
+
|
335 |
+
<div class="table-container">
|
336 |
+
<h2>Table 8</h2>
|
337 |
+
<table border="1">
|
338 |
+
<tr>
|
339 |
+
<td>Sequence</td>
|
340 |
+
<td>Sequence location</td>
|
341 |
+
<td>Modification</td>
|
342 |
+
<td>Relative abundance</td>
|
343 |
+
<td>Relative abundance</td>
|
344 |
+
</tr>
|
345 |
+
<tr>
|
346 |
+
<td>Sequence</td>
|
347 |
+
<td>Sequence location</td>
|
348 |
+
<td>Modification</td>
|
349 |
+
<td>aFH.07_T0</td>
|
350 |
+
<td>aFH.07_T4W</td>
|
351 |
+
</tr>
|
352 |
+
<tr>
|
353 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
354 |
+
<td>LC (77-102)</td>
|
355 |
+
<td>GO-GICNAc</td>
|
356 |
+
<td>2.6%</td>
|
357 |
+
<td>4.0%</td>
|
358 |
+
</tr>
|
359 |
+
<tr>
|
360 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
361 |
+
<td>LC (77-102)</td>
|
362 |
+
<td>Man5</td>
|
363 |
+
<td>54.9%</td>
|
364 |
+
<td>57.3%</td>
|
365 |
+
</tr>
|
366 |
+
<tr>
|
367 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
368 |
+
<td>LC (77-102)</td>
|
369 |
+
<td>Man6</td>
|
370 |
+
<td>21.1%</td>
|
371 |
+
<td>18.8%</td>
|
372 |
+
</tr>
|
373 |
+
<tr>
|
374 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
375 |
+
<td>LC (77-102)</td>
|
376 |
+
<td>Man7</td>
|
377 |
+
<td>21.4%</td>
|
378 |
+
<td>20.0%</td>
|
379 |
+
</tr>
|
380 |
+
</table>
|
381 |
+
<hr>
|
382 |
+
</div>
|
383 |
+
|
384 |
+
<div class="table-container">
|
385 |
+
<h2>Table 9</h2>
|
386 |
+
<table border="1">
|
387 |
+
<tr>
|
388 |
+
<td>Sequence</td>
|
389 |
+
<td>Sequence location</td>
|
390 |
+
<td>Modification</td>
|
391 |
+
<td>Relative abundance</td>
|
392 |
+
<td>Relative abundance</td>
|
393 |
+
</tr>
|
394 |
+
<tr>
|
395 |
+
<td>Sequence</td>
|
396 |
+
<td>Sequence location</td>
|
397 |
+
<td>Modification</td>
|
398 |
+
<td>aFH.07_T0</td>
|
399 |
+
<td>aFH.07_T4W</td>
|
400 |
+
</tr>
|
401 |
+
<tr>
|
402 |
+
<td>MNSLQANDTAIYYCAR</td>
|
403 |
+
<td>HC (82-97)</td>
|
404 |
+
<td>Non glycosylated</td>
|
405 |
+
<td>n.d</td>
|
406 |
+
<td>n.d</td>
|
407 |
+
</tr>
|
408 |
+
<tr>
|
409 |
+
<td>MNSLQANDTAIYYCAR</td>
|
410 |
+
<td>HC (82-97)</td>
|
411 |
+
<td>G0F-GlcNAc</td>
|
412 |
+
<td>16.3%</td>
|
413 |
+
<td>20.8%</td>
|
414 |
+
</tr>
|
415 |
+
<tr>
|
416 |
+
<td>MNSLQANDTAIYYCAR</td>
|
417 |
+
<td>HC (82-97)</td>
|
418 |
+
<td>G0</td>
|
419 |
+
<td>4.2%</td>
|
420 |
+
<td>3.7%</td>
|
421 |
+
</tr>
|
422 |
+
<tr>
|
423 |
+
<td>MNSLQANDTAIYYCAR</td>
|
424 |
+
<td>HC (82-97)</td>
|
425 |
+
<td>G0F</td>
|
426 |
+
<td>36.5%</td>
|
427 |
+
<td>34.0%</td>
|
428 |
+
</tr>
|
429 |
+
<tr>
|
430 |
+
<td>MNSLQANDTAIYYCAR</td>
|
431 |
+
<td>HC (82-97)</td>
|
432 |
+
<td>G1F</td>
|
433 |
+
<td>4.9%</td>
|
434 |
+
<td>5.1%</td>
|
435 |
+
</tr>
|
436 |
+
<tr>
|
437 |
+
<td>MNSLQANDTAIYYCAR</td>
|
438 |
+
<td>HC (82-97)</td>
|
439 |
+
<td>G2F</td>
|
440 |
+
<td>5.7%</td>
|
441 |
+
<td>4.8%</td>
|
442 |
+
</tr>
|
443 |
+
<tr>
|
444 |
+
<td>MNSLQANDTAIYYCAR</td>
|
445 |
+
<td>HC (82-97)</td>
|
446 |
+
<td>Man5</td>
|
447 |
+
<td>32.4%</td>
|
448 |
+
<td>31.5%</td>
|
449 |
+
</tr>
|
450 |
+
</table>
|
451 |
+
<hr>
|
452 |
+
</div>
|
453 |
+
|
454 |
+
<div class="table-container">
|
455 |
+
<h2>Table 10</h2>
|
456 |
+
<table border="1">
|
457 |
+
<tr>
|
458 |
+
<td>Sequence</td>
|
459 |
+
<td>Sequence location</td>
|
460 |
+
<td>Modification</td>
|
461 |
+
<td>Relative abundance</td>
|
462 |
+
<td>Relative abundance</td>
|
463 |
+
</tr>
|
464 |
+
<tr>
|
465 |
+
<td>Sequence</td>
|
466 |
+
<td>Sequence location</td>
|
467 |
+
<td>Modification</td>
|
468 |
+
<td>aFH.07_T0</td>
|
469 |
+
<td>aFH.07_T4W</td>
|
470 |
+
</tr>
|
471 |
+
<tr>
|
472 |
+
<td>EEQYNSTYR</td>
|
473 |
+
<td>HC (293-301)</td>
|
474 |
+
<td>Non glycosylated</td>
|
475 |
+
<td>n.d</td>
|
476 |
+
<td>n.d</td>
|
477 |
+
</tr>
|
478 |
+
<tr>
|
479 |
+
<td>EEQYNSTYR</td>
|
480 |
+
<td>HC (293-301)</td>
|
481 |
+
<td>Man5</td>
|
482 |
+
<td>20.9%</td>
|
483 |
+
<td>22.5%</td>
|
484 |
+
</tr>
|
485 |
+
<tr>
|
486 |
+
<td>EEQYNSTYR</td>
|
487 |
+
<td>HC (293-301)</td>
|
488 |
+
<td>G0</td>
|
489 |
+
<td>n.D</td>
|
490 |
+
<td>n.d</td>
|
491 |
+
</tr>
|
492 |
+
<tr>
|
493 |
+
<td>EEQYNSTYR</td>
|
494 |
+
<td>HC (293-301)</td>
|
495 |
+
<td>G0F</td>
|
496 |
+
<td>79.1%</td>
|
497 |
+
<td>77.5%</td>
|
498 |
+
</tr>
|
499 |
+
<tr>
|
500 |
+
<td>EEQYNSTYR</td>
|
501 |
+
<td>HC (293-301)</td>
|
502 |
+
<td>G1F</td>
|
503 |
+
<td>n.d</td>
|
504 |
+
<td>n.d</td>
|
505 |
+
</tr>
|
506 |
+
<tr>
|
507 |
+
<td>EEQYNSTYR</td>
|
508 |
+
<td>HC (293-301)</td>
|
509 |
+
<td>G2F</td>
|
510 |
+
<td>n.d</td>
|
511 |
+
<td>n.d</td>
|
512 |
+
</tr>
|
513 |
+
</table>
|
514 |
+
<hr>
|
515 |
+
</div>
|
516 |
+
|
517 |
+
<div class="table-container">
|
518 |
+
<h2>Table 11</h2>
|
519 |
+
<table border="1">
|
520 |
+
<tr>
|
521 |
+
<td>Sequence</td>
|
522 |
+
<td>Sequence location</td>
|
523 |
+
<td>Modification</td>
|
524 |
+
<td>Relative abundance*</td>
|
525 |
+
<td>Relative abundance*</td>
|
526 |
+
</tr>
|
527 |
+
<tr>
|
528 |
+
<td>Sequence</td>
|
529 |
+
<td>Sequence location</td>
|
530 |
+
<td>Modification</td>
|
531 |
+
<td>aFH.07_T0</td>
|
532 |
+
<td>aFH.07_T4W</td>
|
533 |
+
</tr>
|
534 |
+
<tr>
|
535 |
+
<td>STSGGTAALGCLVK</td>
|
536 |
+
<td>HC (134-147)</td>
|
537 |
+
<td></td>
|
538 |
+
<td>99.9%</td>
|
539 |
+
<td>98.8%</td>
|
540 |
+
</tr>
|
541 |
+
<tr>
|
542 |
+
<td>GTAALGCLVK</td>
|
543 |
+
<td>HC (134-147)</td>
|
544 |
+
<td>Clipping</td>
|
545 |
+
<td>0.1%</td>
|
546 |
+
<td>1.2%</td>
|
547 |
+
</tr>
|
548 |
+
</table>
|
549 |
+
<hr>
|
550 |
+
</div>
|
551 |
+
|
552 |
+
<div class="table-container">
|
553 |
+
<h2>Table 12</h2>
|
554 |
+
<table border="1">
|
555 |
+
<tr>
|
556 |
+
<td>Blue:</td>
|
557 |
+
<td>VH and VL</td>
|
558 |
+
</tr>
|
559 |
+
<tr>
|
560 |
+
<td>Blue:</td>
|
561 |
+
<td>CDR</td>
|
562 |
+
</tr>
|
563 |
+
<tr>
|
564 |
+
<td>Green:</td>
|
565 |
+
<td>N-glycosylation site</td>
|
566 |
+
</tr>
|
567 |
+
</table>
|
568 |
+
<hr>
|
569 |
+
</div>
|
570 |
+
|
571 |
+
<div class="table-container">
|
572 |
+
<h2>Table 13</h2>
|
573 |
+
<table border="1">
|
574 |
+
<tr>
|
575 |
+
<td>Sequence</td>
|
576 |
+
<td>Sequence location</td>
|
577 |
+
<td>Modification</td>
|
578 |
+
<td>Relative abundance</td>
|
579 |
+
<td>Relative abundance</td>
|
580 |
+
</tr>
|
581 |
+
<tr>
|
582 |
+
<td>Sequence</td>
|
583 |
+
<td>Sequence location</td>
|
584 |
+
<td>Modification</td>
|
585 |
+
<td>FHR-1.3B4_T0</td>
|
586 |
+
<td>FHR-1.3B4_T4W</td>
|
587 |
+
</tr>
|
588 |
+
<tr>
|
589 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
590 |
+
<td>LC (1-18)</td>
|
591 |
+
<td>pyro Q</td>
|
592 |
+
<td>96.1%</td>
|
593 |
+
<td>100.0%</td>
|
594 |
+
</tr>
|
595 |
+
<tr>
|
596 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
597 |
+
<td>LC (1-18)</td>
|
598 |
+
<td></td>
|
599 |
+
<td>3.9%</td>
|
600 |
+
<td>n.d</td>
|
601 |
+
</tr>
|
602 |
+
<tr>
|
603 |
+
<td>QVQLR</td>
|
604 |
+
<td>HC (1-5)</td>
|
605 |
+
<td>pyro Q</td>
|
606 |
+
<td>96.7%</td>
|
607 |
+
<td>100.0%</td>
|
608 |
+
</tr>
|
609 |
+
<tr>
|
610 |
+
<td>QVQLR</td>
|
611 |
+
<td>HC (1-5)</td>
|
612 |
+
<td></td>
|
613 |
+
<td>3.3%</td>
|
614 |
+
<td>n.d</td>
|
615 |
+
</tr>
|
616 |
+
</table>
|
617 |
+
<hr>
|
618 |
+
</div>
|
619 |
+
|
620 |
+
<div class="table-container">
|
621 |
+
<h2>Table 14</h2>
|
622 |
+
<table border="1">
|
623 |
+
<tr>
|
624 |
+
<td>Sequence</td>
|
625 |
+
<td>Sequence location</td>
|
626 |
+
<td>Modification</td>
|
627 |
+
<td>Relative abundance</td>
|
628 |
+
<td>Relative abundance</td>
|
629 |
+
</tr>
|
630 |
+
<tr>
|
631 |
+
<td>Sequence</td>
|
632 |
+
<td>Sequence location</td>
|
633 |
+
<td>Modification</td>
|
634 |
+
<td>FHR-1.3B4_T0</td>
|
635 |
+
<td>FHR-1.3B4_T4W</td>
|
636 |
+
</tr>
|
637 |
+
<tr>
|
638 |
+
<td>MNSLQADDTAIYYCAR</td>
|
639 |
+
<td>HC (82-97)</td>
|
640 |
+
<td></td>
|
641 |
+
<td>99.3%</td>
|
642 |
+
<td>99.0%</td>
|
643 |
+
</tr>
|
644 |
+
<tr>
|
645 |
+
<td>MNSLQADDTAIYYCAR</td>
|
646 |
+
<td>HC (82-97)</td>
|
647 |
+
<td>Ox [+ 16 Da]</td>
|
648 |
+
<td>0.7%</td>
|
649 |
+
<td>1.0%</td>
|
650 |
+
</tr>
|
651 |
+
</table>
|
652 |
+
<hr>
|
653 |
+
</div>
|
654 |
+
|
655 |
+
<div class="table-container">
|
656 |
+
<h2>Table 15</h2>
|
657 |
+
<table border="1">
|
658 |
+
<tr>
|
659 |
+
<td>Sequence</td>
|
660 |
+
<td>Sequence location</td>
|
661 |
+
<td>Modification</td>
|
662 |
+
<td>Relative abundance</td>
|
663 |
+
<td>Relative abundance</td>
|
664 |
+
</tr>
|
665 |
+
<tr>
|
666 |
+
<td>Sequence</td>
|
667 |
+
<td>Sequence location</td>
|
668 |
+
<td>Modification</td>
|
669 |
+
<td>FHR-1.3B4_T0</td>
|
670 |
+
<td>FHR-1.3B4_T4W</td>
|
671 |
+
</tr>
|
672 |
+
<tr>
|
673 |
+
<td>MNSLQADDTAIYYCAR</td>
|
674 |
+
<td>HC (82-97)</td>
|
675 |
+
<td></td>
|
676 |
+
<td>97.6%</td>
|
677 |
+
<td>79.7%</td>
|
678 |
+
</tr>
|
679 |
+
<tr>
|
680 |
+
<td>MNSLQADDTAIYYCAR</td>
|
681 |
+
<td>HC (82-97)</td>
|
682 |
+
<td>Deamidation</td>
|
683 |
+
<td>2.4%</td>
|
684 |
+
<td>20.3%</td>
|
685 |
+
</tr>
|
686 |
+
</table>
|
687 |
+
<hr>
|
688 |
+
</div>
|
689 |
+
|
690 |
+
<div class="table-container">
|
691 |
+
<h2>Table 16</h2>
|
692 |
+
<table border="1">
|
693 |
+
<tr>
|
694 |
+
<td>Sequence</td>
|
695 |
+
<td>Sequence location</td>
|
696 |
+
<td>Modification</td>
|
697 |
+
<td>Relative abundance*</td>
|
698 |
+
<td>Relative abundance*</td>
|
699 |
+
</tr>
|
700 |
+
<tr>
|
701 |
+
<td>Sequence</td>
|
702 |
+
<td>Sequence location</td>
|
703 |
+
<td>Modification</td>
|
704 |
+
<td>FHR-1.3B4_T0</td>
|
705 |
+
<td>FHR-1.3B4_T4W</td>
|
706 |
+
</tr>
|
707 |
+
<tr>
|
708 |
+
<td>STSGGTAALGCLVK</td>
|
709 |
+
<td>HC (134-147)</td>
|
710 |
+
<td></td>
|
711 |
+
<td>99.9%</td>
|
712 |
+
<td>98.7%</td>
|
713 |
+
</tr>
|
714 |
+
<tr>
|
715 |
+
<td>GTAALGCLVK</td>
|
716 |
+
<td>HC (134-147)</td>
|
717 |
+
<td>Clipping</td>
|
718 |
+
<td>0.1%</td>
|
719 |
+
<td>1.3%</td>
|
720 |
+
</tr>
|
721 |
+
<tr>
|
722 |
+
<td>SSSNPLTFGAGTK</td>
|
723 |
+
<td>LC (91-103)</td>
|
724 |
+
<td></td>
|
725 |
+
<td>99.5%</td>
|
726 |
+
<td>97.3%</td>
|
727 |
+
</tr>
|
728 |
+
<tr>
|
729 |
+
<td>PLTFGAGTK</td>
|
730 |
+
<td>LC (91-103)</td>
|
731 |
+
<td>Clipping</td>
|
732 |
+
<td>0.5%</td>
|
733 |
+
<td>2.7%</td>
|
734 |
+
</tr>
|
735 |
+
</table>
|
736 |
+
<hr>
|
737 |
+
</div>
|
738 |
+
|
739 |
+
<div class="table-container">
|
740 |
+
<h2>Table 17</h2>
|
741 |
+
<table border="1">
|
742 |
+
<tr>
|
743 |
+
<td>Blue:</td>
|
744 |
+
<td>VH and VL</td>
|
745 |
+
</tr>
|
746 |
+
<tr>
|
747 |
+
<td>Blue:</td>
|
748 |
+
<td>CDR</td>
|
749 |
+
</tr>
|
750 |
+
<tr>
|
751 |
+
<td>Green:</td>
|
752 |
+
<td>N-glycosylation site</td>
|
753 |
+
</tr>
|
754 |
+
</table>
|
755 |
+
<hr>
|
756 |
+
</div>
|
757 |
+
|
758 |
+
<div class="table-container">
|
759 |
+
<h2>Table 18</h2>
|
760 |
+
<table border="1">
|
761 |
+
<tr>
|
762 |
+
<td>Sequence</td>
|
763 |
+
<td>Sequence location</td>
|
764 |
+
<td>Modification</td>
|
765 |
+
<td>Relative abundance</td>
|
766 |
+
<td>Relative abundance</td>
|
767 |
+
</tr>
|
768 |
+
<tr>
|
769 |
+
<td>Sequence</td>
|
770 |
+
<td>Sequence location</td>
|
771 |
+
<td>Modification</td>
|
772 |
+
<td>L5-H12_T0</td>
|
773 |
+
<td>L5-H12_T4w</td>
|
774 |
+
</tr>
|
775 |
+
<tr>
|
776 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
777 |
+
<td>HC (001-038)</td>
|
778 |
+
<td>pyro Q</td>
|
779 |
+
<td>85.5%</td>
|
780 |
+
<td>99.3%</td>
|
781 |
+
</tr>
|
782 |
+
<tr>
|
783 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
784 |
+
<td>HC (001-038)</td>
|
785 |
+
<td></td>
|
786 |
+
<td>14.5%</td>
|
787 |
+
<td>0.7%</td>
|
788 |
+
</tr>
|
789 |
+
</table>
|
790 |
+
<hr>
|
791 |
+
</div>
|
792 |
+
|
793 |
+
<div class="table-container">
|
794 |
+
<h2>Table 19</h2>
|
795 |
+
<table border="1">
|
796 |
+
<tr>
|
797 |
+
<td>Sequence</td>
|
798 |
+
<td>Sequence location</td>
|
799 |
+
<td>Modification</td>
|
800 |
+
<td>Relative abundance*</td>
|
801 |
+
<td>Relative abundance*</td>
|
802 |
+
</tr>
|
803 |
+
<tr>
|
804 |
+
<td>Sequence</td>
|
805 |
+
<td>Sequence location</td>
|
806 |
+
<td>Modification</td>
|
807 |
+
<td>L5-H12_T0</td>
|
808 |
+
<td>L5-H12_T4w</td>
|
809 |
+
</tr>
|
810 |
+
<tr>
|
811 |
+
<td>STSGGTAALGCLVK</td>
|
812 |
+
<td>HC (134-147)</td>
|
813 |
+
<td></td>
|
814 |
+
<td>99.9%</td>
|
815 |
+
<td>98.7%</td>
|
816 |
+
</tr>
|
817 |
+
<tr>
|
818 |
+
<td>GTAALGCLVK</td>
|
819 |
+
<td>HC (134-147)</td>
|
820 |
+
<td>Clipping</td>
|
821 |
+
<td>0.1%</td>
|
822 |
+
<td>1.3%</td>
|
823 |
+
</tr>
|
824 |
+
<tr>
|
825 |
+
<td>SSSNPLTFGAGTK</td>
|
826 |
+
<td>LC (91-103)</td>
|
827 |
+
<td></td>
|
828 |
+
<td>99.8%</td>
|
829 |
+
<td>98.9%</td>
|
830 |
+
</tr>
|
831 |
+
<tr>
|
832 |
+
<td>PLTFGAGTK</td>
|
833 |
+
<td>LC (91-103)</td>
|
834 |
+
<td>Clipping</td>
|
835 |
+
<td>0.2%</td>
|
836 |
+
<td>1.1%</td>
|
837 |
+
</tr>
|
838 |
+
</table>
|
839 |
+
<hr>
|
840 |
+
</div>
|
841 |
+
|
842 |
+
<div class="table-container">
|
843 |
+
<h2>Table 20</h2>
|
844 |
+
<table border="1">
|
845 |
+
<tr>
|
846 |
+
<td>Blue:</td>
|
847 |
+
<td>VH and VL</td>
|
848 |
+
</tr>
|
849 |
+
<tr>
|
850 |
+
<td>Blue:</td>
|
851 |
+
<td>CDR</td>
|
852 |
+
</tr>
|
853 |
+
<tr>
|
854 |
+
<td>Green:</td>
|
855 |
+
<td>N-glycosylation site</td>
|
856 |
+
</tr>
|
857 |
+
</table>
|
858 |
+
<hr>
|
859 |
+
</div>
|
860 |
+
|
861 |
+
<div class="table-container">
|
862 |
+
<h2>Table 21</h2>
|
863 |
+
<table border="1">
|
864 |
+
<tr>
|
865 |
+
<td>Sequence</td>
|
866 |
+
<td>Sequence location</td>
|
867 |
+
<td>Modification</td>
|
868 |
+
<td>Relative abundance</td>
|
869 |
+
<td>Relative abundance</td>
|
870 |
+
</tr>
|
871 |
+
<tr>
|
872 |
+
<td>Sequence</td>
|
873 |
+
<td>Sequence location</td>
|
874 |
+
<td>Modification</td>
|
875 |
+
<td>L5-H31_T0</td>
|
876 |
+
<td>L5-H31_T4w</td>
|
877 |
+
</tr>
|
878 |
+
<tr>
|
879 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
880 |
+
<td>HC (001-038)</td>
|
881 |
+
<td>pyro Q</td>
|
882 |
+
<td>83.5%</td>
|
883 |
+
<td>99.5%</td>
|
884 |
+
</tr>
|
885 |
+
<tr>
|
886 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
887 |
+
<td>HC (001-038)</td>
|
888 |
+
<td></td>
|
889 |
+
<td>16.5%</td>
|
890 |
+
<td>0.5%</td>
|
891 |
+
</tr>
|
892 |
+
</table>
|
893 |
+
<hr>
|
894 |
+
</div>
|
895 |
+
|
896 |
+
<div class="table-container">
|
897 |
+
<h2>Table 22</h2>
|
898 |
+
<table border="1">
|
899 |
+
<tr>
|
900 |
+
<td>Sequence</td>
|
901 |
+
<td>Sequence location</td>
|
902 |
+
<td>Modification</td>
|
903 |
+
<td>Relative abundance</td>
|
904 |
+
<td>Relative abundance</td>
|
905 |
+
</tr>
|
906 |
+
<tr>
|
907 |
+
<td>Sequence</td>
|
908 |
+
<td>Sequence location</td>
|
909 |
+
<td>Modification</td>
|
910 |
+
<td>L5-H31_T0</td>
|
911 |
+
<td>L5-H31_T4w</td>
|
912 |
+
</tr>
|
913 |
+
<tr>
|
914 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
915 |
+
<td>HC(98-121)</td>
|
916 |
+
<td>Ox. [+ 16 Da]</td>
|
917 |
+
<td>4.9%</td>
|
918 |
+
<td>1.9%</td>
|
919 |
+
</tr>
|
920 |
+
<tr>
|
921 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
922 |
+
<td>HC(98-121)</td>
|
923 |
+
<td></td>
|
924 |
+
<td>95.1%</td>
|
925 |
+
<td>98.1%</td>
|
926 |
+
</tr>
|
927 |
+
</table>
|
928 |
+
<hr>
|
929 |
+
</div>
|
930 |
+
|
931 |
+
<div class="table-container">
|
932 |
+
<h2>Table 23</h2>
|
933 |
+
<table border="1">
|
934 |
+
<tr>
|
935 |
+
<td>Sequence</td>
|
936 |
+
<td>Sequence location</td>
|
937 |
+
<td>Modification</td>
|
938 |
+
<td>Relative abundance</td>
|
939 |
+
<td>Relative abundance</td>
|
940 |
+
</tr>
|
941 |
+
<tr>
|
942 |
+
<td>Sequence</td>
|
943 |
+
<td>Sequence location</td>
|
944 |
+
<td>Modification</td>
|
945 |
+
<td>L5-H31_T0</td>
|
946 |
+
<td>L5-H31_T4w</td>
|
947 |
+
</tr>
|
948 |
+
<tr>
|
949 |
+
<td>SSSNPLTFGAGTK</td>
|
950 |
+
<td>LC (91-103)</td>
|
951 |
+
<td></td>
|
952 |
+
<td>99.8%</td>
|
953 |
+
<td>99.5%</td>
|
954 |
+
</tr>
|
955 |
+
<tr>
|
956 |
+
<td>SSSNPLTFGAGTK</td>
|
957 |
+
<td>LC (91-103)</td>
|
958 |
+
<td>deamidation</td>
|
959 |
+
<td>0.2%</td>
|
960 |
+
<td>0.5%</td>
|
961 |
+
</tr>
|
962 |
+
</table>
|
963 |
+
<hr>
|
964 |
+
</div>
|
965 |
+
|
966 |
+
<div class="table-container">
|
967 |
+
<h2>Table 24</h2>
|
968 |
+
<table border="1">
|
969 |
+
<tr>
|
970 |
+
<td>Sequence</td>
|
971 |
+
<td>Sequence location</td>
|
972 |
+
<td>Modification</td>
|
973 |
+
<td>Relative abundance*</td>
|
974 |
+
<td>Relative abundance*</td>
|
975 |
+
</tr>
|
976 |
+
<tr>
|
977 |
+
<td>Sequence</td>
|
978 |
+
<td>Sequence location</td>
|
979 |
+
<td>Modification</td>
|
980 |
+
<td>L5-H31_T0</td>
|
981 |
+
<td>L5-H31_T4w</td>
|
982 |
+
</tr>
|
983 |
+
<tr>
|
984 |
+
<td>STSGGTAALGCLVK</td>
|
985 |
+
<td>HC (134-147)</td>
|
986 |
+
<td></td>
|
987 |
+
<td>99.9%</td>
|
988 |
+
<td>98.8%</td>
|
989 |
+
</tr>
|
990 |
+
<tr>
|
991 |
+
<td>GTAALGCLVK</td>
|
992 |
+
<td>HC (134-147)</td>
|
993 |
+
<td>Clipping</td>
|
994 |
+
<td>0.1%</td>
|
995 |
+
<td>1.2%</td>
|
996 |
+
</tr>
|
997 |
+
<tr>
|
998 |
+
<td>SSSNPLTFGAGTK</td>
|
999 |
+
<td>LC (91-103)</td>
|
1000 |
+
<td></td>
|
1001 |
+
<td>99.9%</td>
|
1002 |
+
<td>98.8%</td>
|
1003 |
+
</tr>
|
1004 |
+
<tr>
|
1005 |
+
<td>PLTFGAGTK</td>
|
1006 |
+
<td>LC (91-103)</td>
|
1007 |
+
<td>Clipping</td>
|
1008 |
+
<td>0.1%</td>
|
1009 |
+
<td>1.2%</td>
|
1010 |
+
</tr>
|
1011 |
+
</table>
|
1012 |
+
<hr>
|
1013 |
+
</div>
|
1014 |
+
|
1015 |
+
<div class="table-container">
|
1016 |
+
<h2>Table 25</h2>
|
1017 |
+
<table border="1">
|
1018 |
+
<tr>
|
1019 |
+
<td>Blue:</td>
|
1020 |
+
<td>VH and VL</td>
|
1021 |
+
</tr>
|
1022 |
+
<tr>
|
1023 |
+
<td>Blue:</td>
|
1024 |
+
<td>CDR</td>
|
1025 |
+
</tr>
|
1026 |
+
<tr>
|
1027 |
+
<td>Green:</td>
|
1028 |
+
<td>N-glycosylation site</td>
|
1029 |
+
</tr>
|
1030 |
+
</table>
|
1031 |
+
<hr>
|
1032 |
+
</div>
|
1033 |
+
|
1034 |
+
<div class="table-container">
|
1035 |
+
<h2>Table 26</h2>
|
1036 |
+
<table border="1">
|
1037 |
+
<tr>
|
1038 |
+
<td>Sequence</td>
|
1039 |
+
<td>Sequence location</td>
|
1040 |
+
<td>Modification</td>
|
1041 |
+
<td>Relative abundance</td>
|
1042 |
+
<td>Relative abundance</td>
|
1043 |
+
</tr>
|
1044 |
+
<tr>
|
1045 |
+
<td>Sequence</td>
|
1046 |
+
<td>Sequence location</td>
|
1047 |
+
<td>Modification</td>
|
1048 |
+
<td>L14-H12_T0</td>
|
1049 |
+
<td>L14-H12_T4w</td>
|
1050 |
+
</tr>
|
1051 |
+
<tr>
|
1052 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1053 |
+
<td>HC(001-038)</td>
|
1054 |
+
<td>pyroQ</td>
|
1055 |
+
<td>85.9%</td>
|
1056 |
+
<td>99.3%</td>
|
1057 |
+
</tr>
|
1058 |
+
<tr>
|
1059 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1060 |
+
<td>HC(001-038)</td>
|
1061 |
+
<td></td>
|
1062 |
+
<td>14.1%</td>
|
1063 |
+
<td>0.7%</td>
|
1064 |
+
</tr>
|
1065 |
+
</table>
|
1066 |
+
<hr>
|
1067 |
+
</div>
|
1068 |
+
|
1069 |
+
<div class="table-container">
|
1070 |
+
<h2>Table 27</h2>
|
1071 |
+
<table border="1">
|
1072 |
+
<tr>
|
1073 |
+
<td>Sequence</td>
|
1074 |
+
<td>Sequence location</td>
|
1075 |
+
<td>Modification</td>
|
1076 |
+
<td>Relative abundance</td>
|
1077 |
+
<td>Relative abundance</td>
|
1078 |
+
</tr>
|
1079 |
+
<tr>
|
1080 |
+
<td>Sequence</td>
|
1081 |
+
<td>Sequence location</td>
|
1082 |
+
<td>Modification</td>
|
1083 |
+
<td>L14-H12_T0</td>
|
1084 |
+
<td>L14-H12_T4w</td>
|
1085 |
+
</tr>
|
1086 |
+
<tr>
|
1087 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1088 |
+
<td>LC(25-41)</td>
|
1089 |
+
<td>Ox. [+16 Da]</td>
|
1090 |
+
<td>0.3%</td>
|
1091 |
+
<td>0.3%</td>
|
1092 |
+
</tr>
|
1093 |
+
<tr>
|
1094 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1095 |
+
<td>LC(25-41)</td>
|
1096 |
+
<td></td>
|
1097 |
+
<td>99.7%</td>
|
1098 |
+
<td>99.7%</td>
|
1099 |
+
</tr>
|
1100 |
+
</table>
|
1101 |
+
<hr>
|
1102 |
+
</div>
|
1103 |
+
|
1104 |
+
<div class="table-container">
|
1105 |
+
<h2>Table 28</h2>
|
1106 |
+
<table border="1">
|
1107 |
+
<tr>
|
1108 |
+
<td>Sequence</td>
|
1109 |
+
<td>Sequence location</td>
|
1110 |
+
<td>Modification</td>
|
1111 |
+
<td>Relative abundance</td>
|
1112 |
+
<td>Relative abundance</td>
|
1113 |
+
</tr>
|
1114 |
+
<tr>
|
1115 |
+
<td>Sequence</td>
|
1116 |
+
<td>Sequence location</td>
|
1117 |
+
<td>Modification</td>
|
1118 |
+
<td>L14-H12_T0</td>
|
1119 |
+
<td>L14-H12_T4w</td>
|
1120 |
+
</tr>
|
1121 |
+
<tr>
|
1122 |
+
<td>SSSNPLTFGAGTK</td>
|
1123 |
+
<td>LC (91-103)</td>
|
1124 |
+
<td></td>
|
1125 |
+
<td>99.9%</td>
|
1126 |
+
<td>99.4%</td>
|
1127 |
+
</tr>
|
1128 |
+
<tr>
|
1129 |
+
<td>SSSNPLTFGAGTK</td>
|
1130 |
+
<td>LC (91-103)</td>
|
1131 |
+
<td>deamidation</td>
|
1132 |
+
<td>0.1%</td>
|
1133 |
+
<td>0.6%</td>
|
1134 |
+
</tr>
|
1135 |
+
</table>
|
1136 |
+
<hr>
|
1137 |
+
</div>
|
1138 |
+
|
1139 |
+
<div class="table-container">
|
1140 |
+
<h2>Table 29</h2>
|
1141 |
+
<table border="1">
|
1142 |
+
<tr>
|
1143 |
+
<td>Sequence</td>
|
1144 |
+
<td>Sequence location</td>
|
1145 |
+
<td>Modification</td>
|
1146 |
+
<td>Relative abundance*</td>
|
1147 |
+
<td>Relative abundance*</td>
|
1148 |
+
</tr>
|
1149 |
+
<tr>
|
1150 |
+
<td>Sequence</td>
|
1151 |
+
<td>Sequence location</td>
|
1152 |
+
<td>Modification</td>
|
1153 |
+
<td>L14-H12_T0</td>
|
1154 |
+
<td>L14-H12_T4w</td>
|
1155 |
+
</tr>
|
1156 |
+
<tr>
|
1157 |
+
<td>STSGGTAALGCLVK</td>
|
1158 |
+
<td>HC (134-147)</td>
|
1159 |
+
<td></td>
|
1160 |
+
<td>99.9%</td>
|
1161 |
+
<td>98.9%</td>
|
1162 |
+
</tr>
|
1163 |
+
<tr>
|
1164 |
+
<td>GTAALGCLVK</td>
|
1165 |
+
<td>HC (134-147)</td>
|
1166 |
+
<td>Clipping</td>
|
1167 |
+
<td>0.1%</td>
|
1168 |
+
<td>1.1%</td>
|
1169 |
+
</tr>
|
1170 |
+
<tr>
|
1171 |
+
<td>SSSNPLTFGAGTK</td>
|
1172 |
+
<td>LC (91-103)</td>
|
1173 |
+
<td></td>
|
1174 |
+
<td>99.7%</td>
|
1175 |
+
<td>98.6%</td>
|
1176 |
+
</tr>
|
1177 |
+
<tr>
|
1178 |
+
<td>PLTFGAGTK</td>
|
1179 |
+
<td>LC (91-103)</td>
|
1180 |
+
<td>Clipping</td>
|
1181 |
+
<td>0.3%</td>
|
1182 |
+
<td>1.4%</td>
|
1183 |
+
</tr>
|
1184 |
+
</table>
|
1185 |
+
<hr>
|
1186 |
+
</div>
|
1187 |
+
|
1188 |
+
<div class="table-container">
|
1189 |
+
<h2>Table 30</h2>
|
1190 |
+
<table border="1">
|
1191 |
+
<tr>
|
1192 |
+
<td>Blue:</td>
|
1193 |
+
<td>VH and VL</td>
|
1194 |
+
</tr>
|
1195 |
+
<tr>
|
1196 |
+
<td>Blue:</td>
|
1197 |
+
<td>CDR</td>
|
1198 |
+
</tr>
|
1199 |
+
<tr>
|
1200 |
+
<td>Green:</td>
|
1201 |
+
<td>N-glycosylation site</td>
|
1202 |
+
</tr>
|
1203 |
+
</table>
|
1204 |
+
<hr>
|
1205 |
+
</div>
|
1206 |
+
|
1207 |
+
<div class="table-container">
|
1208 |
+
<h2>Table 31</h2>
|
1209 |
+
<table border="1">
|
1210 |
+
<tr>
|
1211 |
+
<td>Sequence</td>
|
1212 |
+
<td>Sequence location</td>
|
1213 |
+
<td>Modification</td>
|
1214 |
+
<td>Relative abundance</td>
|
1215 |
+
<td>Relative abundance</td>
|
1216 |
+
</tr>
|
1217 |
+
<tr>
|
1218 |
+
<td>Sequence</td>
|
1219 |
+
<td>Sequence location</td>
|
1220 |
+
<td>Modification</td>
|
1221 |
+
<td>L14-H31_T0</td>
|
1222 |
+
<td>L14-H31_T4w</td>
|
1223 |
+
</tr>
|
1224 |
+
<tr>
|
1225 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1226 |
+
<td>HC(001-038)</td>
|
1227 |
+
<td>pyroQ</td>
|
1228 |
+
<td>82.6%</td>
|
1229 |
+
<td>100.0%</td>
|
1230 |
+
</tr>
|
1231 |
+
<tr>
|
1232 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1233 |
+
<td>HC(001-038)</td>
|
1234 |
+
<td></td>
|
1235 |
+
<td>17.4%</td>
|
1236 |
+
<td>n.d</td>
|
1237 |
+
</tr>
|
1238 |
+
</table>
|
1239 |
+
<hr>
|
1240 |
+
</div>
|
1241 |
+
|
1242 |
+
<div class="table-container">
|
1243 |
+
<h2>Table 32</h2>
|
1244 |
+
<table border="1">
|
1245 |
+
<tr>
|
1246 |
+
<td>Sequence</td>
|
1247 |
+
<td>Sequence location</td>
|
1248 |
+
<td>Modification</td>
|
1249 |
+
<td>Relative abundance</td>
|
1250 |
+
<td>Relative abundance</td>
|
1251 |
+
</tr>
|
1252 |
+
<tr>
|
1253 |
+
<td>Sequence</td>
|
1254 |
+
<td>Sequence location</td>
|
1255 |
+
<td>Modification</td>
|
1256 |
+
<td>L14-H31_T0</td>
|
1257 |
+
<td>L14-H31_T4w</td>
|
1258 |
+
</tr>
|
1259 |
+
<tr>
|
1260 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1261 |
+
<td>LC(25-41)</td>
|
1262 |
+
<td>Ox. [+16 Da]</td>
|
1263 |
+
<td>0.5%</td>
|
1264 |
+
<td>0.4%</td>
|
1265 |
+
</tr>
|
1266 |
+
<tr>
|
1267 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1268 |
+
<td>LC(25-41)</td>
|
1269 |
+
<td></td>
|
1270 |
+
<td>99.5%</td>
|
1271 |
+
<td>99.6%</td>
|
1272 |
+
</tr>
|
1273 |
+
</table>
|
1274 |
+
<hr>
|
1275 |
+
</div>
|
1276 |
+
|
1277 |
+
<div class="table-container">
|
1278 |
+
<h2>Table 33</h2>
|
1279 |
+
<table border="1">
|
1280 |
+
<tr>
|
1281 |
+
<td>Sequence</td>
|
1282 |
+
<td>Sequence location</td>
|
1283 |
+
<td>Modification</td>
|
1284 |
+
<td>Relative abundance</td>
|
1285 |
+
<td>Relative abundance</td>
|
1286 |
+
</tr>
|
1287 |
+
<tr>
|
1288 |
+
<td>Sequence</td>
|
1289 |
+
<td>Sequence location</td>
|
1290 |
+
<td>Modification</td>
|
1291 |
+
<td>L14-H31_T0</td>
|
1292 |
+
<td>L14-H31_T4w</td>
|
1293 |
+
</tr>
|
1294 |
+
<tr>
|
1295 |
+
<td>SSSNPLTFGAGTK</td>
|
1296 |
+
<td>LC (91-103)</td>
|
1297 |
+
<td></td>
|
1298 |
+
<td>99.9%</td>
|
1299 |
+
<td>99.5%</td>
|
1300 |
+
</tr>
|
1301 |
+
<tr>
|
1302 |
+
<td>SSSNPLTFGAGTK</td>
|
1303 |
+
<td>LC (91-103)</td>
|
1304 |
+
<td>deamidation</td>
|
1305 |
+
<td>0.1%</td>
|
1306 |
+
<td>0.5%</td>
|
1307 |
+
</tr>
|
1308 |
+
</table>
|
1309 |
+
<hr>
|
1310 |
+
</div>
|
1311 |
+
|
1312 |
+
<div class="table-container">
|
1313 |
+
<h2>Table 34</h2>
|
1314 |
+
<table border="1">
|
1315 |
+
<tr>
|
1316 |
+
<td>Sequence</td>
|
1317 |
+
<td>Sequence location</td>
|
1318 |
+
<td>Modification</td>
|
1319 |
+
<td>Relative abundance*</td>
|
1320 |
+
<td>Relative abundance*</td>
|
1321 |
+
</tr>
|
1322 |
+
<tr>
|
1323 |
+
<td>Sequence</td>
|
1324 |
+
<td>Sequence location</td>
|
1325 |
+
<td>Modification</td>
|
1326 |
+
<td>L14-H31_T0</td>
|
1327 |
+
<td>L14-H31_T4w</td>
|
1328 |
+
</tr>
|
1329 |
+
<tr>
|
1330 |
+
<td>STSGGTAALGCLVK</td>
|
1331 |
+
<td>HC (134-147)</td>
|
1332 |
+
<td></td>
|
1333 |
+
<td>99.9%</td>
|
1334 |
+
<td>98.9%</td>
|
1335 |
+
</tr>
|
1336 |
+
<tr>
|
1337 |
+
<td>GTAALGCLVK</td>
|
1338 |
+
<td>HC (134-147)</td>
|
1339 |
+
<td>Clipping</td>
|
1340 |
+
<td>0.1%</td>
|
1341 |
+
<td>1.1%</td>
|
1342 |
+
</tr>
|
1343 |
+
<tr>
|
1344 |
+
<td>SSSNPLTFGAGTK</td>
|
1345 |
+
<td>LC (91-103)</td>
|
1346 |
+
<td></td>
|
1347 |
+
<td>99.7%</td>
|
1348 |
+
<td>98.4%</td>
|
1349 |
+
</tr>
|
1350 |
+
<tr>
|
1351 |
+
<td>PLTFGAGTK</td>
|
1352 |
+
<td>LC (91-103)</td>
|
1353 |
+
<td>Clipping</td>
|
1354 |
+
<td>0.3%</td>
|
1355 |
+
<td>1.6%</td>
|
1356 |
+
</tr>
|
1357 |
+
</table>
|
1358 |
+
<hr>
|
1359 |
+
</div>
|
1360 |
+
|
1361 |
+
<div class="table-container">
|
1362 |
+
<h2>Table 35</h2>
|
1363 |
+
<table border="1">
|
1364 |
+
<tr>
|
1365 |
+
<td>Blue:</td>
|
1366 |
+
<td>VH and VL</td>
|
1367 |
+
</tr>
|
1368 |
+
<tr>
|
1369 |
+
<td>Blue:</td>
|
1370 |
+
<td>CDR</td>
|
1371 |
+
</tr>
|
1372 |
+
<tr>
|
1373 |
+
<td>Green:</td>
|
1374 |
+
<td>N-glycosylation site</td>
|
1375 |
+
</tr>
|
1376 |
+
</table>
|
1377 |
+
<hr>
|
1378 |
+
</div>
|
1379 |
+
|
1380 |
+
<div class="table-container">
|
1381 |
+
<h2>Table 36</h2>
|
1382 |
+
<table border="1">
|
1383 |
+
<tr>
|
1384 |
+
<td>Nathan Cardon</td>
|
1385 |
+
<td>Date:</td>
|
1386 |
+
</tr>
|
1387 |
+
<tr>
|
1388 |
+
<td>Sr Research Associate</td>
|
1389 |
+
<td>Signature:</td>
|
1390 |
+
</tr>
|
1391 |
+
<tr>
|
1392 |
+
<td>Mabelle Meersseman</td>
|
1393 |
+
<td>Date:</td>
|
1394 |
+
</tr>
|
1395 |
+
<tr>
|
1396 |
+
<td>Group Leader</td>
|
1397 |
+
<td>Signature:</td>
|
1398 |
+
</tr>
|
1399 |
+
<tr>
|
1400 |
+
<td>Approver</td>
|
1401 |
+
<td></td>
|
1402 |
+
</tr>
|
1403 |
+
<tr>
|
1404 |
+
<td>Koen Sandra Ph.D.</td>
|
1405 |
+
<td>Date:</td>
|
1406 |
+
</tr>
|
1407 |
+
<tr>
|
1408 |
+
<td>CEO</td>
|
1409 |
+
<td>Signature:</td>
|
1410 |
+
</tr>
|
1411 |
+
</table>
|
1412 |
+
<hr>
|
1413 |
+
</div>
|
1414 |
+
|
1415 |
+
<div class="table-container">
|
1416 |
+
<h2>Table 37</h2>
|
1417 |
+
<table border="1">
|
1418 |
+
<tr>
|
1419 |
+
<td>Version</td>
|
1420 |
+
<td>Date of issue</td>
|
1421 |
+
<td>Reason for version update</td>
|
1422 |
+
</tr>
|
1423 |
+
<tr>
|
1424 |
+
<td>00</td>
|
1425 |
+
<td>25NOV24</td>
|
1426 |
+
<td>Draft</td>
|
1427 |
+
</tr>
|
1428 |
+
<tr>
|
1429 |
+
<td></td>
|
1430 |
+
<td></td>
|
1431 |
+
<td></td>
|
1432 |
+
</tr>
|
1433 |
+
<tr>
|
1434 |
+
<td></td>
|
1435 |
+
<td></td>
|
1436 |
+
<td></td>
|
1437 |
+
</tr>
|
1438 |
+
</table>
|
1439 |
+
<hr>
|
1440 |
+
</div>
|
1441 |
+
</body></html>
|
logs/di_content/di_content_20250617_121947_tables.html
ADDED
@@ -0,0 +1,1441 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Azure DI Tables</title>
|
5 |
+
<style>
|
6 |
+
body { font-family: Arial, sans-serif; margin: 20px; }
|
7 |
+
.table-container { margin-bottom: 40px; }
|
8 |
+
h2 { color: #333; }
|
9 |
+
table { border-collapse: collapse; width: 100%; margin-bottom: 10px; }
|
10 |
+
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
11 |
+
th { background-color: #f5f5f5; }
|
12 |
+
hr { border: none; border-top: 2px solid #ccc; margin: 20px 0; }
|
13 |
+
</style>
|
14 |
+
</head>
|
15 |
+
<body>
|
16 |
+
<h1>Azure Document Intelligence Tables</h1>
|
17 |
+
|
18 |
+
<div class="table-container">
|
19 |
+
<h2>Table 1</h2>
|
20 |
+
<table border="1">
|
21 |
+
<tr>
|
22 |
+
<td>l Sales quote:</td>
|
23 |
+
<td>SQ20202722</td>
|
24 |
+
</tr>
|
25 |
+
<tr>
|
26 |
+
<td>l Project code:</td>
|
27 |
+
<td>P3016</td>
|
28 |
+
</tr>
|
29 |
+
<tr>
|
30 |
+
<td>l LNB number:</td>
|
31 |
+
<td>2023.050</td>
|
32 |
+
</tr>
|
33 |
+
<tr>
|
34 |
+
<td>l Project responsible:</td>
|
35 |
+
<td>Nathan Cardon</td>
|
36 |
+
</tr>
|
37 |
+
<tr>
|
38 |
+
<td>l Report name:</td>
|
39 |
+
<td>P3016_R11_v00</td>
|
40 |
+
</tr>
|
41 |
+
</table>
|
42 |
+
<hr>
|
43 |
+
</div>
|
44 |
+
|
45 |
+
<div class="table-container">
|
46 |
+
<h2>Table 2</h2>
|
47 |
+
<table border="1">
|
48 |
+
<tr>
|
49 |
+
<td>Test sample ID client</td>
|
50 |
+
<td>Test sample ID RIC</td>
|
51 |
+
<td>Protein concentration (mg/ML)</td>
|
52 |
+
</tr>
|
53 |
+
<tr>
|
54 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
55 |
+
<td>aFH0.7_T0</td>
|
56 |
+
<td>1.0</td>
|
57 |
+
</tr>
|
58 |
+
<tr>
|
59 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
60 |
+
<td>aFH.07_T4W</td>
|
61 |
+
<td>1.0</td>
|
62 |
+
</tr>
|
63 |
+
<tr>
|
64 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
65 |
+
<td>FHR-1.3B4_T0</td>
|
66 |
+
<td>1.0</td>
|
67 |
+
</tr>
|
68 |
+
<tr>
|
69 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
70 |
+
<td>FHR-1.3B4_T4W</td>
|
71 |
+
<td>1.0</td>
|
72 |
+
</tr>
|
73 |
+
<tr>
|
74 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
75 |
+
<td>L5_H12_T0</td>
|
76 |
+
<td>1.0</td>
|
77 |
+
</tr>
|
78 |
+
<tr>
|
79 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
80 |
+
<td>L5_H12_T4W</td>
|
81 |
+
<td>1.0</td>
|
82 |
+
</tr>
|
83 |
+
<tr>
|
84 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
85 |
+
<td>L5_H31_T0</td>
|
86 |
+
<td>1.0</td>
|
87 |
+
</tr>
|
88 |
+
<tr>
|
89 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
90 |
+
<td>L5_H31_T4W</td>
|
91 |
+
<td>1.0</td>
|
92 |
+
</tr>
|
93 |
+
<tr>
|
94 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
95 |
+
<td>L14_H12_T0</td>
|
96 |
+
<td>1.0</td>
|
97 |
+
</tr>
|
98 |
+
<tr>
|
99 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
100 |
+
<td>L14_H12_T4W</td>
|
101 |
+
<td>1.0</td>
|
102 |
+
</tr>
|
103 |
+
<tr>
|
104 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
105 |
+
<td>L14_H31_T0</td>
|
106 |
+
<td>1.0</td>
|
107 |
+
</tr>
|
108 |
+
<tr>
|
109 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
110 |
+
<td>L14-H31_T4W</td>
|
111 |
+
<td>1.0</td>
|
112 |
+
</tr>
|
113 |
+
</table>
|
114 |
+
<hr>
|
115 |
+
</div>
|
116 |
+
|
117 |
+
<div class="table-container">
|
118 |
+
<h2>Table 3</h2>
|
119 |
+
<table border="1">
|
120 |
+
<tr>
|
121 |
+
<td></td>
|
122 |
+
<td>aFH.07_T0</td>
|
123 |
+
<td>aFH.07_T4W</td>
|
124 |
+
</tr>
|
125 |
+
<tr>
|
126 |
+
<td>G0-GlcNAc</td>
|
127 |
+
<td>5.0%</td>
|
128 |
+
<td>4.5%</td>
|
129 |
+
</tr>
|
130 |
+
<tr>
|
131 |
+
<td>Man5</td>
|
132 |
+
<td>56.1%</td>
|
133 |
+
<td>56.3%</td>
|
134 |
+
</tr>
|
135 |
+
<tr>
|
136 |
+
<td>Man6</td>
|
137 |
+
<td>17.6%</td>
|
138 |
+
<td>17.4%</td>
|
139 |
+
</tr>
|
140 |
+
<tr>
|
141 |
+
<td>Man7</td>
|
142 |
+
<td>20.7%</td>
|
143 |
+
<td>21.6%</td>
|
144 |
+
</tr>
|
145 |
+
<tr>
|
146 |
+
<td>Man8</td>
|
147 |
+
<td>0.6%</td>
|
148 |
+
<td>0.2%</td>
|
149 |
+
</tr>
|
150 |
+
</table>
|
151 |
+
<hr>
|
152 |
+
</div>
|
153 |
+
|
154 |
+
<div class="table-container">
|
155 |
+
<h2>Table 4</h2>
|
156 |
+
<table border="1">
|
157 |
+
<tr>
|
158 |
+
<td></td>
|
159 |
+
<td>aFH.07_T0</td>
|
160 |
+
<td>aFH.07_T4W</td>
|
161 |
+
</tr>
|
162 |
+
<tr>
|
163 |
+
<td>Unknown peak</td>
|
164 |
+
<td>0.6%</td>
|
165 |
+
<td>1.3%</td>
|
166 |
+
</tr>
|
167 |
+
<tr>
|
168 |
+
<td>HC [G0F/G0] - 2*GlcNAc</td>
|
169 |
+
<td>1.5%</td>
|
170 |
+
<td>2.0%</td>
|
171 |
+
</tr>
|
172 |
+
<tr>
|
173 |
+
<td>HC [Man5-Man5]</td>
|
174 |
+
<td>16.7%</td>
|
175 |
+
<td>16.5%</td>
|
176 |
+
</tr>
|
177 |
+
<tr>
|
178 |
+
<td>HC [G0F-Man5]</td>
|
179 |
+
<td>10.9%</td>
|
180 |
+
<td>11.9%</td>
|
181 |
+
</tr>
|
182 |
+
<tr>
|
183 |
+
<td>HC [G0F/G0] - GlcNAc</td>
|
184 |
+
<td>16.5%</td>
|
185 |
+
<td>17.2%</td>
|
186 |
+
</tr>
|
187 |
+
<tr>
|
188 |
+
<td>HC [G0F/G0]</td>
|
189 |
+
<td>6.5%</td>
|
190 |
+
<td>6.0%</td>
|
191 |
+
</tr>
|
192 |
+
<tr>
|
193 |
+
<td>HC [G0F/G0F]</td>
|
194 |
+
<td>35.5%</td>
|
195 |
+
<td>33.8%</td>
|
196 |
+
</tr>
|
197 |
+
<tr>
|
198 |
+
<td>HC [G0F/G1F]</td>
|
199 |
+
<td>6.5%</td>
|
200 |
+
<td>5.9%</td>
|
201 |
+
</tr>
|
202 |
+
<tr>
|
203 |
+
<td>HC [G1F/G1F] or HC [G0F/G2F]</td>
|
204 |
+
<td>5.0%</td>
|
205 |
+
<td>4.8%</td>
|
206 |
+
</tr>
|
207 |
+
<tr>
|
208 |
+
<td>HC [G1F/G2F]</td>
|
209 |
+
<td>0.3%</td>
|
210 |
+
<td>0.6%</td>
|
211 |
+
</tr>
|
212 |
+
</table>
|
213 |
+
<hr>
|
214 |
+
</div>
|
215 |
+
|
216 |
+
<div class="table-container">
|
217 |
+
<h2>Table 5</h2>
|
218 |
+
<table border="1">
|
219 |
+
<tr>
|
220 |
+
<td>Sequence</td>
|
221 |
+
<td>Sequence location</td>
|
222 |
+
<td>Modification</td>
|
223 |
+
<td>Relative abundance</td>
|
224 |
+
<td>Relative abundance</td>
|
225 |
+
</tr>
|
226 |
+
<tr>
|
227 |
+
<td>Sequence</td>
|
228 |
+
<td>Sequence location</td>
|
229 |
+
<td>Modification</td>
|
230 |
+
<td>aFH.07_T0</td>
|
231 |
+
<td>aFH.07_T4W</td>
|
232 |
+
</tr>
|
233 |
+
<tr>
|
234 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
235 |
+
<td>LC (001-018)</td>
|
236 |
+
<td>pyroQ</td>
|
237 |
+
<td>86.8%</td>
|
238 |
+
<td>99.7%</td>
|
239 |
+
</tr>
|
240 |
+
<tr>
|
241 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
242 |
+
<td>LC (001-018)</td>
|
243 |
+
<td></td>
|
244 |
+
<td>13.2%</td>
|
245 |
+
<td>0.3%</td>
|
246 |
+
</tr>
|
247 |
+
<tr>
|
248 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
249 |
+
<td>HC (001-031)</td>
|
250 |
+
<td>pyroQ</td>
|
251 |
+
<td>90.0%</td>
|
252 |
+
<td>100.0%</td>
|
253 |
+
</tr>
|
254 |
+
<tr>
|
255 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
256 |
+
<td>HC (001-031)</td>
|
257 |
+
<td></td>
|
258 |
+
<td>10.0%</td>
|
259 |
+
<td>n.d</td>
|
260 |
+
</tr>
|
261 |
+
</table>
|
262 |
+
<hr>
|
263 |
+
</div>
|
264 |
+
|
265 |
+
<div class="table-container">
|
266 |
+
<h2>Table 6</h2>
|
267 |
+
<table border="1">
|
268 |
+
<tr>
|
269 |
+
<td>Sequence</td>
|
270 |
+
<td>Sequence location</td>
|
271 |
+
<td>Modification</td>
|
272 |
+
<td>Relative abundance</td>
|
273 |
+
<td>Relative abundance</td>
|
274 |
+
</tr>
|
275 |
+
<tr>
|
276 |
+
<td>Sequence</td>
|
277 |
+
<td>Sequence location</td>
|
278 |
+
<td>Modification</td>
|
279 |
+
<td>aFH.07_T0</td>
|
280 |
+
<td>aFH.07_T4W</td>
|
281 |
+
</tr>
|
282 |
+
<tr>
|
283 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
284 |
+
<td>LC (31-60)</td>
|
285 |
+
<td>Oxidation [+16 Da]</td>
|
286 |
+
<td>0.9%</td>
|
287 |
+
<td>1.0%</td>
|
288 |
+
</tr>
|
289 |
+
<tr>
|
290 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
291 |
+
<td>LC (31-60)</td>
|
292 |
+
<td></td>
|
293 |
+
<td>99.1%</td>
|
294 |
+
<td>99.0%</td>
|
295 |
+
</tr>
|
296 |
+
</table>
|
297 |
+
<hr>
|
298 |
+
</div>
|
299 |
+
|
300 |
+
<div class="table-container">
|
301 |
+
<h2>Table 7</h2>
|
302 |
+
<table border="1">
|
303 |
+
<tr>
|
304 |
+
<td>Sequence</td>
|
305 |
+
<td>Sequence location</td>
|
306 |
+
<td>Modification</td>
|
307 |
+
<td>Relative abundance</td>
|
308 |
+
<td>Relative abundance</td>
|
309 |
+
</tr>
|
310 |
+
<tr>
|
311 |
+
<td>Sequence</td>
|
312 |
+
<td>Sequence location</td>
|
313 |
+
<td>Modification</td>
|
314 |
+
<td>aFH.07_T0</td>
|
315 |
+
<td>aFH.07_T4W</td>
|
316 |
+
</tr>
|
317 |
+
<tr>
|
318 |
+
<td>LNINKDNSK</td>
|
319 |
+
<td>HC (72-75)</td>
|
320 |
+
<td></td>
|
321 |
+
<td>99.5%</td>
|
322 |
+
<td>98.9%</td>
|
323 |
+
</tr>
|
324 |
+
<tr>
|
325 |
+
<td>LNINKDNSK</td>
|
326 |
+
<td>HC (72-75)</td>
|
327 |
+
<td>Deamidation</td>
|
328 |
+
<td>0.5%</td>
|
329 |
+
<td>1.1%</td>
|
330 |
+
</tr>
|
331 |
+
</table>
|
332 |
+
<hr>
|
333 |
+
</div>
|
334 |
+
|
335 |
+
<div class="table-container">
|
336 |
+
<h2>Table 8</h2>
|
337 |
+
<table border="1">
|
338 |
+
<tr>
|
339 |
+
<td>Sequence</td>
|
340 |
+
<td>Sequence location</td>
|
341 |
+
<td>Modification</td>
|
342 |
+
<td>Relative abundance</td>
|
343 |
+
<td>Relative abundance</td>
|
344 |
+
</tr>
|
345 |
+
<tr>
|
346 |
+
<td>Sequence</td>
|
347 |
+
<td>Sequence location</td>
|
348 |
+
<td>Modification</td>
|
349 |
+
<td>aFH.07_T0</td>
|
350 |
+
<td>aFH.07_T4W</td>
|
351 |
+
</tr>
|
352 |
+
<tr>
|
353 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
354 |
+
<td>LC (77-102)</td>
|
355 |
+
<td>GO-GICNAc</td>
|
356 |
+
<td>2.6%</td>
|
357 |
+
<td>4.0%</td>
|
358 |
+
</tr>
|
359 |
+
<tr>
|
360 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
361 |
+
<td>LC (77-102)</td>
|
362 |
+
<td>Man5</td>
|
363 |
+
<td>54.9%</td>
|
364 |
+
<td>57.3%</td>
|
365 |
+
</tr>
|
366 |
+
<tr>
|
367 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
368 |
+
<td>LC (77-102)</td>
|
369 |
+
<td>Man6</td>
|
370 |
+
<td>21.1%</td>
|
371 |
+
<td>18.8%</td>
|
372 |
+
</tr>
|
373 |
+
<tr>
|
374 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
375 |
+
<td>LC (77-102)</td>
|
376 |
+
<td>Man7</td>
|
377 |
+
<td>21.4%</td>
|
378 |
+
<td>20.0%</td>
|
379 |
+
</tr>
|
380 |
+
</table>
|
381 |
+
<hr>
|
382 |
+
</div>
|
383 |
+
|
384 |
+
<div class="table-container">
|
385 |
+
<h2>Table 9</h2>
|
386 |
+
<table border="1">
|
387 |
+
<tr>
|
388 |
+
<td>Sequence</td>
|
389 |
+
<td>Sequence location</td>
|
390 |
+
<td>Modification</td>
|
391 |
+
<td>Relative abundance</td>
|
392 |
+
<td>Relative abundance</td>
|
393 |
+
</tr>
|
394 |
+
<tr>
|
395 |
+
<td>Sequence</td>
|
396 |
+
<td>Sequence location</td>
|
397 |
+
<td>Modification</td>
|
398 |
+
<td>aFH.07_T0</td>
|
399 |
+
<td>aFH.07_T4W</td>
|
400 |
+
</tr>
|
401 |
+
<tr>
|
402 |
+
<td>MNSLQANDTAIYYCAR</td>
|
403 |
+
<td>HC (82-97)</td>
|
404 |
+
<td>Non glycosylated</td>
|
405 |
+
<td>n.d</td>
|
406 |
+
<td>n.d</td>
|
407 |
+
</tr>
|
408 |
+
<tr>
|
409 |
+
<td>MNSLQANDTAIYYCAR</td>
|
410 |
+
<td>HC (82-97)</td>
|
411 |
+
<td>G0F-GlcNAc</td>
|
412 |
+
<td>16.3%</td>
|
413 |
+
<td>20.8%</td>
|
414 |
+
</tr>
|
415 |
+
<tr>
|
416 |
+
<td>MNSLQANDTAIYYCAR</td>
|
417 |
+
<td>HC (82-97)</td>
|
418 |
+
<td>G0</td>
|
419 |
+
<td>4.2%</td>
|
420 |
+
<td>3.7%</td>
|
421 |
+
</tr>
|
422 |
+
<tr>
|
423 |
+
<td>MNSLQANDTAIYYCAR</td>
|
424 |
+
<td>HC (82-97)</td>
|
425 |
+
<td>G0F</td>
|
426 |
+
<td>36.5%</td>
|
427 |
+
<td>34.0%</td>
|
428 |
+
</tr>
|
429 |
+
<tr>
|
430 |
+
<td>MNSLQANDTAIYYCAR</td>
|
431 |
+
<td>HC (82-97)</td>
|
432 |
+
<td>G1F</td>
|
433 |
+
<td>4.9%</td>
|
434 |
+
<td>5.1%</td>
|
435 |
+
</tr>
|
436 |
+
<tr>
|
437 |
+
<td>MNSLQANDTAIYYCAR</td>
|
438 |
+
<td>HC (82-97)</td>
|
439 |
+
<td>G2F</td>
|
440 |
+
<td>5.7%</td>
|
441 |
+
<td>4.8%</td>
|
442 |
+
</tr>
|
443 |
+
<tr>
|
444 |
+
<td>MNSLQANDTAIYYCAR</td>
|
445 |
+
<td>HC (82-97)</td>
|
446 |
+
<td>Man5</td>
|
447 |
+
<td>32.4%</td>
|
448 |
+
<td>31.5%</td>
|
449 |
+
</tr>
|
450 |
+
</table>
|
451 |
+
<hr>
|
452 |
+
</div>
|
453 |
+
|
454 |
+
<div class="table-container">
|
455 |
+
<h2>Table 10</h2>
|
456 |
+
<table border="1">
|
457 |
+
<tr>
|
458 |
+
<td>Sequence</td>
|
459 |
+
<td>Sequence location</td>
|
460 |
+
<td>Modification</td>
|
461 |
+
<td>Relative abundance</td>
|
462 |
+
<td>Relative abundance</td>
|
463 |
+
</tr>
|
464 |
+
<tr>
|
465 |
+
<td>Sequence</td>
|
466 |
+
<td>Sequence location</td>
|
467 |
+
<td>Modification</td>
|
468 |
+
<td>aFH.07_T0</td>
|
469 |
+
<td>aFH.07_T4W</td>
|
470 |
+
</tr>
|
471 |
+
<tr>
|
472 |
+
<td>EEQYNSTYR</td>
|
473 |
+
<td>HC (293-301)</td>
|
474 |
+
<td>Non glycosylated</td>
|
475 |
+
<td>n.d</td>
|
476 |
+
<td>n.d</td>
|
477 |
+
</tr>
|
478 |
+
<tr>
|
479 |
+
<td>EEQYNSTYR</td>
|
480 |
+
<td>HC (293-301)</td>
|
481 |
+
<td>Man5</td>
|
482 |
+
<td>20.9%</td>
|
483 |
+
<td>22.5%</td>
|
484 |
+
</tr>
|
485 |
+
<tr>
|
486 |
+
<td>EEQYNSTYR</td>
|
487 |
+
<td>HC (293-301)</td>
|
488 |
+
<td>G0</td>
|
489 |
+
<td>n.D</td>
|
490 |
+
<td>n.d</td>
|
491 |
+
</tr>
|
492 |
+
<tr>
|
493 |
+
<td>EEQYNSTYR</td>
|
494 |
+
<td>HC (293-301)</td>
|
495 |
+
<td>G0F</td>
|
496 |
+
<td>79.1%</td>
|
497 |
+
<td>77.5%</td>
|
498 |
+
</tr>
|
499 |
+
<tr>
|
500 |
+
<td>EEQYNSTYR</td>
|
501 |
+
<td>HC (293-301)</td>
|
502 |
+
<td>G1F</td>
|
503 |
+
<td>n.d</td>
|
504 |
+
<td>n.d</td>
|
505 |
+
</tr>
|
506 |
+
<tr>
|
507 |
+
<td>EEQYNSTYR</td>
|
508 |
+
<td>HC (293-301)</td>
|
509 |
+
<td>G2F</td>
|
510 |
+
<td>n.d</td>
|
511 |
+
<td>n.d</td>
|
512 |
+
</tr>
|
513 |
+
</table>
|
514 |
+
<hr>
|
515 |
+
</div>
|
516 |
+
|
517 |
+
<div class="table-container">
|
518 |
+
<h2>Table 11</h2>
|
519 |
+
<table border="1">
|
520 |
+
<tr>
|
521 |
+
<td>Sequence</td>
|
522 |
+
<td>Sequence location</td>
|
523 |
+
<td>Modification</td>
|
524 |
+
<td>Relative abundance*</td>
|
525 |
+
<td>Relative abundance*</td>
|
526 |
+
</tr>
|
527 |
+
<tr>
|
528 |
+
<td>Sequence</td>
|
529 |
+
<td>Sequence location</td>
|
530 |
+
<td>Modification</td>
|
531 |
+
<td>aFH.07_T0</td>
|
532 |
+
<td>aFH.07_T4W</td>
|
533 |
+
</tr>
|
534 |
+
<tr>
|
535 |
+
<td>STSGGTAALGCLVK</td>
|
536 |
+
<td>HC (134-147)</td>
|
537 |
+
<td></td>
|
538 |
+
<td>99.9%</td>
|
539 |
+
<td>98.8%</td>
|
540 |
+
</tr>
|
541 |
+
<tr>
|
542 |
+
<td>GTAALGCLVK</td>
|
543 |
+
<td>HC (134-147)</td>
|
544 |
+
<td>Clipping</td>
|
545 |
+
<td>0.1%</td>
|
546 |
+
<td>1.2%</td>
|
547 |
+
</tr>
|
548 |
+
</table>
|
549 |
+
<hr>
|
550 |
+
</div>
|
551 |
+
|
552 |
+
<div class="table-container">
|
553 |
+
<h2>Table 12</h2>
|
554 |
+
<table border="1">
|
555 |
+
<tr>
|
556 |
+
<td>Blue:</td>
|
557 |
+
<td>VH and VL</td>
|
558 |
+
</tr>
|
559 |
+
<tr>
|
560 |
+
<td>Blue:</td>
|
561 |
+
<td>CDR</td>
|
562 |
+
</tr>
|
563 |
+
<tr>
|
564 |
+
<td>Green:</td>
|
565 |
+
<td>N-glycosylation site</td>
|
566 |
+
</tr>
|
567 |
+
</table>
|
568 |
+
<hr>
|
569 |
+
</div>
|
570 |
+
|
571 |
+
<div class="table-container">
|
572 |
+
<h2>Table 13</h2>
|
573 |
+
<table border="1">
|
574 |
+
<tr>
|
575 |
+
<td>Sequence</td>
|
576 |
+
<td>Sequence location</td>
|
577 |
+
<td>Modification</td>
|
578 |
+
<td>Relative abundance</td>
|
579 |
+
<td>Relative abundance</td>
|
580 |
+
</tr>
|
581 |
+
<tr>
|
582 |
+
<td>Sequence</td>
|
583 |
+
<td>Sequence location</td>
|
584 |
+
<td>Modification</td>
|
585 |
+
<td>FHR-1.3B4_T0</td>
|
586 |
+
<td>FHR-1.3B4_T4W</td>
|
587 |
+
</tr>
|
588 |
+
<tr>
|
589 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
590 |
+
<td>LC (1-18)</td>
|
591 |
+
<td>pyro Q</td>
|
592 |
+
<td>96.1%</td>
|
593 |
+
<td>100.0%</td>
|
594 |
+
</tr>
|
595 |
+
<tr>
|
596 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
597 |
+
<td>LC (1-18)</td>
|
598 |
+
<td></td>
|
599 |
+
<td>3.9%</td>
|
600 |
+
<td>n.d</td>
|
601 |
+
</tr>
|
602 |
+
<tr>
|
603 |
+
<td>QVQLR</td>
|
604 |
+
<td>HC (1-5)</td>
|
605 |
+
<td>pyro Q</td>
|
606 |
+
<td>96.7%</td>
|
607 |
+
<td>100.0%</td>
|
608 |
+
</tr>
|
609 |
+
<tr>
|
610 |
+
<td>QVQLR</td>
|
611 |
+
<td>HC (1-5)</td>
|
612 |
+
<td></td>
|
613 |
+
<td>3.3%</td>
|
614 |
+
<td>n.d</td>
|
615 |
+
</tr>
|
616 |
+
</table>
|
617 |
+
<hr>
|
618 |
+
</div>
|
619 |
+
|
620 |
+
<div class="table-container">
|
621 |
+
<h2>Table 14</h2>
|
622 |
+
<table border="1">
|
623 |
+
<tr>
|
624 |
+
<td>Sequence</td>
|
625 |
+
<td>Sequence location</td>
|
626 |
+
<td>Modification</td>
|
627 |
+
<td>Relative abundance</td>
|
628 |
+
<td>Relative abundance</td>
|
629 |
+
</tr>
|
630 |
+
<tr>
|
631 |
+
<td>Sequence</td>
|
632 |
+
<td>Sequence location</td>
|
633 |
+
<td>Modification</td>
|
634 |
+
<td>FHR-1.3B4_T0</td>
|
635 |
+
<td>FHR-1.3B4_T4W</td>
|
636 |
+
</tr>
|
637 |
+
<tr>
|
638 |
+
<td>MNSLQADDTAIYYCAR</td>
|
639 |
+
<td>HC (82-97)</td>
|
640 |
+
<td></td>
|
641 |
+
<td>99.3%</td>
|
642 |
+
<td>99.0%</td>
|
643 |
+
</tr>
|
644 |
+
<tr>
|
645 |
+
<td>MNSLQADDTAIYYCAR</td>
|
646 |
+
<td>HC (82-97)</td>
|
647 |
+
<td>Ox [+ 16 Da]</td>
|
648 |
+
<td>0.7%</td>
|
649 |
+
<td>1.0%</td>
|
650 |
+
</tr>
|
651 |
+
</table>
|
652 |
+
<hr>
|
653 |
+
</div>
|
654 |
+
|
655 |
+
<div class="table-container">
|
656 |
+
<h2>Table 15</h2>
|
657 |
+
<table border="1">
|
658 |
+
<tr>
|
659 |
+
<td>Sequence</td>
|
660 |
+
<td>Sequence location</td>
|
661 |
+
<td>Modification</td>
|
662 |
+
<td>Relative abundance</td>
|
663 |
+
<td>Relative abundance</td>
|
664 |
+
</tr>
|
665 |
+
<tr>
|
666 |
+
<td>Sequence</td>
|
667 |
+
<td>Sequence location</td>
|
668 |
+
<td>Modification</td>
|
669 |
+
<td>FHR-1.3B4_T0</td>
|
670 |
+
<td>FHR-1.3B4_T4W</td>
|
671 |
+
</tr>
|
672 |
+
<tr>
|
673 |
+
<td>MNSLQADDTAIYYCAR</td>
|
674 |
+
<td>HC (82-97)</td>
|
675 |
+
<td></td>
|
676 |
+
<td>97.6%</td>
|
677 |
+
<td>79.7%</td>
|
678 |
+
</tr>
|
679 |
+
<tr>
|
680 |
+
<td>MNSLQADDTAIYYCAR</td>
|
681 |
+
<td>HC (82-97)</td>
|
682 |
+
<td>Deamidation</td>
|
683 |
+
<td>2.4%</td>
|
684 |
+
<td>20.3%</td>
|
685 |
+
</tr>
|
686 |
+
</table>
|
687 |
+
<hr>
|
688 |
+
</div>
|
689 |
+
|
690 |
+
<div class="table-container">
|
691 |
+
<h2>Table 16</h2>
|
692 |
+
<table border="1">
|
693 |
+
<tr>
|
694 |
+
<td>Sequence</td>
|
695 |
+
<td>Sequence location</td>
|
696 |
+
<td>Modification</td>
|
697 |
+
<td>Relative abundance*</td>
|
698 |
+
<td>Relative abundance*</td>
|
699 |
+
</tr>
|
700 |
+
<tr>
|
701 |
+
<td>Sequence</td>
|
702 |
+
<td>Sequence location</td>
|
703 |
+
<td>Modification</td>
|
704 |
+
<td>FHR-1.3B4_T0</td>
|
705 |
+
<td>FHR-1.3B4_T4W</td>
|
706 |
+
</tr>
|
707 |
+
<tr>
|
708 |
+
<td>STSGGTAALGCLVK</td>
|
709 |
+
<td>HC (134-147)</td>
|
710 |
+
<td></td>
|
711 |
+
<td>99.9%</td>
|
712 |
+
<td>98.7%</td>
|
713 |
+
</tr>
|
714 |
+
<tr>
|
715 |
+
<td>GTAALGCLVK</td>
|
716 |
+
<td>HC (134-147)</td>
|
717 |
+
<td>Clipping</td>
|
718 |
+
<td>0.1%</td>
|
719 |
+
<td>1.3%</td>
|
720 |
+
</tr>
|
721 |
+
<tr>
|
722 |
+
<td>SSSNPLTFGAGTK</td>
|
723 |
+
<td>LC (91-103)</td>
|
724 |
+
<td></td>
|
725 |
+
<td>99.5%</td>
|
726 |
+
<td>97.3%</td>
|
727 |
+
</tr>
|
728 |
+
<tr>
|
729 |
+
<td>PLTFGAGTK</td>
|
730 |
+
<td>LC (91-103)</td>
|
731 |
+
<td>Clipping</td>
|
732 |
+
<td>0.5%</td>
|
733 |
+
<td>2.7%</td>
|
734 |
+
</tr>
|
735 |
+
</table>
|
736 |
+
<hr>
|
737 |
+
</div>
|
738 |
+
|
739 |
+
<div class="table-container">
|
740 |
+
<h2>Table 17</h2>
|
741 |
+
<table border="1">
|
742 |
+
<tr>
|
743 |
+
<td>Blue:</td>
|
744 |
+
<td>VH and VL</td>
|
745 |
+
</tr>
|
746 |
+
<tr>
|
747 |
+
<td>Blue:</td>
|
748 |
+
<td>CDR</td>
|
749 |
+
</tr>
|
750 |
+
<tr>
|
751 |
+
<td>Green:</td>
|
752 |
+
<td>N-glycosylation site</td>
|
753 |
+
</tr>
|
754 |
+
</table>
|
755 |
+
<hr>
|
756 |
+
</div>
|
757 |
+
|
758 |
+
<div class="table-container">
|
759 |
+
<h2>Table 18</h2>
|
760 |
+
<table border="1">
|
761 |
+
<tr>
|
762 |
+
<td>Sequence</td>
|
763 |
+
<td>Sequence location</td>
|
764 |
+
<td>Modification</td>
|
765 |
+
<td>Relative abundance</td>
|
766 |
+
<td>Relative abundance</td>
|
767 |
+
</tr>
|
768 |
+
<tr>
|
769 |
+
<td>Sequence</td>
|
770 |
+
<td>Sequence location</td>
|
771 |
+
<td>Modification</td>
|
772 |
+
<td>L5-H12_T0</td>
|
773 |
+
<td>L5-H12_T4w</td>
|
774 |
+
</tr>
|
775 |
+
<tr>
|
776 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
777 |
+
<td>HC (001-038)</td>
|
778 |
+
<td>pyro Q</td>
|
779 |
+
<td>85.5%</td>
|
780 |
+
<td>99.3%</td>
|
781 |
+
</tr>
|
782 |
+
<tr>
|
783 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
784 |
+
<td>HC (001-038)</td>
|
785 |
+
<td></td>
|
786 |
+
<td>14.5%</td>
|
787 |
+
<td>0.7%</td>
|
788 |
+
</tr>
|
789 |
+
</table>
|
790 |
+
<hr>
|
791 |
+
</div>
|
792 |
+
|
793 |
+
<div class="table-container">
|
794 |
+
<h2>Table 19</h2>
|
795 |
+
<table border="1">
|
796 |
+
<tr>
|
797 |
+
<td>Sequence</td>
|
798 |
+
<td>Sequence location</td>
|
799 |
+
<td>Modification</td>
|
800 |
+
<td>Relative abundance*</td>
|
801 |
+
<td>Relative abundance*</td>
|
802 |
+
</tr>
|
803 |
+
<tr>
|
804 |
+
<td>Sequence</td>
|
805 |
+
<td>Sequence location</td>
|
806 |
+
<td>Modification</td>
|
807 |
+
<td>L5-H12_T0</td>
|
808 |
+
<td>L5-H12_T4w</td>
|
809 |
+
</tr>
|
810 |
+
<tr>
|
811 |
+
<td>STSGGTAALGCLVK</td>
|
812 |
+
<td>HC (134-147)</td>
|
813 |
+
<td></td>
|
814 |
+
<td>99.9%</td>
|
815 |
+
<td>98.7%</td>
|
816 |
+
</tr>
|
817 |
+
<tr>
|
818 |
+
<td>GTAALGCLVK</td>
|
819 |
+
<td>HC (134-147)</td>
|
820 |
+
<td>Clipping</td>
|
821 |
+
<td>0.1%</td>
|
822 |
+
<td>1.3%</td>
|
823 |
+
</tr>
|
824 |
+
<tr>
|
825 |
+
<td>SSSNPLTFGAGTK</td>
|
826 |
+
<td>LC (91-103)</td>
|
827 |
+
<td></td>
|
828 |
+
<td>99.8%</td>
|
829 |
+
<td>98.9%</td>
|
830 |
+
</tr>
|
831 |
+
<tr>
|
832 |
+
<td>PLTFGAGTK</td>
|
833 |
+
<td>LC (91-103)</td>
|
834 |
+
<td>Clipping</td>
|
835 |
+
<td>0.2%</td>
|
836 |
+
<td>1.1%</td>
|
837 |
+
</tr>
|
838 |
+
</table>
|
839 |
+
<hr>
|
840 |
+
</div>
|
841 |
+
|
842 |
+
<div class="table-container">
|
843 |
+
<h2>Table 20</h2>
|
844 |
+
<table border="1">
|
845 |
+
<tr>
|
846 |
+
<td>Blue:</td>
|
847 |
+
<td>VH and VL</td>
|
848 |
+
</tr>
|
849 |
+
<tr>
|
850 |
+
<td>Blue:</td>
|
851 |
+
<td>CDR</td>
|
852 |
+
</tr>
|
853 |
+
<tr>
|
854 |
+
<td>Green:</td>
|
855 |
+
<td>N-glycosylation site</td>
|
856 |
+
</tr>
|
857 |
+
</table>
|
858 |
+
<hr>
|
859 |
+
</div>
|
860 |
+
|
861 |
+
<div class="table-container">
|
862 |
+
<h2>Table 21</h2>
|
863 |
+
<table border="1">
|
864 |
+
<tr>
|
865 |
+
<td>Sequence</td>
|
866 |
+
<td>Sequence location</td>
|
867 |
+
<td>Modification</td>
|
868 |
+
<td>Relative abundance</td>
|
869 |
+
<td>Relative abundance</td>
|
870 |
+
</tr>
|
871 |
+
<tr>
|
872 |
+
<td>Sequence</td>
|
873 |
+
<td>Sequence location</td>
|
874 |
+
<td>Modification</td>
|
875 |
+
<td>L5-H31_T0</td>
|
876 |
+
<td>L5-H31_T4w</td>
|
877 |
+
</tr>
|
878 |
+
<tr>
|
879 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
880 |
+
<td>HC (001-038)</td>
|
881 |
+
<td>pyro Q</td>
|
882 |
+
<td>83.5%</td>
|
883 |
+
<td>99.5%</td>
|
884 |
+
</tr>
|
885 |
+
<tr>
|
886 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
887 |
+
<td>HC (001-038)</td>
|
888 |
+
<td></td>
|
889 |
+
<td>16.5%</td>
|
890 |
+
<td>0.5%</td>
|
891 |
+
</tr>
|
892 |
+
</table>
|
893 |
+
<hr>
|
894 |
+
</div>
|
895 |
+
|
896 |
+
<div class="table-container">
|
897 |
+
<h2>Table 22</h2>
|
898 |
+
<table border="1">
|
899 |
+
<tr>
|
900 |
+
<td>Sequence</td>
|
901 |
+
<td>Sequence location</td>
|
902 |
+
<td>Modification</td>
|
903 |
+
<td>Relative abundance</td>
|
904 |
+
<td>Relative abundance</td>
|
905 |
+
</tr>
|
906 |
+
<tr>
|
907 |
+
<td>Sequence</td>
|
908 |
+
<td>Sequence location</td>
|
909 |
+
<td>Modification</td>
|
910 |
+
<td>L5-H31_T0</td>
|
911 |
+
<td>L5-H31_T4w</td>
|
912 |
+
</tr>
|
913 |
+
<tr>
|
914 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
915 |
+
<td>HC(98-121)</td>
|
916 |
+
<td>Ox. [+ 16 Da]</td>
|
917 |
+
<td>4.9%</td>
|
918 |
+
<td>1.9%</td>
|
919 |
+
</tr>
|
920 |
+
<tr>
|
921 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
922 |
+
<td>HC(98-121)</td>
|
923 |
+
<td></td>
|
924 |
+
<td>95.1%</td>
|
925 |
+
<td>98.1%</td>
|
926 |
+
</tr>
|
927 |
+
</table>
|
928 |
+
<hr>
|
929 |
+
</div>
|
930 |
+
|
931 |
+
<div class="table-container">
|
932 |
+
<h2>Table 23</h2>
|
933 |
+
<table border="1">
|
934 |
+
<tr>
|
935 |
+
<td>Sequence</td>
|
936 |
+
<td>Sequence location</td>
|
937 |
+
<td>Modification</td>
|
938 |
+
<td>Relative abundance</td>
|
939 |
+
<td>Relative abundance</td>
|
940 |
+
</tr>
|
941 |
+
<tr>
|
942 |
+
<td>Sequence</td>
|
943 |
+
<td>Sequence location</td>
|
944 |
+
<td>Modification</td>
|
945 |
+
<td>L5-H31_T0</td>
|
946 |
+
<td>L5-H31_T4w</td>
|
947 |
+
</tr>
|
948 |
+
<tr>
|
949 |
+
<td>SSSNPLTFGAGTK</td>
|
950 |
+
<td>LC (91-103)</td>
|
951 |
+
<td></td>
|
952 |
+
<td>99.8%</td>
|
953 |
+
<td>99.5%</td>
|
954 |
+
</tr>
|
955 |
+
<tr>
|
956 |
+
<td>SSSNPLTFGAGTK</td>
|
957 |
+
<td>LC (91-103)</td>
|
958 |
+
<td>deamidation</td>
|
959 |
+
<td>0.2%</td>
|
960 |
+
<td>0.5%</td>
|
961 |
+
</tr>
|
962 |
+
</table>
|
963 |
+
<hr>
|
964 |
+
</div>
|
965 |
+
|
966 |
+
<div class="table-container">
|
967 |
+
<h2>Table 24</h2>
|
968 |
+
<table border="1">
|
969 |
+
<tr>
|
970 |
+
<td>Sequence</td>
|
971 |
+
<td>Sequence location</td>
|
972 |
+
<td>Modification</td>
|
973 |
+
<td>Relative abundance*</td>
|
974 |
+
<td>Relative abundance*</td>
|
975 |
+
</tr>
|
976 |
+
<tr>
|
977 |
+
<td>Sequence</td>
|
978 |
+
<td>Sequence location</td>
|
979 |
+
<td>Modification</td>
|
980 |
+
<td>L5-H31_T0</td>
|
981 |
+
<td>L5-H31_T4w</td>
|
982 |
+
</tr>
|
983 |
+
<tr>
|
984 |
+
<td>STSGGTAALGCLVK</td>
|
985 |
+
<td>HC (134-147)</td>
|
986 |
+
<td></td>
|
987 |
+
<td>99.9%</td>
|
988 |
+
<td>98.8%</td>
|
989 |
+
</tr>
|
990 |
+
<tr>
|
991 |
+
<td>GTAALGCLVK</td>
|
992 |
+
<td>HC (134-147)</td>
|
993 |
+
<td>Clipping</td>
|
994 |
+
<td>0.1%</td>
|
995 |
+
<td>1.2%</td>
|
996 |
+
</tr>
|
997 |
+
<tr>
|
998 |
+
<td>SSSNPLTFGAGTK</td>
|
999 |
+
<td>LC (91-103)</td>
|
1000 |
+
<td></td>
|
1001 |
+
<td>99.9%</td>
|
1002 |
+
<td>98.8%</td>
|
1003 |
+
</tr>
|
1004 |
+
<tr>
|
1005 |
+
<td>PLTFGAGTK</td>
|
1006 |
+
<td>LC (91-103)</td>
|
1007 |
+
<td>Clipping</td>
|
1008 |
+
<td>0.1%</td>
|
1009 |
+
<td>1.2%</td>
|
1010 |
+
</tr>
|
1011 |
+
</table>
|
1012 |
+
<hr>
|
1013 |
+
</div>
|
1014 |
+
|
1015 |
+
<div class="table-container">
|
1016 |
+
<h2>Table 25</h2>
|
1017 |
+
<table border="1">
|
1018 |
+
<tr>
|
1019 |
+
<td>Blue:</td>
|
1020 |
+
<td>VH and VL</td>
|
1021 |
+
</tr>
|
1022 |
+
<tr>
|
1023 |
+
<td>Blue:</td>
|
1024 |
+
<td>CDR</td>
|
1025 |
+
</tr>
|
1026 |
+
<tr>
|
1027 |
+
<td>Green:</td>
|
1028 |
+
<td>N-glycosylation site</td>
|
1029 |
+
</tr>
|
1030 |
+
</table>
|
1031 |
+
<hr>
|
1032 |
+
</div>
|
1033 |
+
|
1034 |
+
<div class="table-container">
|
1035 |
+
<h2>Table 26</h2>
|
1036 |
+
<table border="1">
|
1037 |
+
<tr>
|
1038 |
+
<td>Sequence</td>
|
1039 |
+
<td>Sequence location</td>
|
1040 |
+
<td>Modification</td>
|
1041 |
+
<td>Relative abundance</td>
|
1042 |
+
<td>Relative abundance</td>
|
1043 |
+
</tr>
|
1044 |
+
<tr>
|
1045 |
+
<td>Sequence</td>
|
1046 |
+
<td>Sequence location</td>
|
1047 |
+
<td>Modification</td>
|
1048 |
+
<td>L14-H12_T0</td>
|
1049 |
+
<td>L14-H12_T4w</td>
|
1050 |
+
</tr>
|
1051 |
+
<tr>
|
1052 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1053 |
+
<td>HC(001-038)</td>
|
1054 |
+
<td>pyroQ</td>
|
1055 |
+
<td>85.9%</td>
|
1056 |
+
<td>99.3%</td>
|
1057 |
+
</tr>
|
1058 |
+
<tr>
|
1059 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1060 |
+
<td>HC(001-038)</td>
|
1061 |
+
<td></td>
|
1062 |
+
<td>14.1%</td>
|
1063 |
+
<td>0.7%</td>
|
1064 |
+
</tr>
|
1065 |
+
</table>
|
1066 |
+
<hr>
|
1067 |
+
</div>
|
1068 |
+
|
1069 |
+
<div class="table-container">
|
1070 |
+
<h2>Table 27</h2>
|
1071 |
+
<table border="1">
|
1072 |
+
<tr>
|
1073 |
+
<td>Sequence</td>
|
1074 |
+
<td>Sequence location</td>
|
1075 |
+
<td>Modification</td>
|
1076 |
+
<td>Relative abundance</td>
|
1077 |
+
<td>Relative abundance</td>
|
1078 |
+
</tr>
|
1079 |
+
<tr>
|
1080 |
+
<td>Sequence</td>
|
1081 |
+
<td>Sequence location</td>
|
1082 |
+
<td>Modification</td>
|
1083 |
+
<td>L14-H12_T0</td>
|
1084 |
+
<td>L14-H12_T4w</td>
|
1085 |
+
</tr>
|
1086 |
+
<tr>
|
1087 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1088 |
+
<td>LC(25-41)</td>
|
1089 |
+
<td>Ox. [+16 Da]</td>
|
1090 |
+
<td>0.3%</td>
|
1091 |
+
<td>0.3%</td>
|
1092 |
+
</tr>
|
1093 |
+
<tr>
|
1094 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1095 |
+
<td>LC(25-41)</td>
|
1096 |
+
<td></td>
|
1097 |
+
<td>99.7%</td>
|
1098 |
+
<td>99.7%</td>
|
1099 |
+
</tr>
|
1100 |
+
</table>
|
1101 |
+
<hr>
|
1102 |
+
</div>
|
1103 |
+
|
1104 |
+
<div class="table-container">
|
1105 |
+
<h2>Table 28</h2>
|
1106 |
+
<table border="1">
|
1107 |
+
<tr>
|
1108 |
+
<td>Sequence</td>
|
1109 |
+
<td>Sequence location</td>
|
1110 |
+
<td>Modification</td>
|
1111 |
+
<td>Relative abundance</td>
|
1112 |
+
<td>Relative abundance</td>
|
1113 |
+
</tr>
|
1114 |
+
<tr>
|
1115 |
+
<td>Sequence</td>
|
1116 |
+
<td>Sequence location</td>
|
1117 |
+
<td>Modification</td>
|
1118 |
+
<td>L14-H12_T0</td>
|
1119 |
+
<td>L14-H12_T4w</td>
|
1120 |
+
</tr>
|
1121 |
+
<tr>
|
1122 |
+
<td>SSSNPLTFGAGTK</td>
|
1123 |
+
<td>LC (91-103)</td>
|
1124 |
+
<td></td>
|
1125 |
+
<td>99.9%</td>
|
1126 |
+
<td>99.4%</td>
|
1127 |
+
</tr>
|
1128 |
+
<tr>
|
1129 |
+
<td>SSSNPLTFGAGTK</td>
|
1130 |
+
<td>LC (91-103)</td>
|
1131 |
+
<td>deamidation</td>
|
1132 |
+
<td>0.1%</td>
|
1133 |
+
<td>0.6%</td>
|
1134 |
+
</tr>
|
1135 |
+
</table>
|
1136 |
+
<hr>
|
1137 |
+
</div>
|
1138 |
+
|
1139 |
+
<div class="table-container">
|
1140 |
+
<h2>Table 29</h2>
|
1141 |
+
<table border="1">
|
1142 |
+
<tr>
|
1143 |
+
<td>Sequence</td>
|
1144 |
+
<td>Sequence location</td>
|
1145 |
+
<td>Modification</td>
|
1146 |
+
<td>Relative abundance*</td>
|
1147 |
+
<td>Relative abundance*</td>
|
1148 |
+
</tr>
|
1149 |
+
<tr>
|
1150 |
+
<td>Sequence</td>
|
1151 |
+
<td>Sequence location</td>
|
1152 |
+
<td>Modification</td>
|
1153 |
+
<td>L14-H12_T0</td>
|
1154 |
+
<td>L14-H12_T4w</td>
|
1155 |
+
</tr>
|
1156 |
+
<tr>
|
1157 |
+
<td>STSGGTAALGCLVK</td>
|
1158 |
+
<td>HC (134-147)</td>
|
1159 |
+
<td></td>
|
1160 |
+
<td>99.9%</td>
|
1161 |
+
<td>98.9%</td>
|
1162 |
+
</tr>
|
1163 |
+
<tr>
|
1164 |
+
<td>GTAALGCLVK</td>
|
1165 |
+
<td>HC (134-147)</td>
|
1166 |
+
<td>Clipping</td>
|
1167 |
+
<td>0.1%</td>
|
1168 |
+
<td>1.1%</td>
|
1169 |
+
</tr>
|
1170 |
+
<tr>
|
1171 |
+
<td>SSSNPLTFGAGTK</td>
|
1172 |
+
<td>LC (91-103)</td>
|
1173 |
+
<td></td>
|
1174 |
+
<td>99.7%</td>
|
1175 |
+
<td>98.6%</td>
|
1176 |
+
</tr>
|
1177 |
+
<tr>
|
1178 |
+
<td>PLTFGAGTK</td>
|
1179 |
+
<td>LC (91-103)</td>
|
1180 |
+
<td>Clipping</td>
|
1181 |
+
<td>0.3%</td>
|
1182 |
+
<td>1.4%</td>
|
1183 |
+
</tr>
|
1184 |
+
</table>
|
1185 |
+
<hr>
|
1186 |
+
</div>
|
1187 |
+
|
1188 |
+
<div class="table-container">
|
1189 |
+
<h2>Table 30</h2>
|
1190 |
+
<table border="1">
|
1191 |
+
<tr>
|
1192 |
+
<td>Blue:</td>
|
1193 |
+
<td>VH and VL</td>
|
1194 |
+
</tr>
|
1195 |
+
<tr>
|
1196 |
+
<td>Blue:</td>
|
1197 |
+
<td>CDR</td>
|
1198 |
+
</tr>
|
1199 |
+
<tr>
|
1200 |
+
<td>Green:</td>
|
1201 |
+
<td>N-glycosylation site</td>
|
1202 |
+
</tr>
|
1203 |
+
</table>
|
1204 |
+
<hr>
|
1205 |
+
</div>
|
1206 |
+
|
1207 |
+
<div class="table-container">
|
1208 |
+
<h2>Table 31</h2>
|
1209 |
+
<table border="1">
|
1210 |
+
<tr>
|
1211 |
+
<td>Sequence</td>
|
1212 |
+
<td>Sequence location</td>
|
1213 |
+
<td>Modification</td>
|
1214 |
+
<td>Relative abundance</td>
|
1215 |
+
<td>Relative abundance</td>
|
1216 |
+
</tr>
|
1217 |
+
<tr>
|
1218 |
+
<td>Sequence</td>
|
1219 |
+
<td>Sequence location</td>
|
1220 |
+
<td>Modification</td>
|
1221 |
+
<td>L14-H31_T0</td>
|
1222 |
+
<td>L14-H31_T4w</td>
|
1223 |
+
</tr>
|
1224 |
+
<tr>
|
1225 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1226 |
+
<td>HC(001-038)</td>
|
1227 |
+
<td>pyroQ</td>
|
1228 |
+
<td>82.6%</td>
|
1229 |
+
<td>100.0%</td>
|
1230 |
+
</tr>
|
1231 |
+
<tr>
|
1232 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1233 |
+
<td>HC(001-038)</td>
|
1234 |
+
<td></td>
|
1235 |
+
<td>17.4%</td>
|
1236 |
+
<td>n.d</td>
|
1237 |
+
</tr>
|
1238 |
+
</table>
|
1239 |
+
<hr>
|
1240 |
+
</div>
|
1241 |
+
|
1242 |
+
<div class="table-container">
|
1243 |
+
<h2>Table 32</h2>
|
1244 |
+
<table border="1">
|
1245 |
+
<tr>
|
1246 |
+
<td>Sequence</td>
|
1247 |
+
<td>Sequence location</td>
|
1248 |
+
<td>Modification</td>
|
1249 |
+
<td>Relative abundance</td>
|
1250 |
+
<td>Relative abundance</td>
|
1251 |
+
</tr>
|
1252 |
+
<tr>
|
1253 |
+
<td>Sequence</td>
|
1254 |
+
<td>Sequence location</td>
|
1255 |
+
<td>Modification</td>
|
1256 |
+
<td>L14-H31_T0</td>
|
1257 |
+
<td>L14-H31_T4w</td>
|
1258 |
+
</tr>
|
1259 |
+
<tr>
|
1260 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1261 |
+
<td>LC(25-41)</td>
|
1262 |
+
<td>Ox. [+16 Da]</td>
|
1263 |
+
<td>0.5%</td>
|
1264 |
+
<td>0.4%</td>
|
1265 |
+
</tr>
|
1266 |
+
<tr>
|
1267 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1268 |
+
<td>LC(25-41)</td>
|
1269 |
+
<td></td>
|
1270 |
+
<td>99.5%</td>
|
1271 |
+
<td>99.6%</td>
|
1272 |
+
</tr>
|
1273 |
+
</table>
|
1274 |
+
<hr>
|
1275 |
+
</div>
|
1276 |
+
|
1277 |
+
<div class="table-container">
|
1278 |
+
<h2>Table 33</h2>
|
1279 |
+
<table border="1">
|
1280 |
+
<tr>
|
1281 |
+
<td>Sequence</td>
|
1282 |
+
<td>Sequence location</td>
|
1283 |
+
<td>Modification</td>
|
1284 |
+
<td>Relative abundance</td>
|
1285 |
+
<td>Relative abundance</td>
|
1286 |
+
</tr>
|
1287 |
+
<tr>
|
1288 |
+
<td>Sequence</td>
|
1289 |
+
<td>Sequence location</td>
|
1290 |
+
<td>Modification</td>
|
1291 |
+
<td>L14-H31_T0</td>
|
1292 |
+
<td>L14-H31_T4w</td>
|
1293 |
+
</tr>
|
1294 |
+
<tr>
|
1295 |
+
<td>SSSNPLTFGAGTK</td>
|
1296 |
+
<td>LC (91-103)</td>
|
1297 |
+
<td></td>
|
1298 |
+
<td>99.9%</td>
|
1299 |
+
<td>99.5%</td>
|
1300 |
+
</tr>
|
1301 |
+
<tr>
|
1302 |
+
<td>SSSNPLTFGAGTK</td>
|
1303 |
+
<td>LC (91-103)</td>
|
1304 |
+
<td>deamidation</td>
|
1305 |
+
<td>0.1%</td>
|
1306 |
+
<td>0.5%</td>
|
1307 |
+
</tr>
|
1308 |
+
</table>
|
1309 |
+
<hr>
|
1310 |
+
</div>
|
1311 |
+
|
1312 |
+
<div class="table-container">
|
1313 |
+
<h2>Table 34</h2>
|
1314 |
+
<table border="1">
|
1315 |
+
<tr>
|
1316 |
+
<td>Sequence</td>
|
1317 |
+
<td>Sequence location</td>
|
1318 |
+
<td>Modification</td>
|
1319 |
+
<td>Relative abundance*</td>
|
1320 |
+
<td>Relative abundance*</td>
|
1321 |
+
</tr>
|
1322 |
+
<tr>
|
1323 |
+
<td>Sequence</td>
|
1324 |
+
<td>Sequence location</td>
|
1325 |
+
<td>Modification</td>
|
1326 |
+
<td>L14-H31_T0</td>
|
1327 |
+
<td>L14-H31_T4w</td>
|
1328 |
+
</tr>
|
1329 |
+
<tr>
|
1330 |
+
<td>STSGGTAALGCLVK</td>
|
1331 |
+
<td>HC (134-147)</td>
|
1332 |
+
<td></td>
|
1333 |
+
<td>99.9%</td>
|
1334 |
+
<td>98.9%</td>
|
1335 |
+
</tr>
|
1336 |
+
<tr>
|
1337 |
+
<td>GTAALGCLVK</td>
|
1338 |
+
<td>HC (134-147)</td>
|
1339 |
+
<td>Clipping</td>
|
1340 |
+
<td>0.1%</td>
|
1341 |
+
<td>1.1%</td>
|
1342 |
+
</tr>
|
1343 |
+
<tr>
|
1344 |
+
<td>SSSNPLTFGAGTK</td>
|
1345 |
+
<td>LC (91-103)</td>
|
1346 |
+
<td></td>
|
1347 |
+
<td>99.7%</td>
|
1348 |
+
<td>98.4%</td>
|
1349 |
+
</tr>
|
1350 |
+
<tr>
|
1351 |
+
<td>PLTFGAGTK</td>
|
1352 |
+
<td>LC (91-103)</td>
|
1353 |
+
<td>Clipping</td>
|
1354 |
+
<td>0.3%</td>
|
1355 |
+
<td>1.6%</td>
|
1356 |
+
</tr>
|
1357 |
+
</table>
|
1358 |
+
<hr>
|
1359 |
+
</div>
|
1360 |
+
|
1361 |
+
<div class="table-container">
|
1362 |
+
<h2>Table 35</h2>
|
1363 |
+
<table border="1">
|
1364 |
+
<tr>
|
1365 |
+
<td>Blue:</td>
|
1366 |
+
<td>VH and VL</td>
|
1367 |
+
</tr>
|
1368 |
+
<tr>
|
1369 |
+
<td>Blue:</td>
|
1370 |
+
<td>CDR</td>
|
1371 |
+
</tr>
|
1372 |
+
<tr>
|
1373 |
+
<td>Green:</td>
|
1374 |
+
<td>N-glycosylation site</td>
|
1375 |
+
</tr>
|
1376 |
+
</table>
|
1377 |
+
<hr>
|
1378 |
+
</div>
|
1379 |
+
|
1380 |
+
<div class="table-container">
|
1381 |
+
<h2>Table 36</h2>
|
1382 |
+
<table border="1">
|
1383 |
+
<tr>
|
1384 |
+
<td>Nathan Cardon</td>
|
1385 |
+
<td>Date:</td>
|
1386 |
+
</tr>
|
1387 |
+
<tr>
|
1388 |
+
<td>Sr Research Associate</td>
|
1389 |
+
<td>Signature:</td>
|
1390 |
+
</tr>
|
1391 |
+
<tr>
|
1392 |
+
<td>Mabelle Meersseman</td>
|
1393 |
+
<td>Date:</td>
|
1394 |
+
</tr>
|
1395 |
+
<tr>
|
1396 |
+
<td>Group Leader</td>
|
1397 |
+
<td>Signature:</td>
|
1398 |
+
</tr>
|
1399 |
+
<tr>
|
1400 |
+
<td>Approver</td>
|
1401 |
+
<td></td>
|
1402 |
+
</tr>
|
1403 |
+
<tr>
|
1404 |
+
<td>Koen Sandra Ph.D.</td>
|
1405 |
+
<td>Date:</td>
|
1406 |
+
</tr>
|
1407 |
+
<tr>
|
1408 |
+
<td>CEO</td>
|
1409 |
+
<td>Signature:</td>
|
1410 |
+
</tr>
|
1411 |
+
</table>
|
1412 |
+
<hr>
|
1413 |
+
</div>
|
1414 |
+
|
1415 |
+
<div class="table-container">
|
1416 |
+
<h2>Table 37</h2>
|
1417 |
+
<table border="1">
|
1418 |
+
<tr>
|
1419 |
+
<td>Version</td>
|
1420 |
+
<td>Date of issue</td>
|
1421 |
+
<td>Reason for version update</td>
|
1422 |
+
</tr>
|
1423 |
+
<tr>
|
1424 |
+
<td>00</td>
|
1425 |
+
<td>25NOV24</td>
|
1426 |
+
<td>Draft</td>
|
1427 |
+
</tr>
|
1428 |
+
<tr>
|
1429 |
+
<td></td>
|
1430 |
+
<td></td>
|
1431 |
+
<td></td>
|
1432 |
+
</tr>
|
1433 |
+
<tr>
|
1434 |
+
<td></td>
|
1435 |
+
<td></td>
|
1436 |
+
<td></td>
|
1437 |
+
</tr>
|
1438 |
+
</table>
|
1439 |
+
<hr>
|
1440 |
+
</div>
|
1441 |
+
</body></html>
|
logs/di_content/di_content_20250617_125833_tables.html
ADDED
@@ -0,0 +1,1441 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Azure DI Tables</title>
|
5 |
+
<style>
|
6 |
+
body { font-family: Arial, sans-serif; margin: 20px; }
|
7 |
+
.table-container { margin-bottom: 40px; }
|
8 |
+
h2 { color: #333; }
|
9 |
+
table { border-collapse: collapse; width: 100%; margin-bottom: 10px; }
|
10 |
+
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
11 |
+
th { background-color: #f5f5f5; }
|
12 |
+
hr { border: none; border-top: 2px solid #ccc; margin: 20px 0; }
|
13 |
+
</style>
|
14 |
+
</head>
|
15 |
+
<body>
|
16 |
+
<h1>Azure Document Intelligence Tables</h1>
|
17 |
+
|
18 |
+
<div class="table-container">
|
19 |
+
<h2>Table 1</h2>
|
20 |
+
<table border="1">
|
21 |
+
<tr>
|
22 |
+
<td>l Sales quote:</td>
|
23 |
+
<td>SQ20202722</td>
|
24 |
+
</tr>
|
25 |
+
<tr>
|
26 |
+
<td>l Project code:</td>
|
27 |
+
<td>P3016</td>
|
28 |
+
</tr>
|
29 |
+
<tr>
|
30 |
+
<td>l LNB number:</td>
|
31 |
+
<td>2023.050</td>
|
32 |
+
</tr>
|
33 |
+
<tr>
|
34 |
+
<td>l Project responsible:</td>
|
35 |
+
<td>Nathan Cardon</td>
|
36 |
+
</tr>
|
37 |
+
<tr>
|
38 |
+
<td>l Report name:</td>
|
39 |
+
<td>P3016_R11_v00</td>
|
40 |
+
</tr>
|
41 |
+
</table>
|
42 |
+
<hr>
|
43 |
+
</div>
|
44 |
+
|
45 |
+
<div class="table-container">
|
46 |
+
<h2>Table 2</h2>
|
47 |
+
<table border="1">
|
48 |
+
<tr>
|
49 |
+
<td>Test sample ID client</td>
|
50 |
+
<td>Test sample ID RIC</td>
|
51 |
+
<td>Protein concentration (mg/ML)</td>
|
52 |
+
</tr>
|
53 |
+
<tr>
|
54 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
55 |
+
<td>aFH0.7_T0</td>
|
56 |
+
<td>1.0</td>
|
57 |
+
</tr>
|
58 |
+
<tr>
|
59 |
+
<td>P066_FH0.7-0-hulgG-LALAPG-FJB</td>
|
60 |
+
<td>aFH.07_T4W</td>
|
61 |
+
<td>1.0</td>
|
62 |
+
</tr>
|
63 |
+
<tr>
|
64 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
65 |
+
<td>FHR-1.3B4_T0</td>
|
66 |
+
<td>1.0</td>
|
67 |
+
</tr>
|
68 |
+
<tr>
|
69 |
+
<td>P066_FHR-1.3B4_0-hulgG-LALAPG-FJB</td>
|
70 |
+
<td>FHR-1.3B4_T4W</td>
|
71 |
+
<td>1.0</td>
|
72 |
+
</tr>
|
73 |
+
<tr>
|
74 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
75 |
+
<td>L5_H12_T0</td>
|
76 |
+
<td>1.0</td>
|
77 |
+
</tr>
|
78 |
+
<tr>
|
79 |
+
<td>P066_L5_H12_0-hulgG-LALAPG-FJB</td>
|
80 |
+
<td>L5_H12_T4W</td>
|
81 |
+
<td>1.0</td>
|
82 |
+
</tr>
|
83 |
+
<tr>
|
84 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
85 |
+
<td>L5_H31_T0</td>
|
86 |
+
<td>1.0</td>
|
87 |
+
</tr>
|
88 |
+
<tr>
|
89 |
+
<td>P066_L5_H31-0-hulgG-LALAPG-FJB</td>
|
90 |
+
<td>L5_H31_T4W</td>
|
91 |
+
<td>1.0</td>
|
92 |
+
</tr>
|
93 |
+
<tr>
|
94 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
95 |
+
<td>L14_H12_T0</td>
|
96 |
+
<td>1.0</td>
|
97 |
+
</tr>
|
98 |
+
<tr>
|
99 |
+
<td>P066_L14_H12_0-hulgG-LALAPG-FJB</td>
|
100 |
+
<td>L14_H12_T4W</td>
|
101 |
+
<td>1.0</td>
|
102 |
+
</tr>
|
103 |
+
<tr>
|
104 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
105 |
+
<td>L14_H31_T0</td>
|
106 |
+
<td>1.0</td>
|
107 |
+
</tr>
|
108 |
+
<tr>
|
109 |
+
<td>P066_L14_H31_0-hulgG-LALAPG-FJB</td>
|
110 |
+
<td>L14-H31_T4W</td>
|
111 |
+
<td>1.0</td>
|
112 |
+
</tr>
|
113 |
+
</table>
|
114 |
+
<hr>
|
115 |
+
</div>
|
116 |
+
|
117 |
+
<div class="table-container">
|
118 |
+
<h2>Table 3</h2>
|
119 |
+
<table border="1">
|
120 |
+
<tr>
|
121 |
+
<td></td>
|
122 |
+
<td>aFH.07_T0</td>
|
123 |
+
<td>aFH.07_T4W</td>
|
124 |
+
</tr>
|
125 |
+
<tr>
|
126 |
+
<td>G0-GlcNAc</td>
|
127 |
+
<td>5.0%</td>
|
128 |
+
<td>4.5%</td>
|
129 |
+
</tr>
|
130 |
+
<tr>
|
131 |
+
<td>Man5</td>
|
132 |
+
<td>56.1%</td>
|
133 |
+
<td>56.3%</td>
|
134 |
+
</tr>
|
135 |
+
<tr>
|
136 |
+
<td>Man6</td>
|
137 |
+
<td>17.6%</td>
|
138 |
+
<td>17.4%</td>
|
139 |
+
</tr>
|
140 |
+
<tr>
|
141 |
+
<td>Man7</td>
|
142 |
+
<td>20.7%</td>
|
143 |
+
<td>21.6%</td>
|
144 |
+
</tr>
|
145 |
+
<tr>
|
146 |
+
<td>Man8</td>
|
147 |
+
<td>0.6%</td>
|
148 |
+
<td>0.2%</td>
|
149 |
+
</tr>
|
150 |
+
</table>
|
151 |
+
<hr>
|
152 |
+
</div>
|
153 |
+
|
154 |
+
<div class="table-container">
|
155 |
+
<h2>Table 4</h2>
|
156 |
+
<table border="1">
|
157 |
+
<tr>
|
158 |
+
<td></td>
|
159 |
+
<td>aFH.07_T0</td>
|
160 |
+
<td>aFH.07_T4W</td>
|
161 |
+
</tr>
|
162 |
+
<tr>
|
163 |
+
<td>Unknown peak</td>
|
164 |
+
<td>0.6%</td>
|
165 |
+
<td>1.3%</td>
|
166 |
+
</tr>
|
167 |
+
<tr>
|
168 |
+
<td>HC [G0F/G0] - 2*GlcNAc</td>
|
169 |
+
<td>1.5%</td>
|
170 |
+
<td>2.0%</td>
|
171 |
+
</tr>
|
172 |
+
<tr>
|
173 |
+
<td>HC [Man5-Man5]</td>
|
174 |
+
<td>16.7%</td>
|
175 |
+
<td>16.5%</td>
|
176 |
+
</tr>
|
177 |
+
<tr>
|
178 |
+
<td>HC [G0F-Man5]</td>
|
179 |
+
<td>10.9%</td>
|
180 |
+
<td>11.9%</td>
|
181 |
+
</tr>
|
182 |
+
<tr>
|
183 |
+
<td>HC [G0F/G0] - GlcNAc</td>
|
184 |
+
<td>16.5%</td>
|
185 |
+
<td>17.2%</td>
|
186 |
+
</tr>
|
187 |
+
<tr>
|
188 |
+
<td>HC [G0F/G0]</td>
|
189 |
+
<td>6.5%</td>
|
190 |
+
<td>6.0%</td>
|
191 |
+
</tr>
|
192 |
+
<tr>
|
193 |
+
<td>HC [G0F/G0F]</td>
|
194 |
+
<td>35.5%</td>
|
195 |
+
<td>33.8%</td>
|
196 |
+
</tr>
|
197 |
+
<tr>
|
198 |
+
<td>HC [G0F/G1F]</td>
|
199 |
+
<td>6.5%</td>
|
200 |
+
<td>5.9%</td>
|
201 |
+
</tr>
|
202 |
+
<tr>
|
203 |
+
<td>HC [G1F/G1F] or HC [G0F/G2F]</td>
|
204 |
+
<td>5.0%</td>
|
205 |
+
<td>4.8%</td>
|
206 |
+
</tr>
|
207 |
+
<tr>
|
208 |
+
<td>HC [G1F/G2F]</td>
|
209 |
+
<td>0.3%</td>
|
210 |
+
<td>0.6%</td>
|
211 |
+
</tr>
|
212 |
+
</table>
|
213 |
+
<hr>
|
214 |
+
</div>
|
215 |
+
|
216 |
+
<div class="table-container">
|
217 |
+
<h2>Table 5</h2>
|
218 |
+
<table border="1">
|
219 |
+
<tr>
|
220 |
+
<td>Sequence</td>
|
221 |
+
<td>Sequence location</td>
|
222 |
+
<td>Modification</td>
|
223 |
+
<td>Relative abundance</td>
|
224 |
+
<td>Relative abundance</td>
|
225 |
+
</tr>
|
226 |
+
<tr>
|
227 |
+
<td>Sequence</td>
|
228 |
+
<td>Sequence location</td>
|
229 |
+
<td>Modification</td>
|
230 |
+
<td>aFH.07_T0</td>
|
231 |
+
<td>aFH.07_T4W</td>
|
232 |
+
</tr>
|
233 |
+
<tr>
|
234 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
235 |
+
<td>LC (001-018)</td>
|
236 |
+
<td>pyroQ</td>
|
237 |
+
<td>86.8%</td>
|
238 |
+
<td>99.7%</td>
|
239 |
+
</tr>
|
240 |
+
<tr>
|
241 |
+
<td>QIVLSQSPTFLSASPGEK</td>
|
242 |
+
<td>LC (001-018)</td>
|
243 |
+
<td></td>
|
244 |
+
<td>13.2%</td>
|
245 |
+
<td>0.3%</td>
|
246 |
+
</tr>
|
247 |
+
<tr>
|
248 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
249 |
+
<td>HC (001-031)</td>
|
250 |
+
<td>pyroQ</td>
|
251 |
+
<td>90.0%</td>
|
252 |
+
<td>100.0%</td>
|
253 |
+
</tr>
|
254 |
+
<tr>
|
255 |
+
<td>QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR</td>
|
256 |
+
<td>HC (001-031)</td>
|
257 |
+
<td></td>
|
258 |
+
<td>10.0%</td>
|
259 |
+
<td>n.d</td>
|
260 |
+
</tr>
|
261 |
+
</table>
|
262 |
+
<hr>
|
263 |
+
</div>
|
264 |
+
|
265 |
+
<div class="table-container">
|
266 |
+
<h2>Table 6</h2>
|
267 |
+
<table border="1">
|
268 |
+
<tr>
|
269 |
+
<td>Sequence</td>
|
270 |
+
<td>Sequence location</td>
|
271 |
+
<td>Modification</td>
|
272 |
+
<td>Relative abundance</td>
|
273 |
+
<td>Relative abundance</td>
|
274 |
+
</tr>
|
275 |
+
<tr>
|
276 |
+
<td>Sequence</td>
|
277 |
+
<td>Sequence location</td>
|
278 |
+
<td>Modification</td>
|
279 |
+
<td>aFH.07_T0</td>
|
280 |
+
<td>aFH.07_T4W</td>
|
281 |
+
</tr>
|
282 |
+
<tr>
|
283 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
284 |
+
<td>LC (31-60)</td>
|
285 |
+
<td>Oxidation [+16 Da]</td>
|
286 |
+
<td>0.9%</td>
|
287 |
+
<td>1.0%</td>
|
288 |
+
</tr>
|
289 |
+
<tr>
|
290 |
+
<td>YMHWYQQKPGASPKPWIFATSNLASGVPAR</td>
|
291 |
+
<td>LC (31-60)</td>
|
292 |
+
<td></td>
|
293 |
+
<td>99.1%</td>
|
294 |
+
<td>99.0%</td>
|
295 |
+
</tr>
|
296 |
+
</table>
|
297 |
+
<hr>
|
298 |
+
</div>
|
299 |
+
|
300 |
+
<div class="table-container">
|
301 |
+
<h2>Table 7</h2>
|
302 |
+
<table border="1">
|
303 |
+
<tr>
|
304 |
+
<td>Sequence</td>
|
305 |
+
<td>Sequence location</td>
|
306 |
+
<td>Modification</td>
|
307 |
+
<td>Relative abundance</td>
|
308 |
+
<td>Relative abundance</td>
|
309 |
+
</tr>
|
310 |
+
<tr>
|
311 |
+
<td>Sequence</td>
|
312 |
+
<td>Sequence location</td>
|
313 |
+
<td>Modification</td>
|
314 |
+
<td>aFH.07_T0</td>
|
315 |
+
<td>aFH.07_T4W</td>
|
316 |
+
</tr>
|
317 |
+
<tr>
|
318 |
+
<td>LNINKDNSK</td>
|
319 |
+
<td>HC (72-75)</td>
|
320 |
+
<td></td>
|
321 |
+
<td>99.5%</td>
|
322 |
+
<td>98.9%</td>
|
323 |
+
</tr>
|
324 |
+
<tr>
|
325 |
+
<td>LNINKDNSK</td>
|
326 |
+
<td>HC (72-75)</td>
|
327 |
+
<td>Deamidation</td>
|
328 |
+
<td>0.5%</td>
|
329 |
+
<td>1.1%</td>
|
330 |
+
</tr>
|
331 |
+
</table>
|
332 |
+
<hr>
|
333 |
+
</div>
|
334 |
+
|
335 |
+
<div class="table-container">
|
336 |
+
<h2>Table 8</h2>
|
337 |
+
<table border="1">
|
338 |
+
<tr>
|
339 |
+
<td>Sequence</td>
|
340 |
+
<td>Sequence location</td>
|
341 |
+
<td>Modification</td>
|
342 |
+
<td>Relative abundance</td>
|
343 |
+
<td>Relative abundance</td>
|
344 |
+
</tr>
|
345 |
+
<tr>
|
346 |
+
<td>Sequence</td>
|
347 |
+
<td>Sequence location</td>
|
348 |
+
<td>Modification</td>
|
349 |
+
<td>aFH.07_T0</td>
|
350 |
+
<td>aFH.07_T4W</td>
|
351 |
+
</tr>
|
352 |
+
<tr>
|
353 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
354 |
+
<td>LC (77-102)</td>
|
355 |
+
<td>GO-GICNAc</td>
|
356 |
+
<td>2.6%</td>
|
357 |
+
<td>4.0%</td>
|
358 |
+
</tr>
|
359 |
+
<tr>
|
360 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
361 |
+
<td>LC (77-102)</td>
|
362 |
+
<td>Man5</td>
|
363 |
+
<td>54.9%</td>
|
364 |
+
<td>57.3%</td>
|
365 |
+
</tr>
|
366 |
+
<tr>
|
367 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
368 |
+
<td>LC (77-102)</td>
|
369 |
+
<td>Man6</td>
|
370 |
+
<td>21.1%</td>
|
371 |
+
<td>18.8%</td>
|
372 |
+
</tr>
|
373 |
+
<tr>
|
374 |
+
<td>VEAEDAATYYCQQWSIIPPTFGNGTK</td>
|
375 |
+
<td>LC (77-102)</td>
|
376 |
+
<td>Man7</td>
|
377 |
+
<td>21.4%</td>
|
378 |
+
<td>20.0%</td>
|
379 |
+
</tr>
|
380 |
+
</table>
|
381 |
+
<hr>
|
382 |
+
</div>
|
383 |
+
|
384 |
+
<div class="table-container">
|
385 |
+
<h2>Table 9</h2>
|
386 |
+
<table border="1">
|
387 |
+
<tr>
|
388 |
+
<td>Sequence</td>
|
389 |
+
<td>Sequence location</td>
|
390 |
+
<td>Modification</td>
|
391 |
+
<td>Relative abundance</td>
|
392 |
+
<td>Relative abundance</td>
|
393 |
+
</tr>
|
394 |
+
<tr>
|
395 |
+
<td>Sequence</td>
|
396 |
+
<td>Sequence location</td>
|
397 |
+
<td>Modification</td>
|
398 |
+
<td>aFH.07_T0</td>
|
399 |
+
<td>aFH.07_T4W</td>
|
400 |
+
</tr>
|
401 |
+
<tr>
|
402 |
+
<td>MNSLQANDTAIYYCAR</td>
|
403 |
+
<td>HC (82-97)</td>
|
404 |
+
<td>Non glycosylated</td>
|
405 |
+
<td>n.d</td>
|
406 |
+
<td>n.d</td>
|
407 |
+
</tr>
|
408 |
+
<tr>
|
409 |
+
<td>MNSLQANDTAIYYCAR</td>
|
410 |
+
<td>HC (82-97)</td>
|
411 |
+
<td>G0F-GlcNAc</td>
|
412 |
+
<td>16.3%</td>
|
413 |
+
<td>20.8%</td>
|
414 |
+
</tr>
|
415 |
+
<tr>
|
416 |
+
<td>MNSLQANDTAIYYCAR</td>
|
417 |
+
<td>HC (82-97)</td>
|
418 |
+
<td>G0</td>
|
419 |
+
<td>4.2%</td>
|
420 |
+
<td>3.7%</td>
|
421 |
+
</tr>
|
422 |
+
<tr>
|
423 |
+
<td>MNSLQANDTAIYYCAR</td>
|
424 |
+
<td>HC (82-97)</td>
|
425 |
+
<td>G0F</td>
|
426 |
+
<td>36.5%</td>
|
427 |
+
<td>34.0%</td>
|
428 |
+
</tr>
|
429 |
+
<tr>
|
430 |
+
<td>MNSLQANDTAIYYCAR</td>
|
431 |
+
<td>HC (82-97)</td>
|
432 |
+
<td>G1F</td>
|
433 |
+
<td>4.9%</td>
|
434 |
+
<td>5.1%</td>
|
435 |
+
</tr>
|
436 |
+
<tr>
|
437 |
+
<td>MNSLQANDTAIYYCAR</td>
|
438 |
+
<td>HC (82-97)</td>
|
439 |
+
<td>G2F</td>
|
440 |
+
<td>5.7%</td>
|
441 |
+
<td>4.8%</td>
|
442 |
+
</tr>
|
443 |
+
<tr>
|
444 |
+
<td>MNSLQANDTAIYYCAR</td>
|
445 |
+
<td>HC (82-97)</td>
|
446 |
+
<td>Man5</td>
|
447 |
+
<td>32.4%</td>
|
448 |
+
<td>31.5%</td>
|
449 |
+
</tr>
|
450 |
+
</table>
|
451 |
+
<hr>
|
452 |
+
</div>
|
453 |
+
|
454 |
+
<div class="table-container">
|
455 |
+
<h2>Table 10</h2>
|
456 |
+
<table border="1">
|
457 |
+
<tr>
|
458 |
+
<td>Sequence</td>
|
459 |
+
<td>Sequence location</td>
|
460 |
+
<td>Modification</td>
|
461 |
+
<td>Relative abundance</td>
|
462 |
+
<td>Relative abundance</td>
|
463 |
+
</tr>
|
464 |
+
<tr>
|
465 |
+
<td>Sequence</td>
|
466 |
+
<td>Sequence location</td>
|
467 |
+
<td>Modification</td>
|
468 |
+
<td>aFH.07_T0</td>
|
469 |
+
<td>aFH.07_T4W</td>
|
470 |
+
</tr>
|
471 |
+
<tr>
|
472 |
+
<td>EEQYNSTYR</td>
|
473 |
+
<td>HC (293-301)</td>
|
474 |
+
<td>Non glycosylated</td>
|
475 |
+
<td>n.d</td>
|
476 |
+
<td>n.d</td>
|
477 |
+
</tr>
|
478 |
+
<tr>
|
479 |
+
<td>EEQYNSTYR</td>
|
480 |
+
<td>HC (293-301)</td>
|
481 |
+
<td>Man5</td>
|
482 |
+
<td>20.9%</td>
|
483 |
+
<td>22.5%</td>
|
484 |
+
</tr>
|
485 |
+
<tr>
|
486 |
+
<td>EEQYNSTYR</td>
|
487 |
+
<td>HC (293-301)</td>
|
488 |
+
<td>G0</td>
|
489 |
+
<td>n.D</td>
|
490 |
+
<td>n.d</td>
|
491 |
+
</tr>
|
492 |
+
<tr>
|
493 |
+
<td>EEQYNSTYR</td>
|
494 |
+
<td>HC (293-301)</td>
|
495 |
+
<td>G0F</td>
|
496 |
+
<td>79.1%</td>
|
497 |
+
<td>77.5%</td>
|
498 |
+
</tr>
|
499 |
+
<tr>
|
500 |
+
<td>EEQYNSTYR</td>
|
501 |
+
<td>HC (293-301)</td>
|
502 |
+
<td>G1F</td>
|
503 |
+
<td>n.d</td>
|
504 |
+
<td>n.d</td>
|
505 |
+
</tr>
|
506 |
+
<tr>
|
507 |
+
<td>EEQYNSTYR</td>
|
508 |
+
<td>HC (293-301)</td>
|
509 |
+
<td>G2F</td>
|
510 |
+
<td>n.d</td>
|
511 |
+
<td>n.d</td>
|
512 |
+
</tr>
|
513 |
+
</table>
|
514 |
+
<hr>
|
515 |
+
</div>
|
516 |
+
|
517 |
+
<div class="table-container">
|
518 |
+
<h2>Table 11</h2>
|
519 |
+
<table border="1">
|
520 |
+
<tr>
|
521 |
+
<td>Sequence</td>
|
522 |
+
<td>Sequence location</td>
|
523 |
+
<td>Modification</td>
|
524 |
+
<td>Relative abundance*</td>
|
525 |
+
<td>Relative abundance*</td>
|
526 |
+
</tr>
|
527 |
+
<tr>
|
528 |
+
<td>Sequence</td>
|
529 |
+
<td>Sequence location</td>
|
530 |
+
<td>Modification</td>
|
531 |
+
<td>aFH.07_T0</td>
|
532 |
+
<td>aFH.07_T4W</td>
|
533 |
+
</tr>
|
534 |
+
<tr>
|
535 |
+
<td>STSGGTAALGCLVK</td>
|
536 |
+
<td>HC (134-147)</td>
|
537 |
+
<td></td>
|
538 |
+
<td>99.9%</td>
|
539 |
+
<td>98.8%</td>
|
540 |
+
</tr>
|
541 |
+
<tr>
|
542 |
+
<td>GTAALGCLVK</td>
|
543 |
+
<td>HC (134-147)</td>
|
544 |
+
<td>Clipping</td>
|
545 |
+
<td>0.1%</td>
|
546 |
+
<td>1.2%</td>
|
547 |
+
</tr>
|
548 |
+
</table>
|
549 |
+
<hr>
|
550 |
+
</div>
|
551 |
+
|
552 |
+
<div class="table-container">
|
553 |
+
<h2>Table 12</h2>
|
554 |
+
<table border="1">
|
555 |
+
<tr>
|
556 |
+
<td>Blue:</td>
|
557 |
+
<td>VH and VL</td>
|
558 |
+
</tr>
|
559 |
+
<tr>
|
560 |
+
<td>Blue:</td>
|
561 |
+
<td>CDR</td>
|
562 |
+
</tr>
|
563 |
+
<tr>
|
564 |
+
<td>Green:</td>
|
565 |
+
<td>N-glycosylation site</td>
|
566 |
+
</tr>
|
567 |
+
</table>
|
568 |
+
<hr>
|
569 |
+
</div>
|
570 |
+
|
571 |
+
<div class="table-container">
|
572 |
+
<h2>Table 13</h2>
|
573 |
+
<table border="1">
|
574 |
+
<tr>
|
575 |
+
<td>Sequence</td>
|
576 |
+
<td>Sequence location</td>
|
577 |
+
<td>Modification</td>
|
578 |
+
<td>Relative abundance</td>
|
579 |
+
<td>Relative abundance</td>
|
580 |
+
</tr>
|
581 |
+
<tr>
|
582 |
+
<td>Sequence</td>
|
583 |
+
<td>Sequence location</td>
|
584 |
+
<td>Modification</td>
|
585 |
+
<td>FHR-1.3B4_T0</td>
|
586 |
+
<td>FHR-1.3B4_T4W</td>
|
587 |
+
</tr>
|
588 |
+
<tr>
|
589 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
590 |
+
<td>LC (1-18)</td>
|
591 |
+
<td>pyro Q</td>
|
592 |
+
<td>96.1%</td>
|
593 |
+
<td>100.0%</td>
|
594 |
+
</tr>
|
595 |
+
<tr>
|
596 |
+
<td>QIVLSQSPTILSASPGEK</td>
|
597 |
+
<td>LC (1-18)</td>
|
598 |
+
<td></td>
|
599 |
+
<td>3.9%</td>
|
600 |
+
<td>n.d</td>
|
601 |
+
</tr>
|
602 |
+
<tr>
|
603 |
+
<td>QVQLR</td>
|
604 |
+
<td>HC (1-5)</td>
|
605 |
+
<td>pyro Q</td>
|
606 |
+
<td>96.7%</td>
|
607 |
+
<td>100.0%</td>
|
608 |
+
</tr>
|
609 |
+
<tr>
|
610 |
+
<td>QVQLR</td>
|
611 |
+
<td>HC (1-5)</td>
|
612 |
+
<td></td>
|
613 |
+
<td>3.3%</td>
|
614 |
+
<td>n.d</td>
|
615 |
+
</tr>
|
616 |
+
</table>
|
617 |
+
<hr>
|
618 |
+
</div>
|
619 |
+
|
620 |
+
<div class="table-container">
|
621 |
+
<h2>Table 14</h2>
|
622 |
+
<table border="1">
|
623 |
+
<tr>
|
624 |
+
<td>Sequence</td>
|
625 |
+
<td>Sequence location</td>
|
626 |
+
<td>Modification</td>
|
627 |
+
<td>Relative abundance</td>
|
628 |
+
<td>Relative abundance</td>
|
629 |
+
</tr>
|
630 |
+
<tr>
|
631 |
+
<td>Sequence</td>
|
632 |
+
<td>Sequence location</td>
|
633 |
+
<td>Modification</td>
|
634 |
+
<td>FHR-1.3B4_T0</td>
|
635 |
+
<td>FHR-1.3B4_T4W</td>
|
636 |
+
</tr>
|
637 |
+
<tr>
|
638 |
+
<td>MNSLQADDTAIYYCAR</td>
|
639 |
+
<td>HC (82-97)</td>
|
640 |
+
<td></td>
|
641 |
+
<td>99.3%</td>
|
642 |
+
<td>99.0%</td>
|
643 |
+
</tr>
|
644 |
+
<tr>
|
645 |
+
<td>MNSLQADDTAIYYCAR</td>
|
646 |
+
<td>HC (82-97)</td>
|
647 |
+
<td>Ox [+ 16 Da]</td>
|
648 |
+
<td>0.7%</td>
|
649 |
+
<td>1.0%</td>
|
650 |
+
</tr>
|
651 |
+
</table>
|
652 |
+
<hr>
|
653 |
+
</div>
|
654 |
+
|
655 |
+
<div class="table-container">
|
656 |
+
<h2>Table 15</h2>
|
657 |
+
<table border="1">
|
658 |
+
<tr>
|
659 |
+
<td>Sequence</td>
|
660 |
+
<td>Sequence location</td>
|
661 |
+
<td>Modification</td>
|
662 |
+
<td>Relative abundance</td>
|
663 |
+
<td>Relative abundance</td>
|
664 |
+
</tr>
|
665 |
+
<tr>
|
666 |
+
<td>Sequence</td>
|
667 |
+
<td>Sequence location</td>
|
668 |
+
<td>Modification</td>
|
669 |
+
<td>FHR-1.3B4_T0</td>
|
670 |
+
<td>FHR-1.3B4_T4W</td>
|
671 |
+
</tr>
|
672 |
+
<tr>
|
673 |
+
<td>MNSLQADDTAIYYCAR</td>
|
674 |
+
<td>HC (82-97)</td>
|
675 |
+
<td></td>
|
676 |
+
<td>97.6%</td>
|
677 |
+
<td>79.7%</td>
|
678 |
+
</tr>
|
679 |
+
<tr>
|
680 |
+
<td>MNSLQADDTAIYYCAR</td>
|
681 |
+
<td>HC (82-97)</td>
|
682 |
+
<td>Deamidation</td>
|
683 |
+
<td>2.4%</td>
|
684 |
+
<td>20.3%</td>
|
685 |
+
</tr>
|
686 |
+
</table>
|
687 |
+
<hr>
|
688 |
+
</div>
|
689 |
+
|
690 |
+
<div class="table-container">
|
691 |
+
<h2>Table 16</h2>
|
692 |
+
<table border="1">
|
693 |
+
<tr>
|
694 |
+
<td>Sequence</td>
|
695 |
+
<td>Sequence location</td>
|
696 |
+
<td>Modification</td>
|
697 |
+
<td>Relative abundance*</td>
|
698 |
+
<td>Relative abundance*</td>
|
699 |
+
</tr>
|
700 |
+
<tr>
|
701 |
+
<td>Sequence</td>
|
702 |
+
<td>Sequence location</td>
|
703 |
+
<td>Modification</td>
|
704 |
+
<td>FHR-1.3B4_T0</td>
|
705 |
+
<td>FHR-1.3B4_T4W</td>
|
706 |
+
</tr>
|
707 |
+
<tr>
|
708 |
+
<td>STSGGTAALGCLVK</td>
|
709 |
+
<td>HC (134-147)</td>
|
710 |
+
<td></td>
|
711 |
+
<td>99.9%</td>
|
712 |
+
<td>98.7%</td>
|
713 |
+
</tr>
|
714 |
+
<tr>
|
715 |
+
<td>GTAALGCLVK</td>
|
716 |
+
<td>HC (134-147)</td>
|
717 |
+
<td>Clipping</td>
|
718 |
+
<td>0.1%</td>
|
719 |
+
<td>1.3%</td>
|
720 |
+
</tr>
|
721 |
+
<tr>
|
722 |
+
<td>SSSNPLTFGAGTK</td>
|
723 |
+
<td>LC (91-103)</td>
|
724 |
+
<td></td>
|
725 |
+
<td>99.5%</td>
|
726 |
+
<td>97.3%</td>
|
727 |
+
</tr>
|
728 |
+
<tr>
|
729 |
+
<td>PLTFGAGTK</td>
|
730 |
+
<td>LC (91-103)</td>
|
731 |
+
<td>Clipping</td>
|
732 |
+
<td>0.5%</td>
|
733 |
+
<td>2.7%</td>
|
734 |
+
</tr>
|
735 |
+
</table>
|
736 |
+
<hr>
|
737 |
+
</div>
|
738 |
+
|
739 |
+
<div class="table-container">
|
740 |
+
<h2>Table 17</h2>
|
741 |
+
<table border="1">
|
742 |
+
<tr>
|
743 |
+
<td>Blue:</td>
|
744 |
+
<td>VH and VL</td>
|
745 |
+
</tr>
|
746 |
+
<tr>
|
747 |
+
<td>Blue:</td>
|
748 |
+
<td>CDR</td>
|
749 |
+
</tr>
|
750 |
+
<tr>
|
751 |
+
<td>Green:</td>
|
752 |
+
<td>N-glycosylation site</td>
|
753 |
+
</tr>
|
754 |
+
</table>
|
755 |
+
<hr>
|
756 |
+
</div>
|
757 |
+
|
758 |
+
<div class="table-container">
|
759 |
+
<h2>Table 18</h2>
|
760 |
+
<table border="1">
|
761 |
+
<tr>
|
762 |
+
<td>Sequence</td>
|
763 |
+
<td>Sequence location</td>
|
764 |
+
<td>Modification</td>
|
765 |
+
<td>Relative abundance</td>
|
766 |
+
<td>Relative abundance</td>
|
767 |
+
</tr>
|
768 |
+
<tr>
|
769 |
+
<td>Sequence</td>
|
770 |
+
<td>Sequence location</td>
|
771 |
+
<td>Modification</td>
|
772 |
+
<td>L5-H12_T0</td>
|
773 |
+
<td>L5-H12_T4w</td>
|
774 |
+
</tr>
|
775 |
+
<tr>
|
776 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
777 |
+
<td>HC (001-038)</td>
|
778 |
+
<td>pyro Q</td>
|
779 |
+
<td>85.5%</td>
|
780 |
+
<td>99.3%</td>
|
781 |
+
</tr>
|
782 |
+
<tr>
|
783 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
784 |
+
<td>HC (001-038)</td>
|
785 |
+
<td></td>
|
786 |
+
<td>14.5%</td>
|
787 |
+
<td>0.7%</td>
|
788 |
+
</tr>
|
789 |
+
</table>
|
790 |
+
<hr>
|
791 |
+
</div>
|
792 |
+
|
793 |
+
<div class="table-container">
|
794 |
+
<h2>Table 19</h2>
|
795 |
+
<table border="1">
|
796 |
+
<tr>
|
797 |
+
<td>Sequence</td>
|
798 |
+
<td>Sequence location</td>
|
799 |
+
<td>Modification</td>
|
800 |
+
<td>Relative abundance*</td>
|
801 |
+
<td>Relative abundance*</td>
|
802 |
+
</tr>
|
803 |
+
<tr>
|
804 |
+
<td>Sequence</td>
|
805 |
+
<td>Sequence location</td>
|
806 |
+
<td>Modification</td>
|
807 |
+
<td>L5-H12_T0</td>
|
808 |
+
<td>L5-H12_T4w</td>
|
809 |
+
</tr>
|
810 |
+
<tr>
|
811 |
+
<td>STSGGTAALGCLVK</td>
|
812 |
+
<td>HC (134-147)</td>
|
813 |
+
<td></td>
|
814 |
+
<td>99.9%</td>
|
815 |
+
<td>98.7%</td>
|
816 |
+
</tr>
|
817 |
+
<tr>
|
818 |
+
<td>GTAALGCLVK</td>
|
819 |
+
<td>HC (134-147)</td>
|
820 |
+
<td>Clipping</td>
|
821 |
+
<td>0.1%</td>
|
822 |
+
<td>1.3%</td>
|
823 |
+
</tr>
|
824 |
+
<tr>
|
825 |
+
<td>SSSNPLTFGAGTK</td>
|
826 |
+
<td>LC (91-103)</td>
|
827 |
+
<td></td>
|
828 |
+
<td>99.8%</td>
|
829 |
+
<td>98.9%</td>
|
830 |
+
</tr>
|
831 |
+
<tr>
|
832 |
+
<td>PLTFGAGTK</td>
|
833 |
+
<td>LC (91-103)</td>
|
834 |
+
<td>Clipping</td>
|
835 |
+
<td>0.2%</td>
|
836 |
+
<td>1.1%</td>
|
837 |
+
</tr>
|
838 |
+
</table>
|
839 |
+
<hr>
|
840 |
+
</div>
|
841 |
+
|
842 |
+
<div class="table-container">
|
843 |
+
<h2>Table 20</h2>
|
844 |
+
<table border="1">
|
845 |
+
<tr>
|
846 |
+
<td>Blue:</td>
|
847 |
+
<td>VH and VL</td>
|
848 |
+
</tr>
|
849 |
+
<tr>
|
850 |
+
<td>Blue:</td>
|
851 |
+
<td>CDR</td>
|
852 |
+
</tr>
|
853 |
+
<tr>
|
854 |
+
<td>Green:</td>
|
855 |
+
<td>N-glycosylation site</td>
|
856 |
+
</tr>
|
857 |
+
</table>
|
858 |
+
<hr>
|
859 |
+
</div>
|
860 |
+
|
861 |
+
<div class="table-container">
|
862 |
+
<h2>Table 21</h2>
|
863 |
+
<table border="1">
|
864 |
+
<tr>
|
865 |
+
<td>Sequence</td>
|
866 |
+
<td>Sequence location</td>
|
867 |
+
<td>Modification</td>
|
868 |
+
<td>Relative abundance</td>
|
869 |
+
<td>Relative abundance</td>
|
870 |
+
</tr>
|
871 |
+
<tr>
|
872 |
+
<td>Sequence</td>
|
873 |
+
<td>Sequence location</td>
|
874 |
+
<td>Modification</td>
|
875 |
+
<td>L5-H31_T0</td>
|
876 |
+
<td>L5-H31_T4w</td>
|
877 |
+
</tr>
|
878 |
+
<tr>
|
879 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
880 |
+
<td>HC (001-038)</td>
|
881 |
+
<td>pyro Q</td>
|
882 |
+
<td>83.5%</td>
|
883 |
+
<td>99.5%</td>
|
884 |
+
</tr>
|
885 |
+
<tr>
|
886 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
887 |
+
<td>HC (001-038)</td>
|
888 |
+
<td></td>
|
889 |
+
<td>16.5%</td>
|
890 |
+
<td>0.5%</td>
|
891 |
+
</tr>
|
892 |
+
</table>
|
893 |
+
<hr>
|
894 |
+
</div>
|
895 |
+
|
896 |
+
<div class="table-container">
|
897 |
+
<h2>Table 22</h2>
|
898 |
+
<table border="1">
|
899 |
+
<tr>
|
900 |
+
<td>Sequence</td>
|
901 |
+
<td>Sequence location</td>
|
902 |
+
<td>Modification</td>
|
903 |
+
<td>Relative abundance</td>
|
904 |
+
<td>Relative abundance</td>
|
905 |
+
</tr>
|
906 |
+
<tr>
|
907 |
+
<td>Sequence</td>
|
908 |
+
<td>Sequence location</td>
|
909 |
+
<td>Modification</td>
|
910 |
+
<td>L5-H31_T0</td>
|
911 |
+
<td>L5-H31_T4w</td>
|
912 |
+
</tr>
|
913 |
+
<tr>
|
914 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
915 |
+
<td>HC(98-121)</td>
|
916 |
+
<td>Ox. [+ 16 Da]</td>
|
917 |
+
<td>4.9%</td>
|
918 |
+
<td>1.9%</td>
|
919 |
+
</tr>
|
920 |
+
<tr>
|
921 |
+
<td>NFGNYAMDFWGQGTSVTVSSASTK</td>
|
922 |
+
<td>HC(98-121)</td>
|
923 |
+
<td></td>
|
924 |
+
<td>95.1%</td>
|
925 |
+
<td>98.1%</td>
|
926 |
+
</tr>
|
927 |
+
</table>
|
928 |
+
<hr>
|
929 |
+
</div>
|
930 |
+
|
931 |
+
<div class="table-container">
|
932 |
+
<h2>Table 23</h2>
|
933 |
+
<table border="1">
|
934 |
+
<tr>
|
935 |
+
<td>Sequence</td>
|
936 |
+
<td>Sequence location</td>
|
937 |
+
<td>Modification</td>
|
938 |
+
<td>Relative abundance</td>
|
939 |
+
<td>Relative abundance</td>
|
940 |
+
</tr>
|
941 |
+
<tr>
|
942 |
+
<td>Sequence</td>
|
943 |
+
<td>Sequence location</td>
|
944 |
+
<td>Modification</td>
|
945 |
+
<td>L5-H31_T0</td>
|
946 |
+
<td>L5-H31_T4w</td>
|
947 |
+
</tr>
|
948 |
+
<tr>
|
949 |
+
<td>SSSNPLTFGAGTK</td>
|
950 |
+
<td>LC (91-103)</td>
|
951 |
+
<td></td>
|
952 |
+
<td>99.8%</td>
|
953 |
+
<td>99.5%</td>
|
954 |
+
</tr>
|
955 |
+
<tr>
|
956 |
+
<td>SSSNPLTFGAGTK</td>
|
957 |
+
<td>LC (91-103)</td>
|
958 |
+
<td>deamidation</td>
|
959 |
+
<td>0.2%</td>
|
960 |
+
<td>0.5%</td>
|
961 |
+
</tr>
|
962 |
+
</table>
|
963 |
+
<hr>
|
964 |
+
</div>
|
965 |
+
|
966 |
+
<div class="table-container">
|
967 |
+
<h2>Table 24</h2>
|
968 |
+
<table border="1">
|
969 |
+
<tr>
|
970 |
+
<td>Sequence</td>
|
971 |
+
<td>Sequence location</td>
|
972 |
+
<td>Modification</td>
|
973 |
+
<td>Relative abundance*</td>
|
974 |
+
<td>Relative abundance*</td>
|
975 |
+
</tr>
|
976 |
+
<tr>
|
977 |
+
<td>Sequence</td>
|
978 |
+
<td>Sequence location</td>
|
979 |
+
<td>Modification</td>
|
980 |
+
<td>L5-H31_T0</td>
|
981 |
+
<td>L5-H31_T4w</td>
|
982 |
+
</tr>
|
983 |
+
<tr>
|
984 |
+
<td>STSGGTAALGCLVK</td>
|
985 |
+
<td>HC (134-147)</td>
|
986 |
+
<td></td>
|
987 |
+
<td>99.9%</td>
|
988 |
+
<td>98.8%</td>
|
989 |
+
</tr>
|
990 |
+
<tr>
|
991 |
+
<td>GTAALGCLVK</td>
|
992 |
+
<td>HC (134-147)</td>
|
993 |
+
<td>Clipping</td>
|
994 |
+
<td>0.1%</td>
|
995 |
+
<td>1.2%</td>
|
996 |
+
</tr>
|
997 |
+
<tr>
|
998 |
+
<td>SSSNPLTFGAGTK</td>
|
999 |
+
<td>LC (91-103)</td>
|
1000 |
+
<td></td>
|
1001 |
+
<td>99.9%</td>
|
1002 |
+
<td>98.8%</td>
|
1003 |
+
</tr>
|
1004 |
+
<tr>
|
1005 |
+
<td>PLTFGAGTK</td>
|
1006 |
+
<td>LC (91-103)</td>
|
1007 |
+
<td>Clipping</td>
|
1008 |
+
<td>0.1%</td>
|
1009 |
+
<td>1.2%</td>
|
1010 |
+
</tr>
|
1011 |
+
</table>
|
1012 |
+
<hr>
|
1013 |
+
</div>
|
1014 |
+
|
1015 |
+
<div class="table-container">
|
1016 |
+
<h2>Table 25</h2>
|
1017 |
+
<table border="1">
|
1018 |
+
<tr>
|
1019 |
+
<td>Blue:</td>
|
1020 |
+
<td>VH and VL</td>
|
1021 |
+
</tr>
|
1022 |
+
<tr>
|
1023 |
+
<td>Blue:</td>
|
1024 |
+
<td>CDR</td>
|
1025 |
+
</tr>
|
1026 |
+
<tr>
|
1027 |
+
<td>Green:</td>
|
1028 |
+
<td>N-glycosylation site</td>
|
1029 |
+
</tr>
|
1030 |
+
</table>
|
1031 |
+
<hr>
|
1032 |
+
</div>
|
1033 |
+
|
1034 |
+
<div class="table-container">
|
1035 |
+
<h2>Table 26</h2>
|
1036 |
+
<table border="1">
|
1037 |
+
<tr>
|
1038 |
+
<td>Sequence</td>
|
1039 |
+
<td>Sequence location</td>
|
1040 |
+
<td>Modification</td>
|
1041 |
+
<td>Relative abundance</td>
|
1042 |
+
<td>Relative abundance</td>
|
1043 |
+
</tr>
|
1044 |
+
<tr>
|
1045 |
+
<td>Sequence</td>
|
1046 |
+
<td>Sequence location</td>
|
1047 |
+
<td>Modification</td>
|
1048 |
+
<td>L14-H12_T0</td>
|
1049 |
+
<td>L14-H12_T4w</td>
|
1050 |
+
</tr>
|
1051 |
+
<tr>
|
1052 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1053 |
+
<td>HC(001-038)</td>
|
1054 |
+
<td>pyroQ</td>
|
1055 |
+
<td>85.9%</td>
|
1056 |
+
<td>99.3%</td>
|
1057 |
+
</tr>
|
1058 |
+
<tr>
|
1059 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1060 |
+
<td>HC(001-038)</td>
|
1061 |
+
<td></td>
|
1062 |
+
<td>14.1%</td>
|
1063 |
+
<td>0.7%</td>
|
1064 |
+
</tr>
|
1065 |
+
</table>
|
1066 |
+
<hr>
|
1067 |
+
</div>
|
1068 |
+
|
1069 |
+
<div class="table-container">
|
1070 |
+
<h2>Table 27</h2>
|
1071 |
+
<table border="1">
|
1072 |
+
<tr>
|
1073 |
+
<td>Sequence</td>
|
1074 |
+
<td>Sequence location</td>
|
1075 |
+
<td>Modification</td>
|
1076 |
+
<td>Relative abundance</td>
|
1077 |
+
<td>Relative abundance</td>
|
1078 |
+
</tr>
|
1079 |
+
<tr>
|
1080 |
+
<td>Sequence</td>
|
1081 |
+
<td>Sequence location</td>
|
1082 |
+
<td>Modification</td>
|
1083 |
+
<td>L14-H12_T0</td>
|
1084 |
+
<td>L14-H12_T4w</td>
|
1085 |
+
</tr>
|
1086 |
+
<tr>
|
1087 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1088 |
+
<td>LC(25-41)</td>
|
1089 |
+
<td>Ox. [+16 Da]</td>
|
1090 |
+
<td>0.3%</td>
|
1091 |
+
<td>0.3%</td>
|
1092 |
+
</tr>
|
1093 |
+
<tr>
|
1094 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1095 |
+
<td>LC(25-41)</td>
|
1096 |
+
<td></td>
|
1097 |
+
<td>99.7%</td>
|
1098 |
+
<td>99.7%</td>
|
1099 |
+
</tr>
|
1100 |
+
</table>
|
1101 |
+
<hr>
|
1102 |
+
</div>
|
1103 |
+
|
1104 |
+
<div class="table-container">
|
1105 |
+
<h2>Table 28</h2>
|
1106 |
+
<table border="1">
|
1107 |
+
<tr>
|
1108 |
+
<td>Sequence</td>
|
1109 |
+
<td>Sequence location</td>
|
1110 |
+
<td>Modification</td>
|
1111 |
+
<td>Relative abundance</td>
|
1112 |
+
<td>Relative abundance</td>
|
1113 |
+
</tr>
|
1114 |
+
<tr>
|
1115 |
+
<td>Sequence</td>
|
1116 |
+
<td>Sequence location</td>
|
1117 |
+
<td>Modification</td>
|
1118 |
+
<td>L14-H12_T0</td>
|
1119 |
+
<td>L14-H12_T4w</td>
|
1120 |
+
</tr>
|
1121 |
+
<tr>
|
1122 |
+
<td>SSSNPLTFGAGTK</td>
|
1123 |
+
<td>LC (91-103)</td>
|
1124 |
+
<td></td>
|
1125 |
+
<td>99.9%</td>
|
1126 |
+
<td>99.4%</td>
|
1127 |
+
</tr>
|
1128 |
+
<tr>
|
1129 |
+
<td>SSSNPLTFGAGTK</td>
|
1130 |
+
<td>LC (91-103)</td>
|
1131 |
+
<td>deamidation</td>
|
1132 |
+
<td>0.1%</td>
|
1133 |
+
<td>0.6%</td>
|
1134 |
+
</tr>
|
1135 |
+
</table>
|
1136 |
+
<hr>
|
1137 |
+
</div>
|
1138 |
+
|
1139 |
+
<div class="table-container">
|
1140 |
+
<h2>Table 29</h2>
|
1141 |
+
<table border="1">
|
1142 |
+
<tr>
|
1143 |
+
<td>Sequence</td>
|
1144 |
+
<td>Sequence location</td>
|
1145 |
+
<td>Modification</td>
|
1146 |
+
<td>Relative abundance*</td>
|
1147 |
+
<td>Relative abundance*</td>
|
1148 |
+
</tr>
|
1149 |
+
<tr>
|
1150 |
+
<td>Sequence</td>
|
1151 |
+
<td>Sequence location</td>
|
1152 |
+
<td>Modification</td>
|
1153 |
+
<td>L14-H12_T0</td>
|
1154 |
+
<td>L14-H12_T4w</td>
|
1155 |
+
</tr>
|
1156 |
+
<tr>
|
1157 |
+
<td>STSGGTAALGCLVK</td>
|
1158 |
+
<td>HC (134-147)</td>
|
1159 |
+
<td></td>
|
1160 |
+
<td>99.9%</td>
|
1161 |
+
<td>98.9%</td>
|
1162 |
+
</tr>
|
1163 |
+
<tr>
|
1164 |
+
<td>GTAALGCLVK</td>
|
1165 |
+
<td>HC (134-147)</td>
|
1166 |
+
<td>Clipping</td>
|
1167 |
+
<td>0.1%</td>
|
1168 |
+
<td>1.1%</td>
|
1169 |
+
</tr>
|
1170 |
+
<tr>
|
1171 |
+
<td>SSSNPLTFGAGTK</td>
|
1172 |
+
<td>LC (91-103)</td>
|
1173 |
+
<td></td>
|
1174 |
+
<td>99.7%</td>
|
1175 |
+
<td>98.6%</td>
|
1176 |
+
</tr>
|
1177 |
+
<tr>
|
1178 |
+
<td>PLTFGAGTK</td>
|
1179 |
+
<td>LC (91-103)</td>
|
1180 |
+
<td>Clipping</td>
|
1181 |
+
<td>0.3%</td>
|
1182 |
+
<td>1.4%</td>
|
1183 |
+
</tr>
|
1184 |
+
</table>
|
1185 |
+
<hr>
|
1186 |
+
</div>
|
1187 |
+
|
1188 |
+
<div class="table-container">
|
1189 |
+
<h2>Table 30</h2>
|
1190 |
+
<table border="1">
|
1191 |
+
<tr>
|
1192 |
+
<td>Blue:</td>
|
1193 |
+
<td>VH and VL</td>
|
1194 |
+
</tr>
|
1195 |
+
<tr>
|
1196 |
+
<td>Blue:</td>
|
1197 |
+
<td>CDR</td>
|
1198 |
+
</tr>
|
1199 |
+
<tr>
|
1200 |
+
<td>Green:</td>
|
1201 |
+
<td>N-glycosylation site</td>
|
1202 |
+
</tr>
|
1203 |
+
</table>
|
1204 |
+
<hr>
|
1205 |
+
</div>
|
1206 |
+
|
1207 |
+
<div class="table-container">
|
1208 |
+
<h2>Table 31</h2>
|
1209 |
+
<table border="1">
|
1210 |
+
<tr>
|
1211 |
+
<td>Sequence</td>
|
1212 |
+
<td>Sequence location</td>
|
1213 |
+
<td>Modification</td>
|
1214 |
+
<td>Relative abundance</td>
|
1215 |
+
<td>Relative abundance</td>
|
1216 |
+
</tr>
|
1217 |
+
<tr>
|
1218 |
+
<td>Sequence</td>
|
1219 |
+
<td>Sequence location</td>
|
1220 |
+
<td>Modification</td>
|
1221 |
+
<td>L14-H31_T0</td>
|
1222 |
+
<td>L14-H31_T4w</td>
|
1223 |
+
</tr>
|
1224 |
+
<tr>
|
1225 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1226 |
+
<td>HC(001-038)</td>
|
1227 |
+
<td>pyroQ</td>
|
1228 |
+
<td>82.6%</td>
|
1229 |
+
<td>100.0%</td>
|
1230 |
+
</tr>
|
1231 |
+
<tr>
|
1232 |
+
<td>QVQLQESGPGLVKPSQTLSLTCTVSGFSLTNYGVYWIR</td>
|
1233 |
+
<td>HC(001-038)</td>
|
1234 |
+
<td></td>
|
1235 |
+
<td>17.4%</td>
|
1236 |
+
<td>n.d</td>
|
1237 |
+
</tr>
|
1238 |
+
</table>
|
1239 |
+
<hr>
|
1240 |
+
</div>
|
1241 |
+
|
1242 |
+
<div class="table-container">
|
1243 |
+
<h2>Table 32</h2>
|
1244 |
+
<table border="1">
|
1245 |
+
<tr>
|
1246 |
+
<td>Sequence</td>
|
1247 |
+
<td>Sequence location</td>
|
1248 |
+
<td>Modification</td>
|
1249 |
+
<td>Relative abundance</td>
|
1250 |
+
<td>Relative abundance</td>
|
1251 |
+
</tr>
|
1252 |
+
<tr>
|
1253 |
+
<td>Sequence</td>
|
1254 |
+
<td>Sequence location</td>
|
1255 |
+
<td>Modification</td>
|
1256 |
+
<td>L14-H31_T0</td>
|
1257 |
+
<td>L14-H31_T4w</td>
|
1258 |
+
</tr>
|
1259 |
+
<tr>
|
1260 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1261 |
+
<td>LC(25-41)</td>
|
1262 |
+
<td>Ox. [+16 Da]</td>
|
1263 |
+
<td>0.5%</td>
|
1264 |
+
<td>0.4%</td>
|
1265 |
+
</tr>
|
1266 |
+
<tr>
|
1267 |
+
<td>ASTSVTYMHWYQQKPGK</td>
|
1268 |
+
<td>LC(25-41)</td>
|
1269 |
+
<td></td>
|
1270 |
+
<td>99.5%</td>
|
1271 |
+
<td>99.6%</td>
|
1272 |
+
</tr>
|
1273 |
+
</table>
|
1274 |
+
<hr>
|
1275 |
+
</div>
|
1276 |
+
|
1277 |
+
<div class="table-container">
|
1278 |
+
<h2>Table 33</h2>
|
1279 |
+
<table border="1">
|
1280 |
+
<tr>
|
1281 |
+
<td>Sequence</td>
|
1282 |
+
<td>Sequence location</td>
|
1283 |
+
<td>Modification</td>
|
1284 |
+
<td>Relative abundance</td>
|
1285 |
+
<td>Relative abundance</td>
|
1286 |
+
</tr>
|
1287 |
+
<tr>
|
1288 |
+
<td>Sequence</td>
|
1289 |
+
<td>Sequence location</td>
|
1290 |
+
<td>Modification</td>
|
1291 |
+
<td>L14-H31_T0</td>
|
1292 |
+
<td>L14-H31_T4w</td>
|
1293 |
+
</tr>
|
1294 |
+
<tr>
|
1295 |
+
<td>SSSNPLTFGAGTK</td>
|
1296 |
+
<td>LC (91-103)</td>
|
1297 |
+
<td></td>
|
1298 |
+
<td>99.9%</td>
|
1299 |
+
<td>99.5%</td>
|
1300 |
+
</tr>
|
1301 |
+
<tr>
|
1302 |
+
<td>SSSNPLTFGAGTK</td>
|
1303 |
+
<td>LC (91-103)</td>
|
1304 |
+
<td>deamidation</td>
|
1305 |
+
<td>0.1%</td>
|
1306 |
+
<td>0.5%</td>
|
1307 |
+
</tr>
|
1308 |
+
</table>
|
1309 |
+
<hr>
|
1310 |
+
</div>
|
1311 |
+
|
1312 |
+
<div class="table-container">
|
1313 |
+
<h2>Table 34</h2>
|
1314 |
+
<table border="1">
|
1315 |
+
<tr>
|
1316 |
+
<td>Sequence</td>
|
1317 |
+
<td>Sequence location</td>
|
1318 |
+
<td>Modification</td>
|
1319 |
+
<td>Relative abundance*</td>
|
1320 |
+
<td>Relative abundance*</td>
|
1321 |
+
</tr>
|
1322 |
+
<tr>
|
1323 |
+
<td>Sequence</td>
|
1324 |
+
<td>Sequence location</td>
|
1325 |
+
<td>Modification</td>
|
1326 |
+
<td>L14-H31_T0</td>
|
1327 |
+
<td>L14-H31_T4w</td>
|
1328 |
+
</tr>
|
1329 |
+
<tr>
|
1330 |
+
<td>STSGGTAALGCLVK</td>
|
1331 |
+
<td>HC (134-147)</td>
|
1332 |
+
<td></td>
|
1333 |
+
<td>99.9%</td>
|
1334 |
+
<td>98.9%</td>
|
1335 |
+
</tr>
|
1336 |
+
<tr>
|
1337 |
+
<td>GTAALGCLVK</td>
|
1338 |
+
<td>HC (134-147)</td>
|
1339 |
+
<td>Clipping</td>
|
1340 |
+
<td>0.1%</td>
|
1341 |
+
<td>1.1%</td>
|
1342 |
+
</tr>
|
1343 |
+
<tr>
|
1344 |
+
<td>SSSNPLTFGAGTK</td>
|
1345 |
+
<td>LC (91-103)</td>
|
1346 |
+
<td></td>
|
1347 |
+
<td>99.7%</td>
|
1348 |
+
<td>98.4%</td>
|
1349 |
+
</tr>
|
1350 |
+
<tr>
|
1351 |
+
<td>PLTFGAGTK</td>
|
1352 |
+
<td>LC (91-103)</td>
|
1353 |
+
<td>Clipping</td>
|
1354 |
+
<td>0.3%</td>
|
1355 |
+
<td>1.6%</td>
|
1356 |
+
</tr>
|
1357 |
+
</table>
|
1358 |
+
<hr>
|
1359 |
+
</div>
|
1360 |
+
|
1361 |
+
<div class="table-container">
|
1362 |
+
<h2>Table 35</h2>
|
1363 |
+
<table border="1">
|
1364 |
+
<tr>
|
1365 |
+
<td>Blue:</td>
|
1366 |
+
<td>VH and VL</td>
|
1367 |
+
</tr>
|
1368 |
+
<tr>
|
1369 |
+
<td>Blue:</td>
|
1370 |
+
<td>CDR</td>
|
1371 |
+
</tr>
|
1372 |
+
<tr>
|
1373 |
+
<td>Green:</td>
|
1374 |
+
<td>N-glycosylation site</td>
|
1375 |
+
</tr>
|
1376 |
+
</table>
|
1377 |
+
<hr>
|
1378 |
+
</div>
|
1379 |
+
|
1380 |
+
<div class="table-container">
|
1381 |
+
<h2>Table 36</h2>
|
1382 |
+
<table border="1">
|
1383 |
+
<tr>
|
1384 |
+
<td>Nathan Cardon</td>
|
1385 |
+
<td>Date:</td>
|
1386 |
+
</tr>
|
1387 |
+
<tr>
|
1388 |
+
<td>Sr Research Associate</td>
|
1389 |
+
<td>Signature:</td>
|
1390 |
+
</tr>
|
1391 |
+
<tr>
|
1392 |
+
<td>Mabelle Meersseman</td>
|
1393 |
+
<td>Date:</td>
|
1394 |
+
</tr>
|
1395 |
+
<tr>
|
1396 |
+
<td>Group Leader</td>
|
1397 |
+
<td>Signature:</td>
|
1398 |
+
</tr>
|
1399 |
+
<tr>
|
1400 |
+
<td>Approver</td>
|
1401 |
+
<td></td>
|
1402 |
+
</tr>
|
1403 |
+
<tr>
|
1404 |
+
<td>Koen Sandra Ph.D.</td>
|
1405 |
+
<td>Date:</td>
|
1406 |
+
</tr>
|
1407 |
+
<tr>
|
1408 |
+
<td>CEO</td>
|
1409 |
+
<td>Signature:</td>
|
1410 |
+
</tr>
|
1411 |
+
</table>
|
1412 |
+
<hr>
|
1413 |
+
</div>
|
1414 |
+
|
1415 |
+
<div class="table-container">
|
1416 |
+
<h2>Table 37</h2>
|
1417 |
+
<table border="1">
|
1418 |
+
<tr>
|
1419 |
+
<td>Version</td>
|
1420 |
+
<td>Date of issue</td>
|
1421 |
+
<td>Reason for version update</td>
|
1422 |
+
</tr>
|
1423 |
+
<tr>
|
1424 |
+
<td>00</td>
|
1425 |
+
<td>25NOV24</td>
|
1426 |
+
<td>Draft</td>
|
1427 |
+
</tr>
|
1428 |
+
<tr>
|
1429 |
+
<td></td>
|
1430 |
+
<td></td>
|
1431 |
+
<td></td>
|
1432 |
+
</tr>
|
1433 |
+
<tr>
|
1434 |
+
<td></td>
|
1435 |
+
<td></td>
|
1436 |
+
<td></td>
|
1437 |
+
</tr>
|
1438 |
+
</table>
|
1439 |
+
<hr>
|
1440 |
+
</div>
|
1441 |
+
</body></html>
|
src/agents/__pycache__/field_mapper_agent.cpython-312.pyc
CHANGED
Binary files a/src/agents/__pycache__/field_mapper_agent.cpython-312.pyc and b/src/agents/__pycache__/field_mapper_agent.cpython-312.pyc differ
|
|
src/agents/unique_indices_combinator.py
CHANGED
@@ -17,6 +17,9 @@ class UniqueIndicesCombinator(BaseAgent):
|
|
17 |
self.logger.info("Starting UniqueIndicesCombinator execution")
|
18 |
self.logger.info(f"Context keys available: {list(ctx.keys())}")
|
19 |
|
|
|
|
|
|
|
20 |
# Get text content
|
21 |
text = ""
|
22 |
if "text" in ctx:
|
|
|
17 |
self.logger.info("Starting UniqueIndicesCombinator execution")
|
18 |
self.logger.info(f"Context keys available: {list(ctx.keys())}")
|
19 |
|
20 |
+
# Store context for use in extraction methods
|
21 |
+
self.ctx = ctx
|
22 |
+
|
23 |
# Get text content
|
24 |
text = ""
|
25 |
if "text" in ctx:
|
src/agents/unique_indices_loop_agent.py
ADDED
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Agent to loop through unique combinations and extract additional field values for each."""
|
2 |
+
from typing import Dict, Any, Optional, List
|
3 |
+
import logging
|
4 |
+
import json
|
5 |
+
from .base_agent import BaseAgent
|
6 |
+
from services.llm_client import LLMClient
|
7 |
+
from config.settings import settings
|
8 |
+
|
9 |
+
class UniqueIndicesLoopAgent(BaseAgent):
|
10 |
+
def __init__(self):
|
11 |
+
self.logger = logging.getLogger(__name__)
|
12 |
+
self.llm = LLMClient(settings)
|
13 |
+
self.logger.info("UniqueIndicesLoopAgent initialized")
|
14 |
+
|
15 |
+
def execute(self, ctx: Dict[str, Any]) -> Optional[str]:
|
16 |
+
"""Execute the loop through unique combinations and extract additional fields."""
|
17 |
+
self.logger.info("Starting UniqueIndicesLoopAgent execution")
|
18 |
+
self.logger.info(f"Context keys available: {list(ctx.keys())}")
|
19 |
+
|
20 |
+
# Store context for use in extraction methods
|
21 |
+
self.ctx = ctx
|
22 |
+
|
23 |
+
# Get the unique combinations from previous agent
|
24 |
+
unique_combinations = ctx.get("results", [])
|
25 |
+
if not unique_combinations:
|
26 |
+
self.logger.warning("No unique combinations found in context")
|
27 |
+
return None
|
28 |
+
|
29 |
+
# Handle case where results might be a JSON string
|
30 |
+
if isinstance(unique_combinations, str):
|
31 |
+
try:
|
32 |
+
unique_combinations = json.loads(unique_combinations)
|
33 |
+
self.logger.info(f"Parsed JSON string to get {len(unique_combinations)} combinations")
|
34 |
+
except json.JSONDecodeError:
|
35 |
+
self.logger.error(f"Failed to parse results as JSON")
|
36 |
+
self.logger.error(f"Invalid JSON: {unique_combinations}")
|
37 |
+
return None
|
38 |
+
|
39 |
+
# Ensure we have a list
|
40 |
+
if not isinstance(unique_combinations, list):
|
41 |
+
self.logger.error(f"Expected list of combinations, got: {type(unique_combinations)}")
|
42 |
+
return None
|
43 |
+
|
44 |
+
# Get text content
|
45 |
+
text = ctx.get("text", "")
|
46 |
+
if not text:
|
47 |
+
self.logger.warning("No text found in context")
|
48 |
+
return None
|
49 |
+
|
50 |
+
# Get fields to extract
|
51 |
+
fields_to_extract = ctx.get("fields", [])
|
52 |
+
if not fields_to_extract:
|
53 |
+
self.logger.warning("No fields to extract found in context")
|
54 |
+
return None
|
55 |
+
|
56 |
+
# Get field descriptions
|
57 |
+
field_descriptions = ctx.get("field_descriptions", {})
|
58 |
+
|
59 |
+
# Get document context
|
60 |
+
document_context = ctx.get("document_context", "Generic document")
|
61 |
+
|
62 |
+
self.logger.info(f"Processing {len(unique_combinations)} unique combinations")
|
63 |
+
self.logger.info(f"Fields to extract: {fields_to_extract}")
|
64 |
+
|
65 |
+
# Process each unique combination
|
66 |
+
complete_results = []
|
67 |
+
failed_combinations = []
|
68 |
+
|
69 |
+
for i, combination in enumerate(unique_combinations):
|
70 |
+
self.logger.info(f"Processing combination {i+1}/{len(unique_combinations)}: {combination}")
|
71 |
+
|
72 |
+
try:
|
73 |
+
# Extract additional fields for this combination
|
74 |
+
additional_fields = self._extract_additional_fields(
|
75 |
+
text, document_context, combination, fields_to_extract, field_descriptions
|
76 |
+
)
|
77 |
+
|
78 |
+
if additional_fields:
|
79 |
+
# Combine unique indices with additional fields
|
80 |
+
complete_result = {**combination, **additional_fields}
|
81 |
+
complete_results.append(complete_result)
|
82 |
+
self.logger.info(f"Completed combination {i+1}: {complete_result}")
|
83 |
+
else:
|
84 |
+
self.logger.warning(f"Failed to extract additional fields for combination {i+1}")
|
85 |
+
# Add the combination with empty additional fields
|
86 |
+
empty_fields = {field: None for field in fields_to_extract}
|
87 |
+
complete_result = {**combination, **empty_fields}
|
88 |
+
complete_results.append(complete_result)
|
89 |
+
failed_combinations.append(i+1)
|
90 |
+
|
91 |
+
except Exception as e:
|
92 |
+
self.logger.error(f"Error processing combination {i+1}: {str(e)}")
|
93 |
+
# Add the combination with empty additional fields to maintain data structure
|
94 |
+
empty_fields = {field: None for field in fields_to_extract}
|
95 |
+
complete_result = {**combination, **empty_fields}
|
96 |
+
complete_results.append(complete_result)
|
97 |
+
failed_combinations.append(i+1)
|
98 |
+
|
99 |
+
if complete_results:
|
100 |
+
self.logger.info(f"Successfully processed {len(complete_results)} combinations")
|
101 |
+
if failed_combinations:
|
102 |
+
self.logger.warning(f"Failed to extract additional fields for combinations: {failed_combinations}")
|
103 |
+
return json.dumps(complete_results, indent=2)
|
104 |
+
else:
|
105 |
+
self.logger.warning("No complete results generated")
|
106 |
+
return None
|
107 |
+
|
108 |
+
def _extract_additional_fields(self, text: str, context: str, combination: Dict[str, str],
|
109 |
+
fields_to_extract: List[str], field_descriptions: Dict) -> Optional[Dict[str, str]]:
|
110 |
+
"""Extract additional field values for a specific unique combination."""
|
111 |
+
self.logger.info(f"Extracting additional fields for combination: {combination}")
|
112 |
+
|
113 |
+
# Format the combination for the prompt
|
114 |
+
combination_text = "\n".join([f" {key}: {value}" for key, value in combination.items()])
|
115 |
+
|
116 |
+
# Format field descriptions for the prompt
|
117 |
+
field_descriptions_text = ""
|
118 |
+
if field_descriptions:
|
119 |
+
field_descriptions_text = "\nField descriptions:\n"
|
120 |
+
for field, desc_info in field_descriptions.items():
|
121 |
+
if isinstance(desc_info, dict):
|
122 |
+
description = desc_info.get('description', '')
|
123 |
+
format_info = desc_info.get('format', '')
|
124 |
+
examples = desc_info.get('examples', '')
|
125 |
+
possible_values = desc_info.get('possible_values', '')
|
126 |
+
|
127 |
+
desc_line = f" {field}:"
|
128 |
+
if description:
|
129 |
+
desc_line += f" {description}"
|
130 |
+
if format_info:
|
131 |
+
desc_line += f" (Format: {format_info})"
|
132 |
+
if examples:
|
133 |
+
desc_line += f" (Examples: {examples})"
|
134 |
+
if possible_values:
|
135 |
+
desc_line += f" (Possible Values: {possible_values})"
|
136 |
+
field_descriptions_text += desc_line + "\n"
|
137 |
+
else:
|
138 |
+
field_descriptions_text += f" {field}: {desc_info}\n"
|
139 |
+
|
140 |
+
prompt = f"""You are an expert in {context}
|
141 |
+
|
142 |
+
Your task is to extract additional field values for a specific unique combination from the document.
|
143 |
+
|
144 |
+
Unique combination to analyze:
|
145 |
+
{combination_text}
|
146 |
+
|
147 |
+
Additional fields to extract: {', '.join(fields_to_extract)}{field_descriptions_text}
|
148 |
+
|
149 |
+
Consider the following document:
|
150 |
+
{text}
|
151 |
+
|
152 |
+
Instructions:
|
153 |
+
1. Find the section of the document that corresponds to this specific unique combination
|
154 |
+
2. Extract the values for the additional fields: {', '.join(fields_to_extract)}
|
155 |
+
3. Look for data that matches this specific combination (Protein Lot, Peptide, Timepoint, Modification)
|
156 |
+
4. Return ONLY the JSON object with the additional field values, no explanations
|
157 |
+
5. If a field value is not found, use null or empty string
|
158 |
+
|
159 |
+
Example response format:
|
160 |
+
{{
|
161 |
+
"Chain": "Heavy",
|
162 |
+
"Percentage": "90.0",
|
163 |
+
"Seq Loc": "HC(1-31)"
|
164 |
+
}}
|
165 |
+
|
166 |
+
Additional field values:"""
|
167 |
+
|
168 |
+
try:
|
169 |
+
# Get cost tracker from context
|
170 |
+
cost_tracker = self.ctx.get("cost_tracker") if hasattr(self, 'ctx') else None
|
171 |
+
|
172 |
+
result = self.llm.responses(
|
173 |
+
prompt, temperature=0.0,
|
174 |
+
ctx={"cost_tracker": cost_tracker} if cost_tracker else None,
|
175 |
+
description=f"Additional Fields Extraction for Combination"
|
176 |
+
)
|
177 |
+
|
178 |
+
# Log cost tracking results if available
|
179 |
+
if cost_tracker:
|
180 |
+
self.logger.info(f"Additional fields extraction costs - Input tokens: {cost_tracker.llm_input_tokens}, Output tokens: {cost_tracker.llm_output_tokens}")
|
181 |
+
self.logger.info(f"Additional fields extraction cost: ${cost_tracker.calculate_current_file_costs()['openai']['total_cost']:.4f}")
|
182 |
+
|
183 |
+
self.logger.debug(f"Raw LLM response: {result}")
|
184 |
+
|
185 |
+
if result and result.lower() not in ["none", "null", "n/a"]:
|
186 |
+
try:
|
187 |
+
json_value = json.loads(result)
|
188 |
+
self.logger.info(f"Successfully extracted additional fields: {json.dumps(json_value, indent=2)}")
|
189 |
+
return json_value
|
190 |
+
except json.JSONDecodeError:
|
191 |
+
self.logger.error(f"Failed to parse LLM response as JSON")
|
192 |
+
self.logger.error(f"Invalid JSON response: {result}")
|
193 |
+
return None
|
194 |
+
else:
|
195 |
+
self.logger.warning("LLM returned no valid value")
|
196 |
+
return None
|
197 |
+
|
198 |
+
except Exception as e:
|
199 |
+
self.logger.error(f"Error in additional fields extraction: {str(e)}", exc_info=True)
|
200 |
+
return None
|
src/app.py
CHANGED
@@ -561,6 +561,15 @@ else: # page == "Execution"
|
|
561 |
model_cost = costs["openai"]["total_cost"]
|
562 |
di_cost = costs["document_intelligence"]["total_cost"]
|
563 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
564 |
# Display detailed costs table
|
565 |
st.subheader("Detailed Costs")
|
566 |
costs_df = executor.cost_tracker.get_detailed_costs_table()
|
|
|
561 |
model_cost = costs["openai"]["total_cost"]
|
562 |
di_cost = costs["document_intelligence"]["total_cost"]
|
563 |
|
564 |
+
# Add debug logging for cost tracking
|
565 |
+
logger.info(f"Cost tracker debug info:")
|
566 |
+
logger.info(f" LLM input tokens: {executor.cost_tracker.llm_input_tokens}")
|
567 |
+
logger.info(f" LLM output tokens: {executor.cost_tracker.llm_output_tokens}")
|
568 |
+
logger.info(f" DI pages: {executor.cost_tracker.di_pages}")
|
569 |
+
logger.info(f" LLM calls count: {len(executor.cost_tracker.llm_calls)}")
|
570 |
+
logger.info(f" Current file costs: {executor.cost_tracker.current_file_costs}")
|
571 |
+
logger.info(f" Calculated costs: {costs}")
|
572 |
+
|
573 |
# Display detailed costs table
|
574 |
st.subheader("Detailed Costs")
|
575 |
costs_df = executor.cost_tracker.get_detailed_costs_table()
|
src/config/__pycache__/settings.cpython-312.pyc
CHANGED
Binary files a/src/config/__pycache__/settings.cpython-312.pyc and b/src/config/__pycache__/settings.cpython-312.pyc differ
|
|
src/config/settings.py
CHANGED
@@ -16,10 +16,16 @@ class Settings(BaseSettings):
|
|
16 |
AZURE_OPENAI_API_KEY: str = Field("", env="AZURE_OPENAI_API_KEY")
|
17 |
AZURE_OPENAI_EMBEDDING_MODEL: str = Field("text-embedding-3-small", env="AZURE_OPENAI_EMBEDDING_MODEL")
|
18 |
|
|
|
|
|
|
|
|
|
|
|
19 |
model_config: SettingsConfigDict = {"env_file": ".env"}
|
20 |
|
21 |
def __init__(self, **kwargs):
|
22 |
super().__init__(**kwargs)
|
23 |
logger.info(f"Settings initialized with API version: {self.AZURE_OPENAI_API_VERSION}")
|
|
|
24 |
|
25 |
settings = Settings()
|
|
|
16 |
AZURE_OPENAI_API_KEY: str = Field("", env="AZURE_OPENAI_API_KEY")
|
17 |
AZURE_OPENAI_EMBEDDING_MODEL: str = Field("text-embedding-3-small", env="AZURE_OPENAI_EMBEDDING_MODEL")
|
18 |
|
19 |
+
# Retry configuration
|
20 |
+
LLM_MAX_RETRIES: int = Field(5, env="LLM_MAX_RETRIES")
|
21 |
+
LLM_BASE_DELAY: float = Field(1.0, env="LLM_BASE_DELAY")
|
22 |
+
LLM_MAX_DELAY: float = Field(60.0, env="LLM_MAX_DELAY")
|
23 |
+
|
24 |
model_config: SettingsConfigDict = {"env_file": ".env"}
|
25 |
|
26 |
def __init__(self, **kwargs):
|
27 |
super().__init__(**kwargs)
|
28 |
logger.info(f"Settings initialized with API version: {self.AZURE_OPENAI_API_VERSION}")
|
29 |
+
logger.info(f"LLM retry config: max_retries={self.LLM_MAX_RETRIES}, base_delay={self.LLM_BASE_DELAY}s")
|
30 |
|
31 |
settings = Settings()
|
src/orchestrator/__pycache__/executor.cpython-312.pyc
CHANGED
Binary files a/src/orchestrator/__pycache__/executor.cpython-312.pyc and b/src/orchestrator/__pycache__/executor.cpython-312.pyc differ
|
|
src/orchestrator/__pycache__/planner.cpython-312.pyc
CHANGED
Binary files a/src/orchestrator/__pycache__/planner.cpython-312.pyc and b/src/orchestrator/__pycache__/planner.cpython-312.pyc differ
|
|
src/orchestrator/executor.py
CHANGED
@@ -16,6 +16,7 @@ from agents.semantic_reasoner import SemanticReasonerAgent
|
|
16 |
from agents.confidence_scorer import ConfidenceScorer
|
17 |
from agents.query_generator import QueryGenerator
|
18 |
from agents.unique_indices_combinator import UniqueIndicesCombinator
|
|
|
19 |
|
20 |
# Add import for CostTracker
|
21 |
from services.cost_tracker import CostTracker
|
@@ -33,6 +34,7 @@ class Executor:
|
|
33 |
"ConfidenceScorer": ConfidenceScorer(),
|
34 |
"QueryGenerator": QueryGenerator(),
|
35 |
"UniqueIndicesCombinator": UniqueIndicesCombinator(),
|
|
|
36 |
}
|
37 |
|
38 |
self.logs: List[Dict[str, Any]] = []
|
@@ -45,6 +47,10 @@ class Executor:
|
|
45 |
self.logger.info(f"Plan strategy: {plan.get('strategy')}")
|
46 |
self.logger.info(f"Plan steps: {json.dumps(plan.get('steps', []), indent=2)}")
|
47 |
|
|
|
|
|
|
|
|
|
48 |
# Validate fields are strings and flatten nested lists
|
49 |
fields = plan.get("fields", [])
|
50 |
if isinstance(fields, list):
|
@@ -211,7 +217,18 @@ class Executor:
|
|
211 |
elif tool_name == "UniqueIndicesCombinator":
|
212 |
if result:
|
213 |
log_entry["result"] = f"Extracted unique combinations: {str(result)[:200]}..."
|
214 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
215 |
self.logs.append(log_entry)
|
216 |
|
217 |
# stash results
|
@@ -239,6 +256,19 @@ class Executor:
|
|
239 |
else:
|
240 |
ctx["results"] = result
|
241 |
self.logger.info(f"Stored UniqueIndicesCombinator results: {result}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
242 |
elif tool_name == "SemanticReasoner":
|
243 |
ctx["results"][ctx["current_field"]] = result
|
244 |
elif tool_name == "ConfidenceScorer":
|
|
|
16 |
from agents.confidence_scorer import ConfidenceScorer
|
17 |
from agents.query_generator import QueryGenerator
|
18 |
from agents.unique_indices_combinator import UniqueIndicesCombinator
|
19 |
+
from agents.unique_indices_loop_agent import UniqueIndicesLoopAgent
|
20 |
|
21 |
# Add import for CostTracker
|
22 |
from services.cost_tracker import CostTracker
|
|
|
34 |
"ConfidenceScorer": ConfidenceScorer(),
|
35 |
"QueryGenerator": QueryGenerator(),
|
36 |
"UniqueIndicesCombinator": UniqueIndicesCombinator(),
|
37 |
+
"UniqueIndicesLoopAgent": UniqueIndicesLoopAgent(),
|
38 |
}
|
39 |
|
40 |
self.logs: List[Dict[str, Any]] = []
|
|
|
47 |
self.logger.info(f"Plan strategy: {plan.get('strategy')}")
|
48 |
self.logger.info(f"Plan steps: {json.dumps(plan.get('steps', []), indent=2)}")
|
49 |
|
50 |
+
# Reset cost tracker for new file
|
51 |
+
self.cost_tracker.reset_current_file()
|
52 |
+
self.logger.info("Reset cost tracker for new file")
|
53 |
+
|
54 |
# Validate fields are strings and flatten nested lists
|
55 |
fields = plan.get("fields", [])
|
56 |
if isinstance(fields, list):
|
|
|
217 |
elif tool_name == "UniqueIndicesCombinator":
|
218 |
if result:
|
219 |
log_entry["result"] = f"Extracted unique combinations: {str(result)[:200]}..."
|
220 |
+
elif tool_name == "UniqueIndicesLoopAgent":
|
221 |
+
if result:
|
222 |
+
log_entry["result"] = f"Processed combinations with additional fields: {str(result)[:200]}..."
|
223 |
+
elif tool_name == "SemanticReasoner":
|
224 |
+
ctx["results"][ctx["current_field"]] = result
|
225 |
+
elif tool_name == "ConfidenceScorer":
|
226 |
+
ctx["conf"] = result
|
227 |
+
elif tool_name == "IndexAgent":
|
228 |
+
if result: # Only store if we got a valid result
|
229 |
+
ctx["index"] = result
|
230 |
+
self.logger.info(f"Stored index with {len(result.get('chunks', []))} chunks")
|
231 |
+
|
232 |
self.logs.append(log_entry)
|
233 |
|
234 |
# stash results
|
|
|
256 |
else:
|
257 |
ctx["results"] = result
|
258 |
self.logger.info(f"Stored UniqueIndicesCombinator results: {result}")
|
259 |
+
elif tool_name == "UniqueIndicesLoopAgent":
|
260 |
+
# Store the results from UniqueIndicesLoopAgent (complete data with additional fields)
|
261 |
+
if isinstance(result, str):
|
262 |
+
try:
|
263 |
+
result_dict = json.loads(result)
|
264 |
+
ctx["results"] = result_dict # Store the complete results
|
265 |
+
self.logger.info(f"Stored UniqueIndicesLoopAgent results: {json.dumps(result_dict, indent=2)}")
|
266 |
+
except json.JSONDecodeError:
|
267 |
+
self.logger.error(f"Failed to parse UniqueIndicesLoopAgent result as JSON: {result}")
|
268 |
+
ctx["results"] = {}
|
269 |
+
else:
|
270 |
+
ctx["results"] = result
|
271 |
+
self.logger.info(f"Stored UniqueIndicesLoopAgent results: {result}")
|
272 |
elif tool_name == "SemanticReasoner":
|
273 |
ctx["results"][ctx["current_field"]] = result
|
274 |
elif tool_name == "ConfidenceScorer":
|
src/orchestrator/planner.py
CHANGED
@@ -186,6 +186,7 @@ class Planner:
|
|
186 |
{"tool": "PDFAgent", "args": {}},
|
187 |
{"tool": "TableAgent", "args": {}},
|
188 |
{"tool": "UniqueIndicesCombinator", "args": {}},
|
|
|
189 |
]
|
190 |
logger.info("Generated plan for Unique Indices Strategy")
|
191 |
logger.info(f"Steps: {steps}")
|
|
|
186 |
{"tool": "PDFAgent", "args": {}},
|
187 |
{"tool": "TableAgent", "args": {}},
|
188 |
{"tool": "UniqueIndicesCombinator", "args": {}},
|
189 |
+
{"tool": "UniqueIndicesLoopAgent", "args": {}},
|
190 |
]
|
191 |
logger.info("Generated plan for Unique Indices Strategy")
|
192 |
logger.info(f"Steps: {steps}")
|
src/services/__pycache__/llm_client.cpython-312.pyc
CHANGED
Binary files a/src/services/__pycache__/llm_client.cpython-312.pyc and b/src/services/__pycache__/llm_client.cpython-312.pyc differ
|
|
src/services/llm_client.py
CHANGED
@@ -6,6 +6,8 @@ Keeps the rest of the codebase insulated from SDK / vendor details.
|
|
6 |
from __future__ import annotations
|
7 |
|
8 |
from typing import Any, List
|
|
|
|
|
9 |
|
10 |
import openai
|
11 |
import logging
|
@@ -22,6 +24,9 @@ class LLMClient:
|
|
22 |
openai.api_version = settings.AZURE_OPENAI_API_VERSION
|
23 |
|
24 |
self._deployment = settings.AZURE_OPENAI_DEPLOYMENT
|
|
|
|
|
|
|
25 |
|
26 |
# Log configuration (without exposing the API key)
|
27 |
logger = logging.getLogger(__name__)
|
@@ -33,68 +38,115 @@ class LLMClient:
|
|
33 |
logger.info(f"Deployment: {self._deployment}")
|
34 |
logger.info(f"API Key present: {'Yes' if openai.api_key else 'No'}")
|
35 |
logger.info(f"API Key length: {len(openai.api_key) if openai.api_key else 0}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
# --------------------------------------------------
|
38 |
-
def responses(self, prompt: str, tools: List[dict] | None = None, description: str = "LLM Call",
|
|
|
39 |
"""Call the Responses API and return the assistant content as string."""
|
40 |
logger = logging.getLogger(__name__)
|
41 |
logger.info(f"Making request with API version: {openai.api_version}")
|
42 |
logger.info(f"Request URL will be: {openai.api_base}/openai/responses?api-version={openai.api_version}")
|
43 |
|
|
|
|
|
|
|
|
|
44 |
# Remove ctx from kwargs before passing to openai
|
45 |
ctx = kwargs.pop("ctx", None)
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
# --- Cost tracking: must be BEFORE any return! ---
|
57 |
-
logger.info(f"LLMClient.responses: ctx is {ctx}")
|
58 |
-
if ctx and "cost_tracker" in ctx:
|
59 |
-
logger.info(f"LLMClient.responses: cost_tracker is {ctx['cost_tracker']}")
|
60 |
-
usage = getattr(resp, "usage", None)
|
61 |
-
if usage:
|
62 |
-
logger.info(f"LLMClient.responses: usage is {usage}")
|
63 |
-
ctx["cost_tracker"].add_llm_tokens(
|
64 |
-
input_tokens=getattr(usage, "input_tokens", 0),
|
65 |
-
output_tokens=getattr(usage, "output_tokens", 0),
|
66 |
-
description=description
|
67 |
-
)
|
68 |
-
logger.info(f"LLMClient.responses: prompt: {prompt[:200]}...") # Log first 200 chars
|
69 |
-
logger.info(f"LLMClient.responses: resp: {str(resp)[:200]}...") # Log first 200 chars
|
70 |
-
if usage:
|
71 |
-
logger.info(f"LLMClient.responses: usage.input_tokens={getattr(usage, 'input_tokens', None)}, usage.output_tokens={getattr(usage, 'output_tokens', None)}, usage.total_tokens={getattr(usage, 'total_tokens', None)}")
|
72 |
-
else:
|
73 |
-
# Fallback: estimate tokens (very rough)
|
74 |
-
ctx["cost_tracker"].add_llm_tokens(
|
75 |
-
input_tokens=len(prompt.split()),
|
76 |
-
output_tokens=len(str(resp).split()),
|
77 |
-
description=description
|
78 |
)
|
|
|
|
|
|
|
79 |
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
from __future__ import annotations
|
7 |
|
8 |
from typing import Any, List
|
9 |
+
import time
|
10 |
+
import random
|
11 |
|
12 |
import openai
|
13 |
import logging
|
|
|
24 |
openai.api_version = settings.AZURE_OPENAI_API_VERSION
|
25 |
|
26 |
self._deployment = settings.AZURE_OPENAI_DEPLOYMENT
|
27 |
+
self._max_retries = settings.LLM_MAX_RETRIES
|
28 |
+
self._base_delay = settings.LLM_BASE_DELAY
|
29 |
+
self._max_delay = settings.LLM_MAX_DELAY
|
30 |
|
31 |
# Log configuration (without exposing the API key)
|
32 |
logger = logging.getLogger(__name__)
|
|
|
38 |
logger.info(f"Deployment: {self._deployment}")
|
39 |
logger.info(f"API Key present: {'Yes' if openai.api_key else 'No'}")
|
40 |
logger.info(f"API Key length: {len(openai.api_key) if openai.api_key else 0}")
|
41 |
+
logger.info(f"Retry config: max_retries={self._max_retries}, base_delay={self._base_delay}s, max_delay={self._max_delay}s")
|
42 |
+
|
43 |
+
def _should_retry(self, exception) -> bool:
|
44 |
+
"""Determine if an exception should trigger a retry."""
|
45 |
+
# Retry on 503 Service Unavailable, 500 Internal Server Error, and other server errors
|
46 |
+
if hasattr(exception, 'status_code'):
|
47 |
+
return exception.status_code >= 500
|
48 |
+
# Also retry on connection errors and timeouts
|
49 |
+
if hasattr(exception, '__class__'):
|
50 |
+
error_type = exception.__class__.__name__
|
51 |
+
return any(error in error_type for error in ['Timeout', 'Connection', 'Network'])
|
52 |
+
return False
|
53 |
+
|
54 |
+
def _exponential_backoff(self, attempt: int, base_delay: float = 1.0, max_delay: float = 60.0) -> float:
|
55 |
+
"""Calculate delay for exponential backoff with jitter."""
|
56 |
+
delay = min(base_delay * (2 ** attempt), max_delay)
|
57 |
+
# Add jitter to prevent thundering herd
|
58 |
+
jitter = random.uniform(0, 0.1 * delay)
|
59 |
+
return delay + jitter
|
60 |
|
61 |
# --------------------------------------------------
|
62 |
+
def responses(self, prompt: str, tools: List[dict] | None = None, description: str = "LLM Call",
|
63 |
+
max_retries: int = None, base_delay: float = None, **kwargs: Any) -> str:
|
64 |
"""Call the Responses API and return the assistant content as string."""
|
65 |
logger = logging.getLogger(__name__)
|
66 |
logger.info(f"Making request with API version: {openai.api_version}")
|
67 |
logger.info(f"Request URL will be: {openai.api_base}/openai/responses?api-version={openai.api_version}")
|
68 |
|
69 |
+
# Use instance defaults if not provided
|
70 |
+
max_retries = max_retries if max_retries is not None else self._max_retries
|
71 |
+
base_delay = base_delay if base_delay is not None else self._base_delay
|
72 |
+
|
73 |
# Remove ctx from kwargs before passing to openai
|
74 |
ctx = kwargs.pop("ctx", None)
|
75 |
|
76 |
+
last_exception = None
|
77 |
+
|
78 |
+
for attempt in range(max_retries + 1):
|
79 |
+
try:
|
80 |
+
resp = openai.responses.create(
|
81 |
+
input=prompt,
|
82 |
+
model=self._deployment,
|
83 |
+
tools=tools or [],
|
84 |
+
**kwargs,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
)
|
86 |
+
|
87 |
+
# Log the raw response for debugging
|
88 |
+
logging.debug(f"LLM raw response: {resp}")
|
89 |
|
90 |
+
# --- Cost tracking: must be BEFORE any return! ---
|
91 |
+
logger.info(f"LLMClient.responses: ctx is {ctx}")
|
92 |
+
if ctx and "cost_tracker" in ctx:
|
93 |
+
logger.info(f"LLMClient.responses: cost_tracker is {ctx['cost_tracker']}")
|
94 |
+
usage = getattr(resp, "usage", None)
|
95 |
+
if usage:
|
96 |
+
logger.info(f"LLMClient.responses: usage is {usage}")
|
97 |
+
ctx["cost_tracker"].add_llm_tokens(
|
98 |
+
input_tokens=getattr(usage, "input_tokens", 0),
|
99 |
+
output_tokens=getattr(usage, "output_tokens", 0),
|
100 |
+
description=description
|
101 |
+
)
|
102 |
+
logger.info(f"LLMClient.responses: prompt: {prompt[:200]}...") # Log first 200 chars
|
103 |
+
logger.info(f"LLMClient.responses: resp: {str(resp)[:200]}...") # Log first 200 chars
|
104 |
+
if usage:
|
105 |
+
logger.info(f"LLMClient.responses: usage.input_tokens={getattr(usage, 'input_tokens', None)}, usage.output_tokens={getattr(usage, 'output_tokens', None)}, usage.total_tokens={getattr(usage, 'total_tokens', None)}")
|
106 |
+
else:
|
107 |
+
# Fallback: estimate tokens (very rough)
|
108 |
+
ctx["cost_tracker"].add_llm_tokens(
|
109 |
+
input_tokens=len(prompt.split()),
|
110 |
+
output_tokens=len(str(resp).split()),
|
111 |
+
description=description
|
112 |
+
)
|
113 |
+
|
114 |
+
# Extract the text content from the response
|
115 |
+
if hasattr(resp, "output") and isinstance(resp.output, list):
|
116 |
+
# Handle list of ResponseOutputMessage objects
|
117 |
+
for message in resp.output:
|
118 |
+
if hasattr(message, "content") and isinstance(message.content, list):
|
119 |
+
for content in message.content:
|
120 |
+
if hasattr(content, "text"):
|
121 |
+
return content.text
|
122 |
+
|
123 |
+
# Fallback methods if the above doesn't work
|
124 |
+
if hasattr(resp, "output"):
|
125 |
+
return resp.output
|
126 |
+
elif hasattr(resp, "response"):
|
127 |
+
return resp.response
|
128 |
+
elif hasattr(resp, "content"):
|
129 |
+
return resp.content
|
130 |
+
elif hasattr(resp, "data"):
|
131 |
+
return resp.data
|
132 |
+
else:
|
133 |
+
logging.error(f"Could not extract text from response: {resp}")
|
134 |
+
return str(resp)
|
135 |
+
|
136 |
+
except Exception as e:
|
137 |
+
last_exception = e
|
138 |
+
logger.warning(f"Attempt {attempt + 1}/{max_retries + 1} failed: {type(e).__name__}: {str(e)}")
|
139 |
+
|
140 |
+
# Check if we should retry
|
141 |
+
if attempt < max_retries and self._should_retry(e):
|
142 |
+
delay = self._exponential_backoff(attempt, base_delay, self._max_delay)
|
143 |
+
logger.info(f"Retrying in {delay:.2f} seconds...")
|
144 |
+
time.sleep(delay)
|
145 |
+
continue
|
146 |
+
else:
|
147 |
+
# Either we've exhausted retries or this is not a retryable error
|
148 |
+
if attempt >= max_retries:
|
149 |
+
logger.error(f"Max retries ({max_retries}) exceeded. Last error: {type(e).__name__}: {str(e)}")
|
150 |
+
else:
|
151 |
+
logger.error(f"Non-retryable error: {type(e).__name__}: {str(e)}")
|
152 |
+
raise last_exception
|
test_cost_tracking.py
ADDED
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""Test script to verify cost tracking is working properly."""
|
3 |
+
|
4 |
+
import logging
|
5 |
+
import json
|
6 |
+
from unittest.mock import Mock, patch
|
7 |
+
from src.services.cost_tracker import CostTracker
|
8 |
+
from src.agents.unique_indices_combinator import UniqueIndicesCombinator
|
9 |
+
from src.agents.unique_indices_loop_agent import UniqueIndicesLoopAgent
|
10 |
+
from src.config.settings import settings
|
11 |
+
|
12 |
+
# Configure logging
|
13 |
+
logging.basicConfig(level=logging.INFO)
|
14 |
+
logger = logging.getLogger(__name__)
|
15 |
+
|
16 |
+
def test_cost_tracking():
|
17 |
+
"""Test that cost tracking works properly with the new agents."""
|
18 |
+
|
19 |
+
# Create a cost tracker
|
20 |
+
cost_tracker = CostTracker()
|
21 |
+
|
22 |
+
# Create mock context
|
23 |
+
ctx = {
|
24 |
+
"text": "This is a test document with some content.",
|
25 |
+
"unique_indices": ["Protein Lot", "Peptide", "Timepoint", "Modification"],
|
26 |
+
"unique_indices_descriptions": {
|
27 |
+
"Protein Lot": {
|
28 |
+
"description": "Protein lot identifier",
|
29 |
+
"format": "String",
|
30 |
+
"examples": "P066_L14_H31_0-hulgG-LALAPG-FJB",
|
31 |
+
"possible_values": ""
|
32 |
+
},
|
33 |
+
"Peptide": {
|
34 |
+
"description": "Peptide sequence",
|
35 |
+
"format": "String",
|
36 |
+
"examples": "QVQLQQSGPGLVQPSQSLSITCTVSDFSLAR",
|
37 |
+
"possible_values": ""
|
38 |
+
}
|
39 |
+
},
|
40 |
+
"fields": ["Chain", "Percentage", "Seq Loc"],
|
41 |
+
"field_descriptions": {
|
42 |
+
"Chain": {
|
43 |
+
"description": "Heavy or Light chain",
|
44 |
+
"format": "String",
|
45 |
+
"examples": "Heavy",
|
46 |
+
"possible_values": "Heavy, Light"
|
47 |
+
}
|
48 |
+
},
|
49 |
+
"document_context": "Biotech document",
|
50 |
+
"cost_tracker": cost_tracker
|
51 |
+
}
|
52 |
+
|
53 |
+
# Mock LLM responses
|
54 |
+
mock_combinations = [
|
55 |
+
{
|
56 |
+
"Protein Lot": "P066_L14_H31_0-hulgG-LALAPG-FJB",
|
57 |
+
"Peptide": "PLTFGAGTK",
|
58 |
+
"Timepoint": "0w",
|
59 |
+
"Modification": "Clipping"
|
60 |
+
},
|
61 |
+
{
|
62 |
+
"Protein Lot": "P066_L14_H31_0-hulgG-LALAPG-FJB",
|
63 |
+
"Peptide": "PLTFGAGTK",
|
64 |
+
"Timepoint": "4w",
|
65 |
+
"Modification": "Clipping"
|
66 |
+
}
|
67 |
+
]
|
68 |
+
|
69 |
+
mock_additional_fields = {
|
70 |
+
"Chain": "Heavy",
|
71 |
+
"Percentage": "90.0",
|
72 |
+
"Seq Loc": "HC(1-31)"
|
73 |
+
}
|
74 |
+
|
75 |
+
# Test UniqueIndicesCombinator
|
76 |
+
logger.info("Testing UniqueIndicesCombinator cost tracking...")
|
77 |
+
|
78 |
+
with patch('openai.responses.create') as mock_create:
|
79 |
+
# Mock the LLM response for combinations
|
80 |
+
mock_create.return_value = Mock(
|
81 |
+
output=[Mock(content=[Mock(text=json.dumps(mock_combinations))])],
|
82 |
+
usage=Mock(input_tokens=1500, output_tokens=300)
|
83 |
+
)
|
84 |
+
|
85 |
+
combinator = UniqueIndicesCombinator()
|
86 |
+
result = combinator.execute(ctx)
|
87 |
+
|
88 |
+
logger.info(f"Combinator result: {result}")
|
89 |
+
logger.info(f"Cost tracker after combinator:")
|
90 |
+
logger.info(f" Input tokens: {cost_tracker.llm_input_tokens}")
|
91 |
+
logger.info(f" Output tokens: {cost_tracker.llm_output_tokens}")
|
92 |
+
logger.info(f" LLM calls: {len(cost_tracker.llm_calls)}")
|
93 |
+
|
94 |
+
# Verify cost tracking worked
|
95 |
+
assert cost_tracker.llm_input_tokens == 1500
|
96 |
+
assert cost_tracker.llm_output_tokens == 300
|
97 |
+
assert len(cost_tracker.llm_calls) == 1
|
98 |
+
assert cost_tracker.llm_calls[0].description == "Unique Indices Combination Extraction"
|
99 |
+
|
100 |
+
# Test UniqueIndicesLoopAgent
|
101 |
+
logger.info("Testing UniqueIndicesLoopAgent cost tracking...")
|
102 |
+
|
103 |
+
# Set the results from combinator
|
104 |
+
ctx["results"] = mock_combinations
|
105 |
+
|
106 |
+
with patch('openai.responses.create') as mock_create:
|
107 |
+
# Mock the LLM response for additional fields (will be called twice, once for each combination)
|
108 |
+
mock_create.return_value = Mock(
|
109 |
+
output=[Mock(content=[Mock(text=json.dumps(mock_additional_fields))])],
|
110 |
+
usage=Mock(input_tokens=800, output_tokens=150)
|
111 |
+
)
|
112 |
+
|
113 |
+
loop_agent = UniqueIndicesLoopAgent()
|
114 |
+
result = loop_agent.execute(ctx)
|
115 |
+
|
116 |
+
logger.info(f"Loop agent result: {result}")
|
117 |
+
logger.info(f"Cost tracker after loop agent:")
|
118 |
+
logger.info(f" Input tokens: {cost_tracker.llm_input_tokens}")
|
119 |
+
logger.info(f" Output tokens: {cost_tracker.llm_output_tokens}")
|
120 |
+
logger.info(f" LLM calls: {len(cost_tracker.llm_calls)}")
|
121 |
+
|
122 |
+
# Verify cost tracking worked for both calls
|
123 |
+
assert cost_tracker.llm_input_tokens == 1500 + (800 * 2) # Combinator + 2 loop iterations
|
124 |
+
assert cost_tracker.llm_output_tokens == 300 + (150 * 2) # Combinator + 2 loop iterations
|
125 |
+
assert len(cost_tracker.llm_calls) == 3 # 1 combinator + 2 loop iterations
|
126 |
+
|
127 |
+
# Test detailed costs table
|
128 |
+
logger.info("Testing detailed costs table...")
|
129 |
+
costs_df = cost_tracker.get_detailed_costs_table()
|
130 |
+
logger.info(f"Costs table:\n{costs_df}")
|
131 |
+
|
132 |
+
# Verify the table has the expected structure
|
133 |
+
assert len(costs_df) == 4 # 3 calls + 1 total row
|
134 |
+
assert "Description" in costs_df.columns
|
135 |
+
assert "Input Tokens" in costs_df.columns
|
136 |
+
assert "Output Tokens" in costs_df.columns
|
137 |
+
assert "Total Cost" in costs_df.columns
|
138 |
+
|
139 |
+
logger.info("All cost tracking tests passed!")
|
140 |
+
|
141 |
+
if __name__ == "__main__":
|
142 |
+
test_cost_tracking()
|
test_retry.py
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""Test script to verify retry logic in LLMClient."""
|
3 |
+
|
4 |
+
import time
|
5 |
+
import logging
|
6 |
+
from unittest.mock import Mock, patch
|
7 |
+
from src.services.llm_client import LLMClient
|
8 |
+
from src.config.settings import settings
|
9 |
+
|
10 |
+
# Configure logging
|
11 |
+
logging.basicConfig(level=logging.INFO)
|
12 |
+
logger = logging.getLogger(__name__)
|
13 |
+
|
14 |
+
def test_retry_logic():
|
15 |
+
"""Test the retry logic with simulated failures."""
|
16 |
+
|
17 |
+
# Create LLMClient instance
|
18 |
+
client = LLMClient(settings)
|
19 |
+
|
20 |
+
# Create a mock exception that simulates a 503 error
|
21 |
+
class Mock503Error(Exception):
|
22 |
+
def __init__(self):
|
23 |
+
self.status_code = 503
|
24 |
+
super().__init__("Service Unavailable")
|
25 |
+
|
26 |
+
# Test with a mock that fails twice then succeeds
|
27 |
+
with patch('openai.responses.create') as mock_create:
|
28 |
+
# First two calls fail with 503, third succeeds
|
29 |
+
mock_create.side_effect = [
|
30 |
+
Mock503Error(),
|
31 |
+
Mock503Error(),
|
32 |
+
Mock(
|
33 |
+
output=[Mock(content=[Mock(text="Success!")])],
|
34 |
+
usage=Mock(input_tokens=10, output_tokens=5)
|
35 |
+
)
|
36 |
+
]
|
37 |
+
|
38 |
+
start_time = time.time()
|
39 |
+
try:
|
40 |
+
result = client.responses("Test prompt", max_retries=2, base_delay=0.1)
|
41 |
+
end_time = time.time()
|
42 |
+
|
43 |
+
logger.info(f"Test completed successfully!")
|
44 |
+
logger.info(f"Result: {result}")
|
45 |
+
logger.info(f"Time taken: {end_time - start_time:.2f} seconds")
|
46 |
+
logger.info(f"Number of calls made: {mock_create.call_count}")
|
47 |
+
|
48 |
+
assert result == "Success!"
|
49 |
+
assert mock_create.call_count == 3 # 2 failures + 1 success
|
50 |
+
|
51 |
+
except Exception as e:
|
52 |
+
logger.error(f"Test failed: {e}")
|
53 |
+
raise
|
54 |
+
|
55 |
+
def test_non_retryable_error():
|
56 |
+
"""Test that non-retryable errors are not retried."""
|
57 |
+
|
58 |
+
client = LLMClient(settings)
|
59 |
+
|
60 |
+
class Mock400Error(Exception):
|
61 |
+
def __init__(self):
|
62 |
+
self.status_code = 400
|
63 |
+
super().__init__("Bad Request")
|
64 |
+
|
65 |
+
with patch('openai.responses.create') as mock_create:
|
66 |
+
# Should not retry 400 errors
|
67 |
+
mock_create.side_effect = Mock400Error()
|
68 |
+
|
69 |
+
try:
|
70 |
+
client.responses("Test prompt", max_retries=3, base_delay=0.1)
|
71 |
+
assert False, "Should have raised an exception"
|
72 |
+
except Mock400Error:
|
73 |
+
logger.info("Correctly did not retry 400 error")
|
74 |
+
assert mock_create.call_count == 1 # Only one call, no retries
|
75 |
+
|
76 |
+
if __name__ == "__main__":
|
77 |
+
logger.info("Testing retry logic...")
|
78 |
+
test_retry_logic()
|
79 |
+
|
80 |
+
logger.info("Testing non-retryable error...")
|
81 |
+
test_non_retryable_error()
|
82 |
+
|
83 |
+
logger.info("All tests passed!")
|