|
13 | 13 | from pydantic import BaseModel |
14 | 14 | from pydantic_ai import Agent, ModelSettings |
15 | 15 | from pydantic_ai.messages import ModelRequest, UserPromptPart |
| 16 | +from pydantic_ai.usage import UsageLimits |
16 | 17 |
|
17 | 18 | PROJECT_NAME = "test-pydantic-ai-integration" |
18 | 19 | MODEL = "openai:gpt-4o-mini" # Use cheaper model for tests |
@@ -168,6 +169,60 @@ def is_descendant(child_span, ancestor_id): |
168 | 169 | assert "completion_tokens" in agent_sync_span["metrics"] |
169 | 170 |
|
170 | 171 |
|
| 172 | +def test_agent_to_cli_sync(memory_logger, monkeypatch): |
| 173 | + """Test Agent.to_cli_sync() records a CLI session span.""" |
| 174 | + assert not memory_logger.pop() |
| 175 | + |
| 176 | + message_history = [ModelRequest(parts=[UserPromptPart(content="Previous question")])] |
| 177 | + usage_limits = UsageLimits(request_limit=3) |
| 178 | + agent = Agent(MODEL, name="cli-agent", model_settings=ModelSettings(max_tokens=50)) |
| 179 | + |
| 180 | + async def fake_run_chat( |
| 181 | + *, |
| 182 | + stream, |
| 183 | + agent, |
| 184 | + deps, |
| 185 | + console, |
| 186 | + code_theme, |
| 187 | + prog_name, |
| 188 | + message_history, |
| 189 | + model_settings, |
| 190 | + usage_limits, |
| 191 | + ): |
| 192 | + assert stream is True |
| 193 | + assert prog_name == "braintrust-cli" |
| 194 | + assert message_history is not None |
| 195 | + assert model_settings is not None |
| 196 | + assert usage_limits is not None |
| 197 | + return 0 |
| 198 | + |
| 199 | + monkeypatch.setattr("pydantic_ai._cli.run_chat", fake_run_chat) |
| 200 | + |
| 201 | + start = time.time() |
| 202 | + agent.to_cli_sync( |
| 203 | + prog_name="braintrust-cli", |
| 204 | + message_history=message_history, |
| 205 | + model_settings=ModelSettings(max_tokens=20, temperature=0.2), |
| 206 | + usage_limits=usage_limits, |
| 207 | + ) |
| 208 | + end = time.time() |
| 209 | + |
| 210 | + spans = memory_logger.pop() |
| 211 | + assert len(spans) == 1, f"Expected 1 CLI span, got {len(spans)}" |
| 212 | + |
| 213 | + cli_span = spans[0] |
| 214 | + assert cli_span["span_attributes"]["type"] == SpanTypeAttribute.LLM |
| 215 | + assert cli_span["span_attributes"]["name"] == "agent_to_cli_sync [cli-agent]" |
| 216 | + assert cli_span["metadata"]["model"] == "gpt-4o-mini" |
| 217 | + assert cli_span["metadata"]["provider"] == "openai" |
| 218 | + assert cli_span["input"]["prog_name"] == "braintrust-cli" |
| 219 | + assert "message_history" in cli_span["input"] |
| 220 | + assert cli_span["input"]["model_settings"]["max_tokens"] == 20 |
| 221 | + assert cli_span["input"]["model_settings"]["temperature"] == 0.2 |
| 222 | + assert cli_span["input"]["usage_limits"]["request_limit"] == 3 |
| 223 | + _assert_metrics_are_valid(cli_span["metrics"], start, end) |
| 224 | + |
| 225 | + |
171 | 226 | @pytest.mark.vcr |
172 | 227 | @pytest.mark.asyncio |
173 | 228 | async def test_multiple_identical_sequential_streams(memory_logger): |
|
0 commit comments