Repository and archive for study designs, research materials, data, manuscripts, etc
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "rest_api",
"base_url": "https://api.test.osf.io/v2",
"auth_method": "oauth2",
"auth_config": {
"header": "Authorization",
"prefix": "Bearer"
},
"endpoints": [],
"pricing_model": {
"type": "free_tier",
"details": {},
"free_tier": null,
"paid_tiers": []
},
"rate_limits": {
"rpm": null,
"tpm": null,
"daily": null,
"concurrent": null
},
"capabilities": [
"RESTful resource-oriented API",
"Pagination",
"Filtering",
"Sparse fieldsets",
"Embedding",
"Comprehensive error handling",
"OAuth-based authentication"
],
"agent_readiness": {
"supports_x402": false,
"supports_streaming": false,
"has_sandbox": true,
"sdks": [],
"agent_auth_methods": [
"oauth2_client_credentials"
]
}
}```json
{
"tests": [
{
"name": "root_endpoint_health_check",
"endpoint": "/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns service metadata and a welcome message",
"metrics": ["latency", "status_code"],
"validation": {"field": "meta", "type": "object"}
},
{
"name": "list_addons_success",
"endpoint": "/addons/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns a paginated list of addons",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "data", "type": "array", "min_length": 1}
},
{
"name": "get_current_user_success",
"endpoint": "/users/me/",
"method": "GET",
"headers": {"Authorization": "Bearer ${OSF_TOKEN}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns the authenticated user's profile",
"metrics": ["latency", "status_code"],
"validation": {"field": "data.type", "type": "string", "equals": "users"}
},
{
"name": "get_current_user_authenticated",
"endpoint": "/users/me/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Rejects unauthenticated request to a protected endpoint",
"metrics": ["status_code"],
"validation": {"field": "errors", "type": "array", "min_length": 1}
},
{
"name": "list_nodes_success",
"endpoint": "/nodes/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns a paginated list of public nodes",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "data", "type": "array"}
},
{
"name": "list_nodes_filtered_success",
"endpoint": "/nodes/?filter[title]=reproducibility",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns nodes filtered by title substring",
"metrics": ["latency", "status_code"],
"validation": {"field": "data", "type": "array"}
},
{
"name": "list_nodes_paginated_success",
"endpoint": "/nodes/?page=2",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns the second page of nodes",
"metrics": ["latency", "status_code"],
"validation": {"field": "data", "type": "array"}
},
{
"name": "get_specific_node_success",
"endpoint": "/nodes/ezcuj/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns the specified public node",
"metrics": ["latency", "status_code"],
"validation": {"field": "data.id", "type": "string", "equals": "ezcuj"}
},
{
"name": "get_nonexistent_node_404",
"endpoint": "/nodes/nonexistent/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Returns a structured error for a non-existent node ID",
"metrics": ["status_code"],
"validation": {"field": "errors", "type": "array", "min_length": 1}
},
{
"name": "create_node_missing_required_fields",
"endpoint": "/nodes/",
"method": "POST",
"headers": {"Authorization": "Bearer ${OSF_TOKEN}"},
"payload": {
"data": {
"type": "nodes",
"attributes": {}
}
},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Rejects node creation without required 'title' and 'category' fields",
"metrics": ["status_code"],
"validation": {"field": "errors", "type": "array", "min_length": 1}
},
{
"name": "list_institutions_success",
"endpoint": "/institutions/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns a paginated list of institutions",
"metrics": ["latency", "status_code"],
"validation": {"field": "data", "type": "array"}
},
{
"name": "get_institution_success",
"endpoint": "/institutions/cos/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns the specified institution",
"metrics": ["latency", "status_code"],
"validation": {"field": "data.id", "type": "string", "equals": "cos"}
13/20 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| root_endpoint_health_check | GET / | 200 | 92ms |
| list_addons_success | GET /addons/ | 200 | 60ms |
| get_current_user_success | GET /users/me/ | 401 | 258ms |
| get_current_user_authenticated | GET /users/me/ | 401 | 66ms |
| list_nodes_success | GET /nodes/ | 200 | 879ms |
| list_nodes_filtered_success | GET /nodes/?filter[title]=reproducibility | 200 | 819ms |
| list_nodes_paginated_success | GET /nodes/?page=2 | 200 | 1137ms |
| get_specific_node_success | GET /nodes/ezcuj/ | 404 | 68ms |
| get_nonexistent_node_404 | GET /nodes/nonexistent/ | 404 | 66ms |
| create_node_missing_required_fields | POST /nodes/ | 401 | 385ms |
{"model": "deepseek", "data": {"overall": 72, "dimensions": {"token_efficiency": 7.0, "first_try_success": 7.0, "response_parseability": 8.0, "error_clarity": 8.0, "doc_quality": 6.0, "auth_simplicity": 5.0, "latency": 6.0, "consistency": 8.0}, "pricing_normalized": {"cost_per_1k_requests": 0, "cost_per_1m_input_tokens": 0, "cost_per_1m_output_tokens": 0, "free_tier_requests": null, "estimated_monthly_cost_light": 0, "estimated_monthly_cost_heavy": 0}, "issues": [{"severity": "medium", "detail": "Unauthenticated endpoints like /users/me/ return 401 even for non-sensitive data; this is expected but agents need to know auth is mandatory for user-specific resources. The validation test for POST /nodes/ expected 400 but got 401 (auth failure), so validation logic was not tested.", "endpoint": "/users/me/, /nodes/ (POST)"}, {"severity": "medium", "detail": "Specific resource lookups (get_specific_node_success, get_user_success) failed with 404 because the hardcoded IDs (ezcuj, q7fts) did not exist in the test environment. This is a test environment/data dependency issue rather than an API design flaw, but it means the happy-path tests for existing resources could not be validated.", "endpoint": "/nodes/ezcuj/, /users/q7fts/"}, {"severity": "low", "detail": "Responses use JSON:API content type (application/vnd.api+json). While parseable, the structure is more verbose than plain JSON, increasing token consumption for the agent to parse relationships and links sections.", "endpoint": "all"}], "recommendations": ["Provide a sandbox environment with seeded, stable resource IDs so happy-path tests can verify single-resource retrieval without depending on external data.", "Add a public OAuth2 token for the test environment or allow anonymous read access to /users/me/ so agents can test authenticated flows without registration.", "Document the full OpenAPI spec with examples in the vendor guide, especially showing how to create resources (POST /nodes/) without triggering auth errors first.", "Consider adding a simple API-key-based auth option in addition to OAuth2 for programmatic agent access to reduce onboarding friction."]}}Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.
<a href="https://prowl.world/service/open-science-framework">
<img src="https://prowl.world/badge/open-science-framework.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard