Skip to content

Commit 1a22404

Browse files
Yang Jingclaude
authored andcommitted
Apply ruff formatting to 11 files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 27a2f63 commit 1a22404

11 files changed

Lines changed: 57 additions & 77 deletions

examples/healer_matching.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ def match_healer(patient_query: str) -> None:
3333
strategy="matching",
3434
max_context_tokens=1000,
3535
)
36-
matches.append({
37-
"character": healer,
38-
"context": ctx,
39-
"token_estimate": ctx.token_estimate,
40-
})
36+
matches.append(
37+
{
38+
"character": healer,
39+
"context": ctx,
40+
"token_estimate": ctx.token_estimate,
41+
}
42+
)
4143

4244
# Sort by context richness (more relevant profile = better match)
4345
matches.sort(key=lambda m: m["token_estimate"], reverse=True)

hippodid/_http.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ def request(
124124

125125
except (httpx.ConnectError, httpx.ReadTimeout) as exc:
126126
if attempt >= self._max_retries:
127-
raise HippoDidError(f"Connection failed after {self._max_retries} retries: {exc}")
127+
raise HippoDidError(
128+
f"Connection failed after {self._max_retries} retries: {exc}"
129+
)
128130
time.sleep(backoff)
129131
attempt += 1
130132
backoff *= 2
@@ -162,7 +164,9 @@ def request_multipart(
162164

163165
except (httpx.ConnectError, httpx.ReadTimeout) as exc:
164166
if attempt >= self._max_retries:
165-
raise HippoDidError(f"Connection failed after {self._max_retries} retries: {exc}")
167+
raise HippoDidError(
168+
f"Connection failed after {self._max_retries} retries: {exc}"
169+
)
166170
time.sleep(backoff)
167171
attempt += 1
168172
backoff *= 2

hippodid/_strategies.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,11 @@ def assemble_conversational(
113113
sorted_results = sorted(
114114
enumerate(results),
115115
key=lambda pair: (
116-
pair[1].relevance_score * (1.0 - recency_weight)
117-
+ (1.0 - pair[0] / n) * recency_weight
116+
pair[1].relevance_score * (1.0 - recency_weight) + (1.0 - pair[0] / n) * recency_weight
118117
),
119118
reverse=True,
120119
)
121-
memories = _format_memories_by_relevance(
122-
[r for _, r in sorted_results], max_context_tokens
123-
)
120+
memories = _format_memories_by_relevance([r for _, r in sorted_results], max_context_tokens)
124121

125122
prompt_parts = []
126123
if system_prompt:
@@ -132,8 +129,7 @@ def assemble_conversational(
132129
)
133130
if memories:
134131
prompt_parts.append(
135-
f"\n## Recent Context & Memories\n"
136-
f"Draw on these naturally in conversation:\n{memories}"
132+
f"\n## Recent Context & Memories\nDraw on these naturally in conversation:\n{memories}"
137133
)
138134

139135
formatted = "\n".join(prompt_parts)
@@ -179,8 +175,7 @@ def assemble_task_focused(
179175

180176
if memories:
181177
prompt_parts.append(
182-
f"\n## Relevant Context\n"
183-
f"Use these facts to inform your work:\n{memories}"
178+
f"\n## Relevant Context\nUse these facts to inform your work:\n{memories}"
184179
)
185180

186181
formatted = "\n".join(prompt_parts)

hippodid/async_client.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,7 @@ async def get_character(self, character_id: str) -> Character:
106106
return Character.model_validate(await self._get(f"/v1/characters/{character_id}"))
107107

108108
async def get_character_by_external_id(self, external_id: str) -> Character:
109-
return Character.model_validate(
110-
await self._get(f"/v1/characters/external/{external_id}")
111-
)
109+
return Character.model_validate(await self._get(f"/v1/characters/external/{external_id}"))
112110

113111
async def list_characters(
114112
self,
@@ -214,9 +212,7 @@ async def search_memories(
214212
body: Dict[str, Any] = {"query": query, "topK": top_k}
215213
if categories:
216214
body["categories"] = categories
217-
data = await self._post(
218-
f"/v1/characters/{character_id}/memories/search", json=body
219-
)
215+
data = await self._post(f"/v1/characters/{character_id}/memories/search", json=body)
220216
return [SearchResult.model_validate(r) for r in data.get("results", [])]
221217

222218
async def get_memories(
@@ -493,9 +489,7 @@ async def set_agent_config(
493489
async def delete_agent_config(self, character_id: str) -> None:
494490
await self._delete(f"/v1/characters/{character_id}/agent-config")
495491

496-
async def create_agent_config_template(
497-
self, name: str, **kwargs: Any
498-
) -> AgentConfigTemplate:
492+
async def create_agent_config_template(self, name: str, **kwargs: Any) -> AgentConfigTemplate:
499493
body = {
500494
"name": name,
501495
"config": {

hippodid/client.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ def get_character(self, character_id: str) -> Character:
103103
return Character.model_validate(self._get(f"/v1/characters/{character_id}"))
104104

105105
def get_character_by_external_id(self, external_id: str) -> Character:
106-
return Character.model_validate(
107-
self._get(f"/v1/characters/external/{external_id}")
108-
)
106+
return Character.model_validate(self._get(f"/v1/characters/external/{external_id}"))
109107

110108
def list_characters(
111109
self,
@@ -144,9 +142,7 @@ def update_character(
144142
body["description"] = description
145143
if memory_mode is not None:
146144
body["memoryMode"] = memory_mode
147-
return Character.model_validate(
148-
self._put(f"/v1/characters/{character_id}", json=body)
149-
)
145+
return Character.model_validate(self._put(f"/v1/characters/{character_id}", json=body))
150146

151147
def delete_character(self, character_id: str) -> None:
152148
self._delete(f"/v1/characters/{character_id}")
@@ -337,9 +333,7 @@ def create_character_template(
337333
body["defaultValues"] = default_values
338334
if field_mappings is not None:
339335
body["fieldMappings"] = field_mappings
340-
return CharacterTemplate.model_validate(
341-
self._post("/v1/templates/characters", json=body)
342-
)
336+
return CharacterTemplate.model_validate(self._post("/v1/templates/characters", json=body))
343337

344338
def list_character_templates(self) -> List[CharacterTemplate]:
345339
data = self._get("/v1/templates/characters")
@@ -380,9 +374,7 @@ def update_character_template(
380374
def delete_character_template(self, template_id: str) -> None:
381375
self._delete(f"/v1/templates/characters/{template_id}")
382376

383-
def preview_character_template(
384-
self, template_id: str, sample_row: Dict[str, str]
385-
) -> Character:
377+
def preview_character_template(self, template_id: str, sample_row: Dict[str, str]) -> Character:
386378
return Character.model_validate(
387379
self._post(
388380
f"/v1/templates/characters/{template_id}/preview",
@@ -419,7 +411,9 @@ def batch_create_characters(
419411
raise TypeError(f"data must be a list of dicts or pandas DataFrame, got {type(data)}")
420412

421413
csv_bytes = self._rows_to_csv(rows)
422-
return self._upload_batch(template_id, csv_bytes, "data.csv", external_id_column, on_conflict, dry_run)
414+
return self._upload_batch(
415+
template_id, csv_bytes, "data.csv", external_id_column, on_conflict, dry_run
416+
)
423417

424418
def batch_create_from_file(
425419
self,
@@ -433,7 +427,9 @@ def batch_create_from_file(
433427
with open(file_path, "rb") as f:
434428
file_bytes = f.read()
435429
filename = file_path.rsplit("/", 1)[-1] if "/" in file_path else file_path
436-
return self._upload_batch(template_id, file_bytes, filename, external_id_column, on_conflict, dry_run)
430+
return self._upload_batch(
431+
template_id, file_bytes, filename, external_id_column, on_conflict, dry_run
432+
)
437433

438434
def get_batch_job_status(self, job_id: str) -> BatchJob:
439435
return BatchJob.model_validate(self._get(f"/v1/jobs/{job_id}"))
@@ -474,9 +470,7 @@ def _rows_to_csv(rows: List[Dict[str, str]]) -> bytes:
474470
# ═════════════════════════════════════════════════════════════════════════
475471

476472
def get_agent_config(self, character_id: str) -> AgentConfig:
477-
return AgentConfig.model_validate(
478-
self._get(f"/v1/characters/{character_id}/agent-config")
479-
)
473+
return AgentConfig.model_validate(self._get(f"/v1/characters/{character_id}/agent-config"))
480474

481475
def set_agent_config(
482476
self,
@@ -599,9 +593,7 @@ def ask(
599593
body["category"] = category
600594
if use_agent_config:
601595
body["useAgentConfig"] = True
602-
return AskResult.model_validate(
603-
self._post(f"/v1/characters/{character_id}/ask", json=body)
604-
)
596+
return AskResult.model_validate(self._post(f"/v1/characters/{character_id}/ask", json=body))
605597

606598
# ═════════════════════════════════════════════════════════════════════════
607599
# Assemble Context (client-side)
@@ -632,8 +624,7 @@ def assemble_context(
632624
strategy_fn = STRATEGIES.get(strategy)
633625
if strategy_fn is None:
634626
raise ValueError(
635-
f"Unknown strategy '{strategy}'. "
636-
f"Available: {', '.join(STRATEGIES.keys())}"
627+
f"Unknown strategy '{strategy}'. Available: {', '.join(STRATEGIES.keys())}"
637628
)
638629

639630
return strategy_fn(character, results, max_context_tokens, recency_weight)

tests/test_agent_config.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ def test_set_agent_config(client, mock_api):
4747

4848

4949
def test_delete_agent_config(client, mock_api):
50-
mock_api.delete(f"/v1/characters/{CID}/agent-config").mock(
51-
return_value=httpx.Response(204)
52-
)
50+
mock_api.delete(f"/v1/characters/{CID}/agent-config").mock(return_value=httpx.Response(204))
5351
client.delete_agent_config(CID)
5452

5553

tests/test_assemble_context.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,12 @@ def test_assemble_context_token_budget():
6565
character = _make_character()
6666
# Create many results to exceed budget
6767
results = [
68-
SearchResult.model_validate({
69-
**SEARCH_RESULT_JSON,
70-
"content": f"Memory fact number {i} with some extra text to increase size " * 5,
71-
})
68+
SearchResult.model_validate(
69+
{
70+
**SEARCH_RESULT_JSON,
71+
"content": f"Memory fact number {i} with some extra text to increase size " * 5,
72+
}
73+
)
7274
for i in range(50)
7375
]
7476

@@ -82,11 +84,13 @@ def test_assemble_context_token_budget():
8284
def test_assemble_context_recency_weight():
8385
character = _make_character()
8486
results = [
85-
SearchResult.model_validate({
86-
**SEARCH_RESULT_JSON,
87-
"content": f"Memory {i}",
88-
"relevanceScore": 0.5 + (i * 0.05),
89-
})
87+
SearchResult.model_validate(
88+
{
89+
**SEARCH_RESULT_JSON,
90+
"content": f"Memory {i}",
91+
"relevanceScore": 0.5 + (i * 0.05),
92+
}
93+
)
9094
for i in range(10)
9195
]
9296

@@ -142,5 +146,6 @@ def test_unknown_strategy_raises(client, mock_api):
142146
return_value=httpx.Response(200, json={"results": [], "count": 0})
143147
)
144148
import pytest
149+
145150
with pytest.raises(ValueError, match="Unknown strategy"):
146151
client.assemble_context(CID, "test", strategy="nonexistent")

tests/test_batch_create.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010

1111

1212
def test_get_batch_job_status(client, mock_api):
13-
mock_api.get(f"/v1/jobs/{JID}").mock(
14-
return_value=httpx.Response(200, json=BATCH_JOB_JSON)
15-
)
13+
mock_api.get(f"/v1/jobs/{JID}").mock(return_value=httpx.Response(200, json=BATCH_JOB_JSON))
1614
job = client.get_batch_job_status(JID)
1715
assert job.status == "COMPLETED"
1816
assert job.progress.total == 10
@@ -22,6 +20,7 @@ def test_get_batch_job_status(client, mock_api):
2220

2321
def test_rows_to_csv():
2422
from hippodid.client import HippoDid
23+
2524
rows = [
2625
{"name": "Alice", "role": "Engineer"},
2726
{"name": "Bob", "role": "Manager"},
@@ -35,11 +34,13 @@ def test_rows_to_csv():
3534

3635
def test_rows_to_csv_empty():
3736
from hippodid.client import HippoDid
37+
3838
assert HippoDid._rows_to_csv([]) == b""
3939

4040

4141
def test_batch_create_validates_data_type(client):
4242
import pytest
43+
4344
with pytest.raises(TypeError, match="list of dicts"):
4445
client.batch_create_characters(TID, "not-a-list", "id_col")
4546

tests/test_character_crud.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77

88
def test_create_character(client, mock_api):
9-
mock_api.post("/v1/characters").mock(
10-
return_value=httpx.Response(201, json=CHARACTER_JSON)
11-
)
9+
mock_api.post("/v1/characters").mock(return_value=httpx.Response(201, json=CHARACTER_JSON))
1210
char = client.create_character(name="Ada", description="A test character")
1311
assert char.name == "Ada"
1412
assert char.id == "c1000000-0000-0000-0000-000000000001"
@@ -45,18 +43,14 @@ def test_list_characters(client, mock_api):
4543
def test_update_character(client, mock_api):
4644
cid = "c1000000-0000-0000-0000-000000000001"
4745
updated = {**CHARACTER_JSON, "name": "Ada v2"}
48-
mock_api.put(f"/v1/characters/{cid}").mock(
49-
return_value=httpx.Response(200, json=updated)
50-
)
46+
mock_api.put(f"/v1/characters/{cid}").mock(return_value=httpx.Response(200, json=updated))
5147
char = client.update_character(cid, name="Ada v2")
5248
assert char.name == "Ada v2"
5349

5450

5551
def test_delete_character(client, mock_api):
5652
cid = "c1000000-0000-0000-0000-000000000001"
57-
mock_api.delete(f"/v1/characters/{cid}").mock(
58-
return_value=httpx.Response(204)
59-
)
53+
mock_api.delete(f"/v1/characters/{cid}").mock(return_value=httpx.Response(204))
6054
client.delete_character(cid) # should not raise
6155

6256

tests/test_memory_ops.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,5 @@ def test_update_memory(client, mock_api):
6565

6666
def test_delete_memory(client, mock_api):
6767
mid = "m2000000-0000-0000-0000-000000000001"
68-
mock_api.delete(f"/v1/characters/{CID}/memories/{mid}").mock(
69-
return_value=httpx.Response(204)
70-
)
68+
mock_api.delete(f"/v1/characters/{CID}/memories/{mid}").mock(return_value=httpx.Response(204))
7169
client.delete_memory(CID, mid)

0 commit comments

Comments
 (0)